From 5377e42e710bd128cbe67377b4c4a03352294a94 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 17:41:11 +0100 Subject: [PATCH 001/495] Add a basic server router to main --- go.mod | 2 ++ go.sum | 2 ++ main.go | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index be69963..ede3023 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/mdiluz/rove go 1.14 + +require github.com/gorilla/mux v1.7.4 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..abb0613 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/main.go b/main.go index ad6ce86..c146b9d 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,23 @@ package main -import "fmt" +import ( + "fmt" + "log" + "net/http" + + "github.com/gorilla/mux" +) func main() { - fmt.Printf("Hello World") + router := mux.NewRouter().StrictSlash(true) + + router.HandleFunc("/", HandleRoot) + + if err := http.ListenAndServe(":8080", router); err != nil { + log.Fatal(err) + } +} + +func HandleRoot(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World") } From 4a0a91a1f1f679861ce9b92cdcdb3b34890a1f29 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 17:56:26 +0100 Subject: [PATCH 002/495] Add basic /status endpoint Also add test for this endpoint --- main.go | 12 +++--------- router.go | 32 ++++++++++++++++++++++++++++++++ router_test.go | 22 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 router.go create mode 100644 router_test.go diff --git a/main.go b/main.go index c146b9d..dd3122b 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,17 @@ package main import ( - "fmt" "log" "net/http" - - "github.com/gorilla/mux" ) func main() { - router := mux.NewRouter().StrictSlash(true) - router.HandleFunc("/", HandleRoot) + // Create a new router + router := NewRouter() + // Listen and serve the http requests if err := http.ListenAndServe(":8080", router); err != nil { log.Fatal(err) } } - -func HandleRoot(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello World") -} diff --git a/router.go b/router.go new file mode 100644 index 0000000..80461c3 --- /dev/null +++ b/router.go @@ -0,0 +1,32 @@ +package main + +import ( + "encoding/json" + "net/http" + + "github.com/gorilla/mux" +) + +func NewRouter() (router *mux.Router) { + // Create a new router + router = mux.NewRouter().StrictSlash(true) + + // Set up the handlers + router.HandleFunc("/status", HandleStatus) + + return +} + +// RouterStatus is a struct that contains information on the status of the server +type RouterStatus struct { + Ready bool `json:"ready"` +} + +// HandleStatus handles HTTP requests to the /status endpoint +func HandleStatus(w http.ResponseWriter, r *http.Request) { + var status = RouterStatus{ + Ready: true, + } + + json.NewEncoder(w).Encode(status) +} diff --git a/router_test.go b/router_test.go new file mode 100644 index 0000000..86714e3 --- /dev/null +++ b/router_test.go @@ -0,0 +1,22 @@ +package main + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestHandleStatus(t *testing.T) { + request, _ := http.NewRequest(http.MethodGet, "/status", nil) + response := httptest.NewRecorder() + + HandleStatus(response, request) + + var status RouterStatus + json.NewDecoder(response.Body).Decode(&status) + + if status.Ready != true { + t.Errorf("got false for /status") + } +} From b5b41c95a5b2401fff4425fa44ec1cd408b861f6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:13:26 +0100 Subject: [PATCH 003/495] Add SIGTERM handler and logging Also change port to default http --- main.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index dd3122b..126ff02 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,35 @@ package main import ( + "fmt" "log" "net/http" + "os" + "os/signal" + "syscall" ) func main() { + fmt.Println("Initialising...") + + // Set up the close handler + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + fmt.Println("SIGTERM recieved, exiting...") + os.Exit(0) + }() + // Create a new router router := NewRouter() + fmt.Println("Initialised") + // Listen and serve the http requests - if err := http.ListenAndServe(":8080", router); err != nil { + fmt.Println("Serving HTTP") + if err := http.ListenAndServe(":80", router); err != nil { log.Fatal(err) } } From 46b7552ac5a51360352632f982a16e1026481451 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:14:05 +0100 Subject: [PATCH 004/495] Add docker files --- Dockerfile | 10 ++++++++++ docker-compose.yml | 6 ++++++ 2 files changed, 16 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d9f9426 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:latest +LABEL maintainer="Marc Di Luzio " + +WORKDIR /app +COPY . . +RUN go mod download + +RUN go build -o rove . + +CMD "./rove" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8b74b56 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3' +services: + rove: + build: . + ports: + - "80:80" \ No newline at end of file From b4ca6ae39b298cd12f1f6beae6f9e956e732d3db Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:15:11 +0100 Subject: [PATCH 005/495] Add docker build to the CI --- .github/workflows/docker-image.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/docker-image.yml diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..91fa944 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,18 @@ +name: Docker Image CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Build the Docker image + run: docker build . --file Dockerfile --tag rove:$(date +%s) From e562e950c4bb5ad5ede50d793d4100449dda377e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:17:13 +0100 Subject: [PATCH 006/495] Rename the CI pipelines --- .github/workflows/docker-image.yml | 2 +- .github/workflows/go.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 91fa944..1f2a34f 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Docker Image CI +name: Docker Image on: push: diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d31e87f..3b8df13 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,4 +1,4 @@ -name: Go +name: Go And Tests on: push: From 923fb069e2648ebcdcbb14956f4e35f552ca3b12 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:18:15 +0100 Subject: [PATCH 007/495] Update the build status images --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d46b475..e29731c 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,5 @@ This repository is a growing document as well as the source code repository for Build Status ------------ -![Go](https://github.com/mdiluz/rove/workflows/Go/badge.svg) +![Go And Tests](https://github.com/mdiluz/rove/workflows/Go%20And%20Tests/badge.svg) ![Docker Image](https://github.com/mdiluz/rove/workflows/Docker%20Image/badge.svg) From add366c0bda1e9c359c581a3db0d6e5cf6a0f080 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:22:11 +0100 Subject: [PATCH 008/495] Fix the docker CI Github Actions doesn't like specifying the dockerfile through the symlink of it's own creation --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 1f2a34f..8e004d5 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -15,4 +15,4 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build the Docker image - run: docker build . --file Dockerfile --tag rove:$(date +%s) + run: docker build . --tag rove:$(date +%s) From b04eb8a04a627828ce1f3b616746bbc69cf35386 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:24:34 +0100 Subject: [PATCH 009/495] Move design to docs --- Design.md => docs/design.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Design.md => docs/design.md (100%) diff --git a/Design.md b/docs/design.md similarity index 100% rename from Design.md rename to docs/design.md From 73a1e1fd212483750835643e80b13331e673beec Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 18:27:03 +0100 Subject: [PATCH 010/495] Housekeeping Move docs and commands out into their own files --- .github/workflows/go.yml | 4 ++-- Dockerfile | 2 +- main.go => cmd/rove-server/main.go | 0 router.go => cmd/rove-server/router.go | 0 router_test.go => cmd/rove-server/router_test.go | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename main.go => cmd/rove-server/main.go (100%) rename router.go => cmd/rove-server/router.go (100%) rename router_test.go => cmd/rove-server/router_test.go (100%) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3b8df13..108a0c7 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -31,7 +31,7 @@ jobs: fi - name: Build - run: go build -v . + run: go build -v ./... - name: Test - run: go test -v . + run: go test -v ./... diff --git a/Dockerfile b/Dockerfile index d9f9426..29fd85d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,6 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove . +RUN go build -o rove ./... CMD "./rove" diff --git a/main.go b/cmd/rove-server/main.go similarity index 100% rename from main.go rename to cmd/rove-server/main.go diff --git a/router.go b/cmd/rove-server/router.go similarity index 100% rename from router.go rename to cmd/rove-server/router.go diff --git a/router_test.go b/cmd/rove-server/router_test.go similarity index 100% rename from router_test.go rename to cmd/rove-server/router_test.go From e809c29b732f1448731225475582b893a8376176 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 22:45:01 +0100 Subject: [PATCH 011/495] Rename executable for consistency to rove-server --- Dockerfile | 4 ++-- docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 29fd85d..2e8147b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,6 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove ./... +RUN go build -o rove-server ./... -CMD "./rove" +CMD "./rove-server" diff --git a/docker-compose.yml b/docker-compose.yml index 8b74b56..0da2567 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ version: '3' services: - rove: + rove-server: build: . ports: - "80:80" \ No newline at end of file From 4a293eb912a7bfa4a40c93c9862b437e4599b3d2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 22:45:17 +0100 Subject: [PATCH 012/495] Add a command line flag to set the port and default to 8080 --- cmd/rove-server/main.go | 5 ++++- docker-compose.yml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 126ff02..48148c9 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "log" "net/http" @@ -9,6 +10,8 @@ import ( "syscall" ) +var port = flag.Int("port", 8080, "The port to host on") + func main() { fmt.Println("Initialising...") @@ -29,7 +32,7 @@ func main() { // Listen and serve the http requests fmt.Println("Serving HTTP") - if err := http.ListenAndServe(":80", router); err != nil { + if err := http.ListenAndServe(fmt.Sprintf(":%d", *port), router); err != nil { log.Fatal(err) } } diff --git a/docker-compose.yml b/docker-compose.yml index 0da2567..39f20f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,4 +3,4 @@ services: rove-server: build: . ports: - - "80:80" \ No newline at end of file + - "80:8080" \ No newline at end of file From b76fd1003c26e704b0233097a4381dee717eb64a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 22:56:21 +0100 Subject: [PATCH 013/495] Add empty integration tests file --- cmd/rove-server/integration_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 cmd/rove-server/integration_test.go diff --git a/cmd/rove-server/integration_test.go b/cmd/rove-server/integration_test.go new file mode 100644 index 0000000..faeec36 --- /dev/null +++ b/cmd/rove-server/integration_test.go @@ -0,0 +1,10 @@ +// +build integration +package main + +import "testing" + +var serverUrl = "http://localhost:8080" + +func TestServerStatus(t *testing.T) { + +} From 60cbf8b8d0a591334bcc9ae7fa7cbd46b6c0ddfc Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 23:05:00 +0100 Subject: [PATCH 014/495] Add rove package for the client api --- pkg/rove/rove.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 pkg/rove/rove.go diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go new file mode 100644 index 0000000..dae5c9c --- /dev/null +++ b/pkg/rove/rove.go @@ -0,0 +1,20 @@ +package rove + +type Connection struct { + address string +} + +func NewConnection(address string) *Connection { + return &Connection{ + address: address, + } +} + +// ServerStatus is a struct that contains information on the status of the server +type ServerStatus struct { + Ready bool `json:"ready"` +} + +func (c *Connection) Status() ServerStatus { + return ServerStatus{} +} From a6d86c258103ba622ebdf4fa5292b18f94a4f24b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 23:05:16 +0100 Subject: [PATCH 015/495] Add an integration test --- cmd/rove-server/integration_test.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/rove-server/integration_test.go b/cmd/rove-server/integration_test.go index faeec36..492dc64 100644 --- a/cmd/rove-server/integration_test.go +++ b/cmd/rove-server/integration_test.go @@ -1,10 +1,19 @@ // +build integration + package main -import "testing" +import ( + "testing" + + "github.com/mdiluz/rove/pkg/rove" +) var serverUrl = "http://localhost:8080" func TestServerStatus(t *testing.T) { - + conn := rove.NewConnection(serverUrl) + status := conn.Status() + if !status.Ready { + t.Error("Server did not return that it was ready") + } } From 522e8205b3a728927d6df6059b79eb7966f1bf95 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 29 May 2020 23:05:37 +0100 Subject: [PATCH 016/495] Use the rove package ServerStatus type --- cmd/rove-server/router.go | 8 ++------ cmd/rove-server/router_test.go | 4 +++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go index 80461c3..5e26886 100644 --- a/cmd/rove-server/router.go +++ b/cmd/rove-server/router.go @@ -5,6 +5,7 @@ import ( "net/http" "github.com/gorilla/mux" + "github.com/mdiluz/rove/pkg/rove" ) func NewRouter() (router *mux.Router) { @@ -17,14 +18,9 @@ func NewRouter() (router *mux.Router) { return } -// RouterStatus is a struct that contains information on the status of the server -type RouterStatus struct { - Ready bool `json:"ready"` -} - // HandleStatus handles HTTP requests to the /status endpoint func HandleStatus(w http.ResponseWriter, r *http.Request) { - var status = RouterStatus{ + var status = rove.ServerStatus{ Ready: true, } diff --git a/cmd/rove-server/router_test.go b/cmd/rove-server/router_test.go index 86714e3..35643c2 100644 --- a/cmd/rove-server/router_test.go +++ b/cmd/rove-server/router_test.go @@ -5,6 +5,8 @@ import ( "net/http" "net/http/httptest" "testing" + + "github.com/mdiluz/rove/pkg/rove" ) func TestHandleStatus(t *testing.T) { @@ -13,7 +15,7 @@ func TestHandleStatus(t *testing.T) { HandleStatus(response, request) - var status RouterStatus + var status rove.ServerStatus json.NewDecoder(response.Body).Decode(&status) if status.Ready != true { From 3043409939fd38453e5f5d45f1fd60ffcce96c3d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 22:52:50 +0100 Subject: [PATCH 017/495] Fix docker file for cmd subpath --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2e8147b..24095ad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,6 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove-server ./... +RUN cd cmd/rove-server && go build ./... -CMD "./rove-server" +CMD "./cmd/rove-server/rove-server" \ No newline at end of file From 5f358fa9fdda288bce7d7ba69f9ed88bedfb4a35 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 22:53:12 +0100 Subject: [PATCH 018/495] Fix the integration test and the default port for the compose --- cmd/rove-server/integration_test.go | 7 ++++--- docker-compose.yml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/rove-server/integration_test.go b/cmd/rove-server/integration_test.go index 492dc64..33b562d 100644 --- a/cmd/rove-server/integration_test.go +++ b/cmd/rove-server/integration_test.go @@ -8,12 +8,13 @@ import ( "github.com/mdiluz/rove/pkg/rove" ) -var serverUrl = "http://localhost:8080" +var serverUrl = "localhost:8080" func TestServerStatus(t *testing.T) { conn := rove.NewConnection(serverUrl) - status := conn.Status() - if !status.Ready { + if status, err := conn.Status(); err != nil { + t.Errorf("Status returned error: %s", err) + } else if !status.Ready { t.Error("Server did not return that it was ready") } } diff --git a/docker-compose.yml b/docker-compose.yml index 39f20f1..b166993 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,4 +3,4 @@ services: rove-server: build: . ports: - - "80:8080" \ No newline at end of file + - "8080:8080" \ No newline at end of file From 346c59e5eea3b9e856b824b5eac4462f13ae9454 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 22:53:28 +0100 Subject: [PATCH 019/495] Implement the integration test to check the status --- pkg/rove/rove.go | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go index dae5c9c..5bdc42d 100644 --- a/pkg/rove/rove.go +++ b/pkg/rove/rove.go @@ -1,12 +1,19 @@ package rove +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" +) + type Connection struct { - address string + host string } -func NewConnection(address string) *Connection { +func NewConnection(host string) *Connection { return &Connection{ - address: address, + host: host, } } @@ -15,6 +22,20 @@ type ServerStatus struct { Ready bool `json:"ready"` } -func (c *Connection) Status() ServerStatus { - return ServerStatus{} +func (c *Connection) Status() (status ServerStatus, err error) { + url := url.URL{ + Scheme: "http", + Host: c.host, + Path: "status", + } + + if resp, err := http.Get(url.String()); err != nil { + return ServerStatus{}, err + } else if resp.StatusCode != http.StatusOK { + return ServerStatus{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + } else { + err = json.NewDecoder(resp.Body).Decode(&status) + } + + return } From 60a3f37f09c38dd1446a48d1ee5feb8166ab38c0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 22:58:15 +0100 Subject: [PATCH 020/495] Merge github actions and add docker-compose deploy and integration test --- .github/workflows/docker-image.yml | 34 ++++++++++++++++++++++++--- .github/workflows/go.yml | 37 ------------------------------ 2 files changed, 31 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/go.yml diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 8e004d5..ba7c1f9 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -9,10 +9,38 @@ on: jobs: build: - + name: Build and Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Build the Docker image + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: ^1.13 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Get dependencies + run: | + go get -v -t -d ./... + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + fi + + - name: Build with go + run: go build -v ./... + + - name: Unit Tests + run: go test -v ./... + + - name: Build docker run: docker build . --tag rove:$(date +%s) + + - name: Deploy docker-compose + run: docker-compose up --build + + - name: Run integration tests + run: go test ./... -tags integration diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml deleted file mode 100644 index 108a0c7..0000000 --- a/.github/workflows/go.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Go And Tests - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - - build: - name: Build - runs-on: ubuntu-latest - steps: - - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: ^1.13 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v2 - - - name: Get dependencies - run: | - go get -v -t -d ./... - if [ -f Gopkg.toml ]; then - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh - dep ensure - fi - - - name: Build - run: go build -v ./... - - - name: Test - run: go test -v ./... From 6f9d400d8bfc9dc653d48bee244db879a222f1b5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:00:23 +0100 Subject: [PATCH 021/495] Rename the Github action --- .github/workflows/docker-image.yml | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index ba7c1f9..a8f3aeb 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Docker Image +name: Build and Test on: push: @@ -40,7 +40,7 @@ jobs: run: docker build . --tag rove:$(date +%s) - name: Deploy docker-compose - run: docker-compose up --build + run: docker-compose up --build --detach - name: Run integration tests run: go test ./... -tags integration diff --git a/README.md b/README.md index e29731c..3765187 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,5 @@ This repository is a growing document as well as the source code repository for Build Status ------------ -![Go And Tests](https://github.com/mdiluz/rove/workflows/Go%20And%20Tests/badge.svg) ![Docker Image](https://github.com/mdiluz/rove/workflows/Docker%20Image/badge.svg) +![Build and Test](https://github.com/mdiluz/rove/workflows/Build%20and%20Test/badge.svg) From 5d250edb6b5f0ba73595f0fb7bb5536bb46a616f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:17:59 +0100 Subject: [PATCH 022/495] Update comments --- cmd/rove-server/router.go | 2 +- pkg/rove/rove.go | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go index 5e26886..adc39e0 100644 --- a/cmd/rove-server/router.go +++ b/cmd/rove-server/router.go @@ -8,8 +8,8 @@ import ( "github.com/mdiluz/rove/pkg/rove" ) +// NewRouter sets up the server mux func NewRouter() (router *mux.Router) { - // Create a new router router = mux.NewRouter().StrictSlash(true) // Set up the handlers diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go index 5bdc42d..1f3c01f 100644 --- a/pkg/rove/rove.go +++ b/pkg/rove/rove.go @@ -7,10 +7,12 @@ import ( "net/url" ) +// Connection is the container for a simple connection to the server type Connection struct { host string } +// NewConnection sets up a new connection to a server host func NewConnection(host string) *Connection { return &Connection{ host: host, @@ -22,6 +24,7 @@ type ServerStatus struct { Ready bool `json:"ready"` } +// Status returns the current status of the server func (c *Connection) Status() (status ServerStatus, err error) { url := url.URL{ Scheme: "http", From b462ceb104e9817d6affbdbfc0b11e86324aab4b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:18:05 +0100 Subject: [PATCH 023/495] Add logging to the status request --- cmd/rove-server/router.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go index adc39e0..dbecf4b 100644 --- a/cmd/rove-server/router.go +++ b/cmd/rove-server/router.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "net/http" "github.com/gorilla/mux" @@ -20,6 +21,8 @@ func NewRouter() (router *mux.Router) { // HandleStatus handles HTTP requests to the /status endpoint func HandleStatus(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%s\t%s", r.Method, r.RequestURI) + var status = rove.ServerStatus{ Ready: true, } From efaccc4dedf6e3fee3d525cfde9df53373a73027 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:20:29 +0100 Subject: [PATCH 024/495] Add a step to cleanly take down the deployment --- .github/workflows/docker-image.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index a8f3aeb..cb3fc3d 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -44,3 +44,6 @@ jobs: - name: Run integration tests run: go test ./... -tags integration + + - name: Take down docker-compose + run: docker-compose down From a26bd9ab4d37469f553b6edb0b932c099e674be2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:21:40 +0100 Subject: [PATCH 025/495] Clean up test workflow step names --- .github/workflows/docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index cb3fc3d..548f4d8 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -19,10 +19,10 @@ jobs: go-version: ^1.13 id: go - - name: Check out code into the Go module directory + - name: Check out repo uses: actions/checkout@v2 - - name: Get dependencies + - name: Get go dependencies run: | go get -v -t -d ./... if [ -f Gopkg.toml ]; then @@ -33,7 +33,7 @@ jobs: - name: Build with go run: go build -v ./... - - name: Unit Tests + - name: Run go unit tests run: go test -v ./... - name: Build docker @@ -42,7 +42,7 @@ jobs: - name: Deploy docker-compose run: docker-compose up --build --detach - - name: Run integration tests + - name: Run go integration tests run: go test ./... -tags integration - name: Take down docker-compose From 8a17fcf59f8fdceb586e3d08d9b96dc29e8c5dbe Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:25:40 +0100 Subject: [PATCH 026/495] Be a good citizen and set the header in the reply --- cmd/rove-server/router.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go index dbecf4b..ecb1846 100644 --- a/cmd/rove-server/router.go +++ b/cmd/rove-server/router.go @@ -27,5 +27,10 @@ func HandleStatus(w http.ResponseWriter, r *http.Request) { Ready: true, } + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Reply with the current status json.NewEncoder(w).Encode(status) } From 8c4bf4f75f5e9f425af552e09d216db98593b53d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 30 May 2020 23:42:01 +0100 Subject: [PATCH 027/495] Add basic world object and tests --- pkg/rovegame/world.go | 32 ++++++++++++++++++++++++++++++++ pkg/rovegame/world_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 pkg/rovegame/world.go create mode 100644 pkg/rovegame/world_test.go diff --git a/pkg/rovegame/world.go b/pkg/rovegame/world.go new file mode 100644 index 0000000..3b78cc9 --- /dev/null +++ b/pkg/rovegame/world.go @@ -0,0 +1,32 @@ +package rovegame + +// World describes a self contained universe and everything in it +type World struct { + instances []Instance +} + +// Instance describes a single entity or instance of an entity in the world +type Instance struct { + id int +} + +// NewWorld creates a new world object +func NewWorld() *World { + return &World{} +} + +// Adds an instance to the game +func (w *World) CreateInstance() int { + // Simple ID to start with + id := len(w.instances) + + // Initialise the instance + instance := Instance{ + id: id, + } + + // Append the instance to the list + w.instances = append(w.instances, instance) + + return id +} diff --git a/pkg/rovegame/world_test.go b/pkg/rovegame/world_test.go new file mode 100644 index 0000000..c8124ad --- /dev/null +++ b/pkg/rovegame/world_test.go @@ -0,0 +1,24 @@ +package rovegame + +import ( + "testing" +) + +func TestNewWorld(t *testing.T) { + // Very basic for now, nothing to verify + world := NewWorld() + if world == nil { + t.Error("Failed to create world") + } +} + +func TestWorld_CreateInstance(t *testing.T) { + world := NewWorld() + a := world.CreateInstance() + b := world.CreateInstance() + + // Basic duplicate check + if a == b { + t.Errorf("Created identical instances") + } +} From eccb726f74d389bf83845b06dd12285e801205be Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 00:06:14 +0100 Subject: [PATCH 028/495] Add the concept of a player and the /register endpoint --- cmd/rove-server/integration_test.go | 20 ----------------- cmd/rove-server/main.go | 13 ++++++++--- cmd/rove-server/player.go | 13 +++++++++++ cmd/rove-server/player_test.go | 13 +++++++++++ cmd/rove-server/router.go | 24 ++++++++++++++++++-- cmd/rove-server/router_test.go | 2 +- go.mod | 5 ++++- go.sum | 2 ++ pkg/rove/rove.go | 35 ++++++++++++++++++++++++----- pkg/rove/rove_test.go | 29 ++++++++++++++++++++++++ pkg/rovegame/world.go | 9 ++++---- 11 files changed, 129 insertions(+), 36 deletions(-) delete mode 100644 cmd/rove-server/integration_test.go create mode 100644 cmd/rove-server/player.go create mode 100644 cmd/rove-server/player_test.go create mode 100644 pkg/rove/rove_test.go diff --git a/cmd/rove-server/integration_test.go b/cmd/rove-server/integration_test.go deleted file mode 100644 index 33b562d..0000000 --- a/cmd/rove-server/integration_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build integration - -package main - -import ( - "testing" - - "github.com/mdiluz/rove/pkg/rove" -) - -var serverUrl = "localhost:8080" - -func TestServerStatus(t *testing.T) { - conn := rove.NewConnection(serverUrl) - if status, err := conn.Status(); err != nil { - t.Errorf("Status returned error: %s", err) - } else if !status.Ready { - t.Error("Server did not return that it was ready") - } -} diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 48148c9..b243814 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -8,6 +8,8 @@ import ( "os" "os/signal" "syscall" + + "github.com/mdiluz/rove/pkg/rovegame" ) var port = flag.Int("port", 8080, "The port to host on") @@ -16,6 +18,14 @@ func main() { fmt.Println("Initialising...") + // Set up the world + world := rovegame.NewWorld() + fmt.Printf("World created\n\t%+v\n", world) + + // Create a new router + router := NewRouter() + fmt.Printf("Router Created\n") + // Set up the close handler c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) @@ -25,9 +35,6 @@ func main() { os.Exit(0) }() - // Create a new router - router := NewRouter() - fmt.Println("Initialised") // Listen and serve the http requests diff --git a/cmd/rove-server/player.go b/cmd/rove-server/player.go new file mode 100644 index 0000000..42e2f3a --- /dev/null +++ b/cmd/rove-server/player.go @@ -0,0 +1,13 @@ +package main + +import "github.com/google/uuid" + +type Player struct { + id uuid.UUID +} + +func NewPlayer() Player { + return Player{ + id: uuid.New(), + } +} diff --git a/cmd/rove-server/player_test.go b/cmd/rove-server/player_test.go new file mode 100644 index 0000000..b26d265 --- /dev/null +++ b/cmd/rove-server/player_test.go @@ -0,0 +1,13 @@ +package main + +import ( + "testing" +) + +func TestNewPlayer(t *testing.T) { + a := NewPlayer() + b := NewPlayer() + if a.id == b.id { + t.Error("Player IDs matched") + } +} diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go index ecb1846..59d24f9 100644 --- a/cmd/rove-server/router.go +++ b/cmd/rove-server/router.go @@ -15,6 +15,7 @@ func NewRouter() (router *mux.Router) { // Set up the handlers router.HandleFunc("/status", HandleStatus) + router.HandleFunc("/register", HandleRegister) return } @@ -23,7 +24,7 @@ func NewRouter() (router *mux.Router) { func HandleStatus(w http.ResponseWriter, r *http.Request) { fmt.Printf("%s\t%s", r.Method, r.RequestURI) - var status = rove.ServerStatus{ + var response = rove.StatusResponse{ Ready: true, } @@ -32,5 +33,24 @@ func HandleStatus(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) // Reply with the current status - json.NewEncoder(w).Encode(status) + json.NewEncoder(w).Encode(response) +} + +// HandleRegister handles HTTP requests to the /register endpoint +func HandleRegister(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%s\t%s", r.Method, r.RequestURI) + + // TODO: Add this user to the server + player := NewPlayer() + var response = rove.RegisterResponse{ + Success: true, + Id: player.id.String(), + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Reply with the current status + json.NewEncoder(w).Encode(response) } diff --git a/cmd/rove-server/router_test.go b/cmd/rove-server/router_test.go index 35643c2..de7ae5b 100644 --- a/cmd/rove-server/router_test.go +++ b/cmd/rove-server/router_test.go @@ -15,7 +15,7 @@ func TestHandleStatus(t *testing.T) { HandleStatus(response, request) - var status rove.ServerStatus + var status rove.StatusResponse json.NewDecoder(response.Body).Decode(&status) if status.Ready != true { diff --git a/go.mod b/go.mod index ede3023..25e663c 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/mdiluz/rove go 1.14 -require github.com/gorilla/mux v1.7.4 +require ( + github.com/google/uuid v1.1.1 + github.com/gorilla/mux v1.7.4 +) diff --git a/go.sum b/go.sum index abb0613..ee6c4bc 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go index 1f3c01f..2c91901 100644 --- a/pkg/rove/rove.go +++ b/pkg/rove/rove.go @@ -19,13 +19,13 @@ func NewConnection(host string) *Connection { } } -// ServerStatus is a struct that contains information on the status of the server -type ServerStatus struct { +// StatusResponse is a struct that contains information on the status of the server +type StatusResponse struct { Ready bool `json:"ready"` } // Status returns the current status of the server -func (c *Connection) Status() (status ServerStatus, err error) { +func (c *Connection) Status() (status StatusResponse, err error) { url := url.URL{ Scheme: "http", Host: c.host, @@ -33,12 +33,37 @@ func (c *Connection) Status() (status ServerStatus, err error) { } if resp, err := http.Get(url.String()); err != nil { - return ServerStatus{}, err + return StatusResponse{}, err } else if resp.StatusCode != http.StatusOK { - return ServerStatus{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + return StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) } else { err = json.NewDecoder(resp.Body).Decode(&status) } return } + +// RegisterResponse +type RegisterResponse struct { + Id string `json:"id"` + Success bool `json:"success"` +} + +// Register registers a new player on the server +func (c *Connection) Register() (register RegisterResponse, err error) { + url := url.URL{ + Scheme: "http", + Host: c.host, + Path: "register", + } + + if resp, err := http.Get(url.String()); err != nil { + return RegisterResponse{}, err + } else if resp.StatusCode != http.StatusOK { + return RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + } else { + err = json.NewDecoder(resp.Body).Decode(®ister) + } + + return +} diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go new file mode 100644 index 0000000..2a8e4ce --- /dev/null +++ b/pkg/rove/rove_test.go @@ -0,0 +1,29 @@ +// +build integration + +package rove + +import ( + "testing" +) + +var serverUrl = "localhost:8080" + +func TestStatus(t *testing.T) { + conn := NewConnection(serverUrl) + if status, err := conn.Status(); err != nil { + t.Errorf("Status returned error: %s", err) + } else if !status.Ready { + t.Error("Server did not return that it was ready") + } +} + +func TestRegister(t *testing.T) { + conn := NewConnection(serverUrl) + if reg, err := conn.Register(); err != nil { + t.Errorf("Register returned error: %s", err) + } else if !reg.Success { + t.Error("Server did not success for Register") + } else if len(reg.Id) == 0 { + t.Error("Server returned empty registration ID") + } +} diff --git a/pkg/rovegame/world.go b/pkg/rovegame/world.go index 3b78cc9..1e1a4e3 100644 --- a/pkg/rovegame/world.go +++ b/pkg/rovegame/world.go @@ -1,5 +1,7 @@ package rovegame +import "github.com/google/uuid" + // World describes a self contained universe and everything in it type World struct { instances []Instance @@ -7,7 +9,7 @@ type World struct { // Instance describes a single entity or instance of an entity in the world type Instance struct { - id int + id uuid.UUID } // NewWorld creates a new world object @@ -16,9 +18,8 @@ func NewWorld() *World { } // Adds an instance to the game -func (w *World) CreateInstance() int { - // Simple ID to start with - id := len(w.instances) +func (w *World) CreateInstance() uuid.UUID { + id := uuid.New() // Initialise the instance instance := Instance{ From 93decc027bc53ca169a70c048685aa7fe8d535de Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 11:18:26 +0100 Subject: [PATCH 029/495] Refactor into server object to handle registered accounts --- cmd/rove-server/main.go | 19 +--- cmd/rove-server/player.go | 13 --- cmd/rove-server/player_test.go | 13 --- cmd/rove-server/router.go | 56 ----------- pkg/{rovegame => game}/world.go | 2 +- pkg/{rovegame => game}/world_test.go | 2 +- pkg/rove/rove.go | 50 ++++++---- pkg/rove/rove_test.go | 24 ++++- pkg/server/accounts.go | 47 +++++++++ pkg/server/accounts_test.go | 49 ++++++++++ pkg/server/router.go | 97 +++++++++++++++++++ .../rove-server => pkg/server}/router_test.go | 11 ++- pkg/server/server.go | 49 ++++++++++ 13 files changed, 304 insertions(+), 128 deletions(-) delete mode 100644 cmd/rove-server/player.go delete mode 100644 cmd/rove-server/player_test.go delete mode 100644 cmd/rove-server/router.go rename pkg/{rovegame => game}/world.go (97%) rename pkg/{rovegame => game}/world_test.go (95%) create mode 100644 pkg/server/accounts.go create mode 100644 pkg/server/accounts_test.go create mode 100644 pkg/server/router.go rename {cmd/rove-server => pkg/server}/router_test.go (74%) create mode 100644 pkg/server/server.go diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index b243814..22efc1f 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -3,28 +3,21 @@ package main import ( "flag" "fmt" - "log" - "net/http" "os" "os/signal" "syscall" - "github.com/mdiluz/rove/pkg/rovegame" + "github.com/mdiluz/rove/pkg/server" ) var port = flag.Int("port", 8080, "The port to host on") func main() { + server := server.NewServer(*port) fmt.Println("Initialising...") - // Set up the world - world := rovegame.NewWorld() - fmt.Printf("World created\n\t%+v\n", world) - - // Create a new router - router := NewRouter() - fmt.Printf("Router Created\n") + server.Initialise() // Set up the close handler c := make(chan os.Signal) @@ -37,9 +30,5 @@ func main() { fmt.Println("Initialised") - // Listen and serve the http requests - fmt.Println("Serving HTTP") - if err := http.ListenAndServe(fmt.Sprintf(":%d", *port), router); err != nil { - log.Fatal(err) - } + server.Run() } diff --git a/cmd/rove-server/player.go b/cmd/rove-server/player.go deleted file mode 100644 index 42e2f3a..0000000 --- a/cmd/rove-server/player.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -import "github.com/google/uuid" - -type Player struct { - id uuid.UUID -} - -func NewPlayer() Player { - return Player{ - id: uuid.New(), - } -} diff --git a/cmd/rove-server/player_test.go b/cmd/rove-server/player_test.go deleted file mode 100644 index b26d265..0000000 --- a/cmd/rove-server/player_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -import ( - "testing" -) - -func TestNewPlayer(t *testing.T) { - a := NewPlayer() - b := NewPlayer() - if a.id == b.id { - t.Error("Player IDs matched") - } -} diff --git a/cmd/rove-server/router.go b/cmd/rove-server/router.go deleted file mode 100644 index 59d24f9..0000000 --- a/cmd/rove-server/router.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "net/http" - - "github.com/gorilla/mux" - "github.com/mdiluz/rove/pkg/rove" -) - -// NewRouter sets up the server mux -func NewRouter() (router *mux.Router) { - router = mux.NewRouter().StrictSlash(true) - - // Set up the handlers - router.HandleFunc("/status", HandleStatus) - router.HandleFunc("/register", HandleRegister) - - return -} - -// HandleStatus handles HTTP requests to the /status endpoint -func HandleStatus(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s", r.Method, r.RequestURI) - - var response = rove.StatusResponse{ - Ready: true, - } - - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - - // Reply with the current status - json.NewEncoder(w).Encode(response) -} - -// HandleRegister handles HTTP requests to the /register endpoint -func HandleRegister(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s", r.Method, r.RequestURI) - - // TODO: Add this user to the server - player := NewPlayer() - var response = rove.RegisterResponse{ - Success: true, - Id: player.id.String(), - } - - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - - // Reply with the current status - json.NewEncoder(w).Encode(response) -} diff --git a/pkg/rovegame/world.go b/pkg/game/world.go similarity index 97% rename from pkg/rovegame/world.go rename to pkg/game/world.go index 1e1a4e3..f03d99c 100644 --- a/pkg/rovegame/world.go +++ b/pkg/game/world.go @@ -1,4 +1,4 @@ -package rovegame +package game import "github.com/google/uuid" diff --git a/pkg/rovegame/world_test.go b/pkg/game/world_test.go similarity index 95% rename from pkg/rovegame/world_test.go rename to pkg/game/world_test.go index c8124ad..504b8ee 100644 --- a/pkg/rovegame/world_test.go +++ b/pkg/game/world_test.go @@ -1,4 +1,4 @@ -package rovegame +package game import ( "testing" diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go index 2c91901..cdfed09 100644 --- a/pkg/rove/rove.go +++ b/pkg/rove/rove.go @@ -1,10 +1,13 @@ package rove import ( + "bytes" "encoding/json" "fmt" "net/http" "net/url" + + "github.com/mdiluz/rove/pkg/server" ) // Connection is the container for a simple connection to the server @@ -19,13 +22,8 @@ func NewConnection(host string) *Connection { } } -// StatusResponse is a struct that contains information on the status of the server -type StatusResponse struct { - Ready bool `json:"ready"` -} - // Status returns the current status of the server -func (c *Connection) Status() (status StatusResponse, err error) { +func (c *Connection) Status() (status server.StatusResponse, err error) { url := url.URL{ Scheme: "http", Host: c.host, @@ -33,9 +31,9 @@ func (c *Connection) Status() (status StatusResponse, err error) { } if resp, err := http.Get(url.String()); err != nil { - return StatusResponse{}, err + return server.StatusResponse{}, err } else if resp.StatusCode != http.StatusOK { - return StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + return server.StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) } else { err = json.NewDecoder(resp.Body).Decode(&status) } @@ -43,26 +41,36 @@ func (c *Connection) Status() (status StatusResponse, err error) { return } -// RegisterResponse -type RegisterResponse struct { - Id string `json:"id"` - Success bool `json:"success"` -} - -// Register registers a new player on the server -func (c *Connection) Register() (register RegisterResponse, err error) { +// Register registers a new account on the server +func (c *Connection) Register(name string) (register server.RegisterResponse, err error) { url := url.URL{ Scheme: "http", Host: c.host, Path: "register", } - if resp, err := http.Get(url.String()); err != nil { - return RegisterResponse{}, err - } else if resp.StatusCode != http.StatusOK { - return RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + // Marshal the register data struct + data := server.RegisterData{Name: name} + marshalled, err := json.Marshal(data) + + // Set up the request + req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) + req.Header.Set("Content-Type", "application/json") + + // Do the request + client := &http.Client{} + if resp, err := client.Do(req); err != nil { + return server.RegisterResponse{}, err } else { - err = json.NewDecoder(resp.Body).Decode(®ister) + defer resp.Body.Close() + + // Handle any errors + if resp.StatusCode != http.StatusOK { + return server.RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + } else { + // Decode the reply + err = json.NewDecoder(resp.Body).Decode(®ister) + } } return diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go index 2a8e4ce..a78758d 100644 --- a/pkg/rove/rove_test.go +++ b/pkg/rove/rove_test.go @@ -10,6 +10,7 @@ var serverUrl = "localhost:8080" func TestStatus(t *testing.T) { conn := NewConnection(serverUrl) + if status, err := conn.Status(); err != nil { t.Errorf("Status returned error: %s", err) } else if !status.Ready { @@ -19,11 +20,28 @@ func TestStatus(t *testing.T) { func TestRegister(t *testing.T) { conn := NewConnection(serverUrl) - if reg, err := conn.Register(); err != nil { + + reg1, err := conn.Register("one") + if err != nil { t.Errorf("Register returned error: %s", err) - } else if !reg.Success { + } else if !reg1.Success { t.Error("Server did not success for Register") - } else if len(reg.Id) == 0 { + } else if len(reg1.Id) == 0 { t.Error("Server returned empty registration ID") } + + reg2, err := conn.Register("two") + if err != nil { + t.Errorf("Register returned error: %s", err) + } else if !reg2.Success { + t.Error("Server did not success for Register") + } else if len(reg2.Id) == 0 { + t.Error("Server returned empty registration ID") + } + + if reg2, err := conn.Register("one"); err != nil { + t.Errorf("Register returned error: %s", err) + } else if reg2.Success { + t.Error("Server should have failed to register duplicate name") + } } diff --git a/pkg/server/accounts.go b/pkg/server/accounts.go new file mode 100644 index 0000000..2f68051 --- /dev/null +++ b/pkg/server/accounts.go @@ -0,0 +1,47 @@ +package server + +import ( + "fmt" + + "github.com/google/uuid" +) + +// Account represents a registered user +type Account struct { + // Name simply describes the account and must be unique + Name string + + // id represents a unique ID per account and is set one registered + id uuid.UUID +} + +// Accountant manages a set of accounts +type Accountant struct { + accounts []Account +} + +// NewAccountant creates a new accountant +func NewAccountant() *Accountant { + return &Accountant{} +} + +// RegisterAccount adds an account to the set of internal accounts +func (a *Accountant) RegisterAccount(acc Account) (Account, error) { + + // Set the account ID to a new UUID + acc.id = uuid.New() + + // Verify this acount isn't already registered + for _, a := range a.accounts { + if a.Name == acc.Name { + return Account{}, fmt.Errorf("Account name already registered") + } else if a.id == acc.id { + return Account{}, fmt.Errorf("Account ID already registered") + } + } + + // Simply add the account to the list + a.accounts = append(a.accounts, acc) + + return acc, nil +} diff --git a/pkg/server/accounts_test.go b/pkg/server/accounts_test.go new file mode 100644 index 0000000..8398ba0 --- /dev/null +++ b/pkg/server/accounts_test.go @@ -0,0 +1,49 @@ +package server + +import ( + "testing" +) + +func TestNewAccountant(t *testing.T) { + // Very basic verify here for now + accountant := NewAccountant() + if accountant == nil { + t.Error("Failed to create accountant") + } +} + +func TestAccountant_RegisterAccount(t *testing.T) { + + accountant := NewAccountant() + + // Start by making two accounts + + namea := "one" + a := Account{Name: namea} + acca, err := accountant.RegisterAccount(a) + if err != nil { + t.Error(err) + } else if acca.Name != namea { + t.Errorf("Missmatched account name after register, expected: %s, actual: %s", namea, acca.Name) + } + + nameb := "two" + b := Account{Name: nameb} + accb, err := accountant.RegisterAccount(b) + if err != nil { + t.Error(err) + } else if accb.Name != nameb { + t.Errorf("Missmatched account name after register, expected: %s, actual: %s", nameb, acca.Name) + } + + // Verify our accounts have differing IDs + if acca.id == accb.id { + t.Error("Duplicate account IDs fo separate accounts") + } + + // Verify another request gets rejected + _, err = accountant.RegisterAccount(a) + if err == nil { + t.Error("Duplicate account name did not produce error") + } +} diff --git a/pkg/server/router.go b/pkg/server/router.go new file mode 100644 index 0000000..5246dd2 --- /dev/null +++ b/pkg/server/router.go @@ -0,0 +1,97 @@ +package server + +import ( + "encoding/json" + "fmt" + "net/http" + + "github.com/gorilla/mux" +) + +// NewRouter sets up the server mux +func (s *Server) SetUpRouter() { + s.router = mux.NewRouter().StrictSlash(true) + + // Set up the handlers + s.router.HandleFunc("/status", s.HandleStatus) + s.router.HandleFunc("/register", s.HandleRegister) +} + +// StatusResponse is a struct that contains information on the status of the server +type StatusResponse struct { + Ready bool `json:"ready"` +} + +// HandleStatus handles HTTP requests to the /status endpoint +func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%s\t%s", r.Method, r.RequestURI) + + // Verify we're hit with a get request + if r.Method != http.MethodGet { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + var response = StatusResponse{ + Ready: true, + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Reply with the current status + json.NewEncoder(w).Encode(response) +} + +// RegisterData describes the data to send when registering +type RegisterData struct { + Name string `json:"id"` +} + +// RegisterResponse describes the response to a register request +type RegisterResponse struct { + Id string `json:"id"` + + Success bool `json:"success"` + Error string `json:"error"` +} + +// HandleRegister handles HTTP requests to the /register endpoint +func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%s\t%s", r.Method, r.RequestURI) + + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + // Pull out the registration info + var data RegisterData + json.NewDecoder(r.Body).Decode(&data) + + // Register the account with the server + acc := Account{Name: data.Name} + acc, err := s.accountant.RegisterAccount(acc) + + // Set up the response + var response = RegisterResponse{ + Success: false, + } + + // If we didn't fail, respond with the account ID string + if err == nil { + response.Success = true + response.Id = acc.id.String() + } else { + response.Error = err.Error() + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Reply with the current status + json.NewEncoder(w).Encode(response) +} diff --git a/cmd/rove-server/router_test.go b/pkg/server/router_test.go similarity index 74% rename from cmd/rove-server/router_test.go rename to pkg/server/router_test.go index de7ae5b..8bbd892 100644 --- a/cmd/rove-server/router_test.go +++ b/pkg/server/router_test.go @@ -1,21 +1,22 @@ -package main +package server import ( "encoding/json" "net/http" "net/http/httptest" "testing" - - "github.com/mdiluz/rove/pkg/rove" ) func TestHandleStatus(t *testing.T) { request, _ := http.NewRequest(http.MethodGet, "/status", nil) response := httptest.NewRecorder() - HandleStatus(response, request) + s := NewServer(8080) + s.Initialise() - var status rove.StatusResponse + s.HandleStatus(response, request) + + var status StatusResponse json.NewDecoder(response.Body).Decode(&status) if status.Ready != true { diff --git a/pkg/server/server.go b/pkg/server/server.go new file mode 100644 index 0000000..f1024e4 --- /dev/null +++ b/pkg/server/server.go @@ -0,0 +1,49 @@ +package server + +import ( + "fmt" + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/mdiluz/rove/pkg/game" +) + +// Server contains the relevant data to run a game server +type Server struct { + port int + + accountant *Accountant + world *game.World + + router *mux.Router +} + +// NewServer sets up a new server +func NewServer(port int) *Server { + return &Server{ + port: port, + accountant: NewAccountant(), + world: game.NewWorld(), + } +} + +// Initialise sets up internal state ready to serve +func (s *Server) Initialise() { + // Set up the world + s.world = game.NewWorld() + fmt.Printf("World created\n\t%+v\n", s.world) + + // Create a new router + s.SetUpRouter() + fmt.Printf("Routes Created\n") +} + +// Run executes the server +func (s *Server) Run() { + // Listen and serve the http requests + fmt.Println("Serving HTTP") + if err := http.ListenAndServe(fmt.Sprintf(":%d", s.port), s.router); err != nil { + log.Fatal(err) + } +} From 3aaf5e6b8153c65c69625cc1aacf5816738d51a8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 11:22:20 +0100 Subject: [PATCH 030/495] Add test for HandleRegister function --- pkg/server/router_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 8bbd892..1983770 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -1,6 +1,7 @@ package server import ( + "bytes" "encoding/json" "net/http" "net/http/httptest" @@ -23,3 +24,26 @@ func TestHandleStatus(t *testing.T) { t.Errorf("got false for /status") } } + +func TestHandleRegister(t *testing.T) { + data := RegisterData{Name: "one"} + b, err := json.Marshal(data) + if err != nil { + t.Error(err) + } + + request, _ := http.NewRequest(http.MethodPost, "/register", bytes.NewReader(b)) + response := httptest.NewRecorder() + + s := NewServer(8080) + s.Initialise() + + s.HandleRegister(response, request) + + var status RegisterResponse + json.NewDecoder(response.Body).Decode(&status) + + if status.Success != true { + t.Errorf("got false for /register") + } +} From 0f507cf4fd4b0cf7d77a3bb45c3a7502e840a343 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 11:34:23 +0100 Subject: [PATCH 031/495] Add test coverage to the output --- .github/workflows/docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 548f4d8..52dffa3 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -34,7 +34,7 @@ jobs: run: go build -v ./... - name: Run go unit tests - run: go test -v ./... + run: go test -v ./... -cover - name: Build docker run: docker build . --tag rove:$(date +%s) @@ -43,7 +43,7 @@ jobs: run: docker-compose up --build --detach - name: Run go integration tests - run: go test ./... -tags integration + run: go test ./... -tags integration -cover - name: Take down docker-compose run: docker-compose down From 95963e9b29be169d95537fda05acc0ced8fd23c7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 11:40:07 +0100 Subject: [PATCH 032/495] Add test script --- .github/workflows/docker-image.yml | 19 ++----------------- script/test.sh | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 17 deletions(-) create mode 100755 script/test.sh diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 52dffa3..d9c7e9c 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -30,20 +30,5 @@ jobs: dep ensure fi - - name: Build with go - run: go build -v ./... - - - name: Run go unit tests - run: go test -v ./... -cover - - - name: Build docker - run: docker build . --tag rove:$(date +%s) - - - name: Deploy docker-compose - run: docker-compose up --build --detach - - - name: Run go integration tests - run: go test ./... -tags integration -cover - - - name: Take down docker-compose - run: docker-compose down + - name: Build and Test + run: ./script/test.sh diff --git a/script/test.sh b/script/test.sh new file mode 100755 index 0000000..ce26225 --- /dev/null +++ b/script/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" +cd .. +set -x + +# Test the build +go build -v ./... + +# Run unit tests +go test -v ./... -cover + +# Verify docker build +docker build . + +# Run the integration tests with docker-compose +docker-compose up --build --detach +go test -v ./... -tags integration -cover +docker-compose down \ No newline at end of file From f1e631136643c36ef37273b5e4c1c7de7fa91f4b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 11:55:46 +0100 Subject: [PATCH 033/495] Add coverage data to github action --- .github/workflows/docker-image.yml | 6 ++++++ script/test.sh | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index d9c7e9c..fc20efb 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -32,3 +32,9 @@ jobs: - name: Build and Test run: ./script/test.sh + + - name: Upload test coverage result + uses: actions/upload-artifact@v1 + with: + name: Coverage + path: /tmp/coverage.html diff --git a/script/test.sh b/script/test.sh index ce26225..2f8d90b 100755 --- a/script/test.sh +++ b/script/test.sh @@ -15,5 +15,8 @@ docker build . # Run the integration tests with docker-compose docker-compose up --build --detach -go test -v ./... -tags integration -cover -docker-compose down \ No newline at end of file +go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out +docker-compose down + +# Convert the coverage data to html +go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From 179dd3f984095feb0b07f52529d11f5dc0e6c848 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 19:15:57 +0100 Subject: [PATCH 034/495] Implement saving and loading for account data, currently a basic json file --- .vscode/launch.json | 18 ++++++ Dockerfile | 4 +- cmd/rove-server/main.go => main.go | 16 ++++-- pkg/accounts/accounts.go | 86 ++++++++++++++++++++++++++++ pkg/accounts/accounts_test.go | 92 ++++++++++++++++++++++++++++++ pkg/server/accounts.go | 47 --------------- pkg/server/accounts_test.go | 49 ---------------- pkg/server/router.go | 43 ++++++++------ pkg/server/router_test.go | 4 +- pkg/server/server.go | 75 +++++++++++++++++++++--- script/test.sh | 2 +- 11 files changed, 306 insertions(+), 130 deletions(-) create mode 100644 .vscode/launch.json rename cmd/rove-server/main.go => main.go (67%) create mode 100644 pkg/accounts/accounts.go create mode 100644 pkg/accounts/accounts_test.go delete mode 100644 pkg/server/accounts.go delete mode 100644 pkg/server/accounts_test.go diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..b3d3cce --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Rove Server", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/", + "cwd": "${workspaceFolder}", + "env": {}, + "args": [], + } + ] +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 24095ad..2f52a78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,6 @@ WORKDIR /app COPY . . RUN go mod download -RUN cd cmd/rove-server && go build ./... +RUN go build -o rove-server . -CMD "./cmd/rove-server/rove-server" \ No newline at end of file +CMD "./rove-server" \ No newline at end of file diff --git a/cmd/rove-server/main.go b/main.go similarity index 67% rename from cmd/rove-server/main.go rename to main.go index 22efc1f..2729d78 100644 --- a/cmd/rove-server/main.go +++ b/main.go @@ -13,11 +13,14 @@ import ( var port = flag.Int("port", 8080, "The port to host on") func main() { - server := server.NewServer(*port) + s := server.NewServer( + server.OptionPort(*port), + server.OptionPersistentData()) fmt.Println("Initialising...") - - server.Initialise() + if err := s.Initialise(); err != nil { + panic(err) + } // Set up the close handler c := make(chan os.Signal) @@ -25,10 +28,15 @@ func main() { go func() { <-c fmt.Println("SIGTERM recieved, exiting...") + s.Close() os.Exit(0) }() fmt.Println("Initialised") - server.Run() + s.Run() + + if err := s.Close(); err != nil { + panic(err) + } } diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go new file mode 100644 index 0000000..efcf976 --- /dev/null +++ b/pkg/accounts/accounts.go @@ -0,0 +1,86 @@ +package accounts + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/google/uuid" +) + +const kDefaultSavePath = "/tmp/accounts.json" + +// Account represents a registered user +type Account struct { + // Name simply describes the account and must be unique + Name string `json:"name"` + + // id represents a unique ID per account and is set one registered + Id uuid.UUID `json:"id"` +} + +// Represents the accountant data to store +type accountantData struct { + Accounts []Account `json:"accounts"` +} + +// Accountant manages a set of accounts +type Accountant struct { + data accountantData +} + +// NewAccountant creates a new accountant +func NewAccountant() *Accountant { + return &Accountant{} +} + +// RegisterAccount adds an account to the set of internal accounts +func (a *Accountant) RegisterAccount(acc Account) (Account, error) { + + // Set the account ID to a new UUID + acc.Id = uuid.New() + + // Verify this acount isn't already registered + for _, a := range a.data.Accounts { + if a.Name == acc.Name { + return Account{}, fmt.Errorf("Account name already registered") + } else if a.Id == acc.Id { + return Account{}, fmt.Errorf("Account ID already registered") + } + } + + // Simply add the account to the list + a.data.Accounts = append(a.data.Accounts, acc) + + return acc, nil +} + +// Load will load the accountant from data +func (a *Accountant) Load() error { + // Don't load anything if the file doesn't exist + _, err := os.Stat(kDefaultSavePath) + if os.IsNotExist(err) { + fmt.Printf("File %s didn't exist, loading with fresh accounts data\n", kDefaultSavePath) + return nil + } + + if b, err := ioutil.ReadFile(kDefaultSavePath); err != nil { + return err + } else if err := json.Unmarshal(b, &a.data); err != nil { + return err + } + return nil +} + +// Save will save the accountant data out +func (a *Accountant) Save() error { + if b, err := json.Marshal(a.data); err != nil { + return err + } else { + if err := ioutil.WriteFile(kDefaultSavePath, b, os.ModePerm); err != nil { + return err + } + } + return nil +} diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go new file mode 100644 index 0000000..6d319a2 --- /dev/null +++ b/pkg/accounts/accounts_test.go @@ -0,0 +1,92 @@ +package accounts + +import ( + "testing" +) + +func TestNewAccountant(t *testing.T) { + // Very basic verify here for now + accountant := NewAccountant() + if accountant == nil { + t.Error("Failed to create accountant") + } +} + +func TestAccountant_RegisterAccount(t *testing.T) { + + accountant := NewAccountant() + + // Start by making two accounts + + namea := "one" + a := Account{Name: namea} + acca, err := accountant.RegisterAccount(a) + if err != nil { + t.Error(err) + } else if acca.Name != namea { + t.Errorf("Missmatched account name after register, expected: %s, actual: %s", namea, acca.Name) + } + + nameb := "two" + b := Account{Name: nameb} + accb, err := accountant.RegisterAccount(b) + if err != nil { + t.Error(err) + } else if accb.Name != nameb { + t.Errorf("Missmatched account name after register, expected: %s, actual: %s", nameb, acca.Name) + } + + // Verify our accounts have differing IDs + if acca.Id == accb.Id { + t.Error("Duplicate account IDs fo separate accounts") + } + + // Verify another request gets rejected + _, err = accountant.RegisterAccount(a) + if err == nil { + t.Error("Duplicate account name did not produce error") + } +} + +func TestAccountant_LoadSave(t *testing.T) { + accountant := NewAccountant() + if len(accountant.data.Accounts) != 0 { + t.Error("New accountant created with non-zero account number") + } + + name := "one" + a := Account{Name: name} + a, err := accountant.RegisterAccount(a) + if err != nil { + t.Error(err) + } + + if len(accountant.data.Accounts) != 1 { + t.Error("No new account made") + } else if accountant.data.Accounts[0].Name != name { + t.Error("New account created with wrong name") + } + + // Save out the accountant + if err := accountant.Save(); err != nil { + t.Error(err) + } + + // Re-create the accountant + accountant = NewAccountant() + if len(accountant.data.Accounts) != 0 { + t.Error("New accountant created with non-zero account number") + } + + // Load the old accountant data + if err := accountant.Load(); err != nil { + t.Error(err) + } + + // Verify we have the same account again + if len(accountant.data.Accounts) != 1 { + t.Error("No account after load") + } else if accountant.data.Accounts[0].Name != name { + t.Error("New account created with wrong name") + } +} diff --git a/pkg/server/accounts.go b/pkg/server/accounts.go deleted file mode 100644 index 2f68051..0000000 --- a/pkg/server/accounts.go +++ /dev/null @@ -1,47 +0,0 @@ -package server - -import ( - "fmt" - - "github.com/google/uuid" -) - -// Account represents a registered user -type Account struct { - // Name simply describes the account and must be unique - Name string - - // id represents a unique ID per account and is set one registered - id uuid.UUID -} - -// Accountant manages a set of accounts -type Accountant struct { - accounts []Account -} - -// NewAccountant creates a new accountant -func NewAccountant() *Accountant { - return &Accountant{} -} - -// RegisterAccount adds an account to the set of internal accounts -func (a *Accountant) RegisterAccount(acc Account) (Account, error) { - - // Set the account ID to a new UUID - acc.id = uuid.New() - - // Verify this acount isn't already registered - for _, a := range a.accounts { - if a.Name == acc.Name { - return Account{}, fmt.Errorf("Account name already registered") - } else if a.id == acc.id { - return Account{}, fmt.Errorf("Account ID already registered") - } - } - - // Simply add the account to the list - a.accounts = append(a.accounts, acc) - - return acc, nil -} diff --git a/pkg/server/accounts_test.go b/pkg/server/accounts_test.go deleted file mode 100644 index 8398ba0..0000000 --- a/pkg/server/accounts_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package server - -import ( - "testing" -) - -func TestNewAccountant(t *testing.T) { - // Very basic verify here for now - accountant := NewAccountant() - if accountant == nil { - t.Error("Failed to create accountant") - } -} - -func TestAccountant_RegisterAccount(t *testing.T) { - - accountant := NewAccountant() - - // Start by making two accounts - - namea := "one" - a := Account{Name: namea} - acca, err := accountant.RegisterAccount(a) - if err != nil { - t.Error(err) - } else if acca.Name != namea { - t.Errorf("Missmatched account name after register, expected: %s, actual: %s", namea, acca.Name) - } - - nameb := "two" - b := Account{Name: nameb} - accb, err := accountant.RegisterAccount(b) - if err != nil { - t.Error(err) - } else if accb.Name != nameb { - t.Errorf("Missmatched account name after register, expected: %s, actual: %s", nameb, acca.Name) - } - - // Verify our accounts have differing IDs - if acca.id == accb.id { - t.Error("Duplicate account IDs fo separate accounts") - } - - // Verify another request gets rejected - _, err = accountant.RegisterAccount(a) - if err == nil { - t.Error("Duplicate account name did not produce error") - } -} diff --git a/pkg/server/router.go b/pkg/server/router.go index 5246dd2..bb8fc78 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -6,6 +6,7 @@ import ( "net/http" "github.com/gorilla/mux" + "github.com/mdiluz/rove/pkg/accounts" ) // NewRouter sets up the server mux @@ -24,7 +25,7 @@ type StatusResponse struct { // HandleStatus handles HTTP requests to the /status endpoint func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s", r.Method, r.RequestURI) + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) // Verify we're hit with a get request if r.Method != http.MethodGet { @@ -59,7 +60,12 @@ type RegisterResponse struct { // HandleRegister handles HTTP requests to the /register endpoint func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s", r.Method, r.RequestURI) + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Set up the response + var response = RegisterResponse{ + Success: false, + } // Verify we're hit with a get request if r.Method != http.MethodPost { @@ -69,23 +75,26 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { // Pull out the registration info var data RegisterData - json.NewDecoder(r.Body).Decode(&data) + err := json.NewDecoder(r.Body).Decode(&data) + if err != nil { + fmt.Printf("Failed to decode json: %s", err) - // Register the account with the server - acc := Account{Name: data.Name} - acc, err := s.accountant.RegisterAccount(acc) - - // Set up the response - var response = RegisterResponse{ - Success: false, - } - - // If we didn't fail, respond with the account ID string - if err == nil { - response.Success = true - response.Id = acc.id.String() - } else { response.Error = err.Error() + } else { + // log the data sent + fmt.Printf("\t%v\n", data) + + // Register the account with the server + acc := accounts.Account{Name: data.Name} + acc, err := s.accountant.RegisterAccount(acc) + + // If we didn't fail, respond with the account ID string + if err == nil { + response.Success = true + response.Id = acc.Id.String() + } else { + response.Error = err.Error() + } } // Be a good citizen and set the header for the return diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 1983770..6daecbd 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -12,7 +12,7 @@ func TestHandleStatus(t *testing.T) { request, _ := http.NewRequest(http.MethodGet, "/status", nil) response := httptest.NewRecorder() - s := NewServer(8080) + s := NewServer() s.Initialise() s.HandleStatus(response, request) @@ -35,7 +35,7 @@ func TestHandleRegister(t *testing.T) { request, _ := http.NewRequest(http.MethodPost, "/register", bytes.NewReader(b)) response := httptest.NewRecorder() - s := NewServer(8080) + s := NewServer() s.Initialise() s.HandleRegister(response, request) diff --git a/pkg/server/server.go b/pkg/server/server.go index f1024e4..8e581e5 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -6,37 +6,84 @@ import ( "net/http" "github.com/gorilla/mux" + "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" ) +const ( + // PersistentData will allow the server to load and save it's state + PersistentData = iota + + // EphemeralData will let the server neither load or save out any of it's data + EphemeralData +) + // Server contains the relevant data to run a game server type Server struct { port int - accountant *Accountant + accountant *accounts.Accountant world *game.World router *mux.Router + + persistence int } -// NewServer sets up a new server -func NewServer(port int) *Server { - return &Server{ - port: port, - accountant: NewAccountant(), - world: game.NewWorld(), +// ServerOption defines a server creation option +type ServerOption func(s *Server) + +// OptionPort sets the server port for hosting +func OptionPort(port int) ServerOption { + return func(s *Server) { + s.port = port } } +// OptionPersistentData sets the server data to be persistent +func OptionPersistentData() ServerOption { + return func(s *Server) { + s.persistence = PersistentData + } +} + +// NewServer sets up a new server +func NewServer(opts ...ServerOption) *Server { + + // Set up the default server + s := &Server{ + port: 8080, + accountant: accounts.NewAccountant(), + world: game.NewWorld(), + persistence: EphemeralData, + } + + // Apply all options + for _, o := range opts { + o(s) + } + + return s +} + // Initialise sets up internal state ready to serve -func (s *Server) Initialise() { +func (s *Server) Initialise() error { // Set up the world s.world = game.NewWorld() fmt.Printf("World created\n\t%+v\n", s.world) + // Load the accounts if requested + if s.persistence == PersistentData { + if err := s.accountant.Load(); err != nil { + return err + } + } + // Create a new router s.SetUpRouter() fmt.Printf("Routes Created\n") + + return nil } // Run executes the server @@ -47,3 +94,15 @@ func (s *Server) Run() { log.Fatal(err) } } + +// Close closes up the server +func (s *Server) Close() error { + + // Save the accounts if requested + if s.persistence == PersistentData { + if err := s.accountant.Save(); err != nil { + return err + } + } + return nil +} diff --git a/script/test.sh b/script/test.sh index 2f8d90b..6fb0aee 100755 --- a/script/test.sh +++ b/script/test.sh @@ -5,7 +5,7 @@ cd .. set -x # Test the build -go build -v ./... +go build -v . # Run unit tests go test -v ./... -cover From d104c904456b8c9d4edd53a1b5ccb20501569c77 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 19:48:43 +0100 Subject: [PATCH 035/495] Fix tests with a proper start-up and shutdown procedure with a sync --- pkg/server/router.go | 3 --- pkg/server/router_test.go | 4 ---- pkg/server/server.go | 26 +++++++++++++++++++++++++- script/test.sh | 15 +++++---------- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/pkg/server/router.go b/pkg/server/router.go index bb8fc78..842d542 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -5,14 +5,11 @@ import ( "fmt" "net/http" - "github.com/gorilla/mux" "github.com/mdiluz/rove/pkg/accounts" ) // NewRouter sets up the server mux func (s *Server) SetUpRouter() { - s.router = mux.NewRouter().StrictSlash(true) - // Set up the handlers s.router.HandleFunc("/status", s.HandleStatus) s.router.HandleFunc("/register", s.HandleRegister) diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 6daecbd..d92c4b1 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -13,8 +13,6 @@ func TestHandleStatus(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.Initialise() - s.HandleStatus(response, request) var status StatusResponse @@ -36,8 +34,6 @@ func TestHandleRegister(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.Initialise() - s.HandleRegister(response, request) var status RegisterResponse diff --git a/pkg/server/server.go b/pkg/server/server.go index 8e581e5..c667855 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1,9 +1,12 @@ package server import ( + "context" "fmt" "log" "net/http" + "sync" + "time" "github.com/gorilla/mux" "github.com/mdiluz/rove/pkg/accounts" @@ -25,9 +28,12 @@ type Server struct { accountant *accounts.Accountant world *game.World + server *http.Server router *mux.Router persistence int + + sync sync.WaitGroup } // ServerOption defines a server creation option @@ -50,12 +56,16 @@ func OptionPersistentData() ServerOption { // NewServer sets up a new server func NewServer(opts ...ServerOption) *Server { + router := mux.NewRouter().StrictSlash(true) + // Set up the default server s := &Server{ port: 8080, accountant: accounts.NewAccountant(), world: game.NewWorld(), persistence: EphemeralData, + router: router, + server: &http.Server{Addr: ":8080", Handler: router}, } // Apply all options @@ -83,20 +93,34 @@ func (s *Server) Initialise() error { s.SetUpRouter() fmt.Printf("Routes Created\n") + // Add to our sync + s.sync.Add(1) + return nil } // Run executes the server func (s *Server) Run() { + defer s.sync.Done() + // Listen and serve the http requests fmt.Println("Serving HTTP") - if err := http.ListenAndServe(fmt.Sprintf(":%d", s.port), s.router); err != nil { + if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } } // Close closes up the server func (s *Server) Close() error { + // Try and shut down the http server + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := s.server.Shutdown(ctx); err != nil { + return err + } + + // Wait until the server is shut down + s.sync.Wait() // Save the accounts if requested if s.persistence == PersistentData { diff --git a/script/test.sh b/script/test.sh index 6fb0aee..8bd2620 100755 --- a/script/test.sh +++ b/script/test.sh @@ -4,18 +4,13 @@ cd "$(dirname "$0")" cd .. set -x -# Test the build -go build -v . - -# Run unit tests -go test -v ./... -cover - -# Verify docker build -docker build . - -# Run the integration tests with docker-compose +# Build and start the service docker-compose up --build --detach + +# Run tests, including integration tests go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out + +# Take down the service docker-compose down # Convert the coverage data to html From 0c56cbd3e02c7de4102857b5b42cb52d5a95f7b8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 31 May 2020 19:54:01 +0100 Subject: [PATCH 036/495] Add server lifecycle tests --- pkg/server/server_test.go | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 pkg/server/server_test.go diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go new file mode 100644 index 0000000..619ebbe --- /dev/null +++ b/pkg/server/server_test.go @@ -0,0 +1,58 @@ +package server + +import ( + "testing" +) + +func TestNewServer(t *testing.T) { + server := NewServer() + if server == nil { + t.Error("Failed to create server") + } +} + +func TestNewServer_OptionPort(t *testing.T) { + server := NewServer(OptionPort(1234)) + if server == nil { + t.Error("Failed to create server") + } else if server.port != 1234 { + t.Error("Failed to set server port") + } +} + +func TestNewServer_OptionPersistentData(t *testing.T) { + server := NewServer(OptionPersistentData()) + if server == nil { + t.Error("Failed to create server") + } else if server.persistence != PersistentData { + t.Error("Failed to set server persistent data") + } +} + +func TestServer_Run(t *testing.T) { + server := NewServer() + if server == nil { + t.Error("Failed to create server") + } else if err := server.Initialise(); err != nil { + t.Error(err) + } + go server.Run() + + if err := server.Close(); err != nil { + t.Error(err) + } +} + +func TestServer_RunPersistentData(t *testing.T) { + server := NewServer(OptionPersistentData()) + if server == nil { + t.Error("Failed to create server") + } else if err := server.Initialise(); err != nil { + t.Error(err) + } + go server.Run() + + if err := server.Close(); err != nil { + t.Error(err) + } +} From 579bf31a1a17f9094f87a2f6632e5a3ed5696735 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 1 Jun 2020 17:49:30 +0100 Subject: [PATCH 037/495] Add go mod download to test file for blank setup --- script/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/script/test.sh b/script/test.sh index 8bd2620..c903697 100755 --- a/script/test.sh +++ b/script/test.sh @@ -8,6 +8,7 @@ set -x docker-compose up --build --detach # Run tests, including integration tests +go mod download go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out # Take down the service From 2e7b2d2928f5543e72b9d243647991ed58cb24fc Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 1 Jun 2020 17:49:45 +0100 Subject: [PATCH 038/495] Map the host 80 to the internal port --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index b166993..39f20f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,4 +3,4 @@ services: rove-server: build: . ports: - - "8080:8080" \ No newline at end of file + - "80:8080" \ No newline at end of file From 07c5b9cf5ad3202983721c2a2a5fab5c68c62769 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 1 Jun 2020 18:10:25 +0100 Subject: [PATCH 039/495] Fix passing port on command line --- docker-compose.yml | 3 ++- main.go | 2 ++ pkg/server/server.go | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 39f20f1..d324eea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,4 +3,5 @@ services: rove-server: build: . ports: - - "80:8080" \ No newline at end of file + - "80:80" + command: ./rove-server --port 80 \ No newline at end of file diff --git a/main.go b/main.go index 2729d78..ac03668 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,8 @@ import ( var port = flag.Int("port", 8080, "The port to host on") func main() { + flag.Parse() + s := server.NewServer( server.OptionPort(*port), server.OptionPersistentData()) diff --git a/pkg/server/server.go b/pkg/server/server.go index c667855..7e07149 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -65,7 +65,6 @@ func NewServer(opts ...ServerOption) *Server { world: game.NewWorld(), persistence: EphemeralData, router: router, - server: &http.Server{Addr: ":8080", Handler: router}, } // Apply all options @@ -73,6 +72,9 @@ func NewServer(opts ...ServerOption) *Server { o(s) } + // Set up the server object + s.server = &http.Server{Addr: fmt.Sprintf(":%d", s.port), Handler: router} + return s } @@ -104,7 +106,7 @@ func (s *Server) Run() { defer s.sync.Done() // Listen and serve the http requests - fmt.Println("Serving HTTP") + fmt.Printf("Serving HTTP on port %d\n", s.port) if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } From e3b065ff8901ca30cfffb381fa19a04b520cf4fe Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 15:54:22 +0100 Subject: [PATCH 040/495] Add version information --- Dockerfile | 5 +++-- main.go | 7 +++++++ pkg/server/router.go | 31 +++++++++++++++++++++++++++---- pkg/server/router_test.go | 4 ++++ pkg/version/version.go | 3 +++ 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 pkg/version/version.go diff --git a/Dockerfile b/Dockerfile index 2f52a78..0a7bee4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove-server . +RUN go build -o rove-server -ldflags="-X version.Version=$(git describe --always --long --dirty)" . + +CMD [ "./rove-server" ] -CMD "./rove-server" \ No newline at end of file diff --git a/main.go b/main.go index ac03668..fabe2ce 100644 --- a/main.go +++ b/main.go @@ -8,13 +8,20 @@ import ( "syscall" "github.com/mdiluz/rove/pkg/server" + "github.com/mdiluz/rove/pkg/version" ) +var ver = flag.Bool("version", false, "Display version number") var port = flag.Int("port", 8080, "The port to host on") func main() { flag.Parse() + if *ver { + fmt.Println(version.Version) + os.Exit(0) + } + s := server.NewServer( server.OptionPort(*port), server.OptionPersistentData()) diff --git a/pkg/server/router.go b/pkg/server/router.go index 842d542..1ae2008 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -6,18 +6,40 @@ import ( "net/http" "github.com/mdiluz/rove/pkg/accounts" + "github.com/mdiluz/rove/pkg/version" ) +// Route defines the information for a single path->function route +type Route struct { + path string + handler func(http.ResponseWriter, *http.Request) +} + // NewRouter sets up the server mux func (s *Server) SetUpRouter() { + + // Array of all our routes + var routes = []Route{ + { + path: "/status", + handler: s.HandleStatus, + }, + { + path: "/register", + handler: s.HandleRegister, + }, + } + // Set up the handlers - s.router.HandleFunc("/status", s.HandleStatus) - s.router.HandleFunc("/register", s.HandleRegister) + for _, route := range routes { + s.router.HandleFunc(route.path, route.handler) + } } // StatusResponse is a struct that contains information on the status of the server type StatusResponse struct { - Ready bool `json:"ready"` + Ready bool `json:"ready"` + Version string `json:"version"` } // HandleStatus handles HTTP requests to the /status endpoint @@ -31,7 +53,8 @@ func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { } var response = StatusResponse{ - Ready: true, + Ready: true, + Version: version.Version, } // Be a good citizen and set the header for the return diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index d92c4b1..09a5c1d 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -21,6 +21,10 @@ func TestHandleStatus(t *testing.T) { if status.Ready != true { t.Errorf("got false for /status") } + + if len(status.Version) == 0 { + t.Errorf("got empty version info") + } } func TestHandleRegister(t *testing.T) { diff --git a/pkg/version/version.go b/pkg/version/version.go new file mode 100644 index 0000000..b8b26bb --- /dev/null +++ b/pkg/version/version.go @@ -0,0 +1,3 @@ +package version + +var Version = "undefined" From c085e56954a32ed428ee9a406fef877176e9c23a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 15:54:28 +0100 Subject: [PATCH 041/495] Fix port for tests --- pkg/rove/rove_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go index a78758d..54c2e2f 100644 --- a/pkg/rove/rove_test.go +++ b/pkg/rove/rove_test.go @@ -6,7 +6,7 @@ import ( "testing" ) -var serverUrl = "localhost:8080" +var serverUrl = "localhost:80" func TestStatus(t *testing.T) { conn := NewConnection(serverUrl) From 5033ec4e63623c8c29cf36105ae35e89d2beb48c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 16:10:45 +0100 Subject: [PATCH 042/495] Specify the persistence path using the command line --- main.go | 3 ++- pkg/accounts/accounts.go | 25 +++++++++++++++++-------- pkg/accounts/accounts_test.go | 9 +++++---- pkg/server/server.go | 10 +++++++--- pkg/server/server_test.go | 7 +++++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index fabe2ce..ccc2f93 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,7 @@ import ( var ver = flag.Bool("version", false, "Display version number") var port = flag.Int("port", 8080, "The port to host on") +var data = flag.String("data", "/tmp/", "Directory to store persistant data") func main() { flag.Parse() @@ -24,7 +25,7 @@ func main() { s := server.NewServer( server.OptionPort(*port), - server.OptionPersistentData()) + server.OptionPersistentData(*data)) fmt.Println("Initialising...") if err := s.Initialise(); err != nil { diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index efcf976..603effa 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -5,11 +5,12 @@ import ( "fmt" "io/ioutil" "os" + "path" "github.com/google/uuid" ) -const kDefaultSavePath = "/tmp/accounts.json" +const kAccountsFileName = "rove-accounts.json" // Account represents a registered user type Account struct { @@ -27,12 +28,15 @@ type accountantData struct { // Accountant manages a set of accounts type Accountant struct { - data accountantData + data accountantData + dataPath string } // NewAccountant creates a new accountant -func NewAccountant() *Accountant { - return &Accountant{} +func NewAccountant(dataPath string) *Accountant { + return &Accountant{ + dataPath: dataPath, + } } // RegisterAccount adds an account to the set of internal accounts @@ -56,16 +60,21 @@ func (a *Accountant) RegisterAccount(acc Account) (Account, error) { return acc, nil } +// path returns the full path to the data file +func (a Accountant) path() string { + return path.Join(a.dataPath, kAccountsFileName) +} + // Load will load the accountant from data func (a *Accountant) Load() error { // Don't load anything if the file doesn't exist - _, err := os.Stat(kDefaultSavePath) + _, err := os.Stat(a.path()) if os.IsNotExist(err) { - fmt.Printf("File %s didn't exist, loading with fresh accounts data\n", kDefaultSavePath) + fmt.Printf("File %s didn't exist, loading with fresh accounts data\n", a.path()) return nil } - if b, err := ioutil.ReadFile(kDefaultSavePath); err != nil { + if b, err := ioutil.ReadFile(a.path()); err != nil { return err } else if err := json.Unmarshal(b, &a.data); err != nil { return err @@ -78,7 +87,7 @@ func (a *Accountant) Save() error { if b, err := json.Marshal(a.data); err != nil { return err } else { - if err := ioutil.WriteFile(kDefaultSavePath, b, os.ModePerm); err != nil { + if err := ioutil.WriteFile(a.path(), b, os.ModePerm); err != nil { return err } } diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 6d319a2..99b0b2d 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -1,12 +1,13 @@ package accounts import ( + "os" "testing" ) func TestNewAccountant(t *testing.T) { // Very basic verify here for now - accountant := NewAccountant() + accountant := NewAccountant(os.TempDir()) if accountant == nil { t.Error("Failed to create accountant") } @@ -14,7 +15,7 @@ func TestNewAccountant(t *testing.T) { func TestAccountant_RegisterAccount(t *testing.T) { - accountant := NewAccountant() + accountant := NewAccountant(os.TempDir()) // Start by making two accounts @@ -49,7 +50,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } func TestAccountant_LoadSave(t *testing.T) { - accountant := NewAccountant() + accountant := NewAccountant(os.TempDir()) if len(accountant.data.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } @@ -73,7 +74,7 @@ func TestAccountant_LoadSave(t *testing.T) { } // Re-create the accountant - accountant = NewAccountant() + accountant = NewAccountant(os.TempDir()) if len(accountant.data.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } diff --git a/pkg/server/server.go b/pkg/server/server.go index 7e07149..9b274bd 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -31,7 +31,8 @@ type Server struct { server *http.Server router *mux.Router - persistence int + persistence int + persistenceLocation string sync sync.WaitGroup } @@ -47,9 +48,10 @@ func OptionPort(port int) ServerOption { } // OptionPersistentData sets the server data to be persistent -func OptionPersistentData() ServerOption { +func OptionPersistentData(loc string) ServerOption { return func(s *Server) { s.persistence = PersistentData + s.persistenceLocation = loc } } @@ -61,7 +63,6 @@ func NewServer(opts ...ServerOption) *Server { // Set up the default server s := &Server{ port: 8080, - accountant: accounts.NewAccountant(), world: game.NewWorld(), persistence: EphemeralData, router: router, @@ -75,6 +76,9 @@ func NewServer(opts ...ServerOption) *Server { // Set up the server object s.server = &http.Server{Addr: fmt.Sprintf(":%d", s.port), Handler: router} + // Create the accountant + s.accountant = accounts.NewAccountant(s.persistenceLocation) + return s } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 619ebbe..f4598d7 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1,6 +1,7 @@ package server import ( + "os" "testing" ) @@ -21,11 +22,13 @@ func TestNewServer_OptionPort(t *testing.T) { } func TestNewServer_OptionPersistentData(t *testing.T) { - server := NewServer(OptionPersistentData()) + server := NewServer(OptionPersistentData(os.TempDir())) if server == nil { t.Error("Failed to create server") } else if server.persistence != PersistentData { t.Error("Failed to set server persistent data") + } else if server.persistenceLocation != os.TempDir() { + t.Error("Failed to set server persistent data path") } } @@ -44,7 +47,7 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { - server := NewServer(OptionPersistentData()) + server := NewServer(OptionPersistentData(os.TempDir())) if server == nil { t.Error("Failed to create server") } else if err := server.Initialise(); err != nil { From 5691c10b4c1855737b93dc5bf943b6171fd0d032 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 16:44:43 +0100 Subject: [PATCH 043/495] Fix the incoming name param to /register --- pkg/server/router.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/server/router.go b/pkg/server/router.go index 1ae2008..f3cdba7 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -67,7 +67,7 @@ func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { // RegisterData describes the data to send when registering type RegisterData struct { - Name string `json:"id"` + Name string `json:"name"` } // RegisterResponse describes the response to a register request @@ -100,6 +100,8 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { fmt.Printf("Failed to decode json: %s", err) response.Error = err.Error() + } else if len(data.Name) == 0 { + response.Error = "Cannot register empty name" } else { // log the data sent fmt.Printf("\t%v\n", data) From 552c645a53cb6dd61064525c50afb9f1e0757990 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 16:45:06 +0100 Subject: [PATCH 044/495] Fix some logging output --- pkg/server/router.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/server/router.go b/pkg/server/router.go index f3cdba7..64a2dfb 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -97,14 +97,14 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { var data RegisterData err := json.NewDecoder(r.Body).Decode(&data) if err != nil { - fmt.Printf("Failed to decode json: %s", err) + fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() } else if len(data.Name) == 0 { response.Error = "Cannot register empty name" } else { // log the data sent - fmt.Printf("\t%v\n", data) + fmt.Printf("\tdata: %+v\n", data) // Register the account with the server acc := accounts.Account{Name: data.Name} From 36201858978ad9d2bea4cdc226a8980f2c97079a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 16:45:24 +0100 Subject: [PATCH 045/495] Simplify the response and account data info --- pkg/server/router.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/server/router.go b/pkg/server/router.go index 64a2dfb..ebf1951 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -65,6 +65,17 @@ func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(response) } +// BasicResponse describes the minimum dataset for a response +type BasicResponse struct { + Success bool `json:"success"` + Error string `json:"error"` +} + +// BasicAccountData describes the data to be sent for an account specific post +type BasicAccountData struct { + Id string `json:"id"` +} + // RegisterData describes the data to send when registering type RegisterData struct { Name string `json:"name"` @@ -72,10 +83,9 @@ type RegisterData struct { // RegisterResponse describes the response to a register request type RegisterResponse struct { - Id string `json:"id"` + BasicResponse - Success bool `json:"success"` - Error string `json:"error"` + Id string `json:"id"` } // HandleRegister handles HTTP requests to the /register endpoint @@ -84,7 +94,9 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { // Set up the response var response = RegisterResponse{ - Success: false, + BasicResponse: BasicResponse{ + Success: false, + }, } // Verify we're hit with a get request From 0a1f7a37c433b1df40a936025c986dda57d3aa0b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 18:00:27 +0100 Subject: [PATCH 046/495] Add geom file to describe world positions --- pkg/game/geom.go | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 pkg/game/geom.go diff --git a/pkg/game/geom.go b/pkg/game/geom.go new file mode 100644 index 0000000..b41a8de --- /dev/null +++ b/pkg/game/geom.go @@ -0,0 +1,6 @@ +package game + +type Position struct { + X int `json:"x"` + Y int `json:"y"` +} From 50c970fea2d17d719bf5bc9966c994033aa207ec Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 17:44:39 +0100 Subject: [PATCH 047/495] Add /spawn command to let an account spawn it's primary instance --- pkg/accounts/accounts.go | 30 ++++++++++++--- pkg/accounts/accounts_test.go | 29 +++++++++++++- pkg/game/world.go | 27 +++++++++++-- pkg/game/world_test.go | 2 + pkg/rove/rove_test.go | 2 + pkg/server/router.go | 72 +++++++++++++++++++++++++++++++++++ 6 files changed, 151 insertions(+), 11 deletions(-) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 603effa..ae72732 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -17,13 +17,16 @@ type Account struct { // Name simply describes the account and must be unique Name string `json:"name"` - // id represents a unique ID per account and is set one registered + // Id represents a unique ID per account and is set one registered Id uuid.UUID `json:"id"` + + // Primary represents the primary instance that this account owns + Primary uuid.UUID `json:"primary"` } // Represents the accountant data to store type accountantData struct { - Accounts []Account `json:"accounts"` + Accounts map[uuid.UUID]Account `json:"accounts"` } // Accountant manages a set of accounts @@ -36,6 +39,9 @@ type Accountant struct { func NewAccountant(dataPath string) *Accountant { return &Accountant{ dataPath: dataPath, + data: accountantData{ + Accounts: make(map[uuid.UUID]Account), + }, } } @@ -54,8 +60,8 @@ func (a *Accountant) RegisterAccount(acc Account) (Account, error) { } } - // Simply add the account to the list - a.data.Accounts = append(a.data.Accounts, acc) + // Simply add the account to the map + a.data.Accounts[acc.Id] = acc return acc, nil } @@ -84,7 +90,7 @@ func (a *Accountant) Load() error { // Save will save the accountant data out func (a *Accountant) Save() error { - if b, err := json.Marshal(a.data); err != nil { + if b, err := json.MarshalIndent(a.data, "", "\t"); err != nil { return err } else { if err := ioutil.WriteFile(a.path(), b, os.ModePerm); err != nil { @@ -93,3 +99,17 @@ func (a *Accountant) Save() error { } return nil } + +// AssignPrimary assigns primary ownership of an instance to an account +func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error { + + // Find the account matching the ID + if this, ok := a.data.Accounts[account]; ok { + this.Primary = instance + a.data.Accounts[account] = this + } else { + return fmt.Errorf("no account found for id: %s", account) + } + + return nil +} diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 99b0b2d..9f77f57 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -3,6 +3,8 @@ package accounts import ( "os" "testing" + + "github.com/google/uuid" ) func TestNewAccountant(t *testing.T) { @@ -64,7 +66,7 @@ func TestAccountant_LoadSave(t *testing.T) { if len(accountant.data.Accounts) != 1 { t.Error("No new account made") - } else if accountant.data.Accounts[0].Name != name { + } else if accountant.data.Accounts[a.Id].Name != name { t.Error("New account created with wrong name") } @@ -87,7 +89,30 @@ func TestAccountant_LoadSave(t *testing.T) { // Verify we have the same account again if len(accountant.data.Accounts) != 1 { t.Error("No account after load") - } else if accountant.data.Accounts[0].Name != name { + } else if accountant.data.Accounts[a.Id].Name != name { t.Error("New account created with wrong name") } } + +func TestAccountant_AssignPrimary(t *testing.T) { + accountant := NewAccountant(os.TempDir()) + if len(accountant.data.Accounts) != 0 { + t.Error("New accountant created with non-zero account number") + } + + name := "one" + a := Account{Name: name} + a, err := accountant.RegisterAccount(a) + if err != nil { + t.Error(err) + } + + inst := uuid.New() + + err = accountant.AssignPrimary(a.Id, inst) + if err != nil { + t.Error("Failed to set primary for created account") + } else if accountant.data.Accounts[a.Id].Primary != inst { + t.Error("Primary for assigned account is incorrect") + } +} diff --git a/pkg/game/world.go b/pkg/game/world.go index f03d99c..1209e71 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -1,20 +1,30 @@ package game -import "github.com/google/uuid" +import ( + "fmt" + + "github.com/google/uuid" +) // World describes a self contained universe and everything in it type World struct { - instances []Instance + instances map[uuid.UUID]Instance } // Instance describes a single entity or instance of an entity in the world type Instance struct { + // id is a unique ID for this instance id uuid.UUID + + // pos represents where this instance is in the world + pos Position } // NewWorld creates a new world object func NewWorld() *World { - return &World{} + return &World{ + instances: make(map[uuid.UUID]Instance), + } } // Adds an instance to the game @@ -27,7 +37,16 @@ func (w *World) CreateInstance() uuid.UUID { } // Append the instance to the list - w.instances = append(w.instances, instance) + w.instances[id] = instance return id } + +// GetPosition returns the position of a given instance +func (w World) GetPosition(id uuid.UUID) (Position, error) { + if i, ok := w.instances[id]; ok { + return i.pos, nil + } else { + return Position{}, fmt.Errorf("no instance matching id") + } +} diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 504b8ee..6614257 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -20,5 +20,7 @@ func TestWorld_CreateInstance(t *testing.T) { // Basic duplicate check if a == b { t.Errorf("Created identical instances") + } else if len(world.instances) != 2 { + t.Errorf("Incorrect number of instances created") } } diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go index 54c2e2f..35cd8c3 100644 --- a/pkg/rove/rove_test.go +++ b/pkg/rove/rove_test.go @@ -15,6 +15,8 @@ func TestStatus(t *testing.T) { t.Errorf("Status returned error: %s", err) } else if !status.Ready { t.Error("Server did not return that it was ready") + } else if len(status.Version) == 0 { + t.Error("Server returned blank version") } } diff --git a/pkg/server/router.go b/pkg/server/router.go index ebf1951..370f684 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -5,7 +5,9 @@ import ( "fmt" "net/http" + "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" + "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/version" ) @@ -28,6 +30,10 @@ func (s *Server) SetUpRouter() { path: "/register", handler: s.HandleRegister, }, + { + path: "/spawn", + handler: s.HandleSpawn, + }, } // Set up the handlers @@ -138,3 +144,69 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { // Reply with the current status json.NewEncoder(w).Encode(response) } + +// SpawnData is the data to be sent for the spawn command +type SpawnData struct { + BasicAccountData +} + +// SpawnResponse is the data to respond with on a spawn command +type SpawnResponse struct { + BasicResponse + + Position game.Position `json:"position"` +} + +// HandleSpawn will spawn the player entity for the associated account +func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Set up the response + var response = SpawnResponse{ + BasicResponse: BasicResponse{ + Success: false, + }, + } + + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + // Pull out the incoming info + var data SpawnData + err := json.NewDecoder(r.Body).Decode(&data) + if err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + + response.Error = err.Error() + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = "Provided account ID was invalid" + } else { + // log the data sent + fmt.Printf("\tdata: %v\n", data) + + // Create a new instance + inst := s.world.CreateInstance() + if pos, err := s.world.GetPosition(inst); err != nil { + response.Error = fmt.Sprint("No position found for created instance") + } else { + if err := s.accountant.AssignPrimary(id, inst); err != nil { + response.Error = err.Error() + } else { + response.Success = true + response.Position = pos + } + } + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Reply with the current status + json.NewEncoder(w).Encode(response) +} From 68d117e0d815d7bebb9cae3a8147edc70578e6f2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 17:51:54 +0100 Subject: [PATCH 048/495] Serialise the World as well --- pkg/accounts/accounts.go | 19 ++++++------ pkg/accounts/accounts_test.go | 16 +++++------ pkg/game/world.go | 54 +++++++++++++++++++++++++++++++---- pkg/game/world_test.go | 7 +++-- pkg/server/server.go | 11 ++++--- 5 files changed, 76 insertions(+), 31 deletions(-) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index ae72732..578271f 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -26,12 +26,11 @@ type Account struct { // Represents the accountant data to store type accountantData struct { - Accounts map[uuid.UUID]Account `json:"accounts"` } // Accountant manages a set of accounts type Accountant struct { - data accountantData + Accounts map[uuid.UUID]Account `json:"accounts"` dataPath string } @@ -39,9 +38,7 @@ type Accountant struct { func NewAccountant(dataPath string) *Accountant { return &Accountant{ dataPath: dataPath, - data: accountantData{ - Accounts: make(map[uuid.UUID]Account), - }, + Accounts: make(map[uuid.UUID]Account), } } @@ -52,7 +49,7 @@ func (a *Accountant) RegisterAccount(acc Account) (Account, error) { acc.Id = uuid.New() // Verify this acount isn't already registered - for _, a := range a.data.Accounts { + for _, a := range a.Accounts { if a.Name == acc.Name { return Account{}, fmt.Errorf("Account name already registered") } else if a.Id == acc.Id { @@ -61,7 +58,7 @@ func (a *Accountant) RegisterAccount(acc Account) (Account, error) { } // Simply add the account to the map - a.data.Accounts[acc.Id] = acc + a.Accounts[acc.Id] = acc return acc, nil } @@ -82,7 +79,7 @@ func (a *Accountant) Load() error { if b, err := ioutil.ReadFile(a.path()); err != nil { return err - } else if err := json.Unmarshal(b, &a.data); err != nil { + } else if err := json.Unmarshal(b, &a); err != nil { return err } return nil @@ -90,7 +87,7 @@ func (a *Accountant) Load() error { // Save will save the accountant data out func (a *Accountant) Save() error { - if b, err := json.MarshalIndent(a.data, "", "\t"); err != nil { + if b, err := json.MarshalIndent(a, "", "\t"); err != nil { return err } else { if err := ioutil.WriteFile(a.path(), b, os.ModePerm); err != nil { @@ -104,9 +101,9 @@ func (a *Accountant) Save() error { func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error { // Find the account matching the ID - if this, ok := a.data.Accounts[account]; ok { + if this, ok := a.Accounts[account]; ok { this.Primary = instance - a.data.Accounts[account] = this + a.Accounts[account] = this } else { return fmt.Errorf("no account found for id: %s", account) } diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 9f77f57..0b5da87 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -53,7 +53,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { func TestAccountant_LoadSave(t *testing.T) { accountant := NewAccountant(os.TempDir()) - if len(accountant.data.Accounts) != 0 { + if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } @@ -64,9 +64,9 @@ func TestAccountant_LoadSave(t *testing.T) { t.Error(err) } - if len(accountant.data.Accounts) != 1 { + if len(accountant.Accounts) != 1 { t.Error("No new account made") - } else if accountant.data.Accounts[a.Id].Name != name { + } else if accountant.Accounts[a.Id].Name != name { t.Error("New account created with wrong name") } @@ -77,7 +77,7 @@ func TestAccountant_LoadSave(t *testing.T) { // Re-create the accountant accountant = NewAccountant(os.TempDir()) - if len(accountant.data.Accounts) != 0 { + if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } @@ -87,16 +87,16 @@ func TestAccountant_LoadSave(t *testing.T) { } // Verify we have the same account again - if len(accountant.data.Accounts) != 1 { + if len(accountant.Accounts) != 1 { t.Error("No account after load") - } else if accountant.data.Accounts[a.Id].Name != name { + } else if accountant.Accounts[a.Id].Name != name { t.Error("New account created with wrong name") } } func TestAccountant_AssignPrimary(t *testing.T) { accountant := NewAccountant(os.TempDir()) - if len(accountant.data.Accounts) != 0 { + if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } @@ -112,7 +112,7 @@ func TestAccountant_AssignPrimary(t *testing.T) { err = accountant.AssignPrimary(a.Id, inst) if err != nil { t.Error("Failed to set primary for created account") - } else if accountant.data.Accounts[a.Id].Primary != inst { + } else if accountant.Accounts[a.Id].Primary != inst { t.Error("Primary for assigned account is incorrect") } } diff --git a/pkg/game/world.go b/pkg/game/world.go index 1209e71..3138953 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -1,14 +1,21 @@ package game import ( + "encoding/json" "fmt" + "io/ioutil" + "os" + "path" "github.com/google/uuid" ) // World describes a self contained universe and everything in it type World struct { - instances map[uuid.UUID]Instance + Instances map[uuid.UUID]Instance `json:"instances"` + + // dataPath is the location for the data to be stored + dataPath string } // Instance describes a single entity or instance of an entity in the world @@ -20,13 +27,50 @@ type Instance struct { pos Position } +const kWorldFileName = "rove-world.json" + // NewWorld creates a new world object -func NewWorld() *World { +func NewWorld(data string) *World { return &World{ - instances: make(map[uuid.UUID]Instance), + Instances: make(map[uuid.UUID]Instance), + dataPath: data, } } +// path returns the full path to the data file +func (w *World) path() string { + return path.Join(w.dataPath, kWorldFileName) +} + +// Load will load the accountant from data +func (w *World) Load() error { + // Don't load anything if the file doesn't exist + _, err := os.Stat(w.path()) + if os.IsNotExist(err) { + fmt.Printf("File %s didn't exist, loading with fresh world data\n", w.path()) + return nil + } + + if b, err := ioutil.ReadFile(w.path()); err != nil { + return err + } else if err := json.Unmarshal(b, &w); err != nil { + return err + } + return nil +} + +// Save will save the accountant data out +func (w *World) Save() error { + if b, err := json.MarshalIndent(w, "", "\t"); err != nil { + return err + } else { + if err := ioutil.WriteFile(w.path(), b, os.ModePerm); err != nil { + return err + } + } + return nil +} + // Adds an instance to the game func (w *World) CreateInstance() uuid.UUID { id := uuid.New() @@ -37,14 +81,14 @@ func (w *World) CreateInstance() uuid.UUID { } // Append the instance to the list - w.instances[id] = instance + w.Instances[id] = instance return id } // GetPosition returns the position of a given instance func (w World) GetPosition(id uuid.UUID) (Position, error) { - if i, ok := w.instances[id]; ok { + if i, ok := w.Instances[id]; ok { return i.pos, nil } else { return Position{}, fmt.Errorf("no instance matching id") diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 6614257..0bfc070 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -1,26 +1,27 @@ package game import ( + "os" "testing" ) func TestNewWorld(t *testing.T) { // Very basic for now, nothing to verify - world := NewWorld() + world := NewWorld(os.TempDir()) if world == nil { t.Error("Failed to create world") } } func TestWorld_CreateInstance(t *testing.T) { - world := NewWorld() + world := NewWorld(os.TempDir()) a := world.CreateInstance() b := world.CreateInstance() // Basic duplicate check if a == b { t.Errorf("Created identical instances") - } else if len(world.instances) != 2 { + } else if len(world.Instances) != 2 { t.Errorf("Incorrect number of instances created") } } diff --git a/pkg/server/server.go b/pkg/server/server.go index 9b274bd..3ffaee4 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -63,7 +63,6 @@ func NewServer(opts ...ServerOption) *Server { // Set up the default server s := &Server{ port: 8080, - world: game.NewWorld(), persistence: EphemeralData, router: router, } @@ -78,21 +77,22 @@ func NewServer(opts ...ServerOption) *Server { // Create the accountant s.accountant = accounts.NewAccountant(s.persistenceLocation) + s.world = game.NewWorld(s.persistenceLocation) return s } // Initialise sets up internal state ready to serve func (s *Server) Initialise() error { - // Set up the world - s.world = game.NewWorld() - fmt.Printf("World created\n\t%+v\n", s.world) // Load the accounts if requested if s.persistence == PersistentData { if err := s.accountant.Load(); err != nil { return err } + if err := s.world.Load(); err != nil { + return err + } } // Create a new router @@ -133,6 +133,9 @@ func (s *Server) Close() error { if err := s.accountant.Save(); err != nil { return err } + if err := s.world.Save(); err != nil { + return err + } } return nil } From b152861222f5e90390d700163d4bef64357dcfb0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 17:59:33 +0100 Subject: [PATCH 049/495] Add test for /spawn Required small refactor --- go.mod | 1 + go.sum | 10 ++++++++++ pkg/accounts/accounts.go | 4 ++-- pkg/accounts/accounts_test.go | 14 +++++--------- pkg/server/router.go | 4 +--- pkg/server/router_test.go | 24 ++++++++++++++++++++++++ 6 files changed, 43 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 25e663c..80da8b7 100644 --- a/go.mod +++ b/go.mod @@ -5,4 +5,5 @@ go 1.14 require ( github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 + github.com/stretchr/testify v1.6.0 ) diff --git a/go.sum b/go.sum index ee6c4bc..c150150 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,14 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 578271f..1ce4ec7 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -43,7 +43,7 @@ func NewAccountant(dataPath string) *Accountant { } // RegisterAccount adds an account to the set of internal accounts -func (a *Accountant) RegisterAccount(acc Account) (Account, error) { +func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Set the account ID to a new UUID acc.Id = uuid.New() @@ -60,7 +60,7 @@ func (a *Accountant) RegisterAccount(acc Account) (Account, error) { // Simply add the account to the map a.Accounts[acc.Id] = acc - return acc, nil + return } // path returns the full path to the data file diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 0b5da87..275cde3 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -22,8 +22,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { // Start by making two accounts namea := "one" - a := Account{Name: namea} - acca, err := accountant.RegisterAccount(a) + acca, err := accountant.RegisterAccount(namea) if err != nil { t.Error(err) } else if acca.Name != namea { @@ -31,8 +30,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } nameb := "two" - b := Account{Name: nameb} - accb, err := accountant.RegisterAccount(b) + accb, err := accountant.RegisterAccount(nameb) if err != nil { t.Error(err) } else if accb.Name != nameb { @@ -45,7 +43,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } // Verify another request gets rejected - _, err = accountant.RegisterAccount(a) + _, err = accountant.RegisterAccount(namea) if err == nil { t.Error("Duplicate account name did not produce error") } @@ -58,8 +56,7 @@ func TestAccountant_LoadSave(t *testing.T) { } name := "one" - a := Account{Name: name} - a, err := accountant.RegisterAccount(a) + a, err := accountant.RegisterAccount(name) if err != nil { t.Error(err) } @@ -101,8 +98,7 @@ func TestAccountant_AssignPrimary(t *testing.T) { } name := "one" - a := Account{Name: name} - a, err := accountant.RegisterAccount(a) + a, err := accountant.RegisterAccount(name) if err != nil { t.Error(err) } diff --git a/pkg/server/router.go b/pkg/server/router.go index 370f684..ff297e1 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -6,7 +6,6 @@ import ( "net/http" "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/version" ) @@ -125,8 +124,7 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { fmt.Printf("\tdata: %+v\n", data) // Register the account with the server - acc := accounts.Account{Name: data.Name} - acc, err := s.accountant.RegisterAccount(acc) + acc, err := s.accountant.RegisterAccount(data.Name) // If we didn't fail, respond with the account ID string if err == nil { diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 09a5c1d..21440c5 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -6,6 +6,8 @@ import ( "net/http" "net/http/httptest" "testing" + + "github.com/stretchr/testify/assert" ) func TestHandleStatus(t *testing.T) { @@ -47,3 +49,25 @@ func TestHandleRegister(t *testing.T) { t.Errorf("got false for /register") } } + +func TestHandleSpawn(t *testing.T) { + s := NewServer() + a, err := s.accountant.RegisterAccount("test") + assert.NoError(t, err, "Error registering account") + data := SpawnData{BasicAccountData: BasicAccountData{Id: a.Id.String()}} + + b, err := json.Marshal(data) + assert.NoError(t, err, "Error marshalling data") + + request, _ := http.NewRequest(http.MethodPost, "/spawn", bytes.NewReader(b)) + response := httptest.NewRecorder() + + s.HandleSpawn(response, request) + + var status SpawnResponse + json.NewDecoder(response.Body).Decode(&status) + + if status.Success != true { + t.Errorf("got false for /spawn") + } +} From 42534ac54549ea68872f251a86041e60b62c22ee Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 18:01:12 +0100 Subject: [PATCH 050/495] Add a Proof Of Concept doc --- docs/poc.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 docs/poc.md diff --git a/docs/poc.md b/docs/poc.md new file mode 100644 index 0000000..1e94bd4 --- /dev/null +++ b/docs/poc.md @@ -0,0 +1,28 @@ +Proof Of Concept +================ + +For a proof of concept we'll implement a very small subset of the final features + +### Core Features + +* Create an account +* Control an entity in a 2D map +* Query for what the entity can see +* Persistent accounts and world +* Multiple users + +### Stretch goals + +* Rover inventory +* Rover internals +* Basic time mechanics +* Basic survival mechanics + +### Key missing features + +* No token security (very hackable) +* No time dilation effects +* No global coordinates +* No render of rover camera view +* No rover replacement mechanic +* No advanced app/interface From 4c7653083214d2ad77d4dd628cf21c450a3111e0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 18:06:34 +0100 Subject: [PATCH 051/495] Fix tests and actually use the account name --- pkg/accounts/accounts.go | 1 + pkg/accounts/accounts_test.go | 8 ++++---- pkg/rove/rove_test.go | 10 +++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 1ce4ec7..e975a08 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -47,6 +47,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Set the account ID to a new UUID acc.Id = uuid.New() + acc.Name = name // Verify this acount isn't already registered for _, a := range a.Accounts { diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 275cde3..bef693f 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -21,7 +21,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { // Start by making two accounts - namea := "one" + namea := uuid.New().String() acca, err := accountant.RegisterAccount(namea) if err != nil { t.Error(err) @@ -29,7 +29,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { t.Errorf("Missmatched account name after register, expected: %s, actual: %s", namea, acca.Name) } - nameb := "two" + nameb := uuid.New().String() accb, err := accountant.RegisterAccount(nameb) if err != nil { t.Error(err) @@ -55,7 +55,7 @@ func TestAccountant_LoadSave(t *testing.T) { t.Error("New accountant created with non-zero account number") } - name := "one" + name := uuid.New().String() a, err := accountant.RegisterAccount(name) if err != nil { t.Error(err) @@ -97,7 +97,7 @@ func TestAccountant_AssignPrimary(t *testing.T) { t.Error("New accountant created with non-zero account number") } - name := "one" + name := uuid.New().String() a, err := accountant.RegisterAccount(name) if err != nil { t.Error(err) diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go index 35cd8c3..d5362dd 100644 --- a/pkg/rove/rove_test.go +++ b/pkg/rove/rove_test.go @@ -4,6 +4,8 @@ package rove import ( "testing" + + "github.com/google/uuid" ) var serverUrl = "localhost:80" @@ -23,7 +25,8 @@ func TestStatus(t *testing.T) { func TestRegister(t *testing.T) { conn := NewConnection(serverUrl) - reg1, err := conn.Register("one") + a := uuid.New().String() + reg1, err := conn.Register(a) if err != nil { t.Errorf("Register returned error: %s", err) } else if !reg1.Success { @@ -32,7 +35,8 @@ func TestRegister(t *testing.T) { t.Error("Server returned empty registration ID") } - reg2, err := conn.Register("two") + b := uuid.New().String() + reg2, err := conn.Register(b) if err != nil { t.Errorf("Register returned error: %s", err) } else if !reg2.Success { @@ -41,7 +45,7 @@ func TestRegister(t *testing.T) { t.Error("Server returned empty registration ID") } - if reg2, err := conn.Register("one"); err != nil { + if reg2, err := conn.Register(a); err != nil { t.Errorf("Register returned error: %s", err) } else if reg2.Success { t.Error("Server should have failed to register duplicate name") From c5ebbc3c400a47ed5863f23186a2887eeff85f47 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 2 Jun 2020 19:16:02 +0100 Subject: [PATCH 052/495] Extract persistence code into own class --- main.go | 8 ++- pkg/accounts/accounts.go | 42 +------------- pkg/accounts/accounts_test.go | 49 +--------------- pkg/game/world.go | 41 +------------ pkg/game/world_test.go | 5 +- pkg/persistence/persistence.go | 90 +++++++++++++++++++++++++++++ pkg/persistence/persistence_test.go | 52 +++++++++++++++++ pkg/server/server.go | 18 ++---- pkg/server/server_test.go | 7 +-- 9 files changed, 163 insertions(+), 149 deletions(-) create mode 100644 pkg/persistence/persistence.go create mode 100644 pkg/persistence/persistence_test.go diff --git a/main.go b/main.go index ccc2f93..d8c0762 100644 --- a/main.go +++ b/main.go @@ -7,13 +7,14 @@ import ( "os/signal" "syscall" + "github.com/mdiluz/rove/pkg/persistence" "github.com/mdiluz/rove/pkg/server" "github.com/mdiluz/rove/pkg/version" ) var ver = flag.Bool("version", false, "Display version number") var port = flag.Int("port", 8080, "The port to host on") -var data = flag.String("data", "/tmp/", "Directory to store persistant data") +var data = flag.String("data", os.TempDir(), "Directory to store persistant data") func main() { flag.Parse() @@ -23,9 +24,12 @@ func main() { os.Exit(0) } + // Set the persistence path + persistence.SetPath(*data) + s := server.NewServer( server.OptionPort(*port), - server.OptionPersistentData(*data)) + server.OptionPersistentData()) fmt.Println("Initialising...") if err := s.Initialise(); err != nil { diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index e975a08..37effec 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -1,11 +1,7 @@ package accounts import ( - "encoding/json" "fmt" - "io/ioutil" - "os" - "path" "github.com/google/uuid" ) @@ -31,13 +27,11 @@ type accountantData struct { // Accountant manages a set of accounts type Accountant struct { Accounts map[uuid.UUID]Account `json:"accounts"` - dataPath string } // NewAccountant creates a new accountant -func NewAccountant(dataPath string) *Accountant { +func NewAccountant() *Accountant { return &Accountant{ - dataPath: dataPath, Accounts: make(map[uuid.UUID]Account), } } @@ -64,40 +58,6 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { return } -// path returns the full path to the data file -func (a Accountant) path() string { - return path.Join(a.dataPath, kAccountsFileName) -} - -// Load will load the accountant from data -func (a *Accountant) Load() error { - // Don't load anything if the file doesn't exist - _, err := os.Stat(a.path()) - if os.IsNotExist(err) { - fmt.Printf("File %s didn't exist, loading with fresh accounts data\n", a.path()) - return nil - } - - if b, err := ioutil.ReadFile(a.path()); err != nil { - return err - } else if err := json.Unmarshal(b, &a); err != nil { - return err - } - return nil -} - -// Save will save the accountant data out -func (a *Accountant) Save() error { - if b, err := json.MarshalIndent(a, "", "\t"); err != nil { - return err - } else { - if err := ioutil.WriteFile(a.path(), b, os.ModePerm); err != nil { - return err - } - } - return nil -} - // AssignPrimary assigns primary ownership of an instance to an account func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error { diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index bef693f..bb6c9a7 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -1,7 +1,6 @@ package accounts import ( - "os" "testing" "github.com/google/uuid" @@ -9,7 +8,7 @@ import ( func TestNewAccountant(t *testing.T) { // Very basic verify here for now - accountant := NewAccountant(os.TempDir()) + accountant := NewAccountant() if accountant == nil { t.Error("Failed to create accountant") } @@ -17,7 +16,7 @@ func TestNewAccountant(t *testing.T) { func TestAccountant_RegisterAccount(t *testing.T) { - accountant := NewAccountant(os.TempDir()) + accountant := NewAccountant() // Start by making two accounts @@ -49,50 +48,8 @@ func TestAccountant_RegisterAccount(t *testing.T) { } } -func TestAccountant_LoadSave(t *testing.T) { - accountant := NewAccountant(os.TempDir()) - if len(accountant.Accounts) != 0 { - t.Error("New accountant created with non-zero account number") - } - - name := uuid.New().String() - a, err := accountant.RegisterAccount(name) - if err != nil { - t.Error(err) - } - - if len(accountant.Accounts) != 1 { - t.Error("No new account made") - } else if accountant.Accounts[a.Id].Name != name { - t.Error("New account created with wrong name") - } - - // Save out the accountant - if err := accountant.Save(); err != nil { - t.Error(err) - } - - // Re-create the accountant - accountant = NewAccountant(os.TempDir()) - if len(accountant.Accounts) != 0 { - t.Error("New accountant created with non-zero account number") - } - - // Load the old accountant data - if err := accountant.Load(); err != nil { - t.Error(err) - } - - // Verify we have the same account again - if len(accountant.Accounts) != 1 { - t.Error("No account after load") - } else if accountant.Accounts[a.Id].Name != name { - t.Error("New account created with wrong name") - } -} - func TestAccountant_AssignPrimary(t *testing.T) { - accountant := NewAccountant(os.TempDir()) + accountant := NewAccountant() if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") } diff --git a/pkg/game/world.go b/pkg/game/world.go index 3138953..14311b0 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -1,11 +1,7 @@ package game import ( - "encoding/json" "fmt" - "io/ioutil" - "os" - "path" "github.com/google/uuid" ) @@ -30,47 +26,12 @@ type Instance struct { const kWorldFileName = "rove-world.json" // NewWorld creates a new world object -func NewWorld(data string) *World { +func NewWorld() *World { return &World{ Instances: make(map[uuid.UUID]Instance), - dataPath: data, } } -// path returns the full path to the data file -func (w *World) path() string { - return path.Join(w.dataPath, kWorldFileName) -} - -// Load will load the accountant from data -func (w *World) Load() error { - // Don't load anything if the file doesn't exist - _, err := os.Stat(w.path()) - if os.IsNotExist(err) { - fmt.Printf("File %s didn't exist, loading with fresh world data\n", w.path()) - return nil - } - - if b, err := ioutil.ReadFile(w.path()); err != nil { - return err - } else if err := json.Unmarshal(b, &w); err != nil { - return err - } - return nil -} - -// Save will save the accountant data out -func (w *World) Save() error { - if b, err := json.MarshalIndent(w, "", "\t"); err != nil { - return err - } else { - if err := ioutil.WriteFile(w.path(), b, os.ModePerm); err != nil { - return err - } - } - return nil -} - // Adds an instance to the game func (w *World) CreateInstance() uuid.UUID { id := uuid.New() diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 0bfc070..e5fd031 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -1,20 +1,19 @@ package game import ( - "os" "testing" ) func TestNewWorld(t *testing.T) { // Very basic for now, nothing to verify - world := NewWorld(os.TempDir()) + world := NewWorld() if world == nil { t.Error("Failed to create world") } } func TestWorld_CreateInstance(t *testing.T) { - world := NewWorld(os.TempDir()) + world := NewWorld() a := world.CreateInstance() b := world.CreateInstance() diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go new file mode 100644 index 0000000..6705767 --- /dev/null +++ b/pkg/persistence/persistence.go @@ -0,0 +1,90 @@ +package persistence + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path" +) + +// dataPath global path for persistence +var dataPath = os.TempDir() + +// SetPath sets the persistent path for the data storage +func SetPath(path string) error { + if info, err := os.Stat(path); err != nil { + return err + } else if !info.IsDir() { + return fmt.Errorf("path for persistence is not directory") + } + dataPath = path + return nil +} + +// Converts name to a full path +func jsonPath(name string) string { + return path.Join(dataPath, fmt.Sprintf("rove-%s.json", name)) +} + +// Save will serialise the interface into a json file +func Save(name string, data interface{}) error { + if b, err := json.MarshalIndent(data, "", "\t"); err != nil { + return err + } else { + if err := ioutil.WriteFile(jsonPath(name), b, os.ModePerm); err != nil { + return err + } + } + return nil +} + +// Load will load the interface from the json file +func Load(name string, data interface{}) error { + path := jsonPath(name) + // Don't load anything if the file doesn't exist + _, err := os.Stat(path) + if os.IsNotExist(err) { + fmt.Printf("File %s didn't exist, loading with fresh data\n", path) + return nil + } + + // Read and unmarshal the json + if b, err := ioutil.ReadFile(path); err != nil { + return err + } else if err := json.Unmarshal(b, data); err != nil { + return err + } + return nil +} + +// saveLoadFunc defines a type of function to save or load an interface +type saveLoadFunc func(string, interface{}) error + +func doAll(f saveLoadFunc, args ...interface{}) error { + var name string + for i, a := range args { + if i%2 == 0 { + var ok bool + name, ok = a.(string) + if !ok { + return fmt.Errorf("Incorrect args") + } + } else { + if err := f(name, a); err != nil { + return err + } + } + } + return nil +} + +// SaveAll allows for saving multiple structures in a single call +func SaveAll(args ...interface{}) error { + return doAll(Save, args...) +} + +// LoadAll allows for loading multiple structures in a single call +func LoadAll(args ...interface{}) error { + return doAll(Load, args...) +} diff --git a/pkg/persistence/persistence_test.go b/pkg/persistence/persistence_test.go new file mode 100644 index 0000000..e4117a1 --- /dev/null +++ b/pkg/persistence/persistence_test.go @@ -0,0 +1,52 @@ +package persistence + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +type Dummy struct { + Success bool + Value int +} + +func TestPersistence_LoadSave(t *testing.T) { + tmp, err := ioutil.TempDir(os.TempDir(), "rove_persistence_test") + assert.NoError(t, err, "Failed to get tempdir path") + + assert.NoError(t, SetPath(tmp), "Failed to get set tempdir to persistence path") + + // Try and save out the dummy + var dummy Dummy + dummy.Success = true + assert.NoError(t, Save("test", dummy), "Failed to save out dummy file") + + // Load back the dummy + dummy = Dummy{} + assert.NoError(t, Load("test", &dummy), "Failed to load in dummy file") + assert.Equal(t, true, dummy.Success, "Did not successfully load true value from file") +} + +func TestPersistence_LoadSaveAll(t *testing.T) { + tmp, err := ioutil.TempDir(os.TempDir(), "rove_persistence_test") + assert.NoError(t, err, "Failed to get tempdir path") + + assert.NoError(t, SetPath(tmp), "Failed to get set tempdir to persistence path") + + // Try and save out the dummy + var dummyA Dummy + var dummyB Dummy + dummyA.Value = 1 + dummyB.Value = 2 + assert.NoError(t, SaveAll("a", dummyA, "b", dummyB), "Failed to save out dummy file") + + // Load back the dummy + dummyA = Dummy{} + dummyB = Dummy{} + assert.NoError(t, LoadAll("a", &dummyA, "b", &dummyB), "Failed to load in dummy file") + assert.Equal(t, 1, dummyA.Value, "Did not successfully load int value from file") + assert.Equal(t, 2, dummyB.Value, "Did not successfully load int value from file") +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 3ffaee4..37ff0ae 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -11,6 +11,7 @@ import ( "github.com/gorilla/mux" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" + "github.com/mdiluz/rove/pkg/persistence" ) const ( @@ -48,10 +49,9 @@ func OptionPort(port int) ServerOption { } // OptionPersistentData sets the server data to be persistent -func OptionPersistentData(loc string) ServerOption { +func OptionPersistentData() ServerOption { return func(s *Server) { s.persistence = PersistentData - s.persistenceLocation = loc } } @@ -76,8 +76,8 @@ func NewServer(opts ...ServerOption) *Server { s.server = &http.Server{Addr: fmt.Sprintf(":%d", s.port), Handler: router} // Create the accountant - s.accountant = accounts.NewAccountant(s.persistenceLocation) - s.world = game.NewWorld(s.persistenceLocation) + s.accountant = accounts.NewAccountant() + s.world = game.NewWorld() return s } @@ -87,10 +87,7 @@ func (s *Server) Initialise() error { // Load the accounts if requested if s.persistence == PersistentData { - if err := s.accountant.Load(); err != nil { - return err - } - if err := s.world.Load(); err != nil { + if err := persistence.LoadAll("accounts", &s.accountant, "world", &s.world); err != nil { return err } } @@ -130,10 +127,7 @@ func (s *Server) Close() error { // Save the accounts if requested if s.persistence == PersistentData { - if err := s.accountant.Save(); err != nil { - return err - } - if err := s.world.Save(); err != nil { + if err := persistence.SaveAll("accounts", s.accountant, "world", s.world); err != nil { return err } } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index f4598d7..619ebbe 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1,7 +1,6 @@ package server import ( - "os" "testing" ) @@ -22,13 +21,11 @@ func TestNewServer_OptionPort(t *testing.T) { } func TestNewServer_OptionPersistentData(t *testing.T) { - server := NewServer(OptionPersistentData(os.TempDir())) + server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") } else if server.persistence != PersistentData { t.Error("Failed to set server persistent data") - } else if server.persistenceLocation != os.TempDir() { - t.Error("Failed to set server persistent data path") } } @@ -47,7 +44,7 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { - server := NewServer(OptionPersistentData(os.TempDir())) + server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") } else if err := server.Initialise(); err != nil { From 78774329a8dacc52811abd4245b645b110335caf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 12:22:37 +0100 Subject: [PATCH 053/495] Add a persistent data volume --- docker-compose.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d324eea..446dafe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,13 @@ version: '3' + +volumes: + persistent-data: + services: rove-server: build: . ports: - "80:80" - command: ./rove-server --port 80 \ No newline at end of file + command: ./rove-server --port 80 --data=/mnt/rove-server + volumes: + - persistent-data:/mnt/rove-server:rw From a0657b32e718c6ce4d9d1086331c4fe1e3f4ccab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 12:31:52 +0100 Subject: [PATCH 054/495] Try and clean up a failed primary instance creation --- pkg/game/world.go | 10 ++++++++++ pkg/game/world_test.go | 18 ++++++++++++++++++ pkg/server/router.go | 35 +++++++++++++++++++++++++---------- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 14311b0..c2639f0 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -47,6 +47,16 @@ func (w *World) CreateInstance() uuid.UUID { return id } +// Removes an instance from the game +func (w *World) DestroyInstance(id uuid.UUID) error { + if _, ok := w.Instances[id]; ok { + delete(w.Instances, id) + } else { + return fmt.Errorf("no instance matching id") + } + return nil +} + // GetPosition returns the position of a given instance func (w World) GetPosition(id uuid.UUID) (Position, error) { if i, ok := w.Instances[id]; ok { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index e5fd031..af29246 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -2,6 +2,8 @@ package game import ( "testing" + + "github.com/stretchr/testify/assert" ) func TestNewWorld(t *testing.T) { @@ -24,3 +26,19 @@ func TestWorld_CreateInstance(t *testing.T) { t.Errorf("Incorrect number of instances created") } } + +func TestWorld_DestroyInstance(t *testing.T) { + world := NewWorld() + a := world.CreateInstance() + b := world.CreateInstance() + + err := world.DestroyInstance(a) + assert.NoError(t, err, "Error returned from instance destroy") + + // Basic duplicate check + if len(world.Instances) != 1 { + t.Error("Too many instances left in world") + } else if _, ok := world.Instances[b]; !ok { + t.Error("Remaining instance is incorrect") + } +} diff --git a/pkg/server/router.go b/pkg/server/router.go index ff297e1..4131be9 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -139,6 +139,9 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + // Reply with the current status json.NewEncoder(w).Encode(response) } @@ -157,6 +160,12 @@ type SpawnResponse struct { // HandleSpawn will spawn the player entity for the associated account func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) // Set up the response @@ -166,35 +175,38 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { }, } - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - // Pull out the incoming info var data SpawnData - err := json.NewDecoder(r.Body).Decode(&data) - if err != nil { + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() + } else if len(data.Id) == 0 { response.Error = "No account ID provided" + } else if id, err := uuid.Parse(data.Id); err != nil { response.Error = "Provided account ID was invalid" + } else { // log the data sent - fmt.Printf("\tdata: %v\n", data) + fmt.Printf("\tspawn data: %v\n", data) // Create a new instance inst := s.world.CreateInstance() if pos, err := s.world.GetPosition(inst); err != nil { response.Error = fmt.Sprint("No position found for created instance") + } else { if err := s.accountant.AssignPrimary(id, inst); err != nil { response.Error = err.Error() + + // Try and clear up the instance + if err := s.world.DestroyInstance(inst); err != nil { + fmt.Printf("Failed to destroy instance after failed primary assign: %s", err) + } + } else { + // Reply with valid data response.Success = true response.Position = pos } @@ -205,6 +217,9 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + // Reply with the current status json.NewEncoder(w).Encode(response) } From 20f50b678cd582c5f870592dea363dd6f3c49748 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 12:58:01 +0100 Subject: [PATCH 055/495] Fix version reporting and setting --- Dockerfile | 2 +- main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0a7bee4..7de6ea1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove-server -ldflags="-X version.Version=$(git describe --always --long --dirty)" . +RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty)'" . CMD [ "./rove-server" ] diff --git a/main.go b/main.go index d8c0762..898b4dd 100644 --- a/main.go +++ b/main.go @@ -31,7 +31,7 @@ func main() { server.OptionPort(*port), server.OptionPersistentData()) - fmt.Println("Initialising...") + fmt.Printf("Initialising version %s...\n", version.Version) if err := s.Initialise(); err != nil { panic(err) } From b9d5a5474186ec65c178a04d55ed08f16b040b9e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 12:58:10 +0100 Subject: [PATCH 056/495] Handle 0 size data files and augment the error that comes back from Unmarshal --- pkg/persistence/persistence.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index 6705767..7d90272 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -52,8 +52,10 @@ func Load(name string, data interface{}) error { // Read and unmarshal the json if b, err := ioutil.ReadFile(path); err != nil { return err + } else if len(b) == 0 { + fmt.Printf("File %s was empty, loading with fresh data\n", path) } else if err := json.Unmarshal(b, data); err != nil { - return err + return fmt.Errorf("failed to load file %s error: %s", path, err) } return nil } From 4423678786dcb7e27741b0b2c442b621e81d1047 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 13:02:19 +0100 Subject: [PATCH 057/495] Add the --tags arg to git describe so it sees the tags --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7de6ea1..d5a7e6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty)'" . +RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" . CMD [ "./rove-server" ] From 013a69fa63c1c8ef0d23a1104b38fe71873d9970 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 17:29:56 +0100 Subject: [PATCH 058/495] Clean up main a little --- main.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 898b4dd..b64a919 100644 --- a/main.go +++ b/main.go @@ -19,19 +19,23 @@ var data = flag.String("data", os.TempDir(), "Directory to store persistant data func main() { flag.Parse() + // Print the version if requested if *ver { fmt.Println(version.Version) os.Exit(0) } + fmt.Printf("Initialising version %s...\n", version.Version) + // Set the persistence path persistence.SetPath(*data) + // Create the server data s := server.NewServer( server.OptionPort(*port), server.OptionPersistentData()) - fmt.Printf("Initialising version %s...\n", version.Version) + // Initialise the server if err := s.Initialise(); err != nil { panic(err) } @@ -42,14 +46,18 @@ func main() { go func() { <-c fmt.Println("SIGTERM recieved, exiting...") - s.Close() + if err := s.Close(); err != nil { + panic(err) + } os.Exit(0) }() - fmt.Println("Initialised") + fmt.Println("Running...") + // Run the server s.Run() + // Close the server if err := s.Close(); err != nil { panic(err) } From e5d5d123a69559177baa1a087932750147e855a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 18:12:08 +0100 Subject: [PATCH 059/495] Add the concept of commands to the world and executing them --- pkg/game/command.go | 23 ++++++++++++++++++ pkg/game/command_test.go | 50 ++++++++++++++++++++++++++++++++++++++ pkg/game/geom.go | 15 +++++++++--- pkg/game/world.go | 52 ++++++++++++++++++++++++++++++++-------- pkg/game/world_test.go | 37 ++++++++++++++++++++++++---- pkg/server/router.go | 5 ++-- 6 files changed, 163 insertions(+), 19 deletions(-) create mode 100644 pkg/game/command.go create mode 100644 pkg/game/command_test.go diff --git a/pkg/game/command.go b/pkg/game/command.go new file mode 100644 index 0000000..ef7bece --- /dev/null +++ b/pkg/game/command.go @@ -0,0 +1,23 @@ +package game + +import "github.com/google/uuid" + +// A command is simply a function that acts on the a given instance in the world +type Command func() error + +// CommandMove will move the instance in question +func (w *World) CommandMove(id uuid.UUID, vec Vector) Command { + return func() error { + // Move the instance + _, err := w.MovePosition(id, vec) + return err + } +} + +// CommandSpawn +// TODO: Two spawn commands with the same id could trigger a fail later on, we should prevent that somehow +func (w *World) CommandSpawn(id uuid.UUID) Command { + return func() error { + return w.Spawn(id) + } +} diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go new file mode 100644 index 0000000..0bb51b3 --- /dev/null +++ b/pkg/game/command_test.go @@ -0,0 +1,50 @@ +package game + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestCommand_Spawn(t *testing.T) { + world := NewWorld() + a := uuid.New() + + spawnCommand := world.CommandSpawn(a) + assert.NoError(t, world.Execute(spawnCommand), "Failed to execute spawn command") + + instance, ok := world.Instances[a] + assert.True(t, ok, "No new instance in world") + assert.Equal(t, a, instance.id, "New instance has incorrect id") +} + +func TestCommand_Move(t *testing.T) { + world := NewWorld() + a := uuid.New() + assert.NoError(t, world.Spawn(a), "Failed to spawn") + + pos := Vector{ + X: 1.0, + Y: 2.0, + Z: 3.0, + } + + err := world.SetPosition(a, pos) + assert.NoError(t, err, "Failed to set position for instance") + + move := Vector{ + X: 3.0, + Y: 2.0, + Z: 1.0, + } + + // Try the move command + moveCommand := world.CommandMove(a, move) + assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") + + newpos, err := world.GetPosition(a) + assert.NoError(t, err, "Failed to set position for instance") + pos.Add(move) + assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") +} diff --git a/pkg/game/geom.go b/pkg/game/geom.go index b41a8de..585799f 100644 --- a/pkg/game/geom.go +++ b/pkg/game/geom.go @@ -1,6 +1,15 @@ package game -type Position struct { - X int `json:"x"` - Y int `json:"y"` +// Vector desribes a 3D vector +type Vector struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Z float64 `json:"z"` +} + +// Add adds one vector to another +func (v *Vector) Add(v2 Vector) { + v.X += v2.X + v.Y += v2.Y + v.Z += v2.Z } diff --git a/pkg/game/world.go b/pkg/game/world.go index c2639f0..b3b00ad 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -8,10 +8,8 @@ import ( // World describes a self contained universe and everything in it type World struct { + // Instances is a map of all the instances in the game Instances map[uuid.UUID]Instance `json:"instances"` - - // dataPath is the location for the data to be stored - dataPath string } // Instance describes a single entity or instance of an entity in the world @@ -20,7 +18,7 @@ type Instance struct { id uuid.UUID // pos represents where this instance is in the world - pos Position + pos Vector } const kWorldFileName = "rove-world.json" @@ -32,9 +30,11 @@ func NewWorld() *World { } } -// Adds an instance to the game -func (w *World) CreateInstance() uuid.UUID { - id := uuid.New() +// Spawn adds an instance to the game +func (w *World) Spawn(id uuid.UUID) error { + if _, ok := w.Instances[id]; ok { + return fmt.Errorf("instance with id %s already exists in world", id) + } // Initialise the instance instance := Instance{ @@ -44,7 +44,7 @@ func (w *World) CreateInstance() uuid.UUID { // Append the instance to the list w.Instances[id] = instance - return id + return nil } // Removes an instance from the game @@ -58,10 +58,42 @@ func (w *World) DestroyInstance(id uuid.UUID) error { } // GetPosition returns the position of a given instance -func (w World) GetPosition(id uuid.UUID) (Position, error) { +func (w World) GetPosition(id uuid.UUID) (Vector, error) { if i, ok := w.Instances[id]; ok { return i.pos, nil } else { - return Position{}, fmt.Errorf("no instance matching id") + return Vector{}, fmt.Errorf("no instance matching id") } } + +// SetPosition sets an instances position +func (w *World) SetPosition(id uuid.UUID, pos Vector) error { + if i, ok := w.Instances[id]; ok { + i.pos = pos + w.Instances[id] = i + return nil + } else { + return fmt.Errorf("no instance matching id") + } +} + +// SetPosition sets an instances position +func (w *World) MovePosition(id uuid.UUID, vec Vector) (Vector, error) { + if i, ok := w.Instances[id]; ok { + i.pos.Add(vec) + w.Instances[id] = i + return i.pos, nil + } else { + return Vector{}, fmt.Errorf("no instance matching id") + } +} + +// Execute will run the commands given +func (w *World) Execute(commands ...Command) error { + for _, c := range commands { + if err := c(); err != nil { + return err + } + } + return nil +} diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index af29246..b351377 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,6 +3,7 @@ package game import ( "testing" + "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -16,8 +17,10 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateInstance(t *testing.T) { world := NewWorld() - a := world.CreateInstance() - b := world.CreateInstance() + a := uuid.New() + b := uuid.New() + assert.NoError(t, world.Spawn(a), "Failed to spawn") + assert.NoError(t, world.Spawn(b), "Failed to spawn") // Basic duplicate check if a == b { @@ -29,8 +32,10 @@ func TestWorld_CreateInstance(t *testing.T) { func TestWorld_DestroyInstance(t *testing.T) { world := NewWorld() - a := world.CreateInstance() - b := world.CreateInstance() + a := uuid.New() + b := uuid.New() + assert.NoError(t, world.Spawn(a), "Failed to spawn") + assert.NoError(t, world.Spawn(b), "Failed to spawn") err := world.DestroyInstance(a) assert.NoError(t, err, "Error returned from instance destroy") @@ -42,3 +47,27 @@ func TestWorld_DestroyInstance(t *testing.T) { t.Error("Remaining instance is incorrect") } } + +func TestWorld_GetSetMovePosition(t *testing.T) { + world := NewWorld() + a := uuid.New() + assert.NoError(t, world.Spawn(a), "Failed to spawn") + + pos := Vector{ + X: 1.0, + Y: 2.0, + Z: 3.0, + } + + err := world.SetPosition(a, pos) + assert.NoError(t, err, "Failed to set position for instance") + + newpos, err := world.GetPosition(a) + assert.NoError(t, err, "Failed to set position for instance") + assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") + + newpos, err = world.MovePosition(a, pos) + assert.NoError(t, err, "Failed to set position for instance") + pos.Add(pos) + assert.Equal(t, pos, newpos, "Failed to correctly move position for instance") +} diff --git a/pkg/server/router.go b/pkg/server/router.go index 4131be9..42dfe5f 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -155,7 +155,7 @@ type SpawnData struct { type SpawnResponse struct { BasicResponse - Position game.Position `json:"position"` + Position game.Vector `json:"position"` } // HandleSpawn will spawn the player entity for the associated account @@ -192,7 +192,8 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { fmt.Printf("\tspawn data: %v\n", data) // Create a new instance - inst := s.world.CreateInstance() + inst := uuid.New() + s.world.Spawn(inst) if pos, err := s.world.GetPosition(inst); err != nil { response.Error = fmt.Sprint("No position found for created instance") From e2857d75062265eef3c5b0bdbb4b5a028c507232 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 18:40:19 +0100 Subject: [PATCH 060/495] Add the /commands path to handle a set of commands Entirely synchronous now but allows for the "move" command --- pkg/accounts/accounts.go | 9 +++ pkg/accounts/accounts_test.go | 6 +- pkg/server/router.go | 108 ++++++++++++++++++++++++++++------ pkg/server/router_test.go | 43 ++++++++++++++ pkg/server/server.go | 22 +++++++ 5 files changed, 169 insertions(+), 19 deletions(-) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 37effec..99fa47e 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -71,3 +71,12 @@ func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error return nil } + +// GetPrimary gets the primary instance for the account +func (a *Accountant) GetPrimary(account uuid.UUID) (uuid.UUID, error) { + // Find the account matching the ID + if this, ok := a.Accounts[account]; ok { + return this.Primary, nil + } + return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) +} diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index bb6c9a7..6597ab5 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -48,7 +48,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } } -func TestAccountant_AssignPrimary(t *testing.T) { +func TestAccountant_AssignGetPrimary(t *testing.T) { accountant := NewAccountant() if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") @@ -67,5 +67,9 @@ func TestAccountant_AssignPrimary(t *testing.T) { t.Error("Failed to set primary for created account") } else if accountant.Accounts[a.Id].Primary != inst { t.Error("Primary for assigned account is incorrect") + } else if id, err := accountant.GetPrimary(a.Id); err != nil { + t.Error("Failed to get primary for account") + } else if id != inst { + t.Error("Fetched primary is incorrect for account") } } diff --git a/pkg/server/router.go b/pkg/server/router.go index 42dfe5f..0898cdd 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -33,6 +33,10 @@ func (s *Server) SetUpRouter() { path: "/spawn", handler: s.HandleSpawn, }, + { + path: "/commands", + handler: s.HandleCommands, + }, } // Set up the handlers @@ -192,25 +196,93 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { fmt.Printf("\tspawn data: %v\n", data) // Create a new instance - inst := uuid.New() - s.world.Spawn(inst) - if pos, err := s.world.GetPosition(inst); err != nil { - response.Error = fmt.Sprint("No position found for created instance") - + if pos, _, err := s.SpawnPrimary(id); err != nil { + response.Error = err.Error() } else { - if err := s.accountant.AssignPrimary(id, inst); err != nil { - response.Error = err.Error() - - // Try and clear up the instance - if err := s.world.DestroyInstance(inst); err != nil { - fmt.Printf("Failed to destroy instance after failed primary assign: %s", err) - } - - } else { - // Reply with valid data - response.Success = true - response.Position = pos - } + response.Success = true + response.Position = pos + } + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) +} + +const ( + // CommandMove describes a single move command + CommandMove = "move" +) + +// Command describes a single command to execute +// it contains the type, and then any members used for each command type +type Command struct { + // Command is the main command string + Command string `json:"command"` + + // Used for CommandMove + Vector game.Vector `json:"vector"` +} + +// CommandsData is a set of commands to execute in order +type CommandsData struct { + BasicAccountData + Commands []Command `json:"commands"` +} + +// HandleSpawn will spawn the player entity for the associated account +func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Set up the response + var response = BasicResponse{ + Success: false, + } + + // Pull out the incoming info + var data CommandsData + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) + + } else if inst, err := s.accountant.GetPrimary(id); err != nil { + response.Error = fmt.Sprintf("Provided account has no primary: %s", err) + } else { + // log the data sent + fmt.Printf("\tcommands data: %v\n", data) + + // Iterate through the commands to generate all game commands + var cmds []game.Command + for _, c := range data.Commands { + switch c.Command { + case CommandMove: + cmds = append(cmds, s.world.CommandMove(inst, c.Vector)) + } + } + + // Execute the commands + if err := s.world.Execute(cmds...); err != nil { + response.Error = fmt.Sprintf("Failed to execute commands: %s", err) + } else { + response.Success = true } } diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 21440c5..b36a1aa 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -7,6 +7,7 @@ import ( "net/http/httptest" "testing" + "github.com/mdiluz/rove/pkg/game" "github.com/stretchr/testify/assert" ) @@ -71,3 +72,45 @@ func TestHandleSpawn(t *testing.T) { t.Errorf("got false for /spawn") } } + +func TestHandleCommands(t *testing.T) { + s := NewServer() + a, err := s.accountant.RegisterAccount("test") + assert.NoError(t, err, "Error registering account") + + // Spawn the primary instance for the account + _, inst, err := s.SpawnPrimary(a.Id) + + move := game.Vector{X: 1, Y: 2, Z: 3} + + data := CommandsData{ + BasicAccountData: BasicAccountData{Id: a.Id.String()}, + Commands: []Command{ + { + Command: CommandMove, + Vector: move, + }, + }, + } + + b, err := json.Marshal(data) + assert.NoError(t, err, "Error marshalling data") + + request, _ := http.NewRequest(http.MethodPost, "/commands", bytes.NewReader(b)) + response := httptest.NewRecorder() + + s.HandleCommands(response, request) + + var status BasicResponse + json.NewDecoder(response.Body).Decode(&status) + + if status.Success != true { + t.Errorf("got false for /commands") + } + + if pos, err := s.world.GetPosition(inst); err != nil { + t.Error("Couldn't get position for the primary instance") + } else if pos != move { + t.Error("Mismatched position after commands") + } +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 37ff0ae..6d666a5 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "github.com/google/uuid" "github.com/gorilla/mux" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" @@ -133,3 +134,24 @@ func (s *Server) Close() error { } return nil } + +// SpawnPrimary spawns the primary instance for an account +func (s *Server) SpawnPrimary(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { + inst := uuid.New() + s.world.Spawn(inst) + if pos, err := s.world.GetPosition(inst); err != nil { + return game.Vector{}, uuid.UUID{}, fmt.Errorf("No position found for created instance") + + } else { + if err := s.accountant.AssignPrimary(accountid, inst); err != nil { + // Try and clear up the instance + if err := s.world.DestroyInstance(inst); err != nil { + fmt.Printf("Failed to destroy instance after failed primary assign: %s", err) + } + + return game.Vector{}, uuid.UUID{}, err + } else { + return pos, inst, nil + } + } +} From ab5a2c9d75ea2801a5819223a1e8937e66c66746 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 3 Jun 2020 23:14:27 +0100 Subject: [PATCH 061/495] Change robot to rover in design doc --- docs/design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design.md b/docs/design.md index 4952667..578c5e6 100644 --- a/docs/design.md +++ b/docs/design.md @@ -30,7 +30,7 @@ Enough collected resources allow you to create and fire a new rover a significan Finding a dormant rover gives you a choice - scrap it to gain minor resources, or fire it a distance just like a new rover, taking control of it. -“Dying” triggers a self destruct and fires a new basic robot in a random direction towards the equator +“Dying” triggers a self destruct and fires a new basic rover in a random direction towards the equator ## Multiplayer From fd4b4205bad7135a2c136e06d3c3f9a87b50848d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 16:57:38 +0100 Subject: [PATCH 062/495] Add empty implementation of /view --- pkg/server/router.go | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/pkg/server/router.go b/pkg/server/router.go index 0898cdd..8441d88 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -37,6 +37,10 @@ func (s *Server) SetUpRouter() { path: "/commands", handler: s.HandleCommands, }, + { + path: "/view", + handler: s.HandleView, + }, } // Set up the handlers @@ -296,3 +300,61 @@ func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { // Reply with the current status json.NewEncoder(w).Encode(response) } + +// ViewData describes the input data to request an accounts current view +type ViewData struct { + BasicAccountData +} + +// ViewResponse describes the response to a /view call +type ViewResponse struct { + BasicResponse +} + +// HandleView handles the view request +func (s *Server) HandleView(w http.ResponseWriter, r *http.Request) { + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Set up the response + var response = ViewResponse{ + BasicResponse: BasicResponse{ + Success: false, + }, + } + + // Pull out the incoming info + var data CommandsData + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) + + } else { + // log the data sent + fmt.Printf("\tcommands data: %v\n", data) + + // TODO: Query the view for this account + fmt.Println(id) + } + + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) +} From b95d92350ad63052bf2e9a426859cac68e2bba2d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 17:21:23 +0100 Subject: [PATCH 063/495] Refactor route handlers --- pkg/server/router.go | 132 ++++++++++++++++++-------------------- pkg/server/router_test.go | 8 +-- pkg/server/server.go | 3 +- 3 files changed, 66 insertions(+), 77 deletions(-) diff --git a/pkg/server/router.go b/pkg/server/router.go index 8441d88..b22b054 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -3,6 +3,7 @@ package server import ( "encoding/json" "fmt" + "io" "net/http" "github.com/google/uuid" @@ -10,10 +11,40 @@ import ( "github.com/mdiluz/rove/pkg/version" ) +// RequestHandler describes a function that handles any incoming request and can respond +type RequestHandler func(io.ReadCloser, io.Writer) error + // Route defines the information for a single path->function route type Route struct { path string - handler func(http.ResponseWriter, *http.Request) + method string + handler RequestHandler +} + +// RequestHandlerHTTP wraps a request handler in http checks +func RequestHandlerHTTP(method string, handler RequestHandler) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + // Log the request + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Verify we're hit with the right method + if r.Method != method { + w.WriteHeader(http.StatusMethodNotAllowed) + + } else if err := handler(r.Body, w); err != nil { + // Log the error + fmt.Printf("Failed to handle http request: %s", err) + + // Respond that we've had an error + w.WriteHeader(http.StatusInternalServerError) + + } else { + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + } + } } // NewRouter sets up the server mux @@ -23,29 +54,34 @@ func (s *Server) SetUpRouter() { var routes = []Route{ { path: "/status", + method: http.MethodGet, handler: s.HandleStatus, }, { path: "/register", + method: http.MethodPost, handler: s.HandleRegister, }, { path: "/spawn", + method: http.MethodPost, handler: s.HandleSpawn, }, { path: "/commands", + method: http.MethodPost, handler: s.HandleCommands, }, { path: "/view", + method: http.MethodPost, handler: s.HandleView, }, } // Set up the handlers for _, route := range routes { - s.router.HandleFunc(route.path, route.handler) + s.router.HandleFunc(route.path, RequestHandlerHTTP(route.method, route.handler)) } } @@ -55,27 +91,19 @@ type StatusResponse struct { Version string `json:"version"` } -// HandleStatus handles HTTP requests to the /status endpoint -func (s *Server) HandleStatus(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - - // Verify we're hit with a get request - if r.Method != http.MethodGet { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } +// HandleStatus handles the /status request +func (s *Server) HandleStatus(b io.ReadCloser, w io.Writer) error { + // Simply encode the current status var response = StatusResponse{ Ready: true, Version: version.Version, } - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - // Reply with the current status json.NewEncoder(w).Encode(response) + + return nil } // BasicResponse describes the minimum dataset for a response @@ -101,9 +129,8 @@ type RegisterResponse struct { Id string `json:"id"` } -// HandleRegister handles HTTP requests to the /register endpoint -func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) +// HandleRegister handles /register endpoint +func (s *Server) HandleRegister(b io.ReadCloser, w io.Writer) error { // Set up the response var response = RegisterResponse{ @@ -112,15 +139,9 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { }, } - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - // Pull out the registration info var data RegisterData - err := json.NewDecoder(r.Body).Decode(&data) + err := json.NewDecoder(b).Decode(&data) if err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -143,15 +164,13 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { } } - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - // Log the response fmt.Printf("\tresponse: %+v\n", response) // Reply with the current status json.NewEncoder(w).Encode(response) + + return nil } // SpawnData is the data to be sent for the spawn command @@ -167,15 +186,7 @@ type SpawnResponse struct { } // HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - +func (s *Server) HandleSpawn(b io.ReadCloser, w io.Writer) error { // Set up the response var response = SpawnResponse{ BasicResponse: BasicResponse{ @@ -185,7 +196,7 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { // Pull out the incoming info var data SpawnData - if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -208,15 +219,13 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { } } - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - // Log the response fmt.Printf("\tresponse: %+v\n", response) // Reply with the current status json.NewEncoder(w).Encode(response) + + return nil } const ( @@ -241,15 +250,7 @@ type CommandsData struct { } // HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - +func (s *Server) HandleCommands(b io.ReadCloser, w io.Writer) error { // Set up the response var response = BasicResponse{ Success: false, @@ -257,7 +258,7 @@ func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { // Pull out the incoming info var data CommandsData - if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -269,6 +270,7 @@ func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { } else if inst, err := s.accountant.GetPrimary(id); err != nil { response.Error = fmt.Sprintf("Provided account has no primary: %s", err) + } else { // log the data sent fmt.Printf("\tcommands data: %v\n", data) @@ -290,15 +292,13 @@ func (s *Server) HandleCommands(w http.ResponseWriter, r *http.Request) { } } - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - // Log the response fmt.Printf("\tresponse: %+v\n", response) // Reply with the current status json.NewEncoder(w).Encode(response) + + return nil } // ViewData describes the input data to request an accounts current view @@ -312,15 +312,7 @@ type ViewResponse struct { } // HandleView handles the view request -func (s *Server) HandleView(w http.ResponseWriter, r *http.Request) { - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - +func (s *Server) HandleView(b io.ReadCloser, w io.Writer) error { // Set up the response var response = ViewResponse{ BasicResponse: BasicResponse{ @@ -330,7 +322,7 @@ func (s *Server) HandleView(w http.ResponseWriter, r *http.Request) { // Pull out the incoming info var data CommandsData - if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -348,13 +340,11 @@ func (s *Server) HandleView(w http.ResponseWriter, r *http.Request) { fmt.Println(id) } - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - // Log the response fmt.Printf("\tresponse: %+v\n", response) // Reply with the current status json.NewEncoder(w).Encode(response) + + return nil } diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index b36a1aa..19664b0 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -16,7 +16,7 @@ func TestHandleStatus(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.HandleStatus(response, request) + RequestHandlerHTTP(http.MethodGet, s.HandleStatus)(response, request) var status StatusResponse json.NewDecoder(response.Body).Decode(&status) @@ -41,7 +41,7 @@ func TestHandleRegister(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.HandleRegister(response, request) + RequestHandlerHTTP(http.MethodPost, s.HandleRegister)(response, request) var status RegisterResponse json.NewDecoder(response.Body).Decode(&status) @@ -63,7 +63,7 @@ func TestHandleSpawn(t *testing.T) { request, _ := http.NewRequest(http.MethodPost, "/spawn", bytes.NewReader(b)) response := httptest.NewRecorder() - s.HandleSpawn(response, request) + RequestHandlerHTTP(http.MethodPost, s.HandleSpawn)(response, request) var status SpawnResponse json.NewDecoder(response.Body).Decode(&status) @@ -99,7 +99,7 @@ func TestHandleCommands(t *testing.T) { request, _ := http.NewRequest(http.MethodPost, "/commands", bytes.NewReader(b)) response := httptest.NewRecorder() - s.HandleCommands(response, request) + RequestHandlerHTTP(http.MethodPost, s.HandleCommands)(response, request) var status BasicResponse json.NewDecoder(response.Body).Decode(&status) diff --git a/pkg/server/server.go b/pkg/server/server.go index 6d666a5..a4e4270 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -33,8 +33,7 @@ type Server struct { server *http.Server router *mux.Router - persistence int - persistenceLocation string + persistence int sync sync.WaitGroup } From 88844c0056cf6454c732d5b55c148db2bf15deb2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 17:23:27 +0100 Subject: [PATCH 064/495] Pull handlers into their own file --- pkg/server/handlers.go | 275 +++++++++++++++++++++++++++++++++++++++++ pkg/server/router.go | 275 +---------------------------------------- 2 files changed, 278 insertions(+), 272 deletions(-) create mode 100644 pkg/server/handlers.go diff --git a/pkg/server/handlers.go b/pkg/server/handlers.go new file mode 100644 index 0000000..a22c9da --- /dev/null +++ b/pkg/server/handlers.go @@ -0,0 +1,275 @@ +package server + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/game" + "github.com/mdiluz/rove/pkg/version" +) + +// StatusResponse is a struct that contains information on the status of the server +type StatusResponse struct { + Ready bool `json:"ready"` + Version string `json:"version"` +} + +// HandleStatus handles the /status request +func (s *Server) HandleStatus(b io.ReadCloser, w io.Writer) error { + + // Simply encode the current status + var response = StatusResponse{ + Ready: true, + Version: version.Version, + } + + // Reply with the current status + json.NewEncoder(w).Encode(response) + + return nil +} + +// BasicResponse describes the minimum dataset for a response +type BasicResponse struct { + Success bool `json:"success"` + Error string `json:"error"` +} + +// BasicAccountData describes the data to be sent for an account specific post +type BasicAccountData struct { + Id string `json:"id"` +} + +// RegisterData describes the data to send when registering +type RegisterData struct { + Name string `json:"name"` +} + +// RegisterResponse describes the response to a register request +type RegisterResponse struct { + BasicResponse + + Id string `json:"id"` +} + +// HandleRegister handles /register endpoint +func (s *Server) HandleRegister(b io.ReadCloser, w io.Writer) error { + + // Set up the response + var response = RegisterResponse{ + BasicResponse: BasicResponse{ + Success: false, + }, + } + + // Pull out the registration info + var data RegisterData + err := json.NewDecoder(b).Decode(&data) + if err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + + response.Error = err.Error() + } else if len(data.Name) == 0 { + response.Error = "Cannot register empty name" + } else { + // log the data sent + fmt.Printf("\tdata: %+v\n", data) + + // Register the account with the server + acc, err := s.accountant.RegisterAccount(data.Name) + + // If we didn't fail, respond with the account ID string + if err == nil { + response.Success = true + response.Id = acc.Id.String() + } else { + response.Error = err.Error() + } + } + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) + + return nil +} + +// SpawnData is the data to be sent for the spawn command +type SpawnData struct { + BasicAccountData +} + +// SpawnResponse is the data to respond with on a spawn command +type SpawnResponse struct { + BasicResponse + + Position game.Vector `json:"position"` +} + +// HandleSpawn will spawn the player entity for the associated account +func (s *Server) HandleSpawn(b io.ReadCloser, w io.Writer) error { + // Set up the response + var response = SpawnResponse{ + BasicResponse: BasicResponse{ + Success: false, + }, + } + + // Pull out the incoming info + var data SpawnData + if err := json.NewDecoder(b).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = "Provided account ID was invalid" + + } else { + // log the data sent + fmt.Printf("\tspawn data: %v\n", data) + + // Create a new instance + if pos, _, err := s.SpawnPrimary(id); err != nil { + response.Error = err.Error() + } else { + response.Success = true + response.Position = pos + } + } + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) + + return nil +} + +const ( + // CommandMove describes a single move command + CommandMove = "move" +) + +// Command describes a single command to execute +// it contains the type, and then any members used for each command type +type Command struct { + // Command is the main command string + Command string `json:"command"` + + // Used for CommandMove + Vector game.Vector `json:"vector"` +} + +// CommandsData is a set of commands to execute in order +type CommandsData struct { + BasicAccountData + Commands []Command `json:"commands"` +} + +// HandleSpawn will spawn the player entity for the associated account +func (s *Server) HandleCommands(b io.ReadCloser, w io.Writer) error { + // Set up the response + var response = BasicResponse{ + Success: false, + } + + // Pull out the incoming info + var data CommandsData + if err := json.NewDecoder(b).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) + + } else if inst, err := s.accountant.GetPrimary(id); err != nil { + response.Error = fmt.Sprintf("Provided account has no primary: %s", err) + + } else { + // log the data sent + fmt.Printf("\tcommands data: %v\n", data) + + // Iterate through the commands to generate all game commands + var cmds []game.Command + for _, c := range data.Commands { + switch c.Command { + case CommandMove: + cmds = append(cmds, s.world.CommandMove(inst, c.Vector)) + } + } + + // Execute the commands + if err := s.world.Execute(cmds...); err != nil { + response.Error = fmt.Sprintf("Failed to execute commands: %s", err) + } else { + response.Success = true + } + } + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) + + return nil +} + +// ViewData describes the input data to request an accounts current view +type ViewData struct { + BasicAccountData +} + +// ViewResponse describes the response to a /view call +type ViewResponse struct { + BasicResponse +} + +// HandleView handles the view request +func (s *Server) HandleView(b io.ReadCloser, w io.Writer) error { + // Set up the response + var response = ViewResponse{ + BasicResponse: BasicResponse{ + Success: false, + }, + } + + // Pull out the incoming info + var data CommandsData + if err := json.NewDecoder(b).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) + + } else { + // log the data sent + fmt.Printf("\tcommands data: %v\n", data) + + // TODO: Query the view for this account + fmt.Println(id) + } + + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + + // Reply with the current status + json.NewEncoder(w).Encode(response) + + return nil +} diff --git a/pkg/server/router.go b/pkg/server/router.go index b22b054..8a285b9 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -1,14 +1,9 @@ package server import ( - "encoding/json" "fmt" "io" "net/http" - - "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/game" - "github.com/mdiluz/rove/pkg/version" ) // RequestHandler describes a function that handles any incoming request and can respond @@ -21,8 +16,8 @@ type Route struct { handler RequestHandler } -// RequestHandlerHTTP wraps a request handler in http checks -func RequestHandlerHTTP(method string, handler RequestHandler) func(w http.ResponseWriter, r *http.Request) { +// requestHandlerHTTP wraps a request handler in http checks +func requestHandlerHTTP(method string, handler RequestHandler) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { // Log the request fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) @@ -81,270 +76,6 @@ func (s *Server) SetUpRouter() { // Set up the handlers for _, route := range routes { - s.router.HandleFunc(route.path, RequestHandlerHTTP(route.method, route.handler)) + s.router.HandleFunc(route.path, requestHandlerHTTP(route.method, route.handler)) } } - -// StatusResponse is a struct that contains information on the status of the server -type StatusResponse struct { - Ready bool `json:"ready"` - Version string `json:"version"` -} - -// HandleStatus handles the /status request -func (s *Server) HandleStatus(b io.ReadCloser, w io.Writer) error { - - // Simply encode the current status - var response = StatusResponse{ - Ready: true, - Version: version.Version, - } - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} - -// BasicResponse describes the minimum dataset for a response -type BasicResponse struct { - Success bool `json:"success"` - Error string `json:"error"` -} - -// BasicAccountData describes the data to be sent for an account specific post -type BasicAccountData struct { - Id string `json:"id"` -} - -// RegisterData describes the data to send when registering -type RegisterData struct { - Name string `json:"name"` -} - -// RegisterResponse describes the response to a register request -type RegisterResponse struct { - BasicResponse - - Id string `json:"id"` -} - -// HandleRegister handles /register endpoint -func (s *Server) HandleRegister(b io.ReadCloser, w io.Writer) error { - - // Set up the response - var response = RegisterResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, - } - - // Pull out the registration info - var data RegisterData - err := json.NewDecoder(b).Decode(&data) - if err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - - response.Error = err.Error() - } else if len(data.Name) == 0 { - response.Error = "Cannot register empty name" - } else { - // log the data sent - fmt.Printf("\tdata: %+v\n", data) - - // Register the account with the server - acc, err := s.accountant.RegisterAccount(data.Name) - - // If we didn't fail, respond with the account ID string - if err == nil { - response.Success = true - response.Id = acc.Id.String() - } else { - response.Error = err.Error() - } - } - - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} - -// SpawnData is the data to be sent for the spawn command -type SpawnData struct { - BasicAccountData -} - -// SpawnResponse is the data to respond with on a spawn command -type SpawnResponse struct { - BasicResponse - - Position game.Vector `json:"position"` -} - -// HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleSpawn(b io.ReadCloser, w io.Writer) error { - // Set up the response - var response = SpawnResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, - } - - // Pull out the incoming info - var data SpawnData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(data.Id) == 0 { - response.Error = "No account ID provided" - - } else if id, err := uuid.Parse(data.Id); err != nil { - response.Error = "Provided account ID was invalid" - - } else { - // log the data sent - fmt.Printf("\tspawn data: %v\n", data) - - // Create a new instance - if pos, _, err := s.SpawnPrimary(id); err != nil { - response.Error = err.Error() - } else { - response.Success = true - response.Position = pos - } - } - - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} - -const ( - // CommandMove describes a single move command - CommandMove = "move" -) - -// Command describes a single command to execute -// it contains the type, and then any members used for each command type -type Command struct { - // Command is the main command string - Command string `json:"command"` - - // Used for CommandMove - Vector game.Vector `json:"vector"` -} - -// CommandsData is a set of commands to execute in order -type CommandsData struct { - BasicAccountData - Commands []Command `json:"commands"` -} - -// HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleCommands(b io.ReadCloser, w io.Writer) error { - // Set up the response - var response = BasicResponse{ - Success: false, - } - - // Pull out the incoming info - var data CommandsData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(data.Id) == 0 { - response.Error = "No account ID provided" - - } else if id, err := uuid.Parse(data.Id); err != nil { - response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - - } else if inst, err := s.accountant.GetPrimary(id); err != nil { - response.Error = fmt.Sprintf("Provided account has no primary: %s", err) - - } else { - // log the data sent - fmt.Printf("\tcommands data: %v\n", data) - - // Iterate through the commands to generate all game commands - var cmds []game.Command - for _, c := range data.Commands { - switch c.Command { - case CommandMove: - cmds = append(cmds, s.world.CommandMove(inst, c.Vector)) - } - } - - // Execute the commands - if err := s.world.Execute(cmds...); err != nil { - response.Error = fmt.Sprintf("Failed to execute commands: %s", err) - } else { - response.Success = true - } - } - - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} - -// ViewData describes the input data to request an accounts current view -type ViewData struct { - BasicAccountData -} - -// ViewResponse describes the response to a /view call -type ViewResponse struct { - BasicResponse -} - -// HandleView handles the view request -func (s *Server) HandleView(b io.ReadCloser, w io.Writer) error { - // Set up the response - var response = ViewResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, - } - - // Pull out the incoming info - var data CommandsData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(data.Id) == 0 { - response.Error = "No account ID provided" - - } else if id, err := uuid.Parse(data.Id); err != nil { - response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - - } else { - // log the data sent - fmt.Printf("\tcommands data: %v\n", data) - - // TODO: Query the view for this account - fmt.Println(id) - } - - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} From 376a03606756497c2bbd1d3fddf579b1ead2479e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 17:53:25 +0100 Subject: [PATCH 065/495] Large refactor to server code to re-organise --- pkg/rove/rove.go | 77 ---------------- pkg/rove/rove_test.go | 53 ----------- pkg/server/integration_test.go | 124 ++++++++++++++++++++++++++ pkg/server/router.go | 81 ----------------- pkg/server/router_test.go | 8 +- pkg/server/{handlers.go => routes.go} | 50 +++++++++-- pkg/server/server.go | 36 +++++++- 7 files changed, 208 insertions(+), 221 deletions(-) delete mode 100644 pkg/rove/rove.go delete mode 100644 pkg/rove/rove_test.go create mode 100644 pkg/server/integration_test.go delete mode 100644 pkg/server/router.go rename pkg/server/{handlers.go => routes.go} (85%) diff --git a/pkg/rove/rove.go b/pkg/rove/rove.go deleted file mode 100644 index cdfed09..0000000 --- a/pkg/rove/rove.go +++ /dev/null @@ -1,77 +0,0 @@ -package rove - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "net/url" - - "github.com/mdiluz/rove/pkg/server" -) - -// Connection is the container for a simple connection to the server -type Connection struct { - host string -} - -// NewConnection sets up a new connection to a server host -func NewConnection(host string) *Connection { - return &Connection{ - host: host, - } -} - -// Status returns the current status of the server -func (c *Connection) Status() (status server.StatusResponse, err error) { - url := url.URL{ - Scheme: "http", - Host: c.host, - Path: "status", - } - - if resp, err := http.Get(url.String()); err != nil { - return server.StatusResponse{}, err - } else if resp.StatusCode != http.StatusOK { - return server.StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) - } else { - err = json.NewDecoder(resp.Body).Decode(&status) - } - - return -} - -// Register registers a new account on the server -func (c *Connection) Register(name string) (register server.RegisterResponse, err error) { - url := url.URL{ - Scheme: "http", - Host: c.host, - Path: "register", - } - - // Marshal the register data struct - data := server.RegisterData{Name: name} - marshalled, err := json.Marshal(data) - - // Set up the request - req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) - req.Header.Set("Content-Type", "application/json") - - // Do the request - client := &http.Client{} - if resp, err := client.Do(req); err != nil { - return server.RegisterResponse{}, err - } else { - defer resp.Body.Close() - - // Handle any errors - if resp.StatusCode != http.StatusOK { - return server.RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) - } else { - // Decode the reply - err = json.NewDecoder(resp.Body).Decode(®ister) - } - } - - return -} diff --git a/pkg/rove/rove_test.go b/pkg/rove/rove_test.go deleted file mode 100644 index d5362dd..0000000 --- a/pkg/rove/rove_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build integration - -package rove - -import ( - "testing" - - "github.com/google/uuid" -) - -var serverUrl = "localhost:80" - -func TestStatus(t *testing.T) { - conn := NewConnection(serverUrl) - - if status, err := conn.Status(); err != nil { - t.Errorf("Status returned error: %s", err) - } else if !status.Ready { - t.Error("Server did not return that it was ready") - } else if len(status.Version) == 0 { - t.Error("Server returned blank version") - } -} - -func TestRegister(t *testing.T) { - conn := NewConnection(serverUrl) - - a := uuid.New().String() - reg1, err := conn.Register(a) - if err != nil { - t.Errorf("Register returned error: %s", err) - } else if !reg1.Success { - t.Error("Server did not success for Register") - } else if len(reg1.Id) == 0 { - t.Error("Server returned empty registration ID") - } - - b := uuid.New().String() - reg2, err := conn.Register(b) - if err != nil { - t.Errorf("Register returned error: %s", err) - } else if !reg2.Success { - t.Error("Server did not success for Register") - } else if len(reg2.Id) == 0 { - t.Error("Server returned empty registration ID") - } - - if reg2, err := conn.Register(a); err != nil { - t.Errorf("Register returned error: %s", err) - } else if reg2.Success { - t.Error("Server should have failed to register duplicate name") - } -} diff --git a/pkg/server/integration_test.go b/pkg/server/integration_test.go new file mode 100644 index 0000000..7448abf --- /dev/null +++ b/pkg/server/integration_test.go @@ -0,0 +1,124 @@ +// +build integration + +package server + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/url" + "testing" + + "github.com/google/uuid" +) + +var serverUrl = "localhost:80" + +// Connection is the container for a simple connection to the server +type Connection struct { + host string +} + +// NewConnection sets up a new connection to a server host +func NewConnection(host string) *Connection { + return &Connection{ + host: host, + } +} + +// Status returns the current status of the server +func (c *Connection) Status() (status StatusResponse, err error) { + url := url.URL{ + Scheme: "http", + Host: c.host, + Path: "status", + } + + if resp, err := http.Get(url.String()); err != nil { + return StatusResponse{}, err + } else if resp.StatusCode != http.StatusOK { + return StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + } else { + err = json.NewDecoder(resp.Body).Decode(&status) + } + + return +} + +// Register registers a new account on the server +func (c *Connection) Register(name string) (register RegisterResponse, err error) { + url := url.URL{ + Scheme: "http", + Host: c.host, + Path: "register", + } + + // Marshal the register data struct + data := RegisterData{Name: name} + marshalled, err := json.Marshal(data) + + // Set up the request + req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) + req.Header.Set("Content-Type", "application/json") + + // Do the request + client := &http.Client{} + if resp, err := client.Do(req); err != nil { + return RegisterResponse{}, err + } else { + defer resp.Body.Close() + + // Handle any errors + if resp.StatusCode != http.StatusOK { + return RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) + } else { + // Decode the reply + err = json.NewDecoder(resp.Body).Decode(®ister) + } + } + + return +} + +func TestStatus(t *testing.T) { + conn := NewConnection(serverUrl) + + if status, err := conn.Status(); err != nil { + t.Errorf("Status returned error: %s", err) + } else if !status.Ready { + t.Error("Server did not return that it was ready") + } else if len(status.Version) == 0 { + t.Error("Server returned blank version") + } +} + +func TestRegister(t *testing.T) { + conn := NewConnection(serverUrl) + + a := uuid.New().String() + reg1, err := conn.Register(a) + if err != nil { + t.Errorf("Register returned error: %s", err) + } else if !reg1.Success { + t.Error("Server did not success for Register") + } else if len(reg1.Id) == 0 { + t.Error("Server returned empty registration ID") + } + + b := uuid.New().String() + reg2, err := conn.Register(b) + if err != nil { + t.Errorf("Register returned error: %s", err) + } else if !reg2.Success { + t.Error("Server did not success for Register") + } else if len(reg2.Id) == 0 { + t.Error("Server returned empty registration ID") + } + + if reg2, err := conn.Register(a); err != nil { + t.Errorf("Register returned error: %s", err) + } else if reg2.Success { + t.Error("Server should have failed to register duplicate name") + } +} diff --git a/pkg/server/router.go b/pkg/server/router.go deleted file mode 100644 index 8a285b9..0000000 --- a/pkg/server/router.go +++ /dev/null @@ -1,81 +0,0 @@ -package server - -import ( - "fmt" - "io" - "net/http" -) - -// RequestHandler describes a function that handles any incoming request and can respond -type RequestHandler func(io.ReadCloser, io.Writer) error - -// Route defines the information for a single path->function route -type Route struct { - path string - method string - handler RequestHandler -} - -// requestHandlerHTTP wraps a request handler in http checks -func requestHandlerHTTP(method string, handler RequestHandler) func(w http.ResponseWriter, r *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - // Log the request - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - - // Verify we're hit with the right method - if r.Method != method { - w.WriteHeader(http.StatusMethodNotAllowed) - - } else if err := handler(r.Body, w); err != nil { - // Log the error - fmt.Printf("Failed to handle http request: %s", err) - - // Respond that we've had an error - w.WriteHeader(http.StatusInternalServerError) - - } else { - // Be a good citizen and set the header for the return - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) - - } - } -} - -// NewRouter sets up the server mux -func (s *Server) SetUpRouter() { - - // Array of all our routes - var routes = []Route{ - { - path: "/status", - method: http.MethodGet, - handler: s.HandleStatus, - }, - { - path: "/register", - method: http.MethodPost, - handler: s.HandleRegister, - }, - { - path: "/spawn", - method: http.MethodPost, - handler: s.HandleSpawn, - }, - { - path: "/commands", - method: http.MethodPost, - handler: s.HandleCommands, - }, - { - path: "/view", - method: http.MethodPost, - handler: s.HandleView, - }, - } - - // Set up the handlers - for _, route := range routes { - s.router.HandleFunc(route.path, requestHandlerHTTP(route.method, route.handler)) - } -} diff --git a/pkg/server/router_test.go b/pkg/server/router_test.go index 19664b0..eb26864 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/router_test.go @@ -16,7 +16,7 @@ func TestHandleStatus(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - RequestHandlerHTTP(http.MethodGet, s.HandleStatus)(response, request) + s.wrapHandler(http.MethodGet, HandleStatus)(response, request) var status StatusResponse json.NewDecoder(response.Body).Decode(&status) @@ -41,7 +41,7 @@ func TestHandleRegister(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - RequestHandlerHTTP(http.MethodPost, s.HandleRegister)(response, request) + s.wrapHandler(http.MethodPost, HandleRegister)(response, request) var status RegisterResponse json.NewDecoder(response.Body).Decode(&status) @@ -63,7 +63,7 @@ func TestHandleSpawn(t *testing.T) { request, _ := http.NewRequest(http.MethodPost, "/spawn", bytes.NewReader(b)) response := httptest.NewRecorder() - RequestHandlerHTTP(http.MethodPost, s.HandleSpawn)(response, request) + s.wrapHandler(http.MethodPost, HandleSpawn)(response, request) var status SpawnResponse json.NewDecoder(response.Body).Decode(&status) @@ -99,7 +99,7 @@ func TestHandleCommands(t *testing.T) { request, _ := http.NewRequest(http.MethodPost, "/commands", bytes.NewReader(b)) response := httptest.NewRecorder() - RequestHandlerHTTP(http.MethodPost, s.HandleCommands)(response, request) + s.wrapHandler(http.MethodPost, HandleCommands)(response, request) var status BasicResponse json.NewDecoder(response.Body).Decode(&status) diff --git a/pkg/server/handlers.go b/pkg/server/routes.go similarity index 85% rename from pkg/server/handlers.go rename to pkg/server/routes.go index a22c9da..c18018d 100644 --- a/pkg/server/handlers.go +++ b/pkg/server/routes.go @@ -4,12 +4,52 @@ import ( "encoding/json" "fmt" "io" + "net/http" "github.com/google/uuid" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/version" ) +// Handler describes a function that handles any incoming request and can respond +type Handler func(*Server, io.ReadCloser, io.Writer) error + +// Route defines the information for a single path->function route +type Route struct { + path string + method string + handler Handler +} + +// Routes is an array of all the Routes +var Routes = []Route{ + { + path: "/status", + method: http.MethodGet, + handler: HandleStatus, + }, + { + path: "/register", + method: http.MethodPost, + handler: HandleRegister, + }, + { + path: "/spawn", + method: http.MethodPost, + handler: HandleSpawn, + }, + { + path: "/commands", + method: http.MethodPost, + handler: HandleCommands, + }, + { + path: "/view", + method: http.MethodPost, + handler: HandleView, + }, +} + // StatusResponse is a struct that contains information on the status of the server type StatusResponse struct { Ready bool `json:"ready"` @@ -17,7 +57,7 @@ type StatusResponse struct { } // HandleStatus handles the /status request -func (s *Server) HandleStatus(b io.ReadCloser, w io.Writer) error { +func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) error { // Simply encode the current status var response = StatusResponse{ @@ -55,7 +95,7 @@ type RegisterResponse struct { } // HandleRegister handles /register endpoint -func (s *Server) HandleRegister(b io.ReadCloser, w io.Writer) error { +func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = RegisterResponse{ @@ -111,7 +151,7 @@ type SpawnResponse struct { } // HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleSpawn(b io.ReadCloser, w io.Writer) error { +func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = SpawnResponse{ BasicResponse: BasicResponse{ @@ -175,7 +215,7 @@ type CommandsData struct { } // HandleSpawn will spawn the player entity for the associated account -func (s *Server) HandleCommands(b io.ReadCloser, w io.Writer) error { +func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = BasicResponse{ Success: false, @@ -237,7 +277,7 @@ type ViewResponse struct { } // HandleView handles the view request -func (s *Server) HandleView(b io.ReadCloser, w io.Writer) error { +func HandleView(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = ViewResponse{ BasicResponse: BasicResponse{ diff --git a/pkg/server/server.go b/pkg/server/server.go index a4e4270..6d2eb69 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -93,7 +93,7 @@ func (s *Server) Initialise() error { } // Create a new router - s.SetUpRouter() + s.CreateRoutes() fmt.Printf("Routes Created\n") // Add to our sync @@ -134,6 +134,40 @@ func (s *Server) Close() error { return nil } +// wrapHandler wraps a request handler in http checks +func (s *Server) wrapHandler(method string, handler Handler) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + // Log the request + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + + // Verify we're hit with the right method + if r.Method != method { + w.WriteHeader(http.StatusMethodNotAllowed) + + } else if err := handler(s, r.Body, w); err != nil { + // Log the error + fmt.Printf("Failed to handle http request: %s", err) + + // Respond that we've had an error + w.WriteHeader(http.StatusInternalServerError) + + } else { + // Be a good citizen and set the header for the return + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) + + } + } +} + +// CreateRoutes sets up the server mux +func (s *Server) CreateRoutes() { + // Set up the handlers + for _, route := range Routes { + s.router.HandleFunc(route.path, s.wrapHandler(route.method, route.handler)) + } +} + // SpawnPrimary spawns the primary instance for an account func (s *Server) SpawnPrimary(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { inst := uuid.New() From de1b3c36e205c18cc99be9649a86e070e48f7619 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:02:41 +0100 Subject: [PATCH 066/495] Clean up integration tests --- pkg/server/integration_test.go | 87 ++++++++++------------------------ 1 file changed, 26 insertions(+), 61 deletions(-) diff --git a/pkg/server/integration_test.go b/pkg/server/integration_test.go index 7448abf..42ea5a0 100644 --- a/pkg/server/integration_test.go +++ b/pkg/server/integration_test.go @@ -11,46 +11,35 @@ import ( "testing" "github.com/google/uuid" + "github.com/stretchr/testify/assert" ) var serverUrl = "localhost:80" -// Connection is the container for a simple connection to the server -type Connection struct { - host string -} - -// NewConnection sets up a new connection to a server host -func NewConnection(host string) *Connection { - return &Connection{ - host: host, - } -} - -// Status returns the current status of the server -func (c *Connection) Status() (status StatusResponse, err error) { +func TestStatus(t *testing.T) { url := url.URL{ Scheme: "http", - Host: c.host, + Host: serverUrl, Path: "status", } + resp, err := http.Get(url.String()) + assert.NoError(t, err, "http.Get must not return error") + assert.Equal(t, http.StatusOK, resp.StatusCode, "http.Get must return StatusOK") - if resp, err := http.Get(url.String()); err != nil { - return StatusResponse{}, err - } else if resp.StatusCode != http.StatusOK { - return StatusResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) - } else { - err = json.NewDecoder(resp.Body).Decode(&status) - } + var status StatusResponse + err = json.NewDecoder(resp.Body).Decode(&status) + assert.NoError(t, err, "json decode must not return error") - return + assert.NoError(t, err, "Status must not return error") + assert.True(t, status.Ready, "Server must return ready") + assert.NotZero(t, len(status.Version), "Version must not be empty") } -// Register registers a new account on the server -func (c *Connection) Register(name string) (register RegisterResponse, err error) { +// helper for register test +func register(name string) (register RegisterResponse, err error) { url := url.URL{ Scheme: "http", - Host: c.host, + Host: serverUrl, Path: "register", } @@ -81,44 +70,20 @@ func (c *Connection) Register(name string) (register RegisterResponse, err error return } -func TestStatus(t *testing.T) { - conn := NewConnection(serverUrl) - - if status, err := conn.Status(); err != nil { - t.Errorf("Status returned error: %s", err) - } else if !status.Ready { - t.Error("Server did not return that it was ready") - } else if len(status.Version) == 0 { - t.Error("Server returned blank version") - } -} - func TestRegister(t *testing.T) { - conn := NewConnection(serverUrl) - a := uuid.New().String() - reg1, err := conn.Register(a) - if err != nil { - t.Errorf("Register returned error: %s", err) - } else if !reg1.Success { - t.Error("Server did not success for Register") - } else if len(reg1.Id) == 0 { - t.Error("Server returned empty registration ID") - } + reg1, err := register(a) + assert.NoError(t, err, "Register must not return error") + assert.True(t, reg1.Success, "Register must return success") + assert.NotZero(t, len(reg1.Id), "Register must return registration ID") b := uuid.New().String() - reg2, err := conn.Register(b) - if err != nil { - t.Errorf("Register returned error: %s", err) - } else if !reg2.Success { - t.Error("Server did not success for Register") - } else if len(reg2.Id) == 0 { - t.Error("Server returned empty registration ID") - } + reg2, err := register(b) + assert.NoError(t, err, "Register must not return error") + assert.True(t, reg2.Success, "Register must return success") + assert.NotZero(t, len(reg2.Id), "Register must return registration ID") - if reg2, err := conn.Register(a); err != nil { - t.Errorf("Register returned error: %s", err) - } else if reg2.Success { - t.Error("Server should have failed to register duplicate name") - } + reg2, err = register(a) + assert.NoError(t, err, "Register must not return error") + assert.False(t, reg2.Success, "Register must return fail for duplicate registration") } From da9d71bcc0fd63aa00d4838ba5be4a1bb14978f5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:10:41 +0100 Subject: [PATCH 067/495] Update the PoC todo list --- docs/poc.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/poc.md b/docs/poc.md index 1e94bd4..6e098ab 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -5,11 +5,12 @@ For a proof of concept we'll implement a very small subset of the final features ### Core Features -* Create an account -* Control an entity in a 2D map +* Create an account (done) +* Control an entity in a 2D map (done) * Query for what the entity can see -* Persistent accounts and world -* Multiple users +* Persistent accounts and world (done) +* Multiple users (done) +* Populate map with locations/objects ### Stretch goals From 6f248f1bd26f2a766ce9a34b50d809f68e3cff02 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:10:55 +0100 Subject: [PATCH 068/495] Small server refactor and rename --- pkg/server/routes.go | 2 +- pkg/server/server.go | 19 ++++++------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index c18018d..1e503d1 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -176,7 +176,7 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { fmt.Printf("\tspawn data: %v\n", data) // Create a new instance - if pos, _, err := s.SpawnPrimary(id); err != nil { + if pos, _, err := s.SpawnPrimaryForAccount(id); err != nil { response.Error = err.Error() } else { response.Success = true diff --git a/pkg/server/server.go b/pkg/server/server.go index 6d2eb69..dc94a21 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -92,9 +92,10 @@ func (s *Server) Initialise() error { } } - // Create a new router - s.CreateRoutes() - fmt.Printf("Routes Created\n") + // Set up the handlers + for _, route := range Routes { + s.router.HandleFunc(route.path, s.wrapHandler(route.method, route.handler)) + } // Add to our sync s.sync.Add(1) @@ -160,16 +161,8 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons } } -// CreateRoutes sets up the server mux -func (s *Server) CreateRoutes() { - // Set up the handlers - for _, route := range Routes { - s.router.HandleFunc(route.path, s.wrapHandler(route.method, route.handler)) - } -} - -// SpawnPrimary spawns the primary instance for an account -func (s *Server) SpawnPrimary(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { +// SpawnPrimaryForAccount spawns the primary instance for an account +func (s *Server) SpawnPrimaryForAccount(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { inst := uuid.New() s.world.Spawn(inst) if pos, err := s.world.GetPosition(inst); err != nil { From 79914ba728e34a745e5e27043dc6c0d134dde82d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:30:40 +0100 Subject: [PATCH 069/495] Fix name of routes file And fix function name --- pkg/server/{router_test.go => routes_test.go} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename pkg/server/{router_test.go => routes_test.go} (98%) diff --git a/pkg/server/router_test.go b/pkg/server/routes_test.go similarity index 98% rename from pkg/server/router_test.go rename to pkg/server/routes_test.go index eb26864..3bffa97 100644 --- a/pkg/server/router_test.go +++ b/pkg/server/routes_test.go @@ -79,7 +79,7 @@ func TestHandleCommands(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn the primary instance for the account - _, inst, err := s.SpawnPrimary(a.Id) + _, inst, err := s.SpawnPrimaryForAccount(a.Id) move := game.Vector{X: 1, Y: 2, Z: 3} From 4126da61cc580bfc476b326c65a5a98354425752 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:36:26 +0100 Subject: [PATCH 070/495] Simplify API calls and pull them out to their own file --- pkg/server/api.go | 88 +++++++++++++++++++++++++++++++++++++++ pkg/server/routes.go | 86 ++------------------------------------ pkg/server/routes_test.go | 6 +-- 3 files changed, 95 insertions(+), 85 deletions(-) create mode 100644 pkg/server/api.go diff --git a/pkg/server/api.go b/pkg/server/api.go new file mode 100644 index 0000000..2b6c704 --- /dev/null +++ b/pkg/server/api.go @@ -0,0 +1,88 @@ +package server + +import "github.com/mdiluz/rove/pkg/game" + +// ================ +// API: /status + +// StatusResponse is a struct that contains information on the status of the server +type StatusResponse struct { + Ready bool `json:"ready"` + Version string `json:"version"` +} + +// ================ +// API: /register + +// RegisterData describes the data to send when registering +type RegisterData struct { + Name string `json:"name"` +} + +// RegisterResponse describes the response to a register request +type RegisterResponse struct { + Success bool `json:"success"` + Error string `json:"error"` + + Id string `json:"id"` +} + +// ================ +// API: /spawn + +// SpawnData is the data to be sent for the spawn command +type SpawnData struct { + Id string `json:"id"` +} + +// SpawnResponse is the data to respond with on a spawn command +type SpawnResponse struct { + Success bool `json:"success"` + Error string `json:"error"` + + Position game.Vector `json:"position"` +} + +// ================ +// API: /commands + +// CommandsData is a set of commands to execute in order +type CommandsData struct { + Id string `json:"id"` + Commands []Command `json:"commands"` +} + +// CommandsResponse is the response to be sent back +type CommandsResponse struct { + Success bool `json:"success"` + Error string `json:"error"` +} + +const ( + // CommandMove describes a single move command + CommandMove = "move" +) + +// Command describes a single command to execute +// it contains the type, and then any members used for each command type +type Command struct { + // Command is the main command string + Command string `json:"command"` + + // Used for CommandMove + Vector game.Vector `json:"vector"` +} + +// ================ +// API: /view + +// ViewData describes the input data to request an accounts current view +type ViewData struct { + Id string `json:"id"` +} + +// ViewResponse describes the response to a /view call +type ViewResponse struct { + Success bool `json:"success"` + Error string `json:"error"` +} diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 1e503d1..9a4fa45 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -50,12 +50,6 @@ var Routes = []Route{ }, } -// StatusResponse is a struct that contains information on the status of the server -type StatusResponse struct { - Ready bool `json:"ready"` - Version string `json:"version"` -} - // HandleStatus handles the /status request func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) error { @@ -71,37 +65,12 @@ func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) error { return nil } -// BasicResponse describes the minimum dataset for a response -type BasicResponse struct { - Success bool `json:"success"` - Error string `json:"error"` -} - -// BasicAccountData describes the data to be sent for an account specific post -type BasicAccountData struct { - Id string `json:"id"` -} - -// RegisterData describes the data to send when registering -type RegisterData struct { - Name string `json:"name"` -} - -// RegisterResponse describes the response to a register request -type RegisterResponse struct { - BasicResponse - - Id string `json:"id"` -} - // HandleRegister handles /register endpoint func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = RegisterResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, + Success: false, } // Pull out the registration info @@ -138,25 +107,11 @@ func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { return nil } -// SpawnData is the data to be sent for the spawn command -type SpawnData struct { - BasicAccountData -} - -// SpawnResponse is the data to respond with on a spawn command -type SpawnResponse struct { - BasicResponse - - Position game.Vector `json:"position"` -} - // HandleSpawn will spawn the player entity for the associated account func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = SpawnResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, + Success: false, } // Pull out the incoming info @@ -193,31 +148,10 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { return nil } -const ( - // CommandMove describes a single move command - CommandMove = "move" -) - -// Command describes a single command to execute -// it contains the type, and then any members used for each command type -type Command struct { - // Command is the main command string - Command string `json:"command"` - - // Used for CommandMove - Vector game.Vector `json:"vector"` -} - -// CommandsData is a set of commands to execute in order -type CommandsData struct { - BasicAccountData - Commands []Command `json:"commands"` -} - // HandleSpawn will spawn the player entity for the associated account func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response - var response = BasicResponse{ + var response = CommandsResponse{ Success: false, } @@ -266,23 +200,11 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { return nil } -// ViewData describes the input data to request an accounts current view -type ViewData struct { - BasicAccountData -} - -// ViewResponse describes the response to a /view call -type ViewResponse struct { - BasicResponse -} - // HandleView handles the view request func HandleView(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response var response = ViewResponse{ - BasicResponse: BasicResponse{ - Success: false, - }, + Success: false, } // Pull out the incoming info diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 3bffa97..cd47bb6 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -55,7 +55,7 @@ func TestHandleSpawn(t *testing.T) { s := NewServer() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") - data := SpawnData{BasicAccountData: BasicAccountData{Id: a.Id.String()}} + data := SpawnData{Id: a.Id.String()} b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") @@ -84,7 +84,7 @@ func TestHandleCommands(t *testing.T) { move := game.Vector{X: 1, Y: 2, Z: 3} data := CommandsData{ - BasicAccountData: BasicAccountData{Id: a.Id.String()}, + Id: a.Id.String(), Commands: []Command{ { Command: CommandMove, @@ -101,7 +101,7 @@ func TestHandleCommands(t *testing.T) { s.wrapHandler(http.MethodPost, HandleCommands)(response, request) - var status BasicResponse + var status CommandsResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { From d0a5b91de7d1164b9e3efe2f864af02a944d73bf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:39:36 +0100 Subject: [PATCH 071/495] Describe each api method --- pkg/server/api.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/pkg/server/api.go b/pkg/server/api.go index 2b6c704..e73eed1 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -2,8 +2,9 @@ package server import "github.com/mdiluz/rove/pkg/game" -// ================ -// API: /status +// ============================== +// API: /status method: GET +// Queries the status of the server // StatusResponse is a struct that contains information on the status of the server type StatusResponse struct { @@ -11,8 +12,10 @@ type StatusResponse struct { Version string `json:"version"` } -// ================ -// API: /register +// ============================== +// API: /register method: POST +// Registers a user account by name +// Responds with a unique ID for that account to be used in future requests // RegisterData describes the data to send when registering type RegisterData struct { @@ -27,8 +30,10 @@ type RegisterResponse struct { Id string `json:"id"` } -// ================ -// API: /spawn +// ============================== +// API: /spawn method: POST +// Spawns the primary entity for an account +// Responds with the position of said entity // SpawnData is the data to be sent for the spawn command type SpawnData struct { @@ -43,8 +48,9 @@ type SpawnResponse struct { Position game.Vector `json:"position"` } -// ================ -// API: /commands +// ============================== +// API: /commands method: POST +// Issues a set of commands from the user // CommandsData is a set of commands to execute in order type CommandsData struct { @@ -74,7 +80,8 @@ type Command struct { } // ================ -// API: /view +// API: /view POST +// Queries the current view for the user // ViewData describes the input data to request an accounts current view type ViewData struct { From 33f25a741428c7d0b8b6475581d1bb1f2401186d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 18:54:33 +0100 Subject: [PATCH 072/495] Prepare to refactor movement to be based on attributes --- pkg/game/command.go | 9 +++++---- pkg/game/command_test.go | 26 +++++++++++--------------- pkg/game/geom.go | 2 -- pkg/game/world.go | 26 +++++++++++++++----------- pkg/game/world_test.go | 1 - pkg/server/api.go | 9 +++++---- pkg/server/routes.go | 5 +++-- pkg/server/routes_test.go | 14 ++++++-------- 8 files changed, 45 insertions(+), 47 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index ef7bece..567a260 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -6,11 +6,12 @@ import "github.com/google/uuid" type Command func() error // CommandMove will move the instance in question -func (w *World) CommandMove(id uuid.UUID, vec Vector) Command { +func (w *World) CommandMove(id uuid.UUID, bearing float64, duration int64) Command { return func() error { - // Move the instance - _, err := w.MovePosition(id, vec) - return err + // TODO: Calculate the move itself + + //_, err := w.MovePosition(id, vec) + return nil } } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 0bb51b3..788afd1 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -16,7 +16,7 @@ func TestCommand_Spawn(t *testing.T) { instance, ok := world.Instances[a] assert.True(t, ok, "No new instance in world") - assert.Equal(t, a, instance.id, "New instance has incorrect id") + assert.Equal(t, a, instance.Id, "New instance has incorrect id") } func TestCommand_Move(t *testing.T) { @@ -27,24 +27,20 @@ func TestCommand_Move(t *testing.T) { pos := Vector{ X: 1.0, Y: 2.0, - Z: 3.0, } err := world.SetPosition(a, pos) assert.NoError(t, err, "Failed to set position for instance") - move := Vector{ - X: 3.0, - Y: 2.0, - Z: 1.0, - } + // TODO: Test the bearing/duration movement + /* + // Try the move command + moveCommand := world.CommandMove(a, move) + assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") - // Try the move command - moveCommand := world.CommandMove(a, move) - assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") - - newpos, err := world.GetPosition(a) - assert.NoError(t, err, "Failed to set position for instance") - pos.Add(move) - assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") + newpos, err := world.GetPosition(a) + assert.NoError(t, err, "Failed to set position for instance") + pos.Add(move) + assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") + */ } diff --git a/pkg/game/geom.go b/pkg/game/geom.go index 585799f..7d45198 100644 --- a/pkg/game/geom.go +++ b/pkg/game/geom.go @@ -4,12 +4,10 @@ package game type Vector struct { X float64 `json:"x"` Y float64 `json:"y"` - Z float64 `json:"z"` } // Add adds one vector to another func (v *Vector) Add(v2 Vector) { v.X += v2.X v.Y += v2.Y - v.Z += v2.Z } diff --git a/pkg/game/world.go b/pkg/game/world.go index b3b00ad..bc50bae 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -14,15 +14,19 @@ type World struct { // Instance describes a single entity or instance of an entity in the world type Instance struct { - // id is a unique ID for this instance - id uuid.UUID + // Id is a unique ID for this instance + Id uuid.UUID `json:"id"` - // pos represents where this instance is in the world - pos Vector + // Pos represents where this instance is in the world + Pos Vector `json:"pos"` + + // Speed represents the Speed that the instance will move per second + Speed float64 `json:"speed"` + + // Sight represents the distance the unit can see + Sight float64 `json:"sight"` } -const kWorldFileName = "rove-world.json" - // NewWorld creates a new world object func NewWorld() *World { return &World{ @@ -38,7 +42,7 @@ func (w *World) Spawn(id uuid.UUID) error { // Initialise the instance instance := Instance{ - id: id, + Id: id, } // Append the instance to the list @@ -60,7 +64,7 @@ func (w *World) DestroyInstance(id uuid.UUID) error { // GetPosition returns the position of a given instance func (w World) GetPosition(id uuid.UUID) (Vector, error) { if i, ok := w.Instances[id]; ok { - return i.pos, nil + return i.Pos, nil } else { return Vector{}, fmt.Errorf("no instance matching id") } @@ -69,7 +73,7 @@ func (w World) GetPosition(id uuid.UUID) (Vector, error) { // SetPosition sets an instances position func (w *World) SetPosition(id uuid.UUID, pos Vector) error { if i, ok := w.Instances[id]; ok { - i.pos = pos + i.Pos = pos w.Instances[id] = i return nil } else { @@ -80,9 +84,9 @@ func (w *World) SetPosition(id uuid.UUID, pos Vector) error { // SetPosition sets an instances position func (w *World) MovePosition(id uuid.UUID, vec Vector) (Vector, error) { if i, ok := w.Instances[id]; ok { - i.pos.Add(vec) + i.Pos.Add(vec) w.Instances[id] = i - return i.pos, nil + return i.Pos, nil } else { return Vector{}, fmt.Errorf("no instance matching id") } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index b351377..5ff5e28 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -56,7 +56,6 @@ func TestWorld_GetSetMovePosition(t *testing.T) { pos := Vector{ X: 1.0, Y: 2.0, - Z: 3.0, } err := world.SetPosition(a, pos) diff --git a/pkg/server/api.go b/pkg/server/api.go index e73eed1..16e7328 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -1,7 +1,5 @@ package server -import "github.com/mdiluz/rove/pkg/game" - // ============================== // API: /status method: GET // Queries the status of the server @@ -45,7 +43,9 @@ type SpawnResponse struct { Success bool `json:"success"` Error string `json:"error"` - Position game.Vector `json:"position"` + // The location of the spawned entity + X float64 `json:"x"` + Y float64 `json:"y"` } // ============================== @@ -76,7 +76,8 @@ type Command struct { Command string `json:"command"` // Used for CommandMove - Vector game.Vector `json:"vector"` + Bearing float64 `json:"bearing"` // The direction to move in degrees + Duration int64 `json:"duration"` // The duration of the move in seconds } // ================ diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 9a4fa45..ae4852f 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -135,7 +135,8 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { response.Error = err.Error() } else { response.Success = true - response.Position = pos + response.X = pos.X + response.Y = pos.Y } } @@ -179,7 +180,7 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { for _, c := range data.Commands { switch c.Command { case CommandMove: - cmds = append(cmds, s.world.CommandMove(inst, c.Vector)) + cmds = append(cmds, s.world.CommandMove(inst, c.Bearing, c.Duration)) } } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index cd47bb6..f54e961 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -7,7 +7,6 @@ import ( "net/http/httptest" "testing" - "github.com/mdiluz/rove/pkg/game" "github.com/stretchr/testify/assert" ) @@ -81,14 +80,13 @@ func TestHandleCommands(t *testing.T) { // Spawn the primary instance for the account _, inst, err := s.SpawnPrimaryForAccount(a.Id) - move := game.Vector{X: 1, Y: 2, Z: 3} - data := CommandsData{ Id: a.Id.String(), Commands: []Command{ { - Command: CommandMove, - Vector: move, + Command: CommandMove, + Bearing: 0.0, + Duration: 1, }, }, } @@ -108,9 +106,9 @@ func TestHandleCommands(t *testing.T) { t.Errorf("got false for /commands") } - if pos, err := s.world.GetPosition(inst); err != nil { + if _, err := s.world.GetPosition(inst); err != nil { t.Error("Couldn't get position for the primary instance") - } else if pos != move { - t.Error("Mismatched position after commands") } + + // TODO: Check position is correct } From 0fbad15c01d213acc522cce5b0bf7678b4b63063 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 21:17:43 +0100 Subject: [PATCH 073/495] Huge Instance -> Rover refactor, for clarification --- pkg/accounts/accounts.go | 16 ++++----- pkg/accounts/accounts_test.go | 16 ++++----- pkg/game/command.go | 6 ++-- pkg/game/command_test.go | 14 ++++---- pkg/game/world.go | 64 +++++++++++++++++------------------ pkg/game/world_test.go | 42 +++++++++++------------ pkg/server/api.go | 4 +-- pkg/server/routes.go | 8 ++--- pkg/server/routes_test.go | 6 ++-- pkg/server/server.go | 16 ++++----- 10 files changed, 96 insertions(+), 96 deletions(-) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 99fa47e..a961840 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -16,8 +16,8 @@ type Account struct { // Id represents a unique ID per account and is set one registered Id uuid.UUID `json:"id"` - // Primary represents the primary instance that this account owns - Primary uuid.UUID `json:"primary"` + // Rover represents the rover that this account owns + Rover uuid.UUID `json:"rover"` } // Represents the accountant data to store @@ -58,12 +58,12 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { return } -// AssignPrimary assigns primary ownership of an instance to an account -func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error { +// AssignRover assigns rover ownership of an rover to an account +func (a *Accountant) AssignRover(account uuid.UUID, rover uuid.UUID) error { // Find the account matching the ID if this, ok := a.Accounts[account]; ok { - this.Primary = instance + this.Rover = rover a.Accounts[account] = this } else { return fmt.Errorf("no account found for id: %s", account) @@ -72,11 +72,11 @@ func (a *Accountant) AssignPrimary(account uuid.UUID, instance uuid.UUID) error return nil } -// GetPrimary gets the primary instance for the account -func (a *Accountant) GetPrimary(account uuid.UUID) (uuid.UUID, error) { +// GetRover gets the rover rover for the account +func (a *Accountant) GetRover(account uuid.UUID) (uuid.UUID, error) { // Find the account matching the ID if this, ok := a.Accounts[account]; ok { - return this.Primary, nil + return this.Rover, nil } return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) } diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 6597ab5..3ab9795 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -48,7 +48,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } } -func TestAccountant_AssignGetPrimary(t *testing.T) { +func TestAccountant_AssignGetRover(t *testing.T) { accountant := NewAccountant() if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") @@ -62,14 +62,14 @@ func TestAccountant_AssignGetPrimary(t *testing.T) { inst := uuid.New() - err = accountant.AssignPrimary(a.Id, inst) + err = accountant.AssignRover(a.Id, inst) if err != nil { - t.Error("Failed to set primary for created account") - } else if accountant.Accounts[a.Id].Primary != inst { - t.Error("Primary for assigned account is incorrect") - } else if id, err := accountant.GetPrimary(a.Id); err != nil { - t.Error("Failed to get primary for account") + t.Error("Failed to set rover for created account") + } else if accountant.Accounts[a.Id].Rover != inst { + t.Error("Rover for assigned account is incorrect") + } else if id, err := accountant.GetRover(a.Id); err != nil { + t.Error("Failed to get rover for account") } else if id != inst { - t.Error("Fetched primary is incorrect for account") + t.Error("Fetched rover is incorrect for account") } } diff --git a/pkg/game/command.go b/pkg/game/command.go index 567a260..18173e7 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -2,10 +2,10 @@ package game import "github.com/google/uuid" -// A command is simply a function that acts on the a given instance in the world +// A command is simply a function that acts on the a given rover in the world type Command func() error -// CommandMove will move the instance in question +// CommandMove will move the rover in question func (w *World) CommandMove(id uuid.UUID, bearing float64, duration int64) Command { return func() error { // TODO: Calculate the move itself @@ -19,6 +19,6 @@ func (w *World) CommandMove(id uuid.UUID, bearing float64, duration int64) Comma // TODO: Two spawn commands with the same id could trigger a fail later on, we should prevent that somehow func (w *World) CommandSpawn(id uuid.UUID) Command { return func() error { - return w.Spawn(id) + return w.SpawnRover(id) } } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 788afd1..0fd2580 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -14,15 +14,15 @@ func TestCommand_Spawn(t *testing.T) { spawnCommand := world.CommandSpawn(a) assert.NoError(t, world.Execute(spawnCommand), "Failed to execute spawn command") - instance, ok := world.Instances[a] - assert.True(t, ok, "No new instance in world") - assert.Equal(t, a, instance.Id, "New instance has incorrect id") + rover, ok := world.Rovers[a] + assert.True(t, ok, "No new rover in world") + assert.Equal(t, a, rover.Id, "New rover has incorrect id") } func TestCommand_Move(t *testing.T) { world := NewWorld() a := uuid.New() - assert.NoError(t, world.Spawn(a), "Failed to spawn") + assert.NoError(t, world.SpawnRover(a), "Failed to spawn") pos := Vector{ X: 1.0, @@ -30,7 +30,7 @@ func TestCommand_Move(t *testing.T) { } err := world.SetPosition(a, pos) - assert.NoError(t, err, "Failed to set position for instance") + assert.NoError(t, err, "Failed to set position for rover") // TODO: Test the bearing/duration movement /* @@ -39,8 +39,8 @@ func TestCommand_Move(t *testing.T) { assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") newpos, err := world.GetPosition(a) - assert.NoError(t, err, "Failed to set position for instance") + assert.NoError(t, err, "Failed to set position for rover") pos.Add(move) - assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") + assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") */ } diff --git a/pkg/game/world.go b/pkg/game/world.go index bc50bae..e8b0735 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -8,19 +8,19 @@ import ( // World describes a self contained universe and everything in it type World struct { - // Instances is a map of all the instances in the game - Instances map[uuid.UUID]Instance `json:"instances"` + // Rovers is a id->data map of all the rovers in the game + Rovers map[uuid.UUID]Rover `json:"rovers"` } -// Instance describes a single entity or instance of an entity in the world -type Instance struct { - // Id is a unique ID for this instance +// Rover describes a single rover in the world +type Rover struct { + // Id is a unique ID for this rover Id uuid.UUID `json:"id"` - // Pos represents where this instance is in the world + // Pos represents where this rover is in the world Pos Vector `json:"pos"` - // Speed represents the Speed that the instance will move per second + // Speed represents the Speed that the rover will move per second Speed float64 `json:"speed"` // Sight represents the distance the unit can see @@ -30,65 +30,65 @@ type Instance struct { // NewWorld creates a new world object func NewWorld() *World { return &World{ - Instances: make(map[uuid.UUID]Instance), + Rovers: make(map[uuid.UUID]Rover), } } -// Spawn adds an instance to the game -func (w *World) Spawn(id uuid.UUID) error { - if _, ok := w.Instances[id]; ok { - return fmt.Errorf("instance with id %s already exists in world", id) +// SpawnRover adds an rover to the game +func (w *World) SpawnRover(id uuid.UUID) error { + if _, ok := w.Rovers[id]; ok { + return fmt.Errorf("rover with id %s already exists in world", id) } - // Initialise the instance - instance := Instance{ + // Initialise the rover + rover := Rover{ Id: id, } - // Append the instance to the list - w.Instances[id] = instance + // Append the rover to the list + w.Rovers[id] = rover return nil } -// Removes an instance from the game -func (w *World) DestroyInstance(id uuid.UUID) error { - if _, ok := w.Instances[id]; ok { - delete(w.Instances, id) +// Removes an rover from the game +func (w *World) DestroyRover(id uuid.UUID) error { + if _, ok := w.Rovers[id]; ok { + delete(w.Rovers, id) } else { - return fmt.Errorf("no instance matching id") + return fmt.Errorf("no rover matching id") } return nil } -// GetPosition returns the position of a given instance +// GetPosition returns the position of a given rover func (w World) GetPosition(id uuid.UUID) (Vector, error) { - if i, ok := w.Instances[id]; ok { + if i, ok := w.Rovers[id]; ok { return i.Pos, nil } else { - return Vector{}, fmt.Errorf("no instance matching id") + return Vector{}, fmt.Errorf("no rover matching id") } } -// SetPosition sets an instances position +// SetPosition sets an rovers position func (w *World) SetPosition(id uuid.UUID, pos Vector) error { - if i, ok := w.Instances[id]; ok { + if i, ok := w.Rovers[id]; ok { i.Pos = pos - w.Instances[id] = i + w.Rovers[id] = i return nil } else { - return fmt.Errorf("no instance matching id") + return fmt.Errorf("no rover matching id") } } -// SetPosition sets an instances position +// SetPosition sets an rovers position func (w *World) MovePosition(id uuid.UUID, vec Vector) (Vector, error) { - if i, ok := w.Instances[id]; ok { + if i, ok := w.Rovers[id]; ok { i.Pos.Add(vec) - w.Instances[id] = i + w.Rovers[id] = i return i.Pos, nil } else { - return Vector{}, fmt.Errorf("no instance matching id") + return Vector{}, fmt.Errorf("no rover matching id") } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 5ff5e28..b773b6c 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -15,43 +15,43 @@ func TestNewWorld(t *testing.T) { } } -func TestWorld_CreateInstance(t *testing.T) { +func TestWorld_CreateRover(t *testing.T) { world := NewWorld() a := uuid.New() b := uuid.New() - assert.NoError(t, world.Spawn(a), "Failed to spawn") - assert.NoError(t, world.Spawn(b), "Failed to spawn") + assert.NoError(t, world.SpawnRover(a), "Failed to spawn") + assert.NoError(t, world.SpawnRover(b), "Failed to spawn") // Basic duplicate check if a == b { - t.Errorf("Created identical instances") - } else if len(world.Instances) != 2 { - t.Errorf("Incorrect number of instances created") + t.Errorf("Created identical rovers") + } else if len(world.Rovers) != 2 { + t.Errorf("Incorrect number of rovers created") } } -func TestWorld_DestroyInstance(t *testing.T) { +func TestWorld_DestroyRover(t *testing.T) { world := NewWorld() a := uuid.New() b := uuid.New() - assert.NoError(t, world.Spawn(a), "Failed to spawn") - assert.NoError(t, world.Spawn(b), "Failed to spawn") + assert.NoError(t, world.SpawnRover(a), "Failed to spawn") + assert.NoError(t, world.SpawnRover(b), "Failed to spawn") - err := world.DestroyInstance(a) - assert.NoError(t, err, "Error returned from instance destroy") + err := world.DestroyRover(a) + assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check - if len(world.Instances) != 1 { - t.Error("Too many instances left in world") - } else if _, ok := world.Instances[b]; !ok { - t.Error("Remaining instance is incorrect") + if len(world.Rovers) != 1 { + t.Error("Too many rovers left in world") + } else if _, ok := world.Rovers[b]; !ok { + t.Error("Remaining rover is incorrect") } } func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld() a := uuid.New() - assert.NoError(t, world.Spawn(a), "Failed to spawn") + assert.NoError(t, world.SpawnRover(a), "Failed to spawn") pos := Vector{ X: 1.0, @@ -59,14 +59,14 @@ func TestWorld_GetSetMovePosition(t *testing.T) { } err := world.SetPosition(a, pos) - assert.NoError(t, err, "Failed to set position for instance") + assert.NoError(t, err, "Failed to set position for rover") newpos, err := world.GetPosition(a) - assert.NoError(t, err, "Failed to set position for instance") - assert.Equal(t, pos, newpos, "Failed to correctly set position for instance") + assert.NoError(t, err, "Failed to set position for rover") + assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") newpos, err = world.MovePosition(a, pos) - assert.NoError(t, err, "Failed to set position for instance") + assert.NoError(t, err, "Failed to set position for rover") pos.Add(pos) - assert.Equal(t, pos, newpos, "Failed to correctly move position for instance") + assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") } diff --git a/pkg/server/api.go b/pkg/server/api.go index 16e7328..ba1095b 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -30,8 +30,8 @@ type RegisterResponse struct { // ============================== // API: /spawn method: POST -// Spawns the primary entity for an account -// Responds with the position of said entity +// Spawns the rover for an account +// Responds with the position of said rover // SpawnData is the data to be sent for the spawn command type SpawnData struct { diff --git a/pkg/server/routes.go b/pkg/server/routes.go index ae4852f..495ec87 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -130,8 +130,8 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { // log the data sent fmt.Printf("\tspawn data: %v\n", data) - // Create a new instance - if pos, _, err := s.SpawnPrimaryForAccount(id); err != nil { + // Create a new rover + if pos, _, err := s.SpawnRoverForAccount(id); err != nil { response.Error = err.Error() } else { response.Success = true @@ -168,8 +168,8 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { } else if id, err := uuid.Parse(data.Id); err != nil { response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - } else if inst, err := s.accountant.GetPrimary(id); err != nil { - response.Error = fmt.Sprintf("Provided account has no primary: %s", err) + } else if inst, err := s.accountant.GetRover(id); err != nil { + response.Error = fmt.Sprintf("Provided account has no rover: %s", err) } else { // log the data sent diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index f54e961..022ef3c 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -77,8 +77,8 @@ func TestHandleCommands(t *testing.T) { a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") - // Spawn the primary instance for the account - _, inst, err := s.SpawnPrimaryForAccount(a.Id) + // Spawn the rover rover for the account + _, inst, err := s.SpawnRoverForAccount(a.Id) data := CommandsData{ Id: a.Id.String(), @@ -107,7 +107,7 @@ func TestHandleCommands(t *testing.T) { } if _, err := s.world.GetPosition(inst); err != nil { - t.Error("Couldn't get position for the primary instance") + t.Error("Couldn't get position for the rover rover") } // TODO: Check position is correct diff --git a/pkg/server/server.go b/pkg/server/server.go index dc94a21..c67907a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -161,18 +161,18 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons } } -// SpawnPrimaryForAccount spawns the primary instance for an account -func (s *Server) SpawnPrimaryForAccount(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { +// SpawnRoverForAccount spawns the rover rover for an account +func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { inst := uuid.New() - s.world.Spawn(inst) + s.world.SpawnRover(inst) if pos, err := s.world.GetPosition(inst); err != nil { - return game.Vector{}, uuid.UUID{}, fmt.Errorf("No position found for created instance") + return game.Vector{}, uuid.UUID{}, fmt.Errorf("No position found for created rover") } else { - if err := s.accountant.AssignPrimary(accountid, inst); err != nil { - // Try and clear up the instance - if err := s.world.DestroyInstance(inst); err != nil { - fmt.Printf("Failed to destroy instance after failed primary assign: %s", err) + if err := s.accountant.AssignRover(accountid, inst); err != nil { + // Try and clear up the rover + if err := s.world.DestroyRover(inst); err != nil { + fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) } return game.Vector{}, uuid.UUID{}, err From 6461b51c5c169c4a3161127782be5fe859880332 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 21:59:00 +0100 Subject: [PATCH 074/495] Fully implement the bearing based movement Instant, and without limit, for now --- pkg/game/command.go | 16 ++------- pkg/game/command_test.go | 41 ++++++++-------------- pkg/game/world.go | 71 ++++++++++++++++++++++++++++----------- pkg/game/world_test.go | 38 ++++++++++++--------- pkg/server/api.go | 2 +- pkg/server/routes_test.go | 14 +++++--- pkg/server/server.go | 5 ++- 7 files changed, 105 insertions(+), 82 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index 18173e7..4a196c4 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -6,19 +6,9 @@ import "github.com/google/uuid" type Command func() error // CommandMove will move the rover in question -func (w *World) CommandMove(id uuid.UUID, bearing float64, duration int64) Command { +func (w *World) CommandMove(id uuid.UUID, bearing float64, duration float64) Command { return func() error { - // TODO: Calculate the move itself - - //_, err := w.MovePosition(id, vec) - return nil - } -} - -// CommandSpawn -// TODO: Two spawn commands with the same id could trigger a fail later on, we should prevent that somehow -func (w *World) CommandSpawn(id uuid.UUID) Command { - return func() error { - return w.SpawnRover(id) + _, err := w.MoveRover(id, bearing, duration) + return err } } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 0fd2580..99cb296 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -3,44 +3,31 @@ package game import ( "testing" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) -func TestCommand_Spawn(t *testing.T) { - world := NewWorld() - a := uuid.New() - - spawnCommand := world.CommandSpawn(a) - assert.NoError(t, world.Execute(spawnCommand), "Failed to execute spawn command") - - rover, ok := world.Rovers[a] - assert.True(t, ok, "No new rover in world") - assert.Equal(t, a, rover.Id, "New rover has incorrect id") -} - func TestCommand_Move(t *testing.T) { world := NewWorld() - a := uuid.New() - assert.NoError(t, world.SpawnRover(a), "Failed to spawn") - + a := world.SpawnRover() pos := Vector{ X: 1.0, Y: 2.0, } - err := world.SetPosition(a, pos) + attribs, err := world.RoverAttributes(a) + assert.NoError(t, err, "Failed to get rover attribs") + + err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - // TODO: Test the bearing/duration movement - /* - // Try the move command - moveCommand := world.CommandMove(a, move) - assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") + bearing := 0.0 + duration := 1.0 + // Try the move command + moveCommand := world.CommandMove(a, bearing, duration) + assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") - newpos, err := world.GetPosition(a) - assert.NoError(t, err, "Failed to set position for rover") - pos.Add(move) - assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") - */ + newpos, err := world.RoverPosition(a) + assert.NoError(t, err, "Failed to set position for rover") + pos.Add(Vector{0.0, float64(duration) * attribs.Speed}) // We should have moved duration*speed north + assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") } diff --git a/pkg/game/world.go b/pkg/game/world.go index e8b0735..c4f560c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "math" "github.com/google/uuid" ) @@ -12,6 +13,15 @@ type World struct { Rovers map[uuid.UUID]Rover `json:"rovers"` } +// RoverAttributes contains attributes of a rover +type RoverAttributes struct { + // Speed represents the Speed that the rover will move per second + Speed float64 `json:"speed"` + + // Sight represents the distance the unit can see + Sight float64 `json:"sight"` +} + // Rover describes a single rover in the world type Rover struct { // Id is a unique ID for this rover @@ -20,11 +30,8 @@ type Rover struct { // Pos represents where this rover is in the world Pos Vector `json:"pos"` - // Speed represents the Speed that the rover will move per second - Speed float64 `json:"speed"` - - // Sight represents the distance the unit can see - Sight float64 `json:"sight"` + // Attributes represents the physical attributes of the rover + Attributes RoverAttributes `json:"attributes"` } // NewWorld creates a new world object @@ -35,20 +42,25 @@ func NewWorld() *World { } // SpawnRover adds an rover to the game -func (w *World) SpawnRover(id uuid.UUID) error { - if _, ok := w.Rovers[id]; ok { - return fmt.Errorf("rover with id %s already exists in world", id) - } - +func (w *World) SpawnRover() uuid.UUID { // Initialise the rover rover := Rover{ - Id: id, + Id: uuid.New(), + + // TODO: Set this somehow + Pos: Vector{}, + + // TODO: Stop these being random numbers + Attributes: RoverAttributes{ + Speed: 1.0, + Sight: 20.0, + }, } // Append the rover to the list - w.Rovers[id] = rover + w.Rovers[rover.Id] = rover - return nil + return rover.Id } // Removes an rover from the game @@ -61,8 +73,17 @@ func (w *World) DestroyRover(id uuid.UUID) error { return nil } -// GetPosition returns the position of a given rover -func (w World) GetPosition(id uuid.UUID) (Vector, error) { +// RoverAttributes returns the attributes of a requested rover +func (w World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { + if i, ok := w.Rovers[id]; ok { + return i.Attributes, nil + } else { + return RoverAttributes{}, fmt.Errorf("no rover matching id") + } +} + +// RoverPosition returns the position of a given rover +func (w World) RoverPosition(id uuid.UUID) (Vector, error) { if i, ok := w.Rovers[id]; ok { return i.Pos, nil } else { @@ -70,8 +91,8 @@ func (w World) GetPosition(id uuid.UUID) (Vector, error) { } } -// SetPosition sets an rovers position -func (w *World) SetPosition(id uuid.UUID, pos Vector) error { +// WarpRover sets an rovers position +func (w *World) WarpRover(id uuid.UUID, pos Vector) error { if i, ok := w.Rovers[id]; ok { i.Pos = pos w.Rovers[id] = i @@ -82,9 +103,21 @@ func (w *World) SetPosition(id uuid.UUID, pos Vector) error { } // SetPosition sets an rovers position -func (w *World) MovePosition(id uuid.UUID, vec Vector) (Vector, error) { +func (w *World) MoveRover(id uuid.UUID, bearing float64, duration float64) (Vector, error) { if i, ok := w.Rovers[id]; ok { - i.Pos.Add(vec) + // Calculate the distance + distance := i.Attributes.Speed * float64(duration) + + // Calculate the full movement based on the bearing + move := Vector{ + X: math.Sin(bearing) * distance, + Y: math.Cos(bearing) * distance, + } + + // Increment the position by the movement + i.Pos.Add(move) + + // Set the rover values to the new ones w.Rovers[id] = i return i.Pos, nil } else { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index b773b6c..154bed7 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,7 +3,6 @@ package game import ( "testing" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -17,10 +16,8 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld() - a := uuid.New() - b := uuid.New() - assert.NoError(t, world.SpawnRover(a), "Failed to spawn") - assert.NoError(t, world.SpawnRover(b), "Failed to spawn") + a := world.SpawnRover() + b := world.SpawnRover() // Basic duplicate check if a == b { @@ -30,12 +27,20 @@ func TestWorld_CreateRover(t *testing.T) { } } +func TestWorld_RoverAttributes(t *testing.T) { + world := NewWorld() + a := world.SpawnRover() + + attribs, err := world.RoverAttributes(a) + assert.NoError(t, err, "Failed to get rover attribs") + assert.NotZero(t, attribs.Sight, "Rover should not be spawned blind") + assert.NotZero(t, attribs.Speed, "Rover should not be spawned unable to move") +} + func TestWorld_DestroyRover(t *testing.T) { world := NewWorld() - a := uuid.New() - b := uuid.New() - assert.NoError(t, world.SpawnRover(a), "Failed to spawn") - assert.NoError(t, world.SpawnRover(b), "Failed to spawn") + a := world.SpawnRover() + b := world.SpawnRover() err := world.DestroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") @@ -50,23 +55,26 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld() - a := uuid.New() - assert.NoError(t, world.SpawnRover(a), "Failed to spawn") + a := world.SpawnRover() + attribs, err := world.RoverAttributes(a) + assert.NoError(t, err, "Failed to get rover attribs") pos := Vector{ X: 1.0, Y: 2.0, } - err := world.SetPosition(a, pos) + err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - newpos, err := world.GetPosition(a) + newpos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") - newpos, err = world.MovePosition(a, pos) + bearing := 0.0 + duration := 1.0 + newpos, err = world.MoveRover(a, bearing, duration) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(pos) + pos.Add(Vector{0, attribs.Speed * float64(duration)}) // We should have move one unit of the speed north assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") } diff --git a/pkg/server/api.go b/pkg/server/api.go index ba1095b..dc3f639 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -77,7 +77,7 @@ type Command struct { // Used for CommandMove Bearing float64 `json:"bearing"` // The direction to move in degrees - Duration int64 `json:"duration"` // The duration of the move in seconds + Duration float64 `json:"duration"` // The duration of the move in seconds } // ================ diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 022ef3c..4963bad 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -7,6 +7,7 @@ import ( "net/http/httptest" "testing" + "github.com/mdiluz/rove/pkg/game" "github.com/stretchr/testify/assert" ) @@ -80,6 +81,9 @@ func TestHandleCommands(t *testing.T) { // Spawn the rover rover for the account _, inst, err := s.SpawnRoverForAccount(a.Id) + pos, err := s.world.RoverPosition(inst) + assert.NoError(t, err, "Couldn't get rover position") + data := CommandsData{ Id: a.Id.String(), Commands: []Command{ @@ -106,9 +110,11 @@ func TestHandleCommands(t *testing.T) { t.Errorf("got false for /commands") } - if _, err := s.world.GetPosition(inst); err != nil { - t.Error("Couldn't get position for the rover rover") - } + attrib, err := s.world.RoverAttributes(inst) + assert.NoError(t, err, "Couldn't get rover attribs") - // TODO: Check position is correct + pos2, err := s.world.RoverPosition(inst) + assert.NoError(t, err, "Couldn't get rover position") + pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration + assert.Equal(t, pos, pos2, "Rover should have moved by bearing") } diff --git a/pkg/server/server.go b/pkg/server/server.go index c67907a..490f720 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -163,9 +163,8 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { - inst := uuid.New() - s.world.SpawnRover(inst) - if pos, err := s.world.GetPosition(inst); err != nil { + inst := s.world.SpawnRover() + if pos, err := s.world.RoverPosition(inst); err != nil { return game.Vector{}, uuid.UUID{}, fmt.Errorf("No position found for created rover") } else { From b2b782f61d6df8f83368eb531e2bcd5e45435068 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 22:02:33 +0100 Subject: [PATCH 075/495] Add failing empty test for /view --- pkg/server/routes_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 4963bad..a70eeb4 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -118,3 +118,33 @@ func TestHandleCommands(t *testing.T) { pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration assert.Equal(t, pos, pos2, "Rover should have moved by bearing") } + +func TestHandleView(t *testing.T) { + s := NewServer() + a, err := s.accountant.RegisterAccount("test") + assert.NoError(t, err, "Error registering account") + + // Spawn the rover rover for the account + _, _, err = s.SpawnRoverForAccount(a.Id) + + data := ViewData{ + Id: a.Id.String(), + } + + b, err := json.Marshal(data) + assert.NoError(t, err, "Error marshalling data") + + request, _ := http.NewRequest(http.MethodPost, "/view", bytes.NewReader(b)) + response := httptest.NewRecorder() + + s.wrapHandler(http.MethodPost, HandleView)(response, request) + + var status ViewResponse + json.NewDecoder(response.Body).Decode(&status) + + if status.Success != true { + t.Errorf("got false for /view") + } + + // TODO: Verify the view information +} From 14977de5bcfea81c497771452643a7c066e90c35 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 4 Jun 2020 22:14:55 +0100 Subject: [PATCH 076/495] Rename /view to /radar and fill in more of the response --- pkg/game/world.go | 24 +++++++++++++++++++++--- pkg/game/world_test.go | 2 +- pkg/server/api.go | 20 ++++++++++++-------- pkg/server/routes.go | 27 +++++++++++++++------------ pkg/server/routes_test.go | 14 +++++++------- 5 files changed, 56 insertions(+), 31 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index c4f560c..813f07d 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -18,8 +18,8 @@ type RoverAttributes struct { // Speed represents the Speed that the rover will move per second Speed float64 `json:"speed"` - // Sight represents the distance the unit can see - Sight float64 `json:"sight"` + // Range represents the distance the unit's radar can see + Range float64 `json:"range"` } // Rover describes a single rover in the world @@ -53,7 +53,7 @@ func (w *World) SpawnRover() uuid.UUID { // TODO: Stop these being random numbers Attributes: RoverAttributes{ Speed: 1.0, - Sight: 20.0, + Range: 20.0, }, } @@ -125,6 +125,24 @@ func (w *World) MoveRover(id uuid.UUID, bearing float64, duration float64) (Vect } } +// RadarDescription describes what a rover can see +type RadarDescription struct { + // Rovers is the set of rovers that this radar can see + Rovers []Vector `json:"rovers"` +} + +// RadarFromRover can be used to query what a rover can currently see +func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { + if _, ok := w.Rovers[id]; ok { + + // TODO: Gather nearby rovers within the range + + return RadarDescription{}, nil + } else { + return RadarDescription{}, fmt.Errorf("no rover matching id") + } +} + // Execute will run the commands given func (w *World) Execute(commands ...Command) error { for _, c := range commands { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 154bed7..55fee3c 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -33,7 +33,7 @@ func TestWorld_RoverAttributes(t *testing.T) { attribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") - assert.NotZero(t, attribs.Sight, "Rover should not be spawned blind") + assert.NotZero(t, attribs.Range, "Rover should not be spawned blind") assert.NotZero(t, attribs.Speed, "Rover should not be spawned unable to move") } diff --git a/pkg/server/api.go b/pkg/server/api.go index dc3f639..6ceb479 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -1,5 +1,7 @@ package server +import "github.com/mdiluz/rove/pkg/game" + // ============================== // API: /status method: GET // Queries the status of the server @@ -44,8 +46,7 @@ type SpawnResponse struct { Error string `json:"error"` // The location of the spawned entity - X float64 `json:"x"` - Y float64 `json:"y"` + Position game.Vector `json:"position"` } // ============================== @@ -81,16 +82,19 @@ type Command struct { } // ================ -// API: /view POST -// Queries the current view for the user +// API: /radar POST +// Queries the current radar for the user -// ViewData describes the input data to request an accounts current view -type ViewData struct { +// RadarData describes the input data to request an accounts current radar +type RadarData struct { Id string `json:"id"` } -// ViewResponse describes the response to a /view call -type ViewResponse struct { +// RadarResponse describes the response to a /radar call +type RadarResponse struct { Success bool `json:"success"` Error string `json:"error"` + + // The set of positions for nearby rovers + Rovers []game.Vector `json:"rovers"` } diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 495ec87..d572b19 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -44,9 +44,9 @@ var Routes = []Route{ handler: HandleCommands, }, { - path: "/view", + path: "/radar", method: http.MethodPost, - handler: HandleView, + handler: HandleRadar, }, } @@ -135,8 +135,7 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { response.Error = err.Error() } else { response.Success = true - response.X = pos.X - response.Y = pos.Y + response.Position = pos } } @@ -201,10 +200,10 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { return nil } -// HandleView handles the view request -func HandleView(s *Server, b io.ReadCloser, w io.Writer) error { +// HandleRadar handles the radar request +func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response - var response = ViewResponse{ + var response = RadarResponse{ Success: false, } @@ -220,12 +219,16 @@ func HandleView(s *Server, b io.ReadCloser, w io.Writer) error { } else if id, err := uuid.Parse(data.Id); err != nil { response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - } else { - // log the data sent - fmt.Printf("\tcommands data: %v\n", data) + } else if inst, err := s.accountant.GetRover(id); err != nil { + response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - // TODO: Query the view for this account - fmt.Println(id) + } else if radar, err := s.world.RadarFromRover(inst); err != nil { + response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) + + } else { + // Fill in the response + response.Rovers = radar.Rovers + response.Success = true } // Log the response diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index a70eeb4..b2b63f2 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -119,7 +119,7 @@ func TestHandleCommands(t *testing.T) { assert.Equal(t, pos, pos2, "Rover should have moved by bearing") } -func TestHandleView(t *testing.T) { +func TestHandleRadar(t *testing.T) { s := NewServer() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") @@ -127,24 +127,24 @@ func TestHandleView(t *testing.T) { // Spawn the rover rover for the account _, _, err = s.SpawnRoverForAccount(a.Id) - data := ViewData{ + data := RadarData{ Id: a.Id.String(), } b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, "/view", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, "/radar", bytes.NewReader(b)) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleView)(response, request) + s.wrapHandler(http.MethodPost, HandleRadar)(response, request) - var status ViewResponse + var status RadarResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /view") + t.Errorf("got false for /radar") } - // TODO: Verify the view information + // TODO: Verify the radar information } From e81ceecffc4107ac2fc1fdc797d76c1cc5d1b07b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 15:48:44 +0100 Subject: [PATCH 077/495] Add more maths functions for the Vectors --- pkg/game/geom.go | 24 ++++++ pkg/game/geom_test.go | 171 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 pkg/game/geom_test.go diff --git a/pkg/game/geom.go b/pkg/game/geom.go index 7d45198..f65680b 100644 --- a/pkg/game/geom.go +++ b/pkg/game/geom.go @@ -1,5 +1,7 @@ package game +import "math" + // Vector desribes a 3D vector type Vector struct { X float64 `json:"x"` @@ -11,3 +13,25 @@ func (v *Vector) Add(v2 Vector) { v.X += v2.X v.Y += v2.Y } + +// Added calculates a new vector +func (v Vector) Added(v2 Vector) Vector { + v.Add(v2) + return v +} + +// Negated returns a negated vector +func (v Vector) Negated() Vector { + return Vector{-v.X, -v.Y} +} + +// Length returns the length of the vector +func (v Vector) Length() float64 { + return math.Sqrt(v.X*v.X + v.Y*v.Y) +} + +// Distance returns the distance between two vectors +func (v Vector) Distance(v2 Vector) float64 { + // Negate the two vectors and calciate the length + return v.Added(v2.Negated()).Length() +} diff --git a/pkg/game/geom_test.go b/pkg/game/geom_test.go new file mode 100644 index 0000000..af24cc5 --- /dev/null +++ b/pkg/game/geom_test.go @@ -0,0 +1,171 @@ +package game + +import ( + "math" + "reflect" + "testing" + + "github.com/stretchr/testify/assert" +) + +type VectorTest struct { + name string + vec Vector + arg Vector + want Vector +} + +var additionTests = []VectorTest{ + { + name: "Basic addition 1", + vec: Vector{ + X: 0.0, + Y: 0.0, + }, + arg: Vector{ + 1.0, + 1.0, + }, + want: Vector{ + 1.0, + 1.0, + }, + }, + { + name: "Basic addition 2", + vec: Vector{ + X: 1.0, + Y: 2.0, + }, + arg: Vector{ + 3.0, + 4.0, + }, + want: Vector{ + 4.0, + 6.0, + }, + }, +} + +func TestVector_Add(t *testing.T) { + + for _, tt := range additionTests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + v.Add(tt.arg) + assert.Equal(t, tt.want, v, "Add did not produce expected result") + }) + } +} + +func TestVector_Added(t *testing.T) { + for _, tt := range additionTests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + assert.Equal(t, tt.want, v.Added(tt.arg), "Added didn't return expected value") + }) + } +} + +func TestVector_Negated(t *testing.T) { + tests := []struct { + name string + vec Vector + want Vector + }{ + { + name: "Simple check 1", + vec: Vector{1, 1}, + want: Vector{-1, -1}, + }, + { + name: "Simple check 2", + vec: Vector{1, -1}, + want: Vector{-1, 1}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + if got := v.Negated(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Vector.Negated() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestVector_Length(t *testing.T) { + tests := []struct { + name string + vec Vector + want float64 + }{ + { + name: "Simple length 1", + vec: Vector{1, 0}, + want: 1, + }, { + name: "Simple length 2", + vec: Vector{1, -1}, + want: math.Sqrt(2), + }, { + name: "Simple length 3", + vec: Vector{0, 0}, + want: 0, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + if got := v.Length(); got != tt.want { + t.Errorf("Vector.Length() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestVector_Distance(t *testing.T) { + tests := []struct { + name string + vec Vector + arg Vector + want float64 + }{ + { + name: "Simple distance 1", + vec: Vector{0, 0}, + arg: Vector{1, 0}, + want: 1, + }, + { + name: "Simple distance 2", + vec: Vector{1, 1}, + arg: Vector{-1, -1}, + want: math.Sqrt(8), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + if got := v.Distance(tt.arg); got != tt.want { + t.Errorf("Vector.Distance() = %v, want %v", got, tt.want) + } + }) + } +} From ae369715ec637bc015bebfb6cbb6cdceba8d64e6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 15:48:55 +0100 Subject: [PATCH 078/495] Implement rover radar and use and test it --- pkg/game/world.go | 12 +++++++++--- pkg/game/world_test.go | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 813f07d..3470864 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -133,11 +133,17 @@ type RadarDescription struct { // RadarFromRover can be used to query what a rover can currently see func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { - if _, ok := w.Rovers[id]; ok { + if r1, ok := w.Rovers[id]; ok { + var desc RadarDescription - // TODO: Gather nearby rovers within the range + // Gather nearby rovers within the range + for _, r2 := range w.Rovers { + if r1.Id != r2.Id && r1.Pos.Distance(r2.Pos) < r1.Attributes.Range { + desc.Rovers = append(desc.Rovers, r2.Pos) + } + } - return RadarDescription{}, nil + return desc, nil } else { return RadarDescription{}, fmt.Errorf("no rover matching id") } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 55fee3c..ddb8bd0 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -78,3 +78,25 @@ func TestWorld_GetSetMovePosition(t *testing.T) { pos.Add(Vector{0, attribs.Speed * float64(duration)}) // We should have move one unit of the speed north assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") } + +func TestWorld_RadarFromRover(t *testing.T) { + world := NewWorld() + a := world.SpawnRover() + b := world.SpawnRover() + c := world.SpawnRover() + + // Get a's attributes + attrib, err := world.RoverAttributes(a) + assert.NoError(t, err, "Failed to get rover attribs") + + // Warp the rovers so a can see b but not c + assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") + assert.NoError(t, world.WarpRover(b, Vector{attrib.Range - 1, 0}), "Failed to warp rover") + assert.NoError(t, world.WarpRover(c, Vector{attrib.Range + 1, 0}), "Failed to warp rover") + + radar, err := world.RadarFromRover(a) + assert.NoError(t, err, "Failed to get radar from rover") + assert.Equal(t, 1, len(radar.Rovers), "Radar returned wrong number of rovers") + assert.Equal(t, Vector{attrib.Range - 1, 0}, radar.Rovers[0], "Rover on radar in wrong position") + +} From be0f4f1affb054b53247193a527e8fcab2f2bf65 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 16:37:52 +0100 Subject: [PATCH 079/495] Convert bearings to compass points and locations to int coords --- docs/poc.md | 4 +- pkg/game/command.go | 2 +- pkg/game/command_test.go | 6 +-- pkg/game/geom.go | 85 +++++++++++++++++++++++++++++++++++++-- pkg/game/geom_test.go | 58 ++++++++++++++++++++++++++ pkg/game/world.go | 16 +++----- pkg/game/world_test.go | 6 +-- pkg/server/api.go | 15 ++++++- pkg/server/routes.go | 28 ++++++++----- pkg/server/routes_test.go | 2 +- 10 files changed, 187 insertions(+), 35 deletions(-) diff --git a/docs/poc.md b/docs/poc.md index 6e098ab..1a4e90e 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -6,8 +6,8 @@ For a proof of concept we'll implement a very small subset of the final features ### Core Features * Create an account (done) -* Control an entity in a 2D map (done) -* Query for what the entity can see +* Control an rover in a 2D map (done) +* Query for what the rover can see (done) * Persistent accounts and world (done) * Multiple users (done) * Populate map with locations/objects diff --git a/pkg/game/command.go b/pkg/game/command.go index 4a196c4..d3af43b 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -6,7 +6,7 @@ import "github.com/google/uuid" type Command func() error // CommandMove will move the rover in question -func (w *World) CommandMove(id uuid.UUID, bearing float64, duration float64) Command { +func (w *World) CommandMove(id uuid.UUID, bearing Direction, duration int) Command { return func() error { _, err := w.MoveRover(id, bearing, duration) return err diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 99cb296..c946981 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -20,14 +20,14 @@ func TestCommand_Move(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - bearing := 0.0 - duration := 1.0 + bearing := North + duration := 1 // Try the move command moveCommand := world.CommandMove(a, bearing, duration) assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") newpos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(Vector{0.0, float64(duration) * attribs.Speed}) // We should have moved duration*speed north + pos.Add(Vector{0.0, duration * attribs.Speed}) // We should have moved duration*speed north assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") } diff --git a/pkg/game/geom.go b/pkg/game/geom.go index f65680b..846555a 100644 --- a/pkg/game/geom.go +++ b/pkg/game/geom.go @@ -1,11 +1,15 @@ package game -import "math" +import ( + "fmt" + "math" + "strings" +) // Vector desribes a 3D vector type Vector struct { - X float64 `json:"x"` - Y float64 `json:"y"` + X int `json:"x"` + Y int `json:"y"` } // Add adds one vector to another @@ -27,7 +31,7 @@ func (v Vector) Negated() Vector { // Length returns the length of the vector func (v Vector) Length() float64 { - return math.Sqrt(v.X*v.X + v.Y*v.Y) + return math.Sqrt(float64(v.X*v.X + v.Y*v.Y)) } // Distance returns the distance between two vectors @@ -35,3 +39,76 @@ func (v Vector) Distance(v2 Vector) float64 { // Negate the two vectors and calciate the length return v.Added(v2.Negated()).Length() } + +// Multiplied returns the vector multiplied by an int +func (v Vector) Multiplied(val int) Vector { + return Vector{v.X * val, v.Y * val} +} + +// Direction describes a compass direction +type Direction int + +const ( + North Direction = iota + NorthEast + East + SouthEast + South + SouthWest + West + NorthWest +) + +// DirectionString simply describes the strings associated with a direction +type DirectionString struct { + Long string + Short string +} + +// DirectionStrings is the set of strings for each direction +var DirectionStrings = []DirectionString{ + {"North", "N"}, + {"NorthEast", "NE"}, + {"East", "E"}, + {"SouthEast", "SE"}, + {"South", "S"}, + {"SouthWest", "SW"}, + {"West", "W"}, + {"NorthWest", "NW"}, +} + +// String converts a Direction to a String +func (d Direction) String() string { + return DirectionStrings[d].Long +} + +// ShortString converts a Direction to a short string version +func (d Direction) ShortString() string { + return DirectionStrings[d].Short +} + +// DirectionFromString gets the Direction from a string +func DirectionFromString(s string) (Direction, error) { + for i, d := range DirectionStrings { + if strings.ToLower(d.Long) == strings.ToLower(s) || strings.ToLower(d.Short) == strings.ToLower(s) { + return Direction(i), nil + } + } + return -1, fmt.Errorf("Unknown direction: %s", s) +} + +var DirectionVectors = []Vector{ + {0, 1}, // N + {1, 1}, // NE + {1, 0}, // E + {1, -1}, // SE + {0, -1}, // S + {-1, 1}, // SW + {-1, 0}, // W + {-1, 1}, // NW +} + +// Vector converts a Direction to a Vector +func (d Direction) Vector() Vector { + return DirectionVectors[d] +} diff --git a/pkg/game/geom_test.go b/pkg/game/geom_test.go index af24cc5..440dd23 100644 --- a/pkg/game/geom_test.go +++ b/pkg/game/geom_test.go @@ -169,3 +169,61 @@ func TestVector_Distance(t *testing.T) { }) } } + +func TestVector_Multiplied(t *testing.T) { + + tests := []struct { + name string + vec Vector + arg int + want Vector + }{ + { + name: "Basic multiply 1", + vec: North.Vector(), + arg: 2, + want: Vector{0, 2}, + }, + { + name: "Basic multiply 2", + vec: NorthWest.Vector(), + arg: -1, + want: SouthEast.Vector(), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := Vector{ + X: tt.vec.X, + Y: tt.vec.Y, + } + if got := v.Multiplied(tt.arg); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Vector.Multiplied() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestDirection(t *testing.T) { + dir := North + + assert.Equal(t, "North", dir.String()) + assert.Equal(t, "N", dir.ShortString()) + assert.Equal(t, Vector{0, 1}, dir.Vector()) + + dir, err := DirectionFromString("N") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("n") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("north") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("NorthWest") + assert.NoError(t, err) + assert.Equal(t, NorthWest, dir) +} diff --git a/pkg/game/world.go b/pkg/game/world.go index 3470864..3b050a8 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,7 +2,6 @@ package game import ( "fmt" - "math" "github.com/google/uuid" ) @@ -16,10 +15,10 @@ type World struct { // RoverAttributes contains attributes of a rover type RoverAttributes struct { // Speed represents the Speed that the rover will move per second - Speed float64 `json:"speed"` + Speed int `json:"speed"` // Range represents the distance the unit's radar can see - Range float64 `json:"range"` + Range int `json:"range"` } // Rover describes a single rover in the world @@ -103,16 +102,13 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing float64, duration float64) (Vector, error) { +func (w *World) MoveRover(id uuid.UUID, bearing Direction, duration int) (Vector, error) { if i, ok := w.Rovers[id]; ok { // Calculate the distance - distance := i.Attributes.Speed * float64(duration) + distance := i.Attributes.Speed * duration // Calculate the full movement based on the bearing - move := Vector{ - X: math.Sin(bearing) * distance, - Y: math.Cos(bearing) * distance, - } + move := bearing.Vector().Multiplied(distance) // Increment the position by the movement i.Pos.Add(move) @@ -138,7 +134,7 @@ func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { // Gather nearby rovers within the range for _, r2 := range w.Rovers { - if r1.Id != r2.Id && r1.Pos.Distance(r2.Pos) < r1.Attributes.Range { + if r1.Id != r2.Id && r1.Pos.Distance(r2.Pos) < float64(r1.Attributes.Range) { desc.Rovers = append(desc.Rovers, r2.Pos) } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index ddb8bd0..7672706 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -71,11 +71,11 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") - bearing := 0.0 - duration := 1.0 + bearing := North + duration := 1 newpos, err = world.MoveRover(a, bearing, duration) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(Vector{0, attribs.Speed * float64(duration)}) // We should have move one unit of the speed north + pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") } diff --git a/pkg/server/api.go b/pkg/server/api.go index 6ceb479..c2e4e9a 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -70,6 +70,17 @@ const ( CommandMove = "move" ) +const ( + BearingNorth = "North" + BearingNorthEast + BearingEast + BearingSouthEast + BearingSouth + BearingSouthWest + BearingWest + BearingNorthWest +) + // Command describes a single command to execute // it contains the type, and then any members used for each command type type Command struct { @@ -77,8 +88,8 @@ type Command struct { Command string `json:"command"` // Used for CommandMove - Bearing float64 `json:"bearing"` // The direction to move in degrees - Duration float64 `json:"duration"` // The duration of the move in seconds + Bearing string `json:"bearing"` // The direction to move on a compass in short (NW) or long (NorthWest) form + Duration int `json:"duration"` // The duration of the move in ticks } // ================ diff --git a/pkg/server/routes.go b/pkg/server/routes.go index d572b19..b228855 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -148,6 +148,22 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { return nil } +// ConvertCommands converts server commands to game commands +func (s *Server) ConvertCommands(commands []Command, inst uuid.UUID) ([]game.Command, error) { + var cmds []game.Command + for _, c := range commands { + switch c.Command { + case CommandMove: + if bearing, err := game.DirectionFromString(c.Bearing); err != nil { + return nil, err + } else { + cmds = append(cmds, s.world.CommandMove(inst, bearing, c.Duration)) + } + } + } + return cmds, nil +} + // HandleSpawn will spawn the player entity for the associated account func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { // Set up the response @@ -170,19 +186,13 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + } else if cmds, err := s.ConvertCommands(data.Commands, inst); err != nil { + response.Error = fmt.Sprintf("Couldn't convert commands: %s", err) + } else { // log the data sent fmt.Printf("\tcommands data: %v\n", data) - // Iterate through the commands to generate all game commands - var cmds []game.Command - for _, c := range data.Commands { - switch c.Command { - case CommandMove: - cmds = append(cmds, s.world.CommandMove(inst, c.Bearing, c.Duration)) - } - } - // Execute the commands if err := s.world.Execute(cmds...); err != nil { response.Error = fmt.Sprintf("Failed to execute commands: %s", err) diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index b2b63f2..42b7125 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -89,7 +89,7 @@ func TestHandleCommands(t *testing.T) { Commands: []Command{ { Command: CommandMove, - Bearing: 0.0, + Bearing: "N", Duration: 1, }, }, From bd83621addce480dc9ce49f8ab46596b0ef49600 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 16:43:25 +0100 Subject: [PATCH 080/495] Small command handling fixes --- pkg/server/routes.go | 46 +++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index b228855..cd157c8 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -78,24 +78,21 @@ func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { err := json.NewDecoder(b).Decode(&data) if err != nil { fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() + } else if len(data.Name) == 0 { response.Error = "Cannot register empty name" + + } else if acc, err := s.accountant.RegisterAccount(data.Name); err != nil { + response.Error = err.Error() + } else { // log the data sent fmt.Printf("\tdata: %+v\n", data) - // Register the account with the server - acc, err := s.accountant.RegisterAccount(data.Name) - // If we didn't fail, respond with the account ID string - if err == nil { - response.Success = true - response.Id = acc.Id.String() - } else { - response.Error = err.Error() - } + response.Id = acc.Id.String() + response.Success = true } // Log the response @@ -126,17 +123,15 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { } else if id, err := uuid.Parse(data.Id); err != nil { response.Error = "Provided account ID was invalid" + } else if pos, _, err := s.SpawnRoverForAccount(id); err != nil { + response.Error = err.Error() + } else { - // log the data sent - fmt.Printf("\tspawn data: %v\n", data) // Create a new rover - if pos, _, err := s.SpawnRoverForAccount(id); err != nil { - response.Error = err.Error() - } else { - response.Success = true - response.Position = pos - } + response.Success = true + response.Position = pos + } // Log the response @@ -171,7 +166,7 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { Success: false, } - // Pull out the incoming info + // Go through each possible validation step for the data var data CommandsData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -189,16 +184,11 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { } else if cmds, err := s.ConvertCommands(data.Commands, inst); err != nil { response.Error = fmt.Sprintf("Couldn't convert commands: %s", err) - } else { - // log the data sent - fmt.Printf("\tcommands data: %v\n", data) + } else if err := s.world.Execute(cmds...); err != nil { + response.Error = fmt.Sprintf("Failed to execute commands: %s", err) - // Execute the commands - if err := s.world.Execute(cmds...); err != nil { - response.Error = fmt.Sprintf("Failed to execute commands: %s", err) - } else { - response.Success = true - } + } else { + response.Success = true } // Log the response From 6ef69cec02cb2e503faa14d8deeb640221bf09dc Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 16:49:24 +0100 Subject: [PATCH 081/495] Even more cleanup and refactor to simplify handlers --- pkg/server/routes.go | 93 ++++++++------------------------------------ pkg/server/server.go | 28 ++++++++++--- 2 files changed, 39 insertions(+), 82 deletions(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index cd157c8..6bcb672 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -7,12 +7,11 @@ import ( "net/http" "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/version" ) // Handler describes a function that handles any incoming request and can respond -type Handler func(*Server, io.ReadCloser, io.Writer) error +type Handler func(*Server, io.ReadCloser, io.Writer) (interface{}, error) // Route defines the information for a single path->function route type Route struct { @@ -51,29 +50,22 @@ var Routes = []Route{ } // HandleStatus handles the /status request -func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) error { +func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - // Simply encode the current status - var response = StatusResponse{ + // Simply return the current server status + return StatusResponse{ Ready: true, Version: version.Version, - } - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil + }, nil } // HandleRegister handles /register endpoint -func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { - - // Set up the response +func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = RegisterResponse{ Success: false, } - // Pull out the registration info + // Decode the registration info, verify it and register the account var data RegisterData err := json.NewDecoder(b).Decode(&data) if err != nil { @@ -87,31 +79,20 @@ func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) error { response.Error = err.Error() } else { - // log the data sent - fmt.Printf("\tdata: %+v\n", data) - - // If we didn't fail, respond with the account ID string response.Id = acc.Id.String() response.Success = true } - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil + return response, nil } // HandleSpawn will spawn the player entity for the associated account -func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { - // Set up the response +func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = SpawnResponse{ Success: false, } - // Pull out the incoming info + // Decode the spawn info, verify it and spawn the rover for this account var data SpawnData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -127,46 +108,20 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) error { response.Error = err.Error() } else { - - // Create a new rover response.Success = true response.Position = pos - } - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil -} - -// ConvertCommands converts server commands to game commands -func (s *Server) ConvertCommands(commands []Command, inst uuid.UUID) ([]game.Command, error) { - var cmds []game.Command - for _, c := range commands { - switch c.Command { - case CommandMove: - if bearing, err := game.DirectionFromString(c.Bearing); err != nil { - return nil, err - } else { - cmds = append(cmds, s.world.CommandMove(inst, bearing, c.Duration)) - } - } - } - return cmds, nil + return response, nil } // HandleSpawn will spawn the player entity for the associated account -func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { - // Set up the response +func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = CommandsResponse{ Success: false, } - // Go through each possible validation step for the data + // Decode the commands, verify them and the account, and execute the commands var data CommandsData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -191,23 +146,16 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) error { response.Success = true } - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil + return response, nil } // HandleRadar handles the radar request -func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) error { - // Set up the response +func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = RadarResponse{ Success: false, } - // Pull out the incoming info + // Decode the radar message, verify it, and respond with the radar info var data CommandsData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -226,16 +174,9 @@ func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) error { response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - // Fill in the response response.Rovers = radar.Rovers response.Success = true } - // Log the response - fmt.Printf("\tresponse: %+v\n", response) - - // Reply with the current status - json.NewEncoder(w).Encode(response) - - return nil + return response, nil } diff --git a/pkg/server/server.go b/pkg/server/server.go index 490f720..c4c9005 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -2,6 +2,7 @@ package server import ( "context" + "encoding/json" "fmt" "log" "net/http" @@ -141,22 +142,21 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons // Log the request fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) - // Verify we're hit with the right method + // Verify the method, call the handler, and encode the return if r.Method != method { w.WriteHeader(http.StatusMethodNotAllowed) - } else if err := handler(s, r.Body, w); err != nil { - // Log the error + } else if val, err := handler(s, r.Body, w); err != nil { fmt.Printf("Failed to handle http request: %s", err) + w.WriteHeader(http.StatusInternalServerError) - // Respond that we've had an error + } else if err := json.NewEncoder(w).Encode(val); err != nil { + fmt.Printf("Failed to encode return to json: %s", err) w.WriteHeader(http.StatusInternalServerError) } else { - // Be a good citizen and set the header for the return w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) - } } } @@ -180,3 +180,19 @@ func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UU } } } + +// ConvertCommands converts server commands to game commands +func (s *Server) ConvertCommands(commands []Command, inst uuid.UUID) ([]game.Command, error) { + var cmds []game.Command + for _, c := range commands { + switch c.Command { + case CommandMove: + if bearing, err := game.DirectionFromString(c.Bearing); err != nil { + return nil, err + } else { + cmds = append(cmds, s.world.CommandMove(inst, bearing, c.Duration)) + } + } + } + return cmds, nil +} From aa2ecace89633f2b914994b8169e50224a28a8fe Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 17:03:08 +0100 Subject: [PATCH 082/495] Don't send the empty error value in responses --- pkg/server/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/server/api.go b/pkg/server/api.go index c2e4e9a..5e40393 100644 --- a/pkg/server/api.go +++ b/pkg/server/api.go @@ -25,7 +25,7 @@ type RegisterData struct { // RegisterResponse describes the response to a register request type RegisterResponse struct { Success bool `json:"success"` - Error string `json:"error"` + Error string `json:"error,omitempty"` Id string `json:"id"` } @@ -43,7 +43,7 @@ type SpawnData struct { // SpawnResponse is the data to respond with on a spawn command type SpawnResponse struct { Success bool `json:"success"` - Error string `json:"error"` + Error string `json:"error,omitempty"` // The location of the spawned entity Position game.Vector `json:"position"` @@ -62,7 +62,7 @@ type CommandsData struct { // CommandsResponse is the response to be sent back type CommandsResponse struct { Success bool `json:"success"` - Error string `json:"error"` + Error string `json:"error,omitempty"` } const ( @@ -104,7 +104,7 @@ type RadarData struct { // RadarResponse describes the response to a /radar call type RadarResponse struct { Success bool `json:"success"` - Error string `json:"error"` + Error string `json:"error,omitempty"` // The set of positions for nearby rovers Rovers []game.Vector `json:"rovers"` From 5a2d35aca8488b47b2503176d7bdaa13a04621ec Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 17:15:25 +0100 Subject: [PATCH 083/495] Reorganise a little to move the server into it's own directory --- Dockerfile => cmd/rove-server/Dockerfile | 2 +- main.go => cmd/rove-server/main.go | 0 docker-compose.yml | 2 +- script/build.sh | 11 +++++++++++ script/test.sh | 5 ++++- 5 files changed, 17 insertions(+), 3 deletions(-) rename Dockerfile => cmd/rove-server/Dockerfile (90%) rename main.go => cmd/rove-server/main.go (100%) create mode 100755 script/build.sh diff --git a/Dockerfile b/cmd/rove-server/Dockerfile similarity index 90% rename from Dockerfile rename to cmd/rove-server/Dockerfile index d5a7e6f..c10803d 100644 --- a/Dockerfile +++ b/cmd/rove-server/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app COPY . . RUN go mod download -RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" . +RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go CMD [ "./rove-server" ] diff --git a/main.go b/cmd/rove-server/main.go similarity index 100% rename from main.go rename to cmd/rove-server/main.go diff --git a/docker-compose.yml b/docker-compose.yml index 446dafe..d861789 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ volumes: services: rove-server: - build: . + image: rove-server:latest ports: - "80:80" command: ./rove-server --port 80 --data=/mnt/rove-server diff --git a/script/build.sh b/script/build.sh new file mode 100755 index 0000000..b0dbdbb --- /dev/null +++ b/script/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" +cd .. +set -x + +# Generate a version string +export VERSION=$(git describe --always --long --dirty --tags) + +# Build and tag as latest and version +docker build -t "rove-server:latest" -t "rove-server:${VERSION}" -f "cmd/rove-server/Dockerfile" . \ No newline at end of file diff --git a/script/test.sh b/script/test.sh index c903697..c27a3ea 100755 --- a/script/test.sh +++ b/script/test.sh @@ -4,8 +4,11 @@ cd "$(dirname "$0")" cd .. set -x +# Build the image +bash script/build.sh + # Build and start the service -docker-compose up --build --detach +docker-compose up --detach # Run tests, including integration tests go mod download From 3474e6ca8c635c20ab1309ee8e82532c85c2f6f0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 17:24:27 +0100 Subject: [PATCH 084/495] Pull out API definitions and testing into it's own package --- pkg/server/routes.go | 19 ++++++++++--------- pkg/server/routes_test.go | 23 ++++++++++++----------- pkg/server/server.go | 5 +++-- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 6bcb672..3b15492 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -7,6 +7,7 @@ import ( "net/http" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" ) @@ -53,7 +54,7 @@ var Routes = []Route{ func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { // Simply return the current server status - return StatusResponse{ + return rove.StatusResponse{ Ready: true, Version: version.Version, }, nil @@ -61,12 +62,12 @@ func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) // HandleRegister handles /register endpoint func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = RegisterResponse{ + var response = rove.RegisterResponse{ Success: false, } // Decode the registration info, verify it and register the account - var data RegisterData + var data rove.RegisterData err := json.NewDecoder(b).Decode(&data) if err != nil { fmt.Printf("Failed to decode json: %s\n", err) @@ -88,12 +89,12 @@ func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error // HandleSpawn will spawn the player entity for the associated account func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = SpawnResponse{ + var response = rove.SpawnResponse{ Success: false, } // Decode the spawn info, verify it and spawn the rover for this account - var data SpawnData + var data rove.SpawnData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -117,12 +118,12 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { // HandleSpawn will spawn the player entity for the associated account func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = CommandsResponse{ + var response = rove.CommandsResponse{ Success: false, } // Decode the commands, verify them and the account, and execute the commands - var data CommandsData + var data rove.CommandsData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -151,12 +152,12 @@ func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error // HandleRadar handles the radar request func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = RadarResponse{ + var response = rove.RadarResponse{ Success: false, } // Decode the radar message, verify it, and respond with the radar info - var data CommandsData + var data rove.CommandsData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 42b7125..deffd21 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/mdiluz/rove/pkg/game" + "github.com/mdiluz/rove/pkg/rove" "github.com/stretchr/testify/assert" ) @@ -18,7 +19,7 @@ func TestHandleStatus(t *testing.T) { s := NewServer() s.wrapHandler(http.MethodGet, HandleStatus)(response, request) - var status StatusResponse + var status rove.StatusResponse json.NewDecoder(response.Body).Decode(&status) if status.Ready != true { @@ -31,7 +32,7 @@ func TestHandleStatus(t *testing.T) { } func TestHandleRegister(t *testing.T) { - data := RegisterData{Name: "one"} + data := rove.RegisterData{Name: "one"} b, err := json.Marshal(data) if err != nil { t.Error(err) @@ -43,7 +44,7 @@ func TestHandleRegister(t *testing.T) { s := NewServer() s.wrapHandler(http.MethodPost, HandleRegister)(response, request) - var status RegisterResponse + var status rove.RegisterResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { @@ -55,7 +56,7 @@ func TestHandleSpawn(t *testing.T) { s := NewServer() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") - data := SpawnData{Id: a.Id.String()} + data := rove.SpawnData{Id: a.Id.String()} b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") @@ -65,7 +66,7 @@ func TestHandleSpawn(t *testing.T) { s.wrapHandler(http.MethodPost, HandleSpawn)(response, request) - var status SpawnResponse + var status rove.SpawnResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { @@ -84,11 +85,11 @@ func TestHandleCommands(t *testing.T) { pos, err := s.world.RoverPosition(inst) assert.NoError(t, err, "Couldn't get rover position") - data := CommandsData{ + data := rove.CommandsData{ Id: a.Id.String(), - Commands: []Command{ + Commands: []rove.Command{ { - Command: CommandMove, + Command: rove.CommandMove, Bearing: "N", Duration: 1, }, @@ -103,7 +104,7 @@ func TestHandleCommands(t *testing.T) { s.wrapHandler(http.MethodPost, HandleCommands)(response, request) - var status CommandsResponse + var status rove.CommandsResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { @@ -127,7 +128,7 @@ func TestHandleRadar(t *testing.T) { // Spawn the rover rover for the account _, _, err = s.SpawnRoverForAccount(a.Id) - data := RadarData{ + data := rove.RadarData{ Id: a.Id.String(), } @@ -139,7 +140,7 @@ func TestHandleRadar(t *testing.T) { s.wrapHandler(http.MethodPost, HandleRadar)(response, request) - var status RadarResponse + var status rove.RadarResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { diff --git a/pkg/server/server.go b/pkg/server/server.go index c4c9005..beed460 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -14,6 +14,7 @@ import ( "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" + "github.com/mdiluz/rove/pkg/rove" ) const ( @@ -182,11 +183,11 @@ func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UU } // ConvertCommands converts server commands to game commands -func (s *Server) ConvertCommands(commands []Command, inst uuid.UUID) ([]game.Command, error) { +func (s *Server) ConvertCommands(commands []rove.Command, inst uuid.UUID) ([]game.Command, error) { var cmds []game.Command for _, c := range commands { switch c.Command { - case CommandMove: + case rove.CommandMove: if bearing, err := game.DirectionFromString(c.Bearing); err != nil { return nil, err } else { From f82565bf22c32d1f61b474ec07809e20be652027 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 17:59:14 +0100 Subject: [PATCH 085/495] Refactor and implement the api functions --- .vscode/launch.json | 2 +- pkg/{server => rove}/api.go | 53 +++++++++++++------- pkg/rove/http.go | 64 ++++++++++++++++++++++++ pkg/rove/integration_test.go | 39 +++++++++++++++ pkg/server/integration_test.go | 89 ---------------------------------- 5 files changed, 139 insertions(+), 108 deletions(-) rename pkg/{server => rove}/api.go (73%) create mode 100644 pkg/rove/http.go create mode 100644 pkg/rove/integration_test.go delete mode 100644 pkg/server/integration_test.go diff --git a/.vscode/launch.json b/.vscode/launch.json index b3d3cce..5448ce6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "go", "request": "launch", "mode": "auto", - "program": "${workspaceFolder}/", + "program": "${workspaceFolder}/cmd/rove-server/main.go", "cwd": "${workspaceFolder}", "env": {}, "args": [], diff --git a/pkg/server/api.go b/pkg/rove/api.go similarity index 73% rename from pkg/server/api.go rename to pkg/rove/api.go index 5e40393..5d1b8a1 100644 --- a/pkg/server/api.go +++ b/pkg/rove/api.go @@ -1,10 +1,17 @@ -package server +package rove -import "github.com/mdiluz/rove/pkg/game" +import ( + "github.com/mdiluz/rove/pkg/game" +) // ============================== // API: /status method: GET -// Queries the status of the server + +// Status queries the status of the server +func (s Server) Status() (r StatusResponse, err error) { + s.GET("status", &r) + return +} // StatusResponse is a struct that contains information on the status of the server type StatusResponse struct { @@ -14,8 +21,13 @@ type StatusResponse struct { // ============================== // API: /register method: POST -// Registers a user account by name + +// Register registers a user account by name // Responds with a unique ID for that account to be used in future requests +func (s Server) Register(d RegisterData) (r RegisterResponse, err error) { + err = s.POST("register", d, &r) + return +} // RegisterData describes the data to send when registering type RegisterData struct { @@ -32,8 +44,13 @@ type RegisterResponse struct { // ============================== // API: /spawn method: POST -// Spawns the rover for an account + +// Spawn spawns the rover for an account // Responds with the position of said rover +func (s Server) Spawn(d SpawnData) (r SpawnResponse, err error) { + err = s.POST("spawn", d, &r) + return +} // SpawnData is the data to be sent for the spawn command type SpawnData struct { @@ -51,7 +68,12 @@ type SpawnResponse struct { // ============================== // API: /commands method: POST -// Issues a set of commands from the user + +// Commands issues a set of commands from the user +func (s Server) Commands(d CommandsData) (r CommandsResponse, err error) { + err = s.POST("commands", d, &r) + return +} // CommandsData is a set of commands to execute in order type CommandsData struct { @@ -70,17 +92,6 @@ const ( CommandMove = "move" ) -const ( - BearingNorth = "North" - BearingNorthEast - BearingEast - BearingSouthEast - BearingSouth - BearingSouthWest - BearingWest - BearingNorthWest -) - // Command describes a single command to execute // it contains the type, and then any members used for each command type type Command struct { @@ -94,7 +105,13 @@ type Command struct { // ================ // API: /radar POST -// Queries the current radar for the user + +// Radar queries the current radar for the user +// Commands issues a set of commands from the user +func (s Server) Radar(d RadarData) (r RadarResponse, err error) { + err = s.POST("radar", d, &r) + return +} // RadarData describes the input data to request an accounts current radar type RadarData struct { diff --git a/pkg/rove/http.go b/pkg/rove/http.go new file mode 100644 index 0000000..30e4aa5 --- /dev/null +++ b/pkg/rove/http.go @@ -0,0 +1,64 @@ +package rove + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/url" +) + +// Server is a simple wrapper to a server path +type Server string + +// GET performs a GET request +func (s Server) GET(path string, out interface{}) error { + url := url.URL{ + Scheme: "http", + Host: string(s), + Path: path, + } + if resp, err := http.Get(url.String()); err != nil { + return err + + } else if resp.StatusCode != http.StatusOK { + return fmt.Errorf("http.Get returned status %d: %s", resp.StatusCode, resp.Status) + + } else { + return json.NewDecoder(resp.Body).Decode(out) + } +} + +// POST performs a POST request +func (s Server) POST(path string, in interface{}, out interface{}) error { + url := url.URL{ + Scheme: "http", + Host: string(s), + Path: path, + } + client := &http.Client{} + + // Marshal the input + marshalled, err := json.Marshal(in) + if err != nil { + return err + } + + // Set up the request + req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) + if err != nil { + return err + } + + // Do the POST + req.Header.Set("Content-Type", "application/json") + if resp, err := client.Do(req); err != nil { + return err + + } else if resp.StatusCode != http.StatusOK { + return fmt.Errorf("http returned status %d", resp.StatusCode) + + } else { + return json.NewDecoder(resp.Body).Decode(out) + } +} diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go new file mode 100644 index 0000000..cec57f1 --- /dev/null +++ b/pkg/rove/integration_test.go @@ -0,0 +1,39 @@ +package rove + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +var server Server = "localhost:80" + +func TestStatus(t *testing.T) { + status, err := server.Status() + assert.NoError(t, err, "Status must not return error") + assert.True(t, status.Ready, "Server must return ready") + assert.NotZero(t, len(status.Version), "Version must not be empty") +} + +func TestRegister(t *testing.T) { + d1 := RegisterData{ + Name: uuid.New().String(), + } + r1, err := server.Register(d1) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r1.Success, "Register must return success") + assert.NotZero(t, len(r1.Id), "Register must return registration ID") + + d2 := RegisterData{ + Name: uuid.New().String(), + } + r2, err := server.Register(d2) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r2.Success, "Register must return success") + assert.NotZero(t, len(r2.Id), "Register must return registration ID") + + r3, err := server.Register(d1) + assert.NoError(t, err, "Register must not return error") + assert.False(t, r3.Success, "Register must return fail for duplicate registration") +} diff --git a/pkg/server/integration_test.go b/pkg/server/integration_test.go deleted file mode 100644 index 42ea5a0..0000000 --- a/pkg/server/integration_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// +build integration - -package server - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "net/url" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" -) - -var serverUrl = "localhost:80" - -func TestStatus(t *testing.T) { - url := url.URL{ - Scheme: "http", - Host: serverUrl, - Path: "status", - } - resp, err := http.Get(url.String()) - assert.NoError(t, err, "http.Get must not return error") - assert.Equal(t, http.StatusOK, resp.StatusCode, "http.Get must return StatusOK") - - var status StatusResponse - err = json.NewDecoder(resp.Body).Decode(&status) - assert.NoError(t, err, "json decode must not return error") - - assert.NoError(t, err, "Status must not return error") - assert.True(t, status.Ready, "Server must return ready") - assert.NotZero(t, len(status.Version), "Version must not be empty") -} - -// helper for register test -func register(name string) (register RegisterResponse, err error) { - url := url.URL{ - Scheme: "http", - Host: serverUrl, - Path: "register", - } - - // Marshal the register data struct - data := RegisterData{Name: name} - marshalled, err := json.Marshal(data) - - // Set up the request - req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) - req.Header.Set("Content-Type", "application/json") - - // Do the request - client := &http.Client{} - if resp, err := client.Do(req); err != nil { - return RegisterResponse{}, err - } else { - defer resp.Body.Close() - - // Handle any errors - if resp.StatusCode != http.StatusOK { - return RegisterResponse{}, fmt.Errorf("Status request returned %d", resp.StatusCode) - } else { - // Decode the reply - err = json.NewDecoder(resp.Body).Decode(®ister) - } - } - - return -} - -func TestRegister(t *testing.T) { - a := uuid.New().String() - reg1, err := register(a) - assert.NoError(t, err, "Register must not return error") - assert.True(t, reg1.Success, "Register must return success") - assert.NotZero(t, len(reg1.Id), "Register must return registration ID") - - b := uuid.New().String() - reg2, err := register(b) - assert.NoError(t, err, "Register must not return error") - assert.True(t, reg2.Success, "Register must return success") - assert.NotZero(t, len(reg2.Id), "Register must return registration ID") - - reg2, err = register(a) - assert.NoError(t, err, "Register must not return error") - assert.False(t, reg2.Success, "Register must return fail for duplicate registration") -} From 7be2a0f1b74118cab0c0e7924d6a47bb6132b937 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 18:06:16 +0100 Subject: [PATCH 086/495] Add tests for each current API These aren't extensive yet, and don't reset the server, but it's a good step forward --- pkg/rove/integration_test.go | 76 +++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index cec57f1..1368f96 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -9,14 +9,14 @@ import ( var server Server = "localhost:80" -func TestStatus(t *testing.T) { +func TestServer_Status(t *testing.T) { status, err := server.Status() assert.NoError(t, err, "Status must not return error") assert.True(t, status.Ready, "Server must return ready") assert.NotZero(t, len(status.Version), "Version must not be empty") } -func TestRegister(t *testing.T) { +func TestServer_Register(t *testing.T) { d1 := RegisterData{ Name: uuid.New().String(), } @@ -37,3 +37,75 @@ func TestRegister(t *testing.T) { assert.NoError(t, err, "Register must not return error") assert.False(t, r3.Success, "Register must return fail for duplicate registration") } + +func TestServer_Spawn(t *testing.T) { + d1 := RegisterData{ + Name: uuid.New().String(), + } + r1, err := server.Register(d1) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r1.Success, "Register must return success") + assert.NotZero(t, len(r1.Id), "Register must return registration ID") + + s := SpawnData{ + Id: r1.Id, + } + r2, err := server.Spawn(s) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r2.Success, "Register must return success") +} + +func TestServer_Commands(t *testing.T) { + d1 := RegisterData{ + Name: uuid.New().String(), + } + r1, err := server.Register(d1) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r1.Success, "Register must return success") + assert.NotZero(t, len(r1.Id), "Register must return registration ID") + + s := SpawnData{ + Id: r1.Id, + } + r2, err := server.Spawn(s) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r2.Success, "Register must return success") + + c := CommandsData{ + Id: r1.Id, + Commands: []Command{ + { + Command: CommandMove, + Bearing: "N", + Duration: 1, + }, + }, + } + r3, err := server.Commands(c) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r3.Success, "Register must return success") +} + +func TestServer_Radar(t *testing.T) { + d1 := RegisterData{ + Name: uuid.New().String(), + } + r1, err := server.Register(d1) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r1.Success, "Register must return success") + assert.NotZero(t, len(r1.Id), "Register must return registration ID") + + s := SpawnData{ + Id: r1.Id, + } + r2, err := server.Spawn(s) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r2.Success, "Register must return success") + + r := RadarData{ + Id: r1.Id, + } + r3, err := server.Radar(r) + assert.NoError(t, err, "Register must not return error") + assert.True(t, r3.Success, "Register must return success") +} From 7297a6de9a017c16aeb6f24883a003f142f00c5d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 18:09:22 +0100 Subject: [PATCH 087/495] Clean out confusing assert messages --- pkg/rove/integration_test.go | 60 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index 1368f96..c2577f5 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -11,9 +11,9 @@ var server Server = "localhost:80" func TestServer_Status(t *testing.T) { status, err := server.Status() - assert.NoError(t, err, "Status must not return error") - assert.True(t, status.Ready, "Server must return ready") - assert.NotZero(t, len(status.Version), "Version must not be empty") + assert.NoError(t, err) + assert.True(t, status.Ready) + assert.NotZero(t, len(status.Version)) } func TestServer_Register(t *testing.T) { @@ -21,21 +21,21 @@ func TestServer_Register(t *testing.T) { Name: uuid.New().String(), } r1, err := server.Register(d1) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r1.Success, "Register must return success") - assert.NotZero(t, len(r1.Id), "Register must return registration ID") + assert.NoError(t, err) + assert.True(t, r1.Success) + assert.NotZero(t, len(r1.Id)) d2 := RegisterData{ Name: uuid.New().String(), } r2, err := server.Register(d2) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r2.Success, "Register must return success") - assert.NotZero(t, len(r2.Id), "Register must return registration ID") + assert.NoError(t, err) + assert.True(t, r2.Success) + assert.NotZero(t, len(r2.Id)) r3, err := server.Register(d1) - assert.NoError(t, err, "Register must not return error") - assert.False(t, r3.Success, "Register must return fail for duplicate registration") + assert.NoError(t, err) + assert.False(t, r3.Success) } func TestServer_Spawn(t *testing.T) { @@ -43,16 +43,16 @@ func TestServer_Spawn(t *testing.T) { Name: uuid.New().String(), } r1, err := server.Register(d1) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r1.Success, "Register must return success") - assert.NotZero(t, len(r1.Id), "Register must return registration ID") + assert.NoError(t, err) + assert.True(t, r1.Success) + assert.NotZero(t, len(r1.Id)) s := SpawnData{ Id: r1.Id, } r2, err := server.Spawn(s) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r2.Success, "Register must return success") + assert.NoError(t, err) + assert.True(t, r2.Success) } func TestServer_Commands(t *testing.T) { @@ -60,16 +60,16 @@ func TestServer_Commands(t *testing.T) { Name: uuid.New().String(), } r1, err := server.Register(d1) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r1.Success, "Register must return success") - assert.NotZero(t, len(r1.Id), "Register must return registration ID") + assert.NoError(t, err) + assert.True(t, r1.Success) + assert.NotZero(t, len(r1.Id)) s := SpawnData{ Id: r1.Id, } r2, err := server.Spawn(s) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r2.Success, "Register must return success") + assert.NoError(t, err) + assert.True(t, r2.Success) c := CommandsData{ Id: r1.Id, @@ -82,8 +82,8 @@ func TestServer_Commands(t *testing.T) { }, } r3, err := server.Commands(c) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r3.Success, "Register must return success") + assert.NoError(t, err) + assert.True(t, r3.Success) } func TestServer_Radar(t *testing.T) { @@ -91,21 +91,21 @@ func TestServer_Radar(t *testing.T) { Name: uuid.New().String(), } r1, err := server.Register(d1) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r1.Success, "Register must return success") - assert.NotZero(t, len(r1.Id), "Register must return registration ID") + assert.NoError(t, err) + assert.True(t, r1.Success) + assert.NotZero(t, len(r1.Id)) s := SpawnData{ Id: r1.Id, } r2, err := server.Spawn(s) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r2.Success, "Register must return success") + assert.NoError(t, err) + assert.True(t, r2.Success) r := RadarData{ Id: r1.Id, } r3, err := server.Radar(r) - assert.NoError(t, err, "Register must not return error") - assert.True(t, r3.Success, "Register must return success") + assert.NoError(t, err) + assert.True(t, r3.Success) } From c2a46bf1caaf891b9eab8f5f6215b7cb455823d7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 18:11:28 +0100 Subject: [PATCH 088/495] Add a bullet point for the PoC to execute commands in real time --- docs/poc.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/poc.md b/docs/poc.md index 1a4e90e..f6442d8 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -11,6 +11,7 @@ For a proof of concept we'll implement a very small subset of the final features * Persistent accounts and world (done) * Multiple users (done) * Populate map with locations/objects +* Commands happen in "real time" ### Stretch goals From 0620b9ce991353f38f60d2e8a7833475dfc3cd17 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 18:26:11 +0100 Subject: [PATCH 089/495] Add empty "rove" executable --- cmd/rove/main.go | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cmd/rove/main.go diff --git a/cmd/rove/main.go b/cmd/rove/main.go new file mode 100644 index 0000000..9a12136 --- /dev/null +++ b/cmd/rove/main.go @@ -0,0 +1,7 @@ +package main + +import "flag" + +func main() { + flag.Parse() +} From 88087e0338680a40fbf923c05b93da4f45de66ae Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 19:08:36 +0100 Subject: [PATCH 090/495] Implement most rove commands Need to finish up /commands Need to pretify output of others --- cmd/rove/main.go | 159 ++++++++++++++++++++++++++++++++++++++++++++++- script/build.sh | 1 + 2 files changed, 159 insertions(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 9a12136..c429ee7 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -1,7 +1,164 @@ package main -import "flag" +import ( + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "os" + "path" + + "github.com/mdiluz/rove/pkg/rove" +) + +var USAGE = "" + +// Command usage +func Usage() { + fmt.Printf("Usage: %s [OPTIONS]... COMMAND\n", os.Args[0]) + fmt.Println("\nCommands:") + fmt.Println("\tstatus \tprints the server status") + fmt.Println("\tregister\tregisters an account and stores it (use with -name)") + fmt.Println("\tspawn \tspawns a rover for the current account") + fmt.Println("\tcommands\tissues commands to the rover") + fmt.Println("\tradar \tgathers radar data for the current rover") + fmt.Println("\nOptions:") + flag.PrintDefaults() +} + +var home = os.Getenv("HOME") +var filepath = path.Join(home, ".local/share/rove.json") + +var host = flag.String("host", "api.rove-game.com", "path to game host server") +var dataPath = flag.String("data", filepath, "data file for storage") + +// Data is used to store internal data +type Data struct { + Account string `json:"account,omitempty"` + Host string `json:"host,omitempty"` +} + +var name = flag.String("name", "", "used with status command for the account name") + +func verifyId(d Data) { + if len(d.Account) == 0 { + fmt.Fprintf(os.Stderr, "No account ID set, must register first or set \"account\" value in %s\n", *dataPath) + os.Exit(1) + } +} func main() { + flag.Usage = Usage flag.Parse() + + // Verify we have a single command line arg + args := flag.Args() + if len(args) != 1 { + Usage() + os.Exit(1) + } + + // Load in the persistent file + var data = Data{} + _, err := os.Stat(*dataPath) + if !os.IsNotExist(err) { + // Read and unmarshal the json + if b, err := ioutil.ReadFile(*dataPath); err != nil { + fmt.Fprintf(os.Stderr, "failed to read file %s error: %s\n", *dataPath, err) + os.Exit(1) + } else if len(b) == 0 { + fmt.Fprintf(os.Stderr, "file %s was empty, assumin fresh data\n", *dataPath) + + } else if err := json.Unmarshal(b, &data); err != nil { + fmt.Fprintf(os.Stderr, "failed to unmarshal file %s error: %s\n", *dataPath, err) + os.Exit(1) + } + } + + var server = rove.Server(*host) + + command := args[0] + switch command { + case "status": + if response, err := server.Status(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else { + fmt.Printf("Ready: %t\n", response.Ready) + fmt.Printf("Version: %s\n", response.Version) + } + case "register": + d := rove.RegisterData{ + Name: *name, + } + if response, err := server.Register(d); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else if !response.Success { + fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) + os.Exit(1) + + } else { + fmt.Printf("Registered account with id: %s\n", response.Id) + data.Account = response.Id + } + case "spawn": + verifyId(data) + d := rove.SpawnData{Id: data.Account} + if response, err := server.Spawn(d); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else if !response.Success { + fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) + os.Exit(1) + + } else { + fmt.Printf("Spawned at position %+v\n", response.Position) + } + case "commands": + verifyId(data) + d := rove.CommandsData{Id: data.Account} + // TODO: Send real commands in + if response, err := server.Commands(d); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else if !response.Success { + fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) + os.Exit(1) + + } else { + // TODO: Pretify the response + fmt.Printf("%+v\n", response) + } + case "radar": + verifyId(data) + d := rove.RadarData{Id: data.Account} + if response, err := server.Radar(d); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else if !response.Success { + fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) + os.Exit(1) + + } else { + // TODO: Pretify the response + fmt.Printf("%+v\n", response) + } + } + + // Save out the persistent file + if b, err := json.MarshalIndent(data, "", "\t"); err != nil { + fmt.Fprintf(os.Stderr, "failed to marshal data error: %s\n", err) + os.Exit(1) + } else { + if err := ioutil.WriteFile(*dataPath, b, os.ModePerm); err != nil { + fmt.Fprintf(os.Stderr, "failed to save file %s error: %s\n", *dataPath, err) + os.Exit(1) + } + } } diff --git a/script/build.sh b/script/build.sh index b0dbdbb..e375620 100755 --- a/script/build.sh +++ b/script/build.sh @@ -8,4 +8,5 @@ set -x export VERSION=$(git describe --always --long --dirty --tags) # Build and tag as latest and version +docker build -t "rove:latest" -t "rove:${VERSION}" -f "cmd/rove/Dockerfile" . docker build -t "rove-server:latest" -t "rove-server:${VERSION}" -f "cmd/rove-server/Dockerfile" . \ No newline at end of file From 62d3ed3a56082191cb581ac9d2dc4d9ec082769e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 21:29:40 +0100 Subject: [PATCH 091/495] Add missing Dockerfile --- cmd/rove/Dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 cmd/rove/Dockerfile diff --git a/cmd/rove/Dockerfile b/cmd/rove/Dockerfile new file mode 100644 index 0000000..a5ae0d3 --- /dev/null +++ b/cmd/rove/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:latest +LABEL maintainer="Marc Di Luzio " + +WORKDIR /app +COPY . . +RUN go mod download + +RUN go build -o rove -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove/main.go + +CMD [ "./rove" ] + From d3dd1130a299cfdea664a784e6d1b10b042636bd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 21:29:55 +0100 Subject: [PATCH 092/495] Very minor cleanups and error addition --- cmd/rove/main.go | 10 +++++++++- pkg/rove/api.go | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index c429ee7..337c537 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -62,7 +62,6 @@ func main() { var data = Data{} _, err := os.Stat(*dataPath) if !os.IsNotExist(err) { - // Read and unmarshal the json if b, err := ioutil.ReadFile(*dataPath); err != nil { fmt.Fprintf(os.Stderr, "failed to read file %s error: %s\n", *dataPath, err) os.Exit(1) @@ -88,6 +87,7 @@ func main() { fmt.Printf("Ready: %t\n", response.Ready) fmt.Printf("Version: %s\n", response.Version) } + case "register": d := rove.RegisterData{ Name: *name, @@ -118,10 +118,13 @@ func main() { } else { fmt.Printf("Spawned at position %+v\n", response.Position) } + case "commands": verifyId(data) d := rove.CommandsData{Id: data.Account} + // TODO: Send real commands in + if response, err := server.Commands(d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -134,6 +137,7 @@ func main() { // TODO: Pretify the response fmt.Printf("%+v\n", response) } + case "radar": verifyId(data) d := rove.RadarData{Id: data.Account} @@ -149,6 +153,10 @@ func main() { // TODO: Pretify the response fmt.Printf("%+v\n", response) } + + default: + fmt.Fprintf(os.Stderr, "Unknown command: %s\n", command) + os.Exit(1) } // Save out the persistent file diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 5d1b8a1..189f297 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -22,8 +22,8 @@ type StatusResponse struct { // ============================== // API: /register method: POST -// Register registers a user account by name -// Responds with a unique ID for that account to be used in future requests +// Register registers a user by name +// Responds with a unique ID for that user to be used in future requests func (s Server) Register(d RegisterData) (r RegisterResponse, err error) { err = s.POST("register", d, &r) return From a89e577aec17b86cf891ae31c62bf331bd8a2e8f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 21:45:21 +0100 Subject: [PATCH 093/495] Let the docker-compose file build the server docker --- docker-compose.yml | 3 +++ script/test.sh | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d861789..76f4aa0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,9 @@ volumes: services: rove-server: + build: + context: . + dockerfile: cmd/rove-server/Dockerfile image: rove-server:latest ports: - "80:80" diff --git a/script/test.sh b/script/test.sh index c27a3ea..e3547eb 100755 --- a/script/test.sh +++ b/script/test.sh @@ -4,11 +4,8 @@ cd "$(dirname "$0")" cd .. set -x -# Build the image -bash script/build.sh - -# Build and start the service -docker-compose up --detach +# Build and start rove-server +docker-compose up --detach --build # Run tests, including integration tests go mod download @@ -17,5 +14,8 @@ go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out # Take down the service docker-compose down +# Check that the cmdline client builds +docker build -f "cmd/rove/Dockerfile" . + # Convert the coverage data to html go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From 832f206a539a098dca77ccb8f4b71799b5abd1df Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 21:47:13 +0100 Subject: [PATCH 094/495] Store the host in the config file --- cmd/rove/main.go | 53 +++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 337c537..7efdcd1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -30,19 +30,19 @@ var home = os.Getenv("HOME") var filepath = path.Join(home, ".local/share/rove.json") var host = flag.String("host", "api.rove-game.com", "path to game host server") -var dataPath = flag.String("data", filepath, "data file for storage") +var data = flag.String("data", filepath, "data file for storage") -// Data is used to store internal data -type Data struct { +// Config is used to store internal data +type Config struct { Account string `json:"account,omitempty"` Host string `json:"host,omitempty"` } var name = flag.String("name", "", "used with status command for the account name") -func verifyId(d Data) { +func verifyId(d Config) { if len(d.Account) == 0 { - fmt.Fprintf(os.Stderr, "No account ID set, must register first or set \"account\" value in %s\n", *dataPath) + fmt.Fprintf(os.Stderr, "No account ID set, must register first or set \"account\" value in %s\n", *data) os.Exit(1) } } @@ -58,24 +58,31 @@ func main() { os.Exit(1) } + // Set up the config + var config = Config{ + Host: *host, + } + var server = rove.Server(*host) + // Load in the persistent file - var data = Data{} - _, err := os.Stat(*dataPath) + _, err := os.Stat(*data) if !os.IsNotExist(err) { - if b, err := ioutil.ReadFile(*dataPath); err != nil { - fmt.Fprintf(os.Stderr, "failed to read file %s error: %s\n", *dataPath, err) + if b, err := ioutil.ReadFile(*data); err != nil { + fmt.Fprintf(os.Stderr, "failed to read file %s error: %s\n", *data, err) os.Exit(1) } else if len(b) == 0 { - fmt.Fprintf(os.Stderr, "file %s was empty, assumin fresh data\n", *dataPath) + fmt.Fprintf(os.Stderr, "file %s was empty, assumin fresh data\n", *data) - } else if err := json.Unmarshal(b, &data); err != nil { - fmt.Fprintf(os.Stderr, "failed to unmarshal file %s error: %s\n", *dataPath, err) + } else if err := json.Unmarshal(b, &config); err != nil { + fmt.Fprintf(os.Stderr, "failed to unmarshal file %s error: %s\n", *data, err) os.Exit(1) } } - var server = rove.Server(*host) + // Print the config info + fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Account) + // Handle all the commands command := args[0] switch command { case "status": @@ -102,11 +109,11 @@ func main() { } else { fmt.Printf("Registered account with id: %s\n", response.Id) - data.Account = response.Id + config.Account = response.Id } case "spawn": - verifyId(data) - d := rove.SpawnData{Id: data.Account} + verifyId(config) + d := rove.SpawnData{Id: config.Account} if response, err := server.Spawn(d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -120,8 +127,8 @@ func main() { } case "commands": - verifyId(data) - d := rove.CommandsData{Id: data.Account} + verifyId(config) + d := rove.CommandsData{Id: config.Account} // TODO: Send real commands in @@ -139,8 +146,8 @@ func main() { } case "radar": - verifyId(data) - d := rove.RadarData{Id: data.Account} + verifyId(config) + d := rove.RadarData{Id: config.Account} if response, err := server.Radar(d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -160,12 +167,12 @@ func main() { } // Save out the persistent file - if b, err := json.MarshalIndent(data, "", "\t"); err != nil { + if b, err := json.MarshalIndent(config, "", "\t"); err != nil { fmt.Fprintf(os.Stderr, "failed to marshal data error: %s\n", err) os.Exit(1) } else { - if err := ioutil.WriteFile(*dataPath, b, os.ModePerm); err != nil { - fmt.Fprintf(os.Stderr, "failed to save file %s error: %s\n", *dataPath, err) + if err := ioutil.WriteFile(*data, b, os.ModePerm); err != nil { + fmt.Fprintf(os.Stderr, "failed to save file %s error: %s\n", *data, err) os.Exit(1) } } From e2e0256d4465839fb5e033066b047b0baae655ee Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 21:56:40 +0100 Subject: [PATCH 095/495] Remove old unneded build script --- script/build.sh | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100755 script/build.sh diff --git a/script/build.sh b/script/build.sh deleted file mode 100755 index e375620..0000000 --- a/script/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e -cd "$(dirname "$0")" -cd .. -set -x - -# Generate a version string -export VERSION=$(git describe --always --long --dirty --tags) - -# Build and tag as latest and version -docker build -t "rove:latest" -t "rove:${VERSION}" -f "cmd/rove/Dockerfile" . -docker build -t "rove-server:latest" -t "rove-server:${VERSION}" -f "cmd/rove-server/Dockerfile" . \ No newline at end of file From 9d57f48f9860390bfb0c4a9f9f608652fd93def5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 22:23:01 +0100 Subject: [PATCH 096/495] Add /rover command to get rover info --- cmd/rove/main.go | 39 +++++++++++++++++++++++++++++------- pkg/rove/api.go | 24 +++++++++++++++++++++- pkg/rove/integration_test.go | 24 ++++++++++++++++++++++ pkg/server/routes.go | 36 +++++++++++++++++++++++++++++++++ pkg/server/routes_test.go | 30 +++++++++++++++++++++++++++ pkg/server/server.go | 1 - 6 files changed, 145 insertions(+), 9 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 7efdcd1..eae9302 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -22,6 +22,7 @@ func Usage() { fmt.Println("\tspawn \tspawns a rover for the current account") fmt.Println("\tcommands\tissues commands to the rover") fmt.Println("\tradar \tgathers radar data for the current rover") + fmt.Println("\trover \tgets data for current rover") fmt.Println("\nOptions:") flag.PrintDefaults() } @@ -29,7 +30,7 @@ func Usage() { var home = os.Getenv("HOME") var filepath = path.Join(home, ".local/share/rove.json") -var host = flag.String("host", "api.rove-game.com", "path to game host server") +var host = flag.String("host", "", "path to game host server") var data = flag.String("data", filepath, "data file for storage") // Config is used to store internal data @@ -58,13 +59,8 @@ func main() { os.Exit(1) } - // Set up the config - var config = Config{ - Host: *host, - } - var server = rove.Server(*host) - // Load in the persistent file + var config = Config{} _, err := os.Stat(*data) if !os.IsNotExist(err) { if b, err := ioutil.ReadFile(*data); err != nil { @@ -79,6 +75,20 @@ func main() { } } + // If there's a host set on the command line, override the one in the config + if len(*host) != 0 { + config.Host = *host + } + + // If there's still no host, bail + if len(config.Host) == 0 { + fmt.Fprintln(os.Stderr, "no host set, please set one with -host") + os.Exit(1) + } + + // Set up the server + var server = rove.Server(config.Host) + // Print the config info fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Account) @@ -161,6 +171,21 @@ func main() { fmt.Printf("%+v\n", response) } + case "rover": + verifyId(config) + d := rove.RoverData{Id: config.Account} + if response, err := server.Rover(d); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + + } else if !response.Success { + fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) + os.Exit(1) + + } else { + fmt.Printf("position: %v\n", response.Position) + } + default: fmt.Fprintf(os.Stderr, "Unknown command: %s\n", command) os.Exit(1) diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 189f297..8a75766 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -107,7 +107,6 @@ type Command struct { // API: /radar POST // Radar queries the current radar for the user -// Commands issues a set of commands from the user func (s Server) Radar(d RadarData) (r RadarResponse, err error) { err = s.POST("radar", d, &r) return @@ -126,3 +125,26 @@ type RadarResponse struct { // The set of positions for nearby rovers Rovers []game.Vector `json:"rovers"` } + +// ================ +// API: /rover POST + +// Rover queries the current state of the rover +func (s Server) Rover(d RoverData) (r RoverResponse, err error) { + err = s.POST("rover", d, &r) + return +} + +// RoverData describes the input data to request rover status +type RoverData struct { + Id string `json:"id"` +} + +// RoverResponse includes information about the rover in question +type RoverResponse struct { + Success bool `json:"success"` + Error string `json:"error,omitempty"` + + // The set of positions for nearby rovers + Position game.Vector `json:"position"` +} diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index c2577f5..06ed9ab 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -109,3 +109,27 @@ func TestServer_Radar(t *testing.T) { assert.NoError(t, err) assert.True(t, r3.Success) } + +func TestServer_Rover(t *testing.T) { + d1 := RegisterData{ + Name: uuid.New().String(), + } + r1, err := server.Register(d1) + assert.NoError(t, err) + assert.True(t, r1.Success) + assert.NotZero(t, len(r1.Id)) + + s := SpawnData{ + Id: r1.Id, + } + r2, err := server.Spawn(s) + assert.NoError(t, err) + assert.True(t, r2.Success) + + r := RoverData{ + Id: r1.Id, + } + r3, err := server.Rover(r) + assert.NoError(t, err) + assert.True(t, r3.Success) +} diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 3b15492..8462857 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -48,6 +48,11 @@ var Routes = []Route{ method: http.MethodPost, handler: HandleRadar, }, + { + path: "/rover", + method: http.MethodPost, + handler: HandleRover, + }, } // HandleStatus handles the /status request @@ -181,3 +186,34 @@ func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { return response, nil } + +// HandleRover handles the rover request +func HandleRover(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { + var response = rove.RoverResponse{ + Success: false, + } + + var data rove.RoverData + if err := json.NewDecoder(b).Decode(&data); err != nil { + fmt.Printf("Failed to decode json: %s\n", err) + response.Error = err.Error() + + } else if len(data.Id) == 0 { + response.Error = "No account ID provided" + + } else if id, err := uuid.Parse(data.Id); err != nil { + response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) + + } else if inst, err := s.accountant.GetRover(id); err != nil { + response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + + } else if pos, err := s.world.RoverPosition(inst); err != nil { + response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) + + } else { + response.Position = pos + response.Success = true + } + + return response, nil +} diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index deffd21..828df1f 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -149,3 +149,33 @@ func TestHandleRadar(t *testing.T) { // TODO: Verify the radar information } + +func TestHandleRover(t *testing.T) { + s := NewServer() + a, err := s.accountant.RegisterAccount("test") + assert.NoError(t, err, "Error registering account") + + // Spawn the rover rover for the account + _, _, err = s.SpawnRoverForAccount(a.Id) + + data := rove.RoverData{ + Id: a.Id.String(), + } + + b, err := json.Marshal(data) + assert.NoError(t, err, "Error marshalling data") + + request, _ := http.NewRequest(http.MethodPost, "/rover", bytes.NewReader(b)) + response := httptest.NewRecorder() + + s.wrapHandler(http.MethodPost, HandleRover)(response, request) + + var status rove.RoverResponse + json.NewDecoder(response.Body).Decode(&status) + + if status.Success != true { + t.Errorf("got false for /rover") + } + + // TODO: Verify the radar information +} diff --git a/pkg/server/server.go b/pkg/server/server.go index beed460..00ec75a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -157,7 +157,6 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons } else { w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) } } } From 9ae1f50f46f2483e8a9ac088cbc23309c9c752c5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 22:29:51 +0100 Subject: [PATCH 097/495] Rename /commands to /command Make it a verb not a GET fetch --- cmd/rove/main.go | 8 ++++---- pkg/rove/api.go | 16 ++++++++-------- pkg/rove/integration_test.go | 6 +++--- pkg/server/routes.go | 12 ++++++------ pkg/server/routes_test.go | 12 ++++++------ 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index eae9302..086a2c9 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -20,7 +20,7 @@ func Usage() { fmt.Println("\tstatus \tprints the server status") fmt.Println("\tregister\tregisters an account and stores it (use with -name)") fmt.Println("\tspawn \tspawns a rover for the current account") - fmt.Println("\tcommands\tissues commands to the rover") + fmt.Println("\tcommand \tissues commands to the rover") fmt.Println("\tradar \tgathers radar data for the current rover") fmt.Println("\trover \tgets data for current rover") fmt.Println("\nOptions:") @@ -136,13 +136,13 @@ func main() { fmt.Printf("Spawned at position %+v\n", response.Position) } - case "commands": + case "command": verifyId(config) - d := rove.CommandsData{Id: config.Account} + d := rove.CommandData{Id: config.Account} // TODO: Send real commands in - if response, err := server.Commands(d); err != nil { + if response, err := server.Command(d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 8a75766..4d3512e 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -67,22 +67,22 @@ type SpawnResponse struct { } // ============================== -// API: /commands method: POST +// API: /command method: POST -// Commands issues a set of commands from the user -func (s Server) Commands(d CommandsData) (r CommandsResponse, err error) { - err = s.POST("commands", d, &r) +// Command issues a set of commands from the user +func (s Server) Command(d CommandData) (r CommandResponse, err error) { + err = s.POST("command", d, &r) return } -// CommandsData is a set of commands to execute in order -type CommandsData struct { +// CommandData is a set of commands to execute in order +type CommandData struct { Id string `json:"id"` Commands []Command `json:"commands"` } -// CommandsResponse is the response to be sent back -type CommandsResponse struct { +// CommandResponse is the response to be sent back +type CommandResponse struct { Success bool `json:"success"` Error string `json:"error,omitempty"` } diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index 06ed9ab..465f3f0 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -55,7 +55,7 @@ func TestServer_Spawn(t *testing.T) { assert.True(t, r2.Success) } -func TestServer_Commands(t *testing.T) { +func TestServer_Command(t *testing.T) { d1 := RegisterData{ Name: uuid.New().String(), } @@ -71,7 +71,7 @@ func TestServer_Commands(t *testing.T) { assert.NoError(t, err) assert.True(t, r2.Success) - c := CommandsData{ + c := CommandData{ Id: r1.Id, Commands: []Command{ { @@ -81,7 +81,7 @@ func TestServer_Commands(t *testing.T) { }, }, } - r3, err := server.Commands(c) + r3, err := server.Command(c) assert.NoError(t, err) assert.True(t, r3.Success) } diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 8462857..41486d0 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -39,9 +39,9 @@ var Routes = []Route{ handler: HandleSpawn, }, { - path: "/commands", + path: "/command", method: http.MethodPost, - handler: HandleCommands, + handler: HandleCommand, }, { path: "/radar", @@ -122,13 +122,13 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { } // HandleSpawn will spawn the player entity for the associated account -func HandleCommands(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.CommandsResponse{ +func HandleCommand(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { + var response = rove.CommandResponse{ Success: false, } // Decode the commands, verify them and the account, and execute the commands - var data rove.CommandsData + var data rove.CommandData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() @@ -162,7 +162,7 @@ func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { } // Decode the radar message, verify it, and respond with the radar info - var data rove.CommandsData + var data rove.CommandData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 828df1f..7b9a789 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -74,7 +74,7 @@ func TestHandleSpawn(t *testing.T) { } } -func TestHandleCommands(t *testing.T) { +func TestHandleCommand(t *testing.T) { s := NewServer() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") @@ -85,7 +85,7 @@ func TestHandleCommands(t *testing.T) { pos, err := s.world.RoverPosition(inst) assert.NoError(t, err, "Couldn't get rover position") - data := rove.CommandsData{ + data := rove.CommandData{ Id: a.Id.String(), Commands: []rove.Command{ { @@ -99,16 +99,16 @@ func TestHandleCommands(t *testing.T) { b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, "/commands", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, "/command", bytes.NewReader(b)) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleCommands)(response, request) + s.wrapHandler(http.MethodPost, HandleCommand)(response, request) - var status rove.CommandsResponse + var status rove.CommandResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /commands") + t.Errorf("got false for /command") } attrib, err := s.world.RoverAttributes(inst) From cade908ed27f12f476258c20b038f17e8cdcd66f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 23:08:59 +0100 Subject: [PATCH 098/495] Refactor APIs to take an /{accountid}/ prefix --- cmd/rove/main.go | 14 ++++----- pkg/rove/api.go | 39 +++++++++-------------- pkg/rove/integration_test.go | 37 +++++++--------------- pkg/server/routes.go | 59 ++++++++++++++++------------------- pkg/server/routes_test.go | 60 ++++++++++++++++++------------------ pkg/server/server.go | 4 ++- 6 files changed, 92 insertions(+), 121 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 086a2c9..2edb086 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -123,8 +123,8 @@ func main() { } case "spawn": verifyId(config) - d := rove.SpawnData{Id: config.Account} - if response, err := server.Spawn(d); err != nil { + d := rove.SpawnData{} + if response, err := server.Spawn(config.Account, d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -138,11 +138,11 @@ func main() { case "command": verifyId(config) - d := rove.CommandData{Id: config.Account} + d := rove.CommandData{} // TODO: Send real commands in - if response, err := server.Command(d); err != nil { + if response, err := server.Command(config.Account, d); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -157,8 +157,7 @@ func main() { case "radar": verifyId(config) - d := rove.RadarData{Id: config.Account} - if response, err := server.Radar(d); err != nil { + if response, err := server.Radar(config.Account); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -173,8 +172,7 @@ func main() { case "rover": verifyId(config) - d := rove.RoverData{Id: config.Account} - if response, err := server.Rover(d); err != nil { + if response, err := server.Rover(config.Account); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 4d3512e..7ad5062 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -1,6 +1,8 @@ package rove import ( + "path" + "github.com/mdiluz/rove/pkg/game" ) @@ -43,18 +45,18 @@ type RegisterResponse struct { } // ============================== -// API: /spawn method: POST +// API: /{account}/spawn method: POST // Spawn spawns the rover for an account // Responds with the position of said rover -func (s Server) Spawn(d SpawnData) (r SpawnResponse, err error) { - err = s.POST("spawn", d, &r) +func (s Server) Spawn(account string, d SpawnData) (r SpawnResponse, err error) { + err = s.POST(path.Join(account, "spawn"), d, &r) return } // SpawnData is the data to be sent for the spawn command type SpawnData struct { - Id string `json:"id"` + // Empty for now, reserved for data } // SpawnResponse is the data to respond with on a spawn command @@ -67,17 +69,16 @@ type SpawnResponse struct { } // ============================== -// API: /command method: POST +// API: /{account}/command method: POST // Command issues a set of commands from the user -func (s Server) Command(d CommandData) (r CommandResponse, err error) { - err = s.POST("command", d, &r) +func (s Server) Command(account string, d CommandData) (r CommandResponse, err error) { + err = s.POST(path.Join(account, "command"), d, &r) return } // CommandData is a set of commands to execute in order type CommandData struct { - Id string `json:"id"` Commands []Command `json:"commands"` } @@ -104,19 +105,14 @@ type Command struct { } // ================ -// API: /radar POST +// API: /{account}/radar method: GET // Radar queries the current radar for the user -func (s Server) Radar(d RadarData) (r RadarResponse, err error) { - err = s.POST("radar", d, &r) +func (s Server) Radar(account string) (r RadarResponse, err error) { + err = s.GET(path.Join(account, "radar"), &r) return } -// RadarData describes the input data to request an accounts current radar -type RadarData struct { - Id string `json:"id"` -} - // RadarResponse describes the response to a /radar call type RadarResponse struct { Success bool `json:"success"` @@ -127,19 +123,14 @@ type RadarResponse struct { } // ================ -// API: /rover POST +// API: /{account}/rover method: GET // Rover queries the current state of the rover -func (s Server) Rover(d RoverData) (r RoverResponse, err error) { - err = s.POST("rover", d, &r) +func (s Server) Rover(account string) (r RoverResponse, err error) { + err = s.GET(path.Join(account, "rover"), &r) return } -// RoverData describes the input data to request rover status -type RoverData struct { - Id string `json:"id"` -} - // RoverResponse includes information about the rover in question type RoverResponse struct { Success bool `json:"success"` diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index 465f3f0..efb11ec 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -47,10 +47,8 @@ func TestServer_Spawn(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{ - Id: r1.Id, - } - r2, err := server.Spawn(s) + s := SpawnData{} + r2, err := server.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) } @@ -64,15 +62,12 @@ func TestServer_Command(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{ - Id: r1.Id, - } - r2, err := server.Spawn(s) + s := SpawnData{} + r2, err := server.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) c := CommandData{ - Id: r1.Id, Commands: []Command{ { Command: CommandMove, @@ -81,7 +76,7 @@ func TestServer_Command(t *testing.T) { }, }, } - r3, err := server.Command(c) + r3, err := server.Command(r1.Id, c) assert.NoError(t, err) assert.True(t, r3.Success) } @@ -95,17 +90,12 @@ func TestServer_Radar(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{ - Id: r1.Id, - } - r2, err := server.Spawn(s) + s := SpawnData{} + r2, err := server.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) - r := RadarData{ - Id: r1.Id, - } - r3, err := server.Radar(r) + r3, err := server.Radar(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) } @@ -119,17 +109,12 @@ func TestServer_Rover(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{ - Id: r1.Id, - } - r2, err := server.Spawn(s) + s := SpawnData{} + r2, err := server.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) - r := RoverData{ - Id: r1.Id, - } - r3, err := server.Rover(r) + r3, err := server.Rover(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) } diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 41486d0..9869f95 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -12,7 +12,7 @@ import ( ) // Handler describes a function that handles any incoming request and can respond -type Handler func(*Server, io.ReadCloser, io.Writer) (interface{}, error) +type Handler func(*Server, map[string]string, io.ReadCloser, io.Writer) (interface{}, error) // Route defines the information for a single path->function route type Route struct { @@ -34,29 +34,29 @@ var Routes = []Route{ handler: HandleRegister, }, { - path: "/spawn", + path: "/{account}/spawn", method: http.MethodPost, handler: HandleSpawn, }, { - path: "/command", + path: "/{account}/command", method: http.MethodPost, handler: HandleCommand, }, { - path: "/radar", - method: http.MethodPost, + path: "/{account}/radar", + method: http.MethodGet, handler: HandleRadar, }, { - path: "/rover", - method: http.MethodPost, + path: "/{account}/rover", + method: http.MethodGet, handler: HandleRover, }, } // HandleStatus handles the /status request -func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { // Simply return the current server status return rove.StatusResponse{ @@ -66,7 +66,7 @@ func HandleStatus(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) } // HandleRegister handles /register endpoint -func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.RegisterResponse{ Success: false, } @@ -93,21 +93,23 @@ func HandleRegister(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error } // HandleSpawn will spawn the player entity for the associated account -func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.SpawnResponse{ Success: false, } + id := vars["account"] + // Decode the spawn info, verify it and spawn the rover for this account var data rove.SpawnData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() - } else if len(data.Id) == 0 { + } else if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(data.Id); err != nil { + } else if id, err := uuid.Parse(id); err != nil { response.Error = "Provided account ID was invalid" } else if pos, _, err := s.SpawnRoverForAccount(id); err != nil { @@ -122,21 +124,23 @@ func HandleSpawn(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { } // HandleSpawn will spawn the player entity for the associated account -func HandleCommand(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.CommandResponse{ Success: false, } + id := vars["account"] + // Decode the commands, verify them and the account, and execute the commands var data rove.CommandData if err := json.NewDecoder(b).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() - } else if len(data.Id) == 0 { + } else if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(data.Id); err != nil { + } else if id, err := uuid.Parse(id); err != nil { response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) } else if inst, err := s.accountant.GetRover(id); err != nil { @@ -156,21 +160,16 @@ func HandleCommand(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) } // HandleRadar handles the radar request -func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.RadarResponse{ Success: false, } - // Decode the radar message, verify it, and respond with the radar info - var data rove.CommandData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(data.Id) == 0 { + id := vars["account"] + if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(data.Id); err != nil { + } else if id, err := uuid.Parse(id); err != nil { response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) } else if inst, err := s.accountant.GetRover(id); err != nil { @@ -188,20 +187,16 @@ func HandleRadar(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { } // HandleRover handles the rover request -func HandleRover(s *Server, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.RoverResponse{ Success: false, } - var data rove.RoverData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(data.Id) == 0 { + id := vars["account"] + if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(data.Id); err != nil { + } else if id, err := uuid.Parse(id); err != nil { response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) } else if inst, err := s.accountant.GetRover(id); err != nil { diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 7b9a789..cade48f 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "path" "testing" "github.com/mdiluz/rove/pkg/game" @@ -13,11 +14,14 @@ import ( ) func TestHandleStatus(t *testing.T) { + request, _ := http.NewRequest(http.MethodGet, "/status", nil) response := httptest.NewRecorder() s := NewServer() - s.wrapHandler(http.MethodGet, HandleStatus)(response, request) + s.Initialise() + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.StatusResponse json.NewDecoder(response.Body).Decode(&status) @@ -42,7 +46,9 @@ func TestHandleRegister(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.wrapHandler(http.MethodPost, HandleRegister)(response, request) + s.Initialise() + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.RegisterResponse json.NewDecoder(response.Body).Decode(&status) @@ -54,28 +60,32 @@ func TestHandleRegister(t *testing.T) { func TestHandleSpawn(t *testing.T) { s := NewServer() + s.Initialise() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") - data := rove.SpawnData{Id: a.Id.String()} + data := rove.SpawnData{} b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, "/spawn", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Id.String(), "/spawn"), bytes.NewReader(b)) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleSpawn)(response, request) + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.SpawnResponse json.NewDecoder(response.Body).Decode(&status) + assert.Equal(t, http.StatusOK, response.Code) if status.Success != true { - t.Errorf("got false for /spawn") + t.Errorf("got false for /spawn: %s", status.Error) } } func TestHandleCommand(t *testing.T) { s := NewServer() + s.Initialise() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") @@ -86,7 +96,6 @@ func TestHandleCommand(t *testing.T) { assert.NoError(t, err, "Couldn't get rover position") data := rove.CommandData{ - Id: a.Id.String(), Commands: []rove.Command{ { Command: rove.CommandMove, @@ -99,16 +108,17 @@ func TestHandleCommand(t *testing.T) { b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, "/command", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Id.String(), "/command"), bytes.NewReader(b)) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleCommand)(response, request) + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.CommandResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /command") + t.Errorf("got false for /command: %s", status.Error) } attrib, err := s.world.RoverAttributes(inst) @@ -122,29 +132,24 @@ func TestHandleCommand(t *testing.T) { func TestHandleRadar(t *testing.T) { s := NewServer() + s.Initialise() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account _, _, err = s.SpawnRoverForAccount(a.Id) - data := rove.RadarData{ - Id: a.Id.String(), - } - - b, err := json.Marshal(data) - assert.NoError(t, err, "Error marshalling data") - - request, _ := http.NewRequest(http.MethodPost, "/radar", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/radar"), nil) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleRadar)(response, request) + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.RadarResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /radar") + t.Errorf("got false for /radar: %s", status.Error) } // TODO: Verify the radar information @@ -152,29 +157,24 @@ func TestHandleRadar(t *testing.T) { func TestHandleRover(t *testing.T) { s := NewServer() + s.Initialise() a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account _, _, err = s.SpawnRoverForAccount(a.Id) - data := rove.RoverData{ - Id: a.Id.String(), - } - - b, err := json.Marshal(data) - assert.NoError(t, err, "Error marshalling data") - - request, _ := http.NewRequest(http.MethodPost, "/rover", bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/rover"), nil) response := httptest.NewRecorder() - s.wrapHandler(http.MethodPost, HandleRover)(response, request) + s.router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) var status rove.RoverResponse json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /rover") + t.Errorf("got false for /rover: %s", status.Error) } // TODO: Verify the radar information diff --git a/pkg/server/server.go b/pkg/server/server.go index 00ec75a..3a84b2a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -143,11 +143,13 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons // Log the request fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + vars := mux.Vars(r) + // Verify the method, call the handler, and encode the return if r.Method != method { w.WriteHeader(http.StatusMethodNotAllowed) - } else if val, err := handler(s, r.Body, w); err != nil { + } else if val, err := handler(s, vars, r.Body, w); err != nil { fmt.Printf("Failed to handle http request: %s", err) w.WriteHeader(http.StatusInternalServerError) From 3dbdbd248e6f846af820c371d311fa5e94fa1aaa Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 23:17:04 +0100 Subject: [PATCH 099/495] Add a test compose file without a persistent volume --- docker-compose-test.yml | 11 +++++++++++ script/test.sh | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 docker-compose-test.yml diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..5270e4f --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,11 @@ +version: '3' + +services: + rove-server: + build: + context: . + dockerfile: cmd/rove-server/Dockerfile + image: rove-server:latest + ports: + - "80:80" + command: ./rove-server --port 80 diff --git a/script/test.sh b/script/test.sh index e3547eb..405b5f4 100755 --- a/script/test.sh +++ b/script/test.sh @@ -4,8 +4,11 @@ cd "$(dirname "$0")" cd .. set -x +# Check that the cmdline client builds +docker build -f "cmd/rove/Dockerfile" . + # Build and start rove-server -docker-compose up --detach --build +docker-compose -f docker-compose-test.yml up --detach --build # Run tests, including integration tests go mod download @@ -14,8 +17,5 @@ go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out # Take down the service docker-compose down -# Check that the cmdline client builds -docker build -f "cmd/rove/Dockerfile" . - # Convert the coverage data to html go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From 6bc52a130d0c7b161248a561afbf5b86ae75b792 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 5 Jun 2020 23:18:07 +0100 Subject: [PATCH 100/495] Print the list of rovers from the radar response --- cmd/rove/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2edb086..8485c54 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -166,8 +166,7 @@ func main() { os.Exit(1) } else { - // TODO: Pretify the response - fmt.Printf("%+v\n", response) + fmt.Printf("nearby rovers: %+v\n", response.Rovers) } case "rover": From 9c0dde616bcaedeeaf99c5dd17eb674c8270c508 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 00:01:59 +0100 Subject: [PATCH 101/495] Refactor to implement integration testing for rove --- cmd/rove/main.go | 136 ++++++++++++++++++----------------- cmd/rove/main_test.go | 55 ++++++++++++++ pkg/rove/integration_test.go | 2 + 3 files changed, 128 insertions(+), 65 deletions(-) create mode 100644 cmd/rove/main_test.go diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8485c54..2ee7f44 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -35,43 +35,38 @@ var data = flag.String("data", filepath, "data file for storage") // Config is used to store internal data type Config struct { - Account string `json:"account,omitempty"` - Host string `json:"host,omitempty"` + Host string `json:"host,omitempty"` + Accounts map[string]string `json:"accounts,omitempty"` } var name = flag.String("name", "", "used with status command for the account name") -func verifyId(d Config) { - if len(d.Account) == 0 { - fmt.Fprintf(os.Stderr, "No account ID set, must register first or set \"account\" value in %s\n", *data) - os.Exit(1) +// verifyId will verify an account ID +func verifyId(id string) error { + if len(id) == 0 { + return fmt.Errorf("no account ID set, must register first") } + return nil } -func main() { - flag.Usage = Usage - flag.Parse() - - // Verify we have a single command line arg - args := flag.Args() - if len(args) != 1 { - Usage() - os.Exit(1) - } +// InnerMain wraps the main function so we can test it +func InnerMain(command string) error { // Load in the persistent file - var config = Config{} + var config = Config{ + Accounts: make(map[string]string), + } _, err := os.Stat(*data) if !os.IsNotExist(err) { if b, err := ioutil.ReadFile(*data); err != nil { - fmt.Fprintf(os.Stderr, "failed to read file %s error: %s\n", *data, err) - os.Exit(1) + return fmt.Errorf("failed to read file %s error: %s", *data, err) + } else if len(b) == 0 { - fmt.Fprintf(os.Stderr, "file %s was empty, assumin fresh data\n", *data) + return fmt.Errorf("file %s was empty, assumin fresh data", *data) } else if err := json.Unmarshal(b, &config); err != nil { - fmt.Fprintf(os.Stderr, "failed to unmarshal file %s error: %s\n", *data, err) - os.Exit(1) + return fmt.Errorf("failed to unmarshal file %s error: %s", *data, err) + } } @@ -82,23 +77,23 @@ func main() { // If there's still no host, bail if len(config.Host) == 0 { - fmt.Fprintln(os.Stderr, "no host set, please set one with -host") - os.Exit(1) + return fmt.Errorf("no host set, please set one with -host") } // Set up the server var server = rove.Server(config.Host) + // Grab the account + var account = config.Accounts[config.Host] + // Print the config info - fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Account) + fmt.Printf("host: %s\taccount: %s\n", config.Host, account) // Handle all the commands - command := args[0] switch command { case "status": if response, err := server.Status(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + return err } else { fmt.Printf("Ready: %t\n", response.Ready) @@ -110,45 +105,40 @@ func main() { Name: *name, } if response, err := server.Register(d); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + return err } else if !response.Success { - fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) - os.Exit(1) + return fmt.Errorf("Server returned failure: %s", response.Error) } else { fmt.Printf("Registered account with id: %s\n", response.Id) - config.Account = response.Id + config.Accounts[config.Host] = response.Id } case "spawn": - verifyId(config) d := rove.SpawnData{} - if response, err := server.Spawn(config.Account, d); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if err := verifyId(account); err != nil { + return err + } else if response, err := server.Spawn(account, d); err != nil { + return err } else if !response.Success { - fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) - os.Exit(1) + return fmt.Errorf("Server returned failure: %s", response.Error) } else { fmt.Printf("Spawned at position %+v\n", response.Position) } case "command": - verifyId(config) + // TODO: Actually assemble requested commands d := rove.CommandData{} - // TODO: Send real commands in - - if response, err := server.Command(config.Account, d); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if err := verifyId(account); err != nil { + return err + } else if response, err := server.Command(account, d); err != nil { + return err } else if !response.Success { - fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) - os.Exit(1) + return fmt.Errorf("Server returned failure: %s", response.Error) } else { // TODO: Pretify the response @@ -156,46 +146,62 @@ func main() { } case "radar": - verifyId(config) - if response, err := server.Radar(config.Account); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if err := verifyId(account); err != nil { + return err + } else if response, err := server.Radar(account); err != nil { + return err } else if !response.Success { - fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) - os.Exit(1) + return fmt.Errorf("Server returned failure: %s", response.Error) } else { fmt.Printf("nearby rovers: %+v\n", response.Rovers) } case "rover": - verifyId(config) - if response, err := server.Rover(config.Account); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if err := verifyId(account); err != nil { + return err + } else if response, err := server.Rover(account); err != nil { + return err } else if !response.Success { - fmt.Fprintf(os.Stderr, "Server returned failure: %s\n", response.Error) - os.Exit(1) + return fmt.Errorf("Server returned failure: %s", response.Error) } else { fmt.Printf("position: %v\n", response.Position) } default: - fmt.Fprintf(os.Stderr, "Unknown command: %s\n", command) - os.Exit(1) + return fmt.Errorf("Unknown command: %s", command) } // Save out the persistent file if b, err := json.MarshalIndent(config, "", "\t"); err != nil { - fmt.Fprintf(os.Stderr, "failed to marshal data error: %s\n", err) - os.Exit(1) + return fmt.Errorf("failed to marshal data error: %s", err) } else { if err := ioutil.WriteFile(*data, b, os.ModePerm); err != nil { - fmt.Fprintf(os.Stderr, "failed to save file %s error: %s\n", *data, err) - os.Exit(1) + return fmt.Errorf("failed to save file %s error: %s", *data, err) } } + + return nil +} + +// Simple main +func main() { + flag.Usage = Usage + flag.Parse() + + // Verify we have a single command line arg + args := flag.Args() + if len(args) != 1 { + Usage() + os.Exit(1) + } + + // Run the inner main + if err := InnerMain(args[0]); err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err) + os.Exit(1) + } } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go new file mode 100644 index 0000000..46e10a8 --- /dev/null +++ b/cmd/rove/main_test.go @@ -0,0 +1,55 @@ +// +build integration + +package main + +import ( + "flag" + "os" + "path" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func Test_InnerMain(t *testing.T) { + // Set up the flags to act locally and use a temporary file + flag.Set("data", path.Join(os.TempDir(), uuid.New().String())) + + // First attempt should error + assert.Error(t, InnerMain("status")) + + // Now set the host + flag.Set("host", "localhost:80") + + // No error now as we have a host + assert.NoError(t, InnerMain("status")) + + // Register should fail without a name + assert.Error(t, InnerMain("register")) + + // These methods should fail without an account + assert.Error(t, InnerMain("spawn")) + assert.Error(t, InnerMain("command")) + assert.Error(t, InnerMain("radar")) + assert.Error(t, InnerMain("rover")) + + // Now set the name + flag.Set("name", uuid.New().String()) + + // Perform the register + assert.NoError(t, InnerMain("register")) + + // We've not spawned a rover yet so these should fail + // assert.Error(t, InnerMain("command")) // Currently not erroring, needs investigation + assert.Error(t, InnerMain("radar")) + assert.Error(t, InnerMain("rover")) + + // Spawn a rover + assert.NoError(t, InnerMain("spawn")) + + // These should now work + assert.NoError(t, InnerMain("command")) + assert.NoError(t, InnerMain("radar")) + assert.NoError(t, InnerMain("rover")) +} diff --git a/pkg/rove/integration_test.go b/pkg/rove/integration_test.go index efb11ec..fe045a2 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/rove/integration_test.go @@ -1,3 +1,5 @@ +// +build integration + package rove import ( From e242fcc4f7edaedb6852386b533961db4cb89738 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 00:18:41 +0100 Subject: [PATCH 102/495] Fix issue with command returning true when no rover was spawned --- cmd/rove/main_test.go | 2 +- pkg/accounts/accounts.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 46e10a8..405d1a8 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -41,7 +41,7 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("register")) // We've not spawned a rover yet so these should fail - // assert.Error(t, InnerMain("command")) // Currently not erroring, needs investigation + assert.Error(t, InnerMain("command")) // Currently not erroring, needs investigation assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index a961840..e1f6f12 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -75,8 +75,11 @@ func (a *Accountant) AssignRover(account uuid.UUID, rover uuid.UUID) error { // GetRover gets the rover rover for the account func (a *Accountant) GetRover(account uuid.UUID) (uuid.UUID, error) { // Find the account matching the ID - if this, ok := a.Accounts[account]; ok { + if this, ok := a.Accounts[account]; !ok { + return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) + } else if this.Rover == uuid.Nil { + return uuid.UUID{}, fmt.Errorf("no rover spawned for account %s", account) + } else { return this.Rover, nil } - return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) } From 79c07f359bfc24eb875533512f0e4706b97caf9c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 00:36:05 +0100 Subject: [PATCH 103/495] De-integration the api tests by launching their own server --- .../api_test.go} | 77 +++++++++++-------- 1 file changed, 45 insertions(+), 32 deletions(-) rename pkg/{rove/integration_test.go => server/api_test.go} (59%) diff --git a/pkg/rove/integration_test.go b/pkg/server/api_test.go similarity index 59% rename from pkg/rove/integration_test.go rename to pkg/server/api_test.go index fe045a2..ae41451 100644 --- a/pkg/rove/integration_test.go +++ b/pkg/server/api_test.go @@ -1,122 +1,135 @@ -// +build integration - -package rove +package integration import ( + "os" "testing" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) -var server Server = "localhost:80" +var serv rove.Server = "localhost:8080" + +func TestMain(m *testing.M) { + s := server.NewServer(server.OptionPort(8080)) + s.Initialise() + go s.Run() + + code := m.Run() + + s.Close() + + os.Exit(code) +} func TestServer_Status(t *testing.T) { - status, err := server.Status() + status, err := serv.Status() assert.NoError(t, err) assert.True(t, status.Ready) assert.NotZero(t, len(status.Version)) } func TestServer_Register(t *testing.T) { - d1 := RegisterData{ + d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := server.Register(d1) + r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - d2 := RegisterData{ + d2 := rove.RegisterData{ Name: uuid.New().String(), } - r2, err := server.Register(d2) + r2, err := serv.Register(d2) assert.NoError(t, err) assert.True(t, r2.Success) assert.NotZero(t, len(r2.Id)) - r3, err := server.Register(d1) + r3, err := serv.Register(d1) assert.NoError(t, err) assert.False(t, r3.Success) } func TestServer_Spawn(t *testing.T) { - d1 := RegisterData{ + d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := server.Register(d1) + r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{} - r2, err := server.Spawn(r1.Id, s) + s := rove.SpawnData{} + r2, err := serv.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) } func TestServer_Command(t *testing.T) { - d1 := RegisterData{ + d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := server.Register(d1) + r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{} - r2, err := server.Spawn(r1.Id, s) + s := rove.SpawnData{} + r2, err := serv.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) - c := CommandData{ - Commands: []Command{ + c := rove.CommandData{ + Commands: []rove.Command{ { - Command: CommandMove, + Command: rove.CommandMove, Bearing: "N", Duration: 1, }, }, } - r3, err := server.Command(r1.Id, c) + r3, err := serv.Command(r1.Id, c) assert.NoError(t, err) assert.True(t, r3.Success) } func TestServer_Radar(t *testing.T) { - d1 := RegisterData{ + d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := server.Register(d1) + r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{} - r2, err := server.Spawn(r1.Id, s) + s := rove.SpawnData{} + r2, err := serv.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) - r3, err := server.Radar(r1.Id) + r3, err := serv.Radar(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) } func TestServer_Rover(t *testing.T) { - d1 := RegisterData{ + d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := server.Register(d1) + r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := SpawnData{} - r2, err := server.Spawn(r1.Id, s) + s := rove.SpawnData{} + r2, err := serv.Spawn(r1.Id, s) assert.NoError(t, err) assert.True(t, r2.Success) - r3, err := server.Rover(r1.Id) + r3, err := serv.Rover(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) } From 3bfbe38837a5a4be5bf294f710302e50a5ba6c6c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 00:47:48 +0100 Subject: [PATCH 104/495] De-integration the cmd/rove tests as well and massively simplify the tests output --- cmd/rove/Dockerfile | 11 ----------- cmd/rove/main_test.go | 17 ++++++++++++++--- docker-compose-test.yml | 11 ----------- pkg/server/api_test.go | 5 ++--- script/test.sh | 16 +++++++--------- 5 files changed, 23 insertions(+), 37 deletions(-) delete mode 100644 cmd/rove/Dockerfile delete mode 100644 docker-compose-test.yml diff --git a/cmd/rove/Dockerfile b/cmd/rove/Dockerfile deleted file mode 100644 index a5ae0d3..0000000 --- a/cmd/rove/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM golang:latest -LABEL maintainer="Marc Di Luzio " - -WORKDIR /app -COPY . . -RUN go mod download - -RUN go build -o rove -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove/main.go - -CMD [ "./rove" ] - diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 405d1a8..52bf964 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -1,5 +1,3 @@ -// +build integration - package main import ( @@ -9,9 +7,22 @@ import ( "testing" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) +func TestMain(m *testing.M) { + s := server.NewServer(server.OptionPort(8080)) + s.Initialise() + go s.Run() + + code := m.Run() + + s.Close() + + os.Exit(code) +} + func Test_InnerMain(t *testing.T) { // Set up the flags to act locally and use a temporary file flag.Set("data", path.Join(os.TempDir(), uuid.New().String())) @@ -20,7 +31,7 @@ func Test_InnerMain(t *testing.T) { assert.Error(t, InnerMain("status")) // Now set the host - flag.Set("host", "localhost:80") + flag.Set("host", "localhost:8080") // No error now as we have a host assert.NoError(t, InnerMain("status")) diff --git a/docker-compose-test.yml b/docker-compose-test.yml deleted file mode 100644 index 5270e4f..0000000 --- a/docker-compose-test.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: '3' - -services: - rove-server: - build: - context: . - dockerfile: cmd/rove-server/Dockerfile - image: rove-server:latest - ports: - - "80:80" - command: ./rove-server --port 80 diff --git a/pkg/server/api_test.go b/pkg/server/api_test.go index ae41451..2ff3a89 100644 --- a/pkg/server/api_test.go +++ b/pkg/server/api_test.go @@ -1,4 +1,4 @@ -package integration +package server import ( "os" @@ -6,14 +6,13 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/rove" - "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) var serv rove.Server = "localhost:8080" func TestMain(m *testing.M) { - s := server.NewServer(server.OptionPort(8080)) + s := NewServer(OptionPort(8080)) s.Initialise() go s.Run() diff --git a/script/test.sh b/script/test.sh index 405b5f4..5b0ff09 100755 --- a/script/test.sh +++ b/script/test.sh @@ -4,18 +4,16 @@ cd "$(dirname "$0")" cd .. set -x -# Check that the cmdline client builds -docker build -f "cmd/rove/Dockerfile" . - -# Build and start rove-server -docker-compose -f docker-compose-test.yml up --detach --build - -# Run tests, including integration tests +# Check we can build everything go mod download -go test -v ./... -tags integration -cover -coverprofile=/tmp/c.out +go build ./... -# Take down the service +# Run the server and shut it down again to ensure our docker-compose works +docker-compose up --detach --build docker-compose down +# Run tests with coverage +go test -v ./... -cover -coverprofile=/tmp/c.out + # Convert the coverage data to html go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From bc366583a44db7a772255b3d21f7ec06bc35f392 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 10:57:37 +0100 Subject: [PATCH 105/495] Move server tests to the server command --- {pkg/server => cmd/rove-server}/api_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename {pkg/server => cmd/rove-server}/api_test.go (96%) diff --git a/pkg/server/api_test.go b/cmd/rove-server/api_test.go similarity index 96% rename from pkg/server/api_test.go rename to cmd/rove-server/api_test.go index 2ff3a89..79431e7 100644 --- a/pkg/server/api_test.go +++ b/cmd/rove-server/api_test.go @@ -1,4 +1,4 @@ -package server +package main import ( "os" @@ -6,13 +6,14 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) var serv rove.Server = "localhost:8080" func TestMain(m *testing.M) { - s := NewServer(OptionPort(8080)) + s := server.NewServer(server.OptionPort(8080)) s.Initialise() go s.Run() From 1d2087e2b919eb16840d91a44f52079d7e09e666 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 11:52:12 +0100 Subject: [PATCH 106/495] Fix test instabilities by refactoring to make address dynamic and readable --- cmd/rove-server/api_test.go | 20 +++++++++++++++---- cmd/rove-server/main.go | 18 ++++++++++++++--- cmd/rove/main_test.go | 21 ++++++++++++++++---- docker-compose.yml | 2 +- pkg/server/server.go | 39 ++++++++++++++++++++++++------------- pkg/server/server_test.go | 10 ++++++---- script/test.sh | 3 +-- 7 files changed, 82 insertions(+), 31 deletions(-) diff --git a/cmd/rove-server/api_test.go b/cmd/rove-server/api_test.go index 79431e7..50008a6 100644 --- a/cmd/rove-server/api_test.go +++ b/cmd/rove-server/api_test.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "os" "testing" @@ -10,16 +11,27 @@ import ( "github.com/stretchr/testify/assert" ) -var serv rove.Server = "localhost:8080" +// To be set by the main function +var serv rove.Server func TestMain(m *testing.M) { - s := server.NewServer(server.OptionPort(8080)) - s.Initialise() + s := server.NewServer() + if err := s.Initialise(); err != nil { + fmt.Println(err) + os.Exit(1) + } + + serv = rove.Server(s.Addr()) + go s.Run() + fmt.Printf("Test server hosted on %s", serv) code := m.Run() - s.Close() + if err := s.Close(); err != nil { + fmt.Println(err) + os.Exit(1) + } os.Exit(code) } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index b64a919..e3042ae 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -6,6 +6,7 @@ import ( "os" "os/signal" "syscall" + "time" "github.com/mdiluz/rove/pkg/persistence" "github.com/mdiluz/rove/pkg/server" @@ -13,8 +14,9 @@ import ( ) var ver = flag.Bool("version", false, "Display version number") -var port = flag.Int("port", 8080, "The port to host on") +var port = flag.String("address", ":8080", "The address to host on") var data = flag.String("data", os.TempDir(), "Directory to store persistant data") +var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") func main() { flag.Parse() @@ -32,7 +34,7 @@ func main() { // Create the server data s := server.NewServer( - server.OptionPort(*port), + server.OptionAddress(*port), server.OptionPersistentData()) // Initialise the server @@ -52,9 +54,19 @@ func main() { os.Exit(0) }() - fmt.Println("Running...") + // Quit after a time if requested + if *quit != 0 { + go func() { + time.Sleep(time.Duration(*quit) * time.Second) + if err := s.Close(); err != nil { + panic(err) + } + os.Exit(0) + }() + } // Run the server + fmt.Printf("Serving HTTP on %s\n", s.Addr()) s.Run() // Close the server diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 52bf964..d19759f 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "os" "path" "testing" @@ -11,14 +12,26 @@ import ( "github.com/stretchr/testify/assert" ) +var address string + func TestMain(m *testing.M) { - s := server.NewServer(server.OptionPort(8080)) - s.Initialise() + s := server.NewServer() + if err := s.Initialise(); err != nil { + fmt.Println(err) + os.Exit(1) + } + + address = s.Addr() + go s.Run() + fmt.Printf("Test server hosted on %s", address) code := m.Run() - s.Close() + if err := s.Close(); err != nil { + fmt.Println(err) + os.Exit(1) + } os.Exit(code) } @@ -31,7 +44,7 @@ func Test_InnerMain(t *testing.T) { assert.Error(t, InnerMain("status")) // Now set the host - flag.Set("host", "localhost:8080") + flag.Set("host", address) // No error now as we have a host assert.NoError(t, InnerMain("status")) diff --git a/docker-compose.yml b/docker-compose.yml index 76f4aa0..bdb69e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,6 @@ services: image: rove-server:latest ports: - "80:80" - command: ./rove-server --port 80 --data=/mnt/rove-server + command: ./rove-server --address ":80" --data=/mnt/rove-server ${ROVE_ARGS} volumes: - persistent-data:/mnt/rove-server:rw diff --git a/pkg/server/server.go b/pkg/server/server.go index 3a84b2a..55c6fc9 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "log" + "net" "net/http" "sync" "time" @@ -27,12 +28,14 @@ const ( // Server contains the relevant data to run a game server type Server struct { - port int + address string accountant *accounts.Accountant world *game.World - server *http.Server + listener net.Listener + server *http.Server + router *mux.Router persistence int @@ -43,10 +46,10 @@ type Server struct { // ServerOption defines a server creation option type ServerOption func(s *Server) -// OptionPort sets the server port for hosting -func OptionPort(port int) ServerOption { +// OptionAddress sets the server address for hosting +func OptionAddress(address string) ServerOption { return func(s *Server) { - s.port = port + s.address = address } } @@ -64,7 +67,7 @@ func NewServer(opts ...ServerOption) *Server { // Set up the default server s := &Server{ - port: 8080, + address: "", persistence: EphemeralData, router: router, } @@ -75,7 +78,7 @@ func NewServer(opts ...ServerOption) *Server { } // Set up the server object - s.server = &http.Server{Addr: fmt.Sprintf(":%d", s.port), Handler: router} + s.server = &http.Server{Addr: s.address, Handler: s.router} // Create the accountant s.accountant = accounts.NewAccountant() @@ -85,7 +88,10 @@ func NewServer(opts ...ServerOption) *Server { } // Initialise sets up internal state ready to serve -func (s *Server) Initialise() error { +func (s *Server) Initialise() (err error) { + + // Add to our sync + s.sync.Add(1) // Load the accounts if requested if s.persistence == PersistentData { @@ -99,19 +105,26 @@ func (s *Server) Initialise() error { s.router.HandleFunc(route.path, s.wrapHandler(route.method, route.handler)) } - // Add to our sync - s.sync.Add(1) + // Start the listen + if s.listener, err = net.Listen("tcp", s.server.Addr); err != nil { + return err + } + s.address = s.listener.Addr().String() return nil } +// Addr will return the server address set after the listen +func (s Server) Addr() string { + return s.address +} + // Run executes the server func (s *Server) Run() { defer s.sync.Done() - // Listen and serve the http requests - fmt.Printf("Serving HTTP on port %d\n", s.port) - if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + // Serve the http requests + if err := s.server.Serve(s.listener); err != nil && err != http.ErrServerClosed { log.Fatal(err) } } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 619ebbe..5f9b4ba 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -11,12 +11,12 @@ func TestNewServer(t *testing.T) { } } -func TestNewServer_OptionPort(t *testing.T) { - server := NewServer(OptionPort(1234)) +func TestNewServer_OptionAddress(t *testing.T) { + server := NewServer(OptionAddress(":1234")) if server == nil { t.Error("Failed to create server") - } else if server.port != 1234 { - t.Error("Failed to set server port") + } else if server.address != ":1234" { + t.Error("Failed to set server address") } } @@ -36,6 +36,7 @@ func TestServer_Run(t *testing.T) { } else if err := server.Initialise(); err != nil { t.Error(err) } + go server.Run() if err := server.Close(); err != nil { @@ -50,6 +51,7 @@ func TestServer_RunPersistentData(t *testing.T) { } else if err := server.Initialise(); err != nil { t.Error(err) } + go server.Run() if err := server.Close(); err != nil { diff --git a/script/test.sh b/script/test.sh index 5b0ff09..a0ffa6a 100755 --- a/script/test.sh +++ b/script/test.sh @@ -9,8 +9,7 @@ go mod download go build ./... # Run the server and shut it down again to ensure our docker-compose works -docker-compose up --detach --build -docker-compose down +ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit # Run tests with coverage go test -v ./... -cover -coverprofile=/tmp/c.out From 97d35833849da2fe75306c05059c071d3fb51af5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 12:13:54 +0100 Subject: [PATCH 107/495] Update rove-server main with tests --- cmd/rove-server/main.go | 15 ++++++++++----- cmd/rove-server/main_test.go | 18 ++++++++++++++++++ script/test.sh | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 cmd/rove-server/main_test.go diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index e3042ae..fc9000b 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -14,17 +14,17 @@ import ( ) var ver = flag.Bool("version", false, "Display version number") -var port = flag.String("address", ":8080", "The address to host on") -var data = flag.String("data", os.TempDir(), "Directory to store persistant data") var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") +var address = flag.String("address", "", "The address to host on, automatically selected if empty") +var data = flag.String("data", "", "Directory to store persistant data, no storage if empty") -func main() { +func InnerMain() { flag.Parse() // Print the version if requested if *ver { fmt.Println(version.Version) - os.Exit(0) + return } fmt.Printf("Initialising version %s...\n", version.Version) @@ -34,7 +34,7 @@ func main() { // Create the server data s := server.NewServer( - server.OptionAddress(*port), + server.OptionAddress(*address), server.OptionPersistentData()) // Initialise the server @@ -74,3 +74,8 @@ func main() { panic(err) } } + +func main() { + flag.Parse() + InnerMain() +} diff --git a/cmd/rove-server/main_test.go b/cmd/rove-server/main_test.go new file mode 100644 index 0000000..64aa62c --- /dev/null +++ b/cmd/rove-server/main_test.go @@ -0,0 +1,18 @@ +package main + +import ( + "flag" + "testing" +) + +func Test_InnerMain_Version(t *testing.T) { + flag.Set("version", "1") + InnerMain() + flag.Set("version", "0") +} + +func Test_InnerMain_Quit(t *testing.T) { + flag.Set("quit", "1") + InnerMain() + flag.Set("quit", "0") +} diff --git a/script/test.sh b/script/test.sh index a0ffa6a..67acbe3 100755 --- a/script/test.sh +++ b/script/test.sh @@ -12,7 +12,7 @@ go build ./... ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit # Run tests with coverage -go test -v ./... -cover -coverprofile=/tmp/c.out +go test -v ./... -cover -coverprofile=/tmp/c.out -count 1 # Convert the coverage data to html go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From e3ce87e96447c3753ec6eb50dfe3af8e7c9849fd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 12:45:45 +0100 Subject: [PATCH 108/495] Simplify duplicate command types --- cmd/rove-server/api_test.go | 5 +++-- pkg/game/command.go | 18 +++++++++--------- pkg/game/command_test.go | 4 ++-- pkg/game/world.go | 13 ++++++++++--- pkg/rove/api.go | 18 +----------------- pkg/server/routes.go | 5 +---- pkg/server/routes_test.go | 4 ++-- pkg/server/server.go | 17 ----------------- 8 files changed, 28 insertions(+), 56 deletions(-) diff --git a/cmd/rove-server/api_test.go b/cmd/rove-server/api_test.go index 50008a6..8799e5e 100644 --- a/cmd/rove-server/api_test.go +++ b/cmd/rove-server/api_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" @@ -95,9 +96,9 @@ func TestServer_Command(t *testing.T) { assert.True(t, r2.Success) c := rove.CommandData{ - Commands: []rove.Command{ + Commands: []game.Command{ { - Command: rove.CommandMove, + Command: game.CommandMove, Bearing: "N", Duration: 1, }, diff --git a/pkg/game/command.go b/pkg/game/command.go index d3af43b..d4487c1 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -1,14 +1,14 @@ package game -import "github.com/google/uuid" +const ( + CommandMove = "move" +) -// A command is simply a function that acts on the a given rover in the world -type Command func() error +// Command represends a single command to execute +type Command struct { + Command string `json:"command"` -// CommandMove will move the rover in question -func (w *World) CommandMove(id uuid.UUID, bearing Direction, duration int) Command { - return func() error { - _, err := w.MoveRover(id, bearing, duration) - return err - } + // Used in the move command + Bearing string `json:"bearing,omitempty"` + Duration int `json:"duration,omitempty"` } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index c946981..0988dd9 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -23,8 +23,8 @@ func TestCommand_Move(t *testing.T) { bearing := North duration := 1 // Try the move command - moveCommand := world.CommandMove(a, bearing, duration) - assert.NoError(t, world.Execute(moveCommand), "Failed to execute move command") + moveCommand := Command{Command: CommandMove, Bearing: bearing.String(), Duration: duration} + assert.NoError(t, world.Execute(a, moveCommand), "Failed to execute move command") newpos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") diff --git a/pkg/game/world.go b/pkg/game/world.go index 3b050a8..367b63b 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -146,10 +146,17 @@ func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { } // Execute will run the commands given -func (w *World) Execute(commands ...Command) error { +func (w *World) Execute(id uuid.UUID, commands ...Command) error { for _, c := range commands { - if err := c(); err != nil { - return err + switch c.Command { + case "move": + if dir, err := DirectionFromString(c.Bearing); err != nil { + return fmt.Errorf("unknown direction: %s", c.Bearing) + } else if _, err := w.MoveRover(id, dir, c.Duration); err != nil { + return err + } + default: + return fmt.Errorf("unknown command: %s", c.Command) } } return nil diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 7ad5062..c72d685 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -79,7 +79,7 @@ func (s Server) Command(account string, d CommandData) (r CommandResponse, err e // CommandData is a set of commands to execute in order type CommandData struct { - Commands []Command `json:"commands"` + Commands []game.Command `json:"commands"` } // CommandResponse is the response to be sent back @@ -88,22 +88,6 @@ type CommandResponse struct { Error string `json:"error,omitempty"` } -const ( - // CommandMove describes a single move command - CommandMove = "move" -) - -// Command describes a single command to execute -// it contains the type, and then any members used for each command type -type Command struct { - // Command is the main command string - Command string `json:"command"` - - // Used for CommandMove - Bearing string `json:"bearing"` // The direction to move on a compass in short (NW) or long (NorthWest) form - Duration int `json:"duration"` // The duration of the move in ticks -} - // ================ // API: /{account}/radar method: GET diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 9869f95..b1e2f6a 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -146,10 +146,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if cmds, err := s.ConvertCommands(data.Commands, inst); err != nil { - response.Error = fmt.Sprintf("Couldn't convert commands: %s", err) - - } else if err := s.world.Execute(cmds...); err != nil { + } else if err := s.world.Execute(inst, data.Commands...); err != nil { response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index cade48f..74edb4b 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -96,9 +96,9 @@ func TestHandleCommand(t *testing.T) { assert.NoError(t, err, "Couldn't get rover position") data := rove.CommandData{ - Commands: []rove.Command{ + Commands: []game.Command{ { - Command: rove.CommandMove, + Command: game.CommandMove, Bearing: "N", Duration: 1, }, diff --git a/pkg/server/server.go b/pkg/server/server.go index 55c6fc9..78b8b92 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -15,7 +15,6 @@ import ( "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" - "github.com/mdiluz/rove/pkg/rove" ) const ( @@ -195,19 +194,3 @@ func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UU } } } - -// ConvertCommands converts server commands to game commands -func (s *Server) ConvertCommands(commands []rove.Command, inst uuid.UUID) ([]game.Command, error) { - var cmds []game.Command - for _, c := range commands { - switch c.Command { - case rove.CommandMove: - if bearing, err := game.DirectionFromString(c.Bearing); err != nil { - return nil, err - } else { - cmds = append(cmds, s.world.CommandMove(inst, bearing, c.Duration)) - } - } - } - return cmds, nil -} From 0a0a32cf5850065ad14dc7082b77da27d2f09cdb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 14:44:59 +0100 Subject: [PATCH 109/495] Implement a command queue on the world Not currently executed --- pkg/game/command.go | 3 + pkg/game/command_test.go | 2 +- pkg/game/world.go | 124 +++++++++++++++++++++++++++++++++++---- pkg/game/world_test.go | 2 +- pkg/server/routes.go | 2 +- pkg/server/server.go | 2 +- 6 files changed, 120 insertions(+), 15 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index d4487c1..cc303bc 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -12,3 +12,6 @@ type Command struct { Bearing string `json:"bearing,omitempty"` Duration int `json:"duration,omitempty"` } + +// CommandStream is a list of commands to execute in order +type CommandStream []Command diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 0988dd9..b9135fd 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -24,7 +24,7 @@ func TestCommand_Move(t *testing.T) { duration := 1 // Try the move command moveCommand := Command{Command: CommandMove, Bearing: bearing.String(), Duration: duration} - assert.NoError(t, world.Execute(a, moveCommand), "Failed to execute move command") + assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") newpos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") diff --git a/pkg/game/world.go b/pkg/game/world.go index 367b63b..549630a 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "sync" "github.com/google/uuid" ) @@ -10,6 +11,15 @@ import ( type World struct { // Rovers is a id->data map of all the rovers in the game Rovers map[uuid.UUID]Rover `json:"rovers"` + + // Mutex to lock around all world operations + worldMutex sync.RWMutex + + // Commands is the set of currently executing command streams per rover + CommandQueue map[uuid.UUID]CommandStream `json:"commands"` + + // Mutex to lock around command operations + cmdMutex sync.RWMutex } // RoverAttributes contains attributes of a rover @@ -36,12 +46,16 @@ type Rover struct { // NewWorld creates a new world object func NewWorld() *World { return &World{ - Rovers: make(map[uuid.UUID]Rover), + Rovers: make(map[uuid.UUID]Rover), + CommandQueue: make(map[uuid.UUID]CommandStream), } } // SpawnRover adds an rover to the game func (w *World) SpawnRover() uuid.UUID { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + // Initialise the rover rover := Rover{ Id: uuid.New(), @@ -64,6 +78,9 @@ func (w *World) SpawnRover() uuid.UUID { // Removes an rover from the game func (w *World) DestroyRover(id uuid.UUID) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + if _, ok := w.Rovers[id]; ok { delete(w.Rovers, id) } else { @@ -73,7 +90,10 @@ func (w *World) DestroyRover(id uuid.UUID) error { } // RoverAttributes returns the attributes of a requested rover -func (w World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { +func (w *World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + if i, ok := w.Rovers[id]; ok { return i.Attributes, nil } else { @@ -82,7 +102,10 @@ func (w World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { } // RoverPosition returns the position of a given rover -func (w World) RoverPosition(id uuid.UUID) (Vector, error) { +func (w *World) RoverPosition(id uuid.UUID) (Vector, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + if i, ok := w.Rovers[id]; ok { return i.Pos, nil } else { @@ -92,6 +115,9 @@ func (w World) RoverPosition(id uuid.UUID) (Vector, error) { // WarpRover sets an rovers position func (w *World) WarpRover(id uuid.UUID, pos Vector) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + if i, ok := w.Rovers[id]; ok { i.Pos = pos w.Rovers[id] = i @@ -102,10 +128,13 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing Direction, duration int) (Vector, error) { +func (w *World) MoveRover(id uuid.UUID, bearing Direction) (Vector, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + if i, ok := w.Rovers[id]; ok { // Calculate the distance - distance := i.Attributes.Speed * duration + distance := i.Attributes.Speed // Calculate the full movement based on the bearing move := bearing.Vector().Multiplied(distance) @@ -128,7 +157,10 @@ type RadarDescription struct { } // RadarFromRover can be used to query what a rover can currently see -func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { +func (w *World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + if r1, ok := w.Rovers[id]; ok { var desc RadarDescription @@ -145,19 +177,89 @@ func (w World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { } } -// Execute will run the commands given -func (w *World) Execute(id uuid.UUID, commands ...Command) error { +// Enqueue will queue the commands given +func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { + + // First validate the commands for _, c := range commands { switch c.Command { case "move": - if dir, err := DirectionFromString(c.Bearing); err != nil { + if _, err := DirectionFromString(c.Bearing); err != nil { return fmt.Errorf("unknown direction: %s", c.Bearing) - } else if _, err := w.MoveRover(id, dir, c.Duration); err != nil { - return err } default: return fmt.Errorf("unknown command: %s", c.Command) } } + + // Lock our commands edit + w.cmdMutex.Lock() + defer w.cmdMutex.Unlock() + + // Append the commands to the current set + cmds := w.CommandQueue[rover] + w.CommandQueue[rover] = append(cmds, commands...) + return nil } + +// Execute will execute any commands in the current command queue +func (w *World) Execute() error { + w.cmdMutex.Lock() + defer w.cmdMutex.Unlock() + + // Iterate through all commands + for rover, cmds := range w.CommandQueue { + if len(cmds) != 0 { + // Extract the first command in the queue + c := cmds[0] + + // Execute the command and clear up if requested + if done, err := w.ExecuteCommand(&c, rover); err != nil { + w.CommandQueue[rover] = cmds[1:] + fmt.Println(err) + } else if done { + w.CommandQueue[rover] = cmds[1:] + } else { + w.CommandQueue[rover][0] = c + } + + // If there was an error + + } else { + // Clean out the empty entry + delete(w.CommandQueue, rover) + } + } + + return nil +} + +// ExecuteCommand will execute a single command +func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + switch c.Command { + case "move": + if dir, err := DirectionFromString(c.Bearing); err != nil { + return true, fmt.Errorf("unknown direction in command %+v, skipping: %s\n", c, err) + + } else if _, err := w.MoveRover(rover, dir); err != nil { + return true, fmt.Errorf("error moving rover in command %+v, skipping: %s\n", c, err) + + } else { + // If we've successfully moved, reduce the duration by 1 + c.Duration -= 1 + + // If we've used up the full duration, remove it, otherwise update + if c.Duration == 0 { + finished = true + } + } + default: + return true, fmt.Errorf("unknown command: %s", c.Command) + } + + return +} diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 7672706..3b37908 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -73,7 +73,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { bearing := North duration := 1 - newpos, err = world.MoveRover(a, bearing, duration) + newpos, err = world.MoveRover(a, bearing) assert.NoError(t, err, "Failed to set position for rover") pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") diff --git a/pkg/server/routes.go b/pkg/server/routes.go index b1e2f6a..d12d47f 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -146,7 +146,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if err := s.world.Execute(inst, data.Commands...); err != nil { + } else if err := s.world.Enqueue(inst, data.Commands...); err != nil { response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { diff --git a/pkg/server/server.go b/pkg/server/server.go index 78b8b92..cbfa0f3 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -114,7 +114,7 @@ func (s *Server) Initialise() (err error) { } // Addr will return the server address set after the listen -func (s Server) Addr() string { +func (s *Server) Addr() string { return s.address } From 573bfbf9c77fac5fe51fc83570d7cc70b43e79ce Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 15:52:03 +0100 Subject: [PATCH 110/495] Add cron tick of command queue --- go.mod | 1 + go.sum | 2 + pkg/game/command_test.go | 3 ++ pkg/game/world.go | 30 +++++++++++--- pkg/server/routes.go | 5 +++ pkg/server/routes_test.go | 3 ++ pkg/server/server.go | 82 +++++++++++++++++++++++++++++++++++---- 7 files changed, 113 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 80da8b7..a70d6e1 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,6 @@ go 1.14 require ( github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 + github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 ) diff --git a/go.sum b/go.sum index c150150..709e988 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index b9135fd..830727f 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -26,6 +26,9 @@ func TestCommand_Move(t *testing.T) { moveCommand := Command{Command: CommandMove, Bearing: bearing.String(), Duration: duration} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") + // Tick the world + world.ExecuteCommandQueues() + newpos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") pos.Add(Vector{0.0, duration * attribs.Speed}) // We should have moved duration*speed north diff --git a/pkg/game/world.go b/pkg/game/world.go index 549630a..9a06445 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -204,7 +204,7 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { } // Execute will execute any commands in the current command queue -func (w *World) Execute() error { +func (w *World) ExecuteCommandQueues() { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() @@ -231,14 +231,10 @@ func (w *World) Execute() error { delete(w.CommandQueue, rover) } } - - return nil } // ExecuteCommand will execute a single command func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { - w.worldMutex.Lock() - defer w.worldMutex.Unlock() switch c.Command { case "move": @@ -263,3 +259,27 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err return } + +// RLock read locks the world +func (w *World) RLock() { + w.worldMutex.RLock() + w.cmdMutex.RLock() +} + +// RUnlock read unlocks the world +func (w *World) RUnlock() { + w.worldMutex.RUnlock() + w.cmdMutex.RUnlock() +} + +// Lock locks the world +func (w *World) Lock() { + w.worldMutex.Lock() + w.cmdMutex.Lock() +} + +// Unlock unlocks the world +func (w *World) Unlock() { + w.worldMutex.Unlock() + w.cmdMutex.Unlock() +} diff --git a/pkg/server/routes.go b/pkg/server/routes.go index d12d47f..2dfd29d 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -84,7 +84,12 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else if acc, err := s.accountant.RegisterAccount(data.Name); err != nil { response.Error = err.Error() + } else if err := s.SaveAll(); err != nil { + response.Error = fmt.Sprintf("Internal server error when saving accounts: %s", err) + } else { + // Save out the new accounts + response.Id = acc.Id.String() response.Success = true } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 74edb4b..6d46fa0 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -124,6 +124,9 @@ func TestHandleCommand(t *testing.T) { attrib, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover attribs") + // Tick the command queues to progress the move command + s.world.ExecuteCommandQueues() + pos2, err := s.world.RoverPosition(inst) assert.NoError(t, err, "Couldn't get rover position") pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration diff --git a/pkg/server/server.go b/pkg/server/server.go index cbfa0f3..3fcfed7 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -15,6 +15,7 @@ import ( "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" + "github.com/robfig/cron" ) const ( @@ -27,19 +28,25 @@ const ( // Server contains the relevant data to run a game server type Server struct { - address string + // Internal state accountant *accounts.Accountant world *game.World + // HTTP server listener net.Listener server *http.Server + router *mux.Router - router *mux.Router - + // Config settings + address string persistence int + // sync point for sub-threads sync sync.WaitGroup + + // cron schedule for world ticks + schedule *cron.Cron } // ServerOption defines a server creation option @@ -69,6 +76,7 @@ func NewServer(opts ...ServerOption) *Server { address: "", persistence: EphemeralData, router: router, + schedule: cron.New(), } // Apply all options @@ -93,10 +101,8 @@ func (s *Server) Initialise() (err error) { s.sync.Add(1) // Load the accounts if requested - if s.persistence == PersistentData { - if err := persistence.LoadAll("accounts", &s.accountant, "world", &s.world); err != nil { - return err - } + if err := s.LoadAll(); err != nil { + return err } // Set up the handlers @@ -122,6 +128,20 @@ func (s *Server) Addr() string { func (s *Server) Run() { defer s.sync.Done() + // Set up the schedule + s.schedule.AddFunc("0,30", func() { + // Ensure we don't quit during this function + s.sync.Add(1) + defer s.sync.Done() + + // Run the command queues + s.world.ExecuteCommandQueues() + + // Save out the new world state + s.SaveWorld() + }) + s.schedule.Start() + // Serve the http requests if err := s.server.Serve(s.listener); err != nil && err != http.ErrServerClosed { log.Fatal(err) @@ -130,6 +150,9 @@ func (s *Server) Run() { // Close closes up the server func (s *Server) Close() error { + // Stop the cron + s.schedule.Stop() + // Try and shut down the http server ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -137,11 +160,42 @@ func (s *Server) Close() error { return err } - // Wait until the server is shut down + // Wait until the server has shut down s.sync.Wait() + // Save and return + return s.SaveAll() +} + +// SaveWorld will save out the world file +func (s *Server) SaveWorld() error { + if s.persistence == PersistentData { + s.world.RLock() + defer s.world.RUnlock() + if err := persistence.SaveAll("world", s.world); err != nil { + return fmt.Errorf("failed to save out persistent data: %s", err) + } + } + return nil +} + +// SaveAccounts will save out the accounts file +func (s *Server) SaveAccounts() error { + if s.persistence == PersistentData { + if err := persistence.SaveAll("accounts", s.accountant); err != nil { + return fmt.Errorf("failed to save out persistent data: %s", err) + } + } + return nil +} + +// SaveAll will save out all server files +func (s *Server) SaveAll() error { // Save the accounts if requested if s.persistence == PersistentData { + s.world.RLock() + defer s.world.RUnlock() + if err := persistence.SaveAll("accounts", s.accountant, "world", s.world); err != nil { return err } @@ -149,6 +203,18 @@ func (s *Server) Close() error { return nil } +// LoadAll will load all persistent data +func (s *Server) LoadAll() error { + if s.persistence == PersistentData { + s.world.Lock() + defer s.world.Unlock() + if err := persistence.LoadAll("accounts", &s.accountant, "world", &s.world); err != nil { + return err + } + } + return nil +} + // wrapHandler wraps a request handler in http checks func (s *Server) wrapHandler(method string, handler Handler) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { From c6fbf1341ac303053b1dc402df334afd58ee8ac9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:01:49 +0100 Subject: [PATCH 111/495] Allow the server tick to be customised --- cmd/rove-server/main.go | 4 +++- pkg/server/server.go | 38 +++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index fc9000b..11b57ca 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -17,6 +17,7 @@ var ver = flag.Bool("version", false, "Display version number") var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") var address = flag.String("address", "", "The address to host on, automatically selected if empty") var data = flag.String("data", "", "Directory to store persistant data, no storage if empty") +var tick = flag.Int("tick", 30, "Number of minutes per server tick (0 for no tick)") func InnerMain() { flag.Parse() @@ -35,7 +36,8 @@ func InnerMain() { // Create the server data s := server.NewServer( server.OptionAddress(*address), - server.OptionPersistentData()) + server.OptionPersistentData(), + server.OptionTick(*tick)) // Initialise the server if err := s.Initialise(); err != nil { diff --git a/pkg/server/server.go b/pkg/server/server.go index 3fcfed7..8666ad5 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -41,6 +41,7 @@ type Server struct { // Config settings address string persistence int + tick int // sync point for sub-threads sync sync.WaitGroup @@ -66,6 +67,14 @@ func OptionPersistentData() ServerOption { } } +// OptionTick defines the number of minutes per tick +// 0 means no automatic server tick +func OptionTick(minutes int) ServerOption { + return func(s *Server) { + s.tick = minutes + } +} + // NewServer sets up a new server func NewServer(opts ...ServerOption) *Server { @@ -128,19 +137,26 @@ func (s *Server) Addr() string { func (s *Server) Run() { defer s.sync.Done() - // Set up the schedule - s.schedule.AddFunc("0,30", func() { - // Ensure we don't quit during this function - s.sync.Add(1) - defer s.sync.Done() + // Set up the schedule if requested + if s.tick != 0 { + if err := s.schedule.AddFunc(fmt.Sprintf("* */%d * * *", s.tick), func() { + // Ensure we don't quit during this function + s.sync.Add(1) + defer s.sync.Done() - // Run the command queues - s.world.ExecuteCommandQueues() + fmt.Println("Execuring server tick") - // Save out the new world state - s.SaveWorld() - }) - s.schedule.Start() + // Run the command queues + s.world.ExecuteCommandQueues() + + // Save out the new world state + s.SaveWorld() + }); err != nil { + log.Fatal(err) + } + s.schedule.Start() + fmt.Printf("First server tick scheduled for %s\n", s.schedule.Entries()[0].Next.Format("15:04:05")) + } // Serve the http requests if err := s.server.Serve(s.listener); err != nil && err != http.ErrServerClosed { From 1a82c3a6bdd91267f59187f171e7eaa9c65e2e68 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:02:11 +0100 Subject: [PATCH 112/495] Note that commands now do happen in real time --- docs/poc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/poc.md b/docs/poc.md index f6442d8..ef09667 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -11,7 +11,7 @@ For a proof of concept we'll implement a very small subset of the final features * Persistent accounts and world (done) * Multiple users (done) * Populate map with locations/objects -* Commands happen in "real time" +* Commands happen in "real time" (done) ### Stretch goals From ca00a641127329450fea76eed8eefeb8ed366118 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:26:28 +0100 Subject: [PATCH 113/495] Change command arg to move arg for ./rove --- cmd/rove/main.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2ee7f44..9c8fe93 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -8,6 +8,7 @@ import ( "os" "path" + "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" ) @@ -20,7 +21,7 @@ func Usage() { fmt.Println("\tstatus \tprints the server status") fmt.Println("\tregister\tregisters an account and stores it (use with -name)") fmt.Println("\tspawn \tspawns a rover for the current account") - fmt.Println("\tcommand \tissues commands to the rover") + fmt.Println("\tmove \tissues move command to rover") fmt.Println("\tradar \tgathers radar data for the current rover") fmt.Println("\trover \tgets data for current rover") fmt.Println("\nOptions:") @@ -30,17 +31,23 @@ func Usage() { var home = os.Getenv("HOME") var filepath = path.Join(home, ".local/share/rove.json") +// General usage var host = flag.String("host", "", "path to game host server") var data = flag.String("data", filepath, "data file for storage") +// For register command +var name = flag.String("name", "", "used with status command for the account name") + +// For the duration command +var duration = flag.Int("duration", 1, "used for the move command duration") +var bearing = flag.String("bearing", "", "used for the move command bearing (compass direction)") + // Config is used to store internal data type Config struct { Host string `json:"host,omitempty"` Accounts map[string]string `json:"accounts,omitempty"` } -var name = flag.String("name", "", "used with status command for the account name") - // verifyId will verify an account ID func verifyId(id string) error { if len(id) == 0 { @@ -128,9 +135,16 @@ func InnerMain(command string) error { fmt.Printf("Spawned at position %+v\n", response.Position) } - case "command": - // TODO: Actually assemble requested commands - d := rove.CommandData{} + case "move": + d := rove.CommandData{ + Commands: []game.Command{ + { + Command: game.CommandMove, + Duration: *duration, + Bearing: *bearing, + }, + }, + } if err := verifyId(account); err != nil { return err From 3a36f8f84fe0592a3252a14f481fe909f9aaf5d5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:26:44 +0100 Subject: [PATCH 114/495] Add logging to all handlers --- pkg/server/routes.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 2dfd29d..9a9b694 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -89,6 +89,7 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else { // Save out the new accounts + fmt.Printf("New account registered\tname:%s\tid:%s", acc.Name, acc.Id) response.Id = acc.Id.String() response.Success = true @@ -117,10 +118,12 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if id, err := uuid.Parse(id); err != nil { response.Error = "Provided account ID was invalid" - } else if pos, _, err := s.SpawnRoverForAccount(id); err != nil { + } else if pos, rover, err := s.SpawnRoverForAccount(id); err != nil { response.Error = err.Error() } else { + fmt.Printf("New rover spawned\taccount:%s\trover:%s\tpos:%+v", id, rover, pos) + response.Success = true response.Position = pos } @@ -155,6 +158,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { + fmt.Printf("Queued commands\taccount:%s\tcommands:%+v", id, data.Commands) response.Success = true } @@ -181,6 +185,7 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { + fmt.Printf("Responded with radar\taccount:%s\tradar:%+v", id, radar) response.Rovers = radar.Rovers response.Success = true } @@ -208,6 +213,7 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { + fmt.Printf("Responded with rover\taccount:%s\trover:%+v", id, pos) response.Position = pos response.Success = true } From c30339143bf36d59a205265c1c43570d763a0286 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:28:28 +0100 Subject: [PATCH 115/495] Fix ./rove tests --- cmd/rove/main_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index d19759f..ec4c2c0 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -54,7 +54,7 @@ func Test_InnerMain(t *testing.T) { // These methods should fail without an account assert.Error(t, InnerMain("spawn")) - assert.Error(t, InnerMain("command")) + assert.Error(t, InnerMain("move")) assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) @@ -73,7 +73,11 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("spawn")) // These should now work - assert.NoError(t, InnerMain("command")) assert.NoError(t, InnerMain("radar")) assert.NoError(t, InnerMain("rover")) + + // Move should work with arguments + flag.Set("bearing", "N") + flag.Set("duration", "1") + assert.NoError(t, InnerMain("move")) } From b9df3833edf58b463b5f4caa018fd489227810e4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:30:01 +0100 Subject: [PATCH 116/495] Add log for command execute --- pkg/game/world.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index 9a06445..66d388c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -235,6 +235,7 @@ func (w *World) ExecuteCommandQueues() { // ExecuteCommand will execute a single command func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { + fmt.Printf("Executing command: %+v", *c) switch c.Command { case "move": From ea67fe1cbe854f69fe53d9637353dee1b741d7b7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:31:39 +0100 Subject: [PATCH 117/495] Fix executing a tick every second for a minute --- pkg/server/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 8666ad5..f853d67 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -139,12 +139,12 @@ func (s *Server) Run() { // Set up the schedule if requested if s.tick != 0 { - if err := s.schedule.AddFunc(fmt.Sprintf("* */%d * * *", s.tick), func() { + if err := s.schedule.AddFunc(fmt.Sprintf("0 */%d * * *", s.tick), func() { // Ensure we don't quit during this function s.sync.Add(1) defer s.sync.Done() - fmt.Println("Execuring server tick") + fmt.Println("Executing server tick") // Run the command queues s.world.ExecuteCommandQueues() From 6ac5a559b5bfc3aece1bbc0211b6beba839d7888 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:33:56 +0100 Subject: [PATCH 118/495] Add missing newlines to prints --- pkg/game/world.go | 2 +- pkg/server/routes.go | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 66d388c..2f322dd 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -235,7 +235,7 @@ func (w *World) ExecuteCommandQueues() { // ExecuteCommand will execute a single command func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { - fmt.Printf("Executing command: %+v", *c) + fmt.Printf("Executing command: %+v\n", *c) switch c.Command { case "move": diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 9a9b694..cc3c79e 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -89,7 +89,7 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else { // Save out the new accounts - fmt.Printf("New account registered\tname:%s\tid:%s", acc.Name, acc.Id) + fmt.Printf("New account registered\tname:%s\tid:%s\n", acc.Name, acc.Id) response.Id = acc.Id.String() response.Success = true @@ -122,7 +122,7 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = err.Error() } else { - fmt.Printf("New rover spawned\taccount:%s\trover:%s\tpos:%+v", id, rover, pos) + fmt.Printf("New rover spawned\taccount:%s\trover:%s\tpos:%+v\n", id, rover, pos) response.Success = true response.Position = pos @@ -158,7 +158,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { - fmt.Printf("Queued commands\taccount:%s\tcommands:%+v", id, data.Commands) + fmt.Printf("Queued commands\taccount:%s\tcommands:%+v\n", id, data.Commands) response.Success = true } @@ -185,7 +185,7 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - fmt.Printf("Responded with radar\taccount:%s\tradar:%+v", id, radar) + fmt.Printf("Responded with radar\taccount:%s\tradar:%+v\n", id, radar) response.Rovers = radar.Rovers response.Success = true } @@ -213,7 +213,7 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - fmt.Printf("Responded with rover\taccount:%s\trover:%+v", id, pos) + fmt.Printf("Responded with rover\taccount:%s\trover:%+v\n", id, pos) response.Position = pos response.Success = true } From db38ad6091ba80a940244466787d5707ae9f3e46 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:37:57 +0100 Subject: [PATCH 119/495] Add tick information to server status --- cmd/rove/main.go | 2 ++ pkg/rove/api.go | 6 ++++-- pkg/server/routes.go | 12 ++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 9c8fe93..c9e0691 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -105,6 +105,8 @@ func InnerMain(command string) error { } else { fmt.Printf("Ready: %t\n", response.Ready) fmt.Printf("Version: %s\n", response.Version) + fmt.Printf("Tick: %d\n", response.Tick) + fmt.Printf("Next Tick: %s\n", response.NextTick) } case "register": diff --git a/pkg/rove/api.go b/pkg/rove/api.go index c72d685..130e2c4 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -17,8 +17,10 @@ func (s Server) Status() (r StatusResponse, err error) { // StatusResponse is a struct that contains information on the status of the server type StatusResponse struct { - Ready bool `json:"ready"` - Version string `json:"version"` + Ready bool `json:"ready"` + Version string `json:"version"` + Tick int `json:"tick"` + NextTick string `json:"nexttick,omitempty"` } // ============================== diff --git a/pkg/server/routes.go b/pkg/server/routes.go index cc3c79e..f06e337 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -59,10 +59,18 @@ var Routes = []Route{ func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { // Simply return the current server status - return rove.StatusResponse{ + response := rove.StatusResponse{ Ready: true, Version: version.Version, - }, nil + Tick: s.tick, + } + + // If there's a schedule, respond with it + if len(s.schedule.Entries()) > 0 { + response.NextTick = s.schedule.Entries()[0].Next.Format("15:04:05") + } + + return response, nil } // HandleRegister handles /register endpoint From 5e1f9b0d31de0d66e26d5b23cd7f51c5d1376a63 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:52:30 +0100 Subject: [PATCH 120/495] Refactor rover attributes to add a name --- cmd/rove/main.go | 4 +-- go.mod | 1 + go.sum | 2 ++ pkg/game/command_test.go | 4 +-- pkg/game/world.go | 58 +++++++++------------------------------ pkg/game/world_test.go | 8 +++--- pkg/rove/api.go | 8 +++--- pkg/server/routes.go | 12 ++++---- pkg/server/routes_test.go | 8 +++--- pkg/server/server.go | 10 +++---- 10 files changed, 43 insertions(+), 72 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index c9e0691..9497573 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -134,7 +134,7 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - fmt.Printf("Spawned at position %+v\n", response.Position) + fmt.Printf("Spawned rover with attributes %+v\n", response.Attributes) } case "move": @@ -184,7 +184,7 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - fmt.Printf("position: %v\n", response.Position) + fmt.Printf("attributes: %v\n", response.Attributes) } default: diff --git a/go.mod b/go.mod index a70d6e1..6d4da8d 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,5 @@ require ( github.com/gorilla/mux v1.7.4 github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 + github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d ) diff --git a/go.sum b/go.sum index 709e988..1ae6bb1 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,8 @@ github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfm github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d h1:b7oHBI6TgTdCDuqTijsVldzlh+6cfQpdYLz1EKtCAoY= +github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d/go.mod h1:O5hBrCGqzfb+8WyY8ico2AyQau7XQwAfEQeEQ5/5V9E= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 830727f..fcdb9ce 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -29,8 +29,8 @@ func TestCommand_Move(t *testing.T) { // Tick the world world.ExecuteCommandQueues() - newpos, err := world.RoverPosition(a) + newatributes, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to set position for rover") pos.Add(Vector{0.0, duration * attribs.Speed}) // We should have moved duration*speed north - assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") + assert.Equal(t, pos, newatributes.Pos, "Failed to correctly set position for rover") } diff --git a/pkg/game/world.go b/pkg/game/world.go index 2f322dd..85a8bf2 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -5,6 +5,7 @@ import ( "sync" "github.com/google/uuid" + "github.com/tjarratt/babble" ) // World describes a self contained universe and everything in it @@ -22,27 +23,6 @@ type World struct { cmdMutex sync.RWMutex } -// RoverAttributes contains attributes of a rover -type RoverAttributes struct { - // Speed represents the Speed that the rover will move per second - Speed int `json:"speed"` - - // Range represents the distance the unit's radar can see - Range int `json:"range"` -} - -// Rover describes a single rover in the world -type Rover struct { - // Id is a unique ID for this rover - Id uuid.UUID `json:"id"` - - // Pos represents where this rover is in the world - Pos Vector `json:"pos"` - - // Attributes represents the physical attributes of the rover - Attributes RoverAttributes `json:"attributes"` -} - // NewWorld creates a new world object func NewWorld() *World { return &World{ @@ -59,14 +39,14 @@ func (w *World) SpawnRover() uuid.UUID { // Initialise the rover rover := Rover{ Id: uuid.New(), - - // TODO: Set this somehow - Pos: Vector{}, - - // TODO: Stop these being random numbers Attributes: RoverAttributes{ + Speed: 1.0, Range: 20.0, + Pos: Vector{}, + + // Set the name randomly + Name: babble.NewBabbler().Babble(), }, } @@ -101,25 +81,13 @@ func (w *World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { } } -// RoverPosition returns the position of a given rover -func (w *World) RoverPosition(id uuid.UUID) (Vector, error) { - w.worldMutex.RLock() - defer w.worldMutex.RUnlock() - - if i, ok := w.Rovers[id]; ok { - return i.Pos, nil - } else { - return Vector{}, fmt.Errorf("no rover matching id") - } -} - // WarpRover sets an rovers position func (w *World) WarpRover(id uuid.UUID, pos Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() if i, ok := w.Rovers[id]; ok { - i.Pos = pos + i.Attributes.Pos = pos w.Rovers[id] = i return nil } else { @@ -128,7 +96,7 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing Direction) (Vector, error) { +func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -140,13 +108,13 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (Vector, error) { move := bearing.Vector().Multiplied(distance) // Increment the position by the movement - i.Pos.Add(move) + i.Attributes.Pos.Add(move) // Set the rover values to the new ones w.Rovers[id] = i - return i.Pos, nil + return i.Attributes, nil } else { - return Vector{}, fmt.Errorf("no rover matching id") + return RoverAttributes{}, fmt.Errorf("no rover matching id") } } @@ -166,8 +134,8 @@ func (w *World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { // Gather nearby rovers within the range for _, r2 := range w.Rovers { - if r1.Id != r2.Id && r1.Pos.Distance(r2.Pos) < float64(r1.Attributes.Range) { - desc.Rovers = append(desc.Rovers, r2.Pos) + if r1.Id != r2.Id && r1.Attributes.Pos.Distance(r2.Attributes.Pos) < float64(r1.Attributes.Range) { + desc.Rovers = append(desc.Rovers, r2.Attributes.Pos) } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 3b37908..b33662d 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -67,16 +67,16 @@ func TestWorld_GetSetMovePosition(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - newpos, err := world.RoverPosition(a) + newAttribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to set position for rover") - assert.Equal(t, pos, newpos, "Failed to correctly set position for rover") + assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly set position for rover") bearing := North duration := 1 - newpos, err = world.MoveRover(a, bearing) + newAttribs, err = world.MoveRover(a, bearing) assert.NoError(t, err, "Failed to set position for rover") pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north - assert.Equal(t, pos, newpos, "Failed to correctly move position for rover") + assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") } func TestWorld_RadarFromRover(t *testing.T) { diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 130e2c4..d47f1c6 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -66,8 +66,8 @@ type SpawnResponse struct { Success bool `json:"success"` Error string `json:"error,omitempty"` - // The location of the spawned entity - Position game.Vector `json:"position"` + // The attributes of the spawned entity + Attributes game.RoverAttributes `json:"attributes"` } // ============================== @@ -122,6 +122,6 @@ type RoverResponse struct { Success bool `json:"success"` Error string `json:"error,omitempty"` - // The set of positions for nearby rovers - Position game.Vector `json:"position"` + // The current position of this rover + Attributes game.RoverAttributes `json:"attributes"` } diff --git a/pkg/server/routes.go b/pkg/server/routes.go index f06e337..64041ef 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -126,14 +126,14 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if id, err := uuid.Parse(id); err != nil { response.Error = "Provided account ID was invalid" - } else if pos, rover, err := s.SpawnRoverForAccount(id); err != nil { + } else if attribs, rover, err := s.SpawnRoverForAccount(id); err != nil { response.Error = err.Error() } else { - fmt.Printf("New rover spawned\taccount:%s\trover:%s\tpos:%+v\n", id, rover, pos) + fmt.Printf("New rover spawned\taccount:%s\trover:%s\attributes:%+v\n", id, rover, attribs) response.Success = true - response.Position = pos + response.Attributes = attribs } return response, nil @@ -217,12 +217,12 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if pos, err := s.world.RoverPosition(inst); err != nil { + } else if attribs, err := s.world.RoverAttributes(inst); err != nil { response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - fmt.Printf("Responded with rover\taccount:%s\trover:%+v\n", id, pos) - response.Position = pos + fmt.Printf("Responded with rover\taccount:%s\trover:%+v\n", id, attribs) + response.Attributes = attribs response.Success = true } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 6d46fa0..34929dc 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -92,7 +92,7 @@ func TestHandleCommand(t *testing.T) { // Spawn the rover rover for the account _, inst, err := s.SpawnRoverForAccount(a.Id) - pos, err := s.world.RoverPosition(inst) + attribs, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover position") data := rove.CommandData{ @@ -127,10 +127,10 @@ func TestHandleCommand(t *testing.T) { // Tick the command queues to progress the move command s.world.ExecuteCommandQueues() - pos2, err := s.world.RoverPosition(inst) + attribs2, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover position") - pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration - assert.Equal(t, pos, pos2, "Rover should have moved by bearing") + attribs.Pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration + assert.Equal(t, attribs.Pos, attribs2.Pos, "Rover should have moved by bearing") } func TestHandleRadar(t *testing.T) { diff --git a/pkg/server/server.go b/pkg/server/server.go index f853d67..089f9b8 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -258,10 +258,10 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons } // SpawnRoverForAccount spawns the rover rover for an account -func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UUID, error) { +func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.RoverAttributes, uuid.UUID, error) { inst := s.world.SpawnRover() - if pos, err := s.world.RoverPosition(inst); err != nil { - return game.Vector{}, uuid.UUID{}, fmt.Errorf("No position found for created rover") + if attribs, err := s.world.RoverAttributes(inst); err != nil { + return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover") } else { if err := s.accountant.AssignRover(accountid, inst); err != nil { @@ -270,9 +270,9 @@ func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.Vector, uuid.UU fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) } - return game.Vector{}, uuid.UUID{}, err + return game.RoverAttributes{}, uuid.UUID{}, err } else { - return pos, inst, nil + return attribs, inst, nil } } } From 4645ef81e53d54784ba746335beb9ddb27faff80 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 16:53:42 +0100 Subject: [PATCH 121/495] Add missing rover.go file --- pkg/game/rover.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 pkg/game/rover.go diff --git a/pkg/game/rover.go b/pkg/game/rover.go new file mode 100644 index 0000000..6829de7 --- /dev/null +++ b/pkg/game/rover.go @@ -0,0 +1,27 @@ +package game + +import "github.com/google/uuid" + +// RoverAttributes contains attributes of a rover +type RoverAttributes struct { + // Speed represents the Speed that the rover will move per second + Speed int `json:"speed"` + + // Range represents the distance the unit's radar can see + Range int `json:"range"` + + // Name of this rover + Name string + + // Pos represents where this rover is in the world + Pos Vector `json:"pos"` +} + +// Rover describes a single rover in the world +type Rover struct { + // Id is a unique ID for this rover + Id uuid.UUID `json:"id"` + + // Attributes represents the physical attributes of the rover + Attributes RoverAttributes `json:"attributes"` +} From e804cdf12b33408896b3f47c2142ce4e5f19382e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 17:16:33 +0100 Subject: [PATCH 122/495] Install wamerican for /usr/share/dict/words --- cmd/rove-server/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/rove-server/Dockerfile b/cmd/rove-server/Dockerfile index c10803d..7d1b276 100644 --- a/cmd/rove-server/Dockerfile +++ b/cmd/rove-server/Dockerfile @@ -5,6 +5,10 @@ WORKDIR /app COPY . . RUN go mod download +# For /usr/share/dict/words +RUN apt-get update && apt-get install -y wamerican + + RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go CMD [ "./rove-server" ] From b9dd1f60bc47075c6080067955ff4603622af3da Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 17:20:56 +0100 Subject: [PATCH 123/495] Print the struct names for the rover --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 9497573..1f673f1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -184,7 +184,7 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - fmt.Printf("attributes: %v\n", response.Attributes) + fmt.Printf("attributes: %+v\n", response.Attributes) } default: From 78dc6f3d4c8b3eaebc1ab4b5e88bd5528b91deb8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 17:24:24 +0100 Subject: [PATCH 124/495] Install wamerican on the githup workflow --- .github/workflows/docker-image.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index fc20efb..6537271 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -19,6 +19,9 @@ jobs: go-version: ^1.13 id: go + - name: Install dict + run: sudo apt-get update && sudo apt-get install wamerican + - name: Check out repo uses: actions/checkout@v2 From dc957f7fc1968a35be2a77876bbe487255b45930 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:23:27 +0100 Subject: [PATCH 125/495] Up the server rick to every 5 minutes --- cmd/rove-server/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 11b57ca..39ce24f 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -17,7 +17,7 @@ var ver = flag.Bool("version", false, "Display version number") var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") var address = flag.String("address", "", "The address to host on, automatically selected if empty") var data = flag.String("data", "", "Directory to store persistant data, no storage if empty") -var tick = flag.Int("tick", 30, "Number of minutes per server tick (0 for no tick)") +var tick = flag.Int("tick", 5, "Number of minutes per server tick (0 for no tick)") func InnerMain() { flag.Parse() From 50cc8b5dbf3cddfd1414da120ab957edb03b42dd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:44:24 +0100 Subject: [PATCH 126/495] Minor cleanups --- cmd/rove-server/Dockerfile | 1 - cmd/rove/main_test.go | 2 +- pkg/server/routes_test.go | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/rove-server/Dockerfile b/cmd/rove-server/Dockerfile index 7d1b276..7ca6727 100644 --- a/cmd/rove-server/Dockerfile +++ b/cmd/rove-server/Dockerfile @@ -8,7 +8,6 @@ RUN go mod download # For /usr/share/dict/words RUN apt-get update && apt-get install -y wamerican - RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go CMD [ "./rove-server" ] diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index ec4c2c0..aa51607 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -65,7 +65,7 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("register")) // We've not spawned a rover yet so these should fail - assert.Error(t, InnerMain("command")) // Currently not erroring, needs investigation + assert.Error(t, InnerMain("command")) assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 34929dc..ab21bf1 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -180,5 +180,5 @@ func TestHandleRover(t *testing.T) { t.Errorf("got false for /rover: %s", status.Error) } - // TODO: Verify the radar information + // TODO: Verify the rover information } From 2b87c2b4c0c3233fed8dcfa850b81f928c1b8ff3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:44:40 +0100 Subject: [PATCH 127/495] Add version to ./rove --- cmd/rove/main.go | 8 ++++++++ pkg/game/world.go | 1 + 2 files changed, 9 insertions(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 1f673f1..c647206 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -10,6 +10,7 @@ import ( "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/version" ) var USAGE = "" @@ -32,6 +33,7 @@ var home = os.Getenv("HOME") var filepath = path.Join(home, ".local/share/rove.json") // General usage +var ver = flag.Bool("version", false, "Display version number") var host = flag.String("host", "", "path to game host server") var data = flag.String("data", filepath, "data file for storage") @@ -208,6 +210,12 @@ func main() { flag.Usage = Usage flag.Parse() + // Print the version if requested + if *ver { + fmt.Println(version.Version) + return + } + // Verify we have a single command line arg args := flag.Args() if len(args) != 1 { diff --git a/pkg/game/world.go b/pkg/game/world.go index 85a8bf2..7a6a7f2 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "math/rand" "sync" "github.com/google/uuid" From b344c4549c89782d7e1291a3b60e7aac2e52c8e7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:44:50 +0100 Subject: [PATCH 128/495] Fix output for rove move command --- cmd/rove/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index c647206..0a5ea23 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -159,8 +159,7 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - // TODO: Pretify the response - fmt.Printf("%+v\n", response) + fmt.Printf("Request succeeded\n") } case "radar": From 91947f614c21af1cb8069ecdc5f139d0977a8ffb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:45:15 +0100 Subject: [PATCH 129/495] Randomly position new rovers --- pkg/game/world.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 7a6a7f2..a88282c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -44,13 +44,20 @@ func (w *World) SpawnRover() uuid.UUID { Speed: 1.0, Range: 20.0, - Pos: Vector{}, // Set the name randomly Name: babble.NewBabbler().Babble(), }, } + // Spawn in a random place near the origin + rover.Attributes.Pos = Vector{ + 10 - (rand.Int() % 20), + 10 - (rand.Int() % 20), + } + + // TODO: Verify no blockages in this area + // Append the rover to the list w.Rovers[rover.Id] = rover From 5c549ad8c380d543e02867cdc37c104109c1e90f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:45:23 +0100 Subject: [PATCH 130/495] Add a TODO to the MoveRover command about blocking other rovers --- pkg/game/world.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index a88282c..5a71db0 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -115,6 +115,8 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err // Calculate the full movement based on the bearing move := bearing.Vector().Multiplied(distance) + // TODO: Verify there's nothing blocking this movement + // Increment the position by the movement i.Attributes.Pos.Add(move) From 0e9082aab7cf305be397029f86f117eea3235fd9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:49:04 +0100 Subject: [PATCH 131/495] Add basic makefile with build and install targets --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b059242 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +VERSION := $(shell git describe --always --long --dirty --tags) + +build: + go build -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... + +install: + go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... + +.PHONY: install \ No newline at end of file From 0fbc973899eefe7785d8efbb5ec62fd22c89f409 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:49:25 +0100 Subject: [PATCH 132/495] Add a make test target --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b059242..3698e7a 100644 --- a/Makefile +++ b/Makefile @@ -6,4 +6,7 @@ build: install: go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... -.PHONY: install \ No newline at end of file +test: + go test -v ./... + +.PHONY: install test \ No newline at end of file From 3274bc93b95ef6a7e1ccb3d5c9d4f158a639d0f9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 18:52:02 +0100 Subject: [PATCH 133/495] Use the test script and the go mod download --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3698e7a..aca7d01 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,14 @@ VERSION := $(shell git describe --always --long --dirty --tags) build: + go mod download go build -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... install: + go mod download go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... test: - go test -v ./... + ./script/test.sh .PHONY: install test \ No newline at end of file From 55cfa37ac5815d09b72acafae7864a66eae458ca Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 19:11:12 +0100 Subject: [PATCH 134/495] Give the rover name a json representation in lowercase --- pkg/game/rover.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 6829de7..3952774 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -11,7 +11,7 @@ type RoverAttributes struct { Range int `json:"range"` // Name of this rover - Name string + Name string `json:"name"` // Pos represents where this rover is in the world Pos Vector `json:"pos"` From a2375bbd9a3c6df7041cbeabafd61892ee913d23 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 23:33:55 +0100 Subject: [PATCH 135/495] Update the top level README --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3765187..6850f7c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ Rove ==== -Rove is an asynchronous nomadic game about exploring a planet as part of a loose community. +Rove is an asynchronous nomadic game about exploring as part of a loose community. -This repository is a growing document as well as the source code repository for the game server. +This repository is a growing document, and the source code for the `rove-server` deployment and the `rove` command line client. + +See [api.go](https://github.com/mdiluz/rove/blob/master/pkg/rove/api.go) for the current server-client API. Build Status ------------ From 1a3ae0ca3e1d31b61fbc27b28798ed4321a32b61 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 6 Jun 2020 23:35:42 +0100 Subject: [PATCH 136/495] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6850f7c..e452179 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Rove Rove is an asynchronous nomadic game about exploring as part of a loose community. -This repository is a growing document, and the source code for the `rove-server` deployment and the `rove` command line client. +This repository is a [living document](https://github.com/mdiluz/rove/tree/master/docs) of current game design, as well as source code for the `rove-server` deployment and the `rove` command line client. See [api.go](https://github.com/mdiluz/rove/blob/master/pkg/rove/api.go) for the current server-client API. From ca17d89f6ee55b13e770c152f1eadfda58073bc2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 13:32:37 +0100 Subject: [PATCH 137/495] Fix logging of rover spawn --- pkg/server/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 64041ef..1607a9a 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -130,7 +130,7 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = err.Error() } else { - fmt.Printf("New rover spawned\taccount:%s\trover:%s\attributes:%+v\n", id, rover, attribs) + fmt.Printf("New rover spawned\taccount:%s\trover:%s\tattributes:%+v\n", id, rover, attribs) response.Success = true response.Attributes = attribs From 77be28f91378a117a028ea5b7fc6cfec109e8bd6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 13:33:18 +0100 Subject: [PATCH 138/495] Rename geom to math --- pkg/game/{geom.go => math.go} | 0 pkg/game/{geom_test.go => math_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename pkg/game/{geom.go => math.go} (100%) rename pkg/game/{geom_test.go => math_test.go} (100%) diff --git a/pkg/game/geom.go b/pkg/game/math.go similarity index 100% rename from pkg/game/geom.go rename to pkg/game/math.go diff --git a/pkg/game/geom_test.go b/pkg/game/math_test.go similarity index 100% rename from pkg/game/geom_test.go rename to pkg/game/math_test.go From 141827fa577be94379d79112397a0ae1d5b745ea Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 13:33:44 +0100 Subject: [PATCH 139/495] Add a blank atlas to the world --- pkg/game/tile.go | 28 ++++++++++++++++++++++++++++ pkg/game/world.go | 3 +++ 2 files changed, 31 insertions(+) create mode 100644 pkg/game/tile.go diff --git a/pkg/game/tile.go b/pkg/game/tile.go new file mode 100644 index 0000000..a590076 --- /dev/null +++ b/pkg/game/tile.go @@ -0,0 +1,28 @@ +package game + +// Tile represents a single tile on the map +type Tile struct { + // Kind represends the kind of tile this is + Kind int `json:"kind"` +} + +const ( + ChunkDimensions = 10 +) + +// Chunk represents a fixed square grid of tiles +type Chunk struct { + // Tiles represents the tiles within the chunk + Tiles [ChunkDimensions][ChunkDimensions]Tile `json:"tiles"` +} + +const ( + // Use a fixed map dimension for now + AtlasDimensions = 10 +) + +// Atlas represents a grid of Chunks +// TODO: Make this resizable +type Atlas struct { + Chunks [AtlasDimensions][AtlasDimensions]Chunk `json:"chunks"` +} diff --git a/pkg/game/world.go b/pkg/game/world.go index 5a71db0..09cdf61 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -14,6 +14,9 @@ type World struct { // Rovers is a id->data map of all the rovers in the game Rovers map[uuid.UUID]Rover `json:"rovers"` + // Atlas represends the world map of chunks and tiles + Atlas Atlas `json:"atlas"` + // Mutex to lock around all world operations worldMutex sync.RWMutex From 8586bdabd73d9f9546a8b8fe45898b19ccbf1642 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:06:34 +0100 Subject: [PATCH 140/495] Fix duplicate saving on quit Slight refactor to split server stop and close functions Quit function explicitly sends SIGTERM SIGTERM doesn't trigger an os.Exit Bonus: Properly save the world on spawning the rover --- cmd/rove-server/api_test.go | 2 +- cmd/rove-server/main.go | 10 +++------- cmd/rove/main_test.go | 2 +- pkg/server/routes.go | 3 +++ pkg/server/server.go | 20 ++++++++++++++++++-- pkg/server/server_test.go | 4 ++-- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/cmd/rove-server/api_test.go b/cmd/rove-server/api_test.go index 8799e5e..25dbdc9 100644 --- a/cmd/rove-server/api_test.go +++ b/cmd/rove-server/api_test.go @@ -29,7 +29,7 @@ func TestMain(m *testing.M) { fmt.Printf("Test server hosted on %s", serv) code := m.Run() - if err := s.Close(); err != nil { + if err := s.StopAndClose(); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 39ce24f..445af36 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -49,21 +49,17 @@ func InnerMain() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - fmt.Println("SIGTERM recieved, exiting...") - if err := s.Close(); err != nil { + fmt.Println("Quit requested, exiting...") + if err := s.Stop(); err != nil { panic(err) } - os.Exit(0) }() // Quit after a time if requested if *quit != 0 { go func() { time.Sleep(time.Duration(*quit) * time.Second) - if err := s.Close(); err != nil { - panic(err) - } - os.Exit(0) + syscall.Kill(syscall.Getpid(), syscall.SIGTERM) }() } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index aa51607..b47a133 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -28,7 +28,7 @@ func TestMain(m *testing.M) { fmt.Printf("Test server hosted on %s", address) code := m.Run() - if err := s.Close(); err != nil { + if err := s.StopAndClose(); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 1607a9a..7824b5b 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -129,6 +129,9 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if attribs, rover, err := s.SpawnRoverForAccount(id); err != nil { response.Error = err.Error() + } else if err := s.SaveWorld(); err != nil { + response.Error = fmt.Sprintf("Internal server error when saving world: %s", err) + } else { fmt.Printf("New rover spawned\taccount:%s\trover:%s\tattributes:%+v\n", id, rover, attribs) diff --git a/pkg/server/server.go b/pkg/server/server.go index 089f9b8..fb040d5 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -164,8 +164,8 @@ func (s *Server) Run() { } } -// Close closes up the server -func (s *Server) Close() error { +// Stop will stop the current server +func (s *Server) Stop() error { // Stop the cron s.schedule.Stop() @@ -176,6 +176,11 @@ func (s *Server) Close() error { return err } + return nil +} + +// Close waits until the server is finished and closes up shop +func (s *Server) Close() error { // Wait until the server has shut down s.sync.Wait() @@ -183,6 +188,17 @@ func (s *Server) Close() error { return s.SaveAll() } +// Close waits until the server is finished and closes up shop +func (s *Server) StopAndClose() error { + // Stop the server + if err := s.Stop(); err != nil { + return err + } + + // Close and return + return s.Close() +} + // SaveWorld will save out the world file func (s *Server) SaveWorld() error { if s.persistence == PersistentData { diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 5f9b4ba..e4face7 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -39,7 +39,7 @@ func TestServer_Run(t *testing.T) { go server.Run() - if err := server.Close(); err != nil { + if err := server.StopAndClose(); err != nil { t.Error(err) } } @@ -54,7 +54,7 @@ func TestServer_RunPersistentData(t *testing.T) { go server.Run() - if err := server.Close(); err != nil { + if err := server.StopAndClose(); err != nil { t.Error(err) } } From ceca4eb7fa1b9e6193c2b65a96a8f3115ad07c9d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:08:34 +0100 Subject: [PATCH 141/495] Refactor the Tile to a full Atlas This atlas is a set of chunks and supports resizing --- pkg/game/atlas.go | 131 +++++++++++++++++++++++++++++++ pkg/game/atlas_test.go | 136 +++++++++++++++++++++++++++++++++ pkg/game/math.go | 26 +++++++ pkg/game/tile.go | 28 ------- pkg/game/world.go | 1 + pkg/persistence/persistence.go | 6 ++ 6 files changed, 300 insertions(+), 28 deletions(-) create mode 100644 pkg/game/atlas.go create mode 100644 pkg/game/atlas_test.go delete mode 100644 pkg/game/tile.go diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go new file mode 100644 index 0000000..fefcaf2 --- /dev/null +++ b/pkg/game/atlas.go @@ -0,0 +1,131 @@ +package game + +import "fmt" + +// Kind represents the type of a tile on the map +type Kind int + +// Chunk represents a fixed square grid of tiles +type Chunk struct { + // Tiles represents the tiles within the chunk + Tiles []Kind `json:"tiles"` +} + +// Atlas represents a grid of Chunks +type Atlas struct { + // Chunks represents all chunks in the world + // This is intentionally not a 2D array so it can be expanded in all directions + Chunks []Chunk `json:"chunks"` + + // size is the current width/height of the given atlas + Size int `json:"size"` + + // ChunkSize is the dimensions of each chunk + ChunkSize int `json:"chunksize"` +} + +// NewAtlas creates a new empty atlas +func NewAtlas(radius int, chunkSize int) Atlas { + size := radius * 2 + a := Atlas{ + Size: size, + Chunks: make([]Chunk, size*size), + ChunkSize: chunkSize, + } + + // Initialise all the chunks + for i := range a.Chunks { + a.Chunks[i] = Chunk{ + Tiles: make([]Kind, chunkSize*chunkSize), + } + } + + return a +} + +// SetTile sets an individual tile's kind +func (a *Atlas) SetTile(v Vector, tile Kind) error { + chunk := a.ToChunk(v) + if chunk >= len(a.Chunks) { + return fmt.Errorf("location outside of allocated atlas") + } + + local := a.ToChunkLocal(v) + tileId := local.X + local.Y*a.ChunkSize + if tileId >= len(a.Chunks[chunk].Tiles) { + return fmt.Errorf("location outside of allocated chunk") + } + a.Chunks[chunk].Tiles[tileId] = tile + return nil +} + +// GetTile will return an individual tile +func (a *Atlas) GetTile(v Vector) (Kind, error) { + chunk := a.ToChunk(v) + if chunk > len(a.Chunks) { + return 0, fmt.Errorf("location outside of allocated atlas") + } + + local := a.ToChunkLocal(v) + tileId := local.X + local.Y*a.ChunkSize + if tileId > len(a.Chunks[chunk].Tiles) { + return 0, fmt.Errorf("location outside of allocated chunk") + } + + return a.Chunks[chunk].Tiles[tileId], nil +} + +// ToChunkLocal gets a chunk local coordinate for a tile +func (a *Atlas) ToChunkLocal(v Vector) Vector { + return Vector{Pmod(v.X, a.ChunkSize), Pmod(v.Y, a.ChunkSize)} +} + +// GetChunkLocal gets a chunk local coordinate for a tile +func (a *Atlas) ToWorld(local Vector, chunk int) Vector { + return a.ChunkOrigin(chunk).Added(local) +} + +// GetChunkID gets the chunk ID for a position in the world +func (a *Atlas) ToChunk(v Vector) int { + local := a.ToChunkLocal(v) + // Get the chunk origin itself + origin := v.Added(local.Negated()) + // Divided it by the number of chunks + origin = origin.Divided(a.ChunkSize) + // Shift it by our size (our origin is in the middle) + origin = origin.Added(Vector{a.Size / 2, a.Size / 2}) + // Get the ID based on the final values + return (a.Size * origin.Y) + origin.X +} + +// ChunkOrigin gets the chunk origin for a given chunk index +func (a *Atlas) ChunkOrigin(chunk int) Vector { + v := Vector{ + X: Pmod(chunk, a.Size) - (a.Size / 2), + Y: (chunk / a.Size) - (a.Size / 2), + } + + return v.Multiplied(a.ChunkSize) +} + +// Grown will return a grown copy of the current atlas +func (a *Atlas) Grown(newRadius int) (Atlas, error) { + delta := (newRadius * 2) - a.Size + if delta < 0 { + return Atlas{}, fmt.Errorf("Cannot shrink an atlas") + } else if delta == 0 { + return Atlas{}, nil + } + + // Create a new atlas + newAtlas := NewAtlas(newRadius, a.ChunkSize) + + // Copy old chunks into new chunks + for index, chunk := range a.Chunks { + // Calculate the new chunk location and copy over the data + newAtlas.Chunks[newAtlas.ToChunk(a.ChunkOrigin(index))] = chunk + } + + // Return the new atlas + return newAtlas, nil +} diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go new file mode 100644 index 0000000..c5591e8 --- /dev/null +++ b/pkg/game/atlas_test.go @@ -0,0 +1,136 @@ +package game + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAtlas_NewAtlas(t *testing.T) { + a := NewAtlas(1, 1) // "radius" of 1, each chunk just one tile + assert.NotNil(t, a) + // Tiles should look like: 2 | 3 + // ----- + // 0 | 1 + assert.Equal(t, 4, len(a.Chunks)) + + a = NewAtlas(2, 1) // "radius" of 2 + assert.NotNil(t, a) + // Tiles should look like: 2 | 3 + // ----- + // 0 | 1 + assert.Equal(t, 16, len(a.Chunks)) +} + +func TestAtlas_ToChunk(t *testing.T) { + a := NewAtlas(1, 1) + assert.NotNil(t, a) + // Tiles should look like: 2 | 3 + // ----- + // 0 | 1 + tile := a.ToChunk(Vector{0, 0}) + assert.Equal(t, 3, tile) + tile = a.ToChunk(Vector{0, -1}) + assert.Equal(t, 1, tile) + tile = a.ToChunk(Vector{-1, -1}) + assert.Equal(t, 0, tile) + tile = a.ToChunk(Vector{-1, 0}) + assert.Equal(t, 2, tile) + + a = NewAtlas(1, 2) + assert.NotNil(t, a) + // Tiles should look like: + // 2 | 3 + // ----- + // 0 | 1 + tile = a.ToChunk(Vector{1, 1}) + assert.Equal(t, 3, tile) + tile = a.ToChunk(Vector{1, -2}) + assert.Equal(t, 1, tile) + tile = a.ToChunk(Vector{-2, -2}) + assert.Equal(t, 0, tile) + tile = a.ToChunk(Vector{-2, 1}) + assert.Equal(t, 2, tile) + + a = NewAtlas(2, 2) + assert.NotNil(t, a) + // Tiles should look like: + // 12| 13|| 14| 15 + // ---------------- + // 8 | 9 || 10| 11 + // ================ + // 4 | 5 || 6 | 7 + // ---------------- + // 0 | 1 || 2 | 3 + tile = a.ToChunk(Vector{1, 3}) + assert.Equal(t, 14, tile) + tile = a.ToChunk(Vector{1, -3}) + assert.Equal(t, 2, tile) + tile = a.ToChunk(Vector{-1, -1}) + assert.Equal(t, 5, tile) + tile = a.ToChunk(Vector{-2, 2}) + assert.Equal(t, 13, tile) +} + +func TestAtlas_GetSetTile(t *testing.T) { + a := NewAtlas(2, 10) + assert.NotNil(t, a) + + // Set the origin tile to 1 and test it + assert.NoError(t, a.SetTile(Vector{0, 0}, 1)) + tile, err := a.GetTile(Vector{0, 0}) + assert.NoError(t, err) + assert.Equal(t, Kind(1), tile) + + // Set another tile to 1 and test it + assert.NoError(t, a.SetTile(Vector{5, -2}, 2)) + tile, err = a.GetTile(Vector{5, -2}) + assert.NoError(t, err) + assert.Equal(t, Kind(2), tile) +} + +func TestAtlas_Grown(t *testing.T) { + // Start with a small example + a := NewAtlas(1, 2) + assert.NotNil(t, a) + assert.Equal(t, 4, len(a.Chunks)) + + // Set a few tiles to values + assert.NoError(t, a.SetTile(Vector{0, 0}, 1)) + assert.NoError(t, a.SetTile(Vector{-1, -1}, 2)) + assert.NoError(t, a.SetTile(Vector{1, -2}, 3)) + + // Grow once to just double it + a, err := a.Grown(2) + assert.NoError(t, err) + assert.Equal(t, 16, len(a.Chunks)) + + tile, err := a.GetTile(Vector{0, 0}) + assert.NoError(t, err) + assert.Equal(t, Kind(1), tile) + + tile, err = a.GetTile(Vector{-1, -1}) + assert.NoError(t, err) + assert.Equal(t, Kind(2), tile) + + tile, err = a.GetTile(Vector{1, -2}) + assert.NoError(t, err) + assert.Equal(t, Kind(3), tile) + + // Grow it again even bigger + a, err = a.Grown(5) + assert.NoError(t, err) + assert.Equal(t, 100, len(a.Chunks)) + + tile, err = a.GetTile(Vector{0, 0}) + assert.NoError(t, err) + assert.Equal(t, Kind(1), tile) + + tile, err = a.GetTile(Vector{-1, -1}) + assert.NoError(t, err) + assert.Equal(t, Kind(2), tile) + + tile, err = a.GetTile(Vector{1, -2}) + assert.NoError(t, err) + assert.Equal(t, Kind(3), tile) +} diff --git a/pkg/game/math.go b/pkg/game/math.go index 846555a..bb6bec6 100644 --- a/pkg/game/math.go +++ b/pkg/game/math.go @@ -6,6 +6,27 @@ import ( "strings" ) +// Abs gets the absolute value of an int +func Abs(x int) int { + if x < 0 { + return -x + } + return x +} + +// pmod is a mositive modulo +// golang's % is a "remainder" function si misbehaves for negative modulus inputs +func Pmod(x, d int) int { + x = x % d + if x >= 0 { + return x + } else if d < 0 { + return x - d + } else { + return x + d + } +} + // Vector desribes a 3D vector type Vector struct { X int `json:"x"` @@ -45,6 +66,11 @@ func (v Vector) Multiplied(val int) Vector { return Vector{v.X * val, v.Y * val} } +// Divided returns the vector divided by an int +func (v Vector) Divided(val int) Vector { + return Vector{v.X / val, v.Y / val} +} + // Direction describes a compass direction type Direction int diff --git a/pkg/game/tile.go b/pkg/game/tile.go deleted file mode 100644 index a590076..0000000 --- a/pkg/game/tile.go +++ /dev/null @@ -1,28 +0,0 @@ -package game - -// Tile represents a single tile on the map -type Tile struct { - // Kind represends the kind of tile this is - Kind int `json:"kind"` -} - -const ( - ChunkDimensions = 10 -) - -// Chunk represents a fixed square grid of tiles -type Chunk struct { - // Tiles represents the tiles within the chunk - Tiles [ChunkDimensions][ChunkDimensions]Tile `json:"tiles"` -} - -const ( - // Use a fixed map dimension for now - AtlasDimensions = 10 -) - -// Atlas represents a grid of Chunks -// TODO: Make this resizable -type Atlas struct { - Chunks [AtlasDimensions][AtlasDimensions]Chunk `json:"chunks"` -} diff --git a/pkg/game/world.go b/pkg/game/world.go index 09cdf61..398d728 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -32,6 +32,7 @@ func NewWorld() *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), + Atlas: NewAtlas(2, 10), // TODO: Choose an appropriate world size } } diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index 7d90272..85ffa18 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -29,6 +29,7 @@ func jsonPath(name string) string { // Save will serialise the interface into a json file func Save(name string, data interface{}) error { + path := jsonPath(name) if b, err := json.MarshalIndent(data, "", "\t"); err != nil { return err } else { @@ -36,6 +37,8 @@ func Save(name string, data interface{}) error { return err } } + + fmt.Printf("Saved %s\n", path) return nil } @@ -54,9 +57,12 @@ func Load(name string, data interface{}) error { return err } else if len(b) == 0 { fmt.Printf("File %s was empty, loading with fresh data\n", path) + return nil } else if err := json.Unmarshal(b, data); err != nil { return fmt.Errorf("failed to load file %s error: %s", path, err) } + + fmt.Printf("Loaded %s\n", path) return nil } From aa4df38eadc66d5d1c1f51aa1e219d63ec64dfd6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:21:44 +0100 Subject: [PATCH 142/495] Swap kind to bytes and reduce chunk size --- pkg/game/atlas.go | 2 +- pkg/game/world.go | 2 +- pkg/persistence/persistence.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index fefcaf2..e981005 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -3,7 +3,7 @@ package game import "fmt" // Kind represents the type of a tile on the map -type Kind int +type Kind byte // Chunk represents a fixed square grid of tiles type Chunk struct { diff --git a/pkg/game/world.go b/pkg/game/world.go index 398d728..27ea969 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -32,7 +32,7 @@ func NewWorld() *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), - Atlas: NewAtlas(2, 10), // TODO: Choose an appropriate world size + Atlas: NewAtlas(2, 8), // TODO: Choose an appropriate world size } } diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index 85ffa18..db0e868 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -30,7 +30,7 @@ func jsonPath(name string) string { // Save will serialise the interface into a json file func Save(name string, data interface{}) error { path := jsonPath(name) - if b, err := json.MarshalIndent(data, "", "\t"); err != nil { + if b, err := json.MarshalIndent(data, "", " "); err != nil { return err } else { if err := ioutil.WriteFile(jsonPath(name), b, os.ModePerm); err != nil { From 289bab2a7a95299180e937fbfd6a6eee9b33bfa9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:33:44 +0100 Subject: [PATCH 143/495] Refactor atlas creation and growth Pass in the real size and grow itself rather than return a new one --- pkg/game/atlas.go | 32 ++++++++++++++++++++++---------- pkg/game/atlas_test.go | 18 +++++++++--------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index e981005..90144ee 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -1,6 +1,9 @@ package game -import "fmt" +import ( + "fmt" + "log" +) // Kind represents the type of a tile on the map type Kind byte @@ -25,8 +28,11 @@ type Atlas struct { } // NewAtlas creates a new empty atlas -func NewAtlas(radius int, chunkSize int) Atlas { - size := radius * 2 +func NewAtlas(size int, chunkSize int) Atlas { + if size%2 != 0 { + log.Fatal("atlas size must always be even") + } + a := Atlas{ Size: size, Chunks: make([]Chunk, size*size), @@ -108,17 +114,20 @@ func (a *Atlas) ChunkOrigin(chunk int) Vector { return v.Multiplied(a.ChunkSize) } -// Grown will return a grown copy of the current atlas -func (a *Atlas) Grown(newRadius int) (Atlas, error) { - delta := (newRadius * 2) - a.Size +// Grow will return a grown copy of the current atlas +func (a *Atlas) Grow(size int) error { + if size%2 != 0 { + return fmt.Errorf("atlas size must always be even") + } + delta := size - a.Size if delta < 0 { - return Atlas{}, fmt.Errorf("Cannot shrink an atlas") + return fmt.Errorf("Cannot shrink an atlas") } else if delta == 0 { - return Atlas{}, nil + return nil } // Create a new atlas - newAtlas := NewAtlas(newRadius, a.ChunkSize) + newAtlas := NewAtlas(size, a.ChunkSize) // Copy old chunks into new chunks for index, chunk := range a.Chunks { @@ -126,6 +135,9 @@ func (a *Atlas) Grown(newRadius int) (Atlas, error) { newAtlas.Chunks[newAtlas.ToChunk(a.ChunkOrigin(index))] = chunk } + // Copy the new atlas data into this one + *a = newAtlas + // Return the new atlas - return newAtlas, nil + return nil } diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index c5591e8..f0f32f7 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -7,14 +7,14 @@ import ( ) func TestAtlas_NewAtlas(t *testing.T) { - a := NewAtlas(1, 1) // "radius" of 1, each chunk just one tile + a := NewAtlas(2, 1) assert.NotNil(t, a) // Tiles should look like: 2 | 3 // ----- // 0 | 1 assert.Equal(t, 4, len(a.Chunks)) - a = NewAtlas(2, 1) // "radius" of 2 + a = NewAtlas(4, 1) assert.NotNil(t, a) // Tiles should look like: 2 | 3 // ----- @@ -23,7 +23,7 @@ func TestAtlas_NewAtlas(t *testing.T) { } func TestAtlas_ToChunk(t *testing.T) { - a := NewAtlas(1, 1) + a := NewAtlas(2, 1) assert.NotNil(t, a) // Tiles should look like: 2 | 3 // ----- @@ -37,7 +37,7 @@ func TestAtlas_ToChunk(t *testing.T) { tile = a.ToChunk(Vector{-1, 0}) assert.Equal(t, 2, tile) - a = NewAtlas(1, 2) + a = NewAtlas(2, 2) assert.NotNil(t, a) // Tiles should look like: // 2 | 3 @@ -52,7 +52,7 @@ func TestAtlas_ToChunk(t *testing.T) { tile = a.ToChunk(Vector{-2, 1}) assert.Equal(t, 2, tile) - a = NewAtlas(2, 2) + a = NewAtlas(4, 2) assert.NotNil(t, a) // Tiles should look like: // 12| 13|| 14| 15 @@ -73,7 +73,7 @@ func TestAtlas_ToChunk(t *testing.T) { } func TestAtlas_GetSetTile(t *testing.T) { - a := NewAtlas(2, 10) + a := NewAtlas(4, 10) assert.NotNil(t, a) // Set the origin tile to 1 and test it @@ -91,7 +91,7 @@ func TestAtlas_GetSetTile(t *testing.T) { func TestAtlas_Grown(t *testing.T) { // Start with a small example - a := NewAtlas(1, 2) + a := NewAtlas(2, 2) assert.NotNil(t, a) assert.Equal(t, 4, len(a.Chunks)) @@ -101,7 +101,7 @@ func TestAtlas_Grown(t *testing.T) { assert.NoError(t, a.SetTile(Vector{1, -2}, 3)) // Grow once to just double it - a, err := a.Grown(2) + err := a.Grow(4) assert.NoError(t, err) assert.Equal(t, 16, len(a.Chunks)) @@ -118,7 +118,7 @@ func TestAtlas_Grown(t *testing.T) { assert.Equal(t, Kind(3), tile) // Grow it again even bigger - a, err = a.Grown(5) + err = a.Grow(10) assert.NoError(t, err) assert.Equal(t, 100, len(a.Chunks)) From cb725c96d27a772dc3a11c990440d002cf30aedf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:38:46 +0100 Subject: [PATCH 144/495] Rename Kind -> Tile --- pkg/game/atlas.go | 11 ++++------- pkg/game/atlas_test.go | 16 ++++++++-------- pkg/game/tile.go | 10 ++++++++++ 3 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 pkg/game/tile.go diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 90144ee..88bc73e 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -5,13 +5,10 @@ import ( "log" ) -// Kind represents the type of a tile on the map -type Kind byte - // Chunk represents a fixed square grid of tiles type Chunk struct { // Tiles represents the tiles within the chunk - Tiles []Kind `json:"tiles"` + Tiles []Tile `json:"tiles"` } // Atlas represents a grid of Chunks @@ -42,7 +39,7 @@ func NewAtlas(size int, chunkSize int) Atlas { // Initialise all the chunks for i := range a.Chunks { a.Chunks[i] = Chunk{ - Tiles: make([]Kind, chunkSize*chunkSize), + Tiles: make([]Tile, chunkSize*chunkSize), } } @@ -50,7 +47,7 @@ func NewAtlas(size int, chunkSize int) Atlas { } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v Vector, tile Kind) error { +func (a *Atlas) SetTile(v Vector, tile Tile) error { chunk := a.ToChunk(v) if chunk >= len(a.Chunks) { return fmt.Errorf("location outside of allocated atlas") @@ -66,7 +63,7 @@ func (a *Atlas) SetTile(v Vector, tile Kind) error { } // GetTile will return an individual tile -func (a *Atlas) GetTile(v Vector) (Kind, error) { +func (a *Atlas) GetTile(v Vector) (Tile, error) { chunk := a.ToChunk(v) if chunk > len(a.Chunks) { return 0, fmt.Errorf("location outside of allocated atlas") diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index f0f32f7..99fe5f4 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -80,13 +80,13 @@ func TestAtlas_GetSetTile(t *testing.T) { assert.NoError(t, a.SetTile(Vector{0, 0}, 1)) tile, err := a.GetTile(Vector{0, 0}) assert.NoError(t, err) - assert.Equal(t, Kind(1), tile) + assert.Equal(t, Tile(1), tile) // Set another tile to 1 and test it assert.NoError(t, a.SetTile(Vector{5, -2}, 2)) tile, err = a.GetTile(Vector{5, -2}) assert.NoError(t, err) - assert.Equal(t, Kind(2), tile) + assert.Equal(t, Tile(2), tile) } func TestAtlas_Grown(t *testing.T) { @@ -107,15 +107,15 @@ func TestAtlas_Grown(t *testing.T) { tile, err := a.GetTile(Vector{0, 0}) assert.NoError(t, err) - assert.Equal(t, Kind(1), tile) + assert.Equal(t, Tile(1), tile) tile, err = a.GetTile(Vector{-1, -1}) assert.NoError(t, err) - assert.Equal(t, Kind(2), tile) + assert.Equal(t, Tile(2), tile) tile, err = a.GetTile(Vector{1, -2}) assert.NoError(t, err) - assert.Equal(t, Kind(3), tile) + assert.Equal(t, Tile(3), tile) // Grow it again even bigger err = a.Grow(10) @@ -124,13 +124,13 @@ func TestAtlas_Grown(t *testing.T) { tile, err = a.GetTile(Vector{0, 0}) assert.NoError(t, err) - assert.Equal(t, Kind(1), tile) + assert.Equal(t, Tile(1), tile) tile, err = a.GetTile(Vector{-1, -1}) assert.NoError(t, err) - assert.Equal(t, Kind(2), tile) + assert.Equal(t, Tile(2), tile) tile, err = a.GetTile(Vector{1, -2}) assert.NoError(t, err) - assert.Equal(t, Kind(3), tile) + assert.Equal(t, Tile(3), tile) } diff --git a/pkg/game/tile.go b/pkg/game/tile.go new file mode 100644 index 0000000..9500cfe --- /dev/null +++ b/pkg/game/tile.go @@ -0,0 +1,10 @@ +package game + +// Tile represents the type of a tile on the map +type Tile byte + +const ( + TileEmpty = '_' + + TileRock = 'o' +) From 3781a4d10d8053def5a07d901e884b9098697052 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 18:57:44 +0100 Subject: [PATCH 145/495] Spawn a border around the world atlas for now Also spawn the rover within a single chunk in the middle --- pkg/game/atlas.go | 20 ++++++++++++++++++++ pkg/game/atlas_test.go | 24 ++++++++++++++++++++++++ pkg/game/tile.go | 4 ++-- pkg/game/world.go | 11 ++++++++--- pkg/server/server.go | 5 +++++ 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 88bc73e..8f1bfcd 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -46,6 +46,26 @@ func NewAtlas(size int, chunkSize int) Atlas { return a } +// SpawnAtlasBorder surrounds the current atlas in a border wall +func (a *Atlas) SpawnAtlasBorder() error { + extent := a.ChunkSize * (a.Size / 2) + // Surround the atlas in walls + for i := -extent; i < extent; i++ { + + if err := a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { + return err + } else if a.SetTile(Vector{extent - 1, i}, TileWall); err != nil { + return err + } else if a.SetTile(Vector{-extent, i}, TileWall); err != nil { + return err + } else if a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { + return err + } + } + + return nil +} + // SetTile sets an individual tile's kind func (a *Atlas) SetTile(v Vector, tile Tile) error { chunk := a.ToChunk(v) diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index 99fe5f4..9571f8a 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -134,3 +134,27 @@ func TestAtlas_Grown(t *testing.T) { assert.NoError(t, err) assert.Equal(t, Tile(3), tile) } + +func TestAtlas_SpawnAtlasBorder(t *testing.T) { + // Start with a small example + a := NewAtlas(2, 2) + assert.NotNil(t, a) + assert.Equal(t, 4, len(a.Chunks)) + + assert.NoError(t, a.SpawnAtlasBorder()) + tile, err := a.GetTile(Vector{0, 0}) + assert.NoError(t, err) + assert.Equal(t, TileEmpty, tile) + + tile, err = a.GetTile(Vector{1, 1}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) + + tile, err = a.GetTile(Vector{-1, -1}) + assert.NoError(t, err) + assert.Equal(t, TileEmpty, tile) + + tile, err = a.GetTile(Vector{-2, -2}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) +} diff --git a/pkg/game/tile.go b/pkg/game/tile.go index 9500cfe..41cf648 100644 --- a/pkg/game/tile.go +++ b/pkg/game/tile.go @@ -4,7 +4,7 @@ package game type Tile byte const ( - TileEmpty = '_' + TileEmpty = Tile(0) - TileRock = 'o' + TileWall = Tile(1) ) diff --git a/pkg/game/world.go b/pkg/game/world.go index 27ea969..1710a54 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -32,10 +32,15 @@ func NewWorld() *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), - Atlas: NewAtlas(2, 8), // TODO: Choose an appropriate world size + Atlas: NewAtlas(4, 8), // TODO: Choose an appropriate world size } } +// SpawnWorldBorder spawns a border at the edge of the world atlas +func (w *World) SpawnWorldBorder() error { + return w.Atlas.SpawnAtlasBorder() +} + // SpawnRover adds an rover to the game func (w *World) SpawnRover() uuid.UUID { w.worldMutex.Lock() @@ -56,8 +61,8 @@ func (w *World) SpawnRover() uuid.UUID { // Spawn in a random place near the origin rover.Attributes.Pos = Vector{ - 10 - (rand.Int() % 20), - 10 - (rand.Int() % 20), + w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), + w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), } // TODO: Verify no blockages in this area diff --git a/pkg/server/server.go b/pkg/server/server.go index fb040d5..d045983 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -109,6 +109,11 @@ func (s *Server) Initialise() (err error) { // Add to our sync s.sync.Add(1) + // Spawn a border on the default world + if err := s.world.SpawnWorldBorder(); err != nil { + return err + } + // Load the accounts if requested if err := s.LoadAll(); err != nil { return err From fc54775df980be7be4d568da30743e5dffa9c2e9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 19:03:16 +0100 Subject: [PATCH 146/495] Stop movement into non-empty tiles --- pkg/game/world.go | 15 ++++++++++----- pkg/game/world_test.go | 9 +++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 1710a54..d0ccb5c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -124,13 +124,18 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err // Calculate the full movement based on the bearing move := bearing.Vector().Multiplied(distance) - // TODO: Verify there's nothing blocking this movement + // Try the new move position + newPos := i.Attributes.Pos.Added(move) - // Increment the position by the movement - i.Attributes.Pos.Add(move) + // Get the tile and verify it's empty + if tile, err := w.Atlas.GetTile(newPos); err != nil { + return i.Attributes, fmt.Errorf("couldn't get tile for new position") + } else if tile == TileEmpty { + // Perform the move + i.Attributes.Pos = newPos + w.Rovers[id] = i + } - // Set the rover values to the new ones - w.Rovers[id] = i return i.Attributes, nil } else { return RoverAttributes{}, fmt.Errorf("no rover matching id") diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index b33662d..cb88d21 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -60,8 +60,8 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to get rover attribs") pos := Vector{ - X: 1.0, - Y: 2.0, + X: 0.0, + Y: 0.0, } err = world.WarpRover(a, pos) @@ -77,6 +77,11 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") + + // Place a tile in front of the rover + assert.NoError(t, world.Atlas.SetTile(Vector{0, 2}, TileWall)) + newAttribs, err = world.MoveRover(a, bearing) + assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") } func TestWorld_RadarFromRover(t *testing.T) { From 43648926ca0ce8851d1c1fd2102b4ed37b045fb6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 22:30:03 +0100 Subject: [PATCH 147/495] Large refactor to properly implement radar /radar now returns a set of non-empty tile blips --- cmd/rove/main.go | 2 +- pkg/game/atlas.go | 9 +++- pkg/game/command_test.go | 3 +- pkg/game/math.go | 16 +++++++ pkg/game/tile.go | 2 + pkg/game/world.go | 99 +++++++++++++++++++++++++++++++-------- pkg/game/world_test.go | 46 ++++++++++++------ pkg/rove/api.go | 4 +- pkg/server/routes.go | 2 +- pkg/server/routes_test.go | 39 ++++++++++++--- pkg/server/server.go | 10 ++-- 11 files changed, 182 insertions(+), 50 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 0a5ea23..2e46736 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -172,7 +172,7 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - fmt.Printf("nearby rovers: %+v\n", response.Rovers) + fmt.Printf("radar blips: %+v\n", response.Blips) } case "rover": diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 8f1bfcd..4f9f684 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -85,13 +85,13 @@ func (a *Atlas) SetTile(v Vector, tile Tile) error { // GetTile will return an individual tile func (a *Atlas) GetTile(v Vector) (Tile, error) { chunk := a.ToChunk(v) - if chunk > len(a.Chunks) { + if chunk >= len(a.Chunks) { return 0, fmt.Errorf("location outside of allocated atlas") } local := a.ToChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize - if tileId > len(a.Chunks[chunk].Tiles) { + if tileId >= len(a.Chunks[chunk].Tiles) { return 0, fmt.Errorf("location outside of allocated chunk") } @@ -131,6 +131,11 @@ func (a *Atlas) ChunkOrigin(chunk int) Vector { return v.Multiplied(a.ChunkSize) } +// GetWorldExtent gets the extent of the world +func (a *Atlas) GetWorldExtent() int { + return (a.Size / 2) * a.ChunkSize +} + // Grow will return a grown copy of the current atlas func (a *Atlas) Grow(size int) error { if size%2 != 0 { diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index fcdb9ce..f221b66 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -8,7 +8,8 @@ import ( func TestCommand_Move(t *testing.T) { world := NewWorld() - a := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) pos := Vector{ X: 1.0, Y: 2.0, diff --git a/pkg/game/math.go b/pkg/game/math.go index bb6bec6..3c9c1b2 100644 --- a/pkg/game/math.go +++ b/pkg/game/math.go @@ -27,6 +27,22 @@ func Pmod(x, d int) int { } } +// Max returns the highest int +func Max(x int, y int) int { + if x < y { + return y + } + return x +} + +// Min returns the lowest int +func Min(x int, y int) int { + if x > y { + return y + } + return x +} + // Vector desribes a 3D vector type Vector struct { X int `json:"x"` diff --git a/pkg/game/tile.go b/pkg/game/tile.go index 41cf648..b0d1fb8 100644 --- a/pkg/game/tile.go +++ b/pkg/game/tile.go @@ -7,4 +7,6 @@ const ( TileEmpty = Tile(0) TileWall = Tile(1) + + TileRover = Tile(2) ) diff --git a/pkg/game/world.go b/pkg/game/world.go index d0ccb5c..f6a3965 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -42,7 +42,7 @@ func (w *World) SpawnWorldBorder() error { } // SpawnRover adds an rover to the game -func (w *World) SpawnRover() uuid.UUID { +func (w *World) SpawnRover() (uuid.UUID, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -52,7 +52,7 @@ func (w *World) SpawnRover() uuid.UUID { Attributes: RoverAttributes{ Speed: 1.0, - Range: 20.0, + Range: 5.0, // Set the name randomly Name: babble.NewBabbler().Babble(), @@ -65,12 +65,29 @@ func (w *World) SpawnRover() uuid.UUID { w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), } - // TODO: Verify no blockages in this area + // Seach until we error (run out of world) + for { + if tile, err := w.Atlas.GetTile(rover.Attributes.Pos); err != nil { + return uuid.Nil, err + } else { + if tile == TileEmpty { + break + } else { + // Try and spawn to the east of the blockage + rover.Attributes.Pos.Add(Vector{1, 0}) + } + } + } + + // Set the world tile to a rover + if err := w.Atlas.SetTile(rover.Attributes.Pos, TileRover); err != nil { + return uuid.Nil, err + } // Append the rover to the list w.Rovers[rover.Id] = rover - return rover.Id + return rover.Id, nil } // Removes an rover from the game @@ -78,7 +95,11 @@ func (w *World) DestroyRover(id uuid.UUID) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if _, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[id]; ok { + // Clear the tile + if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + return fmt.Errorf("coudln't clear old rover tile: %s", err) + } delete(w.Rovers, id) } else { return fmt.Errorf("no rover matching id") @@ -104,6 +125,14 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { defer w.worldMutex.Unlock() if i, ok := w.Rovers[id]; ok { + // Update the world tile + // TODO: Make this (and other things) transactional + if err := w.Atlas.SetTile(pos, TileRover); err != nil { + return fmt.Errorf("coudln't set rover tile: %s", err) + } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + return fmt.Errorf("coudln't clear old rover tile: %s", err) + } + i.Attributes.Pos = pos w.Rovers[id] = i return nil @@ -129,8 +158,16 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { - return i.Attributes, fmt.Errorf("couldn't get tile for new position") + return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) } else if tile == TileEmpty { + // Set the world tiles + // TODO: Make this (and other things) transactional + if err := w.Atlas.SetTile(newPos, TileRover); err != nil { + return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err) + } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + return i.Attributes, fmt.Errorf("coudln't clear old rover tile: %s", err) + } + // Perform the move i.Attributes.Pos = newPos w.Rovers[id] = i @@ -142,30 +179,54 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err } } -// RadarDescription describes what a rover can see -type RadarDescription struct { - // Rovers is the set of rovers that this radar can see - Rovers []Vector `json:"rovers"` +// RadarBlip represents a single blip on the radar +type RadarBlip struct { + Position Vector `json:"position"` + Tile Tile `json:"tile"` } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(id uuid.UUID) (RadarDescription, error) { +func (w *World) RadarFromRover(id uuid.UUID) ([]RadarBlip, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if r1, ok := w.Rovers[id]; ok { - var desc RadarDescription + if r, ok := w.Rovers[id]; ok { + var blips []RadarBlip - // Gather nearby rovers within the range - for _, r2 := range w.Rovers { - if r1.Id != r2.Id && r1.Attributes.Pos.Distance(r2.Attributes.Pos) < float64(r1.Attributes.Range) { - desc.Rovers = append(desc.Rovers, r2.Attributes.Pos) + extent := w.Atlas.GetWorldExtent() + + // Get min and max extents to query + min := Vector{ + Max(-extent, r.Attributes.Pos.X-r.Attributes.Range), + Max(-extent, r.Attributes.Pos.Y-r.Attributes.Range), + } + max := Vector{ + Min(extent-1, r.Attributes.Pos.X+r.Attributes.Range), + Min(extent-1, r.Attributes.Pos.Y+r.Attributes.Range), + } + + // Gather up all tiles within the range + for i := min.X; i < max.X; i++ { + for j := min.Y; j < max.Y; j++ { + + // Skip this rover + q := Vector{i, j} + if q == r.Attributes.Pos { + continue + } + + if tile, err := w.Atlas.GetTile(q); err != nil { + return blips, fmt.Errorf("failed to query tile: %s", err) + + } else if tile != TileEmpty { + blips = append(blips, RadarBlip{Position: q, Tile: tile}) + } } } - return desc, nil + return blips, nil } else { - return RadarDescription{}, fmt.Errorf("no rover matching id") + return nil, fmt.Errorf("no rover matching id") } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index cb88d21..dc39a24 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -16,8 +16,10 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld() - a := world.SpawnRover() - b := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) + b, err := world.SpawnRover() + assert.NoError(t, err) // Basic duplicate check if a == b { @@ -29,7 +31,8 @@ func TestWorld_CreateRover(t *testing.T) { func TestWorld_RoverAttributes(t *testing.T) { world := NewWorld() - a := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) attribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") @@ -39,10 +42,12 @@ func TestWorld_RoverAttributes(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) { world := NewWorld() - a := world.SpawnRover() - b := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) + b, err := world.SpawnRover() + assert.NoError(t, err) - err := world.DestroyRover(a) + err = world.DestroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check @@ -55,7 +60,8 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld() - a := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) attribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") @@ -86,22 +92,34 @@ func TestWorld_GetSetMovePosition(t *testing.T) { func TestWorld_RadarFromRover(t *testing.T) { world := NewWorld() - a := world.SpawnRover() - b := world.SpawnRover() - c := world.SpawnRover() + a, err := world.SpawnRover() + assert.NoError(t, err) + b, err := world.SpawnRover() + assert.NoError(t, err) + c, err := world.SpawnRover() + assert.NoError(t, err) // Get a's attributes attrib, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") // Warp the rovers so a can see b but not c + bpos := Vector{attrib.Range - 1, 0} + cpos := Vector{attrib.Range + 1, 0} assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") - assert.NoError(t, world.WarpRover(b, Vector{attrib.Range - 1, 0}), "Failed to warp rover") - assert.NoError(t, world.WarpRover(c, Vector{attrib.Range + 1, 0}), "Failed to warp rover") + assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") + assert.NoError(t, world.WarpRover(c, cpos), "Failed to warp rover") radar, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") - assert.Equal(t, 1, len(radar.Rovers), "Radar returned wrong number of rovers") - assert.Equal(t, Vector{attrib.Range - 1, 0}, radar.Rovers[0], "Rover on radar in wrong position") + assert.Equal(t, 1, len(radar), "Radar returned wrong number of rovers") + + found := false + for _, blip := range radar { + if blip.Position == bpos && blip.Tile == TileRover { + found = true + } + } + assert.True(t, found, "Rover not found on radar in expected position") } diff --git a/pkg/rove/api.go b/pkg/rove/api.go index d47f1c6..0163a01 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -104,8 +104,8 @@ type RadarResponse struct { Success bool `json:"success"` Error string `json:"error,omitempty"` - // The set of positions for nearby rovers - Rovers []game.Vector `json:"rovers"` + // The set of positions for nearby non-empty tiles + Blips []game.RadarBlip `json:"blips"` } // ================ diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 7824b5b..29a2bfd 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -197,7 +197,7 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else { fmt.Printf("Responded with radar\taccount:%s\tradar:%+v\n", id, radar) - response.Rovers = radar.Rovers + response.Blips = radar response.Success = true } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index ab21bf1..4fa85fd 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -140,7 +140,22 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - _, _, err = s.SpawnRoverForAccount(a.Id) + _, id, err := s.SpawnRoverForAccount(a.Id) + assert.NoError(t, err) + + // Warp this rover to 0 + assert.NoError(t, s.world.WarpRover(id, game.Vector{})) + + // Spawn another rover + id, err = s.world.SpawnRover() + assert.NoError(t, err) + // Warp this rover to just above the other one + roverPos := game.Vector{X: 0, Y: 1} + assert.NoError(t, s.world.WarpRover(id, roverPos)) + + // Set a tile to wall below this rover + wallPos := game.Vector{X: 0, Y: -1} + assert.NoError(t, s.world.Atlas.SetTile(wallPos, game.TileWall)) request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/radar"), nil) response := httptest.NewRecorder() @@ -155,7 +170,18 @@ func TestHandleRadar(t *testing.T) { t.Errorf("got false for /radar: %s", status.Error) } - // TODO: Verify the radar information + foundWall := false + foundRover := false + for _, b := range status.Blips { + if b.Position == wallPos && b.Tile == game.TileWall { + foundWall = true + } else if b.Position == roverPos && b.Tile == game.TileRover { + foundRover = true + } + } + assert.True(t, foundWall) + assert.True(t, foundRover) + } func TestHandleRover(t *testing.T) { @@ -164,8 +190,9 @@ func TestHandleRover(t *testing.T) { a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") - // Spawn the rover rover for the account - _, _, err = s.SpawnRoverForAccount(a.Id) + // Spawn one rover for the account + attribs, _, err := s.SpawnRoverForAccount(a.Id) + assert.NoError(t, err) request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/rover"), nil) response := httptest.NewRecorder() @@ -178,7 +205,7 @@ func TestHandleRover(t *testing.T) { if status.Success != true { t.Errorf("got false for /rover: %s", status.Error) + } else if attribs != status.Attributes { + t.Errorf("Missmatched attributes: %+v, !=%+v", attribs, status.Attributes) } - - // TODO: Verify the rover information } diff --git a/pkg/server/server.go b/pkg/server/server.go index d045983..0f06c62 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -269,7 +269,7 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons w.WriteHeader(http.StatusInternalServerError) } else if err := json.NewEncoder(w).Encode(val); err != nil { - fmt.Printf("Failed to encode return to json: %s", err) + fmt.Printf("Failed to encode reply to json: %s", err) w.WriteHeader(http.StatusInternalServerError) } else { @@ -280,9 +280,11 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.RoverAttributes, uuid.UUID, error) { - inst := s.world.SpawnRover() - if attribs, err := s.world.RoverAttributes(inst); err != nil { - return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover") + if inst, err := s.world.SpawnRover(); err != nil { + return game.RoverAttributes{}, uuid.UUID{}, err + + } else if attribs, err := s.world.RoverAttributes(inst); err != nil { + return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover: %s", err) } else { if err := s.accountant.AssignRover(accountid, inst); err != nil { From e82fb3dbfe9cad5905aea2b448501c942dd5951b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 22:36:11 +0100 Subject: [PATCH 148/495] Pepper the world with rocks --- pkg/game/atlas.go | 17 +++++++++++++++-- pkg/game/atlas_test.go | 4 ++-- pkg/game/tile.go | 6 +++--- pkg/game/world.go | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 4f9f684..d5d9a5a 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -3,6 +3,7 @@ package game import ( "fmt" "log" + "math/rand" ) // Chunk represents a fixed square grid of tiles @@ -46,9 +47,21 @@ func NewAtlas(size int, chunkSize int) Atlas { return a } -// SpawnAtlasBorder surrounds the current atlas in a border wall -func (a *Atlas) SpawnAtlasBorder() error { +// SpawnWorld spawns the current world +func (a *Atlas) SpawnWorld() error { extent := a.ChunkSize * (a.Size / 2) + + // Pepper the current world with rocks + for i := -extent; i < extent; i++ { + for j := -extent; j < extent; j++ { + if rand.Int()%16 == 0 { + if err := a.SetTile(Vector{i, j}, TileRock); err != nil { + return err + } + } + } + } + // Surround the atlas in walls for i := -extent; i < extent; i++ { diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index 9571f8a..bb7fee5 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -135,13 +135,13 @@ func TestAtlas_Grown(t *testing.T) { assert.Equal(t, Tile(3), tile) } -func TestAtlas_SpawnAtlasBorder(t *testing.T) { +func TestAtlas_SpawnWorld(t *testing.T) { // Start with a small example a := NewAtlas(2, 2) assert.NotNil(t, a) assert.Equal(t, 4, len(a.Chunks)) - assert.NoError(t, a.SpawnAtlasBorder()) + assert.NoError(t, a.SpawnWorld()) tile, err := a.GetTile(Vector{0, 0}) assert.NoError(t, err) assert.Equal(t, TileEmpty, tile) diff --git a/pkg/game/tile.go b/pkg/game/tile.go index b0d1fb8..954f571 100644 --- a/pkg/game/tile.go +++ b/pkg/game/tile.go @@ -5,8 +5,8 @@ type Tile byte const ( TileEmpty = Tile(0) + TileRover = Tile(1) - TileWall = Tile(1) - - TileRover = Tile(2) + TileWall = Tile(2) + TileRock = Tile(3) ) diff --git a/pkg/game/world.go b/pkg/game/world.go index f6a3965..68ece50 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -38,7 +38,7 @@ func NewWorld() *World { // SpawnWorldBorder spawns a border at the edge of the world atlas func (w *World) SpawnWorldBorder() error { - return w.Atlas.SpawnAtlasBorder() + return w.Atlas.SpawnWorld() } // SpawnRover adds an rover to the game From 4d00af248ff4a46a05b8614351223ac72ee5d12d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 22:37:12 +0100 Subject: [PATCH 149/495] Core features of the Proof Of Concept are done --- docs/poc.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/poc.md b/docs/poc.md index ef09667..a11ddc6 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -3,15 +3,15 @@ Proof Of Concept For a proof of concept we'll implement a very small subset of the final features -### Core Features +### Core Features (done) -* Create an account (done) -* Control an rover in a 2D map (done) -* Query for what the rover can see (done) -* Persistent accounts and world (done) -* Multiple users (done) +* Create an account +* Control an rover in a 2D map +* Query for what the rover can see +* Persistent accounts and world +* Multiple users * Populate map with locations/objects -* Commands happen in "real time" (done) +* Commands happen in "real time" ### Stretch goals From de0ccbaa6e09d03ac3a3f3dd43a84e262f52e766 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 23:05:36 +0100 Subject: [PATCH 150/495] Fix the random rock spawns --- pkg/game/atlas.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index d5d9a5a..ac0b9c5 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -54,7 +54,7 @@ func (a *Atlas) SpawnWorld() error { // Pepper the current world with rocks for i := -extent; i < extent; i++ { for j := -extent; j < extent; j++ { - if rand.Int()%16 == 0 { + if rand.Intn(16) == 0 { if err := a.SetTile(Vector{i, j}, TileRock); err != nil { return err } From 65818ed0e1d782f10afc1dfbcf6c78c269356244 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 23:05:55 +0100 Subject: [PATCH 151/495] Renamethe spawn world function --- pkg/game/world.go | 4 ++-- pkg/server/server.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 68ece50..7736551 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -36,8 +36,8 @@ func NewWorld() *World { } } -// SpawnWorldBorder spawns a border at the edge of the world atlas -func (w *World) SpawnWorldBorder() error { +// SpawnWorld spawns a border at the edge of the world atlas +func (w *World) SpawnWorld() error { return w.Atlas.SpawnWorld() } diff --git a/pkg/server/server.go b/pkg/server/server.go index 0f06c62..9ad1c21 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -110,7 +110,7 @@ func (s *Server) Initialise() (err error) { s.sync.Add(1) // Spawn a border on the default world - if err := s.world.SpawnWorldBorder(); err != nil { + if err := s.world.SpawnWorld(); err != nil { return err } From 35806576f9b3d69f6401069120d327a0b3135b43 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 23:17:56 +0100 Subject: [PATCH 152/495] Add a bunch of TODOs --- cmd/rove/main.go | 3 +++ pkg/game/math.go | 2 ++ pkg/game/tile.go | 1 + pkg/game/world.go | 1 + pkg/rove/api.go | 2 ++ 5 files changed, 9 insertions(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2e46736..2fc436a 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -16,6 +16,7 @@ import ( var USAGE = "" // Command usage +// TODO: Allow COMMAND to be used first func Usage() { fmt.Printf("Usage: %s [OPTIONS]... COMMAND\n", os.Args[0]) fmt.Println("\nCommands:") @@ -173,6 +174,8 @@ func InnerMain(command string) error { } else { fmt.Printf("radar blips: %+v\n", response.Blips) + + // TODO: Do some art } case "rover": diff --git a/pkg/game/math.go b/pkg/game/math.go index 3c9c1b2..059e4ad 100644 --- a/pkg/game/math.go +++ b/pkg/game/math.go @@ -6,6 +6,8 @@ import ( "strings" ) +// TODO: Pull this out into math package and get more test coverage + // Abs gets the absolute value of an int func Abs(x int) int { if x < 0 { diff --git a/pkg/game/tile.go b/pkg/game/tile.go index 954f571..f7d7039 100644 --- a/pkg/game/tile.go +++ b/pkg/game/tile.go @@ -7,6 +7,7 @@ const ( TileEmpty = Tile(0) TileRover = Tile(1) + // TODO: Is there even a difference between these two? TileWall = Tile(2) TileRock = Tile(3) ) diff --git a/pkg/game/world.go b/pkg/game/world.go index 7736551..8bd34e6 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -55,6 +55,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { Range: 5.0, // Set the name randomly + // TODO: Fix the stupid "'s" Name: babble.NewBabbler().Babble(), }, } diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 0163a01..b878111 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -21,6 +21,8 @@ type StatusResponse struct { Version string `json:"version"` Tick int `json:"tick"` NextTick string `json:"nexttick,omitempty"` + + // TODO: return more useful info } // ============================== From 175c66cddfe303bee9f8be5af575d37809badf5b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 23:19:57 +0100 Subject: [PATCH 153/495] Remove tests on spawn world for empty tiles --- pkg/game/atlas_test.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index bb7fee5..f0090b1 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -142,18 +142,10 @@ func TestAtlas_SpawnWorld(t *testing.T) { assert.Equal(t, 4, len(a.Chunks)) assert.NoError(t, a.SpawnWorld()) - tile, err := a.GetTile(Vector{0, 0}) - assert.NoError(t, err) - assert.Equal(t, TileEmpty, tile) - - tile, err = a.GetTile(Vector{1, 1}) + tile, err := a.GetTile(Vector{1, 1}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) - tile, err = a.GetTile(Vector{-1, -1}) - assert.NoError(t, err) - assert.Equal(t, TileEmpty, tile) - tile, err = a.GetTile(Vector{-2, -2}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) From 4e6bf385ad37d48479aaabda3bfea5319554eb38 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 7 Jun 2020 23:20:39 +0100 Subject: [PATCH 154/495] Move test into the Makefile --- .github/workflows/docker-image.yml | 2 +- Makefile | 12 +++++++++++- script/test.sh | 18 ------------------ 3 files changed, 12 insertions(+), 20 deletions(-) delete mode 100755 script/test.sh diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 6537271..b3e2434 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -34,7 +34,7 @@ jobs: fi - name: Build and Test - run: ./script/test.sh + run: make test - name: Upload test coverage result uses: actions/upload-artifact@v1 diff --git a/Makefile b/Makefile index aca7d01..2eb2b16 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,16 @@ install: go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... test: - ./script/test.sh + go mod download + go build ./... + + # Run the server and shut it down again to ensure our docker-compose works + ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit + + # Run tests with coverage + go test -v ./... -cover -coverprofile=/tmp/c.out -count 1 + + # Convert the coverage data to html + go tool cover -html=/tmp/c.out -o /tmp/coverage.html .PHONY: install test \ No newline at end of file diff --git a/script/test.sh b/script/test.sh deleted file mode 100755 index 67acbe3..0000000 --- a/script/test.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -e -cd "$(dirname "$0")" -cd .. -set -x - -# Check we can build everything -go mod download -go build ./... - -# Run the server and shut it down again to ensure our docker-compose works -ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit - -# Run tests with coverage -go test -v ./... -cover -coverprofile=/tmp/c.out -count 1 - -# Convert the coverage data to html -go tool cover -html=/tmp/c.out -o /tmp/coverage.html \ No newline at end of file From b0e076ac1ac684a4725a472a575311e65aad7542 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 18:14:24 +0100 Subject: [PATCH 155/495] Refactor radar to return a full set of the tiles within rover range --- cmd/rove/main.go | 12 ++++++-- pkg/game/atlas.go | 14 +++++++-- pkg/game/world.go | 60 +++++++++++++++++++++------------------ pkg/game/world_test.go | 22 ++++++-------- pkg/rove/api.go | 3 +- pkg/server/routes.go | 20 +++++++------ pkg/server/routes_test.go | 20 +------------ 7 files changed, 74 insertions(+), 77 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2fc436a..a727346 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" "io/ioutil" + "math" "os" "path" @@ -173,9 +174,14 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - fmt.Printf("radar blips: %+v\n", response.Blips) - - // TODO: Do some art + // Print the radar + num := int(math.Sqrt(float64(len(response.Tiles)))) + for i := 0; i < num; i++ { + for j := num - 1; j >= 0; j-- { + fmt.Printf("%d", response.Tiles[i+num*j]) + } + fmt.Print("\n") + } } case "rover": diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index ac0b9c5..9d6b166 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -144,9 +144,17 @@ func (a *Atlas) ChunkOrigin(chunk int) Vector { return v.Multiplied(a.ChunkSize) } -// GetWorldExtent gets the extent of the world -func (a *Atlas) GetWorldExtent() int { - return (a.Size / 2) * a.ChunkSize +// GetWorldExtent gets the min and max valid coordinates of world +func (a *Atlas) GetWorldExtents() (min Vector, max Vector) { + min = Vector{ + -(a.Size / 2) * a.ChunkSize, + -(a.Size / 2) * a.ChunkSize, + } + max = Vector{ + -min.X - 1, + -min.Y - 1, + } + return } // Grow will return a grown copy of the current atlas diff --git a/pkg/game/world.go b/pkg/game/world.go index 8bd34e6..454f1ba 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -128,6 +128,7 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { if i, ok := w.Rovers[id]; ok { // Update the world tile // TODO: Make this (and other things) transactional + // TODO: Check this worldtile is free if err := w.Atlas.SetTile(pos, TileRover); err != nil { return fmt.Errorf("coudln't set rover tile: %s", err) } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { @@ -180,52 +181,55 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err } } -// RadarBlip represents a single blip on the radar -type RadarBlip struct { - Position Vector `json:"position"` - Tile Tile `json:"tile"` -} - // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(id uuid.UUID) ([]RadarBlip, error) { +func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() if r, ok := w.Rovers[id]; ok { - var blips []RadarBlip + // The radar should span in range direction on each axis, plus the row/column the rover is currently on + radarSpan := (r.Attributes.Range * 2) + 1 + roverPos := r.Attributes.Pos - extent := w.Atlas.GetWorldExtent() - - // Get min and max extents to query - min := Vector{ - Max(-extent, r.Attributes.Pos.X-r.Attributes.Range), - Max(-extent, r.Attributes.Pos.Y-r.Attributes.Range), + // Get the radar min and max values + radarMin := Vector{ + X: roverPos.X - r.Attributes.Range, + Y: roverPos.Y - r.Attributes.Range, } - max := Vector{ - Min(extent-1, r.Attributes.Pos.X+r.Attributes.Range), - Min(extent-1, r.Attributes.Pos.Y+r.Attributes.Range), + radarMax := Vector{ + X: roverPos.X + r.Attributes.Range, + Y: roverPos.Y + r.Attributes.Range, + } + + // Make sure we only query within the actual world + worldMin, worldMax := w.Atlas.GetWorldExtents() + scanMin := Vector{ + X: Max(radarMin.X, worldMin.X), + Y: Max(radarMin.Y, worldMin.Y), + } + scanMax := Vector{ + X: Min(radarMax.X, worldMax.X), + Y: Min(radarMax.Y, worldMax.Y), } // Gather up all tiles within the range - for i := min.X; i < max.X; i++ { - for j := min.Y; j < max.Y; j++ { - - // Skip this rover + var radar = make([]Tile, radarSpan*radarSpan) + for i := scanMin.X; i < scanMax.X; i++ { + for j := scanMin.Y; j < scanMax.Y; j++ { q := Vector{i, j} - if q == r.Attributes.Pos { - continue - } if tile, err := w.Atlas.GetTile(q); err != nil { - return blips, fmt.Errorf("failed to query tile: %s", err) + return nil, fmt.Errorf("failed to query tile: %s", err) - } else if tile != TileEmpty { - blips = append(blips, RadarBlip{Position: q, Tile: tile}) + } else { + // Get the position relative to the bottom left of the radar + relative := q.Added(radarMin.Negated()) + radar[relative.X+relative.Y*radarSpan] = tile } } } - return blips, nil + return radar, nil } else { return nil, fmt.Errorf("no rover matching id") } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index dc39a24..f1d798e 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -96,30 +96,24 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.NoError(t, err) b, err := world.SpawnRover() assert.NoError(t, err) - c, err := world.SpawnRover() - assert.NoError(t, err) // Get a's attributes attrib, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") - // Warp the rovers so a can see b but not c - bpos := Vector{attrib.Range - 1, 0} - cpos := Vector{attrib.Range + 1, 0} + // Warp the rovers so a can see b + bpos := Vector{-attrib.Range, -attrib.Range} assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") - assert.NoError(t, world.WarpRover(c, cpos), "Failed to warp rover") radar, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") - assert.Equal(t, 1, len(radar), "Radar returned wrong number of rovers") + fullRange := attrib.Range + attrib.Range + 1 + assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong number of rovers") - found := false - for _, blip := range radar { - if blip.Position == bpos && blip.Tile == TileRover { - found = true - } - } - assert.True(t, found, "Rover not found on radar in expected position") + // bottom left should be a rover (we put one there with bpos) + assert.Equal(t, radar[0], TileRover, "Rover not found on radar in expected position") + // Centre should be rover + assert.Equal(t, radar[fullRange*fullRange/2], TileRover, "Rover not found on radar in expected position") } diff --git a/pkg/rove/api.go b/pkg/rove/api.go index b878111..45c6d50 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -107,7 +107,8 @@ type RadarResponse struct { Error string `json:"error,omitempty"` // The set of positions for nearby non-empty tiles - Blips []game.RadarBlip `json:"blips"` + Range int `json:"range"` + Tiles []game.Tile `json:"tiles"` } // ================ diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 29a2bfd..48f8d1d 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -97,12 +97,11 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else { // Save out the new accounts - fmt.Printf("New account registered\tname:%s\tid:%s\n", acc.Name, acc.Id) - response.Id = acc.Id.String() response.Success = true } + fmt.Printf("register response:%+v\n", response) return response, nil } @@ -126,19 +125,18 @@ func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if id, err := uuid.Parse(id); err != nil { response.Error = "Provided account ID was invalid" - } else if attribs, rover, err := s.SpawnRoverForAccount(id); err != nil { + } else if attribs, _, err := s.SpawnRoverForAccount(id); err != nil { response.Error = err.Error() } else if err := s.SaveWorld(); err != nil { response.Error = fmt.Sprintf("Internal server error when saving world: %s", err) } else { - fmt.Printf("New rover spawned\taccount:%s\trover:%s\tattributes:%+v\n", id, rover, attribs) - response.Success = true response.Attributes = attribs } + fmt.Printf("spawn response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } @@ -169,10 +167,10 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { - fmt.Printf("Queued commands\taccount:%s\tcommands:%+v\n", id, data.Commands) response.Success = true } + fmt.Printf("command response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } @@ -192,15 +190,19 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + } else if attrib, err := s.world.RoverAttributes(inst); err != nil { + response.Error = fmt.Sprintf("Error getting rover attributes: %s", err) + } else if radar, err := s.world.RadarFromRover(inst); err != nil { response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - fmt.Printf("Responded with radar\taccount:%s\tradar:%+v\n", id, radar) - response.Blips = radar + response.Tiles = radar + response.Range = attrib.Range response.Success = true } + fmt.Printf("radar response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } @@ -224,10 +226,10 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { - fmt.Printf("Responded with rover\taccount:%s\trover:%+v\n", id, attribs) response.Attributes = attribs response.Success = true } + fmt.Printf("rover response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 4fa85fd..db3e171 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -146,13 +146,6 @@ func TestHandleRadar(t *testing.T) { // Warp this rover to 0 assert.NoError(t, s.world.WarpRover(id, game.Vector{})) - // Spawn another rover - id, err = s.world.SpawnRover() - assert.NoError(t, err) - // Warp this rover to just above the other one - roverPos := game.Vector{X: 0, Y: 1} - assert.NoError(t, s.world.WarpRover(id, roverPos)) - // Set a tile to wall below this rover wallPos := game.Vector{X: 0, Y: -1} assert.NoError(t, s.world.Atlas.SetTile(wallPos, game.TileWall)) @@ -170,18 +163,7 @@ func TestHandleRadar(t *testing.T) { t.Errorf("got false for /radar: %s", status.Error) } - foundWall := false - foundRover := false - for _, b := range status.Blips { - if b.Position == wallPos && b.Tile == game.TileWall { - foundWall = true - } else if b.Position == roverPos && b.Tile == game.TileRover { - foundRover = true - } - } - assert.True(t, foundWall) - assert.True(t, foundRover) - + assert.Equal(t, game.TileRover, status.Tiles[len(status.Tiles)/2]) } func TestHandleRover(t *testing.T) { From fba75960f8c4832259867346e49bcae1e477fae6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 18:14:37 +0100 Subject: [PATCH 156/495] Add a config for launching the rove executable --- .vscode/launch.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5448ce6..d2109b5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,6 +13,16 @@ "cwd": "${workspaceFolder}", "env": {}, "args": [], + }, + { + "name": "Launch Rove", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/rove/main.go", + "cwd": "${workspaceFolder}", + "env": {}, + "args": ["radar"], } ] } \ No newline at end of file From 43588c0e4b8c193b41f07bed9bd2a649064d4ef0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 23:02:09 +0100 Subject: [PATCH 157/495] Fix world spawning and radar Also expand test coverage a little to ensure it's correct --- cmd/rove/main.go | 6 ++--- pkg/game/atlas.go | 19 +++++++++----- pkg/game/atlas_test.go | 32 +++++++++++++++++------ pkg/game/command_test.go | 2 +- pkg/game/world.go | 30 +++++++++++++++++----- pkg/game/world_test.go | 53 ++++++++++++++++++++++++++++----------- pkg/server/routes_test.go | 31 +++++++++++++++++++---- pkg/server/server.go | 2 +- 8 files changed, 130 insertions(+), 45 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index a727346..674428e 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -174,10 +174,10 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) } else { - // Print the radar + // Print out the radar num := int(math.Sqrt(float64(len(response.Tiles)))) - for i := 0; i < num; i++ { - for j := num - 1; j >= 0; j-- { + for j := num - 1; j >= 0; j-- { + for i := 0; i < num; i++ { fmt.Printf("%d", response.Tiles[i+num*j]) } fmt.Print("\n") diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 9d6b166..be2b8fe 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -47,8 +47,8 @@ func NewAtlas(size int, chunkSize int) Atlas { return a } -// SpawnWorld spawns the current world -func (a *Atlas) SpawnWorld() error { +// SpawnRocks peppers the world with rocks +func (a *Atlas) SpawnRocks() error { extent := a.ChunkSize * (a.Size / 2) // Pepper the current world with rocks @@ -62,16 +62,23 @@ func (a *Atlas) SpawnWorld() error { } } + return nil +} + +// SpawnWalls spawns the around the world +func (a *Atlas) SpawnWalls() error { + extent := a.ChunkSize * (a.Size / 2) + // Surround the atlas in walls for i := -extent; i < extent; i++ { - if err := a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { + if err := a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { // N return err - } else if a.SetTile(Vector{extent - 1, i}, TileWall); err != nil { + } else if a.SetTile(Vector{extent - 1, i}, TileWall); err != nil { // E return err - } else if a.SetTile(Vector{-extent, i}, TileWall); err != nil { + } else if a.SetTile(Vector{i, -extent}, TileWall); err != nil { // S return err - } else if a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { + } else if a.SetTile(Vector{-extent, i}, TileWall); err != nil { // W return err } } diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index f0090b1..7256061 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -137,16 +137,32 @@ func TestAtlas_Grown(t *testing.T) { func TestAtlas_SpawnWorld(t *testing.T) { // Start with a small example - a := NewAtlas(2, 2) + a := NewAtlas(2, 4) assert.NotNil(t, a) assert.Equal(t, 4, len(a.Chunks)) + assert.NoError(t, a.SpawnWalls()) - assert.NoError(t, a.SpawnWorld()) - tile, err := a.GetTile(Vector{1, 1}) - assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + for i := -4; i < 4; i++ { + tile, err := a.GetTile(Vector{i, -4}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) + } - tile, err = a.GetTile(Vector{-2, -2}) - assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + for i := -4; i < 4; i++ { + tile, err := a.GetTile(Vector{-4, i}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) + } + + for i := -4; i < 4; i++ { + tile, err := a.GetTile(Vector{3, i}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) + } + + for i := -4; i < 4; i++ { + tile, err := a.GetTile(Vector{i, 3}) + assert.NoError(t, err) + assert.Equal(t, TileWall, tile) + } } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index f221b66..1d823db 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -7,7 +7,7 @@ import ( ) func TestCommand_Move(t *testing.T) { - world := NewWorld() + world := NewWorld(2, 4) a, err := world.SpawnRover() assert.NoError(t, err) pos := Vector{ diff --git a/pkg/game/world.go b/pkg/game/world.go index 454f1ba..909a781 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -28,17 +28,20 @@ type World struct { } // NewWorld creates a new world object -func NewWorld() *World { +func NewWorld(size int, chunkSize int) *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), - Atlas: NewAtlas(4, 8), // TODO: Choose an appropriate world size + Atlas: NewAtlas(size, chunkSize), // TODO: Choose an appropriate world size } } // SpawnWorld spawns a border at the edge of the world atlas func (w *World) SpawnWorld() error { - return w.Atlas.SpawnWorld() + if err := w.Atlas.SpawnRocks(); err != nil { + return err + } + return w.Atlas.SpawnWalls() } // SpawnRover adds an rover to the game @@ -120,6 +123,20 @@ func (w *World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { } } +// SetRoverAttributes sets the attributes of a requested rover +func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + if i, ok := w.Rovers[id]; ok { + i.Attributes = attributes + w.Rovers[id] = i + return nil + } else { + return fmt.Errorf("no rover matching id") + } +} + // WarpRover sets an rovers position func (w *World) WarpRover(id uuid.UUID, pos Vector) error { w.worldMutex.Lock() @@ -214,8 +231,8 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { // Gather up all tiles within the range var radar = make([]Tile, radarSpan*radarSpan) - for i := scanMin.X; i < scanMax.X; i++ { - for j := scanMin.Y; j < scanMax.Y; j++ { + for j := scanMin.Y; j <= scanMax.Y; j++ { + for i := scanMin.X; i <= scanMax.X; i++ { q := Vector{i, j} if tile, err := w.Atlas.GetTile(q); err != nil { @@ -224,7 +241,8 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { } else { // Get the position relative to the bottom left of the radar relative := q.Added(radarMin.Negated()) - radar[relative.X+relative.Y*radarSpan] = tile + index := relative.X + relative.Y*radarSpan + radar[index] = tile } } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index f1d798e..da19b40 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -8,14 +8,14 @@ import ( func TestNewWorld(t *testing.T) { // Very basic for now, nothing to verify - world := NewWorld() + world := NewWorld(4, 4) if world == nil { t.Error("Failed to create world") } } func TestWorld_CreateRover(t *testing.T) { - world := NewWorld() + world := NewWorld(2, 8) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() @@ -30,7 +30,7 @@ func TestWorld_CreateRover(t *testing.T) { } func TestWorld_RoverAttributes(t *testing.T) { - world := NewWorld() + world := NewWorld(2, 4) a, err := world.SpawnRover() assert.NoError(t, err) @@ -41,7 +41,7 @@ func TestWorld_RoverAttributes(t *testing.T) { } func TestWorld_DestroyRover(t *testing.T) { - world := NewWorld() + world := NewWorld(4, 1) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() @@ -59,7 +59,7 @@ func TestWorld_DestroyRover(t *testing.T) { } func TestWorld_GetSetMovePosition(t *testing.T) { - world := NewWorld() + world := NewWorld(4, 4) a, err := world.SpawnRover() assert.NoError(t, err) attribs, err := world.RoverAttributes(a) @@ -91,29 +91,52 @@ func TestWorld_GetSetMovePosition(t *testing.T) { } func TestWorld_RadarFromRover(t *testing.T) { - world := NewWorld() + // Create world that should have visible walls on the radar + world := NewWorld(4, 2) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() assert.NoError(t, err) - // Get a's attributes + // Set the rover range to a predictable value attrib, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") + attrib.Range = 4 // Set the range to 4 so we can predict the radar fully + err = world.SetRoverAttributes(a, attrib) + assert.NoError(t, err, "Failed to set rover attribs") - // Warp the rovers so a can see b - bpos := Vector{-attrib.Range, -attrib.Range} + // Warp the rovers into position + bpos := Vector{-3, -3} assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") + // Spawn the world wall + err = world.Atlas.SpawnWalls() + assert.NoError(t, err) + radar, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") - fullRange := attrib.Range + attrib.Range + 1 - assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong number of rovers") + fullRange := 4 + 4 + 1 + assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong length") - // bottom left should be a rover (we put one there with bpos) - assert.Equal(t, radar[0], TileRover, "Rover not found on radar in expected position") - // Centre should be rover - assert.Equal(t, radar[fullRange*fullRange/2], TileRover, "Rover not found on radar in expected position") + // It should look like: + // --------- + // OOOOOOOO- + // O------O- + // O------O- + // O---R--O- + // O------O- + // O------O- + // OR-----O- + // OOOOOOOO- + // Test all expected values + assert.Equal(t, TileRover, radar[1+fullRange]) + assert.Equal(t, TileRover, radar[4+4*fullRange]) + for i := 0; i < 8; i++ { + assert.Equal(t, TileWall, radar[i]) + assert.Equal(t, TileWall, radar[i+(7*9)]) + assert.Equal(t, TileWall, radar[i*9]) + assert.Equal(t, TileWall, radar[(i*9)+7]) + } } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index db3e171..b933ec0 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -140,15 +140,21 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - _, id, err := s.SpawnRoverForAccount(a.Id) + attrib, id, err := s.SpawnRoverForAccount(a.Id) assert.NoError(t, err) - // Warp this rover to 0 + // Warp this rover to 0,0 assert.NoError(t, s.world.WarpRover(id, game.Vector{})) - // Set a tile to wall below this rover - wallPos := game.Vector{X: 0, Y: -1} - assert.NoError(t, s.world.Atlas.SetTile(wallPos, game.TileWall)) + // Explicity set a few nearby tiles + wallPos1 := game.Vector{X: 0, Y: -1} + wallPos2 := game.Vector{X: 1, Y: 1} + rockPos := game.Vector{X: 1, Y: 3} + emptyPos := game.Vector{X: -2, Y: -3} + assert.NoError(t, s.world.Atlas.SetTile(wallPos1, game.TileWall)) + assert.NoError(t, s.world.Atlas.SetTile(wallPos2, game.TileWall)) + assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) + assert.NoError(t, s.world.Atlas.SetTile(emptyPos, game.TileEmpty)) request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/radar"), nil) response := httptest.NewRecorder() @@ -163,7 +169,22 @@ func TestHandleRadar(t *testing.T) { t.Errorf("got false for /radar: %s", status.Error) } + scope := attrib.Range*2 + 1 + radarOrigin := game.Vector{X: -attrib.Range, Y: -attrib.Range} + + // Make sure the rover tile is correct assert.Equal(t, game.TileRover, status.Tiles[len(status.Tiles)/2]) + + // Check our other tiles + wallPos1.Add(radarOrigin.Negated()) + wallPos2.Add(radarOrigin.Negated()) + rockPos.Add(radarOrigin.Negated()) + emptyPos.Add(radarOrigin.Negated()) + assert.Equal(t, game.TileWall, status.Tiles[wallPos1.X+wallPos1.Y*scope]) + assert.Equal(t, game.TileWall, status.Tiles[wallPos2.X+wallPos2.Y*scope]) + assert.Equal(t, game.TileRock, status.Tiles[rockPos.X+rockPos.Y*scope]) + assert.Equal(t, game.TileEmpty, status.Tiles[emptyPos.X+emptyPos.Y*scope]) + } func TestHandleRover(t *testing.T) { diff --git a/pkg/server/server.go b/pkg/server/server.go index 9ad1c21..206d135 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -98,7 +98,7 @@ func NewServer(opts ...ServerOption) *Server { // Create the accountant s.accountant = accounts.NewAccountant() - s.world = game.NewWorld() + s.world = game.NewWorld(4, 8) // TODO: Configure this return s } From 066df58705eb3fc39e7a46971f4e1b98db0ab990 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 23:37:03 +0100 Subject: [PATCH 158/495] Fix the names including apostrophes --- pkg/game/world.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 909a781..6b88918 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -3,6 +3,7 @@ package game import ( "fmt" "math/rand" + "strings" "sync" "github.com/google/uuid" @@ -58,11 +59,13 @@ func (w *World) SpawnRover() (uuid.UUID, error) { Range: 5.0, // Set the name randomly - // TODO: Fix the stupid "'s" Name: babble.NewBabbler().Babble(), }, } + // Dictionaries tend to include the possesive + strings.ReplaceAll(rover.Attributes.Name, "'s", "") + // Spawn in a random place near the origin rover.Attributes.Pos = Vector{ w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), From de94b39a50f9e20a17de48f72f51710a8f443cae Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 23:39:13 +0100 Subject: [PATCH 159/495] Fix TestCommand_Move instability by increasing the size of the atlas --- pkg/game/command_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 1d823db..303d9dc 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -7,7 +7,7 @@ import ( ) func TestCommand_Move(t *testing.T) { - world := NewWorld(2, 4) + world := NewWorld(2, 8) a, err := world.SpawnRover() assert.NoError(t, err) pos := Vector{ From ae2cb6598aaa80190eabe0256572118db1d8849c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 23:41:33 +0100 Subject: [PATCH 160/495] Fix WarpRover when warping onto itself --- pkg/game/world.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index 6b88918..a0a24b7 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -146,6 +146,11 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { defer w.worldMutex.Unlock() if i, ok := w.Rovers[id]; ok { + // Nothing to do if these positions match + if i.Attributes.Pos == pos { + return nil + } + // Update the world tile // TODO: Make this (and other things) transactional // TODO: Check this worldtile is free From 520f78b5c3239b135cbe71e5ed7521deecc92f9a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 8 Jun 2020 23:46:56 +0100 Subject: [PATCH 161/495] Stop spawning rovers outside the chunks or warping into other rovers --- cmd/rove/main.go | 9 +-------- pkg/game/world.go | 26 +++++++++++++++++++++----- pkg/game/world_test.go | 3 ++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 674428e..5d5100f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -5,7 +5,6 @@ import ( "flag" "fmt" "io/ioutil" - "math" "os" "path" @@ -175,13 +174,7 @@ func InnerMain(command string) error { } else { // Print out the radar - num := int(math.Sqrt(float64(len(response.Tiles)))) - for j := num - 1; j >= 0; j-- { - for i := 0; i < num; i++ { - fmt.Printf("%d", response.Tiles[i+num*j]) - } - fmt.Print("\n") - } + game.PrintTiles(response.Tiles) } case "rover": diff --git a/pkg/game/world.go b/pkg/game/world.go index a0a24b7..a4d1912 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "math" "math/rand" "strings" "sync" @@ -68,8 +69,8 @@ func (w *World) SpawnRover() (uuid.UUID, error) { // Spawn in a random place near the origin rover.Attributes.Pos = Vector{ - w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), - w.Atlas.ChunkSize - (rand.Int() % (w.Atlas.ChunkSize * 2)), + w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), + w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), } // Seach until we error (run out of world) @@ -91,6 +92,8 @@ func (w *World) SpawnRover() (uuid.UUID, error) { return uuid.Nil, err } + fmt.Printf("Spawned rover at %+v\n", rover.Attributes.Pos) + // Append the rover to the list w.Rovers[rover.Id] = rover @@ -152,9 +155,11 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { } // Update the world tile - // TODO: Make this (and other things) transactional - // TODO: Check this worldtile is free - if err := w.Atlas.SetTile(pos, TileRover); err != nil { + if tile, err := w.Atlas.GetTile(pos); err != nil { + return fmt.Errorf("coudln't get state of destination rover tile: %s", err) + } else if tile == TileRover { + return fmt.Errorf("Can't warp rover to occupied tile, check before warping") + } else if err := w.Atlas.SetTile(pos, TileRover); err != nil { return fmt.Errorf("coudln't set rover tile: %s", err) } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) @@ -345,6 +350,17 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err return } +// PrintTiles simply prints the input tiles directly for debug +func PrintTiles(tiles []Tile) { + num := int(math.Sqrt(float64(len(tiles)))) + for j := num - 1; j >= 0; j-- { + for i := 0; i < num; i++ { + fmt.Printf("%d", tiles[i+num*j]) + } + fmt.Print("\n") + } +} + // RLock read locks the world func (w *World) RLock() { w.worldMutex.RLock() diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index da19b40..d478b2c 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -107,8 +107,8 @@ func TestWorld_RadarFromRover(t *testing.T) { // Warp the rovers into position bpos := Vector{-3, -3} - assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") + assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") // Spawn the world wall err = world.Atlas.SpawnWalls() @@ -129,6 +129,7 @@ func TestWorld_RadarFromRover(t *testing.T) { // O------O- // OR-----O- // OOOOOOOO- + PrintTiles(radar) // Test all expected values assert.Equal(t, TileRover, radar[1+fullRange]) From aae668fb57ec3d194b6401a76fcfce6c5658066a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 00:16:49 +0100 Subject: [PATCH 162/495] Fix instabilities caused by random rocks --- cmd/rove-server/api_test.go | 2 +- cmd/rove-server/main.go | 2 +- cmd/rove/main_test.go | 2 +- pkg/game/world.go | 8 +++++--- pkg/server/routes_test.go | 13 +++++++------ pkg/server/server.go | 4 ++-- pkg/server/server_test.go | 4 ++-- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/cmd/rove-server/api_test.go b/cmd/rove-server/api_test.go index 25dbdc9..344cfe4 100644 --- a/cmd/rove-server/api_test.go +++ b/cmd/rove-server/api_test.go @@ -17,7 +17,7 @@ var serv rove.Server func TestMain(m *testing.M) { s := server.NewServer() - if err := s.Initialise(); err != nil { + if err := s.Initialise(true); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 445af36..0cd4232 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -40,7 +40,7 @@ func InnerMain() { server.OptionTick(*tick)) // Initialise the server - if err := s.Initialise(); err != nil { + if err := s.Initialise(true); err != nil { panic(err) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index b47a133..2a48e8c 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -16,7 +16,7 @@ var address string func TestMain(m *testing.M) { s := server.NewServer() - if err := s.Initialise(); err != nil { + if err := s.Initialise(true); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/pkg/game/world.go b/pkg/game/world.go index a4d1912..2d02c52 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -39,9 +39,11 @@ func NewWorld(size int, chunkSize int) *World { } // SpawnWorld spawns a border at the edge of the world atlas -func (w *World) SpawnWorld() error { - if err := w.Atlas.SpawnRocks(); err != nil { - return err +func (w *World) SpawnWorld(fillWorld bool) error { + if fillWorld { + if err := w.Atlas.SpawnRocks(); err != nil { + return err + } } return w.Atlas.SpawnWalls() } diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index b933ec0..ce5cffa 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -19,7 +19,7 @@ func TestHandleStatus(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.Initialise() + s.Initialise(true) s.router.ServeHTTP(response, request) assert.Equal(t, http.StatusOK, response.Code) @@ -46,7 +46,7 @@ func TestHandleRegister(t *testing.T) { response := httptest.NewRecorder() s := NewServer() - s.Initialise() + s.Initialise(true) s.router.ServeHTTP(response, request) assert.Equal(t, http.StatusOK, response.Code) @@ -60,7 +60,7 @@ func TestHandleRegister(t *testing.T) { func TestHandleSpawn(t *testing.T) { s := NewServer() - s.Initialise() + s.Initialise(true) a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") data := rove.SpawnData{} @@ -85,12 +85,13 @@ func TestHandleSpawn(t *testing.T) { func TestHandleCommand(t *testing.T) { s := NewServer() - s.Initialise() + s.Initialise(false) // Leave the world empty with no obstacles a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account _, inst, err := s.SpawnRoverForAccount(a.Id) + assert.NoError(t, s.world.WarpRover(inst, game.Vector{})) attribs, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover position") @@ -135,7 +136,7 @@ func TestHandleCommand(t *testing.T) { func TestHandleRadar(t *testing.T) { s := NewServer() - s.Initialise() + s.Initialise(false) // Spawn a clean world a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") @@ -189,7 +190,7 @@ func TestHandleRadar(t *testing.T) { func TestHandleRover(t *testing.T) { s := NewServer() - s.Initialise() + s.Initialise(true) a, err := s.accountant.RegisterAccount("test") assert.NoError(t, err, "Error registering account") diff --git a/pkg/server/server.go b/pkg/server/server.go index 206d135..ae4dd3b 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -104,13 +104,13 @@ func NewServer(opts ...ServerOption) *Server { } // Initialise sets up internal state ready to serve -func (s *Server) Initialise() (err error) { +func (s *Server) Initialise(fillWorld bool) (err error) { // Add to our sync s.sync.Add(1) // Spawn a border on the default world - if err := s.world.SpawnWorld(); err != nil { + if err := s.world.SpawnWorld(fillWorld); err != nil { return err } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index e4face7..cf07bdc 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -33,7 +33,7 @@ func TestServer_Run(t *testing.T) { server := NewServer() if server == nil { t.Error("Failed to create server") - } else if err := server.Initialise(); err != nil { + } else if err := server.Initialise(true); err != nil { t.Error(err) } @@ -48,7 +48,7 @@ func TestServer_RunPersistentData(t *testing.T) { server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") - } else if err := server.Initialise(); err != nil { + } else if err := server.Initialise(true); err != nil { t.Error(err) } From 51fe918090106de2f55fd653c0a55607104fa9ac Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:08:07 +0100 Subject: [PATCH 163/495] Split out maths functions into maths, vector and bearing --- pkg/bearing/bearing.go | 76 +++++++++ pkg/bearing/bearing_test.go | 32 ++++ pkg/game/atlas.go | 47 +++--- pkg/game/atlas_test.go | 59 +++---- pkg/game/command_test.go | 8 +- pkg/game/math.go | 158 ------------------ pkg/game/rover.go | 7 +- pkg/game/world.go | 37 ++-- pkg/game/world_test.go | 14 +- pkg/maths/maths.go | 41 +++++ pkg/maths/maths_test.go | 33 ++++ pkg/server/routes_test.go | 17 +- pkg/vector/vector.go | 47 ++++++ .../math_test.go => vector/vector_test.go} | 32 +--- 14 files changed, 335 insertions(+), 273 deletions(-) create mode 100644 pkg/bearing/bearing.go create mode 100644 pkg/bearing/bearing_test.go delete mode 100644 pkg/game/math.go create mode 100644 pkg/maths/maths.go create mode 100644 pkg/maths/maths_test.go create mode 100644 pkg/vector/vector.go rename pkg/{game/math_test.go => vector/vector_test.go} (83%) diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go new file mode 100644 index 0000000..90e771d --- /dev/null +++ b/pkg/bearing/bearing.go @@ -0,0 +1,76 @@ +package bearing + +import ( + "fmt" + "strings" + + "github.com/mdiluz/rove/pkg/vector" +) + +// Direction describes a compass direction +type Direction int + +const ( + North Direction = iota + NorthEast + East + SouthEast + South + SouthWest + West + NorthWest +) + +// DirectionString simply describes the strings associated with a direction +type DirectionString struct { + Long string + Short string +} + +// DirectionStrings is the set of strings for each direction +var DirectionStrings = []DirectionString{ + {"North", "N"}, + {"NorthEast", "NE"}, + {"East", "E"}, + {"SouthEast", "SE"}, + {"South", "S"}, + {"SouthWest", "SW"}, + {"West", "W"}, + {"NorthWest", "NW"}, +} + +// String converts a Direction to a String +func (d Direction) String() string { + return DirectionStrings[d].Long +} + +// ShortString converts a Direction to a short string version +func (d Direction) ShortString() string { + return DirectionStrings[d].Short +} + +// DirectionFromString gets the Direction from a string +func DirectionFromString(s string) (Direction, error) { + for i, d := range DirectionStrings { + if strings.ToLower(d.Long) == strings.ToLower(s) || strings.ToLower(d.Short) == strings.ToLower(s) { + return Direction(i), nil + } + } + return -1, fmt.Errorf("Unknown direction: %s", s) +} + +var DirectionVectors = []vector.Vector{ + {X: 0, Y: 1}, // N + {X: 1, Y: 1}, // NE + {X: 1, Y: 0}, // E + {X: 1, Y: -1}, // SE + {X: 0, Y: -1}, // S + {X: -1, Y: 1}, // SW + {X: -1, Y: 0}, // W + {X: -1, Y: 1}, // NW +} + +// Vector converts a Direction to a Vector +func (d Direction) Vector() vector.Vector { + return DirectionVectors[d] +} diff --git a/pkg/bearing/bearing_test.go b/pkg/bearing/bearing_test.go new file mode 100644 index 0000000..d9dc8e9 --- /dev/null +++ b/pkg/bearing/bearing_test.go @@ -0,0 +1,32 @@ +package bearing + +import ( + "testing" + + "github.com/mdiluz/rove/pkg/vector" + "github.com/stretchr/testify/assert" +) + +func TestDirection(t *testing.T) { + dir := North + + assert.Equal(t, "North", dir.String()) + assert.Equal(t, "N", dir.ShortString()) + assert.Equal(t, vector.Vector{X: 0, Y: 1}, dir.Vector()) + + dir, err := DirectionFromString("N") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("n") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("north") + assert.NoError(t, err) + assert.Equal(t, North, dir) + + dir, err = DirectionFromString("NorthWest") + assert.NoError(t, err) + assert.Equal(t, NorthWest, dir) +} diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index be2b8fe..7e0c855 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -4,6 +4,9 @@ import ( "fmt" "log" "math/rand" + + "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/vector" ) // Chunk represents a fixed square grid of tiles @@ -55,7 +58,7 @@ func (a *Atlas) SpawnRocks() error { for i := -extent; i < extent; i++ { for j := -extent; j < extent; j++ { if rand.Intn(16) == 0 { - if err := a.SetTile(Vector{i, j}, TileRock); err != nil { + if err := a.SetTile(vector.Vector{X: i, Y: j}, TileRock); err != nil { return err } } @@ -72,13 +75,13 @@ func (a *Atlas) SpawnWalls() error { // Surround the atlas in walls for i := -extent; i < extent; i++ { - if err := a.SetTile(Vector{i, extent - 1}, TileWall); err != nil { // N + if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileWall); err != nil { // N return err - } else if a.SetTile(Vector{extent - 1, i}, TileWall); err != nil { // E + } else if a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileWall); err != nil { // E return err - } else if a.SetTile(Vector{i, -extent}, TileWall); err != nil { // S + } else if a.SetTile(vector.Vector{X: i, Y: -extent}, TileWall); err != nil { // S return err - } else if a.SetTile(Vector{-extent, i}, TileWall); err != nil { // W + } else if a.SetTile(vector.Vector{X: -extent, Y: i}, TileWall); err != nil { // W return err } } @@ -87,7 +90,7 @@ func (a *Atlas) SpawnWalls() error { } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v Vector, tile Tile) error { +func (a *Atlas) SetTile(v vector.Vector, tile Tile) error { chunk := a.ToChunk(v) if chunk >= len(a.Chunks) { return fmt.Errorf("location outside of allocated atlas") @@ -103,7 +106,7 @@ func (a *Atlas) SetTile(v Vector, tile Tile) error { } // GetTile will return an individual tile -func (a *Atlas) GetTile(v Vector) (Tile, error) { +func (a *Atlas) GetTile(v vector.Vector) (Tile, error) { chunk := a.ToChunk(v) if chunk >= len(a.Chunks) { return 0, fmt.Errorf("location outside of allocated atlas") @@ -119,32 +122,32 @@ func (a *Atlas) GetTile(v Vector) (Tile, error) { } // ToChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) ToChunkLocal(v Vector) Vector { - return Vector{Pmod(v.X, a.ChunkSize), Pmod(v.Y, a.ChunkSize)} +func (a *Atlas) ToChunkLocal(v vector.Vector) vector.Vector { + return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } // GetChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) ToWorld(local Vector, chunk int) Vector { +func (a *Atlas) ToWorld(local vector.Vector, chunk int) vector.Vector { return a.ChunkOrigin(chunk).Added(local) } // GetChunkID gets the chunk ID for a position in the world -func (a *Atlas) ToChunk(v Vector) int { +func (a *Atlas) ToChunk(v vector.Vector) int { local := a.ToChunkLocal(v) // Get the chunk origin itself origin := v.Added(local.Negated()) // Divided it by the number of chunks origin = origin.Divided(a.ChunkSize) // Shift it by our size (our origin is in the middle) - origin = origin.Added(Vector{a.Size / 2, a.Size / 2}) + origin = origin.Added(vector.Vector{X: a.Size / 2, Y: a.Size / 2}) // Get the ID based on the final values return (a.Size * origin.Y) + origin.X } // ChunkOrigin gets the chunk origin for a given chunk index -func (a *Atlas) ChunkOrigin(chunk int) Vector { - v := Vector{ - X: Pmod(chunk, a.Size) - (a.Size / 2), +func (a *Atlas) ChunkOrigin(chunk int) vector.Vector { + v := vector.Vector{ + X: maths.Pmod(chunk, a.Size) - (a.Size / 2), Y: (chunk / a.Size) - (a.Size / 2), } @@ -152,14 +155,14 @@ func (a *Atlas) ChunkOrigin(chunk int) Vector { } // GetWorldExtent gets the min and max valid coordinates of world -func (a *Atlas) GetWorldExtents() (min Vector, max Vector) { - min = Vector{ - -(a.Size / 2) * a.ChunkSize, - -(a.Size / 2) * a.ChunkSize, +func (a *Atlas) GetWorldExtents() (min vector.Vector, max vector.Vector) { + min = vector.Vector{ + X: -(a.Size / 2) * a.ChunkSize, + Y: -(a.Size / 2) * a.ChunkSize, } - max = Vector{ - -min.X - 1, - -min.Y - 1, + max = vector.Vector{ + X: -min.X - 1, + Y: -min.Y - 1, } return } diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index 7256061..7ee1034 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -3,6 +3,7 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -28,13 +29,13 @@ func TestAtlas_ToChunk(t *testing.T) { // Tiles should look like: 2 | 3 // ----- // 0 | 1 - tile := a.ToChunk(Vector{0, 0}) + tile := a.ToChunk(vector.Vector{X: 0, Y: 0}) assert.Equal(t, 3, tile) - tile = a.ToChunk(Vector{0, -1}) + tile = a.ToChunk(vector.Vector{X: 0, Y: -1}) assert.Equal(t, 1, tile) - tile = a.ToChunk(Vector{-1, -1}) + tile = a.ToChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 0, tile) - tile = a.ToChunk(Vector{-1, 0}) + tile = a.ToChunk(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, tile) a = NewAtlas(2, 2) @@ -43,13 +44,13 @@ func TestAtlas_ToChunk(t *testing.T) { // 2 | 3 // ----- // 0 | 1 - tile = a.ToChunk(Vector{1, 1}) + tile = a.ToChunk(vector.Vector{X: 1, Y: 1}) assert.Equal(t, 3, tile) - tile = a.ToChunk(Vector{1, -2}) + tile = a.ToChunk(vector.Vector{X: 1, Y: -2}) assert.Equal(t, 1, tile) - tile = a.ToChunk(Vector{-2, -2}) + tile = a.ToChunk(vector.Vector{X: -2, Y: -2}) assert.Equal(t, 0, tile) - tile = a.ToChunk(Vector{-2, 1}) + tile = a.ToChunk(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, tile) a = NewAtlas(4, 2) @@ -62,13 +63,13 @@ func TestAtlas_ToChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - tile = a.ToChunk(Vector{1, 3}) + tile = a.ToChunk(vector.Vector{X: 1, Y: 3}) assert.Equal(t, 14, tile) - tile = a.ToChunk(Vector{1, -3}) + tile = a.ToChunk(vector.Vector{X: 1, Y: -3}) assert.Equal(t, 2, tile) - tile = a.ToChunk(Vector{-1, -1}) + tile = a.ToChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 5, tile) - tile = a.ToChunk(Vector{-2, 2}) + tile = a.ToChunk(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, tile) } @@ -77,14 +78,14 @@ func TestAtlas_GetSetTile(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - assert.NoError(t, a.SetTile(Vector{0, 0}, 1)) - tile, err := a.GetTile(Vector{0, 0}) + assert.NoError(t, a.SetTile(vector.Vector{X: 0, Y: 0}, 1)) + tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) assert.Equal(t, Tile(1), tile) // Set another tile to 1 and test it - assert.NoError(t, a.SetTile(Vector{5, -2}, 2)) - tile, err = a.GetTile(Vector{5, -2}) + assert.NoError(t, a.SetTile(vector.Vector{X: 5, Y: -2}, 2)) + tile, err = a.GetTile(vector.Vector{X: 5, Y: -2}) assert.NoError(t, err) assert.Equal(t, Tile(2), tile) } @@ -96,24 +97,24 @@ func TestAtlas_Grown(t *testing.T) { assert.Equal(t, 4, len(a.Chunks)) // Set a few tiles to values - assert.NoError(t, a.SetTile(Vector{0, 0}, 1)) - assert.NoError(t, a.SetTile(Vector{-1, -1}, 2)) - assert.NoError(t, a.SetTile(Vector{1, -2}, 3)) + assert.NoError(t, a.SetTile(vector.Vector{X: 0, Y: 0}, 1)) + assert.NoError(t, a.SetTile(vector.Vector{X: -1, Y: -1}, 2)) + assert.NoError(t, a.SetTile(vector.Vector{X: 1, Y: -2}, 3)) // Grow once to just double it err := a.Grow(4) assert.NoError(t, err) assert.Equal(t, 16, len(a.Chunks)) - tile, err := a.GetTile(Vector{0, 0}) + tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) assert.Equal(t, Tile(1), tile) - tile, err = a.GetTile(Vector{-1, -1}) + tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.NoError(t, err) assert.Equal(t, Tile(2), tile) - tile, err = a.GetTile(Vector{1, -2}) + tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.NoError(t, err) assert.Equal(t, Tile(3), tile) @@ -122,15 +123,15 @@ func TestAtlas_Grown(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 100, len(a.Chunks)) - tile, err = a.GetTile(Vector{0, 0}) + tile, err = a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) assert.Equal(t, Tile(1), tile) - tile, err = a.GetTile(Vector{-1, -1}) + tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.NoError(t, err) assert.Equal(t, Tile(2), tile) - tile, err = a.GetTile(Vector{1, -2}) + tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.NoError(t, err) assert.Equal(t, Tile(3), tile) } @@ -143,25 +144,25 @@ func TestAtlas_SpawnWorld(t *testing.T) { assert.NoError(t, a.SpawnWalls()) for i := -4; i < 4; i++ { - tile, err := a.GetTile(Vector{i, -4}) + tile, err := a.GetTile(vector.Vector{X: i, Y: -4}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) } for i := -4; i < 4; i++ { - tile, err := a.GetTile(Vector{-4, i}) + tile, err := a.GetTile(vector.Vector{X: -4, Y: i}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) } for i := -4; i < 4; i++ { - tile, err := a.GetTile(Vector{3, i}) + tile, err := a.GetTile(vector.Vector{X: 3, Y: i}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) } for i := -4; i < 4; i++ { - tile, err := a.GetTile(Vector{i, 3}) + tile, err := a.GetTile(vector.Vector{X: i, Y: 3}) assert.NoError(t, err) assert.Equal(t, TileWall, tile) } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 303d9dc..ebc528c 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -3,6 +3,8 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -10,7 +12,7 @@ func TestCommand_Move(t *testing.T) { world := NewWorld(2, 8) a, err := world.SpawnRover() assert.NoError(t, err) - pos := Vector{ + pos := vector.Vector{ X: 1.0, Y: 2.0, } @@ -21,7 +23,7 @@ func TestCommand_Move(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - bearing := North + bearing := bearing.North duration := 1 // Try the move command moveCommand := Command{Command: CommandMove, Bearing: bearing.String(), Duration: duration} @@ -32,6 +34,6 @@ func TestCommand_Move(t *testing.T) { newatributes, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(Vector{0.0, duration * attribs.Speed}) // We should have moved duration*speed north + pos.Add(vector.Vector{X: 0.0, Y: duration * attribs.Speed}) // We should have moved duration*speed north assert.Equal(t, pos, newatributes.Pos, "Failed to correctly set position for rover") } diff --git a/pkg/game/math.go b/pkg/game/math.go deleted file mode 100644 index 059e4ad..0000000 --- a/pkg/game/math.go +++ /dev/null @@ -1,158 +0,0 @@ -package game - -import ( - "fmt" - "math" - "strings" -) - -// TODO: Pull this out into math package and get more test coverage - -// Abs gets the absolute value of an int -func Abs(x int) int { - if x < 0 { - return -x - } - return x -} - -// pmod is a mositive modulo -// golang's % is a "remainder" function si misbehaves for negative modulus inputs -func Pmod(x, d int) int { - x = x % d - if x >= 0 { - return x - } else if d < 0 { - return x - d - } else { - return x + d - } -} - -// Max returns the highest int -func Max(x int, y int) int { - if x < y { - return y - } - return x -} - -// Min returns the lowest int -func Min(x int, y int) int { - if x > y { - return y - } - return x -} - -// Vector desribes a 3D vector -type Vector struct { - X int `json:"x"` - Y int `json:"y"` -} - -// Add adds one vector to another -func (v *Vector) Add(v2 Vector) { - v.X += v2.X - v.Y += v2.Y -} - -// Added calculates a new vector -func (v Vector) Added(v2 Vector) Vector { - v.Add(v2) - return v -} - -// Negated returns a negated vector -func (v Vector) Negated() Vector { - return Vector{-v.X, -v.Y} -} - -// Length returns the length of the vector -func (v Vector) Length() float64 { - return math.Sqrt(float64(v.X*v.X + v.Y*v.Y)) -} - -// Distance returns the distance between two vectors -func (v Vector) Distance(v2 Vector) float64 { - // Negate the two vectors and calciate the length - return v.Added(v2.Negated()).Length() -} - -// Multiplied returns the vector multiplied by an int -func (v Vector) Multiplied(val int) Vector { - return Vector{v.X * val, v.Y * val} -} - -// Divided returns the vector divided by an int -func (v Vector) Divided(val int) Vector { - return Vector{v.X / val, v.Y / val} -} - -// Direction describes a compass direction -type Direction int - -const ( - North Direction = iota - NorthEast - East - SouthEast - South - SouthWest - West - NorthWest -) - -// DirectionString simply describes the strings associated with a direction -type DirectionString struct { - Long string - Short string -} - -// DirectionStrings is the set of strings for each direction -var DirectionStrings = []DirectionString{ - {"North", "N"}, - {"NorthEast", "NE"}, - {"East", "E"}, - {"SouthEast", "SE"}, - {"South", "S"}, - {"SouthWest", "SW"}, - {"West", "W"}, - {"NorthWest", "NW"}, -} - -// String converts a Direction to a String -func (d Direction) String() string { - return DirectionStrings[d].Long -} - -// ShortString converts a Direction to a short string version -func (d Direction) ShortString() string { - return DirectionStrings[d].Short -} - -// DirectionFromString gets the Direction from a string -func DirectionFromString(s string) (Direction, error) { - for i, d := range DirectionStrings { - if strings.ToLower(d.Long) == strings.ToLower(s) || strings.ToLower(d.Short) == strings.ToLower(s) { - return Direction(i), nil - } - } - return -1, fmt.Errorf("Unknown direction: %s", s) -} - -var DirectionVectors = []Vector{ - {0, 1}, // N - {1, 1}, // NE - {1, 0}, // E - {1, -1}, // SE - {0, -1}, // S - {-1, 1}, // SW - {-1, 0}, // W - {-1, 1}, // NW -} - -// Vector converts a Direction to a Vector -func (d Direction) Vector() Vector { - return DirectionVectors[d] -} diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 3952774..53ba7ff 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -1,6 +1,9 @@ package game -import "github.com/google/uuid" +import ( + "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/vector" +) // RoverAttributes contains attributes of a rover type RoverAttributes struct { @@ -14,7 +17,7 @@ type RoverAttributes struct { Name string `json:"name"` // Pos represents where this rover is in the world - Pos Vector `json:"pos"` + Pos vector.Vector `json:"pos"` } // Rover describes a single rover in the world diff --git a/pkg/game/world.go b/pkg/game/world.go index 2d02c52..466c895 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -8,6 +8,9 @@ import ( "sync" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/vector" "github.com/tjarratt/babble" ) @@ -70,9 +73,9 @@ func (w *World) SpawnRover() (uuid.UUID, error) { strings.ReplaceAll(rover.Attributes.Name, "'s", "") // Spawn in a random place near the origin - rover.Attributes.Pos = Vector{ - w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), - w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), + rover.Attributes.Pos = vector.Vector{ + X: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), + Y: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), } // Seach until we error (run out of world) @@ -84,7 +87,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { break } else { // Try and spawn to the east of the blockage - rover.Attributes.Pos.Add(Vector{1, 0}) + rover.Attributes.Pos.Add(vector.Vector{X: 1, Y: 0}) } } } @@ -146,7 +149,7 @@ func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) err } // WarpRover sets an rovers position -func (w *World) WarpRover(id uuid.UUID, pos Vector) error { +func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -176,7 +179,7 @@ func (w *World) WarpRover(id uuid.UUID, pos Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, error) { +func (w *World) MoveRover(id uuid.UUID, bearing bearing.Direction) (RoverAttributes, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -224,31 +227,31 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { roverPos := r.Attributes.Pos // Get the radar min and max values - radarMin := Vector{ + radarMin := vector.Vector{ X: roverPos.X - r.Attributes.Range, Y: roverPos.Y - r.Attributes.Range, } - radarMax := Vector{ + radarMax := vector.Vector{ X: roverPos.X + r.Attributes.Range, Y: roverPos.Y + r.Attributes.Range, } // Make sure we only query within the actual world worldMin, worldMax := w.Atlas.GetWorldExtents() - scanMin := Vector{ - X: Max(radarMin.X, worldMin.X), - Y: Max(radarMin.Y, worldMin.Y), + scanMin := vector.Vector{ + X: maths.Max(radarMin.X, worldMin.X), + Y: maths.Max(radarMin.Y, worldMin.Y), } - scanMax := Vector{ - X: Min(radarMax.X, worldMax.X), - Y: Min(radarMax.Y, worldMax.Y), + scanMax := vector.Vector{ + X: maths.Min(radarMax.X, worldMax.X), + Y: maths.Min(radarMax.Y, worldMax.Y), } // Gather up all tiles within the range var radar = make([]Tile, radarSpan*radarSpan) for j := scanMin.Y; j <= scanMax.Y; j++ { for i := scanMin.X; i <= scanMax.X; i++ { - q := Vector{i, j} + q := vector.Vector{X: i, Y: j} if tile, err := w.Atlas.GetTile(q); err != nil { return nil, fmt.Errorf("failed to query tile: %s", err) @@ -275,7 +278,7 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { for _, c := range commands { switch c.Command { case "move": - if _, err := DirectionFromString(c.Bearing); err != nil { + if _, err := bearing.DirectionFromString(c.Bearing); err != nil { return fmt.Errorf("unknown direction: %s", c.Bearing) } default: @@ -330,7 +333,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err switch c.Command { case "move": - if dir, err := DirectionFromString(c.Bearing); err != nil { + if dir, err := bearing.DirectionFromString(c.Bearing); err != nil { return true, fmt.Errorf("unknown direction in command %+v, skipping: %s\n", c, err) } else if _, err := w.MoveRover(rover, dir); err != nil { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index d478b2c..1b6f1b6 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,6 +3,8 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -65,7 +67,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { attribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") - pos := Vector{ + pos := vector.Vector{ X: 0.0, Y: 0.0, } @@ -77,15 +79,15 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly set position for rover") - bearing := North + bearing := bearing.North duration := 1 newAttribs, err = world.MoveRover(a, bearing) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north + pos.Add(vector.Vector{X: 0, Y: attribs.Speed * duration}) // We should have move one unit of the speed north assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(Vector{0, 2}, TileWall)) + assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, TileWall)) newAttribs, err = world.MoveRover(a, bearing) assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") } @@ -106,9 +108,9 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.NoError(t, err, "Failed to set rover attribs") // Warp the rovers into position - bpos := Vector{-3, -3} + bpos := vector.Vector{X: -3, Y: -3} assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") - assert.NoError(t, world.WarpRover(a, Vector{0, 0}), "Failed to warp rover") + assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0}), "Failed to warp rover") // Spawn the world wall err = world.Atlas.SpawnWalls() diff --git a/pkg/maths/maths.go b/pkg/maths/maths.go new file mode 100644 index 0000000..a3411b9 --- /dev/null +++ b/pkg/maths/maths.go @@ -0,0 +1,41 @@ +package maths + +// Abs gets the absolute value of an int +func Abs(x int) int { + if x < 0 { + return -x + } + return x +} + +// pmod is a mositive modulo +// golang's % is a "remainder" function si misbehaves for negative modulus inputs +func Pmod(x, d int) int { + if x == 0 || d == 0 { + return 0 + } + x = x % d + if x >= 0 { + return x + } else if d < 0 { + return x - d + } else { + return x + d + } +} + +// Max returns the highest int +func Max(x int, y int) int { + if x < y { + return y + } + return x +} + +// Min returns the lowest int +func Min(x int, y int) int { + if x > y { + return y + } + return x +} diff --git a/pkg/maths/maths_test.go b/pkg/maths/maths_test.go new file mode 100644 index 0000000..cf2c180 --- /dev/null +++ b/pkg/maths/maths_test.go @@ -0,0 +1,33 @@ +package maths + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAbs(t *testing.T) { + assert.Equal(t, 0, Abs(0)) + assert.Equal(t, 1, Abs(1)) + assert.Equal(t, 1, Abs(-1)) +} + +func TestPmod(t *testing.T) { + assert.Equal(t, 0, Pmod(0, 0)) + assert.Equal(t, 2, Pmod(6, 4)) + assert.Equal(t, 2, Pmod(-6, 4)) + assert.Equal(t, 4, Pmod(-6, 10)) +} + +func TestMax(t *testing.T) { + assert.Equal(t, 500, Max(100, 500)) + assert.Equal(t, 1, Max(-4, 1)) + assert.Equal(t, -2, Max(-4, -2)) +} + +func TestMin(t *testing.T) { + assert.Equal(t, 100, Min(100, 500)) + assert.Equal(t, -4, Min(-4, 1)) + assert.Equal(t, -4, Min(-4, -2)) + +} diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index ce5cffa..46776d2 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -10,6 +10,7 @@ import ( "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -91,7 +92,7 @@ func TestHandleCommand(t *testing.T) { // Spawn the rover rover for the account _, inst, err := s.SpawnRoverForAccount(a.Id) - assert.NoError(t, s.world.WarpRover(inst, game.Vector{})) + assert.NoError(t, s.world.WarpRover(inst, vector.Vector{})) attribs, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover position") @@ -130,7 +131,7 @@ func TestHandleCommand(t *testing.T) { attribs2, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover position") - attribs.Pos.Add(game.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration + attribs.Pos.Add(vector.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration assert.Equal(t, attribs.Pos, attribs2.Pos, "Rover should have moved by bearing") } @@ -145,13 +146,13 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, err) // Warp this rover to 0,0 - assert.NoError(t, s.world.WarpRover(id, game.Vector{})) + assert.NoError(t, s.world.WarpRover(id, vector.Vector{})) // Explicity set a few nearby tiles - wallPos1 := game.Vector{X: 0, Y: -1} - wallPos2 := game.Vector{X: 1, Y: 1} - rockPos := game.Vector{X: 1, Y: 3} - emptyPos := game.Vector{X: -2, Y: -3} + wallPos1 := vector.Vector{X: 0, Y: -1} + wallPos2 := vector.Vector{X: 1, Y: 1} + rockPos := vector.Vector{X: 1, Y: 3} + emptyPos := vector.Vector{X: -2, Y: -3} assert.NoError(t, s.world.Atlas.SetTile(wallPos1, game.TileWall)) assert.NoError(t, s.world.Atlas.SetTile(wallPos2, game.TileWall)) assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) @@ -171,7 +172,7 @@ func TestHandleRadar(t *testing.T) { } scope := attrib.Range*2 + 1 - radarOrigin := game.Vector{X: -attrib.Range, Y: -attrib.Range} + radarOrigin := vector.Vector{X: -attrib.Range, Y: -attrib.Range} // Make sure the rover tile is correct assert.Equal(t, game.TileRover, status.Tiles[len(status.Tiles)/2]) diff --git a/pkg/vector/vector.go b/pkg/vector/vector.go new file mode 100644 index 0000000..f6c8215 --- /dev/null +++ b/pkg/vector/vector.go @@ -0,0 +1,47 @@ +package vector + +import "math" + +// Vector desribes a 3D vector +type Vector struct { + X int `json:"x"` + Y int `json:"y"` +} + +// Add adds one vector to another +func (v *Vector) Add(v2 Vector) { + v.X += v2.X + v.Y += v2.Y +} + +// Added calculates a new vector +func (v Vector) Added(v2 Vector) Vector { + v.Add(v2) + return v +} + +// Negated returns a negated vector +func (v Vector) Negated() Vector { + return Vector{-v.X, -v.Y} +} + +// Length returns the length of the vector +func (v Vector) Length() float64 { + return math.Sqrt(float64(v.X*v.X + v.Y*v.Y)) +} + +// Distance returns the distance between two vectors +func (v Vector) Distance(v2 Vector) float64 { + // Negate the two vectors and calciate the length + return v.Added(v2.Negated()).Length() +} + +// Multiplied returns the vector multiplied by an int +func (v Vector) Multiplied(val int) Vector { + return Vector{v.X * val, v.Y * val} +} + +// Divided returns the vector divided by an int +func (v Vector) Divided(val int) Vector { + return Vector{v.X / val, v.Y / val} +} diff --git a/pkg/game/math_test.go b/pkg/vector/vector_test.go similarity index 83% rename from pkg/game/math_test.go rename to pkg/vector/vector_test.go index 440dd23..5d92136 100644 --- a/pkg/game/math_test.go +++ b/pkg/vector/vector_test.go @@ -1,4 +1,4 @@ -package game +package vector import ( "math" @@ -180,15 +180,15 @@ func TestVector_Multiplied(t *testing.T) { }{ { name: "Basic multiply 1", - vec: North.Vector(), + vec: Vector{0, 1}, arg: 2, want: Vector{0, 2}, }, { name: "Basic multiply 2", - vec: NorthWest.Vector(), + vec: Vector{-1, 1}, arg: -1, - want: SouthEast.Vector(), + want: Vector{1, -1}, }, } for _, tt := range tests { @@ -203,27 +203,3 @@ func TestVector_Multiplied(t *testing.T) { }) } } - -func TestDirection(t *testing.T) { - dir := North - - assert.Equal(t, "North", dir.String()) - assert.Equal(t, "N", dir.ShortString()) - assert.Equal(t, Vector{0, 1}, dir.Vector()) - - dir, err := DirectionFromString("N") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = DirectionFromString("n") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = DirectionFromString("north") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = DirectionFromString("NorthWest") - assert.NoError(t, err) - assert.Equal(t, NorthWest, dir) -} From 4558e8a9b04f001d616907ffec5096ff0a5fba69 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:09:51 +0100 Subject: [PATCH 164/495] Rename Direction -> Bearing --- pkg/bearing/bearing.go | 36 ++++++++++++++++++------------------ pkg/bearing/bearing_test.go | 8 ++++---- pkg/game/world.go | 6 +++--- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 90e771d..5d17858 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -7,11 +7,11 @@ import ( "github.com/mdiluz/rove/pkg/vector" ) -// Direction describes a compass direction -type Direction int +// Bearing describes a compass direction +type Bearing int const ( - North Direction = iota + North Bearing = iota NorthEast East SouthEast @@ -21,14 +21,14 @@ const ( NorthWest ) -// DirectionString simply describes the strings associated with a direction -type DirectionString struct { +// bearingString simply describes the strings associated with a direction +type bearingString struct { Long string Short string } -// DirectionStrings is the set of strings for each direction -var DirectionStrings = []DirectionString{ +// bearingStrings is the set of strings for each direction +var bearingStrings = []bearingString{ {"North", "N"}, {"NorthEast", "NE"}, {"East", "E"}, @@ -40,26 +40,26 @@ var DirectionStrings = []DirectionString{ } // String converts a Direction to a String -func (d Direction) String() string { - return DirectionStrings[d].Long +func (d Bearing) String() string { + return bearingStrings[d].Long } // ShortString converts a Direction to a short string version -func (d Direction) ShortString() string { - return DirectionStrings[d].Short +func (d Bearing) ShortString() string { + return bearingStrings[d].Short } -// DirectionFromString gets the Direction from a string -func DirectionFromString(s string) (Direction, error) { - for i, d := range DirectionStrings { +// FromString gets the Direction from a string +func FromString(s string) (Bearing, error) { + for i, d := range bearingStrings { if strings.ToLower(d.Long) == strings.ToLower(s) || strings.ToLower(d.Short) == strings.ToLower(s) { - return Direction(i), nil + return Bearing(i), nil } } return -1, fmt.Errorf("Unknown direction: %s", s) } -var DirectionVectors = []vector.Vector{ +var bearingVectors = []vector.Vector{ {X: 0, Y: 1}, // N {X: 1, Y: 1}, // NE {X: 1, Y: 0}, // E @@ -71,6 +71,6 @@ var DirectionVectors = []vector.Vector{ } // Vector converts a Direction to a Vector -func (d Direction) Vector() vector.Vector { - return DirectionVectors[d] +func (d Bearing) Vector() vector.Vector { + return bearingVectors[d] } diff --git a/pkg/bearing/bearing_test.go b/pkg/bearing/bearing_test.go index d9dc8e9..1232239 100644 --- a/pkg/bearing/bearing_test.go +++ b/pkg/bearing/bearing_test.go @@ -14,19 +14,19 @@ func TestDirection(t *testing.T) { assert.Equal(t, "N", dir.ShortString()) assert.Equal(t, vector.Vector{X: 0, Y: 1}, dir.Vector()) - dir, err := DirectionFromString("N") + dir, err := FromString("N") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = DirectionFromString("n") + dir, err = FromString("n") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = DirectionFromString("north") + dir, err = FromString("north") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = DirectionFromString("NorthWest") + dir, err = FromString("NorthWest") assert.NoError(t, err) assert.Equal(t, NorthWest, dir) } diff --git a/pkg/game/world.go b/pkg/game/world.go index 466c895..52ca6a8 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -179,7 +179,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing bearing.Direction) (RoverAttributes, error) { +func (w *World) MoveRover(id uuid.UUID, bearing bearing.Bearing) (RoverAttributes, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -278,7 +278,7 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { for _, c := range commands { switch c.Command { case "move": - if _, err := bearing.DirectionFromString(c.Bearing); err != nil { + if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown direction: %s", c.Bearing) } default: @@ -333,7 +333,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err switch c.Command { case "move": - if dir, err := bearing.DirectionFromString(c.Bearing); err != nil { + if dir, err := bearing.FromString(c.Bearing); err != nil { return true, fmt.Errorf("unknown direction in command %+v, skipping: %s\n", c, err) } else if _, err := w.MoveRover(rover, dir); err != nil { From 339163e06d8a74a8daca8175384a1942b1154e59 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:32:44 +0100 Subject: [PATCH 165/495] Fix command line arg order --- cmd/rove/main.go | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 5d5100f..391d478 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -16,17 +16,16 @@ import ( var USAGE = "" // Command usage -// TODO: Allow COMMAND to be used first func Usage() { - fmt.Printf("Usage: %s [OPTIONS]... COMMAND\n", os.Args[0]) - fmt.Println("\nCommands:") - fmt.Println("\tstatus \tprints the server status") - fmt.Println("\tregister\tregisters an account and stores it (use with -name)") - fmt.Println("\tspawn \tspawns a rover for the current account") - fmt.Println("\tmove \tissues move command to rover") - fmt.Println("\tradar \tgathers radar data for the current rover") - fmt.Println("\trover \tgets data for current rover") - fmt.Println("\nOptions:") + fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [OPTIONS]...\n", os.Args[0]) + fmt.Fprintln(os.Stderr, "\nCommands:") + fmt.Fprintln(os.Stderr, "\tstatus \tprints the server status") + fmt.Fprintln(os.Stderr, "\tregister\tregisters an account and stores it (use with -name)") + fmt.Fprintln(os.Stderr, "\tspawn \tspawns a rover for the current account") + fmt.Fprintln(os.Stderr, "\tmove \tissues move command to rover") + fmt.Fprintln(os.Stderr, "\tradar \tgathers radar data for the current rover") + fmt.Fprintln(os.Stderr, "\trover \tgets data for current rover") + fmt.Fprintln(os.Stderr, "\nOptions:") flag.PrintDefaults() } @@ -191,7 +190,9 @@ func InnerMain(command string) error { } default: - return fmt.Errorf("Unknown command: %s", command) + // Print the usage + fmt.Fprintf(os.Stderr, "Unknown command: %s\n", command) + Usage() } // Save out the persistent file @@ -209,7 +210,7 @@ func InnerMain(command string) error { // Simple main func main() { flag.Usage = Usage - flag.Parse() + flag.CommandLine.Parse(os.Args[2:]) // Print the version if requested if *ver { @@ -217,15 +218,8 @@ func main() { return } - // Verify we have a single command line arg - args := flag.Args() - if len(args) != 1 { - Usage() - os.Exit(1) - } - // Run the inner main - if err := InnerMain(args[0]); err != nil { + if err := InnerMain(os.Args[1]); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) os.Exit(1) } From a784b06c2a93450f7e9c3f7fea2fb9409c11b1a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:33:05 +0100 Subject: [PATCH 166/495] Fix error messages that still talk about direction --- pkg/bearing/bearing.go | 2 +- pkg/game/world.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 5d17858..776255d 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -56,7 +56,7 @@ func FromString(s string) (Bearing, error) { return Bearing(i), nil } } - return -1, fmt.Errorf("Unknown direction: %s", s) + return -1, fmt.Errorf("Unknown bearing: %s", s) } var bearingVectors = []vector.Vector{ diff --git a/pkg/game/world.go b/pkg/game/world.go index 52ca6a8..8a7a2a1 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -279,7 +279,7 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { switch c.Command { case "move": if _, err := bearing.FromString(c.Bearing); err != nil { - return fmt.Errorf("unknown direction: %s", c.Bearing) + return fmt.Errorf("unknown bearing: %s", c.Bearing) } default: return fmt.Errorf("unknown command: %s", c.Command) @@ -334,7 +334,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err switch c.Command { case "move": if dir, err := bearing.FromString(c.Bearing); err != nil { - return true, fmt.Errorf("unknown direction in command %+v, skipping: %s\n", c, err) + return true, fmt.Errorf("unknown bearing in command %+v, skipping: %s\n", c, err) } else if _, err := w.MoveRover(rover, dir); err != nil { return true, fmt.Errorf("error moving rover in command %+v, skipping: %s\n", c, err) From 6a868d3e41780be94ad34ac084ee8ade4b31bcfb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:33:30 +0100 Subject: [PATCH 167/495] Fix up TODOs and comments that have now been done --- pkg/game/tile.go | 1 - pkg/game/world.go | 3 +-- pkg/rove/api.go | 2 -- pkg/server/server.go | 4 +++- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkg/game/tile.go b/pkg/game/tile.go index f7d7039..954f571 100644 --- a/pkg/game/tile.go +++ b/pkg/game/tile.go @@ -7,7 +7,6 @@ const ( TileEmpty = Tile(0) TileRover = Tile(1) - // TODO: Is there even a difference between these two? TileWall = Tile(2) TileRock = Tile(3) ) diff --git a/pkg/game/world.go b/pkg/game/world.go index 8a7a2a1..150a9b1 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -37,7 +37,7 @@ func NewWorld(size int, chunkSize int) *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), - Atlas: NewAtlas(size, chunkSize), // TODO: Choose an appropriate world size + Atlas: NewAtlas(size, chunkSize), } } @@ -198,7 +198,6 @@ func (w *World) MoveRover(id uuid.UUID, bearing bearing.Bearing) (RoverAttribute return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) } else if tile == TileEmpty { // Set the world tiles - // TODO: Make this (and other things) transactional if err := w.Atlas.SetTile(newPos, TileRover); err != nil { return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err) } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 45c6d50..308e816 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -21,8 +21,6 @@ type StatusResponse struct { Version string `json:"version"` Tick int `json:"tick"` NextTick string `json:"nexttick,omitempty"` - - // TODO: return more useful info } // ============================== diff --git a/pkg/server/server.go b/pkg/server/server.go index ae4dd3b..7bd2852 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -98,7 +98,9 @@ func NewServer(opts ...ServerOption) *Server { // Create the accountant s.accountant = accounts.NewAccountant() - s.world = game.NewWorld(4, 8) // TODO: Configure this + + // Start small, we can grow the world later + s.world = game.NewWorld(4, 8) return s } From 217e579cecd66f2d9a829f7e994708a924469e7d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 18:35:36 +0100 Subject: [PATCH 168/495] Fix InnerMain test for rove commands --- cmd/rove/main_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 2a48e8c..745b73d 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -65,7 +65,7 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("register")) // We've not spawned a rover yet so these should fail - assert.Error(t, InnerMain("command")) + assert.Error(t, InnerMain("move")) assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) From 2ee68e74acae7892c8ce2d4fe7a6e2cb6ca46065 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 9 Jun 2020 20:44:25 +0100 Subject: [PATCH 169/495] Enqueue the incoming commands at the next tick This sync commands for all users and in the future will let you view which moves and commands are currently being executed --- pkg/game/command_test.go | 1 + pkg/game/world.go | 26 ++++++++++++++++++++++---- pkg/server/routes_test.go | 1 + 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index ebc528c..dcdd9a1 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -30,6 +30,7 @@ func TestCommand_Move(t *testing.T) { assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world + world.EnqueueAllIncoming() world.ExecuteCommandQueues() newatributes, err := world.RoverAttributes(a) diff --git a/pkg/game/world.go b/pkg/game/world.go index 150a9b1..6002b25 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -28,6 +28,9 @@ type World struct { // Commands is the set of currently executing command streams per rover CommandQueue map[uuid.UUID]CommandStream `json:"commands"` + // Incoming represents the set of commands to add to the queue at the end of the current tick + Incoming map[uuid.UUID]CommandStream `json:"incoming"` + // Mutex to lock around command operations cmdMutex sync.RWMutex } @@ -37,6 +40,7 @@ func NewWorld(size int, chunkSize int) *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), + Incoming: make(map[uuid.UUID]CommandStream), Atlas: NewAtlas(size, chunkSize), } } @@ -289,19 +293,30 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() - // Append the commands to the current set - cmds := w.CommandQueue[rover] - w.CommandQueue[rover] = append(cmds, commands...) + // Append the commands to the incoming set + cmds := w.Incoming[rover] + w.Incoming[rover] = append(cmds, commands...) return nil } +// EnqueueAllIncoming will enqueue the incoming commands +func (w *World) EnqueueAllIncoming() { + // Add any incoming commands from this tick and clear that queue + for id, incoming := range w.Incoming { + commands := w.CommandQueue[id] + commands = append(commands, incoming...) + w.CommandQueue[id] = commands + } + w.Incoming = make(map[uuid.UUID]CommandStream) +} + // Execute will execute any commands in the current command queue func (w *World) ExecuteCommandQueues() { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() - // Iterate through all commands + // Iterate through all the current commands for rover, cmds := range w.CommandQueue { if len(cmds) != 0 { // Extract the first command in the queue @@ -324,6 +339,9 @@ func (w *World) ExecuteCommandQueues() { delete(w.CommandQueue, rover) } } + + // Add any incoming commands from this tick and clear that queue + w.EnqueueAllIncoming() } // ExecuteCommand will execute a single command diff --git a/pkg/server/routes_test.go b/pkg/server/routes_test.go index 46776d2..e4f16af 100644 --- a/pkg/server/routes_test.go +++ b/pkg/server/routes_test.go @@ -127,6 +127,7 @@ func TestHandleCommand(t *testing.T) { assert.NoError(t, err, "Couldn't get rover attribs") // Tick the command queues to progress the move command + s.world.EnqueueAllIncoming() s.world.ExecuteCommandQueues() attribs2, err := s.world.RoverAttributes(inst) From 14c4e61660aa0023de7f6036abac17a1d769376a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 12:32:15 +0100 Subject: [PATCH 170/495] Fix up gocritic issues --- cmd/rove/main.go | 60 ++++++++++++++++++++++------------ pkg/accounts/accounts.go | 2 +- pkg/game/atlas.go | 10 +++--- pkg/game/command_test.go | 4 +-- pkg/game/world.go | 6 ++-- pkg/game/world_test.go | 6 ++-- pkg/maths/maths.go | 4 +-- pkg/persistence/persistence.go | 26 +++++++-------- pkg/rove/http.go | 10 +++--- 9 files changed, 72 insertions(+), 56 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 391d478..90452f6 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -101,10 +101,12 @@ func InnerMain(command string) error { // Handle all the commands switch command { case "status": - if response, err := server.Status(); err != nil { + response, err := server.Status() + switch { + case err != nil: return err - } else { + default: fmt.Printf("Ready: %t\n", response.Ready) fmt.Printf("Version: %s\n", response.Version) fmt.Printf("Tick: %d\n", response.Tick) @@ -115,13 +117,15 @@ func InnerMain(command string) error { d := rove.RegisterData{ Name: *name, } - if response, err := server.Register(d); err != nil { + response, err := server.Register(d) + switch { + case err != nil: return err - } else if !response.Success { + case !response.Success: return fmt.Errorf("Server returned failure: %s", response.Error) - } else { + default: fmt.Printf("Registered account with id: %s\n", response.Id) config.Accounts[config.Host] = response.Id } @@ -129,13 +133,17 @@ func InnerMain(command string) error { d := rove.SpawnData{} if err := verifyId(account); err != nil { return err - } else if response, err := server.Spawn(account, d); err != nil { + } + + response, err := server.Spawn(account, d) + switch { + case err != nil: return err - } else if !response.Success { + case !response.Success: return fmt.Errorf("Server returned failure: %s", response.Error) - } else { + default: fmt.Printf("Spawned rover with attributes %+v\n", response.Attributes) } @@ -152,26 +160,34 @@ func InnerMain(command string) error { if err := verifyId(account); err != nil { return err - } else if response, err := server.Command(account, d); err != nil { + } + + response, err := server.Command(account, d) + switch { + case err != nil: return err - } else if !response.Success { + case !response.Success: return fmt.Errorf("Server returned failure: %s", response.Error) - } else { + default: fmt.Printf("Request succeeded\n") } case "radar": if err := verifyId(account); err != nil { return err - } else if response, err := server.Radar(account); err != nil { + } + + response, err := server.Radar(account) + switch { + case err != nil: return err - } else if !response.Success { + case !response.Success: return fmt.Errorf("Server returned failure: %s", response.Error) - } else { + default: // Print out the radar game.PrintTiles(response.Tiles) } @@ -179,13 +195,17 @@ func InnerMain(command string) error { case "rover": if err := verifyId(account); err != nil { return err - } else if response, err := server.Rover(account); err != nil { + } + response, err := server.Rover(account) + + switch { + case err != nil: return err - } else if !response.Success { + case !response.Success: return fmt.Errorf("Server returned failure: %s", response.Error) - } else { + default: fmt.Printf("attributes: %+v\n", response.Attributes) } @@ -198,10 +218,8 @@ func InnerMain(command string) error { // Save out the persistent file if b, err := json.MarshalIndent(config, "", "\t"); err != nil { return fmt.Errorf("failed to marshal data error: %s", err) - } else { - if err := ioutil.WriteFile(*data, b, os.ModePerm); err != nil { - return fmt.Errorf("failed to save file %s error: %s", *data, err) - } + } else if err := ioutil.WriteFile(*data, b, os.ModePerm); err != nil { + return fmt.Errorf("failed to save file %s error: %s", *data, err) } return nil diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index e1f6f12..3ab921f 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -59,7 +59,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { } // AssignRover assigns rover ownership of an rover to an account -func (a *Accountant) AssignRover(account uuid.UUID, rover uuid.UUID) error { +func (a *Accountant) AssignRover(account, rover uuid.UUID) error { // Find the account matching the ID if this, ok := a.Accounts[account]; ok { diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 7e0c855..a1b4361 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -29,7 +29,7 @@ type Atlas struct { } // NewAtlas creates a new empty atlas -func NewAtlas(size int, chunkSize int) Atlas { +func NewAtlas(size, chunkSize int) Atlas { if size%2 != 0 { log.Fatal("atlas size must always be even") } @@ -77,11 +77,11 @@ func (a *Atlas) SpawnWalls() error { if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileWall); err != nil { // N return err - } else if a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileWall); err != nil { // E + } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileWall); err != nil { // E return err - } else if a.SetTile(vector.Vector{X: i, Y: -extent}, TileWall); err != nil { // S + } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileWall); err != nil { // S return err - } else if a.SetTile(vector.Vector{X: -extent, Y: i}, TileWall); err != nil { // W + } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileWall); err != nil { // W return err } } @@ -155,7 +155,7 @@ func (a *Atlas) ChunkOrigin(chunk int) vector.Vector { } // GetWorldExtent gets the min and max valid coordinates of world -func (a *Atlas) GetWorldExtents() (min vector.Vector, max vector.Vector) { +func (a *Atlas) GetWorldExtents() (min, max vector.Vector) { min = vector.Vector{ X: -(a.Size / 2) * a.ChunkSize, Y: -(a.Size / 2) * a.ChunkSize, diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index dcdd9a1..c1fabcc 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -3,7 +3,6 @@ package game import ( "testing" - "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -23,10 +22,9 @@ func TestCommand_Move(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - bearing := bearing.North duration := 1 // Try the move command - moveCommand := Command{Command: CommandMove, Bearing: bearing.String(), Duration: duration} + moveCommand := Command{Command: CommandMove, Bearing: "N", Duration: duration} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world diff --git a/pkg/game/world.go b/pkg/game/world.go index 6002b25..1da2821 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -36,7 +36,7 @@ type World struct { } // NewWorld creates a new world object -func NewWorld(size int, chunkSize int) *World { +func NewWorld(size, chunkSize int) *World { return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), @@ -183,7 +183,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, bearing bearing.Bearing) (RoverAttributes, error) { +func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -192,7 +192,7 @@ func (w *World) MoveRover(id uuid.UUID, bearing bearing.Bearing) (RoverAttribute distance := i.Attributes.Speed // Calculate the full movement based on the bearing - move := bearing.Vector().Multiplied(distance) + move := b.Vector().Multiplied(distance) // Try the new move position newPos := i.Attributes.Pos.Added(move) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 1b6f1b6..186ee1e 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -79,16 +79,16 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly set position for rover") - bearing := bearing.North + b := bearing.North duration := 1 - newAttribs, err = world.MoveRover(a, bearing) + newAttribs, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") pos.Add(vector.Vector{X: 0, Y: attribs.Speed * duration}) // We should have move one unit of the speed north assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") // Place a tile in front of the rover assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, TileWall)) - newAttribs, err = world.MoveRover(a, bearing) + newAttribs, err = world.MoveRover(a, b) assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") } diff --git a/pkg/maths/maths.go b/pkg/maths/maths.go index a3411b9..7e1d0fc 100644 --- a/pkg/maths/maths.go +++ b/pkg/maths/maths.go @@ -25,7 +25,7 @@ func Pmod(x, d int) int { } // Max returns the highest int -func Max(x int, y int) int { +func Max(x, y int) int { if x < y { return y } @@ -33,7 +33,7 @@ func Max(x int, y int) int { } // Min returns the lowest int -func Min(x int, y int) int { +func Min(x, y int) int { if x > y { return y } diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index db0e868..8fc5e5b 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -12,13 +12,13 @@ import ( var dataPath = os.TempDir() // SetPath sets the persistent path for the data storage -func SetPath(path string) error { - if info, err := os.Stat(path); err != nil { +func SetPath(p string) error { + if info, err := os.Stat(p); err != nil { return err } else if !info.IsDir() { return fmt.Errorf("path for persistence is not directory") } - dataPath = path + dataPath = p return nil } @@ -29,40 +29,40 @@ func jsonPath(name string) string { // Save will serialise the interface into a json file func Save(name string, data interface{}) error { - path := jsonPath(name) + p := jsonPath(name) if b, err := json.MarshalIndent(data, "", " "); err != nil { return err } else { - if err := ioutil.WriteFile(jsonPath(name), b, os.ModePerm); err != nil { + if err := ioutil.WriteFile(p, b, os.ModePerm); err != nil { return err } } - fmt.Printf("Saved %s\n", path) + fmt.Printf("Saved %s\n", p) return nil } // Load will load the interface from the json file func Load(name string, data interface{}) error { - path := jsonPath(name) + p := jsonPath(name) // Don't load anything if the file doesn't exist - _, err := os.Stat(path) + _, err := os.Stat(p) if os.IsNotExist(err) { - fmt.Printf("File %s didn't exist, loading with fresh data\n", path) + fmt.Printf("File %s didn't exist, loading with fresh data\n", p) return nil } // Read and unmarshal the json - if b, err := ioutil.ReadFile(path); err != nil { + if b, err := ioutil.ReadFile(p); err != nil { return err } else if len(b) == 0 { - fmt.Printf("File %s was empty, loading with fresh data\n", path) + fmt.Printf("File %s was empty, loading with fresh data\n", p) return nil } else if err := json.Unmarshal(b, data); err != nil { - return fmt.Errorf("failed to load file %s error: %s", path, err) + return fmt.Errorf("failed to load file %s error: %s", p, err) } - fmt.Printf("Loaded %s\n", path) + fmt.Printf("Loaded %s\n", p) return nil } diff --git a/pkg/rove/http.go b/pkg/rove/http.go index 30e4aa5..2321bdc 100644 --- a/pkg/rove/http.go +++ b/pkg/rove/http.go @@ -13,12 +13,12 @@ type Server string // GET performs a GET request func (s Server) GET(path string, out interface{}) error { - url := url.URL{ + u := url.URL{ Scheme: "http", Host: string(s), Path: path, } - if resp, err := http.Get(url.String()); err != nil { + if resp, err := http.Get(u.String()); err != nil { return err } else if resp.StatusCode != http.StatusOK { @@ -30,8 +30,8 @@ func (s Server) GET(path string, out interface{}) error { } // POST performs a POST request -func (s Server) POST(path string, in interface{}, out interface{}) error { - url := url.URL{ +func (s Server) POST(path string, in, out interface{}) error { + u := url.URL{ Scheme: "http", Host: string(s), Path: path, @@ -45,7 +45,7 @@ func (s Server) POST(path string, in interface{}, out interface{}) error { } // Set up the request - req, err := http.NewRequest("POST", url.String(), bytes.NewReader(marshalled)) + req, err := http.NewRequest("POST", u.String(), bytes.NewReader(marshalled)) if err != nil { return err } From 62d6213c1aef6382ef40daea4de8c0dc98e21b13 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 17:27:55 +0100 Subject: [PATCH 171/495] Change GET and SET to CamelCase --- pkg/rove/api.go | 12 ++++++------ pkg/rove/http.go | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 308e816..b97713c 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -11,7 +11,7 @@ import ( // Status queries the status of the server func (s Server) Status() (r StatusResponse, err error) { - s.GET("status", &r) + s.Get("status", &r) return } @@ -29,7 +29,7 @@ type StatusResponse struct { // Register registers a user by name // Responds with a unique ID for that user to be used in future requests func (s Server) Register(d RegisterData) (r RegisterResponse, err error) { - err = s.POST("register", d, &r) + err = s.Post("register", d, &r) return } @@ -52,7 +52,7 @@ type RegisterResponse struct { // Spawn spawns the rover for an account // Responds with the position of said rover func (s Server) Spawn(account string, d SpawnData) (r SpawnResponse, err error) { - err = s.POST(path.Join(account, "spawn"), d, &r) + err = s.Post(path.Join(account, "spawn"), d, &r) return } @@ -75,7 +75,7 @@ type SpawnResponse struct { // Command issues a set of commands from the user func (s Server) Command(account string, d CommandData) (r CommandResponse, err error) { - err = s.POST(path.Join(account, "command"), d, &r) + err = s.Post(path.Join(account, "command"), d, &r) return } @@ -95,7 +95,7 @@ type CommandResponse struct { // Radar queries the current radar for the user func (s Server) Radar(account string) (r RadarResponse, err error) { - err = s.GET(path.Join(account, "radar"), &r) + err = s.Get(path.Join(account, "radar"), &r) return } @@ -114,7 +114,7 @@ type RadarResponse struct { // Rover queries the current state of the rover func (s Server) Rover(account string) (r RoverResponse, err error) { - err = s.GET(path.Join(account, "rover"), &r) + err = s.Get(path.Join(account, "rover"), &r) return } diff --git a/pkg/rove/http.go b/pkg/rove/http.go index 2321bdc..e415762 100644 --- a/pkg/rove/http.go +++ b/pkg/rove/http.go @@ -11,8 +11,8 @@ import ( // Server is a simple wrapper to a server path type Server string -// GET performs a GET request -func (s Server) GET(path string, out interface{}) error { +// Get performs a Get request +func (s Server) Get(path string, out interface{}) error { u := url.URL{ Scheme: "http", Host: string(s), @@ -29,8 +29,8 @@ func (s Server) GET(path string, out interface{}) error { } } -// POST performs a POST request -func (s Server) POST(path string, in, out interface{}) error { +// Post performs a Post request +func (s Server) Post(path string, in, out interface{}) error { u := url.URL{ Scheme: "http", Host: string(s), From 6fb7ee598d05e2c79b8a091be4618ad7d3bc6a6f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 17:39:42 +0100 Subject: [PATCH 172/495] Move server package out into rove-server --- Makefile | 10 +++++-- cmd/rove-server/{ => internal}/api_test.go | 5 ++-- .../rove-server/internal}/routes.go | 2 +- .../rove-server/internal}/routes_test.go | 2 +- .../rove-server/internal}/server.go | 2 +- .../rove-server/internal}/server_test.go | 2 +- cmd/rove-server/main.go | 10 +++---- cmd/rove/main_test.go | 28 ++----------------- pkg/game/world.go | 7 +++-- 9 files changed, 27 insertions(+), 41 deletions(-) rename cmd/rove-server/{ => internal}/api_test.go (97%) rename {pkg/server => cmd/rove-server/internal}/routes.go (99%) rename {pkg/server => cmd/rove-server/internal}/routes_test.go (99%) rename {pkg/server => cmd/rove-server/internal}/server.go (99%) rename {pkg/server => cmd/rove-server/internal}/server_test.go (98%) diff --git a/Makefile b/Makefile index 2eb2b16..9373c42 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,14 @@ test: # Run the server and shut it down again to ensure our docker-compose works ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit - # Run tests with coverage - go test -v ./... -cover -coverprofile=/tmp/c.out -count 1 + # Run the server and shut it down again to ensure our docker-compose works + docker-compose up -d + + # Run tests with coverage and integration tags + go test -v ./... --tags=integration -cover -coverprofile=/tmp/c.out -count 1 + + # + docker-compose down # Convert the coverage data to html go tool cover -html=/tmp/c.out -o /tmp/coverage.html diff --git a/cmd/rove-server/api_test.go b/cmd/rove-server/internal/api_test.go similarity index 97% rename from cmd/rove-server/api_test.go rename to cmd/rove-server/internal/api_test.go index 344cfe4..9010092 100644 --- a/cmd/rove-server/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -1,4 +1,4 @@ -package main +package internal import ( "fmt" @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" - "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) @@ -16,7 +15,7 @@ import ( var serv rove.Server func TestMain(m *testing.M) { - s := server.NewServer() + s := NewServer() if err := s.Initialise(true); err != nil { fmt.Println(err) os.Exit(1) diff --git a/pkg/server/routes.go b/cmd/rove-server/internal/routes.go similarity index 99% rename from pkg/server/routes.go rename to cmd/rove-server/internal/routes.go index 48f8d1d..3dfc4c4 100644 --- a/pkg/server/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -1,4 +1,4 @@ -package server +package internal import ( "encoding/json" diff --git a/pkg/server/routes_test.go b/cmd/rove-server/internal/routes_test.go similarity index 99% rename from pkg/server/routes_test.go rename to cmd/rove-server/internal/routes_test.go index e4f16af..78861df 100644 --- a/pkg/server/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -1,4 +1,4 @@ -package server +package internal import ( "bytes" diff --git a/pkg/server/server.go b/cmd/rove-server/internal/server.go similarity index 99% rename from pkg/server/server.go rename to cmd/rove-server/internal/server.go index 7bd2852..08c6eb6 100644 --- a/pkg/server/server.go +++ b/cmd/rove-server/internal/server.go @@ -1,4 +1,4 @@ -package server +package internal import ( "context" diff --git a/pkg/server/server_test.go b/cmd/rove-server/internal/server_test.go similarity index 98% rename from pkg/server/server_test.go rename to cmd/rove-server/internal/server_test.go index cf07bdc..36db679 100644 --- a/pkg/server/server_test.go +++ b/cmd/rove-server/internal/server_test.go @@ -1,4 +1,4 @@ -package server +package internal import ( "testing" diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 0cd4232..49ac614 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -8,8 +8,8 @@ import ( "syscall" "time" + "github.com/mdiluz/rove/cmd/rove-server/internal" "github.com/mdiluz/rove/pkg/persistence" - "github.com/mdiluz/rove/pkg/server" "github.com/mdiluz/rove/pkg/version" ) @@ -34,10 +34,10 @@ func InnerMain() { persistence.SetPath(*data) // Create the server data - s := server.NewServer( - server.OptionAddress(*address), - server.OptionPersistentData(), - server.OptionTick(*tick)) + s := internal.NewServer( + internal.OptionAddress(*address), + internal.OptionPersistentData(), + internal.OptionTick(*tick)) // Initialise the server if err := s.Initialise(true); err != nil { diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 745b73d..1803a14 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -1,40 +1,18 @@ +// +build integration + package main import ( "flag" - "fmt" "os" "path" "testing" "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/server" "github.com/stretchr/testify/assert" ) -var address string - -func TestMain(m *testing.M) { - s := server.NewServer() - if err := s.Initialise(true); err != nil { - fmt.Println(err) - os.Exit(1) - } - - address = s.Addr() - - go s.Run() - - fmt.Printf("Test server hosted on %s", address) - code := m.Run() - - if err := s.StopAndClose(); err != nil { - fmt.Println(err) - os.Exit(1) - } - - os.Exit(code) -} +var address = "localhost:80" func Test_InnerMain(t *testing.T) { // Set up the flags to act locally and use a temporary file diff --git a/pkg/game/world.go b/pkg/game/world.go index 1da2821..f2a2f56 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -294,8 +294,11 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { defer w.cmdMutex.Unlock() // Append the commands to the incoming set - cmds := w.Incoming[rover] - w.Incoming[rover] = append(cmds, commands...) + if cmds, ok := w.Incoming[rover]; ok { + w.Incoming[rover] = append(cmds, commands...) + } else { + w.Incoming[rover] = commands + } return nil } From b3b369f608b80a304e17b7c9c8886a3d136e936b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 18:48:56 +0100 Subject: [PATCH 173/495] Remove /spawn POST endpoint This was increasing complexity for no added benefit /register now performs the spawn in 4 lines of code --- cmd/rove-server/internal/api_test.go | 30 ----------------- cmd/rove-server/internal/routes.go | 45 +++---------------------- cmd/rove-server/internal/routes_test.go | 25 -------------- cmd/rove/main.go | 18 ---------- cmd/rove/main_test.go | 9 ----- pkg/rove/api.go | 24 ------------- 6 files changed, 4 insertions(+), 147 deletions(-) diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go index 9010092..16d6eb1 100644 --- a/cmd/rove-server/internal/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -65,21 +65,6 @@ func TestServer_Register(t *testing.T) { assert.False(t, r3.Success) } -func TestServer_Spawn(t *testing.T) { - d1 := rove.RegisterData{ - Name: uuid.New().String(), - } - r1, err := serv.Register(d1) - assert.NoError(t, err) - assert.True(t, r1.Success) - assert.NotZero(t, len(r1.Id)) - - s := rove.SpawnData{} - r2, err := serv.Spawn(r1.Id, s) - assert.NoError(t, err) - assert.True(t, r2.Success) -} - func TestServer_Command(t *testing.T) { d1 := rove.RegisterData{ Name: uuid.New().String(), @@ -89,11 +74,6 @@ func TestServer_Command(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := rove.SpawnData{} - r2, err := serv.Spawn(r1.Id, s) - assert.NoError(t, err) - assert.True(t, r2.Success) - c := rove.CommandData{ Commands: []game.Command{ { @@ -117,11 +97,6 @@ func TestServer_Radar(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := rove.SpawnData{} - r2, err := serv.Spawn(r1.Id, s) - assert.NoError(t, err) - assert.True(t, r2.Success) - r3, err := serv.Radar(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) @@ -136,11 +111,6 @@ func TestServer_Rover(t *testing.T) { assert.True(t, r1.Success) assert.NotZero(t, len(r1.Id)) - s := rove.SpawnData{} - r2, err := serv.Spawn(r1.Id, s) - assert.NoError(t, err) - assert.True(t, r2.Success) - r3, err := serv.Rover(r1.Id) assert.NoError(t, err) assert.True(t, r3.Success) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 3dfc4c4..7f7127d 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -33,11 +33,6 @@ var Routes = []Route{ method: http.MethodPost, handler: HandleRegister, }, - { - path: "/{account}/spawn", - method: http.MethodPost, - handler: HandleSpawn, - }, { path: "/{account}/command", method: http.MethodPost, @@ -92,8 +87,11 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else if acc, err := s.accountant.RegisterAccount(data.Name); err != nil { response.Error = err.Error() + } else if _, _, err := s.SpawnRoverForAccount(acc.Id); err != nil { + response.Error = err.Error() + } else if err := s.SaveAll(); err != nil { - response.Error = fmt.Sprintf("Internal server error when saving accounts: %s", err) + response.Error = fmt.Sprintf("Internal server error when saving: %s", err) } else { // Save out the new accounts @@ -105,41 +103,6 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri return response, nil } -// HandleSpawn will spawn the player entity for the associated account -func HandleSpawn(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.SpawnResponse{ - Success: false, - } - - id := vars["account"] - - // Decode the spawn info, verify it and spawn the rover for this account - var data rove.SpawnData - if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() - - } else if len(id) == 0 { - response.Error = "No account ID provided" - - } else if id, err := uuid.Parse(id); err != nil { - response.Error = "Provided account ID was invalid" - - } else if attribs, _, err := s.SpawnRoverForAccount(id); err != nil { - response.Error = err.Error() - - } else if err := s.SaveWorld(); err != nil { - response.Error = fmt.Sprintf("Internal server error when saving world: %s", err) - - } else { - response.Success = true - response.Attributes = attribs - } - - fmt.Printf("spawn response \taccount:%s\tresponse:%+v\n", id, response) - return response, nil -} - // HandleSpawn will spawn the player entity for the associated account func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { var response = rove.CommandResponse{ diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index 78861df..f765a11 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -59,31 +59,6 @@ func TestHandleRegister(t *testing.T) { } } -func TestHandleSpawn(t *testing.T) { - s := NewServer() - s.Initialise(true) - a, err := s.accountant.RegisterAccount("test") - assert.NoError(t, err, "Error registering account") - data := rove.SpawnData{} - - b, err := json.Marshal(data) - assert.NoError(t, err, "Error marshalling data") - - request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Id.String(), "/spawn"), bytes.NewReader(b)) - response := httptest.NewRecorder() - - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.SpawnResponse - json.NewDecoder(response.Body).Decode(&status) - assert.Equal(t, http.StatusOK, response.Code) - - if status.Success != true { - t.Errorf("got false for /spawn: %s", status.Error) - } -} - func TestHandleCommand(t *testing.T) { s := NewServer() s.Initialise(false) // Leave the world empty with no obstacles diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 90452f6..7970cfc 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -21,7 +21,6 @@ func Usage() { fmt.Fprintln(os.Stderr, "\nCommands:") fmt.Fprintln(os.Stderr, "\tstatus \tprints the server status") fmt.Fprintln(os.Stderr, "\tregister\tregisters an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tspawn \tspawns a rover for the current account") fmt.Fprintln(os.Stderr, "\tmove \tissues move command to rover") fmt.Fprintln(os.Stderr, "\tradar \tgathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\trover \tgets data for current rover") @@ -129,23 +128,6 @@ func InnerMain(command string) error { fmt.Printf("Registered account with id: %s\n", response.Id) config.Accounts[config.Host] = response.Id } - case "spawn": - d := rove.SpawnData{} - if err := verifyId(account); err != nil { - return err - } - - response, err := server.Spawn(account, d) - switch { - case err != nil: - return err - - case !response.Success: - return fmt.Errorf("Server returned failure: %s", response.Error) - - default: - fmt.Printf("Spawned rover with attributes %+v\n", response.Attributes) - } case "move": d := rove.CommandData{ diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 1803a14..2fd0a65 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -31,7 +31,6 @@ func Test_InnerMain(t *testing.T) { assert.Error(t, InnerMain("register")) // These methods should fail without an account - assert.Error(t, InnerMain("spawn")) assert.Error(t, InnerMain("move")) assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) @@ -42,14 +41,6 @@ func Test_InnerMain(t *testing.T) { // Perform the register assert.NoError(t, InnerMain("register")) - // We've not spawned a rover yet so these should fail - assert.Error(t, InnerMain("move")) - assert.Error(t, InnerMain("radar")) - assert.Error(t, InnerMain("rover")) - - // Spawn a rover - assert.NoError(t, InnerMain("spawn")) - // These should now work assert.NoError(t, InnerMain("radar")) assert.NoError(t, InnerMain("rover")) diff --git a/pkg/rove/api.go b/pkg/rove/api.go index b97713c..b9b1d23 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -46,30 +46,6 @@ type RegisterResponse struct { Id string `json:"id"` } -// ============================== -// API: /{account}/spawn method: POST - -// Spawn spawns the rover for an account -// Responds with the position of said rover -func (s Server) Spawn(account string, d SpawnData) (r SpawnResponse, err error) { - err = s.Post(path.Join(account, "spawn"), d, &r) - return -} - -// SpawnData is the data to be sent for the spawn command -type SpawnData struct { - // Empty for now, reserved for data -} - -// SpawnResponse is the data to respond with on a spawn command -type SpawnResponse struct { - Success bool `json:"success"` - Error string `json:"error,omitempty"` - - // The attributes of the spawned entity - Attributes game.RoverAttributes `json:"attributes"` -} - // ============================== // API: /{account}/command method: POST From 7749854eb736921c88469f31837a2516d104784d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 18:56:24 +0100 Subject: [PATCH 174/495] Remove account IDs in favor of just account names These were a "security" feature but pre-emptive and just add complications when we can implement secrets later --- cmd/rove-server/internal/api_test.go | 11 +++-------- cmd/rove-server/internal/routes.go | 13 +------------ cmd/rove-server/internal/routes_test.go | 12 ++++++------ cmd/rove-server/internal/server.go | 4 ++-- cmd/rove/main.go | 4 ++-- pkg/accounts/accounts.go | 18 ++++++------------ pkg/accounts/accounts_test.go | 11 +++-------- pkg/rove/api.go | 3 --- 8 files changed, 23 insertions(+), 53 deletions(-) diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go index 16d6eb1..3e6a0c1 100644 --- a/cmd/rove-server/internal/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -50,7 +50,6 @@ func TestServer_Register(t *testing.T) { r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) - assert.NotZero(t, len(r1.Id)) d2 := rove.RegisterData{ Name: uuid.New().String(), @@ -58,7 +57,6 @@ func TestServer_Register(t *testing.T) { r2, err := serv.Register(d2) assert.NoError(t, err) assert.True(t, r2.Success) - assert.NotZero(t, len(r2.Id)) r3, err := serv.Register(d1) assert.NoError(t, err) @@ -72,7 +70,6 @@ func TestServer_Command(t *testing.T) { r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) - assert.NotZero(t, len(r1.Id)) c := rove.CommandData{ Commands: []game.Command{ @@ -83,7 +80,7 @@ func TestServer_Command(t *testing.T) { }, }, } - r3, err := serv.Command(r1.Id, c) + r3, err := serv.Command(d1.Name, c) assert.NoError(t, err) assert.True(t, r3.Success) } @@ -95,9 +92,8 @@ func TestServer_Radar(t *testing.T) { r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) - assert.NotZero(t, len(r1.Id)) - r3, err := serv.Radar(r1.Id) + r3, err := serv.Radar(d1.Name) assert.NoError(t, err) assert.True(t, r3.Success) } @@ -109,9 +105,8 @@ func TestServer_Rover(t *testing.T) { r1, err := serv.Register(d1) assert.NoError(t, err) assert.True(t, r1.Success) - assert.NotZero(t, len(r1.Id)) - r3, err := serv.Rover(r1.Id) + r3, err := serv.Rover(d1.Name) assert.NoError(t, err) assert.True(t, r3.Success) } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 7f7127d..e427e7e 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -6,7 +6,6 @@ import ( "io" "net/http" - "github.com/google/uuid" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" ) @@ -87,7 +86,7 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else if acc, err := s.accountant.RegisterAccount(data.Name); err != nil { response.Error = err.Error() - } else if _, _, err := s.SpawnRoverForAccount(acc.Id); err != nil { + } else if _, _, err := s.SpawnRoverForAccount(acc.Name); err != nil { response.Error = err.Error() } else if err := s.SaveAll(); err != nil { @@ -95,7 +94,6 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else { // Save out the new accounts - response.Id = acc.Id.String() response.Success = true } @@ -120,9 +118,6 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } else if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(id); err != nil { - response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) @@ -147,9 +142,6 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(id); err != nil { - response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) @@ -179,9 +171,6 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer if len(id) == 0 { response.Error = "No account ID provided" - } else if id, err := uuid.Parse(id); err != nil { - response.Error = fmt.Sprintf("Provided account ID was invalid: %s", err) - } else if inst, err := s.accountant.GetRover(id); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index f765a11..7cb9995 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -66,7 +66,7 @@ func TestHandleCommand(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - _, inst, err := s.SpawnRoverForAccount(a.Id) + _, inst, err := s.SpawnRoverForAccount(a.Name) assert.NoError(t, s.world.WarpRover(inst, vector.Vector{})) attribs, err := s.world.RoverAttributes(inst) @@ -85,7 +85,7 @@ func TestHandleCommand(t *testing.T) { b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Id.String(), "/command"), bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Name, "/command"), bytes.NewReader(b)) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -118,7 +118,7 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - attrib, id, err := s.SpawnRoverForAccount(a.Id) + attrib, id, err := s.SpawnRoverForAccount(a.Name) assert.NoError(t, err) // Warp this rover to 0,0 @@ -134,7 +134,7 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) assert.NoError(t, s.world.Atlas.SetTile(emptyPos, game.TileEmpty)) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/radar"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Name, "/radar"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -172,10 +172,10 @@ func TestHandleRover(t *testing.T) { assert.NoError(t, err, "Error registering account") // Spawn one rover for the account - attribs, _, err := s.SpawnRoverForAccount(a.Id) + attribs, _, err := s.SpawnRoverForAccount(a.Name) assert.NoError(t, err) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Id.String(), "/rover"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Name, "/rover"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 08c6eb6..746774c 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -281,7 +281,7 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons } // SpawnRoverForAccount spawns the rover rover for an account -func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.RoverAttributes, uuid.UUID, error) { +func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uuid.UUID, error) { if inst, err := s.world.SpawnRover(); err != nil { return game.RoverAttributes{}, uuid.UUID{}, err @@ -289,7 +289,7 @@ func (s *Server) SpawnRoverForAccount(accountid uuid.UUID) (game.RoverAttributes return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover: %s", err) } else { - if err := s.accountant.AssignRover(accountid, inst); err != nil { + if err := s.accountant.AssignRover(account, inst); err != nil { // Try and clear up the rover if err := s.world.DestroyRover(inst); err != nil { fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 7970cfc..f744410 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -125,8 +125,8 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) default: - fmt.Printf("Registered account with id: %s\n", response.Id) - config.Accounts[config.Host] = response.Id + fmt.Printf("Registered account with id: %s\n", d.Name) + config.Accounts[config.Host] = d.Name } case "move": diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 3ab921f..3ca5505 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -13,9 +13,6 @@ type Account struct { // Name simply describes the account and must be unique Name string `json:"name"` - // Id represents a unique ID per account and is set one registered - Id uuid.UUID `json:"id"` - // Rover represents the rover that this account owns Rover uuid.UUID `json:"rover"` } @@ -26,40 +23,37 @@ type accountantData struct { // Accountant manages a set of accounts type Accountant struct { - Accounts map[uuid.UUID]Account `json:"accounts"` + Accounts map[string]Account `json:"accounts"` } // NewAccountant creates a new accountant func NewAccountant() *Accountant { return &Accountant{ - Accounts: make(map[uuid.UUID]Account), + Accounts: make(map[string]Account), } } // RegisterAccount adds an account to the set of internal accounts func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { - // Set the account ID to a new UUID - acc.Id = uuid.New() + // Set the account name acc.Name = name // Verify this acount isn't already registered for _, a := range a.Accounts { if a.Name == acc.Name { return Account{}, fmt.Errorf("Account name already registered") - } else if a.Id == acc.Id { - return Account{}, fmt.Errorf("Account ID already registered") } } // Simply add the account to the map - a.Accounts[acc.Id] = acc + a.Accounts[acc.Name] = acc return } // AssignRover assigns rover ownership of an rover to an account -func (a *Accountant) AssignRover(account, rover uuid.UUID) error { +func (a *Accountant) AssignRover(account string, rover uuid.UUID) error { // Find the account matching the ID if this, ok := a.Accounts[account]; ok { @@ -73,7 +67,7 @@ func (a *Accountant) AssignRover(account, rover uuid.UUID) error { } // GetRover gets the rover rover for the account -func (a *Accountant) GetRover(account uuid.UUID) (uuid.UUID, error) { +func (a *Accountant) GetRover(account string) (uuid.UUID, error) { // Find the account matching the ID if this, ok := a.Accounts[account]; !ok { return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 3ab9795..0e0f3a6 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -36,11 +36,6 @@ func TestAccountant_RegisterAccount(t *testing.T) { t.Errorf("Missmatched account name after register, expected: %s, actual: %s", nameb, acca.Name) } - // Verify our accounts have differing IDs - if acca.Id == accb.Id { - t.Error("Duplicate account IDs fo separate accounts") - } - // Verify another request gets rejected _, err = accountant.RegisterAccount(namea) if err == nil { @@ -62,12 +57,12 @@ func TestAccountant_AssignGetRover(t *testing.T) { inst := uuid.New() - err = accountant.AssignRover(a.Id, inst) + err = accountant.AssignRover(a.Name, inst) if err != nil { t.Error("Failed to set rover for created account") - } else if accountant.Accounts[a.Id].Rover != inst { + } else if accountant.Accounts[a.Name].Rover != inst { t.Error("Rover for assigned account is incorrect") - } else if id, err := accountant.GetRover(a.Id); err != nil { + } else if id, err := accountant.GetRover(a.Name); err != nil { t.Error("Failed to get rover for account") } else if id != inst { t.Error("Fetched rover is incorrect for account") diff --git a/pkg/rove/api.go b/pkg/rove/api.go index b9b1d23..8ecb108 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -27,7 +27,6 @@ type StatusResponse struct { // API: /register method: POST // Register registers a user by name -// Responds with a unique ID for that user to be used in future requests func (s Server) Register(d RegisterData) (r RegisterResponse, err error) { err = s.Post("register", d, &r) return @@ -42,8 +41,6 @@ type RegisterData struct { type RegisterResponse struct { Success bool `json:"success"` Error string `json:"error,omitempty"` - - Id string `json:"id"` } // ============================== From 8f25f55658fcdd4e9d0cab5c7d8db5800094beb2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 22:48:45 +0100 Subject: [PATCH 175/495] Refactor accounts to store a data map rather than just a rover ID --- cmd/rove-server/internal/routes.go | 24 +++++++++++++++++------- cmd/rove-server/internal/server.go | 2 +- pkg/accounts/accounts.go | 20 ++++++++------------ pkg/accounts/accounts_test.go | 18 +++++++----------- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index e427e7e..759abaf 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -6,6 +6,7 @@ import ( "io" "net/http" + "github.com/google/uuid" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" ) @@ -118,10 +119,13 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } else if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetRover(id); err != nil { + } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if err := s.world.Enqueue(inst, data.Commands...); err != nil { + } else if id, err := uuid.Parse(inst); err != nil { + response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + + } else if err := s.world.Enqueue(id, data.Commands...); err != nil { response.Error = fmt.Sprintf("Failed to execute commands: %s", err) } else { @@ -142,13 +146,16 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetRover(id); err != nil { + } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if attrib, err := s.world.RoverAttributes(inst); err != nil { + } else if id, err := uuid.Parse(inst); err != nil { + response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + + } else if attrib, err := s.world.RoverAttributes(id); err != nil { response.Error = fmt.Sprintf("Error getting rover attributes: %s", err) - } else if radar, err := s.world.RadarFromRover(inst); err != nil { + } else if radar, err := s.world.RadarFromRover(id); err != nil { response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { @@ -171,10 +178,13 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetRover(id); err != nil { + } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if attribs, err := s.world.RoverAttributes(inst); err != nil { + } else if id, err := uuid.Parse(inst); err != nil { + response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + + } else if attribs, err := s.world.RoverAttributes(id); err != nil { response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) } else { diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 746774c..bd9f8e3 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -289,7 +289,7 @@ func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uui return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover: %s", err) } else { - if err := s.accountant.AssignRover(account, inst); err != nil { + if err := s.accountant.AssignData(account, "rover", inst.String()); err != nil { // Try and clear up the rover if err := s.world.DestroyRover(inst); err != nil { fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 3ca5505..1f4d1cf 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -2,8 +2,6 @@ package accounts import ( "fmt" - - "github.com/google/uuid" ) const kAccountsFileName = "rove-accounts.json" @@ -13,8 +11,8 @@ type Account struct { // Name simply describes the account and must be unique Name string `json:"name"` - // Rover represents the rover that this account owns - Rover uuid.UUID `json:"rover"` + // Data represents internal account data + Data map[string]string `json:"data"` } // Represents the accountant data to store @@ -52,12 +50,12 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { return } -// AssignRover assigns rover ownership of an rover to an account -func (a *Accountant) AssignRover(account string, rover uuid.UUID) error { +// AssignRover assigns data to an account +func (a *Accountant) AssignData(account string, key string, value string) error { // Find the account matching the ID if this, ok := a.Accounts[account]; ok { - this.Rover = rover + this.Data[key] = value a.Accounts[account] = this } else { return fmt.Errorf("no account found for id: %s", account) @@ -67,13 +65,11 @@ func (a *Accountant) AssignRover(account string, rover uuid.UUID) error { } // GetRover gets the rover rover for the account -func (a *Accountant) GetRover(account string) (uuid.UUID, error) { +func (a *Accountant) GetData(account string, key string) (string, error) { // Find the account matching the ID if this, ok := a.Accounts[account]; !ok { - return uuid.UUID{}, fmt.Errorf("no account found for id: %s", account) - } else if this.Rover == uuid.Nil { - return uuid.UUID{}, fmt.Errorf("no rover spawned for account %s", account) + return "", fmt.Errorf("no account found for id: %s", account) } else { - return this.Rover, nil + return this.Data[key], nil } } diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 0e0f3a6..decaf18 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -43,7 +43,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } } -func TestAccountant_AssignGetRover(t *testing.T) { +func TestAccountant_AssignGetData(t *testing.T) { accountant := NewAccountant() if len(accountant.Accounts) != 0 { t.Error("New accountant created with non-zero account number") @@ -55,16 +55,12 @@ func TestAccountant_AssignGetRover(t *testing.T) { t.Error(err) } - inst := uuid.New() - - err = accountant.AssignRover(a.Name, inst) + err = accountant.AssignData(a.Name, "key", "value") if err != nil { - t.Error("Failed to set rover for created account") - } else if accountant.Accounts[a.Name].Rover != inst { - t.Error("Rover for assigned account is incorrect") - } else if id, err := accountant.GetRover(a.Name); err != nil { - t.Error("Failed to get rover for account") - } else if id != inst { - t.Error("Fetched rover is incorrect for account") + t.Error("Failed to set data for created account") + } else if id, err := accountant.GetData(a.Name, "key"); err != nil { + t.Error("Failed to get data for account") + } else if id != "value" { + t.Error("Fetched data is incorrect for account") } } From 99da6c5d67b4077a86d157957e189dc0f157d2a3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 10 Jun 2020 23:23:09 +0100 Subject: [PATCH 176/495] Move accountant to it's own deployment using gRCP --- Makefile | 3 + cmd/rove-accountant/Dockerfile | 11 + .../rove-accountant/internal}/accounts.go | 5 +- .../internal}/accounts_test.go | 4 +- cmd/rove-accountant/main.go | 130 +++++ cmd/rove-server/internal/routes.go | 43 +- cmd/rove-server/internal/routes_test.go | 31 +- cmd/rove-server/internal/server.go | 69 ++- cmd/rove/main.go | 7 +- docker-compose.yml | 13 +- go.mod | 2 + go.sum | 68 +++ pkg/accounts/accounts.pb.go | 503 ++++++++++++++++++ pkg/accounts/accounts.proto | 43 ++ 14 files changed, 868 insertions(+), 64 deletions(-) create mode 100644 cmd/rove-accountant/Dockerfile rename {pkg/accounts => cmd/rove-accountant/internal}/accounts.go (92%) rename {pkg/accounts => cmd/rove-accountant/internal}/accounts_test.go (94%) create mode 100644 cmd/rove-accountant/main.go create mode 100644 pkg/accounts/accounts.pb.go create mode 100644 pkg/accounts/accounts.proto diff --git a/Makefile b/Makefile index 9373c42..1a4514c 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,9 @@ install: go mod download go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... +gen: + protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto + test: go mod download go build ./... diff --git a/cmd/rove-accountant/Dockerfile b/cmd/rove-accountant/Dockerfile new file mode 100644 index 0000000..cb8ca13 --- /dev/null +++ b/cmd/rove-accountant/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:latest +LABEL maintainer="Marc Di Luzio " + +WORKDIR /app +COPY . . +RUN go mod download + +RUN go build -o rove-accountant -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-accountant/main.go + +CMD [ "./rove-accountant" ] + diff --git a/pkg/accounts/accounts.go b/cmd/rove-accountant/internal/accounts.go similarity index 92% rename from pkg/accounts/accounts.go rename to cmd/rove-accountant/internal/accounts.go index 1f4d1cf..d24e369 100644 --- a/pkg/accounts/accounts.go +++ b/cmd/rove-accountant/internal/accounts.go @@ -1,4 +1,4 @@ -package accounts +package internal import ( "fmt" @@ -36,6 +36,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Set the account name acc.Name = name + acc.Data = make(map[string]string) // Verify this acount isn't already registered for _, a := range a.Accounts { @@ -65,7 +66,7 @@ func (a *Accountant) AssignData(account string, key string, value string) error } // GetRover gets the rover rover for the account -func (a *Accountant) GetData(account string, key string) (string, error) { +func (a *Accountant) GetValue(account string, key string) (string, error) { // Find the account matching the ID if this, ok := a.Accounts[account]; !ok { return "", fmt.Errorf("no account found for id: %s", account) diff --git a/pkg/accounts/accounts_test.go b/cmd/rove-accountant/internal/accounts_test.go similarity index 94% rename from pkg/accounts/accounts_test.go rename to cmd/rove-accountant/internal/accounts_test.go index decaf18..8ac3315 100644 --- a/pkg/accounts/accounts_test.go +++ b/cmd/rove-accountant/internal/accounts_test.go @@ -1,4 +1,4 @@ -package accounts +package internal import ( "testing" @@ -58,7 +58,7 @@ func TestAccountant_AssignGetData(t *testing.T) { err = accountant.AssignData(a.Name, "key", "value") if err != nil { t.Error("Failed to set data for created account") - } else if id, err := accountant.GetData(a.Name, "key"); err != nil { + } else if id, err := accountant.GetValue(a.Name, "key"); err != nil { t.Error("Failed to get data for account") } else if id != "value" { t.Error("Fetched data is incorrect for account") diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go new file mode 100644 index 0000000..bf6539b --- /dev/null +++ b/cmd/rove-accountant/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log" + "net" + "os" + "os/signal" + "sync" + "syscall" + + "github.com/mdiluz/rove/cmd/rove-accountant/internal" + "github.com/mdiluz/rove/pkg/accounts" + "github.com/mdiluz/rove/pkg/persistence" + "google.golang.org/grpc" +) + +var address = flag.String("address", "", "port to server the accountant on") +var data = flag.String("data", os.TempDir(), "path to persistent data") + +// accountantServer is the internal object to manage the requests +type accountantServer struct { + accountant *internal.Accountant + sync sync.RWMutex +} + +// Register will register an account +func (a *accountantServer) Register(ctx context.Context, in *accounts.RegisterInfo) (*accounts.RegisterResponse, error) { + a.sync.Lock() + defer a.sync.Unlock() + + // Try and register the account itself + fmt.Printf("Registering account: %s\n", in.Name) + if _, err := a.accountant.RegisterAccount(in.Name); err != nil { + fmt.Printf("Error: %s\n", err) + return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("error registering account: %s", err)}, nil + } + + // Save out the accounts + if err := persistence.Save("accounts", a.accountant); err != nil { + fmt.Printf("Error: %s\n", err) + return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("failed to save accounts: %s", err)}, nil + } + + return &accounts.RegisterResponse{Success: true}, nil +} + +// AssignData assigns a key value pair to an account +func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyValue) (*accounts.Response, error) { + a.sync.RLock() + defer a.sync.RUnlock() + + // Try and assign the data + fmt.Printf("Assigning value for account %s: %s->%s\n", in.Account, in.Key, in.Value) + err := a.accountant.AssignData(in.Account, in.Key, in.Value) + if err != nil { + fmt.Printf("Error: %s\n", err) + return &accounts.Response{Success: false, Error: err.Error()}, nil + } + + return &accounts.Response{Success: true}, nil + +} + +// GetData gets the value for a key +func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*accounts.DataResponse, error) { + a.sync.RLock() + defer a.sync.RUnlock() + + // Try and fetch the rover + fmt.Printf("Getting value for account %s: %s\n", in.Account, in.Key) + data, err := a.accountant.GetValue(in.Account, in.Key) + if err != nil { + fmt.Printf("Error: %s\n", err) + return &accounts.DataResponse{Success: false, Error: err.Error()}, nil + } + + return &accounts.DataResponse{Success: true, Value: data}, nil + +} + +// main +func main() { + flag.Parse() + + // Verify the input + if len(*address) == 0 { + log.Fatal("No address set with --address") + } + + persistence.SetPath(*data) + + // Initialise and load the accountant + accountant := &internal.Accountant{} + if err := persistence.Load("accounts", accountant); err != nil { + log.Fatalf("failed to load account data: %s", err) + } + + // Set up the RPC server and register + lis, err := net.Listen("tcp", *address) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + grpcServer := grpc.NewServer() + accounts.RegisterAccountantServer(grpcServer, &accountantServer{ + accountant: accountant, + }) + + // Set up the close handler + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + fmt.Println("Quit requested, exiting...") + grpcServer.Stop() + }() + + // Serve the RPC server + fmt.Printf("Serving accountant on %s\n", *address) + if err := grpcServer.Serve(lis); err != nil { + log.Fatalf("failed to server gRPC: %s", err) + } + + // Save out the accountant data + if err := persistence.Save("accounts", accountant); err != nil { + log.Fatalf("failed to save accounts: %s", err) + } +} diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 759abaf..b56b31c 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -1,12 +1,14 @@ package internal import ( + "context" "encoding/json" "fmt" "io" "net/http" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" ) @@ -84,14 +86,19 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } else if len(data.Name) == 0 { response.Error = "Cannot register empty name" - } else if acc, err := s.accountant.RegisterAccount(data.Name); err != nil { + } + reg := accounts.RegisterInfo{Name: data.Name} + if acc, err := s.accountant.Register(context.Background(), ®); err != nil { response.Error = err.Error() - } else if _, _, err := s.SpawnRoverForAccount(acc.Name); err != nil { + } else if !acc.Success { + response.Error = acc.Error + + } else if _, _, err := s.SpawnRoverForAccount(data.Name); err != nil { response.Error = err.Error() - } else if err := s.SaveAll(); err != nil { - response.Error = fmt.Sprintf("Internal server error when saving: %s", err) + } else if err := s.SaveWorld(); err != nil { + response.Error = fmt.Sprintf("Internal server error when saving world: %s", err) } else { // Save out the new accounts @@ -116,13 +123,19 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ fmt.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() - } else if len(id) == 0 { + } + + key := accounts.DataKey{Account: id, Key: "rover"} + if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { + } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if id, err := uuid.Parse(inst); err != nil { + } else if !resp.Success { + response.Error = resp.Error + + } else if id, err := uuid.Parse(resp.Value); err != nil { response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) } else if err := s.world.Enqueue(id, data.Commands...); err != nil { @@ -143,13 +156,17 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } id := vars["account"] + key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { + } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if id, err := uuid.Parse(inst); err != nil { + } else if !resp.Success { + response.Error = resp.Error + + } else if id, err := uuid.Parse(resp.Value); err != nil { response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) } else if attrib, err := s.world.RoverAttributes(id); err != nil { @@ -175,13 +192,17 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } id := vars["account"] + key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { response.Error = "No account ID provided" - } else if inst, err := s.accountant.GetData(id, "rover"); err != nil { + } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) - } else if id, err := uuid.Parse(inst); err != nil { + } else if !resp.Success { + response.Error = resp.Error + + } else if id, err := uuid.Parse(resp.Value); err != nil { response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) } else if attribs, err := s.world.RoverAttributes(id); err != nil { diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index 7cb9995..78fd4bd 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -2,12 +2,14 @@ package internal import ( "bytes" + "context" "encoding/json" "net/http" "net/http/httptest" "path" "testing" + "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/vector" @@ -62,11 +64,15 @@ func TestHandleRegister(t *testing.T) { func TestHandleCommand(t *testing.T) { s := NewServer() s.Initialise(false) // Leave the world empty with no obstacles - a, err := s.accountant.RegisterAccount("test") + reg := accounts.RegisterInfo{Name: "test"} + acc, err := s.accountant.Register(context.Background(), ®) + assert.NoError(t, err) + assert.True(t, acc.Success) + assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - _, inst, err := s.SpawnRoverForAccount(a.Name) + _, inst, err := s.SpawnRoverForAccount("test") assert.NoError(t, s.world.WarpRover(inst, vector.Vector{})) attribs, err := s.world.RoverAttributes(inst) @@ -85,7 +91,7 @@ func TestHandleCommand(t *testing.T) { b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, path.Join("/", a.Name, "/command"), bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, path.Join("/", "test", "/command"), bytes.NewReader(b)) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -114,11 +120,14 @@ func TestHandleCommand(t *testing.T) { func TestHandleRadar(t *testing.T) { s := NewServer() s.Initialise(false) // Spawn a clean world - a, err := s.accountant.RegisterAccount("test") + reg := accounts.RegisterInfo{Name: "test"} + acc, err := s.accountant.Register(context.Background(), ®) + assert.NoError(t, err) + assert.True(t, acc.Success) assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - attrib, id, err := s.SpawnRoverForAccount(a.Name) + attrib, id, err := s.SpawnRoverForAccount("test") assert.NoError(t, err) // Warp this rover to 0,0 @@ -134,7 +143,7 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) assert.NoError(t, s.world.Atlas.SetTile(emptyPos, game.TileEmpty)) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Name, "/radar"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", "test", "/radar"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -168,14 +177,16 @@ func TestHandleRadar(t *testing.T) { func TestHandleRover(t *testing.T) { s := NewServer() s.Initialise(true) - a, err := s.accountant.RegisterAccount("test") - assert.NoError(t, err, "Error registering account") + reg := accounts.RegisterInfo{Name: "test"} + acc, err := s.accountant.Register(context.Background(), ®) + assert.NoError(t, err) + assert.True(t, acc.Success) // Spawn one rover for the account - attribs, _, err := s.SpawnRoverForAccount(a.Name) + attribs, _, err := s.SpawnRoverForAccount("test") assert.NoError(t, err) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", a.Name, "/rover"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", "test", "/rover"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index bd9f8e3..e6f79a7 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -3,6 +3,7 @@ package internal import ( "context" "encoding/json" + "flag" "fmt" "log" "net" @@ -16,8 +17,11 @@ import ( "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" "github.com/robfig/cron" + "google.golang.org/grpc" ) +var accountantAddress = flag.String("accountant", "", "address of the accountant to connect to") + const ( // PersistentData will allow the server to load and save it's state PersistentData = iota @@ -30,8 +34,11 @@ const ( type Server struct { // Internal state - accountant *accounts.Accountant - world *game.World + world *game.World + + // Accountant server + accountant accounts.AccountantClient + clientConn *grpc.ClientConn // HTTP server listener net.Listener @@ -96,9 +103,6 @@ func NewServer(opts ...ServerOption) *Server { // Set up the server object s.server = &http.Server{Addr: s.address, Handler: s.router} - // Create the accountant - s.accountant = accounts.NewAccountant() - // Start small, we can grow the world later s.world = game.NewWorld(4, 8) @@ -111,13 +115,21 @@ func (s *Server) Initialise(fillWorld bool) (err error) { // Add to our sync s.sync.Add(1) + // Connect to the accountant + fmt.Printf("Dialing accountant on %s\n", *accountantAddress) + clientConn, err := grpc.Dial(*accountantAddress, grpc.WithInsecure()) + if err != nil { + return err + } + s.accountant = accounts.NewAccountantClient(clientConn) + // Spawn a border on the default world if err := s.world.SpawnWorld(fillWorld); err != nil { return err } - // Load the accounts if requested - if err := s.LoadAll(); err != nil { + // Load the world file + if err := s.LoadWorld(); err != nil { return err } @@ -183,6 +195,11 @@ func (s *Server) Stop() error { return err } + // Close the accountant connection + if err := s.clientConn.Close(); err != nil { + return err + } + return nil } @@ -192,7 +209,7 @@ func (s *Server) Close() error { s.sync.Wait() // Save and return - return s.SaveAll() + return s.SaveWorld() } // Close waits until the server is finished and closes up shop @@ -218,36 +235,12 @@ func (s *Server) SaveWorld() error { return nil } -// SaveAccounts will save out the accounts file -func (s *Server) SaveAccounts() error { - if s.persistence == PersistentData { - if err := persistence.SaveAll("accounts", s.accountant); err != nil { - return fmt.Errorf("failed to save out persistent data: %s", err) - } - } - return nil -} - -// SaveAll will save out all server files -func (s *Server) SaveAll() error { - // Save the accounts if requested - if s.persistence == PersistentData { - s.world.RLock() - defer s.world.RUnlock() - - if err := persistence.SaveAll("accounts", s.accountant, "world", s.world); err != nil { - return err - } - } - return nil -} - -// LoadAll will load all persistent data -func (s *Server) LoadAll() error { +// LoadWorld will load all persistent data +func (s *Server) LoadWorld() error { if s.persistence == PersistentData { s.world.Lock() defer s.world.Unlock() - if err := persistence.LoadAll("accounts", &s.accountant, "world", &s.world); err != nil { + if err := persistence.LoadAll("world", &s.world); err != nil { return err } } @@ -289,7 +282,11 @@ func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uui return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover: %s", err) } else { - if err := s.accountant.AssignData(account, "rover", inst.String()); err != nil { + keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst.String()} + resp, err := s.accountant.AssignValue(context.Background(), &keyval) + if err != nil || !resp.Success { + fmt.Printf("Failed to assign rover to account, %s, %s", err, resp.Error) + // Try and clear up the rover if err := s.world.DestroyRover(inst); err != nil { fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index f744410..55bf81f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -113,6 +113,9 @@ func InnerMain(command string) error { } case "register": + if len(*name) == 0 { + return fmt.Errorf("must set name with -name") + } d := rove.RegisterData{ Name: *name, } @@ -125,8 +128,8 @@ func InnerMain(command string) error { return fmt.Errorf("Server returned failure: %s", response.Error) default: - fmt.Printf("Registered account with id: %s\n", d.Name) - config.Accounts[config.Host] = d.Name + fmt.Printf("Registered account with id: %s\n", *name) + config.Accounts[config.Host] = *name } case "move": diff --git a/docker-compose.yml b/docker-compose.yml index bdb69e6..f76a0a2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,17 @@ services: image: rove-server:latest ports: - "80:80" - command: ./rove-server --address ":80" --data=/mnt/rove-server ${ROVE_ARGS} + command: ./rove-server --address ":80" --data=/mnt/rove-server ${ROVE_ARGS} --accountant "rove-accountant:8081" + volumes: + - persistent-data:/mnt/rove-server:rw + + rove-accountant: + build: + context: . + dockerfile: cmd/rove-accountant/Dockerfile + image: rove-accountant:latest + ports: + - "8081:8081" + command: ./rove-accountant --address ":8081" --data=/mnt/rove-server volumes: - persistent-data:/mnt/rove-server:rw diff --git a/go.mod b/go.mod index 6d4da8d..e77c0d4 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,11 @@ module github.com/mdiluz/rove go 1.14 require ( + github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d + google.golang.org/grpc v1.29.1 ) diff --git a/go.sum b/go.sum index 1ae6bb1..ecf232d 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,36 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -13,6 +38,49 @@ github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgh github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d h1:b7oHBI6TgTdCDuqTijsVldzlh+6cfQpdYLz1EKtCAoY= github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d/go.mod h1:O5hBrCGqzfb+8WyY8ico2AyQau7XQwAfEQeEQ5/5V9E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/accounts/accounts.pb.go b/pkg/accounts/accounts.pb.go new file mode 100644 index 0000000..e24821a --- /dev/null +++ b/pkg/accounts/accounts.pb.go @@ -0,0 +1,503 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: accounts.proto + +package accounts + +import ( + context "context" + fmt "fmt" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type RegisterInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RegisterInfo) Reset() { *m = RegisterInfo{} } +func (m *RegisterInfo) String() string { return proto.CompactTextString(m) } +func (*RegisterInfo) ProtoMessage() {} +func (*RegisterInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{0} +} + +func (m *RegisterInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RegisterInfo.Unmarshal(m, b) +} +func (m *RegisterInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RegisterInfo.Marshal(b, m, deterministic) +} +func (m *RegisterInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterInfo.Merge(m, src) +} +func (m *RegisterInfo) XXX_Size() int { + return xxx_messageInfo_RegisterInfo.Size(m) +} +func (m *RegisterInfo) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterInfo proto.InternalMessageInfo + +func (m *RegisterInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type RegisterResponse struct { + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RegisterResponse) Reset() { *m = RegisterResponse{} } +func (m *RegisterResponse) String() string { return proto.CompactTextString(m) } +func (*RegisterResponse) ProtoMessage() {} +func (*RegisterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{1} +} + +func (m *RegisterResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RegisterResponse.Unmarshal(m, b) +} +func (m *RegisterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RegisterResponse.Marshal(b, m, deterministic) +} +func (m *RegisterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterResponse.Merge(m, src) +} +func (m *RegisterResponse) XXX_Size() int { + return xxx_messageInfo_RegisterResponse.Size(m) +} +func (m *RegisterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterResponse proto.InternalMessageInfo + +func (m *RegisterResponse) GetSuccess() bool { + if m != nil { + return m.Success + } + return false +} + +func (m *RegisterResponse) GetError() string { + if m != nil { + return m.Error + } + return "" +} + +type DataKeyValue struct { + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DataKeyValue) Reset() { *m = DataKeyValue{} } +func (m *DataKeyValue) String() string { return proto.CompactTextString(m) } +func (*DataKeyValue) ProtoMessage() {} +func (*DataKeyValue) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{2} +} + +func (m *DataKeyValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DataKeyValue.Unmarshal(m, b) +} +func (m *DataKeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DataKeyValue.Marshal(b, m, deterministic) +} +func (m *DataKeyValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataKeyValue.Merge(m, src) +} +func (m *DataKeyValue) XXX_Size() int { + return xxx_messageInfo_DataKeyValue.Size(m) +} +func (m *DataKeyValue) XXX_DiscardUnknown() { + xxx_messageInfo_DataKeyValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DataKeyValue proto.InternalMessageInfo + +func (m *DataKeyValue) GetAccount() string { + if m != nil { + return m.Account + } + return "" +} + +func (m *DataKeyValue) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *DataKeyValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type Response struct { + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{3} +} + +func (m *Response) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Response.Unmarshal(m, b) +} +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Response.Marshal(b, m, deterministic) +} +func (m *Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Response.Merge(m, src) +} +func (m *Response) XXX_Size() int { + return xxx_messageInfo_Response.Size(m) +} +func (m *Response) XXX_DiscardUnknown() { + xxx_messageInfo_Response.DiscardUnknown(m) +} + +var xxx_messageInfo_Response proto.InternalMessageInfo + +func (m *Response) GetSuccess() bool { + if m != nil { + return m.Success + } + return false +} + +func (m *Response) GetError() string { + if m != nil { + return m.Error + } + return "" +} + +type DataKey struct { + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DataKey) Reset() { *m = DataKey{} } +func (m *DataKey) String() string { return proto.CompactTextString(m) } +func (*DataKey) ProtoMessage() {} +func (*DataKey) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{4} +} + +func (m *DataKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DataKey.Unmarshal(m, b) +} +func (m *DataKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DataKey.Marshal(b, m, deterministic) +} +func (m *DataKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataKey.Merge(m, src) +} +func (m *DataKey) XXX_Size() int { + return xxx_messageInfo_DataKey.Size(m) +} +func (m *DataKey) XXX_DiscardUnknown() { + xxx_messageInfo_DataKey.DiscardUnknown(m) +} + +var xxx_messageInfo_DataKey proto.InternalMessageInfo + +func (m *DataKey) GetAccount() string { + if m != nil { + return m.Account + } + return "" +} + +func (m *DataKey) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +type DataResponse struct { + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DataResponse) Reset() { *m = DataResponse{} } +func (m *DataResponse) String() string { return proto.CompactTextString(m) } +func (*DataResponse) ProtoMessage() {} +func (*DataResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e1e7723af4c007b7, []int{5} +} + +func (m *DataResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DataResponse.Unmarshal(m, b) +} +func (m *DataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DataResponse.Marshal(b, m, deterministic) +} +func (m *DataResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataResponse.Merge(m, src) +} +func (m *DataResponse) XXX_Size() int { + return xxx_messageInfo_DataResponse.Size(m) +} +func (m *DataResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DataResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_DataResponse proto.InternalMessageInfo + +func (m *DataResponse) GetSuccess() bool { + if m != nil { + return m.Success + } + return false +} + +func (m *DataResponse) GetError() string { + if m != nil { + return m.Error + } + return "" +} + +func (m *DataResponse) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func init() { + proto.RegisterType((*RegisterInfo)(nil), "accounts.RegisterInfo") + proto.RegisterType((*RegisterResponse)(nil), "accounts.RegisterResponse") + proto.RegisterType((*DataKeyValue)(nil), "accounts.DataKeyValue") + proto.RegisterType((*Response)(nil), "accounts.Response") + proto.RegisterType((*DataKey)(nil), "accounts.DataKey") + proto.RegisterType((*DataResponse)(nil), "accounts.DataResponse") +} + +func init() { + proto.RegisterFile("accounts.proto", fileDescriptor_e1e7723af4c007b7) +} + +var fileDescriptor_e1e7723af4c007b7 = []byte{ + // 298 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x4f, 0x4b, 0xc3, 0x40, + 0x10, 0xc5, 0x8d, 0x55, 0x1b, 0xc7, 0x22, 0x75, 0x11, 0x09, 0x39, 0xc9, 0x8a, 0xe0, 0x29, 0x01, + 0x45, 0x04, 0xbd, 0xd8, 0x22, 0x88, 0x78, 0x91, 0x20, 0x1e, 0xbc, 0x6d, 0xe3, 0x18, 0x43, 0x9b, + 0xdd, 0xb0, 0x7f, 0x0a, 0xf5, 0xf3, 0xf9, 0xc1, 0x24, 0xbb, 0xd9, 0x1a, 0xac, 0x17, 0x7b, 0xdb, + 0x17, 0xe6, 0xf7, 0xe6, 0xcd, 0x4c, 0x60, 0x9f, 0xe5, 0xb9, 0x30, 0x5c, 0xab, 0xa4, 0x96, 0x42, + 0x0b, 0x12, 0x7a, 0x4d, 0x29, 0x0c, 0x32, 0x2c, 0x4a, 0xa5, 0x51, 0x3e, 0xf0, 0x77, 0x41, 0x08, + 0x6c, 0x71, 0x56, 0x61, 0x14, 0x1c, 0x07, 0x67, 0xbb, 0x99, 0x7d, 0xd3, 0x31, 0x0c, 0x7d, 0x4d, + 0x86, 0xaa, 0x16, 0x5c, 0x21, 0x89, 0xa0, 0xaf, 0x4c, 0x9e, 0xa3, 0x52, 0xb6, 0x34, 0xcc, 0xbc, + 0x24, 0x87, 0xb0, 0x8d, 0x52, 0x0a, 0x19, 0x6d, 0x5a, 0x0b, 0x27, 0xe8, 0x13, 0x0c, 0xee, 0x98, + 0x66, 0x8f, 0xb8, 0x78, 0x61, 0x33, 0x63, 0xf9, 0x36, 0x43, 0xdb, 0xca, 0x4b, 0x32, 0x84, 0xde, + 0x14, 0x17, 0x2d, 0xdd, 0x3c, 0x1b, 0xc7, 0x79, 0x03, 0x45, 0x3d, 0xe7, 0x68, 0x05, 0xbd, 0x86, + 0x70, 0xed, 0x34, 0x97, 0xd0, 0x6f, 0xd3, 0xfc, 0x27, 0x08, 0x7d, 0x76, 0x43, 0xac, 0xdb, 0xf6, + 0xef, 0x41, 0xce, 0xbf, 0x02, 0x80, 0x91, 0xeb, 0xc9, 0xb8, 0x26, 0xb7, 0xcd, 0x5c, 0x6e, 0xdb, + 0xe4, 0x28, 0x59, 0x1e, 0xae, 0x7b, 0xa5, 0x38, 0x5e, 0xfd, 0xee, 0x43, 0xd1, 0x0d, 0x72, 0x03, + 0x7b, 0x23, 0xa5, 0xca, 0x82, 0xbb, 0x55, 0x77, 0x4c, 0xba, 0x27, 0x88, 0x49, 0xd7, 0x64, 0x09, + 0x5f, 0x41, 0x78, 0x8f, 0xda, 0x91, 0x07, 0x2b, 0x64, 0xfc, 0xcb, 0xec, 0x07, 0x1c, 0x9f, 0xbe, + 0x9e, 0x14, 0xa5, 0xfe, 0x30, 0x93, 0x24, 0x17, 0x55, 0x5a, 0xbd, 0x95, 0x33, 0xf3, 0x99, 0x4a, + 0x31, 0xc7, 0xb4, 0x9e, 0x16, 0xa9, 0xa7, 0x26, 0x3b, 0xf6, 0x0f, 0xbc, 0xf8, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0xef, 0x53, 0xc6, 0xba, 0x93, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// AccountantClient is the client API for Accountant service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type AccountantClient interface { + Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) + AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*Response, error) + GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) +} + +type accountantClient struct { + cc grpc.ClientConnInterface +} + +func NewAccountantClient(cc grpc.ClientConnInterface) AccountantClient { + return &accountantClient{cc} +} + +func (c *accountantClient) Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) { + out := new(RegisterResponse) + err := c.cc.Invoke(ctx, "/accounts.Accountant/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountantClient) AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*Response, error) { + out := new(Response) + err := c.cc.Invoke(ctx, "/accounts.Accountant/AssignValue", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountantClient) GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) { + out := new(DataResponse) + err := c.cc.Invoke(ctx, "/accounts.Accountant/GetValue", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AccountantServer is the server API for Accountant service. +type AccountantServer interface { + Register(context.Context, *RegisterInfo) (*RegisterResponse, error) + AssignValue(context.Context, *DataKeyValue) (*Response, error) + GetValue(context.Context, *DataKey) (*DataResponse, error) +} + +// UnimplementedAccountantServer can be embedded to have forward compatible implementations. +type UnimplementedAccountantServer struct { +} + +func (*UnimplementedAccountantServer) Register(ctx context.Context, req *RegisterInfo) (*RegisterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (*UnimplementedAccountantServer) AssignValue(ctx context.Context, req *DataKeyValue) (*Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method AssignValue not implemented") +} +func (*UnimplementedAccountantServer) GetValue(ctx context.Context, req *DataKey) (*DataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetValue not implemented") +} + +func RegisterAccountantServer(s *grpc.Server, srv AccountantServer) { + s.RegisterService(&_Accountant_serviceDesc, srv) +} + +func _Accountant_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterInfo) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountantServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/accounts.Accountant/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountantServer).Register(ctx, req.(*RegisterInfo)) + } + return interceptor(ctx, in, info, handler) +} + +func _Accountant_AssignValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DataKeyValue) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountantServer).AssignValue(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/accounts.Accountant/AssignValue", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountantServer).AssignValue(ctx, req.(*DataKeyValue)) + } + return interceptor(ctx, in, info, handler) +} + +func _Accountant_GetValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DataKey) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountantServer).GetValue(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/accounts.Accountant/GetValue", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountantServer).GetValue(ctx, req.(*DataKey)) + } + return interceptor(ctx, in, info, handler) +} + +var _Accountant_serviceDesc = grpc.ServiceDesc{ + ServiceName: "accounts.Accountant", + HandlerType: (*AccountantServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Register", + Handler: _Accountant_Register_Handler, + }, + { + MethodName: "AssignValue", + Handler: _Accountant_AssignValue_Handler, + }, + { + MethodName: "GetValue", + Handler: _Accountant_GetValue_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "accounts.proto", +} diff --git a/pkg/accounts/accounts.proto b/pkg/accounts/accounts.proto new file mode 100644 index 0000000..be972de --- /dev/null +++ b/pkg/accounts/accounts.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +option go_package = "github.com/mdiluz/rove/pkg/accounts"; + +package accounts; + +service Accountant { + rpc Register(RegisterInfo) returns (RegisterResponse) {} + rpc AssignValue(DataKeyValue) returns (Response) {} + rpc GetValue(DataKey) returns (DataResponse) {} +} + +message RegisterInfo { + string name = 1; +} + +message RegisterResponse { + bool success = 1; + string error = 2; +} + +message DataKeyValue { + string account = 1; + string key = 2; + string value = 3; +} + +message Response { + bool success = 1; + string error = 2; +} + +message DataKey { + string account = 1; + string key = 2; +} + +message DataResponse { + bool success = 1; + string error = 2; + + string value = 3; +} From 14424c16caf71283d7e26305623b1a7e1b63bd4d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 18:16:11 +0100 Subject: [PATCH 177/495] Refactor testing into docker file This means a decent scale refactor but ends with our testing being much simpler Key changes: * single Dockerfile for all services * tests moved into docker up so don't need to be run locally * configurations moved to environment --- cmd/rove-server/Dockerfile => Dockerfile | 4 +- Makefile | 21 ++-------- cmd/rove-accountant/Dockerfile | 11 ------ cmd/rove-accountant/main.go | 17 ++++---- cmd/rove-server/internal/api_test.go | 34 ++++++---------- cmd/rove-server/internal/routes.go | 18 +++++++-- cmd/rove-server/internal/routes_test.go | 35 ++++++++++------- cmd/rove-server/internal/server.go | 11 +++--- cmd/rove-server/main.go | 31 +++++++++++---- cmd/rove/main_test.go | 10 ++++- docker-compose.yml | 49 +++++++++++++++++------- go.mod | 1 + go.sum | 36 +++++++++++++++++ 13 files changed, 171 insertions(+), 107 deletions(-) rename cmd/rove-server/Dockerfile => Dockerfile (57%) delete mode 100644 cmd/rove-accountant/Dockerfile diff --git a/cmd/rove-server/Dockerfile b/Dockerfile similarity index 57% rename from cmd/rove-server/Dockerfile rename to Dockerfile index 7ca6727..adedc9b 100644 --- a/cmd/rove-server/Dockerfile +++ b/Dockerfile @@ -6,9 +6,11 @@ COPY . . RUN go mod download # For /usr/share/dict/words -RUN apt-get update && apt-get install -y wamerican +RUN apt-get -q update && apt-get -qy install wamerican +# Build both executables RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go +RUN go build -o rove-accountant -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-accountant/main.go CMD [ "./rove-server" ] diff --git a/Makefile b/Makefile index 1a4514c..5c56b8e 100644 --- a/Makefile +++ b/Makefile @@ -12,22 +12,9 @@ gen: protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto test: - go mod download - go build ./... + docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit - # Run the server and shut it down again to ensure our docker-compose works - ROVE_ARGS="--quit 1" docker-compose up --build --exit-code-from=rove-server --abort-on-container-exit + # TODO: Collect and convert the coverage data to html + # go tool cover -html=/tmp/c.out -o /tmp/coverage.html - # Run the server and shut it down again to ensure our docker-compose works - docker-compose up -d - - # Run tests with coverage and integration tags - go test -v ./... --tags=integration -cover -coverprofile=/tmp/c.out -count 1 - - # - docker-compose down - - # Convert the coverage data to html - go tool cover -html=/tmp/c.out -o /tmp/coverage.html - -.PHONY: install test \ No newline at end of file +.PHONY: install test diff --git a/cmd/rove-accountant/Dockerfile b/cmd/rove-accountant/Dockerfile deleted file mode 100644 index cb8ca13..0000000 --- a/cmd/rove-accountant/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM golang:latest -LABEL maintainer="Marc Di Luzio " - -WORKDIR /app -COPY . . -RUN go mod download - -RUN go build -o rove-accountant -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-accountant/main.go - -CMD [ "./rove-accountant" ] - diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index bf6539b..0d204cd 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "flag" "fmt" "log" "net" @@ -17,8 +16,8 @@ import ( "google.golang.org/grpc" ) -var address = flag.String("address", "", "port to server the accountant on") -var data = flag.String("data", os.TempDir(), "path to persistent data") +var address = os.Getenv("HOST_ADDRESS") +var data = os.Getenv("DATA_PATH") // accountantServer is the internal object to manage the requests type accountantServer struct { @@ -83,14 +82,12 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a // main func main() { - flag.Parse() - // Verify the input - if len(*address) == 0 { - log.Fatal("No address set with --address") + if len(address) == 0 { + log.Fatal("No address set with $HOST_ADDRESS") } - persistence.SetPath(*data) + persistence.SetPath(data) // Initialise and load the accountant accountant := &internal.Accountant{} @@ -99,7 +96,7 @@ func main() { } // Set up the RPC server and register - lis, err := net.Listen("tcp", *address) + lis, err := net.Listen("tcp", address) if err != nil { log.Fatalf("failed to listen: %v", err) } @@ -118,7 +115,7 @@ func main() { }() // Serve the RPC server - fmt.Printf("Serving accountant on %s\n", *address) + fmt.Printf("Serving accountant on %s\n", address) if err := grpcServer.Serve(lis); err != nil { log.Fatalf("failed to server gRPC: %s", err) } diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go index 3e6a0c1..8a0c0c7 100644 --- a/cmd/rove-server/internal/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -1,7 +1,8 @@ +// +build integration + package internal import ( - "fmt" "os" "testing" @@ -11,30 +12,17 @@ import ( "github.com/stretchr/testify/assert" ) -// To be set by the main function -var serv rove.Server +const ( + defaultAddress = "localhost:80" +) -func TestMain(m *testing.M) { - s := NewServer() - if err := s.Initialise(true); err != nil { - fmt.Println(err) - os.Exit(1) +var serv = func() rove.Server { + var address = os.Getenv("ROVE_SERVER_ADDRESS") + if len(address) == 0 { + address = defaultAddress } - - serv = rove.Server(s.Addr()) - - go s.Run() - - fmt.Printf("Test server hosted on %s", serv) - code := m.Run() - - if err := s.StopAndClose(); err != nil { - fmt.Println(err) - os.Exit(1) - } - - os.Exit(code) -} + return rove.Server(address) +}() func TestServer_Status(t *testing.T) { status, err := serv.Status() diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index b56b31c..30e30cb 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -6,11 +6,13 @@ import ( "fmt" "io" "net/http" + "time" "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" + "google.golang.org/grpc" ) // Handler describes a function that handles any incoming request and can respond @@ -87,8 +89,10 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri response.Error = "Cannot register empty name" } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() reg := accounts.RegisterInfo{Name: data.Name} - if acc, err := s.accountant.Register(context.Background(), ®); err != nil { + if acc, err := s.accountant.Register(ctx, ®, grpc.WaitForReady(true)); err != nil { response.Error = err.Error() } else if !acc.Success { @@ -125,11 +129,13 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { response.Error = "No account ID provided" - } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { + } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) } else if !resp.Success { @@ -155,12 +161,14 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer Success: false, } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() id := vars["account"] key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { response.Error = "No account ID provided" - } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { + } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) } else if !resp.Success { @@ -191,12 +199,14 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer Success: false, } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() id := vars["account"] key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { response.Error = "No account ID provided" - } else if resp, err := s.accountant.GetValue(context.Background(), &key); err != nil { + } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { response.Error = fmt.Sprintf("Provided account has no rover: %s", err) } else if !resp.Success { diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index 78fd4bd..dd0f2fe 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -1,3 +1,5 @@ +// +build integration + package internal import ( @@ -9,6 +11,7 @@ import ( "path" "testing" + "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" @@ -39,7 +42,7 @@ func TestHandleStatus(t *testing.T) { } func TestHandleRegister(t *testing.T) { - data := rove.RegisterData{Name: "one"} + data := rove.RegisterData{Name: uuid.New().String()} b, err := json.Marshal(data) if err != nil { t.Error(err) @@ -57,22 +60,24 @@ func TestHandleRegister(t *testing.T) { json.NewDecoder(response.Body).Decode(&status) if status.Success != true { - t.Errorf("got false for /register") + t.Errorf("got false for /register: %s", status.Error) } } func TestHandleCommand(t *testing.T) { + name := uuid.New().String() s := NewServer() s.Initialise(false) // Leave the world empty with no obstacles - reg := accounts.RegisterInfo{Name: "test"} + reg := accounts.RegisterInfo{Name: name} acc, err := s.accountant.Register(context.Background(), ®) assert.NoError(t, err) - assert.True(t, acc.Success) + assert.NotNil(t, acc) + assert.True(t, acc.Success, acc.Error) assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - _, inst, err := s.SpawnRoverForAccount("test") + _, inst, err := s.SpawnRoverForAccount(name) assert.NoError(t, s.world.WarpRover(inst, vector.Vector{})) attribs, err := s.world.RoverAttributes(inst) @@ -91,7 +96,7 @@ func TestHandleCommand(t *testing.T) { b, err := json.Marshal(data) assert.NoError(t, err, "Error marshalling data") - request, _ := http.NewRequest(http.MethodPost, path.Join("/", "test", "/command"), bytes.NewReader(b)) + request, _ := http.NewRequest(http.MethodPost, path.Join("/", name, "/command"), bytes.NewReader(b)) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -118,16 +123,17 @@ func TestHandleCommand(t *testing.T) { } func TestHandleRadar(t *testing.T) { + name := uuid.New().String() s := NewServer() s.Initialise(false) // Spawn a clean world - reg := accounts.RegisterInfo{Name: "test"} + reg := accounts.RegisterInfo{Name: name} acc, err := s.accountant.Register(context.Background(), ®) assert.NoError(t, err) - assert.True(t, acc.Success) + assert.True(t, acc.Success, acc.Error) assert.NoError(t, err, "Error registering account") // Spawn the rover rover for the account - attrib, id, err := s.SpawnRoverForAccount("test") + attrib, id, err := s.SpawnRoverForAccount(name) assert.NoError(t, err) // Warp this rover to 0,0 @@ -143,7 +149,7 @@ func TestHandleRadar(t *testing.T) { assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) assert.NoError(t, s.world.Atlas.SetTile(emptyPos, game.TileEmpty)) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", "test", "/radar"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", name, "/radar"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) @@ -175,18 +181,19 @@ func TestHandleRadar(t *testing.T) { } func TestHandleRover(t *testing.T) { + name := uuid.New().String() s := NewServer() s.Initialise(true) - reg := accounts.RegisterInfo{Name: "test"} + reg := accounts.RegisterInfo{Name: name} acc, err := s.accountant.Register(context.Background(), ®) assert.NoError(t, err) - assert.True(t, acc.Success) + assert.True(t, acc.Success, acc.Error) // Spawn one rover for the account - attribs, _, err := s.SpawnRoverForAccount("test") + attribs, _, err := s.SpawnRoverForAccount(name) assert.NoError(t, err) - request, _ := http.NewRequest(http.MethodGet, path.Join("/", "test", "/rover"), nil) + request, _ := http.NewRequest(http.MethodGet, path.Join("/", name, "/rover"), nil) response := httptest.NewRecorder() s.router.ServeHTTP(response, request) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index e6f79a7..706a188 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -3,11 +3,11 @@ package internal import ( "context" "encoding/json" - "flag" "fmt" "log" "net" "net/http" + "os" "sync" "time" @@ -20,7 +20,7 @@ import ( "google.golang.org/grpc" ) -var accountantAddress = flag.String("accountant", "", "address of the accountant to connect to") +var accountantAddress = os.Getenv("ACCOUNTANT_ADDRESS") const ( // PersistentData will allow the server to load and save it's state @@ -116,12 +116,12 @@ func (s *Server) Initialise(fillWorld bool) (err error) { s.sync.Add(1) // Connect to the accountant - fmt.Printf("Dialing accountant on %s\n", *accountantAddress) - clientConn, err := grpc.Dial(*accountantAddress, grpc.WithInsecure()) + fmt.Printf("Dialing accountant on %s\n", accountantAddress) + s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) if err != nil { return err } - s.accountant = accounts.NewAccountantClient(clientConn) + s.accountant = accounts.NewAccountantClient(s.clientConn) // Spawn a border on the default world if err := s.world.SpawnWorld(fillWorld); err != nil { @@ -139,6 +139,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { } // Start the listen + fmt.Printf("Listening on %s\n", s.server.Addr) if s.listener, err = net.Listen("tcp", s.server.Addr); err != nil { return err } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 49ac614..c98ec9b 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -3,8 +3,10 @@ package main import ( "flag" "fmt" + "log" "os" "os/signal" + "strconv" "syscall" "time" @@ -15,9 +17,15 @@ import ( var ver = flag.Bool("version", false, "Display version number") var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") -var address = flag.String("address", "", "The address to host on, automatically selected if empty") -var data = flag.String("data", "", "Directory to store persistant data, no storage if empty") -var tick = flag.Int("tick", 5, "Number of minutes per server tick (0 for no tick)") + +// Address to host the server on, automatically selected if empty +var address = os.Getenv("HOST_ADDRESS") + +// Path for persistent storage +var data = os.Getenv("DATA_PATH") + +// The tick rate of the server in seconds +var tick = os.Getenv("TICK_RATE") func InnerMain() { flag.Parse() @@ -31,13 +39,23 @@ func InnerMain() { fmt.Printf("Initialising version %s...\n", version.Version) // Set the persistence path - persistence.SetPath(*data) + persistence.SetPath(data) + + // Convert the tick rate + tickRate := 5 + if len(tick) > 0 { + var err error + tickRate, err = strconv.Atoi(tick) + if err != nil { + log.Fatalf("TICK_RATE not set to valid int: %s", err) + } + } // Create the server data s := internal.NewServer( - internal.OptionAddress(*address), + internal.OptionAddress(address), internal.OptionPersistentData(), - internal.OptionTick(*tick)) + internal.OptionTick(tickRate)) // Initialise the server if err := s.Initialise(true); err != nil { @@ -74,6 +92,5 @@ func InnerMain() { } func main() { - flag.Parse() InnerMain() } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 2fd0a65..48d32be 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -12,9 +12,17 @@ import ( "github.com/stretchr/testify/assert" ) -var address = "localhost:80" +const ( + defaultAddress = "localhost:80" +) func Test_InnerMain(t *testing.T) { + + var address = os.Getenv("ROVE_SERVER_ADDRESS") + if len(address) == 0 { + address = defaultAddress + } + // Set up the flags to act locally and use a temporary file flag.Set("data", path.Join(os.TempDir(), uuid.New().String())) diff --git a/docker-compose.yml b/docker-compose.yml index f76a0a2..f99139a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,24 +4,45 @@ volumes: persistent-data: services: - rove-server: - build: - context: . - dockerfile: cmd/rove-server/Dockerfile - image: rove-server:latest - ports: - - "80:80" - command: ./rove-server --address ":80" --data=/mnt/rove-server ${ROVE_ARGS} --accountant "rove-accountant:8081" - volumes: - - persistent-data:/mnt/rove-server:rw - rove-accountant: build: context: . - dockerfile: cmd/rove-accountant/Dockerfile - image: rove-accountant:latest + dockerfile: Dockerfile + image: rove:latest ports: - "8081:8081" - command: ./rove-accountant --address ":8081" --data=/mnt/rove-server + environment: + - HOST_ADDRESS=:8081 + - DATA_PATH=/mnt/rove-server volumes: - persistent-data:/mnt/rove-server:rw + command: [ ./rove-accountant ] + + rove-server: + depends_on: [ rove-accountant ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + ports: + - "80:80" + environment: + - HOST_ADDRESS=:80 + - DATA_PATH=/mnt/rove-server + - ACCOUNTANT_ADDRESS=rove-accountant:8081 + volumes: + - persistent-data:/mnt/rove-server:rw + + rove-tests: + depends_on: [ rove-server ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + environment: + - ACCOUNTANT_ADDRESS=rove-accountant:8081 + - ROVE_SERVER_ADDRESS=rove-server:80 + command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/tmp/c.out", "-count", "1" ] + + + diff --git a/go.mod b/go.mod index e77c0d4..973e0a5 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 + github.com/onsi/ginkgo v1.12.3 // indirect github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d diff --git a/go.sum b/go.sum index ecf232d..499b4f0 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,9 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -23,11 +26,22 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.12.3 h1:+RYp9QczoWz9zfUyLP/5SLXQVhfr6gZOoKGfQqHuLZQ= +github.com/onsi/ginkgo v1.12.3/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -45,22 +59,37 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -79,7 +108,14 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 7d1a2d7efd12e0d3c102acd117abb67a9c8e477c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 18:27:19 +0100 Subject: [PATCH 178/495] Fix crash with fresh data --- cmd/rove-accountant/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index 0d204cd..c708ac3 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -90,7 +90,7 @@ func main() { persistence.SetPath(data) // Initialise and load the accountant - accountant := &internal.Accountant{} + accountant := internal.NewAccountant() if err := persistence.Load("accounts", accountant); err != nil { log.Fatalf("failed to load account data: %s", err) } From 537d30923594562003c009198902e2c5d3cb27d7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 18:38:18 +0100 Subject: [PATCH 179/495] Add creation time to new accounts --- cmd/rove-accountant/internal/accounts.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/rove-accountant/internal/accounts.go b/cmd/rove-accountant/internal/accounts.go index d24e369..f8cb625 100644 --- a/cmd/rove-accountant/internal/accounts.go +++ b/cmd/rove-accountant/internal/accounts.go @@ -2,6 +2,7 @@ package internal import ( "fmt" + "time" ) const kAccountsFileName = "rove-accounts.json" @@ -45,6 +46,9 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { } } + // Set the creation time + acc.Data["created"] = time.Now().String() + // Simply add the account to the map a.Accounts[acc.Name] = acc From 223c50228e304079eeef97b4c5b09d553b64db91 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 18:38:34 +0100 Subject: [PATCH 180/495] Add comments to the accounts proto file --- pkg/accounts/accounts.pb.go | 31 +++++++++++++++++++++++++++---- pkg/accounts/accounts.proto | 23 +++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/pkg/accounts/accounts.pb.go b/pkg/accounts/accounts.pb.go index e24821a..f3f33b9 100644 --- a/pkg/accounts/accounts.pb.go +++ b/pkg/accounts/accounts.pb.go @@ -24,7 +24,9 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +// RegisterInfo contains the information needed to register an account type RegisterInfo struct { + // The name for the account, must be unique Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -63,7 +65,9 @@ func (m *RegisterInfo) GetName() string { return "" } +// RegisterResponse is the response information from registering an account type RegisterResponse struct { + // The error value should only be populated if success is false Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -110,8 +114,11 @@ func (m *RegisterResponse) GetError() string { return "" } +// DataKeyValue represents a simple key value pair to assign to an account type DataKeyValue struct { - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The account to assign the new key value pair to + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The key value pair to assign Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -165,7 +172,9 @@ func (m *DataKeyValue) GetValue() string { return "" } +// Response is a simple response with success and error type Response struct { + // error should only be populated if success is false Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -212,8 +221,11 @@ func (m *Response) GetError() string { return "" } +// DataKey describes a simple key value with an account, for fetching type DataKey struct { - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The account to fetch data for + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The key to fetch Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -259,9 +271,12 @@ func (m *DataKey) GetKey() string { return "" } +// DataResponse describes a data fetch response type DataResponse struct { - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // error should only be populated if success is false + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // The value of the key Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -362,8 +377,12 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type AccountantClient interface { + // Register should create a new account in the database + // It will return an error if the account already exists Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) + // AssignValue assigns a key-value pair to an account, or overwrites an existing key AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*Response, error) + // GetValue will get the value for a key for an account GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) } @@ -404,8 +423,12 @@ func (c *accountantClient) GetValue(ctx context.Context, in *DataKey, opts ...gr // AccountantServer is the server API for Accountant service. type AccountantServer interface { + // Register should create a new account in the database + // It will return an error if the account already exists Register(context.Context, *RegisterInfo) (*RegisterResponse, error) + // AssignValue assigns a key-value pair to an account, or overwrites an existing key AssignValue(context.Context, *DataKeyValue) (*Response, error) + // GetValue will get the value for a key for an account GetValue(context.Context, *DataKey) (*DataResponse, error) } diff --git a/pkg/accounts/accounts.proto b/pkg/accounts/accounts.proto index be972de..90ba7e1 100644 --- a/pkg/accounts/accounts.proto +++ b/pkg/accounts/accounts.proto @@ -5,39 +5,62 @@ option go_package = "github.com/mdiluz/rove/pkg/accounts"; package accounts; service Accountant { + // Register should create a new account in the database + // It will return an error if the account already exists rpc Register(RegisterInfo) returns (RegisterResponse) {} + + // AssignValue assigns a key-value pair to an account, or overwrites an existing key rpc AssignValue(DataKeyValue) returns (Response) {} + + // GetValue will get the value for a key for an account rpc GetValue(DataKey) returns (DataResponse) {} } +// RegisterInfo contains the information needed to register an account message RegisterInfo { + // The name for the account, must be unique string name = 1; } +// RegisterResponse is the response information from registering an account message RegisterResponse { + // The error value should only be populated if success is false bool success = 1; string error = 2; } +// DataKeyValue represents a simple key value pair to assign to an account message DataKeyValue { + // The account to assign the new key value pair to string account = 1; + + // The key value pair to assign string key = 2; string value = 3; } +// Response is a simple response with success and error message Response { + // error should only be populated if success is false bool success = 1; string error = 2; } +// DataKey describes a simple key value with an account, for fetching message DataKey { + // The account to fetch data for string account = 1; + + // The key to fetch string key = 2; } +// DataResponse describes a data fetch response message DataResponse { + // error should only be populated if success is false bool success = 1; string error = 2; + // The value of the key string value = 3; } From 1cafd4f2ce42c2fc61bcdfb5f5bf92fa735373aa Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 18:55:53 +0100 Subject: [PATCH 181/495] Fix makefile and coverage output --- Makefile | 9 ++++----- docker-compose.yml | 4 +++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 5c56b8e..ac8fd5e 100644 --- a/Makefile +++ b/Makefile @@ -12,9 +12,8 @@ gen: protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto test: - docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit + docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests + go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html + @echo Done, coverage data can be found in /tmp/coverage.html - # TODO: Collect and convert the coverage data to html - # go tool cover -html=/tmp/c.out -o /tmp/coverage.html - -.PHONY: install test +.PHONY: build install test gen diff --git a/docker-compose.yml b/docker-compose.yml index f99139a..9eab597 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,7 +42,9 @@ services: environment: - ACCOUNTANT_ADDRESS=rove-accountant:8081 - ROVE_SERVER_ADDRESS=rove-server:80 - command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/tmp/c.out", "-count", "1" ] + command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] + volumes: + - /tmp/coverage-data:/mnt/coverage-data:rw From 2f5863b17ac25ae3679ffdf69efe201e3ebf8b7c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 19:04:53 +0100 Subject: [PATCH 182/495] Use log instead of fmt for logging Also fix up a few errors to lower case --- cmd/rove-accountant/internal/accounts.go | 2 +- cmd/rove-accountant/main.go | 18 +++++++++--------- cmd/rove-server/internal/routes.go | 13 +++++++------ cmd/rove-server/internal/server.go | 20 ++++++++++---------- cmd/rove-server/main.go | 9 ++++----- cmd/rove/main.go | 8 ++++---- pkg/bearing/bearing.go | 2 +- pkg/game/atlas.go | 2 +- pkg/game/world.go | 11 ++++++----- pkg/persistence/persistence.go | 11 ++++++----- 10 files changed, 49 insertions(+), 47 deletions(-) diff --git a/cmd/rove-accountant/internal/accounts.go b/cmd/rove-accountant/internal/accounts.go index f8cb625..5aecb47 100644 --- a/cmd/rove-accountant/internal/accounts.go +++ b/cmd/rove-accountant/internal/accounts.go @@ -42,7 +42,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Verify this acount isn't already registered for _, a := range a.Accounts { if a.Name == acc.Name { - return Account{}, fmt.Errorf("Account name already registered") + return Account{}, fmt.Errorf("account name already registered") } } diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index c708ac3..be71cfc 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -31,15 +31,15 @@ func (a *accountantServer) Register(ctx context.Context, in *accounts.RegisterIn defer a.sync.Unlock() // Try and register the account itself - fmt.Printf("Registering account: %s\n", in.Name) + log.Printf("Registering account: %s\n", in.Name) if _, err := a.accountant.RegisterAccount(in.Name); err != nil { - fmt.Printf("Error: %s\n", err) + log.Printf("Error: %s\n", err) return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("error registering account: %s", err)}, nil } // Save out the accounts if err := persistence.Save("accounts", a.accountant); err != nil { - fmt.Printf("Error: %s\n", err) + log.Printf("Error: %s\n", err) return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("failed to save accounts: %s", err)}, nil } @@ -52,10 +52,10 @@ func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyVa defer a.sync.RUnlock() // Try and assign the data - fmt.Printf("Assigning value for account %s: %s->%s\n", in.Account, in.Key, in.Value) + log.Printf("Assigning value for account %s: %s->%s\n", in.Account, in.Key, in.Value) err := a.accountant.AssignData(in.Account, in.Key, in.Value) if err != nil { - fmt.Printf("Error: %s\n", err) + log.Printf("Error: %s\n", err) return &accounts.Response{Success: false, Error: err.Error()}, nil } @@ -69,10 +69,10 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a defer a.sync.RUnlock() // Try and fetch the rover - fmt.Printf("Getting value for account %s: %s\n", in.Account, in.Key) + log.Printf("Getting value for account %s: %s\n", in.Account, in.Key) data, err := a.accountant.GetValue(in.Account, in.Key) if err != nil { - fmt.Printf("Error: %s\n", err) + log.Printf("Error: %s\n", err) return &accounts.DataResponse{Success: false, Error: err.Error()}, nil } @@ -110,12 +110,12 @@ func main() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - fmt.Println("Quit requested, exiting...") + log.Println("Quit requested, exiting...") grpcServer.Stop() }() // Serve the RPC server - fmt.Printf("Serving accountant on %s\n", address) + log.Printf("Serving accountant on %s\n", address) if err := grpcServer.Serve(lis); err != nil { log.Fatalf("failed to server gRPC: %s", err) } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 30e30cb..12fbd7a 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io" + "log" "net/http" "time" @@ -82,7 +83,7 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri var data rove.RegisterData err := json.NewDecoder(b).Decode(&data) if err != nil { - fmt.Printf("Failed to decode json: %s\n", err) + log.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() } else if len(data.Name) == 0 { @@ -109,7 +110,7 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri response.Success = true } - fmt.Printf("register response:%+v\n", response) + log.Printf("register response:%+v\n", response) return response, nil } @@ -124,7 +125,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ // Decode the commands, verify them and the account, and execute the commands var data rove.CommandData if err := json.NewDecoder(b).Decode(&data); err != nil { - fmt.Printf("Failed to decode json: %s\n", err) + log.Printf("Failed to decode json: %s\n", err) response.Error = err.Error() } @@ -151,7 +152,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ response.Success = true } - fmt.Printf("command response \taccount:%s\tresponse:%+v\n", id, response) + log.Printf("command response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } @@ -189,7 +190,7 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Success = true } - fmt.Printf("radar response \taccount:%s\tresponse:%+v\n", id, response) + log.Printf("radar response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } @@ -223,6 +224,6 @@ func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer response.Success = true } - fmt.Printf("rover response \taccount:%s\tresponse:%+v\n", id, response) + log.Printf("rover response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 706a188..b1d2277 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -116,7 +116,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { s.sync.Add(1) // Connect to the accountant - fmt.Printf("Dialing accountant on %s\n", accountantAddress) + log.Printf("Dialing accountant on %s\n", accountantAddress) s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) if err != nil { return err @@ -139,7 +139,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { } // Start the listen - fmt.Printf("Listening on %s\n", s.server.Addr) + log.Printf("Listening on %s\n", s.server.Addr) if s.listener, err = net.Listen("tcp", s.server.Addr); err != nil { return err } @@ -164,7 +164,7 @@ func (s *Server) Run() { s.sync.Add(1) defer s.sync.Done() - fmt.Println("Executing server tick") + log.Println("Executing server tick") // Run the command queues s.world.ExecuteCommandQueues() @@ -175,7 +175,7 @@ func (s *Server) Run() { log.Fatal(err) } s.schedule.Start() - fmt.Printf("First server tick scheduled for %s\n", s.schedule.Entries()[0].Next.Format("15:04:05")) + log.Printf("First server tick scheduled for %s\n", s.schedule.Entries()[0].Next.Format("15:04:05")) } // Serve the http requests @@ -252,7 +252,7 @@ func (s *Server) LoadWorld() error { func (s *Server) wrapHandler(method string, handler Handler) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { // Log the request - fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) + log.Printf("%s\t%s\n", r.Method, r.RequestURI) vars := mux.Vars(r) @@ -261,11 +261,11 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons w.WriteHeader(http.StatusMethodNotAllowed) } else if val, err := handler(s, vars, r.Body, w); err != nil { - fmt.Printf("Failed to handle http request: %s", err) + log.Printf("Failed to handle http request: %s", err) w.WriteHeader(http.StatusInternalServerError) } else if err := json.NewEncoder(w).Encode(val); err != nil { - fmt.Printf("Failed to encode reply to json: %s", err) + log.Printf("Failed to encode reply to json: %s", err) w.WriteHeader(http.StatusInternalServerError) } else { @@ -280,17 +280,17 @@ func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uui return game.RoverAttributes{}, uuid.UUID{}, err } else if attribs, err := s.world.RoverAttributes(inst); err != nil { - return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("No attributes found for created rover: %s", err) + return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("no attributes found for created rover: %s", err) } else { keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst.String()} resp, err := s.accountant.AssignValue(context.Background(), &keyval) if err != nil || !resp.Success { - fmt.Printf("Failed to assign rover to account, %s, %s", err, resp.Error) + log.Printf("Failed to assign rover to account, %s, %s", err, resp.Error) // Try and clear up the rover if err := s.world.DestroyRover(inst); err != nil { - fmt.Printf("Failed to destroy rover after failed rover assign: %s", err) + log.Printf("Failed to destroy rover after failed rover assign: %s", err) } return game.RoverAttributes{}, uuid.UUID{}, err diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index c98ec9b..53dba56 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -2,7 +2,6 @@ package main import ( "flag" - "fmt" "log" "os" "os/signal" @@ -32,11 +31,11 @@ func InnerMain() { // Print the version if requested if *ver { - fmt.Println(version.Version) + log.Println(version.Version) return } - fmt.Printf("Initialising version %s...\n", version.Version) + log.Printf("Initialising version %s...\n", version.Version) // Set the persistence path persistence.SetPath(data) @@ -67,7 +66,7 @@ func InnerMain() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - fmt.Println("Quit requested, exiting...") + log.Println("Quit requested, exiting...") if err := s.Stop(); err != nil { panic(err) } @@ -82,7 +81,7 @@ func InnerMain() { } // Run the server - fmt.Printf("Serving HTTP on %s\n", s.Addr()) + log.Printf("Serving HTTP on %s\n", s.Addr()) s.Run() // Close the server diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 55bf81f..dd2da53 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -125,7 +125,7 @@ func InnerMain(command string) error { return err case !response.Success: - return fmt.Errorf("Server returned failure: %s", response.Error) + return fmt.Errorf("server returned failure: %s", response.Error) default: fmt.Printf("Registered account with id: %s\n", *name) @@ -153,7 +153,7 @@ func InnerMain(command string) error { return err case !response.Success: - return fmt.Errorf("Server returned failure: %s", response.Error) + return fmt.Errorf("server returned failure: %s", response.Error) default: fmt.Printf("Request succeeded\n") @@ -170,7 +170,7 @@ func InnerMain(command string) error { return err case !response.Success: - return fmt.Errorf("Server returned failure: %s", response.Error) + return fmt.Errorf("server returned failure: %s", response.Error) default: // Print out the radar @@ -188,7 +188,7 @@ func InnerMain(command string) error { return err case !response.Success: - return fmt.Errorf("Server returned failure: %s", response.Error) + return fmt.Errorf("server returned failure: %s", response.Error) default: fmt.Printf("attributes: %+v\n", response.Attributes) diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 776255d..6eec327 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -56,7 +56,7 @@ func FromString(s string) (Bearing, error) { return Bearing(i), nil } } - return -1, fmt.Errorf("Unknown bearing: %s", s) + return -1, fmt.Errorf("unknown bearing: %s", s) } var bearingVectors = []vector.Vector{ diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index a1b4361..96dde68 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -174,7 +174,7 @@ func (a *Atlas) Grow(size int) error { } delta := size - a.Size if delta < 0 { - return fmt.Errorf("Cannot shrink an atlas") + return fmt.Errorf("cannot shrink an atlas") } else if delta == 0 { return nil } diff --git a/pkg/game/world.go b/pkg/game/world.go index f2a2f56..2913598 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "log" "math" "math/rand" "strings" @@ -101,7 +102,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { return uuid.Nil, err } - fmt.Printf("Spawned rover at %+v\n", rover.Attributes.Pos) + log.Printf("Spawned rover at %+v\n", rover.Attributes.Pos) // Append the rover to the list w.Rovers[rover.Id] = rover @@ -167,7 +168,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) } else if tile == TileRover { - return fmt.Errorf("Can't warp rover to occupied tile, check before warping") + return fmt.Errorf("can't warp rover to occupied tile, check before warping") } else if err := w.Atlas.SetTile(pos, TileRover); err != nil { return fmt.Errorf("coudln't set rover tile: %s", err) } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { @@ -328,7 +329,7 @@ func (w *World) ExecuteCommandQueues() { // Execute the command and clear up if requested if done, err := w.ExecuteCommand(&c, rover); err != nil { w.CommandQueue[rover] = cmds[1:] - fmt.Println(err) + log.Println(err) } else if done { w.CommandQueue[rover] = cmds[1:] } else { @@ -349,7 +350,7 @@ func (w *World) ExecuteCommandQueues() { // ExecuteCommand will execute a single command func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { - fmt.Printf("Executing command: %+v\n", *c) + log.Printf("Executing command: %+v\n", *c) switch c.Command { case "move": @@ -380,7 +381,7 @@ func PrintTiles(tiles []Tile) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { - fmt.Printf("%d", tiles[i+num*j]) + log.Printf("%d", tiles[i+num*j]) } fmt.Print("\n") } diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index 8fc5e5b..8bb2e9d 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "log" "os" "path" ) @@ -38,7 +39,7 @@ func Save(name string, data interface{}) error { } } - fmt.Printf("Saved %s\n", p) + log.Printf("Saved %s\n", p) return nil } @@ -48,7 +49,7 @@ func Load(name string, data interface{}) error { // Don't load anything if the file doesn't exist _, err := os.Stat(p) if os.IsNotExist(err) { - fmt.Printf("File %s didn't exist, loading with fresh data\n", p) + log.Printf("File %s didn't exist, loading with fresh data\n", p) return nil } @@ -56,13 +57,13 @@ func Load(name string, data interface{}) error { if b, err := ioutil.ReadFile(p); err != nil { return err } else if len(b) == 0 { - fmt.Printf("File %s was empty, loading with fresh data\n", p) + log.Printf("File %s was empty, loading with fresh data\n", p) return nil } else if err := json.Unmarshal(b, data); err != nil { return fmt.Errorf("failed to load file %s error: %s", p, err) } - fmt.Printf("Loaded %s\n", p) + log.Printf("Loaded %s\n", p) return nil } @@ -76,7 +77,7 @@ func doAll(f saveLoadFunc, args ...interface{}) error { var ok bool name, ok = a.(string) if !ok { - return fmt.Errorf("Incorrect args") + return fmt.Errorf("incorrect args") } } else { if err := f(name, a); err != nil { From 1a6bd8fed92399a2b73991ff42d39556354c33db Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:25:03 +0100 Subject: [PATCH 183/495] Add unit tests to the test target --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index ac8fd5e..7f64c81 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,13 @@ gen: protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto test: + @echo Unit tests + go test -v ./... + + @echo Integration tests docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html + @echo Done, coverage data can be found in /tmp/coverage.html .PHONY: build install test gen From bf88f9984b6a1e55ba1aa83b286c13787484a27f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:25:36 +0100 Subject: [PATCH 184/495] Add a "config" arg to the cmdline client --- cmd/rove/main.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index dd2da53..ca7a54f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -24,6 +24,7 @@ func Usage() { fmt.Fprintln(os.Stderr, "\tmove \tissues move command to rover") fmt.Fprintln(os.Stderr, "\tradar \tgathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\trover \tgets data for current rover") + fmt.Fprintln(os.Stderr, "\tconfig \toutputs the local config info") fmt.Fprintln(os.Stderr, "\nOptions:") flag.PrintDefaults() } @@ -94,9 +95,6 @@ func InnerMain(command string) error { // Grab the account var account = config.Accounts[config.Host] - // Print the config info - fmt.Printf("host: %s\taccount: %s\n", config.Host, account) - // Handle all the commands switch command { case "status": @@ -193,11 +191,14 @@ func InnerMain(command string) error { default: fmt.Printf("attributes: %+v\n", response.Attributes) } + case "config": + fmt.Printf("host: %s\taccount: %s\n", config.Host, account) default: // Print the usage - fmt.Fprintf(os.Stderr, "Unknown command: %s\n", command) + fmt.Fprintf(os.Stderr, "Error: unknown command %s\n", command) Usage() + os.Exit(1) } // Save out the persistent file @@ -213,6 +214,13 @@ func InnerMain(command string) error { // Simple main func main() { flag.Usage = Usage + + // Bail without any args + if len(os.Args) == 1 { + Usage() + os.Exit(1) + } + flag.CommandLine.Parse(os.Args[2:]) // Print the version if requested From 790e1464e53ab7f9089357f74f9d8d0f13c347d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:25:55 +0100 Subject: [PATCH 185/495] Remove time mechanics from the PoC stretch --- docs/poc.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/poc.md b/docs/poc.md index a11ddc6..ac8f6c8 100644 --- a/docs/poc.md +++ b/docs/poc.md @@ -17,7 +17,6 @@ For a proof of concept we'll implement a very small subset of the final features * Rover inventory * Rover internals -* Basic time mechanics * Basic survival mechanics ### Key missing features From de3c2b9134032afeba26b0f722ac9fb830b4eec4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:26:06 +0100 Subject: [PATCH 186/495] Fix printing the tile grid --- pkg/game/world.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 2913598..43bc6c1 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -381,7 +381,7 @@ func PrintTiles(tiles []Tile) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { - log.Printf("%d", tiles[i+num*j]) + fmt.Printf("%d", tiles[i+num*j]) } fmt.Print("\n") } From 8cd7b06c0cf3166fbdfa3d2f369bddf925c99643 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:34:30 +0100 Subject: [PATCH 187/495] Privatise Atlas functions that should only be internal --- pkg/game/atlas.go | 27 +++++++++++---------------- pkg/game/atlas_test.go | 26 +++++++++++++------------- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/pkg/game/atlas.go b/pkg/game/atlas.go index 96dde68..9030069 100644 --- a/pkg/game/atlas.go +++ b/pkg/game/atlas.go @@ -91,12 +91,12 @@ func (a *Atlas) SpawnWalls() error { // SetTile sets an individual tile's kind func (a *Atlas) SetTile(v vector.Vector, tile Tile) error { - chunk := a.ToChunk(v) + chunk := a.toChunk(v) if chunk >= len(a.Chunks) { return fmt.Errorf("location outside of allocated atlas") } - local := a.ToChunkLocal(v) + local := a.toChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize if tileId >= len(a.Chunks[chunk].Tiles) { return fmt.Errorf("location outside of allocated chunk") @@ -107,12 +107,12 @@ func (a *Atlas) SetTile(v vector.Vector, tile Tile) error { // GetTile will return an individual tile func (a *Atlas) GetTile(v vector.Vector) (Tile, error) { - chunk := a.ToChunk(v) + chunk := a.toChunk(v) if chunk >= len(a.Chunks) { return 0, fmt.Errorf("location outside of allocated atlas") } - local := a.ToChunkLocal(v) + local := a.toChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize if tileId >= len(a.Chunks[chunk].Tiles) { return 0, fmt.Errorf("location outside of allocated chunk") @@ -121,19 +121,14 @@ func (a *Atlas) GetTile(v vector.Vector) (Tile, error) { return a.Chunks[chunk].Tiles[tileId], nil } -// ToChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) ToChunkLocal(v vector.Vector) vector.Vector { +// toChunkLocal gets a chunk local coordinate for a tile +func (a *Atlas) toChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } -// GetChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) ToWorld(local vector.Vector, chunk int) vector.Vector { - return a.ChunkOrigin(chunk).Added(local) -} - // GetChunkID gets the chunk ID for a position in the world -func (a *Atlas) ToChunk(v vector.Vector) int { - local := a.ToChunkLocal(v) +func (a *Atlas) toChunk(v vector.Vector) int { + local := a.toChunkLocal(v) // Get the chunk origin itself origin := v.Added(local.Negated()) // Divided it by the number of chunks @@ -144,8 +139,8 @@ func (a *Atlas) ToChunk(v vector.Vector) int { return (a.Size * origin.Y) + origin.X } -// ChunkOrigin gets the chunk origin for a given chunk index -func (a *Atlas) ChunkOrigin(chunk int) vector.Vector { +// chunkOrigin gets the chunk origin for a given chunk index +func (a *Atlas) chunkOrigin(chunk int) vector.Vector { v := vector.Vector{ X: maths.Pmod(chunk, a.Size) - (a.Size / 2), Y: (chunk / a.Size) - (a.Size / 2), @@ -185,7 +180,7 @@ func (a *Atlas) Grow(size int) error { // Copy old chunks into new chunks for index, chunk := range a.Chunks { // Calculate the new chunk location and copy over the data - newAtlas.Chunks[newAtlas.ToChunk(a.ChunkOrigin(index))] = chunk + newAtlas.Chunks[newAtlas.toChunk(a.chunkOrigin(index))] = chunk } // Copy the new atlas data into this one diff --git a/pkg/game/atlas_test.go b/pkg/game/atlas_test.go index 7ee1034..5423617 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/game/atlas_test.go @@ -23,19 +23,19 @@ func TestAtlas_NewAtlas(t *testing.T) { assert.Equal(t, 16, len(a.Chunks)) } -func TestAtlas_ToChunk(t *testing.T) { +func TestAtlas_toChunk(t *testing.T) { a := NewAtlas(2, 1) assert.NotNil(t, a) // Tiles should look like: 2 | 3 // ----- // 0 | 1 - tile := a.ToChunk(vector.Vector{X: 0, Y: 0}) + tile := a.toChunk(vector.Vector{X: 0, Y: 0}) assert.Equal(t, 3, tile) - tile = a.ToChunk(vector.Vector{X: 0, Y: -1}) + tile = a.toChunk(vector.Vector{X: 0, Y: -1}) assert.Equal(t, 1, tile) - tile = a.ToChunk(vector.Vector{X: -1, Y: -1}) + tile = a.toChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 0, tile) - tile = a.ToChunk(vector.Vector{X: -1, Y: 0}) + tile = a.toChunk(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, tile) a = NewAtlas(2, 2) @@ -44,13 +44,13 @@ func TestAtlas_ToChunk(t *testing.T) { // 2 | 3 // ----- // 0 | 1 - tile = a.ToChunk(vector.Vector{X: 1, Y: 1}) + tile = a.toChunk(vector.Vector{X: 1, Y: 1}) assert.Equal(t, 3, tile) - tile = a.ToChunk(vector.Vector{X: 1, Y: -2}) + tile = a.toChunk(vector.Vector{X: 1, Y: -2}) assert.Equal(t, 1, tile) - tile = a.ToChunk(vector.Vector{X: -2, Y: -2}) + tile = a.toChunk(vector.Vector{X: -2, Y: -2}) assert.Equal(t, 0, tile) - tile = a.ToChunk(vector.Vector{X: -2, Y: 1}) + tile = a.toChunk(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, tile) a = NewAtlas(4, 2) @@ -63,13 +63,13 @@ func TestAtlas_ToChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - tile = a.ToChunk(vector.Vector{X: 1, Y: 3}) + tile = a.toChunk(vector.Vector{X: 1, Y: 3}) assert.Equal(t, 14, tile) - tile = a.ToChunk(vector.Vector{X: 1, Y: -3}) + tile = a.toChunk(vector.Vector{X: 1, Y: -3}) assert.Equal(t, 2, tile) - tile = a.ToChunk(vector.Vector{X: -1, Y: -1}) + tile = a.toChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 5, tile) - tile = a.ToChunk(vector.Vector{X: -2, Y: 2}) + tile = a.toChunk(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, tile) } From faaa556ad05a6fc920e576264e8a60f36ec8b79d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:42:59 +0100 Subject: [PATCH 188/495] Move the Atlas code into it's own package --- .vscode/settings.json | 5 +++++ cmd/rove-server/internal/routes_test.go | 19 ++++++++-------- pkg/{game => atlas}/atlas.go | 2 +- pkg/{game => atlas}/atlas_test.go | 2 +- pkg/{game => atlas}/tile.go | 2 +- pkg/game/world.go | 29 +++++++++++++------------ pkg/game/world_test.go | 15 +++++++------ pkg/rove/api.go | 5 +++-- 8 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 .vscode/settings.json rename pkg/{game => atlas}/atlas.go (99%) rename pkg/{game => atlas}/atlas_test.go (99%) rename pkg/{game => atlas}/tile.go (91%) diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b3be4a5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "gopls": { + "buildFlags": ["-tags=integration"] + }, +} \ No newline at end of file diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index dd0f2fe..e34b983 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -13,6 +13,7 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/vector" @@ -144,10 +145,10 @@ func TestHandleRadar(t *testing.T) { wallPos2 := vector.Vector{X: 1, Y: 1} rockPos := vector.Vector{X: 1, Y: 3} emptyPos := vector.Vector{X: -2, Y: -3} - assert.NoError(t, s.world.Atlas.SetTile(wallPos1, game.TileWall)) - assert.NoError(t, s.world.Atlas.SetTile(wallPos2, game.TileWall)) - assert.NoError(t, s.world.Atlas.SetTile(rockPos, game.TileRock)) - assert.NoError(t, s.world.Atlas.SetTile(emptyPos, game.TileEmpty)) + assert.NoError(t, s.world.Atlas.SetTile(wallPos1, atlas.TileWall)) + assert.NoError(t, s.world.Atlas.SetTile(wallPos2, atlas.TileWall)) + assert.NoError(t, s.world.Atlas.SetTile(rockPos, atlas.TileRock)) + assert.NoError(t, s.world.Atlas.SetTile(emptyPos, atlas.TileEmpty)) request, _ := http.NewRequest(http.MethodGet, path.Join("/", name, "/radar"), nil) response := httptest.NewRecorder() @@ -166,17 +167,17 @@ func TestHandleRadar(t *testing.T) { radarOrigin := vector.Vector{X: -attrib.Range, Y: -attrib.Range} // Make sure the rover tile is correct - assert.Equal(t, game.TileRover, status.Tiles[len(status.Tiles)/2]) + assert.Equal(t, atlas.TileRover, status.Tiles[len(status.Tiles)/2]) // Check our other tiles wallPos1.Add(radarOrigin.Negated()) wallPos2.Add(radarOrigin.Negated()) rockPos.Add(radarOrigin.Negated()) emptyPos.Add(radarOrigin.Negated()) - assert.Equal(t, game.TileWall, status.Tiles[wallPos1.X+wallPos1.Y*scope]) - assert.Equal(t, game.TileWall, status.Tiles[wallPos2.X+wallPos2.Y*scope]) - assert.Equal(t, game.TileRock, status.Tiles[rockPos.X+rockPos.Y*scope]) - assert.Equal(t, game.TileEmpty, status.Tiles[emptyPos.X+emptyPos.Y*scope]) + assert.Equal(t, atlas.TileWall, status.Tiles[wallPos1.X+wallPos1.Y*scope]) + assert.Equal(t, atlas.TileWall, status.Tiles[wallPos2.X+wallPos2.Y*scope]) + assert.Equal(t, atlas.TileRock, status.Tiles[rockPos.X+rockPos.Y*scope]) + assert.Equal(t, atlas.TileEmpty, status.Tiles[emptyPos.X+emptyPos.Y*scope]) } diff --git a/pkg/game/atlas.go b/pkg/atlas/atlas.go similarity index 99% rename from pkg/game/atlas.go rename to pkg/atlas/atlas.go index 9030069..66a2baa 100644 --- a/pkg/game/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,4 +1,4 @@ -package game +package atlas import ( "fmt" diff --git a/pkg/game/atlas_test.go b/pkg/atlas/atlas_test.go similarity index 99% rename from pkg/game/atlas_test.go rename to pkg/atlas/atlas_test.go index 5423617..a9c7021 100644 --- a/pkg/game/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -1,4 +1,4 @@ -package game +package atlas import ( "testing" diff --git a/pkg/game/tile.go b/pkg/atlas/tile.go similarity index 91% rename from pkg/game/tile.go rename to pkg/atlas/tile.go index 954f571..af44e87 100644 --- a/pkg/game/tile.go +++ b/pkg/atlas/tile.go @@ -1,4 +1,4 @@ -package game +package atlas // Tile represents the type of a tile on the map type Tile byte diff --git a/pkg/game/world.go b/pkg/game/world.go index 43bc6c1..29948ad 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -9,6 +9,7 @@ import ( "sync" "github.com/google/uuid" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/vector" @@ -21,7 +22,7 @@ type World struct { Rovers map[uuid.UUID]Rover `json:"rovers"` // Atlas represends the world map of chunks and tiles - Atlas Atlas `json:"atlas"` + Atlas atlas.Atlas `json:"atlas"` // Mutex to lock around all world operations worldMutex sync.RWMutex @@ -42,7 +43,7 @@ func NewWorld(size, chunkSize int) *World { Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), Incoming: make(map[uuid.UUID]CommandStream), - Atlas: NewAtlas(size, chunkSize), + Atlas: atlas.NewAtlas(size, chunkSize), } } @@ -88,7 +89,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { if tile, err := w.Atlas.GetTile(rover.Attributes.Pos); err != nil { return uuid.Nil, err } else { - if tile == TileEmpty { + if tile == atlas.TileEmpty { break } else { // Try and spawn to the east of the blockage @@ -98,7 +99,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { } // Set the world tile to a rover - if err := w.Atlas.SetTile(rover.Attributes.Pos, TileRover); err != nil { + if err := w.Atlas.SetTile(rover.Attributes.Pos, atlas.TileRover); err != nil { return uuid.Nil, err } @@ -117,7 +118,7 @@ func (w *World) DestroyRover(id uuid.UUID) error { if i, ok := w.Rovers[id]; ok { // Clear the tile - if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } delete(w.Rovers, id) @@ -167,11 +168,11 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { // Update the world tile if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) - } else if tile == TileRover { + } else if tile == atlas.TileRover { return fmt.Errorf("can't warp rover to occupied tile, check before warping") - } else if err := w.Atlas.SetTile(pos, TileRover); err != nil { + } else if err := w.Atlas.SetTile(pos, atlas.TileRover); err != nil { return fmt.Errorf("coudln't set rover tile: %s", err) - } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + } else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } @@ -201,11 +202,11 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) - } else if tile == TileEmpty { + } else if tile == atlas.TileEmpty { // Set the world tiles - if err := w.Atlas.SetTile(newPos, TileRover); err != nil { + if err := w.Atlas.SetTile(newPos, atlas.TileRover); err != nil { return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err) - } else if err := w.Atlas.SetTile(i.Attributes.Pos, TileEmpty); err != nil { + } else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { return i.Attributes, fmt.Errorf("coudln't clear old rover tile: %s", err) } @@ -221,7 +222,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { +func (w *World) RadarFromRover(id uuid.UUID) ([]atlas.Tile, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -252,7 +253,7 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]Tile, error) { } // Gather up all tiles within the range - var radar = make([]Tile, radarSpan*radarSpan) + var radar = make([]atlas.Tile, radarSpan*radarSpan) for j := scanMin.Y; j <= scanMax.Y; j++ { for i := scanMin.X; i <= scanMax.X; i++ { q := vector.Vector{X: i, Y: j} @@ -377,7 +378,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err } // PrintTiles simply prints the input tiles directly for debug -func PrintTiles(tiles []Tile) { +func PrintTiles(tiles []atlas.Tile) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 186ee1e..c002442 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,6 +3,7 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" @@ -87,7 +88,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, TileWall)) + assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileWall)) newAttribs, err = world.MoveRover(a, b) assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") } @@ -134,12 +135,12 @@ func TestWorld_RadarFromRover(t *testing.T) { PrintTiles(radar) // Test all expected values - assert.Equal(t, TileRover, radar[1+fullRange]) - assert.Equal(t, TileRover, radar[4+4*fullRange]) + assert.Equal(t, atlas.TileRover, radar[1+fullRange]) + assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) for i := 0; i < 8; i++ { - assert.Equal(t, TileWall, radar[i]) - assert.Equal(t, TileWall, radar[i+(7*9)]) - assert.Equal(t, TileWall, radar[i*9]) - assert.Equal(t, TileWall, radar[(i*9)+7]) + assert.Equal(t, atlas.TileWall, radar[i]) + assert.Equal(t, atlas.TileWall, radar[i+(7*9)]) + assert.Equal(t, atlas.TileWall, radar[i*9]) + assert.Equal(t, atlas.TileWall, radar[(i*9)+7]) } } diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 8ecb108..007b8d1 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -3,6 +3,7 @@ package rove import ( "path" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/game" ) @@ -78,8 +79,8 @@ type RadarResponse struct { Error string `json:"error,omitempty"` // The set of positions for nearby non-empty tiles - Range int `json:"range"` - Tiles []game.Tile `json:"tiles"` + Range int `json:"range"` + Tiles []atlas.Tile `json:"tiles"` } // ================ From 6342d9dc4d7416db1bccd83429f9ab7a7dd20de3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 11 Jun 2020 20:47:45 +0100 Subject: [PATCH 189/495] Add TODO notes about hack with rovers in the atlas --- pkg/game/world.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index 29948ad..1880b74 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -99,6 +99,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { } // Set the world tile to a rover + // TODO: Don't do this, the atlas shouldn't know about rovers if err := w.Atlas.SetTile(rover.Attributes.Pos, atlas.TileRover); err != nil { return uuid.Nil, err } @@ -166,6 +167,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } // Update the world tile + // TODO: Don't do this, the atlas shouldn't know about rovers if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) } else if tile == atlas.TileRover { @@ -204,6 +206,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) } else if tile == atlas.TileEmpty { // Set the world tiles + // TODO: Don't do this, the atlas shouldn't know about rovers if err := w.Atlas.SetTile(newPos, atlas.TileRover); err != nil { return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err) } else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { From 30f8d666c350a4828422c737b64d8b27268bb098 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 17:22:55 +0100 Subject: [PATCH 190/495] Move the swagger yml to root --- swagger.yml | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 swagger.yml diff --git a/swagger.yml b/swagger.yml new file mode 100644 index 0000000..8a975df --- /dev/null +++ b/swagger.yml @@ -0,0 +1,232 @@ +swagger: "2.0" +info: + description: "Rove is an asychronous nomadic game about exploring a planet as part of a loose community" + version: "0.1" + title: "Rove Server" +host: "api.rove-game.com" +basePath: "/" +tags: +- name: "server" + description: "Interactions with the server itself" +- name: "accounts" + description: "Access to accounts" +- name: "rove" + description: "Operations for the game" +schemes: +- "http" +consumes: + - application/json +produces: + - application/json +paths: + /status: + get: + tags: + - "server" + summary: "Server status" + description: "Responds with various details about the current server status" + operationId: "Status" + responses: + "200": + description: "Server is active" + schema: + $ref: '#/definitions/status' + /register: + post: + tags: + - "accounts" + summary: "Register an account" + description: "Tries to register an account with the given name" + operationId: "Register" + parameters: + - in: body + name: name + schema: + $ref: '#/definitions/register-data' + responses: + "200": + description: "Successfully attempted to create account, check success value in body" + schema: + $ref: '#/definitions/register-response' + + /{account}/commands: + post: + tags: + - rove + summary: Send commands to rover + description: "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent" + operationId: "Commands" + parameters: + - in: path + name: account + required: true + type: string + - in: body + name: commands + schema: + $ref: '#/definitions/commands-data' + responses: + "200": + description: "Recieved commands, check success value in body" + schema: + $ref: '#/definitions/commands-response' + + /{account}/radar: + get: + tags: + - rove + summary: Get radar information + description: "Gets the radar output for the given rover" + operationId: "Radar" + parameters: + - in: path + name: account + required: true + type: string + responses: + "200": + description: "Recieved request, check success value in body" + schema: + $ref: '#/definitions/radar-response' + + /{account}/rover: + get: + tags: + - rove + summary: Get rover information + description: "Gets information for the account's rover" + operationId: "Rover" + parameters: + - in: path + name: account + required: true + type: string + responses: + "200": + description: "Recieved request, check success value in body" + schema: + $ref: '#/definitions/rover-response' + +definitions: + status: + + properties: + ready: + type: boolean + example: true + version: + type: string + example: "v0.12-1-g7d1a2d7" + tick: + type: integer + example: 5 + nexttick: + type: string + example: "15:30:00" + + register-data: + properties: + name: + type: string + example: "myname" + required: + - name + + register-response: + properties: + success: + type: boolean + example: false + error: + type: string + example: "account with name already existed" + + command: + properties: + command: + type: string + example: move + bearing: + type: string + example: NE + duration: + type: integer + example: 5 + + commands-data: + properties: + commands: + type: array + items: + type: object + properties: + schema: + $ref: '#/definitions/command' + error: + type: string + example: "account with name already existed" + + commands-response: + properties: + success: + type: boolean + example: false + error: + type: string + example: "invalid bearing 'SN'" + + radar-response: + properties: + success: + type: boolean + example: false + error: + type: string + example: "unknown account" + range: + type: integer + example: 5 + tiles: + type: array + items: + type: integer + + vector: + properties: + 'x': + type: integer + example: 1 + 'y': + type: integer + example: 2 + + rover-attributes: + properties: + speed: + type: integer + example: 1 + range: + type: integer + example: 5 + name: + type: string + example: rover-one + position: + type: object + properties: + schema: + $ref: '#/definitions/vector' + + rover-response: + properties: + success: + type: boolean + example: false + error: + type: string + example: "unknown account" + attributes: + type: object + properties: + schema: + $ref: '#/definitions/rover-attributes' \ No newline at end of file From b121b4463eb47c5a1a4429efed09cbf29de12fa4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 17:27:29 +0100 Subject: [PATCH 191/495] Download and install swagger --- .github/workflows/docker-image.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index b3e2434..3f33b71 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -22,6 +22,11 @@ jobs: - name: Install dict run: sudo apt-get update && sudo apt-get install wamerican + - name: Install swagger + run: | + sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 + sudo chmod +x /usr/local/bin/swagger + - name: Check out repo uses: actions/checkout@v2 From 47921e6c41d7a48b5e6b9ba3fb65f401c31c0e9c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 17:54:47 +0100 Subject: [PATCH 192/495] Move game server to port 8080 and host docs on 80 --- Dockerfile.docs | 8 ++++++++ Makefile | 3 +++ cmd/rove-server/internal/api_test.go | 2 +- cmd/rove/main_test.go | 2 +- docker-compose.yml | 18 ++++++++++++++---- 5 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 Dockerfile.docs diff --git a/Dockerfile.docs b/Dockerfile.docs new file mode 100644 index 0000000..e0f15fe --- /dev/null +++ b/Dockerfile.docs @@ -0,0 +1,8 @@ +FROM quay.io/goswagger/swagger:latest +LABEL maintainer="Marc Di Luzio " + +WORKDIR /app +COPY . . + +CMD [ "serve", "swagger.yml", "--no-open" ] + diff --git a/Makefile b/Makefile index 7f64c81..f20f144 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,9 @@ test: @echo Integration tests docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html + + @echo Validating swagger spec + swagger validate swagger.yml @echo Done, coverage data can be found in /tmp/coverage.html diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go index 8a0c0c7..7b99d07 100644 --- a/cmd/rove-server/internal/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -13,7 +13,7 @@ import ( ) const ( - defaultAddress = "localhost:80" + defaultAddress = "localhost:8080" ) var serv = func() rove.Server { diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 48d32be..5ccff56 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -13,7 +13,7 @@ import ( ) const ( - defaultAddress = "localhost:80" + defaultAddress = "localhost:8080" ) func Test_InnerMain(t *testing.T) { diff --git a/docker-compose.yml b/docker-compose.yml index 9eab597..e370c48 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,16 +18,26 @@ services: - persistent-data:/mnt/rove-server:rw command: [ ./rove-accountant ] + rove-docs: + build: + context: . + dockerfile: Dockerfile.docs + image: rove-docs:latest + ports: + - "80:80" + environment: + - PORT=80 + rove-server: - depends_on: [ rove-accountant ] + depends_on: [ rove-accountant, rove-docs ] build: context: . dockerfile: Dockerfile image: rove:latest ports: - - "80:80" + - "8080:8080" environment: - - HOST_ADDRESS=:80 + - HOST_ADDRESS=:8080 - DATA_PATH=/mnt/rove-server - ACCOUNTANT_ADDRESS=rove-accountant:8081 volumes: @@ -41,7 +51,7 @@ services: image: rove:latest environment: - ACCOUNTANT_ADDRESS=rove-accountant:8081 - - ROVE_SERVER_ADDRESS=rove-server:80 + - ROVE_SERVER_ADDRESS=rove-server:8080 command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw From 663cd77c94ec979de324e9f0bb3a3e70771ecd0a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 17:55:47 +0100 Subject: [PATCH 193/495] Fix the hostname --- swagger.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swagger.yml b/swagger.yml index 8a975df..03b0fad 100644 --- a/swagger.yml +++ b/swagger.yml @@ -3,7 +3,7 @@ info: description: "Rove is an asychronous nomadic game about exploring a planet as part of a loose community" version: "0.1" title: "Rove Server" -host: "api.rove-game.com" +host: "rove-game.com:8080" basePath: "/" tags: - name: "server" From 6cfc9444f3fde7d8875294dd0feb7843fabcc849 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 18:58:38 +0100 Subject: [PATCH 194/495] Simplify the APIs to return http status codes --- cmd/rove-accountant/internal/accounts.go | 2 +- cmd/rove-server/internal/api_test.go | 29 +++----- cmd/rove-server/internal/routes.go | 85 ++++++++++-------------- cmd/rove-server/internal/routes_test.go | 31 +++------ cmd/rove-server/internal/server.go | 17 ++++- cmd/rove/main.go | 16 +---- pkg/rove/api.go | 12 +--- pkg/rove/http.go | 13 +++- swagger.yml | 79 +++++++++++----------- 9 files changed, 128 insertions(+), 156 deletions(-) diff --git a/cmd/rove-accountant/internal/accounts.go b/cmd/rove-accountant/internal/accounts.go index 5aecb47..01e29dc 100644 --- a/cmd/rove-accountant/internal/accounts.go +++ b/cmd/rove-accountant/internal/accounts.go @@ -42,7 +42,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Verify this acount isn't already registered for _, a := range a.Accounts { if a.Name == acc.Name { - return Account{}, fmt.Errorf("account name already registered") + return Account{}, fmt.Errorf("account name already registered: %s", a.Name) } } diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go index 7b99d07..146d61b 100644 --- a/cmd/rove-server/internal/api_test.go +++ b/cmd/rove-server/internal/api_test.go @@ -35,29 +35,25 @@ func TestServer_Register(t *testing.T) { d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := serv.Register(d1) + _, err := serv.Register(d1) assert.NoError(t, err) - assert.True(t, r1.Success) d2 := rove.RegisterData{ Name: uuid.New().String(), } - r2, err := serv.Register(d2) + _, err = serv.Register(d2) assert.NoError(t, err) - assert.True(t, r2.Success) - r3, err := serv.Register(d1) - assert.NoError(t, err) - assert.False(t, r3.Success) + _, err = serv.Register(d1) + assert.Error(t, err) } func TestServer_Command(t *testing.T) { d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := serv.Register(d1) + _, err := serv.Register(d1) assert.NoError(t, err) - assert.True(t, r1.Success) c := rove.CommandData{ Commands: []game.Command{ @@ -68,33 +64,28 @@ func TestServer_Command(t *testing.T) { }, }, } - r3, err := serv.Command(d1.Name, c) + _, err = serv.Command(d1.Name, c) assert.NoError(t, err) - assert.True(t, r3.Success) } func TestServer_Radar(t *testing.T) { d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := serv.Register(d1) + _, err := serv.Register(d1) assert.NoError(t, err) - assert.True(t, r1.Success) - r3, err := serv.Radar(d1.Name) + _, err = serv.Radar(d1.Name) assert.NoError(t, err) - assert.True(t, r3.Success) } func TestServer_Rover(t *testing.T) { d1 := rove.RegisterData{ Name: uuid.New().String(), } - r1, err := serv.Register(d1) + _, err := serv.Register(d1) assert.NoError(t, err) - assert.True(t, r1.Success) - r3, err := serv.Rover(d1.Name) + _, err = serv.Rover(d1.Name) assert.NoError(t, err) - assert.True(t, r3.Success) } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 12fbd7a..41258c0 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -17,7 +17,7 @@ import ( ) // Handler describes a function that handles any incoming request and can respond -type Handler func(*Server, map[string]string, io.ReadCloser, io.Writer) (interface{}, error) +type Handler func(*Server, map[string]string, io.ReadCloser) (interface{}, error) // Route defines the information for a single path->function route type Route struct { @@ -56,7 +56,7 @@ var Routes = []Route{ } // HandleStatus handles the /status request -func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { +func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { // Simply return the current server status response := rove.StatusResponse{ @@ -74,40 +74,35 @@ func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser, w io.Write } // HandleRegister handles /register endpoint -func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.RegisterResponse{ - Success: false, - } +func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { + var response = rove.RegisterResponse{} // Decode the registration info, verify it and register the account var data rove.RegisterData err := json.NewDecoder(b).Decode(&data) if err != nil { log.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() + return BadRequestError{Error: err.Error()}, nil } else if len(data.Name) == 0 { - response.Error = "Cannot register empty name" + return BadRequestError{Error: "cannot register empty name"}, nil } ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() reg := accounts.RegisterInfo{Name: data.Name} if acc, err := s.accountant.Register(ctx, ®, grpc.WaitForReady(true)); err != nil { - response.Error = err.Error() + return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) } else if !acc.Success { - response.Error = acc.Error + return BadRequestError{Error: acc.Error}, nil } else if _, _, err := s.SpawnRoverForAccount(data.Name); err != nil { - response.Error = err.Error() + return nil, fmt.Errorf("failed to spawn rover for account: %s", err) } else if err := s.SaveWorld(); err != nil { - response.Error = fmt.Sprintf("Internal server error when saving world: %s", err) + return nil, fmt.Errorf("internal server error when saving world: %s", err) - } else { - // Save out the new accounts - response.Success = true } log.Printf("register response:%+v\n", response) @@ -115,10 +110,8 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser, w io.Wri } // HandleSpawn will spawn the player entity for the associated account -func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.CommandResponse{ - Success: false, - } +func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { + var response = rove.CommandResponse{} id := vars["account"] @@ -126,7 +119,7 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ var data rove.CommandData if err := json.NewDecoder(b).Decode(&data); err != nil { log.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() + return BadRequestError{Error: err.Error()}, nil } @@ -134,22 +127,20 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ defer cancel() key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { - response.Error = "No account ID provided" + return BadRequestError{Error: "no account ID provided"}, nil } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { - response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) } else if !resp.Success { - response.Error = resp.Error + return BadRequestError{Error: resp.Error}, nil } else if id, err := uuid.Parse(resp.Value); err != nil { - response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) } else if err := s.world.Enqueue(id, data.Commands...); err != nil { - response.Error = fmt.Sprintf("Failed to execute commands: %s", err) + return BadRequestError{Error: err.Error()}, nil - } else { - response.Success = true } log.Printf("command response \taccount:%s\tresponse:%+v\n", id, response) @@ -157,37 +148,34 @@ func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser, w io.Writ } // HandleRadar handles the radar request -func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.RadarResponse{ - Success: false, - } +func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { + var response = rove.RadarResponse{} ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() id := vars["account"] key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { - response.Error = "No account ID provided" + return BadRequestError{Error: "no account ID provided"}, nil } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { - response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) } else if !resp.Success { - response.Error = resp.Error + return BadRequestError{Error: resp.Error}, nil } else if id, err := uuid.Parse(resp.Value); err != nil { - response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) } else if attrib, err := s.world.RoverAttributes(id); err != nil { - response.Error = fmt.Sprintf("Error getting rover attributes: %s", err) + return nil, fmt.Errorf("error getting rover attributes: %s", err) } else if radar, err := s.world.RadarFromRover(id); err != nil { - response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) + return nil, fmt.Errorf("error getting radar from rover: %s", err) } else { response.Tiles = radar response.Range = attrib.Range - response.Success = true } log.Printf("radar response \taccount:%s\tresponse:%+v\n", id, response) @@ -195,33 +183,30 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer } // HandleRover handles the rover request -func HandleRover(s *Server, vars map[string]string, b io.ReadCloser, w io.Writer) (interface{}, error) { - var response = rove.RoverResponse{ - Success: false, - } +func HandleRover(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { + var response = rove.RoverResponse{} ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() id := vars["account"] key := accounts.DataKey{Account: id, Key: "rover"} if len(id) == 0 { - response.Error = "No account ID provided" + return BadRequestError{Error: "no account ID provided"}, nil } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { - response.Error = fmt.Sprintf("Provided account has no rover: %s", err) + return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) } else if !resp.Success { - response.Error = resp.Error + return BadRequestError{Error: resp.Error}, nil } else if id, err := uuid.Parse(resp.Value); err != nil { - response.Error = fmt.Sprintf("Account had invalid rover id: %s", err) + return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - } else if attribs, err := s.world.RoverAttributes(id); err != nil { - response.Error = fmt.Sprintf("Error getting radar from rover: %s", err) + } else if attrib, err := s.world.RoverAttributes(id); err != nil { + return nil, fmt.Errorf("error getting rover attributes: %s", err) } else { - response.Attributes = attribs - response.Success = true + response.Attributes = attrib } log.Printf("rover response \taccount:%s\tresponse:%+v\n", id, response) diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go index e34b983..04a1bac 100644 --- a/cmd/rove-server/internal/routes_test.go +++ b/cmd/rove-server/internal/routes_test.go @@ -31,7 +31,8 @@ func TestHandleStatus(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) var status rove.StatusResponse - json.NewDecoder(response.Body).Decode(&status) + err := json.NewDecoder(response.Body).Decode(&status) + assert.NoError(t, err) if status.Ready != true { t.Errorf("got false for /status") @@ -58,11 +59,8 @@ func TestHandleRegister(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) var status rove.RegisterResponse - json.NewDecoder(response.Body).Decode(&status) - - if status.Success != true { - t.Errorf("got false for /register: %s", status.Error) - } + err = json.NewDecoder(response.Body).Decode(&status) + assert.NoError(t, err) } func TestHandleCommand(t *testing.T) { @@ -104,11 +102,8 @@ func TestHandleCommand(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) var status rove.CommandResponse - json.NewDecoder(response.Body).Decode(&status) - - if status.Success != true { - t.Errorf("got false for /command: %s", status.Error) - } + err = json.NewDecoder(response.Body).Decode(&status) + assert.NoError(t, err) attrib, err := s.world.RoverAttributes(inst) assert.NoError(t, err, "Couldn't get rover attribs") @@ -157,11 +152,8 @@ func TestHandleRadar(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) var status rove.RadarResponse - json.NewDecoder(response.Body).Decode(&status) - - if status.Success != true { - t.Errorf("got false for /radar: %s", status.Error) - } + err = json.NewDecoder(response.Body).Decode(&status) + assert.NoError(t, err) scope := attrib.Range*2 + 1 radarOrigin := vector.Vector{X: -attrib.Range, Y: -attrib.Range} @@ -201,11 +193,10 @@ func TestHandleRover(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) var status rove.RoverResponse - json.NewDecoder(response.Body).Decode(&status) + err = json.NewDecoder(response.Body).Decode(&status) + assert.NoError(t, err) - if status.Success != true { - t.Errorf("got false for /rover: %s", status.Error) - } else if attribs != status.Attributes { + if attribs != status.Attributes { t.Errorf("Missmatched attributes: %+v, !=%+v", attribs, status.Attributes) } } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index b1d2277..00f696b 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -248,6 +248,11 @@ func (s *Server) LoadWorld() error { return nil } +// used as the type for the return struct +type BadRequestError struct { + Error string `json:"error"` +} + // wrapHandler wraps a request handler in http checks func (s *Server) wrapHandler(method string, handler Handler) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { @@ -259,12 +264,20 @@ func (s *Server) wrapHandler(method string, handler Handler) func(w http.Respons // Verify the method, call the handler, and encode the return if r.Method != method { w.WriteHeader(http.StatusMethodNotAllowed) + return + } - } else if val, err := handler(s, vars, r.Body, w); err != nil { + val, err := handler(s, vars, r.Body) + if err != nil { log.Printf("Failed to handle http request: %s", err) w.WriteHeader(http.StatusInternalServerError) + return - } else if err := json.NewEncoder(w).Encode(val); err != nil { + } else if _, ok := val.(BadRequestError); ok { + w.WriteHeader(http.StatusBadRequest) + } + + if err := json.NewEncoder(w).Encode(val); err != nil { log.Printf("Failed to encode reply to json: %s", err) w.WriteHeader(http.StatusInternalServerError) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index ca7a54f..527faf9 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -117,14 +117,11 @@ func InnerMain(command string) error { d := rove.RegisterData{ Name: *name, } - response, err := server.Register(d) + _, err := server.Register(d) switch { case err != nil: return err - case !response.Success: - return fmt.Errorf("server returned failure: %s", response.Error) - default: fmt.Printf("Registered account with id: %s\n", *name) config.Accounts[config.Host] = *name @@ -145,14 +142,11 @@ func InnerMain(command string) error { return err } - response, err := server.Command(account, d) + _, err := server.Command(account, d) switch { case err != nil: return err - case !response.Success: - return fmt.Errorf("server returned failure: %s", response.Error) - default: fmt.Printf("Request succeeded\n") } @@ -167,9 +161,6 @@ func InnerMain(command string) error { case err != nil: return err - case !response.Success: - return fmt.Errorf("server returned failure: %s", response.Error) - default: // Print out the radar game.PrintTiles(response.Tiles) @@ -185,9 +176,6 @@ func InnerMain(command string) error { case err != nil: return err - case !response.Success: - return fmt.Errorf("server returned failure: %s", response.Error) - default: fmt.Printf("attributes: %+v\n", response.Attributes) } diff --git a/pkg/rove/api.go b/pkg/rove/api.go index 007b8d1..4c258bc 100644 --- a/pkg/rove/api.go +++ b/pkg/rove/api.go @@ -40,8 +40,7 @@ type RegisterData struct { // RegisterResponse describes the response to a register request type RegisterResponse struct { - Success bool `json:"success"` - Error string `json:"error,omitempty"` + // Placeholder for future information } // ============================== @@ -60,8 +59,7 @@ type CommandData struct { // CommandResponse is the response to be sent back type CommandResponse struct { - Success bool `json:"success"` - Error string `json:"error,omitempty"` + // Placeholder for future information } // ================ @@ -75,9 +73,6 @@ func (s Server) Radar(account string) (r RadarResponse, err error) { // RadarResponse describes the response to a /radar call type RadarResponse struct { - Success bool `json:"success"` - Error string `json:"error,omitempty"` - // The set of positions for nearby non-empty tiles Range int `json:"range"` Tiles []atlas.Tile `json:"tiles"` @@ -94,9 +89,6 @@ func (s Server) Rover(account string) (r RoverResponse, err error) { // RoverResponse includes information about the rover in question type RoverResponse struct { - Success bool `json:"success"` - Error string `json:"error,omitempty"` - // The current position of this rover Attributes game.RoverAttributes `json:"attributes"` } diff --git a/pkg/rove/http.go b/pkg/rove/http.go index e415762..37c16b9 100644 --- a/pkg/rove/http.go +++ b/pkg/rove/http.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io/ioutil" "net/http" "net/url" ) @@ -22,7 +23,11 @@ func (s Server) Get(path string, out interface{}) error { return err } else if resp.StatusCode != http.StatusOK { - return fmt.Errorf("http.Get returned status %d: %s", resp.StatusCode, resp.Status) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) + } + return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) } else { return json.NewDecoder(resp.Body).Decode(out) @@ -56,7 +61,11 @@ func (s Server) Post(path string, in, out interface{}) error { return err } else if resp.StatusCode != http.StatusOK { - return fmt.Errorf("http returned status %d", resp.StatusCode) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) + } + return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) } else { return json.NewDecoder(resp.Body).Decode(out) diff --git a/swagger.yml b/swagger.yml index 03b0fad..3dcabef 100644 --- a/swagger.yml +++ b/swagger.yml @@ -45,9 +45,15 @@ paths: $ref: '#/definitions/register-data' responses: "200": - description: "Successfully attempted to create account, check success value in body" + description: "Successfully created account" + "400": + description: "Bad request, typically due to duplicate name" schema: - $ref: '#/definitions/register-response' + $ref: '#/definitions/error' + "500": + description: "Server encountered error, please report this as a bug" + schema: + $ref: '#/definitions/error' /{account}/commands: post: @@ -67,9 +73,15 @@ paths: $ref: '#/definitions/commands-data' responses: "200": - description: "Recieved commands, check success value in body" + description: "Successfully queued commands" + "400": + description: "Bad request, typically due to duplicate name" schema: - $ref: '#/definitions/commands-response' + $ref: '#/definitions/error' + "500": + description: "Server encountered error, please report this as a bug" + schema: + $ref: '#/definitions/error' /{account}/radar: get: @@ -85,9 +97,17 @@ paths: type: string responses: "200": - description: "Recieved request, check success value in body" + description: "Successfully returned rover radar" schema: $ref: '#/definitions/radar-response' + "400": + description: "Bad request, typically due to duplicate name" + schema: + $ref: '#/definitions/error' + "500": + description: "Server encountered error, please report this as a bug" + schema: + $ref: '#/definitions/error' /{account}/rover: get: @@ -103,13 +123,20 @@ paths: type: string responses: "200": - description: "Recieved request, check success value in body" + description: "Successfully returned rover information" schema: $ref: '#/definitions/rover-response' + "400": + description: "Bad request, typically due to duplicate name" + schema: + $ref: '#/definitions/error' + "500": + description: "Server encountered error, please report this as a bug" + schema: + $ref: '#/definitions/error' definitions: status: - properties: ready: type: boolean @@ -124,6 +151,12 @@ definitions: type: string example: "15:30:00" + error: + properties: + error: + type: string + example: "account not found" + register-data: properties: name: @@ -132,15 +165,6 @@ definitions: required: - name - register-response: - properties: - success: - type: boolean - example: false - error: - type: string - example: "account with name already existed" - command: properties: command: @@ -166,23 +190,8 @@ definitions: type: string example: "account with name already existed" - commands-response: - properties: - success: - type: boolean - example: false - error: - type: string - example: "invalid bearing 'SN'" - radar-response: properties: - success: - type: boolean - example: false - error: - type: string - example: "unknown account" range: type: integer example: 5 @@ -219,14 +228,8 @@ definitions: rover-response: properties: - success: - type: boolean - example: false - error: - type: string - example: "unknown account" attributes: type: object properties: schema: - $ref: '#/definitions/rover-attributes' \ No newline at end of file + $ref: '#/definitions/rover-attributes' From 86a120011361a8f147b21eeaeffeb5618b5ba0b8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 19:05:50 +0100 Subject: [PATCH 195/495] Put url back --- swagger.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swagger.yml b/swagger.yml index 3dcabef..2a48023 100644 --- a/swagger.yml +++ b/swagger.yml @@ -3,7 +3,7 @@ info: description: "Rove is an asychronous nomadic game about exploring a planet as part of a loose community" version: "0.1" title: "Rove Server" -host: "rove-game.com:8080" +host: "api.rove-game.com:8080" basePath: "/" tags: - name: "server" From c1d79520346938cde11bf01a272a24d3012aabc6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 19:12:24 +0100 Subject: [PATCH 196/495] Fix error 400 descriptions --- swagger.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swagger.yml b/swagger.yml index 2a48023..a1c83ea 100644 --- a/swagger.yml +++ b/swagger.yml @@ -75,7 +75,7 @@ paths: "200": description: "Successfully queued commands" "400": - description: "Bad request, typically due to duplicate name" + description: "Bad request, typically due to unknown command parameters" schema: $ref: '#/definitions/error' "500": @@ -101,7 +101,7 @@ paths: schema: $ref: '#/definitions/radar-response' "400": - description: "Bad request, typically due to duplicate name" + description: "Bad request, typically due to unknown account" schema: $ref: '#/definitions/error' "500": @@ -127,7 +127,7 @@ paths: schema: $ref: '#/definitions/rover-response' "400": - description: "Bad request, typically due to duplicate name" + description: "Bad request, typically due to unknown account" schema: $ref: '#/definitions/error' "500": From 04a1b8ea1e76109f3ea749efa92ab62eb648017a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 19:17:39 +0100 Subject: [PATCH 197/495] Add a description for the command --- swagger.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/swagger.yml b/swagger.yml index a1c83ea..c54933f 100644 --- a/swagger.yml +++ b/swagger.yml @@ -168,6 +168,7 @@ definitions: command: properties: command: + description: "The command to execute, currently only accepts move, which requires a bearing and a duration." type: string example: move bearing: From 50c3795578ca4488758ed333d9de1632992b061e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 19:34:14 +0100 Subject: [PATCH 198/495] Add comments and fix up the API doc --- swagger.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/swagger.yml b/swagger.yml index c54933f..eb68d0e 100644 --- a/swagger.yml +++ b/swagger.yml @@ -139,27 +139,33 @@ definitions: status: properties: ready: + description: Whether the server is ready to accept requests type: boolean example: true version: + description: The version of the server in v{major}.{minor}-{delta}-{sha} form type: string example: "v0.12-1-g7d1a2d7" tick: + description: The tick rate of the server in minutes (how many minutes per tick) type: integer example: 5 nexttick: + description: The time the next tick will occur type: string example: "15:30:00" error: properties: error: + description: An explanation for the HTTP error returned type: string example: "account not found" register-data: properties: name: + description: The account name type: string example: "myname" required: @@ -181,22 +187,22 @@ definitions: commands-data: properties: commands: + description: A set of commands to exectute in the order given type: array items: type: object properties: schema: $ref: '#/definitions/command' - error: - type: string - example: "account with name already existed" radar-response: properties: range: + description: The range in tiles from the rover of the radar data type: integer example: 5 tiles: + description: A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order type: array items: type: integer @@ -213,15 +219,19 @@ definitions: rover-attributes: properties: speed: + description: The speed the rover can move per tick type: integer example: 1 range: + description: The range of this rover's radar type: integer example: 5 name: + description: The name of the rover type: string example: rover-one position: + description: Position of the rover in world coordinates type: object properties: schema: @@ -230,6 +240,7 @@ definitions: rover-response: properties: attributes: + description: The attributes of the given rover type: object properties: schema: From b81528419928aa6745098874b547cc40907e33db Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 19:50:52 +0100 Subject: [PATCH 199/495] Fix the rover attributes listing --- swagger.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/swagger.yml b/swagger.yml index eb68d0e..8f9e9d7 100644 --- a/swagger.yml +++ b/swagger.yml @@ -242,6 +242,5 @@ definitions: attributes: description: The attributes of the given rover type: object - properties: - schema: - $ref: '#/definitions/rover-attributes' + $ref: '#/definitions/rover-attributes' + From 7ababb79f69c6c5f84d92b5ee9e01969ab830b57 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 12 Jun 2020 22:51:18 +0100 Subject: [PATCH 200/495] Migrate to gRPC rather than REST with swagger Will also be adding in a RESTful endpoint to the server as well so it can consume both types --- .github/workflows/docker-image.yml | 7 +- Dockerfile.docs | 8 - Makefile | 4 +- cmd/rove-accountant/main.go | 19 +- cmd/rove-server/internal/api_test.go | 91 --- cmd/rove-server/internal/routes.go | 203 ++---- cmd/rove-server/internal/routes_test.go | 202 ------ cmd/rove-server/internal/server.go | 91 +-- cmd/rove/main.go | 35 +- docker-compose.yml | 12 +- go.mod | 1 + pkg/accounts/accounts.pb.go | 136 ++-- pkg/accounts/accounts.proto | 20 +- pkg/atlas/atlas.go | 8 +- pkg/atlas/atlas_test.go | 16 +- pkg/atlas/tile.go | 11 +- pkg/game/command_test.go | 4 +- pkg/game/world.go | 6 +- pkg/rove/api.go | 94 --- pkg/rove/http.go | 73 --- pkg/rove/rove.pb.go | 821 ++++++++++++++++++++++++ pkg/rove/rove.proto | 103 +++ swagger.yml | 246 ------- 23 files changed, 1110 insertions(+), 1101 deletions(-) delete mode 100644 Dockerfile.docs delete mode 100644 cmd/rove-server/internal/api_test.go delete mode 100644 cmd/rove-server/internal/routes_test.go delete mode 100644 pkg/rove/api.go delete mode 100644 pkg/rove/http.go create mode 100644 pkg/rove/rove.pb.go create mode 100644 pkg/rove/rove.proto delete mode 100644 swagger.yml diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3f33b71..1d08aea 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -21,12 +21,7 @@ jobs: - name: Install dict run: sudo apt-get update && sudo apt-get install wamerican - - - name: Install swagger - run: | - sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 - sudo chmod +x /usr/local/bin/swagger - + - name: Check out repo uses: actions/checkout@v2 diff --git a/Dockerfile.docs b/Dockerfile.docs deleted file mode 100644 index e0f15fe..0000000 --- a/Dockerfile.docs +++ /dev/null @@ -1,8 +0,0 @@ -FROM quay.io/goswagger/swagger:latest -LABEL maintainer="Marc Di Luzio " - -WORKDIR /app -COPY . . - -CMD [ "serve", "swagger.yml", "--no-open" ] - diff --git a/Makefile b/Makefile index f20f144..9205bd6 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ install: gen: protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto + protoc --proto_path pkg/rove --go_out=plugins=grpc:pkg/rove/ --go_opt=paths=source_relative pkg/rove/rove.proto test: @echo Unit tests @@ -18,9 +19,6 @@ test: @echo Integration tests docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html - - @echo Validating swagger spec - swagger validate swagger.yml @echo Done, coverage data can be found in /tmp/coverage.html diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index be71cfc..3e8e0d2 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "fmt" "log" "net" "os" @@ -34,20 +33,20 @@ func (a *accountantServer) Register(ctx context.Context, in *accounts.RegisterIn log.Printf("Registering account: %s\n", in.Name) if _, err := a.accountant.RegisterAccount(in.Name); err != nil { log.Printf("Error: %s\n", err) - return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("error registering account: %s", err)}, nil + return nil, err } // Save out the accounts if err := persistence.Save("accounts", a.accountant); err != nil { log.Printf("Error: %s\n", err) - return &accounts.RegisterResponse{Success: false, Error: fmt.Sprintf("failed to save accounts: %s", err)}, nil + return nil, err } - return &accounts.RegisterResponse{Success: true}, nil + return &accounts.RegisterResponse{}, nil } // AssignData assigns a key value pair to an account -func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyValue) (*accounts.Response, error) { +func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyValue) (*accounts.DataKeyResponse, error) { a.sync.RLock() defer a.sync.RUnlock() @@ -56,10 +55,10 @@ func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyVa err := a.accountant.AssignData(in.Account, in.Key, in.Value) if err != nil { log.Printf("Error: %s\n", err) - return &accounts.Response{Success: false, Error: err.Error()}, nil + return nil, err } - return &accounts.Response{Success: true}, nil + return &accounts.DataKeyResponse{}, nil } @@ -73,10 +72,10 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a data, err := a.accountant.GetValue(in.Account, in.Key) if err != nil { log.Printf("Error: %s\n", err) - return &accounts.DataResponse{Success: false, Error: err.Error()}, nil + return nil, err } - return &accounts.DataResponse{Success: true, Value: data}, nil + return &accounts.DataResponse{Value: data}, nil } @@ -117,7 +116,7 @@ func main() { // Serve the RPC server log.Printf("Serving accountant on %s\n", address) if err := grpcServer.Serve(lis); err != nil { - log.Fatalf("failed to server gRPC: %s", err) + log.Fatalf("failed to serve gRPC: %s", err) } // Save out the accountant data diff --git a/cmd/rove-server/internal/api_test.go b/cmd/rove-server/internal/api_test.go deleted file mode 100644 index 146d61b..0000000 --- a/cmd/rove-server/internal/api_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build integration - -package internal - -import ( - "os" - "testing" - - "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/game" - "github.com/mdiluz/rove/pkg/rove" - "github.com/stretchr/testify/assert" -) - -const ( - defaultAddress = "localhost:8080" -) - -var serv = func() rove.Server { - var address = os.Getenv("ROVE_SERVER_ADDRESS") - if len(address) == 0 { - address = defaultAddress - } - return rove.Server(address) -}() - -func TestServer_Status(t *testing.T) { - status, err := serv.Status() - assert.NoError(t, err) - assert.True(t, status.Ready) - assert.NotZero(t, len(status.Version)) -} - -func TestServer_Register(t *testing.T) { - d1 := rove.RegisterData{ - Name: uuid.New().String(), - } - _, err := serv.Register(d1) - assert.NoError(t, err) - - d2 := rove.RegisterData{ - Name: uuid.New().String(), - } - _, err = serv.Register(d2) - assert.NoError(t, err) - - _, err = serv.Register(d1) - assert.Error(t, err) -} - -func TestServer_Command(t *testing.T) { - d1 := rove.RegisterData{ - Name: uuid.New().String(), - } - _, err := serv.Register(d1) - assert.NoError(t, err) - - c := rove.CommandData{ - Commands: []game.Command{ - { - Command: game.CommandMove, - Bearing: "N", - Duration: 1, - }, - }, - } - _, err = serv.Command(d1.Name, c) - assert.NoError(t, err) -} - -func TestServer_Radar(t *testing.T) { - d1 := rove.RegisterData{ - Name: uuid.New().String(), - } - _, err := serv.Register(d1) - assert.NoError(t, err) - - _, err = serv.Radar(d1.Name) - assert.NoError(t, err) -} - -func TestServer_Rover(t *testing.T) { - d1 := rove.RegisterData{ - Name: uuid.New().String(), - } - _, err := serv.Register(d1) - assert.NoError(t, err) - - _, err = serv.Rover(d1.Name) - assert.NoError(t, err) -} diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 41258c0..eae2a1d 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -2,69 +2,26 @@ package internal import ( "context" - "encoding/json" "fmt" - "io" - "log" - "net/http" - "time" + "github.com/golang/protobuf/ptypes/empty" "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" + "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" "google.golang.org/grpc" ) -// Handler describes a function that handles any incoming request and can respond -type Handler func(*Server, map[string]string, io.ReadCloser) (interface{}, error) - -// Route defines the information for a single path->function route -type Route struct { - path string - method string - handler Handler -} - -// Routes is an array of all the Routes -var Routes = []Route{ - { - path: "/status", - method: http.MethodGet, - handler: HandleStatus, - }, - { - path: "/register", - method: http.MethodPost, - handler: HandleRegister, - }, - { - path: "/{account}/command", - method: http.MethodPost, - handler: HandleCommand, - }, - { - path: "/{account}/radar", - method: http.MethodGet, - handler: HandleRadar, - }, - { - path: "/{account}/rover", - method: http.MethodGet, - handler: HandleRover, - }, -} - -// HandleStatus handles the /status request -func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { - - // Simply return the current server status - response := rove.StatusResponse{ +func (s *Server) Status(context.Context, *empty.Empty) (*rove.StatusResponse, error) { + response := &rove.StatusResponse{ Ready: true, Version: version.Version, - Tick: s.tick, + Tick: int32(s.tick), } + // TODO: Verify the accountant is up and ready too + // If there's a schedule, respond with it if len(s.schedule.Entries()) > 0 { response.NextTick = s.schedule.Entries()[0].Next.Format("15:04:05") @@ -73,31 +30,15 @@ func HandleStatus(s *Server, vars map[string]string, b io.ReadCloser) (interface return response, nil } -// HandleRegister handles /register endpoint -func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { - var response = rove.RegisterResponse{} - - // Decode the registration info, verify it and register the account - var data rove.RegisterData - err := json.NewDecoder(b).Decode(&data) - if err != nil { - log.Printf("Failed to decode json: %s\n", err) - return BadRequestError{Error: err.Error()}, nil - - } else if len(data.Name) == 0 { - return BadRequestError{Error: "cannot register empty name"}, nil - +func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*empty.Empty, error) { + if len(req.Name) == 0 { + return nil, fmt.Errorf("empty account name") } - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - reg := accounts.RegisterInfo{Name: data.Name} - if acc, err := s.accountant.Register(ctx, ®, grpc.WaitForReady(true)); err != nil { - return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) - } else if !acc.Success { - return BadRequestError{Error: acc.Error}, nil + if _, err := s.accountant.Register(ctx, &accounts.RegisterInfo{Name: req.Name}, grpc.WaitForReady(true)); err != nil { + return nil, err - } else if _, _, err := s.SpawnRoverForAccount(data.Name); err != nil { + } else if _, _, err := s.SpawnRoverForAccount(req.Name); err != nil { return nil, fmt.Errorf("failed to spawn rover for account: %s", err) } else if err := s.SaveWorld(); err != nil { @@ -105,66 +46,48 @@ func HandleRegister(s *Server, vars map[string]string, b io.ReadCloser) (interfa } - log.Printf("register response:%+v\n", response) - return response, nil + return &empty.Empty{}, nil } -// HandleSpawn will spawn the player entity for the associated account -func HandleCommand(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { - var response = rove.CommandResponse{} +func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.RoverResponse, error) { + response := &rove.RoverResponse{} + if len(req.Account) == 0 { + return nil, fmt.Errorf("empty account name") - id := vars["account"] - - // Decode the commands, verify them and the account, and execute the commands - var data rove.CommandData - if err := json.NewDecoder(b).Decode(&data); err != nil { - log.Printf("Failed to decode json: %s\n", err) - return BadRequestError{Error: err.Error()}, nil - - } - - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - key := accounts.DataKey{Account: id, Key: "rover"} - if len(id) == 0 { - return BadRequestError{Error: "no account ID provided"}, nil - - } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { + } else if resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}); err != nil { return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) - } else if !resp.Success { - return BadRequestError{Error: resp.Error}, nil - } else if id, err := uuid.Parse(resp.Value); err != nil { return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - } else if err := s.world.Enqueue(id, data.Commands...); err != nil { - return BadRequestError{Error: err.Error()}, nil + } else if attrib, err := s.world.RoverAttributes(id); err != nil { + return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else { + response = &rove.RoverResponse{ + Name: attrib.Name, + Position: &rove.Vector{ + X: int32(attrib.Pos.X), + Y: int32(attrib.Pos.Y), + }, + } } - - log.Printf("command response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } -// HandleRadar handles the radar request -func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { - var response = rove.RadarResponse{} +func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.RadarResponse, error) { + if len(req.Account) == 0 { + return nil, fmt.Errorf("empty account name") + } - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - id := vars["account"] - key := accounts.DataKey{Account: id, Key: "rover"} - if len(id) == 0 { - return BadRequestError{Error: "no account ID provided"}, nil + response := &rove.RadarResponse{} - } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { + resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}) + if err != nil { return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) + } - } else if !resp.Success { - return BadRequestError{Error: resp.Error}, nil - - } else if id, err := uuid.Parse(resp.Value); err != nil { + if id, err := uuid.Parse(resp.Value); err != nil { return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) } else if attrib, err := s.world.RoverAttributes(id); err != nil { @@ -175,40 +98,38 @@ func HandleRadar(s *Server, vars map[string]string, b io.ReadCloser) (interface{ } else { response.Tiles = radar - response.Range = attrib.Range + response.Range = int32(attrib.Range) } - log.Printf("radar response \taccount:%s\tresponse:%+v\n", id, response) return response, nil } -// HandleRover handles the rover request -func HandleRover(s *Server, vars map[string]string, b io.ReadCloser) (interface{}, error) { - var response = rove.RoverResponse{} +func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*empty.Empty, error) { + if len(req.Account) == 0 { + return nil, fmt.Errorf("empty account") + } + resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - id := vars["account"] - key := accounts.DataKey{Account: id, Key: "rover"} - if len(id) == 0 { - return BadRequestError{Error: "no account ID provided"}, nil + if err != nil { + return nil, err + } - } else if resp, err := s.accountant.GetValue(ctx, &key); err != nil { - return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) - - } else if !resp.Success { - return BadRequestError{Error: resp.Error}, nil - - } else if id, err := uuid.Parse(resp.Value); err != nil { + id, err := uuid.Parse(resp.Value) + if err != nil { return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - - } else if attrib, err := s.world.RoverAttributes(id); err != nil { - return nil, fmt.Errorf("error getting rover attributes: %s", err) - - } else { - response.Attributes = attrib } - log.Printf("rover response \taccount:%s\tresponse:%+v\n", id, response) - return response, nil + var cmds []game.Command + for _, c := range req.Commands { + cmds = append(cmds, game.Command{ + Bearing: c.Bearing, + Command: c.Command, + Duration: int(c.Duration)}) + } + + if err := s.world.Enqueue(id, cmds...); err != nil { + return nil, err + } + + return &empty.Empty{}, nil } diff --git a/cmd/rove-server/internal/routes_test.go b/cmd/rove-server/internal/routes_test.go deleted file mode 100644 index 04a1bac..0000000 --- a/cmd/rove-server/internal/routes_test.go +++ /dev/null @@ -1,202 +0,0 @@ -// +build integration - -package internal - -import ( - "bytes" - "context" - "encoding/json" - "net/http" - "net/http/httptest" - "path" - "testing" - - "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/accounts" - "github.com/mdiluz/rove/pkg/atlas" - "github.com/mdiluz/rove/pkg/game" - "github.com/mdiluz/rove/pkg/rove" - "github.com/mdiluz/rove/pkg/vector" - "github.com/stretchr/testify/assert" -) - -func TestHandleStatus(t *testing.T) { - - request, _ := http.NewRequest(http.MethodGet, "/status", nil) - response := httptest.NewRecorder() - - s := NewServer() - s.Initialise(true) - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.StatusResponse - err := json.NewDecoder(response.Body).Decode(&status) - assert.NoError(t, err) - - if status.Ready != true { - t.Errorf("got false for /status") - } - - if len(status.Version) == 0 { - t.Errorf("got empty version info") - } -} - -func TestHandleRegister(t *testing.T) { - data := rove.RegisterData{Name: uuid.New().String()} - b, err := json.Marshal(data) - if err != nil { - t.Error(err) - } - - request, _ := http.NewRequest(http.MethodPost, "/register", bytes.NewReader(b)) - response := httptest.NewRecorder() - - s := NewServer() - s.Initialise(true) - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.RegisterResponse - err = json.NewDecoder(response.Body).Decode(&status) - assert.NoError(t, err) -} - -func TestHandleCommand(t *testing.T) { - name := uuid.New().String() - s := NewServer() - s.Initialise(false) // Leave the world empty with no obstacles - reg := accounts.RegisterInfo{Name: name} - acc, err := s.accountant.Register(context.Background(), ®) - assert.NoError(t, err) - assert.NotNil(t, acc) - assert.True(t, acc.Success, acc.Error) - - assert.NoError(t, err, "Error registering account") - - // Spawn the rover rover for the account - _, inst, err := s.SpawnRoverForAccount(name) - assert.NoError(t, s.world.WarpRover(inst, vector.Vector{})) - - attribs, err := s.world.RoverAttributes(inst) - assert.NoError(t, err, "Couldn't get rover position") - - data := rove.CommandData{ - Commands: []game.Command{ - { - Command: game.CommandMove, - Bearing: "N", - Duration: 1, - }, - }, - } - - b, err := json.Marshal(data) - assert.NoError(t, err, "Error marshalling data") - - request, _ := http.NewRequest(http.MethodPost, path.Join("/", name, "/command"), bytes.NewReader(b)) - response := httptest.NewRecorder() - - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.CommandResponse - err = json.NewDecoder(response.Body).Decode(&status) - assert.NoError(t, err) - - attrib, err := s.world.RoverAttributes(inst) - assert.NoError(t, err, "Couldn't get rover attribs") - - // Tick the command queues to progress the move command - s.world.EnqueueAllIncoming() - s.world.ExecuteCommandQueues() - - attribs2, err := s.world.RoverAttributes(inst) - assert.NoError(t, err, "Couldn't get rover position") - attribs.Pos.Add(vector.Vector{X: 0.0, Y: attrib.Speed * 1}) // Should have moved north by the speed and duration - assert.Equal(t, attribs.Pos, attribs2.Pos, "Rover should have moved by bearing") -} - -func TestHandleRadar(t *testing.T) { - name := uuid.New().String() - s := NewServer() - s.Initialise(false) // Spawn a clean world - reg := accounts.RegisterInfo{Name: name} - acc, err := s.accountant.Register(context.Background(), ®) - assert.NoError(t, err) - assert.True(t, acc.Success, acc.Error) - assert.NoError(t, err, "Error registering account") - - // Spawn the rover rover for the account - attrib, id, err := s.SpawnRoverForAccount(name) - assert.NoError(t, err) - - // Warp this rover to 0,0 - assert.NoError(t, s.world.WarpRover(id, vector.Vector{})) - - // Explicity set a few nearby tiles - wallPos1 := vector.Vector{X: 0, Y: -1} - wallPos2 := vector.Vector{X: 1, Y: 1} - rockPos := vector.Vector{X: 1, Y: 3} - emptyPos := vector.Vector{X: -2, Y: -3} - assert.NoError(t, s.world.Atlas.SetTile(wallPos1, atlas.TileWall)) - assert.NoError(t, s.world.Atlas.SetTile(wallPos2, atlas.TileWall)) - assert.NoError(t, s.world.Atlas.SetTile(rockPos, atlas.TileRock)) - assert.NoError(t, s.world.Atlas.SetTile(emptyPos, atlas.TileEmpty)) - - request, _ := http.NewRequest(http.MethodGet, path.Join("/", name, "/radar"), nil) - response := httptest.NewRecorder() - - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.RadarResponse - err = json.NewDecoder(response.Body).Decode(&status) - assert.NoError(t, err) - - scope := attrib.Range*2 + 1 - radarOrigin := vector.Vector{X: -attrib.Range, Y: -attrib.Range} - - // Make sure the rover tile is correct - assert.Equal(t, atlas.TileRover, status.Tiles[len(status.Tiles)/2]) - - // Check our other tiles - wallPos1.Add(radarOrigin.Negated()) - wallPos2.Add(radarOrigin.Negated()) - rockPos.Add(radarOrigin.Negated()) - emptyPos.Add(radarOrigin.Negated()) - assert.Equal(t, atlas.TileWall, status.Tiles[wallPos1.X+wallPos1.Y*scope]) - assert.Equal(t, atlas.TileWall, status.Tiles[wallPos2.X+wallPos2.Y*scope]) - assert.Equal(t, atlas.TileRock, status.Tiles[rockPos.X+rockPos.Y*scope]) - assert.Equal(t, atlas.TileEmpty, status.Tiles[emptyPos.X+emptyPos.Y*scope]) - -} - -func TestHandleRover(t *testing.T) { - name := uuid.New().String() - s := NewServer() - s.Initialise(true) - reg := accounts.RegisterInfo{Name: name} - acc, err := s.accountant.Register(context.Background(), ®) - assert.NoError(t, err) - assert.True(t, acc.Success, acc.Error) - - // Spawn one rover for the account - attribs, _, err := s.SpawnRoverForAccount(name) - assert.NoError(t, err) - - request, _ := http.NewRequest(http.MethodGet, path.Join("/", name, "/rover"), nil) - response := httptest.NewRecorder() - - s.router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - - var status rove.RoverResponse - err = json.NewDecoder(response.Body).Decode(&status) - assert.NoError(t, err) - - if attribs != status.Attributes { - t.Errorf("Missmatched attributes: %+v, !=%+v", attribs, status.Attributes) - } -} diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 00f696b..920cbf2 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -2,20 +2,17 @@ package internal import ( "context" - "encoding/json" "fmt" "log" "net" - "net/http" "os" "sync" - "time" "github.com/google/uuid" - "github.com/gorilla/mux" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" + "github.com/mdiluz/rove/pkg/rove" "github.com/robfig/cron" "google.golang.org/grpc" ) @@ -40,10 +37,9 @@ type Server struct { accountant accounts.AccountantClient clientConn *grpc.ClientConn - // HTTP server - listener net.Listener - server *http.Server - router *mux.Router + // gRPC server + netListener net.Listener + grpcServ *grpc.Server // Config settings address string @@ -85,13 +81,10 @@ func OptionTick(minutes int) ServerOption { // NewServer sets up a new server func NewServer(opts ...ServerOption) *Server { - router := mux.NewRouter().StrictSlash(true) - // Set up the default server s := &Server{ address: "", persistence: EphemeralData, - router: router, schedule: cron.New(), } @@ -100,9 +93,6 @@ func NewServer(opts ...ServerOption) *Server { o(s) } - // Set up the server object - s.server = &http.Server{Addr: s.address, Handler: s.router} - // Start small, we can grow the world later s.world = game.NewWorld(4, 8) @@ -133,18 +123,14 @@ func (s *Server) Initialise(fillWorld bool) (err error) { return err } - // Set up the handlers - for _, route := range Routes { - s.router.HandleFunc(route.path, s.wrapHandler(route.method, route.handler)) + // Set up the RPC server and register + s.netListener, err = net.Listen("tcp", s.address) + if err != nil { + log.Fatalf("failed to listen: %v", err) } + s.grpcServ = grpc.NewServer() + rove.RegisterRoverServerServer(s.grpcServ, s) - // Start the listen - log.Printf("Listening on %s\n", s.server.Addr) - if s.listener, err = net.Listen("tcp", s.server.Addr); err != nil { - return err - } - - s.address = s.listener.Addr().String() return nil } @@ -178,9 +164,10 @@ func (s *Server) Run() { log.Printf("First server tick scheduled for %s\n", s.schedule.Entries()[0].Next.Format("15:04:05")) } - // Serve the http requests - if err := s.server.Serve(s.listener); err != nil && err != http.ErrServerClosed { - log.Fatal(err) + // Serve the RPC server + log.Printf("Serving rove on %s\n", s.address) + if err := s.grpcServ.Serve(s.netListener); err != nil && err != grpc.ErrServerStopped { + log.Fatalf("failed to serve gRPC: %s", err) } } @@ -189,12 +176,8 @@ func (s *Server) Stop() error { // Stop the cron s.schedule.Stop() - // Try and shut down the http server - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := s.server.Shutdown(ctx); err != nil { - return err - } + // Stop the gRPC + s.grpcServ.Stop() // Close the accountant connection if err := s.clientConn.Close(); err != nil { @@ -206,7 +189,7 @@ func (s *Server) Stop() error { // Close waits until the server is finished and closes up shop func (s *Server) Close() error { - // Wait until the server has shut down + // Wait until the world has shut down s.sync.Wait() // Save and return @@ -253,40 +236,6 @@ type BadRequestError struct { Error string `json:"error"` } -// wrapHandler wraps a request handler in http checks -func (s *Server) wrapHandler(method string, handler Handler) func(w http.ResponseWriter, r *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - // Log the request - log.Printf("%s\t%s\n", r.Method, r.RequestURI) - - vars := mux.Vars(r) - - // Verify the method, call the handler, and encode the return - if r.Method != method { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - - val, err := handler(s, vars, r.Body) - if err != nil { - log.Printf("Failed to handle http request: %s", err) - w.WriteHeader(http.StatusInternalServerError) - return - - } else if _, ok := val.(BadRequestError); ok { - w.WriteHeader(http.StatusBadRequest) - } - - if err := json.NewEncoder(w).Encode(val); err != nil { - log.Printf("Failed to encode reply to json: %s", err) - w.WriteHeader(http.StatusInternalServerError) - - } else { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - } - } -} - // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uuid.UUID, error) { if inst, err := s.world.SpawnRover(); err != nil { @@ -297,9 +246,9 @@ func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uui } else { keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst.String()} - resp, err := s.accountant.AssignValue(context.Background(), &keyval) - if err != nil || !resp.Success { - log.Printf("Failed to assign rover to account, %s, %s", err, resp.Error) + _, err := s.accountant.AssignValue(context.Background(), &keyval) + if err != nil { + log.Printf("Failed to assign rover to account, %s", err) // Try and clear up the rover if err := s.world.DestroyRover(inst); err != nil { diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 527faf9..7e7e418 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -7,10 +7,14 @@ import ( "io/ioutil" "os" "path" + "time" + "github.com/golang/protobuf/ptypes/empty" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" + "golang.org/x/net/context" + "google.golang.org/grpc" ) var USAGE = "" @@ -90,7 +94,13 @@ func InnerMain(command string) error { } // Set up the server - var server = rove.Server(config.Host) + clientConn, err := grpc.Dial(config.Host, grpc.WithInsecure()) + if err != nil { + return err + } + var client = rove.NewRoverServerClient(clientConn) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() // Grab the account var account = config.Accounts[config.Host] @@ -98,7 +108,7 @@ func InnerMain(command string) error { // Handle all the commands switch command { case "status": - response, err := server.Status() + response, err := client.Status(ctx, &empty.Empty{}) switch { case err != nil: return err @@ -114,10 +124,10 @@ func InnerMain(command string) error { if len(*name) == 0 { return fmt.Errorf("must set name with -name") } - d := rove.RegisterData{ + d := rove.RegisterRequest{ Name: *name, } - _, err := server.Register(d) + _, err := client.Register(ctx, &d) switch { case err != nil: return err @@ -128,11 +138,12 @@ func InnerMain(command string) error { } case "move": - d := rove.CommandData{ - Commands: []game.Command{ + d := rove.CommandsRequest{ + Account: account, + Commands: []*rove.Command{ { Command: game.CommandMove, - Duration: *duration, + Duration: int32(*duration), Bearing: *bearing, }, }, @@ -142,7 +153,7 @@ func InnerMain(command string) error { return err } - _, err := server.Command(account, d) + _, err := client.Commands(ctx, &d) switch { case err != nil: return err @@ -152,11 +163,12 @@ func InnerMain(command string) error { } case "radar": + dat := rove.RadarRequest{Account: account} if err := verifyId(account); err != nil { return err } - response, err := server.Radar(account) + response, err := client.Radar(ctx, &dat) switch { case err != nil: return err @@ -167,17 +179,18 @@ func InnerMain(command string) error { } case "rover": + req := rove.RoverRequest{Account: account} if err := verifyId(account); err != nil { return err } - response, err := server.Rover(account) + response, err := client.Rover(ctx, &req) switch { case err != nil: return err default: - fmt.Printf("attributes: %+v\n", response.Attributes) + fmt.Printf("attributes: %+v\n", response) } case "config": fmt.Printf("host: %s\taccount: %s\n", config.Host, account) diff --git a/docker-compose.yml b/docker-compose.yml index e370c48..83b3396 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,18 +18,8 @@ services: - persistent-data:/mnt/rove-server:rw command: [ ./rove-accountant ] - rove-docs: - build: - context: . - dockerfile: Dockerfile.docs - image: rove-docs:latest - ports: - - "80:80" - environment: - - PORT=80 - rove-server: - depends_on: [ rove-accountant, rove-docs ] + depends_on: [ rove-accountant ] build: context: . dockerfile: Dockerfile diff --git a/go.mod b/go.mod index 973e0a5..c9465c4 100644 --- a/go.mod +++ b/go.mod @@ -10,5 +10,6 @@ require ( github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d + golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 google.golang.org/grpc v1.29.1 ) diff --git a/pkg/accounts/accounts.pb.go b/pkg/accounts/accounts.pb.go index f3f33b9..aa6fcd2 100644 --- a/pkg/accounts/accounts.pb.go +++ b/pkg/accounts/accounts.pb.go @@ -67,9 +67,6 @@ func (m *RegisterInfo) GetName() string { // RegisterResponse is the response information from registering an account type RegisterResponse struct { - // The error value should only be populated if success is false - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -100,20 +97,6 @@ func (m *RegisterResponse) XXX_DiscardUnknown() { var xxx_messageInfo_RegisterResponse proto.InternalMessageInfo -func (m *RegisterResponse) GetSuccess() bool { - if m != nil { - return m.Success - } - return false -} - -func (m *RegisterResponse) GetError() string { - if m != nil { - return m.Error - } - return "" -} - // DataKeyValue represents a simple key value pair to assign to an account type DataKeyValue struct { // The account to assign the new key value pair to @@ -172,54 +155,37 @@ func (m *DataKeyValue) GetValue() string { return "" } -// Response is a simple response with success and error -type Response struct { - // error should only be populated if success is false - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +// DataKeyResponse is a simple response +type DataKeyResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { +func (m *DataKeyResponse) Reset() { *m = DataKeyResponse{} } +func (m *DataKeyResponse) String() string { return proto.CompactTextString(m) } +func (*DataKeyResponse) ProtoMessage() {} +func (*DataKeyResponse) Descriptor() ([]byte, []int) { return fileDescriptor_e1e7723af4c007b7, []int{3} } -func (m *Response) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Response.Unmarshal(m, b) +func (m *DataKeyResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DataKeyResponse.Unmarshal(m, b) } -func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Response.Marshal(b, m, deterministic) +func (m *DataKeyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DataKeyResponse.Marshal(b, m, deterministic) } -func (m *Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_Response.Merge(m, src) +func (m *DataKeyResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataKeyResponse.Merge(m, src) } -func (m *Response) XXX_Size() int { - return xxx_messageInfo_Response.Size(m) +func (m *DataKeyResponse) XXX_Size() int { + return xxx_messageInfo_DataKeyResponse.Size(m) } -func (m *Response) XXX_DiscardUnknown() { - xxx_messageInfo_Response.DiscardUnknown(m) +func (m *DataKeyResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DataKeyResponse.DiscardUnknown(m) } -var xxx_messageInfo_Response proto.InternalMessageInfo - -func (m *Response) GetSuccess() bool { - if m != nil { - return m.Success - } - return false -} - -func (m *Response) GetError() string { - if m != nil { - return m.Error - } - return "" -} +var xxx_messageInfo_DataKeyResponse proto.InternalMessageInfo // DataKey describes a simple key value with an account, for fetching type DataKey struct { @@ -273,9 +239,6 @@ func (m *DataKey) GetKey() string { // DataResponse describes a data fetch response type DataResponse struct { - // error should only be populated if success is false - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` // The value of the key Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -308,20 +271,6 @@ func (m *DataResponse) XXX_DiscardUnknown() { var xxx_messageInfo_DataResponse proto.InternalMessageInfo -func (m *DataResponse) GetSuccess() bool { - if m != nil { - return m.Success - } - return false -} - -func (m *DataResponse) GetError() string { - if m != nil { - return m.Error - } - return "" -} - func (m *DataResponse) GetValue() string { if m != nil { return m.Value @@ -333,7 +282,7 @@ func init() { proto.RegisterType((*RegisterInfo)(nil), "accounts.RegisterInfo") proto.RegisterType((*RegisterResponse)(nil), "accounts.RegisterResponse") proto.RegisterType((*DataKeyValue)(nil), "accounts.DataKeyValue") - proto.RegisterType((*Response)(nil), "accounts.Response") + proto.RegisterType((*DataKeyResponse)(nil), "accounts.DataKeyResponse") proto.RegisterType((*DataKey)(nil), "accounts.DataKey") proto.RegisterType((*DataResponse)(nil), "accounts.DataResponse") } @@ -343,26 +292,25 @@ func init() { } var fileDescriptor_e1e7723af4c007b7 = []byte{ - // 298 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x4f, 0x4b, 0xc3, 0x40, - 0x10, 0xc5, 0x8d, 0x55, 0x1b, 0xc7, 0x22, 0x75, 0x11, 0x09, 0x39, 0xc9, 0x8a, 0xe0, 0x29, 0x01, - 0x45, 0x04, 0xbd, 0xd8, 0x22, 0x88, 0x78, 0x91, 0x20, 0x1e, 0xbc, 0x6d, 0xe3, 0x18, 0x43, 0x9b, - 0xdd, 0xb0, 0x7f, 0x0a, 0xf5, 0xf3, 0xf9, 0xc1, 0x24, 0xbb, 0xd9, 0x1a, 0xac, 0x17, 0x7b, 0xdb, - 0x17, 0xe6, 0xf7, 0xe6, 0xcd, 0x4c, 0x60, 0x9f, 0xe5, 0xb9, 0x30, 0x5c, 0xab, 0xa4, 0x96, 0x42, - 0x0b, 0x12, 0x7a, 0x4d, 0x29, 0x0c, 0x32, 0x2c, 0x4a, 0xa5, 0x51, 0x3e, 0xf0, 0x77, 0x41, 0x08, - 0x6c, 0x71, 0x56, 0x61, 0x14, 0x1c, 0x07, 0x67, 0xbb, 0x99, 0x7d, 0xd3, 0x31, 0x0c, 0x7d, 0x4d, - 0x86, 0xaa, 0x16, 0x5c, 0x21, 0x89, 0xa0, 0xaf, 0x4c, 0x9e, 0xa3, 0x52, 0xb6, 0x34, 0xcc, 0xbc, - 0x24, 0x87, 0xb0, 0x8d, 0x52, 0x0a, 0x19, 0x6d, 0x5a, 0x0b, 0x27, 0xe8, 0x13, 0x0c, 0xee, 0x98, - 0x66, 0x8f, 0xb8, 0x78, 0x61, 0x33, 0x63, 0xf9, 0x36, 0x43, 0xdb, 0xca, 0x4b, 0x32, 0x84, 0xde, - 0x14, 0x17, 0x2d, 0xdd, 0x3c, 0x1b, 0xc7, 0x79, 0x03, 0x45, 0x3d, 0xe7, 0x68, 0x05, 0xbd, 0x86, - 0x70, 0xed, 0x34, 0x97, 0xd0, 0x6f, 0xd3, 0xfc, 0x27, 0x08, 0x7d, 0x76, 0x43, 0xac, 0xdb, 0xf6, - 0xef, 0x41, 0xce, 0xbf, 0x02, 0x80, 0x91, 0xeb, 0xc9, 0xb8, 0x26, 0xb7, 0xcd, 0x5c, 0x6e, 0xdb, - 0xe4, 0x28, 0x59, 0x1e, 0xae, 0x7b, 0xa5, 0x38, 0x5e, 0xfd, 0xee, 0x43, 0xd1, 0x0d, 0x72, 0x03, - 0x7b, 0x23, 0xa5, 0xca, 0x82, 0xbb, 0x55, 0x77, 0x4c, 0xba, 0x27, 0x88, 0x49, 0xd7, 0x64, 0x09, - 0x5f, 0x41, 0x78, 0x8f, 0xda, 0x91, 0x07, 0x2b, 0x64, 0xfc, 0xcb, 0xec, 0x07, 0x1c, 0x9f, 0xbe, - 0x9e, 0x14, 0xa5, 0xfe, 0x30, 0x93, 0x24, 0x17, 0x55, 0x5a, 0xbd, 0x95, 0x33, 0xf3, 0x99, 0x4a, - 0x31, 0xc7, 0xb4, 0x9e, 0x16, 0xa9, 0xa7, 0x26, 0x3b, 0xf6, 0x0f, 0xbc, 0xf8, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0xef, 0x53, 0xc6, 0xba, 0x93, 0x02, 0x00, 0x00, + // 276 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x41, 0x4b, 0xc3, 0x40, + 0x10, 0x85, 0x8d, 0x55, 0x1b, 0xc7, 0xa2, 0xed, 0x20, 0x12, 0x73, 0x92, 0x55, 0xc1, 0x53, 0x02, + 0x8a, 0x78, 0xb5, 0x45, 0x10, 0xf1, 0x22, 0x39, 0x78, 0xf0, 0xb6, 0x8d, 0x63, 0x0c, 0x6d, 0x76, + 0x43, 0x76, 0x53, 0xa8, 0x7f, 0xd1, 0x3f, 0x25, 0xc9, 0x66, 0x63, 0x30, 0x5e, 0x7a, 0x9b, 0x79, + 0xcc, 0xfb, 0x66, 0xf6, 0x2d, 0x1c, 0xf2, 0x38, 0x96, 0xa5, 0xd0, 0x2a, 0xc8, 0x0b, 0xa9, 0x25, + 0xba, 0xb6, 0x67, 0x0c, 0x46, 0x11, 0x25, 0xa9, 0xd2, 0x54, 0x3c, 0x89, 0x0f, 0x89, 0x08, 0x3b, + 0x82, 0x67, 0xe4, 0x39, 0x67, 0xce, 0xd5, 0x7e, 0x54, 0xd7, 0x0c, 0x61, 0x6c, 0x67, 0x22, 0x52, + 0xb9, 0x14, 0x8a, 0xd8, 0x0b, 0x8c, 0x1e, 0xb8, 0xe6, 0xcf, 0xb4, 0x7e, 0xe5, 0xcb, 0x92, 0xd0, + 0x83, 0x61, 0xc3, 0x6c, 0xac, 0xb6, 0xc5, 0x31, 0x0c, 0x16, 0xb4, 0xf6, 0xb6, 0x6b, 0xb5, 0x2a, + 0xf1, 0x18, 0x76, 0x57, 0x95, 0xc9, 0x1b, 0xd4, 0x9a, 0x69, 0xd8, 0x04, 0x8e, 0x1a, 0x62, 0xbb, + 0xe4, 0x16, 0x86, 0x8d, 0xb4, 0x09, 0x9f, 0x5d, 0x98, 0xdb, 0x2c, 0xe6, 0xff, 0x7d, 0xd7, 0xdf, + 0x0e, 0xc0, 0xd4, 0x30, 0xb8, 0xd0, 0x78, 0x0f, 0xae, 0x7d, 0x24, 0x9e, 0x04, 0x6d, 0x5e, 0xdd, + 0x70, 0x7c, 0xbf, 0xaf, 0xb7, 0xb7, 0x6e, 0xe1, 0x0c, 0x0e, 0xa6, 0x4a, 0xa5, 0x89, 0x30, 0x89, + 0x74, 0x20, 0xdd, 0xa4, 0xfc, 0xd3, 0x9e, 0xde, 0x61, 0xdc, 0x81, 0xfb, 0x48, 0xda, 0x00, 0x26, + 0xbd, 0x41, 0xff, 0x0f, 0xf3, 0xd7, 0x38, 0xbb, 0x7c, 0x3b, 0x4f, 0x52, 0xfd, 0x59, 0xce, 0x83, + 0x58, 0x66, 0x61, 0xf6, 0x9e, 0x2e, 0xcb, 0xaf, 0xb0, 0x90, 0x2b, 0x0a, 0xf3, 0x45, 0x12, 0x5a, + 0xd7, 0x7c, 0xaf, 0xfe, 0xff, 0x9b, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x22, 0x35, 0x31, 0x6f, + 0x11, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -381,7 +329,7 @@ type AccountantClient interface { // It will return an error if the account already exists Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) // AssignValue assigns a key-value pair to an account, or overwrites an existing key - AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*Response, error) + AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*DataKeyResponse, error) // GetValue will get the value for a key for an account GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) } @@ -403,8 +351,8 @@ func (c *accountantClient) Register(ctx context.Context, in *RegisterInfo, opts return out, nil } -func (c *accountantClient) AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*Response, error) { - out := new(Response) +func (c *accountantClient) AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*DataKeyResponse, error) { + out := new(DataKeyResponse) err := c.cc.Invoke(ctx, "/accounts.Accountant/AssignValue", in, out, opts...) if err != nil { return nil, err @@ -427,7 +375,7 @@ type AccountantServer interface { // It will return an error if the account already exists Register(context.Context, *RegisterInfo) (*RegisterResponse, error) // AssignValue assigns a key-value pair to an account, or overwrites an existing key - AssignValue(context.Context, *DataKeyValue) (*Response, error) + AssignValue(context.Context, *DataKeyValue) (*DataKeyResponse, error) // GetValue will get the value for a key for an account GetValue(context.Context, *DataKey) (*DataResponse, error) } @@ -439,7 +387,7 @@ type UnimplementedAccountantServer struct { func (*UnimplementedAccountantServer) Register(ctx context.Context, req *RegisterInfo) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (*UnimplementedAccountantServer) AssignValue(ctx context.Context, req *DataKeyValue) (*Response, error) { +func (*UnimplementedAccountantServer) AssignValue(ctx context.Context, req *DataKeyValue) (*DataKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AssignValue not implemented") } func (*UnimplementedAccountantServer) GetValue(ctx context.Context, req *DataKey) (*DataResponse, error) { diff --git a/pkg/accounts/accounts.proto b/pkg/accounts/accounts.proto index 90ba7e1..50f0dd6 100644 --- a/pkg/accounts/accounts.proto +++ b/pkg/accounts/accounts.proto @@ -10,7 +10,7 @@ service Accountant { rpc Register(RegisterInfo) returns (RegisterResponse) {} // AssignValue assigns a key-value pair to an account, or overwrites an existing key - rpc AssignValue(DataKeyValue) returns (Response) {} + rpc AssignValue(DataKeyValue) returns (DataKeyResponse) {} // GetValue will get the value for a key for an account rpc GetValue(DataKey) returns (DataResponse) {} @@ -23,11 +23,7 @@ message RegisterInfo { } // RegisterResponse is the response information from registering an account -message RegisterResponse { - // The error value should only be populated if success is false - bool success = 1; - string error = 2; -} +message RegisterResponse {} // DataKeyValue represents a simple key value pair to assign to an account message DataKeyValue { @@ -39,12 +35,8 @@ message DataKeyValue { string value = 3; } -// Response is a simple response with success and error -message Response { - // error should only be populated if success is false - bool success = 1; - string error = 2; -} +// DataKeyResponse is a simple response +message DataKeyResponse {} // DataKey describes a simple key value with an account, for fetching message DataKey { @@ -57,10 +49,6 @@ message DataKey { // DataResponse describes a data fetch response message DataResponse { - // error should only be populated if success is false - bool success = 1; - string error = 2; - // The value of the key string value = 3; } diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 66a2baa..f6c63f6 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -12,7 +12,7 @@ import ( // Chunk represents a fixed square grid of tiles type Chunk struct { // Tiles represents the tiles within the chunk - Tiles []Tile `json:"tiles"` + Tiles []byte `json:"tiles"` } // Atlas represents a grid of Chunks @@ -43,7 +43,7 @@ func NewAtlas(size, chunkSize int) Atlas { // Initialise all the chunks for i := range a.Chunks { a.Chunks[i] = Chunk{ - Tiles: make([]Tile, chunkSize*chunkSize), + Tiles: make([]byte, chunkSize*chunkSize), } } @@ -90,7 +90,7 @@ func (a *Atlas) SpawnWalls() error { } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v vector.Vector, tile Tile) error { +func (a *Atlas) SetTile(v vector.Vector, tile byte) error { chunk := a.toChunk(v) if chunk >= len(a.Chunks) { return fmt.Errorf("location outside of allocated atlas") @@ -106,7 +106,7 @@ func (a *Atlas) SetTile(v vector.Vector, tile Tile) error { } // GetTile will return an individual tile -func (a *Atlas) GetTile(v vector.Vector) (Tile, error) { +func (a *Atlas) GetTile(v vector.Vector) (byte, error) { chunk := a.toChunk(v) if chunk >= len(a.Chunks) { return 0, fmt.Errorf("location outside of allocated atlas") diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index a9c7021..9d74138 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -81,13 +81,13 @@ func TestAtlas_GetSetTile(t *testing.T) { assert.NoError(t, a.SetTile(vector.Vector{X: 0, Y: 0}, 1)) tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) - assert.Equal(t, Tile(1), tile) + assert.Equal(t, byte(1), tile) // Set another tile to 1 and test it assert.NoError(t, a.SetTile(vector.Vector{X: 5, Y: -2}, 2)) tile, err = a.GetTile(vector.Vector{X: 5, Y: -2}) assert.NoError(t, err) - assert.Equal(t, Tile(2), tile) + assert.Equal(t, byte(2), tile) } func TestAtlas_Grown(t *testing.T) { @@ -108,15 +108,15 @@ func TestAtlas_Grown(t *testing.T) { tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) - assert.Equal(t, Tile(1), tile) + assert.Equal(t, byte(1), tile) tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.NoError(t, err) - assert.Equal(t, Tile(2), tile) + assert.Equal(t, byte(2), tile) tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.NoError(t, err) - assert.Equal(t, Tile(3), tile) + assert.Equal(t, byte(3), tile) // Grow it again even bigger err = a.Grow(10) @@ -125,15 +125,15 @@ func TestAtlas_Grown(t *testing.T) { tile, err = a.GetTile(vector.Vector{X: 0, Y: 0}) assert.NoError(t, err) - assert.Equal(t, Tile(1), tile) + assert.Equal(t, byte(1), tile) tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.NoError(t, err) - assert.Equal(t, Tile(2), tile) + assert.Equal(t, byte(2), tile) tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.NoError(t, err) - assert.Equal(t, Tile(3), tile) + assert.Equal(t, byte(3), tile) } func TestAtlas_SpawnWorld(t *testing.T) { diff --git a/pkg/atlas/tile.go b/pkg/atlas/tile.go index af44e87..2897647 100644 --- a/pkg/atlas/tile.go +++ b/pkg/atlas/tile.go @@ -1,12 +1,9 @@ package atlas -// Tile represents the type of a tile on the map -type Tile byte - const ( - TileEmpty = Tile(0) - TileRover = Tile(1) + TileEmpty = byte(0) + TileRover = byte(1) - TileWall = Tile(2) - TileRock = Tile(3) + TileWall = byte(2) + TileRock = byte(3) ) diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index c1fabcc..439d2f3 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -22,7 +22,7 @@ func TestCommand_Move(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - duration := 1 + var duration = 1 // Try the move command moveCommand := Command{Command: CommandMove, Bearing: "N", Duration: duration} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") @@ -33,6 +33,6 @@ func TestCommand_Move(t *testing.T) { newatributes, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0.0, Y: duration * attribs.Speed}) // We should have moved duration*speed north + pos.Add(vector.Vector{X: 0.0, Y: int(duration) * int(attribs.Speed)}) // We should have moved duration*speed north assert.Equal(t, pos, newatributes.Pos, "Failed to correctly set position for rover") } diff --git a/pkg/game/world.go b/pkg/game/world.go index 1880b74..af0af11 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -225,7 +225,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(id uuid.UUID) ([]atlas.Tile, error) { +func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -256,7 +256,7 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]atlas.Tile, error) { } // Gather up all tiles within the range - var radar = make([]atlas.Tile, radarSpan*radarSpan) + var radar = make([]byte, radarSpan*radarSpan) for j := scanMin.Y; j <= scanMax.Y; j++ { for i := scanMin.X; i <= scanMax.X; i++ { q := vector.Vector{X: i, Y: j} @@ -381,7 +381,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err } // PrintTiles simply prints the input tiles directly for debug -func PrintTiles(tiles []atlas.Tile) { +func PrintTiles(tiles []byte) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { diff --git a/pkg/rove/api.go b/pkg/rove/api.go deleted file mode 100644 index 4c258bc..0000000 --- a/pkg/rove/api.go +++ /dev/null @@ -1,94 +0,0 @@ -package rove - -import ( - "path" - - "github.com/mdiluz/rove/pkg/atlas" - "github.com/mdiluz/rove/pkg/game" -) - -// ============================== -// API: /status method: GET - -// Status queries the status of the server -func (s Server) Status() (r StatusResponse, err error) { - s.Get("status", &r) - return -} - -// StatusResponse is a struct that contains information on the status of the server -type StatusResponse struct { - Ready bool `json:"ready"` - Version string `json:"version"` - Tick int `json:"tick"` - NextTick string `json:"nexttick,omitempty"` -} - -// ============================== -// API: /register method: POST - -// Register registers a user by name -func (s Server) Register(d RegisterData) (r RegisterResponse, err error) { - err = s.Post("register", d, &r) - return -} - -// RegisterData describes the data to send when registering -type RegisterData struct { - Name string `json:"name"` -} - -// RegisterResponse describes the response to a register request -type RegisterResponse struct { - // Placeholder for future information -} - -// ============================== -// API: /{account}/command method: POST - -// Command issues a set of commands from the user -func (s Server) Command(account string, d CommandData) (r CommandResponse, err error) { - err = s.Post(path.Join(account, "command"), d, &r) - return -} - -// CommandData is a set of commands to execute in order -type CommandData struct { - Commands []game.Command `json:"commands"` -} - -// CommandResponse is the response to be sent back -type CommandResponse struct { - // Placeholder for future information -} - -// ================ -// API: /{account}/radar method: GET - -// Radar queries the current radar for the user -func (s Server) Radar(account string) (r RadarResponse, err error) { - err = s.Get(path.Join(account, "radar"), &r) - return -} - -// RadarResponse describes the response to a /radar call -type RadarResponse struct { - // The set of positions for nearby non-empty tiles - Range int `json:"range"` - Tiles []atlas.Tile `json:"tiles"` -} - -// ================ -// API: /{account}/rover method: GET - -// Rover queries the current state of the rover -func (s Server) Rover(account string) (r RoverResponse, err error) { - err = s.Get(path.Join(account, "rover"), &r) - return -} - -// RoverResponse includes information about the rover in question -type RoverResponse struct { - // The current position of this rover - Attributes game.RoverAttributes `json:"attributes"` -} diff --git a/pkg/rove/http.go b/pkg/rove/http.go deleted file mode 100644 index 37c16b9..0000000 --- a/pkg/rove/http.go +++ /dev/null @@ -1,73 +0,0 @@ -package rove - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" -) - -// Server is a simple wrapper to a server path -type Server string - -// Get performs a Get request -func (s Server) Get(path string, out interface{}) error { - u := url.URL{ - Scheme: "http", - Host: string(s), - Path: path, - } - if resp, err := http.Get(u.String()); err != nil { - return err - - } else if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) - } - return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) - - } else { - return json.NewDecoder(resp.Body).Decode(out) - } -} - -// Post performs a Post request -func (s Server) Post(path string, in, out interface{}) error { - u := url.URL{ - Scheme: "http", - Host: string(s), - Path: path, - } - client := &http.Client{} - - // Marshal the input - marshalled, err := json.Marshal(in) - if err != nil { - return err - } - - // Set up the request - req, err := http.NewRequest("POST", u.String(), bytes.NewReader(marshalled)) - if err != nil { - return err - } - - // Do the POST - req.Header.Set("Content-Type", "application/json") - if resp, err := client.Do(req); err != nil { - return err - - } else if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) - } - return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) - - } else { - return json.NewDecoder(resp.Body).Decode(out) - } -} diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go new file mode 100644 index 0000000..a9d0f02 --- /dev/null +++ b/pkg/rove/rove.pb.go @@ -0,0 +1,821 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: rove.proto + +package rove + +import ( + context "context" + fmt "fmt" + proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Command struct { + // The command to execute, currently only accepts move, which requires a bearing and a duration. + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` + Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Command) Reset() { *m = Command{} } +func (m *Command) String() string { return proto.CompactTextString(m) } +func (*Command) ProtoMessage() {} +func (*Command) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{0} +} + +func (m *Command) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Command.Unmarshal(m, b) +} +func (m *Command) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Command.Marshal(b, m, deterministic) +} +func (m *Command) XXX_Merge(src proto.Message) { + xxx_messageInfo_Command.Merge(m, src) +} +func (m *Command) XXX_Size() int { + return xxx_messageInfo_Command.Size(m) +} +func (m *Command) XXX_DiscardUnknown() { + xxx_messageInfo_Command.DiscardUnknown(m) +} + +var xxx_messageInfo_Command proto.InternalMessageInfo + +func (m *Command) GetCommand() string { + if m != nil { + return m.Command + } + return "" +} + +func (m *Command) GetBearing() string { + if m != nil { + return m.Bearing + } + return "" +} + +func (m *Command) GetDuration() int32 { + if m != nil { + return m.Duration + } + return 0 +} + +type CommandsRequest struct { + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CommandsRequest) Reset() { *m = CommandsRequest{} } +func (m *CommandsRequest) String() string { return proto.CompactTextString(m) } +func (*CommandsRequest) ProtoMessage() {} +func (*CommandsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{1} +} + +func (m *CommandsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CommandsRequest.Unmarshal(m, b) +} +func (m *CommandsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CommandsRequest.Marshal(b, m, deterministic) +} +func (m *CommandsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommandsRequest.Merge(m, src) +} +func (m *CommandsRequest) XXX_Size() int { + return xxx_messageInfo_CommandsRequest.Size(m) +} +func (m *CommandsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CommandsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CommandsRequest proto.InternalMessageInfo + +func (m *CommandsRequest) GetAccount() string { + if m != nil { + return m.Account + } + return "" +} + +func (m *CommandsRequest) GetCommands() []*Command { + if m != nil { + return m.Commands + } + return nil +} + +type Error struct { + // An explanation for the HTTP error returned + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Error) Reset() { *m = Error{} } +func (m *Error) String() string { return proto.CompactTextString(m) } +func (*Error) ProtoMessage() {} +func (*Error) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{2} +} + +func (m *Error) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Error.Unmarshal(m, b) +} +func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Error.Marshal(b, m, deterministic) +} +func (m *Error) XXX_Merge(src proto.Message) { + xxx_messageInfo_Error.Merge(m, src) +} +func (m *Error) XXX_Size() int { + return xxx_messageInfo_Error.Size(m) +} +func (m *Error) XXX_DiscardUnknown() { + xxx_messageInfo_Error.DiscardUnknown(m) +} + +var xxx_messageInfo_Error proto.InternalMessageInfo + +func (m *Error) GetError() string { + if m != nil { + return m.Error + } + return "" +} + +type RadarRequest struct { + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RadarRequest) Reset() { *m = RadarRequest{} } +func (m *RadarRequest) String() string { return proto.CompactTextString(m) } +func (*RadarRequest) ProtoMessage() {} +func (*RadarRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{3} +} + +func (m *RadarRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RadarRequest.Unmarshal(m, b) +} +func (m *RadarRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RadarRequest.Marshal(b, m, deterministic) +} +func (m *RadarRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RadarRequest.Merge(m, src) +} +func (m *RadarRequest) XXX_Size() int { + return xxx_messageInfo_RadarRequest.Size(m) +} +func (m *RadarRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RadarRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RadarRequest proto.InternalMessageInfo + +func (m *RadarRequest) GetAccount() string { + if m != nil { + return m.Account + } + return "" +} + +type RadarResponse struct { + // The range in tiles from the rover of the radar data + Range int32 `protobuf:"varint,1,opt,name=range,proto3" json:"range,omitempty"` + // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order + Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RadarResponse) Reset() { *m = RadarResponse{} } +func (m *RadarResponse) String() string { return proto.CompactTextString(m) } +func (*RadarResponse) ProtoMessage() {} +func (*RadarResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{4} +} + +func (m *RadarResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RadarResponse.Unmarshal(m, b) +} +func (m *RadarResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RadarResponse.Marshal(b, m, deterministic) +} +func (m *RadarResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RadarResponse.Merge(m, src) +} +func (m *RadarResponse) XXX_Size() int { + return xxx_messageInfo_RadarResponse.Size(m) +} +func (m *RadarResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RadarResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RadarResponse proto.InternalMessageInfo + +func (m *RadarResponse) GetRange() int32 { + if m != nil { + return m.Range + } + return 0 +} + +func (m *RadarResponse) GetTiles() []byte { + if m != nil { + return m.Tiles + } + return nil +} + +type RegisterRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RegisterRequest) Reset() { *m = RegisterRequest{} } +func (m *RegisterRequest) String() string { return proto.CompactTextString(m) } +func (*RegisterRequest) ProtoMessage() {} +func (*RegisterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{5} +} + +func (m *RegisterRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RegisterRequest.Unmarshal(m, b) +} +func (m *RegisterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RegisterRequest.Marshal(b, m, deterministic) +} +func (m *RegisterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterRequest.Merge(m, src) +} +func (m *RegisterRequest) XXX_Size() int { + return xxx_messageInfo_RegisterRequest.Size(m) +} +func (m *RegisterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterRequest proto.InternalMessageInfo + +func (m *RegisterRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type RoverRequest struct { + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RoverRequest) Reset() { *m = RoverRequest{} } +func (m *RoverRequest) String() string { return proto.CompactTextString(m) } +func (*RoverRequest) ProtoMessage() {} +func (*RoverRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{6} +} + +func (m *RoverRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RoverRequest.Unmarshal(m, b) +} +func (m *RoverRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RoverRequest.Marshal(b, m, deterministic) +} +func (m *RoverRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RoverRequest.Merge(m, src) +} +func (m *RoverRequest) XXX_Size() int { + return xxx_messageInfo_RoverRequest.Size(m) +} +func (m *RoverRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RoverRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RoverRequest proto.InternalMessageInfo + +func (m *RoverRequest) GetAccount() string { + if m != nil { + return m.Account + } + return "" +} + +type RoverResponse struct { + // The name of the rover + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Position of the rover in world coordinates + Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` + // The range of this rover's radar + Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` + // The speed the rover can move per tick + Speed int32 `protobuf:"varint,4,opt,name=speed,proto3" json:"speed,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RoverResponse) Reset() { *m = RoverResponse{} } +func (m *RoverResponse) String() string { return proto.CompactTextString(m) } +func (*RoverResponse) ProtoMessage() {} +func (*RoverResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{7} +} + +func (m *RoverResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RoverResponse.Unmarshal(m, b) +} +func (m *RoverResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RoverResponse.Marshal(b, m, deterministic) +} +func (m *RoverResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RoverResponse.Merge(m, src) +} +func (m *RoverResponse) XXX_Size() int { + return xxx_messageInfo_RoverResponse.Size(m) +} +func (m *RoverResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RoverResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RoverResponse proto.InternalMessageInfo + +func (m *RoverResponse) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *RoverResponse) GetPosition() *Vector { + if m != nil { + return m.Position + } + return nil +} + +func (m *RoverResponse) GetRange() int32 { + if m != nil { + return m.Range + } + return 0 +} + +func (m *RoverResponse) GetSpeed() int32 { + if m != nil { + return m.Speed + } + return 0 +} + +type StatusResponse struct { + // The time the next tick will occur + NextTick string `protobuf:"bytes,1,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` + // Whether the server is ready to accept requests + Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` + // The tick rate of the server in minutes (how many minutes per tick) + Tick int32 `protobuf:"varint,3,opt,name=tick,proto3" json:"tick,omitempty"` + // The version of the server in v{major}.{minor}-{delta}-{sha} form + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StatusResponse) Reset() { *m = StatusResponse{} } +func (m *StatusResponse) String() string { return proto.CompactTextString(m) } +func (*StatusResponse) ProtoMessage() {} +func (*StatusResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{8} +} + +func (m *StatusResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StatusResponse.Unmarshal(m, b) +} +func (m *StatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StatusResponse.Marshal(b, m, deterministic) +} +func (m *StatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusResponse.Merge(m, src) +} +func (m *StatusResponse) XXX_Size() int { + return xxx_messageInfo_StatusResponse.Size(m) +} +func (m *StatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StatusResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_StatusResponse proto.InternalMessageInfo + +func (m *StatusResponse) GetNextTick() string { + if m != nil { + return m.NextTick + } + return "" +} + +func (m *StatusResponse) GetReady() bool { + if m != nil { + return m.Ready + } + return false +} + +func (m *StatusResponse) GetTick() int32 { + if m != nil { + return m.Tick + } + return 0 +} + +func (m *StatusResponse) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +type Vector struct { + X int32 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` + Y int32 `protobuf:"varint,2,opt,name=y,proto3" json:"y,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Vector) Reset() { *m = Vector{} } +func (m *Vector) String() string { return proto.CompactTextString(m) } +func (*Vector) ProtoMessage() {} +func (*Vector) Descriptor() ([]byte, []int) { + return fileDescriptor_cea399972d1e9fa7, []int{9} +} + +func (m *Vector) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Vector.Unmarshal(m, b) +} +func (m *Vector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Vector.Marshal(b, m, deterministic) +} +func (m *Vector) XXX_Merge(src proto.Message) { + xxx_messageInfo_Vector.Merge(m, src) +} +func (m *Vector) XXX_Size() int { + return xxx_messageInfo_Vector.Size(m) +} +func (m *Vector) XXX_DiscardUnknown() { + xxx_messageInfo_Vector.DiscardUnknown(m) +} + +var xxx_messageInfo_Vector proto.InternalMessageInfo + +func (m *Vector) GetX() int32 { + if m != nil { + return m.X + } + return 0 +} + +func (m *Vector) GetY() int32 { + if m != nil { + return m.Y + } + return 0 +} + +func init() { + proto.RegisterType((*Command)(nil), "rove.Command") + proto.RegisterType((*CommandsRequest)(nil), "rove.CommandsRequest") + proto.RegisterType((*Error)(nil), "rove.Error") + proto.RegisterType((*RadarRequest)(nil), "rove.RadarRequest") + proto.RegisterType((*RadarResponse)(nil), "rove.RadarResponse") + proto.RegisterType((*RegisterRequest)(nil), "rove.RegisterRequest") + proto.RegisterType((*RoverRequest)(nil), "rove.RoverRequest") + proto.RegisterType((*RoverResponse)(nil), "rove.RoverResponse") + proto.RegisterType((*StatusResponse)(nil), "rove.StatusResponse") + proto.RegisterType((*Vector)(nil), "rove.Vector") +} + +func init() { + proto.RegisterFile("rove.proto", fileDescriptor_cea399972d1e9fa7) +} + +var fileDescriptor_cea399972d1e9fa7 = []byte{ + // 477 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x5d, 0x6b, 0xdb, 0x30, + 0x14, 0x8d, 0x93, 0x38, 0x75, 0x6f, 0x92, 0x15, 0xb4, 0x6e, 0x98, 0x94, 0x41, 0x10, 0x1b, 0x64, + 0x2f, 0x2e, 0x64, 0x2f, 0x83, 0x3e, 0x8e, 0xfe, 0x01, 0x75, 0x14, 0xf6, 0x34, 0x14, 0xfb, 0xce, + 0x98, 0x36, 0x96, 0x2b, 0xc9, 0x21, 0xf9, 0x49, 0xfb, 0x97, 0x43, 0xba, 0xb2, 0x97, 0x94, 0x8d, + 0xf6, 0xed, 0x9e, 0xab, 0xab, 0x73, 0xce, 0xfd, 0x00, 0xd0, 0x6a, 0x87, 0x59, 0xa3, 0x95, 0x55, + 0x6c, 0xec, 0xe2, 0xc5, 0x55, 0xa9, 0x54, 0xf9, 0x88, 0xd7, 0x3e, 0xb7, 0x69, 0x7f, 0x5d, 0xe3, + 0xb6, 0xb1, 0x07, 0x2a, 0xe1, 0x3f, 0xe0, 0xec, 0x9b, 0xda, 0x6e, 0x65, 0x5d, 0xb0, 0x14, 0xce, + 0x72, 0x0a, 0xd3, 0x68, 0x19, 0xad, 0xce, 0x45, 0x07, 0xdd, 0xcb, 0x06, 0xa5, 0xae, 0xea, 0x32, + 0x1d, 0xd2, 0x4b, 0x80, 0x6c, 0x01, 0x49, 0xd1, 0x6a, 0x69, 0x2b, 0x55, 0xa7, 0xa3, 0x65, 0xb4, + 0x8a, 0x45, 0x8f, 0xf9, 0x3d, 0x5c, 0x04, 0x6a, 0x23, 0xf0, 0xa9, 0x45, 0x63, 0x1d, 0x91, 0xcc, + 0x73, 0xd5, 0xd6, 0xb6, 0x93, 0x08, 0x90, 0x7d, 0x86, 0x24, 0xa8, 0x99, 0x74, 0xb8, 0x1c, 0xad, + 0xa6, 0xeb, 0x79, 0xe6, 0x3b, 0x09, 0x14, 0xa2, 0x7f, 0xe6, 0x1f, 0x20, 0xbe, 0xd5, 0x5a, 0x69, + 0x76, 0x09, 0x31, 0xba, 0x20, 0x70, 0x11, 0xe0, 0x2b, 0x98, 0x09, 0x59, 0x48, 0xfd, 0xa2, 0x26, + 0xbf, 0x81, 0x79, 0xa8, 0x34, 0x8d, 0xaa, 0x0d, 0x3a, 0x42, 0x2d, 0xeb, 0x12, 0x7d, 0x61, 0x2c, + 0x08, 0xb8, 0xac, 0xad, 0x1e, 0xd1, 0xf8, 0xde, 0x67, 0x82, 0x00, 0xff, 0x04, 0x17, 0x02, 0xcb, + 0xca, 0x58, 0xec, 0x95, 0x18, 0x8c, 0x6b, 0xb9, 0xc5, 0x20, 0xe3, 0x63, 0xef, 0x46, 0xed, 0xf0, + 0x15, 0x6e, 0x0e, 0x30, 0x0f, 0x95, 0xc1, 0xcd, 0x3f, 0xe8, 0xd8, 0x0a, 0x92, 0x46, 0x99, 0xca, + 0xcf, 0xdb, 0xd9, 0x99, 0xae, 0x67, 0x34, 0xa6, 0x7b, 0xcc, 0xad, 0xd2, 0xa2, 0x7f, 0xfd, 0xdb, + 0xcb, 0xe8, 0x59, 0x2f, 0xa6, 0x41, 0x2c, 0xd2, 0x31, 0x65, 0x3d, 0xe0, 0x4f, 0xf0, 0xe6, 0xce, + 0x4a, 0xdb, 0x9a, 0x5e, 0xfb, 0x0a, 0xce, 0x6b, 0xdc, 0xdb, 0x9f, 0xb6, 0xca, 0x1f, 0x82, 0x81, + 0xc4, 0x25, 0xbe, 0x57, 0xf9, 0x83, 0xa7, 0x46, 0x59, 0x1c, 0xbc, 0x83, 0x44, 0x10, 0x70, 0x76, + 0x7d, 0x35, 0xe9, 0xf9, 0xd8, 0x75, 0xbb, 0x43, 0x6d, 0x9c, 0xdb, 0x31, 0x75, 0x1b, 0x20, 0xff, + 0x08, 0x13, 0xb2, 0xcc, 0x66, 0x10, 0xed, 0xc3, 0xc0, 0xa3, 0xbd, 0x43, 0xc4, 0x1b, 0x8b, 0xe8, + 0xb0, 0xfe, 0x3d, 0x84, 0xa9, 0x1f, 0xca, 0x1d, 0xea, 0x1d, 0x6a, 0x76, 0x03, 0x49, 0x77, 0x52, + 0xec, 0xdd, 0xc9, 0x7d, 0x74, 0x27, 0xb6, 0x78, 0x9f, 0xd1, 0xb9, 0x67, 0xdd, 0xb9, 0x67, 0xb7, + 0xee, 0xdc, 0xf9, 0x80, 0xad, 0x21, 0xf6, 0xeb, 0x66, 0x8c, 0x7e, 0x1e, 0x5f, 0xc9, 0xe2, 0xed, + 0x49, 0x8e, 0xa6, 0xc0, 0x07, 0x4e, 0xb0, 0xdb, 0x72, 0x27, 0xf8, 0x6c, 0xeb, 0x2f, 0x08, 0x3a, + 0xf3, 0xbd, 0xe0, 0xd1, 0x21, 0xf4, 0x82, 0xc7, 0x2b, 0xe7, 0x03, 0xf6, 0x15, 0x26, 0xb4, 0x0a, + 0xf6, 0x1f, 0xde, 0xc5, 0x25, 0x7d, 0x3c, 0x5d, 0x18, 0x1f, 0x6c, 0x26, 0xbe, 0xee, 0xcb, 0x9f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xed, 0x84, 0x22, 0xdd, 0x01, 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// RoverServerClient is the client API for RoverServer service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type RoverServerClient interface { + // Send commands to rover + // + // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) + // Get radar information + // + // Gets the radar output for the given rover + Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) + // Register an account + // + // Tries to register an account with the given name + Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) + // Get rover information + // + // Gets information for the account's rover + Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) + // Server status + // + // Responds with various details about the current server status + Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) +} + +type roverServerClient struct { + cc grpc.ClientConnInterface +} + +func NewRoverServerClient(cc grpc.ClientConnInterface) RoverServerClient { + return &roverServerClient{cc} +} + +func (c *roverServerClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/rove.RoverServer/Commands", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roverServerClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { + out := new(RadarResponse) + err := c.cc.Invoke(ctx, "/rove.RoverServer/Radar", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roverServerClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/rove.RoverServer/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roverServerClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { + out := new(RoverResponse) + err := c.cc.Invoke(ctx, "/rove.RoverServer/Rover", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roverServerClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { + out := new(StatusResponse) + err := c.cc.Invoke(ctx, "/rove.RoverServer/Status", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RoverServerServer is the server API for RoverServer service. +type RoverServerServer interface { + // Send commands to rover + // + // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + Commands(context.Context, *CommandsRequest) (*empty.Empty, error) + // Get radar information + // + // Gets the radar output for the given rover + Radar(context.Context, *RadarRequest) (*RadarResponse, error) + // Register an account + // + // Tries to register an account with the given name + Register(context.Context, *RegisterRequest) (*empty.Empty, error) + // Get rover information + // + // Gets information for the account's rover + Rover(context.Context, *RoverRequest) (*RoverResponse, error) + // Server status + // + // Responds with various details about the current server status + Status(context.Context, *empty.Empty) (*StatusResponse, error) +} + +// UnimplementedRoverServerServer can be embedded to have forward compatible implementations. +type UnimplementedRoverServerServer struct { +} + +func (*UnimplementedRoverServerServer) Commands(ctx context.Context, req *CommandsRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") +} +func (*UnimplementedRoverServerServer) Radar(ctx context.Context, req *RadarRequest) (*RadarResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") +} +func (*UnimplementedRoverServerServer) Register(ctx context.Context, req *RegisterRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (*UnimplementedRoverServerServer) Rover(ctx context.Context, req *RoverRequest) (*RoverResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Rover not implemented") +} +func (*UnimplementedRoverServerServer) Status(ctx context.Context, req *empty.Empty) (*StatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") +} + +func RegisterRoverServerServer(s *grpc.Server, srv RoverServerServer) { + s.RegisterService(&_RoverServer_serviceDesc, srv) +} + +func _RoverServer_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CommandsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoverServerServer).Commands(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoverServer/Commands", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoverServerServer).Commands(ctx, req.(*CommandsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoverServer_Radar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RadarRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoverServerServer).Radar(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoverServer/Radar", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoverServerServer).Radar(ctx, req.(*RadarRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoverServer_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoverServerServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoverServer/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoverServerServer).Register(ctx, req.(*RegisterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoverServer_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RoverRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoverServerServer).Rover(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoverServer/Rover", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoverServerServer).Rover(ctx, req.(*RoverRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoverServer_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoverServerServer).Status(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoverServer/Status", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoverServerServer).Status(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +var _RoverServer_serviceDesc = grpc.ServiceDesc{ + ServiceName: "rove.RoverServer", + HandlerType: (*RoverServerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Commands", + Handler: _RoverServer_Commands_Handler, + }, + { + MethodName: "Radar", + Handler: _RoverServer_Radar_Handler, + }, + { + MethodName: "Register", + Handler: _RoverServer_Register_Handler, + }, + { + MethodName: "Rover", + Handler: _RoverServer_Rover_Handler, + }, + { + MethodName: "Status", + Handler: _RoverServer_Status_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "rove.proto", +} diff --git a/pkg/rove/rove.proto b/pkg/rove/rove.proto new file mode 100644 index 0000000..a4ce6b7 --- /dev/null +++ b/pkg/rove/rove.proto @@ -0,0 +1,103 @@ +syntax = "proto3"; + +package rove; + +import "google/protobuf/empty.proto"; + +service RoverServer { + // Send commands to rover + // + // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + rpc Commands(CommandsRequest) returns (google.protobuf.Empty) {} + + // Get radar information + // + // Gets the radar output for the given rover + rpc Radar(RadarRequest) returns (RadarResponse) {} + + // Register an account + // + // Tries to register an account with the given name + rpc Register(RegisterRequest) returns (google.protobuf.Empty) {} + + // Get rover information + // + // Gets information for the account's rover + rpc Rover(RoverRequest) returns (RoverResponse) {} + + // Server status + // + // Responds with various details about the current server status + rpc Status(google.protobuf.Empty) returns (StatusResponse) {} +} + +message Command { + // The command to execute, currently only accepts move, which requires a bearing and a duration. + string command = 1; + + string bearing = 2; + int32 duration = 3; +} + +message CommandsRequest { + string account = 1; + repeated Command commands = 2; +} + +message Error { + // An explanation for the HTTP error returned + string error = 1; +} + +message RadarRequest { + string account = 1; +} + +message RadarResponse { + // The range in tiles from the rover of the radar data + int32 range = 1; + + // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order + bytes tiles = 2; +} + +message RegisterRequest { + string name = 1; +} + +message RoverRequest { + string account = 1; +} + +message RoverResponse { + // The name of the rover + string name = 1; + + // Position of the rover in world coordinates + Vector position = 2; + + // The range of this rover's radar + int32 range = 3; + + // The speed the rover can move per tick + int32 speed = 4; +} + +message StatusResponse { + // The time the next tick will occur + string next_tick = 1; + + // Whether the server is ready to accept requests + bool ready = 2; + + // The tick rate of the server in minutes (how many minutes per tick) + int32 tick = 3; + + // The version of the server in v{major}.{minor}-{delta}-{sha} form + string version = 4; +} + +message Vector { + int32 x = 1; + int32 y = 2; +} \ No newline at end of file diff --git a/swagger.yml b/swagger.yml deleted file mode 100644 index 8f9e9d7..0000000 --- a/swagger.yml +++ /dev/null @@ -1,246 +0,0 @@ -swagger: "2.0" -info: - description: "Rove is an asychronous nomadic game about exploring a planet as part of a loose community" - version: "0.1" - title: "Rove Server" -host: "api.rove-game.com:8080" -basePath: "/" -tags: -- name: "server" - description: "Interactions with the server itself" -- name: "accounts" - description: "Access to accounts" -- name: "rove" - description: "Operations for the game" -schemes: -- "http" -consumes: - - application/json -produces: - - application/json -paths: - /status: - get: - tags: - - "server" - summary: "Server status" - description: "Responds with various details about the current server status" - operationId: "Status" - responses: - "200": - description: "Server is active" - schema: - $ref: '#/definitions/status' - /register: - post: - tags: - - "accounts" - summary: "Register an account" - description: "Tries to register an account with the given name" - operationId: "Register" - parameters: - - in: body - name: name - schema: - $ref: '#/definitions/register-data' - responses: - "200": - description: "Successfully created account" - "400": - description: "Bad request, typically due to duplicate name" - schema: - $ref: '#/definitions/error' - "500": - description: "Server encountered error, please report this as a bug" - schema: - $ref: '#/definitions/error' - - /{account}/commands: - post: - tags: - - rove - summary: Send commands to rover - description: "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent" - operationId: "Commands" - parameters: - - in: path - name: account - required: true - type: string - - in: body - name: commands - schema: - $ref: '#/definitions/commands-data' - responses: - "200": - description: "Successfully queued commands" - "400": - description: "Bad request, typically due to unknown command parameters" - schema: - $ref: '#/definitions/error' - "500": - description: "Server encountered error, please report this as a bug" - schema: - $ref: '#/definitions/error' - - /{account}/radar: - get: - tags: - - rove - summary: Get radar information - description: "Gets the radar output for the given rover" - operationId: "Radar" - parameters: - - in: path - name: account - required: true - type: string - responses: - "200": - description: "Successfully returned rover radar" - schema: - $ref: '#/definitions/radar-response' - "400": - description: "Bad request, typically due to unknown account" - schema: - $ref: '#/definitions/error' - "500": - description: "Server encountered error, please report this as a bug" - schema: - $ref: '#/definitions/error' - - /{account}/rover: - get: - tags: - - rove - summary: Get rover information - description: "Gets information for the account's rover" - operationId: "Rover" - parameters: - - in: path - name: account - required: true - type: string - responses: - "200": - description: "Successfully returned rover information" - schema: - $ref: '#/definitions/rover-response' - "400": - description: "Bad request, typically due to unknown account" - schema: - $ref: '#/definitions/error' - "500": - description: "Server encountered error, please report this as a bug" - schema: - $ref: '#/definitions/error' - -definitions: - status: - properties: - ready: - description: Whether the server is ready to accept requests - type: boolean - example: true - version: - description: The version of the server in v{major}.{minor}-{delta}-{sha} form - type: string - example: "v0.12-1-g7d1a2d7" - tick: - description: The tick rate of the server in minutes (how many minutes per tick) - type: integer - example: 5 - nexttick: - description: The time the next tick will occur - type: string - example: "15:30:00" - - error: - properties: - error: - description: An explanation for the HTTP error returned - type: string - example: "account not found" - - register-data: - properties: - name: - description: The account name - type: string - example: "myname" - required: - - name - - command: - properties: - command: - description: "The command to execute, currently only accepts move, which requires a bearing and a duration." - type: string - example: move - bearing: - type: string - example: NE - duration: - type: integer - example: 5 - - commands-data: - properties: - commands: - description: A set of commands to exectute in the order given - type: array - items: - type: object - properties: - schema: - $ref: '#/definitions/command' - - radar-response: - properties: - range: - description: The range in tiles from the rover of the radar data - type: integer - example: 5 - tiles: - description: A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order - type: array - items: - type: integer - - vector: - properties: - 'x': - type: integer - example: 1 - 'y': - type: integer - example: 2 - - rover-attributes: - properties: - speed: - description: The speed the rover can move per tick - type: integer - example: 1 - range: - description: The range of this rover's radar - type: integer - example: 5 - name: - description: The name of the rover - type: string - example: rover-one - position: - description: Position of the rover in world coordinates - type: object - properties: - schema: - $ref: '#/definitions/vector' - - rover-response: - properties: - attributes: - description: The attributes of the given rover - type: object - $ref: '#/definitions/rover-attributes' - From 8c6230ca205fc1c274c826832fc8824b085bf1d2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 00:23:21 +0100 Subject: [PATCH 201/495] Implement a reverse proxy using grpc-gateway --- Dockerfile | 5 +- Makefile | 8 +- cmd/rove-reverse-proxy/main.go | 45 + cmd/rove-server/internal/server.go | 2 +- cmd/rove/main.go | 2 +- docker-compose.yml | 18 +- go.mod | 5 +- go.sum | 19 +- pkg/accounts/accounts.pb.go | 631 +++++++---- pkg/rove/rove.pb.go | 1413 ++++++++++++++---------- pkg/rove/rove.pb.gw.go | 464 ++++++++ {pkg => proto}/accounts/accounts.proto | 0 proto/google/README.grpc-gateway | 23 + proto/google/api/annotations.proto | 31 + proto/google/api/http.proto | 318 ++++++ proto/google/api/httpbody.proto | 78 ++ proto/google/rpc/code.proto | 186 ++++ proto/google/rpc/error_details.proto | 200 ++++ proto/google/rpc/status.proto | 92 ++ {pkg => proto}/rove/rove.proto | 57 +- proto/rove/rove.swagger.json | 318 ++++++ tools/tools.go | 9 + 22 files changed, 3122 insertions(+), 802 deletions(-) create mode 100644 cmd/rove-reverse-proxy/main.go create mode 100644 pkg/rove/rove.pb.gw.go rename {pkg => proto}/accounts/accounts.proto (100%) create mode 100644 proto/google/README.grpc-gateway create mode 100644 proto/google/api/annotations.proto create mode 100644 proto/google/api/http.proto create mode 100644 proto/google/api/httpbody.proto create mode 100644 proto/google/rpc/code.proto create mode 100644 proto/google/rpc/error_details.proto create mode 100644 proto/google/rpc/status.proto rename {pkg => proto}/rove/rove.proto (76%) create mode 100644 proto/rove/rove.swagger.json create mode 100644 tools/tools.go diff --git a/Dockerfile b/Dockerfile index adedc9b..8c8b3c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,9 +8,10 @@ RUN go mod download # For /usr/share/dict/words RUN apt-get -q update && apt-get -qy install wamerican -# Build both executables +# Build the executables RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go -RUN go build -o rove-accountant -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-accountant/main.go +RUN go build -o rove-accountant cmd/rove-accountant/main.go +RUN go build -o rove-reverse-proxy cmd/rove-reverse-proxy/main.go CMD [ "./rove-server" ] diff --git a/Makefile b/Makefile index 9205bd6..953856d 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,12 @@ install: go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... gen: - protoc --proto_path pkg/accounts --go_out=plugins=grpc:pkg/accounts/ --go_opt=paths=source_relative pkg/accounts/accounts.proto - protoc --proto_path pkg/rove --go_out=plugins=grpc:pkg/rove/ --go_opt=paths=source_relative pkg/rove/rove.proto + @echo Generating accountant gRPC + protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/accounts/accounts.proto + @echo Generating rove server gRPC + protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/rove/rove.proto + protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto + protoc --proto_path proto --swagger_out=logtostderr=true:proto/ proto/rove/rove.proto test: @echo Unit tests diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-reverse-proxy/main.go new file mode 100644 index 0000000..63f6ca1 --- /dev/null +++ b/cmd/rove-reverse-proxy/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "flag" + "fmt" + "net/http" + "os" + + "github.com/golang/glog" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "google.golang.org/grpc" + + "github.com/mdiluz/rove/pkg/rove" +) + +var endpoint = os.Getenv("GRPC_ENDPOINT") +var address = os.Getenv("HOST_ADDRESS") + +func run() error { + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + // Create a new mux and register it with the gRPC engpoint + fmt.Printf("Hosting reverse-proxy on %s for %s\n", address, endpoint) + mux := runtime.NewServeMux() + opts := []grpc.DialOption{grpc.WithInsecure()} + err := rove.RegisterRoveServerHandlerFromEndpoint(ctx, mux, endpoint, opts) + if err != nil { + return err + } + + // Start the HTTP server and proxy calls to gRPC endpoint when needed + return http.ListenAndServe(address, mux) +} + +func main() { + flag.Parse() + defer glog.Flush() + + if err := run(); err != nil { + glog.Fatal(err) + } +} diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 920cbf2..3495bbd 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -129,7 +129,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { log.Fatalf("failed to listen: %v", err) } s.grpcServ = grpc.NewServer() - rove.RegisterRoverServerServer(s.grpcServ, s) + rove.RegisterRoveServerServer(s.grpcServ, s) return nil } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 7e7e418..2ecd94f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -98,7 +98,7 @@ func InnerMain(command string) error { if err != nil { return err } - var client = rove.NewRoverServerClient(clientConn) + var client = rove.NewRoveServerClient(clientConn) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() diff --git a/docker-compose.yml b/docker-compose.yml index 83b3396..0aa33f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,8 +18,7 @@ services: - persistent-data:/mnt/rove-server:rw command: [ ./rove-accountant ] - rove-server: - depends_on: [ rove-accountant ] + rove-reverse-proxy: build: context: . dockerfile: Dockerfile @@ -28,6 +27,19 @@ services: - "8080:8080" environment: - HOST_ADDRESS=:8080 + - GRPC_ENDPOINT=rove-server:8082 + command: [ ./rove-reverse-proxy ] + + rove-server: + depends_on: [ rove-accountant, rove-reverse-proxy ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + ports: + - "8082:8082" + environment: + - HOST_ADDRESS=:8082 - DATA_PATH=/mnt/rove-server - ACCOUNTANT_ADDRESS=rove-accountant:8081 volumes: @@ -41,7 +53,7 @@ services: image: rove:latest environment: - ACCOUNTANT_ADDRESS=rove-accountant:8081 - - ROVE_SERVER_ADDRESS=rove-server:8080 + - ROVE_SERVER_ADDRESS=rove-reverse-proxy:8080 command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw diff --git a/go.mod b/go.mod index c9465c4..e21de42 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,16 @@ module github.com/mdiluz/rove go 1.14 require ( + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 - github.com/gorilla/mux v1.7.4 + github.com/grpc-ecosystem/grpc-gateway v1.14.6 github.com/onsi/ginkgo v1.12.3 // indirect github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 + google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884 google.golang.org/grpc v1.29.1 + google.golang.org/protobuf v1.23.0 ) diff --git a/go.sum b/go.sum index 499b4f0..57044e0 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,22 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -30,8 +36,8 @@ github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -47,6 +53,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -60,14 +67,18 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -96,9 +107,12 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884 h1:fiNLklpBwWK1mth30Hlwk+fcdBmIALlgF5iy77O37Ig= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -113,6 +127,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/accounts/accounts.pb.go b/pkg/accounts/accounts.pb.go index aa6fcd2..ad19fae 100644 --- a/pkg/accounts/accounts.pb.go +++ b/pkg/accounts/accounts.pb.go @@ -1,316 +1,505 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: accounts.proto +// versions: +// protoc-gen-go v1.23.0 +// protoc v3.6.1 +// source: accounts/accounts.proto package accounts import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 // RegisterInfo contains the information needed to register an account type RegisterInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The name for the account, must be unique - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *RegisterInfo) Reset() { *m = RegisterInfo{} } -func (m *RegisterInfo) String() string { return proto.CompactTextString(m) } -func (*RegisterInfo) ProtoMessage() {} +func (x *RegisterInfo) Reset() { + *x = RegisterInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterInfo) ProtoMessage() {} + +func (x *RegisterInfo) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterInfo.ProtoReflect.Descriptor instead. func (*RegisterInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{0} + return file_accounts_accounts_proto_rawDescGZIP(), []int{0} } -func (m *RegisterInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RegisterInfo.Unmarshal(m, b) -} -func (m *RegisterInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RegisterInfo.Marshal(b, m, deterministic) -} -func (m *RegisterInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RegisterInfo.Merge(m, src) -} -func (m *RegisterInfo) XXX_Size() int { - return xxx_messageInfo_RegisterInfo.Size(m) -} -func (m *RegisterInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RegisterInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RegisterInfo proto.InternalMessageInfo - -func (m *RegisterInfo) GetName() string { - if m != nil { - return m.Name +func (x *RegisterInfo) GetName() string { + if x != nil { + return x.Name } return "" } // RegisterResponse is the response information from registering an account type RegisterResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *RegisterResponse) Reset() { *m = RegisterResponse{} } -func (m *RegisterResponse) String() string { return proto.CompactTextString(m) } -func (*RegisterResponse) ProtoMessage() {} +func (x *RegisterResponse) Reset() { + *x = RegisterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterResponse) ProtoMessage() {} + +func (x *RegisterResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. func (*RegisterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{1} + return file_accounts_accounts_proto_rawDescGZIP(), []int{1} } -func (m *RegisterResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RegisterResponse.Unmarshal(m, b) -} -func (m *RegisterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RegisterResponse.Marshal(b, m, deterministic) -} -func (m *RegisterResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RegisterResponse.Merge(m, src) -} -func (m *RegisterResponse) XXX_Size() int { - return xxx_messageInfo_RegisterResponse.Size(m) -} -func (m *RegisterResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RegisterResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RegisterResponse proto.InternalMessageInfo - // DataKeyValue represents a simple key value pair to assign to an account type DataKeyValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account to assign the new key value pair to Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The key value pair to assign - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } -func (m *DataKeyValue) Reset() { *m = DataKeyValue{} } -func (m *DataKeyValue) String() string { return proto.CompactTextString(m) } -func (*DataKeyValue) ProtoMessage() {} +func (x *DataKeyValue) Reset() { + *x = DataKeyValue{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataKeyValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataKeyValue) ProtoMessage() {} + +func (x *DataKeyValue) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataKeyValue.ProtoReflect.Descriptor instead. func (*DataKeyValue) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{2} + return file_accounts_accounts_proto_rawDescGZIP(), []int{2} } -func (m *DataKeyValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DataKeyValue.Unmarshal(m, b) -} -func (m *DataKeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DataKeyValue.Marshal(b, m, deterministic) -} -func (m *DataKeyValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataKeyValue.Merge(m, src) -} -func (m *DataKeyValue) XXX_Size() int { - return xxx_messageInfo_DataKeyValue.Size(m) -} -func (m *DataKeyValue) XXX_DiscardUnknown() { - xxx_messageInfo_DataKeyValue.DiscardUnknown(m) -} - -var xxx_messageInfo_DataKeyValue proto.InternalMessageInfo - -func (m *DataKeyValue) GetAccount() string { - if m != nil { - return m.Account +func (x *DataKeyValue) GetAccount() string { + if x != nil { + return x.Account } return "" } -func (m *DataKeyValue) GetKey() string { - if m != nil { - return m.Key +func (x *DataKeyValue) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *DataKeyValue) GetValue() string { - if m != nil { - return m.Value +func (x *DataKeyValue) GetValue() string { + if x != nil { + return x.Value } return "" } // DataKeyResponse is a simple response type DataKeyResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *DataKeyResponse) Reset() { *m = DataKeyResponse{} } -func (m *DataKeyResponse) String() string { return proto.CompactTextString(m) } -func (*DataKeyResponse) ProtoMessage() {} +func (x *DataKeyResponse) Reset() { + *x = DataKeyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataKeyResponse) ProtoMessage() {} + +func (x *DataKeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataKeyResponse.ProtoReflect.Descriptor instead. func (*DataKeyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{3} + return file_accounts_accounts_proto_rawDescGZIP(), []int{3} } -func (m *DataKeyResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DataKeyResponse.Unmarshal(m, b) -} -func (m *DataKeyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DataKeyResponse.Marshal(b, m, deterministic) -} -func (m *DataKeyResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataKeyResponse.Merge(m, src) -} -func (m *DataKeyResponse) XXX_Size() int { - return xxx_messageInfo_DataKeyResponse.Size(m) -} -func (m *DataKeyResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DataKeyResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DataKeyResponse proto.InternalMessageInfo - // DataKey describes a simple key value with an account, for fetching type DataKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account to fetch data for Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The key to fetch - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` } -func (m *DataKey) Reset() { *m = DataKey{} } -func (m *DataKey) String() string { return proto.CompactTextString(m) } -func (*DataKey) ProtoMessage() {} +func (x *DataKey) Reset() { + *x = DataKey{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataKey) ProtoMessage() {} + +func (x *DataKey) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataKey.ProtoReflect.Descriptor instead. func (*DataKey) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{4} + return file_accounts_accounts_proto_rawDescGZIP(), []int{4} } -func (m *DataKey) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DataKey.Unmarshal(m, b) -} -func (m *DataKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DataKey.Marshal(b, m, deterministic) -} -func (m *DataKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataKey.Merge(m, src) -} -func (m *DataKey) XXX_Size() int { - return xxx_messageInfo_DataKey.Size(m) -} -func (m *DataKey) XXX_DiscardUnknown() { - xxx_messageInfo_DataKey.DiscardUnknown(m) -} - -var xxx_messageInfo_DataKey proto.InternalMessageInfo - -func (m *DataKey) GetAccount() string { - if m != nil { - return m.Account +func (x *DataKey) GetAccount() string { + if x != nil { + return x.Account } return "" } -func (m *DataKey) GetKey() string { - if m != nil { - return m.Key +func (x *DataKey) GetKey() string { + if x != nil { + return x.Key } return "" } // DataResponse describes a data fetch response type DataResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The value of the key - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } -func (m *DataResponse) Reset() { *m = DataResponse{} } -func (m *DataResponse) String() string { return proto.CompactTextString(m) } -func (*DataResponse) ProtoMessage() {} +func (x *DataResponse) Reset() { + *x = DataResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_accounts_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataResponse) ProtoMessage() {} + +func (x *DataResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_accounts_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataResponse.ProtoReflect.Descriptor instead. func (*DataResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{5} + return file_accounts_accounts_proto_rawDescGZIP(), []int{5} } -func (m *DataResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DataResponse.Unmarshal(m, b) -} -func (m *DataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DataResponse.Marshal(b, m, deterministic) -} -func (m *DataResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataResponse.Merge(m, src) -} -func (m *DataResponse) XXX_Size() int { - return xxx_messageInfo_DataResponse.Size(m) -} -func (m *DataResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DataResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DataResponse proto.InternalMessageInfo - -func (m *DataResponse) GetValue() string { - if m != nil { - return m.Value +func (x *DataResponse) GetValue() string { + if x != nil { + return x.Value } return "" } -func init() { - proto.RegisterType((*RegisterInfo)(nil), "accounts.RegisterInfo") - proto.RegisterType((*RegisterResponse)(nil), "accounts.RegisterResponse") - proto.RegisterType((*DataKeyValue)(nil), "accounts.DataKeyValue") - proto.RegisterType((*DataKeyResponse)(nil), "accounts.DataKeyResponse") - proto.RegisterType((*DataKey)(nil), "accounts.DataKey") - proto.RegisterType((*DataResponse)(nil), "accounts.DataResponse") +var File_accounts_accounts_proto protoreflect.FileDescriptor + +var file_accounts_accounts_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x0a, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x11, 0x0a, + 0x0f, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x35, 0x0a, 0x07, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x24, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xcb, 0x01, + 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x1a, 0x1a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x2e, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x37, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x11, + 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, + 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x25, 0x5a, 0x23, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, + 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } -func init() { - proto.RegisterFile("accounts.proto", fileDescriptor_e1e7723af4c007b7) +var ( + file_accounts_accounts_proto_rawDescOnce sync.Once + file_accounts_accounts_proto_rawDescData = file_accounts_accounts_proto_rawDesc +) + +func file_accounts_accounts_proto_rawDescGZIP() []byte { + file_accounts_accounts_proto_rawDescOnce.Do(func() { + file_accounts_accounts_proto_rawDescData = protoimpl.X.CompressGZIP(file_accounts_accounts_proto_rawDescData) + }) + return file_accounts_accounts_proto_rawDescData } -var fileDescriptor_e1e7723af4c007b7 = []byte{ - // 276 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x41, 0x4b, 0xc3, 0x40, - 0x10, 0x85, 0x8d, 0x55, 0x1b, 0xc7, 0xa2, 0xed, 0x20, 0x12, 0x73, 0x92, 0x55, 0xc1, 0x53, 0x02, - 0x8a, 0x78, 0xb5, 0x45, 0x10, 0xf1, 0x22, 0x39, 0x78, 0xf0, 0xb6, 0x8d, 0x63, 0x0c, 0x6d, 0x76, - 0x43, 0x76, 0x53, 0xa8, 0x7f, 0xd1, 0x3f, 0x25, 0xc9, 0x66, 0x63, 0x30, 0x5e, 0x7a, 0x9b, 0x79, - 0xcc, 0xfb, 0x66, 0xf6, 0x2d, 0x1c, 0xf2, 0x38, 0x96, 0xa5, 0xd0, 0x2a, 0xc8, 0x0b, 0xa9, 0x25, - 0xba, 0xb6, 0x67, 0x0c, 0x46, 0x11, 0x25, 0xa9, 0xd2, 0x54, 0x3c, 0x89, 0x0f, 0x89, 0x08, 0x3b, - 0x82, 0x67, 0xe4, 0x39, 0x67, 0xce, 0xd5, 0x7e, 0x54, 0xd7, 0x0c, 0x61, 0x6c, 0x67, 0x22, 0x52, - 0xb9, 0x14, 0x8a, 0xd8, 0x0b, 0x8c, 0x1e, 0xb8, 0xe6, 0xcf, 0xb4, 0x7e, 0xe5, 0xcb, 0x92, 0xd0, - 0x83, 0x61, 0xc3, 0x6c, 0xac, 0xb6, 0xc5, 0x31, 0x0c, 0x16, 0xb4, 0xf6, 0xb6, 0x6b, 0xb5, 0x2a, - 0xf1, 0x18, 0x76, 0x57, 0x95, 0xc9, 0x1b, 0xd4, 0x9a, 0x69, 0xd8, 0x04, 0x8e, 0x1a, 0x62, 0xbb, - 0xe4, 0x16, 0x86, 0x8d, 0xb4, 0x09, 0x9f, 0x5d, 0x98, 0xdb, 0x2c, 0xe6, 0xff, 0x7d, 0xd7, 0xdf, - 0x0e, 0xc0, 0xd4, 0x30, 0xb8, 0xd0, 0x78, 0x0f, 0xae, 0x7d, 0x24, 0x9e, 0x04, 0x6d, 0x5e, 0xdd, - 0x70, 0x7c, 0xbf, 0xaf, 0xb7, 0xb7, 0x6e, 0xe1, 0x0c, 0x0e, 0xa6, 0x4a, 0xa5, 0x89, 0x30, 0x89, - 0x74, 0x20, 0xdd, 0xa4, 0xfc, 0xd3, 0x9e, 0xde, 0x61, 0xdc, 0x81, 0xfb, 0x48, 0xda, 0x00, 0x26, - 0xbd, 0x41, 0xff, 0x0f, 0xf3, 0xd7, 0x38, 0xbb, 0x7c, 0x3b, 0x4f, 0x52, 0xfd, 0x59, 0xce, 0x83, - 0x58, 0x66, 0x61, 0xf6, 0x9e, 0x2e, 0xcb, 0xaf, 0xb0, 0x90, 0x2b, 0x0a, 0xf3, 0x45, 0x12, 0x5a, - 0xd7, 0x7c, 0xaf, 0xfe, 0xff, 0x9b, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x22, 0x35, 0x31, 0x6f, - 0x11, 0x02, 0x00, 0x00, +var file_accounts_accounts_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_accounts_accounts_proto_goTypes = []interface{}{ + (*RegisterInfo)(nil), // 0: accounts.RegisterInfo + (*RegisterResponse)(nil), // 1: accounts.RegisterResponse + (*DataKeyValue)(nil), // 2: accounts.DataKeyValue + (*DataKeyResponse)(nil), // 3: accounts.DataKeyResponse + (*DataKey)(nil), // 4: accounts.DataKey + (*DataResponse)(nil), // 5: accounts.DataResponse +} +var file_accounts_accounts_proto_depIdxs = []int32{ + 0, // 0: accounts.Accountant.Register:input_type -> accounts.RegisterInfo + 2, // 1: accounts.Accountant.AssignValue:input_type -> accounts.DataKeyValue + 4, // 2: accounts.Accountant.GetValue:input_type -> accounts.DataKey + 1, // 3: accounts.Accountant.Register:output_type -> accounts.RegisterResponse + 3, // 4: accounts.Accountant.AssignValue:output_type -> accounts.DataKeyResponse + 5, // 5: accounts.Accountant.GetValue:output_type -> accounts.DataResponse + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_accounts_accounts_proto_init() } +func file_accounts_accounts_proto_init() { + if File_accounts_accounts_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_accounts_accounts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_accounts_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_accounts_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataKeyValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_accounts_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataKeyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_accounts_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_accounts_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_accounts_accounts_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_accounts_accounts_proto_goTypes, + DependencyIndexes: file_accounts_accounts_proto_depIdxs, + MessageInfos: file_accounts_accounts_proto_msgTypes, + }.Build() + File_accounts_accounts_proto = out.File + file_accounts_accounts_proto_rawDesc = nil + file_accounts_accounts_proto_goTypes = nil + file_accounts_accounts_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -384,13 +573,13 @@ type AccountantServer interface { type UnimplementedAccountantServer struct { } -func (*UnimplementedAccountantServer) Register(ctx context.Context, req *RegisterInfo) (*RegisterResponse, error) { +func (*UnimplementedAccountantServer) Register(context.Context, *RegisterInfo) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (*UnimplementedAccountantServer) AssignValue(ctx context.Context, req *DataKeyValue) (*DataKeyResponse, error) { +func (*UnimplementedAccountantServer) AssignValue(context.Context, *DataKeyValue) (*DataKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AssignValue not implemented") } -func (*UnimplementedAccountantServer) GetValue(ctx context.Context, req *DataKey) (*DataResponse, error) { +func (*UnimplementedAccountantServer) GetValue(context.Context, *DataKey) (*DataResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetValue not implemented") } @@ -470,5 +659,5 @@ var _Accountant_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "accounts.proto", + Metadata: "accounts/accounts.proto", } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index a9d0f02..1dff955 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -1,340 +1,406 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: rove.proto +// versions: +// protoc-gen-go v1.23.0 +// protoc v3.6.1 +// source: rove/rove.proto package rove import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" empty "github.com/golang/protobuf/ptypes/empty" + _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type Command struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The command to execute, currently only accepts move, which requires a bearing and a duration. - Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` - Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` - Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` + Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` } -func (m *Command) Reset() { *m = Command{} } -func (m *Command) String() string { return proto.CompactTextString(m) } -func (*Command) ProtoMessage() {} +func (x *Command) Reset() { + *x = Command{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Command) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Command) ProtoMessage() {} + +func (x *Command) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Command.ProtoReflect.Descriptor instead. func (*Command) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{0} + return file_rove_rove_proto_rawDescGZIP(), []int{0} } -func (m *Command) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Command.Unmarshal(m, b) -} -func (m *Command) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Command.Marshal(b, m, deterministic) -} -func (m *Command) XXX_Merge(src proto.Message) { - xxx_messageInfo_Command.Merge(m, src) -} -func (m *Command) XXX_Size() int { - return xxx_messageInfo_Command.Size(m) -} -func (m *Command) XXX_DiscardUnknown() { - xxx_messageInfo_Command.DiscardUnknown(m) -} - -var xxx_messageInfo_Command proto.InternalMessageInfo - -func (m *Command) GetCommand() string { - if m != nil { - return m.Command +func (x *Command) GetCommand() string { + if x != nil { + return x.Command } return "" } -func (m *Command) GetBearing() string { - if m != nil { - return m.Bearing +func (x *Command) GetBearing() string { + if x != nil { + return x.Bearing } return "" } -func (m *Command) GetDuration() int32 { - if m != nil { - return m.Duration +func (x *Command) GetDuration() int32 { + if x != nil { + return x.Duration } return 0 } type CommandsRequest struct { - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` } -func (m *CommandsRequest) Reset() { *m = CommandsRequest{} } -func (m *CommandsRequest) String() string { return proto.CompactTextString(m) } -func (*CommandsRequest) ProtoMessage() {} +func (x *CommandsRequest) Reset() { + *x = CommandsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommandsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommandsRequest) ProtoMessage() {} + +func (x *CommandsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommandsRequest.ProtoReflect.Descriptor instead. func (*CommandsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{1} + return file_rove_rove_proto_rawDescGZIP(), []int{1} } -func (m *CommandsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CommandsRequest.Unmarshal(m, b) -} -func (m *CommandsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CommandsRequest.Marshal(b, m, deterministic) -} -func (m *CommandsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandsRequest.Merge(m, src) -} -func (m *CommandsRequest) XXX_Size() int { - return xxx_messageInfo_CommandsRequest.Size(m) -} -func (m *CommandsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CommandsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CommandsRequest proto.InternalMessageInfo - -func (m *CommandsRequest) GetAccount() string { - if m != nil { - return m.Account +func (x *CommandsRequest) GetAccount() string { + if x != nil { + return x.Account } return "" } -func (m *CommandsRequest) GetCommands() []*Command { - if m != nil { - return m.Commands +func (x *CommandsRequest) GetCommands() []*Command { + if x != nil { + return x.Commands } return nil } type Error struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // An explanation for the HTTP error returned - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` } -func (m *Error) Reset() { *m = Error{} } -func (m *Error) String() string { return proto.CompactTextString(m) } -func (*Error) ProtoMessage() {} +func (x *Error) Reset() { + *x = Error{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Error) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Error) ProtoMessage() {} + +func (x *Error) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Error.ProtoReflect.Descriptor instead. func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{2} + return file_rove_rove_proto_rawDescGZIP(), []int{2} } -func (m *Error) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Error.Unmarshal(m, b) -} -func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Error.Marshal(b, m, deterministic) -} -func (m *Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_Error.Merge(m, src) -} -func (m *Error) XXX_Size() int { - return xxx_messageInfo_Error.Size(m) -} -func (m *Error) XXX_DiscardUnknown() { - xxx_messageInfo_Error.DiscardUnknown(m) -} - -var xxx_messageInfo_Error proto.InternalMessageInfo - -func (m *Error) GetError() string { - if m != nil { - return m.Error +func (x *Error) GetError() string { + if x != nil { + return x.Error } return "" } type RadarRequest struct { - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } -func (m *RadarRequest) Reset() { *m = RadarRequest{} } -func (m *RadarRequest) String() string { return proto.CompactTextString(m) } -func (*RadarRequest) ProtoMessage() {} +func (x *RadarRequest) Reset() { + *x = RadarRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RadarRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RadarRequest) ProtoMessage() {} + +func (x *RadarRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RadarRequest.ProtoReflect.Descriptor instead. func (*RadarRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{3} + return file_rove_rove_proto_rawDescGZIP(), []int{3} } -func (m *RadarRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RadarRequest.Unmarshal(m, b) -} -func (m *RadarRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RadarRequest.Marshal(b, m, deterministic) -} -func (m *RadarRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RadarRequest.Merge(m, src) -} -func (m *RadarRequest) XXX_Size() int { - return xxx_messageInfo_RadarRequest.Size(m) -} -func (m *RadarRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RadarRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RadarRequest proto.InternalMessageInfo - -func (m *RadarRequest) GetAccount() string { - if m != nil { - return m.Account +func (x *RadarRequest) GetAccount() string { + if x != nil { + return x.Account } return "" } type RadarResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The range in tiles from the rover of the radar data Range int32 `protobuf:"varint,1,opt,name=range,proto3" json:"range,omitempty"` // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order - Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` } -func (m *RadarResponse) Reset() { *m = RadarResponse{} } -func (m *RadarResponse) String() string { return proto.CompactTextString(m) } -func (*RadarResponse) ProtoMessage() {} +func (x *RadarResponse) Reset() { + *x = RadarResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RadarResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RadarResponse) ProtoMessage() {} + +func (x *RadarResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RadarResponse.ProtoReflect.Descriptor instead. func (*RadarResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{4} + return file_rove_rove_proto_rawDescGZIP(), []int{4} } -func (m *RadarResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RadarResponse.Unmarshal(m, b) -} -func (m *RadarResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RadarResponse.Marshal(b, m, deterministic) -} -func (m *RadarResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RadarResponse.Merge(m, src) -} -func (m *RadarResponse) XXX_Size() int { - return xxx_messageInfo_RadarResponse.Size(m) -} -func (m *RadarResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RadarResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RadarResponse proto.InternalMessageInfo - -func (m *RadarResponse) GetRange() int32 { - if m != nil { - return m.Range +func (x *RadarResponse) GetRange() int32 { + if x != nil { + return x.Range } return 0 } -func (m *RadarResponse) GetTiles() []byte { - if m != nil { - return m.Tiles +func (x *RadarResponse) GetTiles() []byte { + if x != nil { + return x.Tiles } return nil } type RegisterRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *RegisterRequest) Reset() { *m = RegisterRequest{} } -func (m *RegisterRequest) String() string { return proto.CompactTextString(m) } -func (*RegisterRequest) ProtoMessage() {} +func (x *RegisterRequest) Reset() { + *x = RegisterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterRequest) ProtoMessage() {} + +func (x *RegisterRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. func (*RegisterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{5} + return file_rove_rove_proto_rawDescGZIP(), []int{5} } -func (m *RegisterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RegisterRequest.Unmarshal(m, b) -} -func (m *RegisterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RegisterRequest.Marshal(b, m, deterministic) -} -func (m *RegisterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RegisterRequest.Merge(m, src) -} -func (m *RegisterRequest) XXX_Size() int { - return xxx_messageInfo_RegisterRequest.Size(m) -} -func (m *RegisterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RegisterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RegisterRequest proto.InternalMessageInfo - -func (m *RegisterRequest) GetName() string { - if m != nil { - return m.Name +func (x *RegisterRequest) GetName() string { + if x != nil { + return x.Name } return "" } type RoverRequest struct { - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } -func (m *RoverRequest) Reset() { *m = RoverRequest{} } -func (m *RoverRequest) String() string { return proto.CompactTextString(m) } -func (*RoverRequest) ProtoMessage() {} +func (x *RoverRequest) Reset() { + *x = RoverRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverRequest) ProtoMessage() {} + +func (x *RoverRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverRequest.ProtoReflect.Descriptor instead. func (*RoverRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{6} + return file_rove_rove_proto_rawDescGZIP(), []int{6} } -func (m *RoverRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RoverRequest.Unmarshal(m, b) -} -func (m *RoverRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RoverRequest.Marshal(b, m, deterministic) -} -func (m *RoverRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoverRequest.Merge(m, src) -} -func (m *RoverRequest) XXX_Size() int { - return xxx_messageInfo_RoverRequest.Size(m) -} -func (m *RoverRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RoverRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RoverRequest proto.InternalMessageInfo - -func (m *RoverRequest) GetAccount() string { - if m != nil { - return m.Account +func (x *RoverRequest) GetAccount() string { + if x != nil { + return x.Account } return "" } type RoverResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The name of the rover Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Position of the rover in world coordinates @@ -342,66 +408,74 @@ type RoverResponse struct { // The range of this rover's radar Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` // The speed the rover can move per tick - Speed int32 `protobuf:"varint,4,opt,name=speed,proto3" json:"speed,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Speed int32 `protobuf:"varint,4,opt,name=speed,proto3" json:"speed,omitempty"` } -func (m *RoverResponse) Reset() { *m = RoverResponse{} } -func (m *RoverResponse) String() string { return proto.CompactTextString(m) } -func (*RoverResponse) ProtoMessage() {} +func (x *RoverResponse) Reset() { + *x = RoverResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverResponse) ProtoMessage() {} + +func (x *RoverResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverResponse.ProtoReflect.Descriptor instead. func (*RoverResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{7} + return file_rove_rove_proto_rawDescGZIP(), []int{7} } -func (m *RoverResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RoverResponse.Unmarshal(m, b) -} -func (m *RoverResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RoverResponse.Marshal(b, m, deterministic) -} -func (m *RoverResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoverResponse.Merge(m, src) -} -func (m *RoverResponse) XXX_Size() int { - return xxx_messageInfo_RoverResponse.Size(m) -} -func (m *RoverResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RoverResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RoverResponse proto.InternalMessageInfo - -func (m *RoverResponse) GetName() string { - if m != nil { - return m.Name +func (x *RoverResponse) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *RoverResponse) GetPosition() *Vector { - if m != nil { - return m.Position +func (x *RoverResponse) GetPosition() *Vector { + if x != nil { + return x.Position } return nil } -func (m *RoverResponse) GetRange() int32 { - if m != nil { - return m.Range +func (x *RoverResponse) GetRange() int32 { + if x != nil { + return x.Range } return 0 } -func (m *RoverResponse) GetSpeed() int32 { - if m != nil { - return m.Speed +func (x *RoverResponse) GetSpeed() int32 { + if x != nil { + return x.Speed } return 0 } type StatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The time the next tick will occur NextTick string `protobuf:"bytes,1,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` // Whether the server is ready to accept requests @@ -409,161 +483,394 @@ type StatusResponse struct { // The tick rate of the server in minutes (how many minutes per tick) Tick int32 `protobuf:"varint,3,opt,name=tick,proto3" json:"tick,omitempty"` // The version of the server in v{major}.{minor}-{delta}-{sha} form - Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` } -func (m *StatusResponse) Reset() { *m = StatusResponse{} } -func (m *StatusResponse) String() string { return proto.CompactTextString(m) } -func (*StatusResponse) ProtoMessage() {} +func (x *StatusResponse) Reset() { + *x = StatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusResponse) ProtoMessage() {} + +func (x *StatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{8} + return file_rove_rove_proto_rawDescGZIP(), []int{8} } -func (m *StatusResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StatusResponse.Unmarshal(m, b) -} -func (m *StatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StatusResponse.Marshal(b, m, deterministic) -} -func (m *StatusResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusResponse.Merge(m, src) -} -func (m *StatusResponse) XXX_Size() int { - return xxx_messageInfo_StatusResponse.Size(m) -} -func (m *StatusResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StatusResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusResponse proto.InternalMessageInfo - -func (m *StatusResponse) GetNextTick() string { - if m != nil { - return m.NextTick +func (x *StatusResponse) GetNextTick() string { + if x != nil { + return x.NextTick } return "" } -func (m *StatusResponse) GetReady() bool { - if m != nil { - return m.Ready +func (x *StatusResponse) GetReady() bool { + if x != nil { + return x.Ready } return false } -func (m *StatusResponse) GetTick() int32 { - if m != nil { - return m.Tick +func (x *StatusResponse) GetTick() int32 { + if x != nil { + return x.Tick } return 0 } -func (m *StatusResponse) GetVersion() string { - if m != nil { - return m.Version +func (x *StatusResponse) GetVersion() string { + if x != nil { + return x.Version } return "" } type Vector struct { - X int32 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` - Y int32 `protobuf:"varint,2,opt,name=y,proto3" json:"y,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X int32 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` + Y int32 `protobuf:"varint,2,opt,name=y,proto3" json:"y,omitempty"` } -func (m *Vector) Reset() { *m = Vector{} } -func (m *Vector) String() string { return proto.CompactTextString(m) } -func (*Vector) ProtoMessage() {} +func (x *Vector) Reset() { + *x = Vector{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Vector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector) ProtoMessage() {} + +func (x *Vector) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector.ProtoReflect.Descriptor instead. func (*Vector) Descriptor() ([]byte, []int) { - return fileDescriptor_cea399972d1e9fa7, []int{9} + return file_rove_rove_proto_rawDescGZIP(), []int{9} } -func (m *Vector) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Vector.Unmarshal(m, b) -} -func (m *Vector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Vector.Marshal(b, m, deterministic) -} -func (m *Vector) XXX_Merge(src proto.Message) { - xxx_messageInfo_Vector.Merge(m, src) -} -func (m *Vector) XXX_Size() int { - return xxx_messageInfo_Vector.Size(m) -} -func (m *Vector) XXX_DiscardUnknown() { - xxx_messageInfo_Vector.DiscardUnknown(m) -} - -var xxx_messageInfo_Vector proto.InternalMessageInfo - -func (m *Vector) GetX() int32 { - if m != nil { - return m.X +func (x *Vector) GetX() int32 { + if x != nil { + return x.X } return 0 } -func (m *Vector) GetY() int32 { - if m != nil { - return m.Y +func (x *Vector) GetY() int32 { + if x != nil { + return x.Y } return 0 } -func init() { - proto.RegisterType((*Command)(nil), "rove.Command") - proto.RegisterType((*CommandsRequest)(nil), "rove.CommandsRequest") - proto.RegisterType((*Error)(nil), "rove.Error") - proto.RegisterType((*RadarRequest)(nil), "rove.RadarRequest") - proto.RegisterType((*RadarResponse)(nil), "rove.RadarResponse") - proto.RegisterType((*RegisterRequest)(nil), "rove.RegisterRequest") - proto.RegisterType((*RoverRequest)(nil), "rove.RoverRequest") - proto.RegisterType((*RoverResponse)(nil), "rove.RoverResponse") - proto.RegisterType((*StatusResponse)(nil), "rove.StatusResponse") - proto.RegisterType((*Vector)(nil), "rove.Vector") +var File_rove_rove_proto protoreflect.FileDescriptor + +var file_rove_rove_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, + 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, + 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x0d, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, + 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, + 0x32, 0xfb, 0x02, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, + 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, 0x40, 0x0a, 0x05, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x42, 0x21, + 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, + 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } -func init() { - proto.RegisterFile("rove.proto", fileDescriptor_cea399972d1e9fa7) +var ( + file_rove_rove_proto_rawDescOnce sync.Once + file_rove_rove_proto_rawDescData = file_rove_rove_proto_rawDesc +) + +func file_rove_rove_proto_rawDescGZIP() []byte { + file_rove_rove_proto_rawDescOnce.Do(func() { + file_rove_rove_proto_rawDescData = protoimpl.X.CompressGZIP(file_rove_rove_proto_rawDescData) + }) + return file_rove_rove_proto_rawDescData } -var fileDescriptor_cea399972d1e9fa7 = []byte{ - // 477 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x5d, 0x6b, 0xdb, 0x30, - 0x14, 0x8d, 0x93, 0x38, 0x75, 0x6f, 0x92, 0x15, 0xb4, 0x6e, 0x98, 0x94, 0x41, 0x10, 0x1b, 0x64, - 0x2f, 0x2e, 0x64, 0x2f, 0x83, 0x3e, 0x8e, 0xfe, 0x01, 0x75, 0x14, 0xf6, 0x34, 0x14, 0xfb, 0xce, - 0x98, 0x36, 0x96, 0x2b, 0xc9, 0x21, 0xf9, 0x49, 0xfb, 0x97, 0x43, 0xba, 0xb2, 0x97, 0x94, 0x8d, - 0xf6, 0xed, 0x9e, 0xab, 0xab, 0x73, 0xce, 0xfd, 0x00, 0xd0, 0x6a, 0x87, 0x59, 0xa3, 0x95, 0x55, - 0x6c, 0xec, 0xe2, 0xc5, 0x55, 0xa9, 0x54, 0xf9, 0x88, 0xd7, 0x3e, 0xb7, 0x69, 0x7f, 0x5d, 0xe3, - 0xb6, 0xb1, 0x07, 0x2a, 0xe1, 0x3f, 0xe0, 0xec, 0x9b, 0xda, 0x6e, 0x65, 0x5d, 0xb0, 0x14, 0xce, - 0x72, 0x0a, 0xd3, 0x68, 0x19, 0xad, 0xce, 0x45, 0x07, 0xdd, 0xcb, 0x06, 0xa5, 0xae, 0xea, 0x32, - 0x1d, 0xd2, 0x4b, 0x80, 0x6c, 0x01, 0x49, 0xd1, 0x6a, 0x69, 0x2b, 0x55, 0xa7, 0xa3, 0x65, 0xb4, - 0x8a, 0x45, 0x8f, 0xf9, 0x3d, 0x5c, 0x04, 0x6a, 0x23, 0xf0, 0xa9, 0x45, 0x63, 0x1d, 0x91, 0xcc, - 0x73, 0xd5, 0xd6, 0xb6, 0x93, 0x08, 0x90, 0x7d, 0x86, 0x24, 0xa8, 0x99, 0x74, 0xb8, 0x1c, 0xad, - 0xa6, 0xeb, 0x79, 0xe6, 0x3b, 0x09, 0x14, 0xa2, 0x7f, 0xe6, 0x1f, 0x20, 0xbe, 0xd5, 0x5a, 0x69, - 0x76, 0x09, 0x31, 0xba, 0x20, 0x70, 0x11, 0xe0, 0x2b, 0x98, 0x09, 0x59, 0x48, 0xfd, 0xa2, 0x26, - 0xbf, 0x81, 0x79, 0xa8, 0x34, 0x8d, 0xaa, 0x0d, 0x3a, 0x42, 0x2d, 0xeb, 0x12, 0x7d, 0x61, 0x2c, - 0x08, 0xb8, 0xac, 0xad, 0x1e, 0xd1, 0xf8, 0xde, 0x67, 0x82, 0x00, 0xff, 0x04, 0x17, 0x02, 0xcb, - 0xca, 0x58, 0xec, 0x95, 0x18, 0x8c, 0x6b, 0xb9, 0xc5, 0x20, 0xe3, 0x63, 0xef, 0x46, 0xed, 0xf0, - 0x15, 0x6e, 0x0e, 0x30, 0x0f, 0x95, 0xc1, 0xcd, 0x3f, 0xe8, 0xd8, 0x0a, 0x92, 0x46, 0x99, 0xca, - 0xcf, 0xdb, 0xd9, 0x99, 0xae, 0x67, 0x34, 0xa6, 0x7b, 0xcc, 0xad, 0xd2, 0xa2, 0x7f, 0xfd, 0xdb, - 0xcb, 0xe8, 0x59, 0x2f, 0xa6, 0x41, 0x2c, 0xd2, 0x31, 0x65, 0x3d, 0xe0, 0x4f, 0xf0, 0xe6, 0xce, - 0x4a, 0xdb, 0x9a, 0x5e, 0xfb, 0x0a, 0xce, 0x6b, 0xdc, 0xdb, 0x9f, 0xb6, 0xca, 0x1f, 0x82, 0x81, - 0xc4, 0x25, 0xbe, 0x57, 0xf9, 0x83, 0xa7, 0x46, 0x59, 0x1c, 0xbc, 0x83, 0x44, 0x10, 0x70, 0x76, - 0x7d, 0x35, 0xe9, 0xf9, 0xd8, 0x75, 0xbb, 0x43, 0x6d, 0x9c, 0xdb, 0x31, 0x75, 0x1b, 0x20, 0xff, - 0x08, 0x13, 0xb2, 0xcc, 0x66, 0x10, 0xed, 0xc3, 0xc0, 0xa3, 0xbd, 0x43, 0xc4, 0x1b, 0x8b, 0xe8, - 0xb0, 0xfe, 0x3d, 0x84, 0xa9, 0x1f, 0xca, 0x1d, 0xea, 0x1d, 0x6a, 0x76, 0x03, 0x49, 0x77, 0x52, - 0xec, 0xdd, 0xc9, 0x7d, 0x74, 0x27, 0xb6, 0x78, 0x9f, 0xd1, 0xb9, 0x67, 0xdd, 0xb9, 0x67, 0xb7, - 0xee, 0xdc, 0xf9, 0x80, 0xad, 0x21, 0xf6, 0xeb, 0x66, 0x8c, 0x7e, 0x1e, 0x5f, 0xc9, 0xe2, 0xed, - 0x49, 0x8e, 0xa6, 0xc0, 0x07, 0x4e, 0xb0, 0xdb, 0x72, 0x27, 0xf8, 0x6c, 0xeb, 0x2f, 0x08, 0x3a, - 0xf3, 0xbd, 0xe0, 0xd1, 0x21, 0xf4, 0x82, 0xc7, 0x2b, 0xe7, 0x03, 0xf6, 0x15, 0x26, 0xb4, 0x0a, - 0xf6, 0x1f, 0xde, 0xc5, 0x25, 0x7d, 0x3c, 0x5d, 0x18, 0x1f, 0x6c, 0x26, 0xbe, 0xee, 0xcb, 0x9f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xed, 0x84, 0x22, 0xdd, 0x01, 0x04, 0x00, 0x00, +var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_rove_rove_proto_goTypes = []interface{}{ + (*Command)(nil), // 0: rove.Command + (*CommandsRequest)(nil), // 1: rove.CommandsRequest + (*Error)(nil), // 2: rove.Error + (*RadarRequest)(nil), // 3: rove.RadarRequest + (*RadarResponse)(nil), // 4: rove.RadarResponse + (*RegisterRequest)(nil), // 5: rove.RegisterRequest + (*RoverRequest)(nil), // 6: rove.RoverRequest + (*RoverResponse)(nil), // 7: rove.RoverResponse + (*StatusResponse)(nil), // 8: rove.StatusResponse + (*Vector)(nil), // 9: rove.Vector + (*empty.Empty)(nil), // 10: google.protobuf.Empty +} +var file_rove_rove_proto_depIdxs = []int32{ + 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command + 9, // 1: rove.RoverResponse.position:type_name -> rove.Vector + 10, // 2: rove.RoveServer.Status:input_type -> google.protobuf.Empty + 5, // 3: rove.RoveServer.Register:input_type -> rove.RegisterRequest + 1, // 4: rove.RoveServer.Commands:input_type -> rove.CommandsRequest + 3, // 5: rove.RoveServer.Radar:input_type -> rove.RadarRequest + 6, // 6: rove.RoveServer.Rover:input_type -> rove.RoverRequest + 8, // 7: rove.RoveServer.Status:output_type -> rove.StatusResponse + 10, // 8: rove.RoveServer.Register:output_type -> google.protobuf.Empty + 10, // 9: rove.RoveServer.Commands:output_type -> google.protobuf.Empty + 4, // 10: rove.RoveServer.Radar:output_type -> rove.RadarResponse + 7, // 11: rove.RoveServer.Rover:output_type -> rove.RoverResponse + 7, // [7:12] is the sub-list for method output_type + 2, // [2:7] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_rove_rove_proto_init() } +func file_rove_rove_proto_init() { + if File_rove_rove_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_rove_rove_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Command); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Error); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RadarRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RadarResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_rove_rove_proto_rawDesc, + NumEnums: 0, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_rove_rove_proto_goTypes, + DependencyIndexes: file_rove_rove_proto_depIdxs, + MessageInfos: file_rove_rove_proto_msgTypes, + }.Build() + File_rove_rove_proto = out.File + file_rove_rove_proto_rawDesc = nil + file_rove_rove_proto_goTypes = nil + file_rove_rove_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -574,10 +881,18 @@ var _ grpc.ClientConnInterface // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 -// RoverServerClient is the client API for RoverServer service. +// RoveServerClient is the client API for RoveServer service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type RoverServerClient interface { +type RoveServerClient interface { + // Server status + // + // Responds with various details about the current server status + Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) + // Register an account + // + // Tries to register an account with the given name + Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent @@ -586,75 +901,75 @@ type RoverServerClient interface { // // Gets the radar output for the given rover Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) - // Register an account - // - // Tries to register an account with the given name - Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Get rover information // // Gets information for the account's rover Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) - // Server status - // - // Responds with various details about the current server status - Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) } -type roverServerClient struct { +type roveServerClient struct { cc grpc.ClientConnInterface } -func NewRoverServerClient(cc grpc.ClientConnInterface) RoverServerClient { - return &roverServerClient{cc} +func NewRoveServerClient(cc grpc.ClientConnInterface) RoveServerClient { + return &roveServerClient{cc} } -func (c *roverServerClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/rove.RoverServer/Commands", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *roverServerClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { - out := new(RadarResponse) - err := c.cc.Invoke(ctx, "/rove.RoverServer/Radar", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *roverServerClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/rove.RoverServer/Register", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *roverServerClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { - out := new(RoverResponse) - err := c.cc.Invoke(ctx, "/rove.RoverServer/Rover", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *roverServerClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { +func (c *roveServerClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { out := new(StatusResponse) - err := c.cc.Invoke(ctx, "/rove.RoverServer/Status", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.RoveServer/Status", in, out, opts...) if err != nil { return nil, err } return out, nil } -// RoverServerServer is the server API for RoverServer service. -type RoverServerServer interface { +func (c *roveServerClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/rove.RoveServer/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roveServerClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/rove.RoveServer/Commands", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roveServerClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { + out := new(RadarResponse) + err := c.cc.Invoke(ctx, "/rove.RoveServer/Radar", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roveServerClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { + out := new(RoverResponse) + err := c.cc.Invoke(ctx, "/rove.RoveServer/Rover", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RoveServerServer is the server API for RoveServer service. +type RoveServerServer interface { + // Server status + // + // Responds with various details about the current server status + Status(context.Context, *empty.Empty) (*StatusResponse, error) + // Register an account + // + // Tries to register an account with the given name + Register(context.Context, *RegisterRequest) (*empty.Empty, error) // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent @@ -663,159 +978,151 @@ type RoverServerServer interface { // // Gets the radar output for the given rover Radar(context.Context, *RadarRequest) (*RadarResponse, error) - // Register an account - // - // Tries to register an account with the given name - Register(context.Context, *RegisterRequest) (*empty.Empty, error) // Get rover information // // Gets information for the account's rover Rover(context.Context, *RoverRequest) (*RoverResponse, error) - // Server status - // - // Responds with various details about the current server status - Status(context.Context, *empty.Empty) (*StatusResponse, error) } -// UnimplementedRoverServerServer can be embedded to have forward compatible implementations. -type UnimplementedRoverServerServer struct { +// UnimplementedRoveServerServer can be embedded to have forward compatible implementations. +type UnimplementedRoveServerServer struct { } -func (*UnimplementedRoverServerServer) Commands(ctx context.Context, req *CommandsRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") -} -func (*UnimplementedRoverServerServer) Radar(ctx context.Context, req *RadarRequest) (*RadarResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") -} -func (*UnimplementedRoverServerServer) Register(ctx context.Context, req *RegisterRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") -} -func (*UnimplementedRoverServerServer) Rover(ctx context.Context, req *RoverRequest) (*RoverResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Rover not implemented") -} -func (*UnimplementedRoverServerServer) Status(ctx context.Context, req *empty.Empty) (*StatusResponse, error) { +func (*UnimplementedRoveServerServer) Status(context.Context, *empty.Empty) (*StatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") } - -func RegisterRoverServerServer(s *grpc.Server, srv RoverServerServer) { - s.RegisterService(&_RoverServer_serviceDesc, srv) +func (*UnimplementedRoveServerServer) Register(context.Context, *RegisterRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (*UnimplementedRoveServerServer) Commands(context.Context, *CommandsRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") +} +func (*UnimplementedRoveServerServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") +} +func (*UnimplementedRoveServerServer) Rover(context.Context, *RoverRequest) (*RoverResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Rover not implemented") } -func _RoverServer_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CommandsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RoverServerServer).Commands(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rove.RoverServer/Commands", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoverServerServer).Commands(ctx, req.(*CommandsRequest)) - } - return interceptor(ctx, in, info, handler) +func RegisterRoveServerServer(s *grpc.Server, srv RoveServerServer) { + s.RegisterService(&_RoveServer_serviceDesc, srv) } -func _RoverServer_Radar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RadarRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RoverServerServer).Radar(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rove.RoverServer/Radar", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoverServerServer).Radar(ctx, req.(*RadarRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _RoverServer_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RegisterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RoverServerServer).Register(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rove.RoverServer/Register", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoverServerServer).Register(ctx, req.(*RegisterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _RoverServer_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RoverRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RoverServerServer).Rover(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rove.RoverServer/Rover", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoverServerServer).Rover(ctx, req.(*RoverRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _RoverServer_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _RoveServer_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoverServerServer).Status(ctx, in) + return srv.(RoveServerServer).Status(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoverServer/Status", + FullMethod: "/rove.RoveServer/Status", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoverServerServer).Status(ctx, req.(*empty.Empty)) + return srv.(RoveServerServer).Status(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } -var _RoverServer_serviceDesc = grpc.ServiceDesc{ - ServiceName: "rove.RoverServer", - HandlerType: (*RoverServerServer)(nil), +func _RoveServer_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoveServerServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoveServer/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoveServerServer).Register(ctx, req.(*RegisterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoveServer_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CommandsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoveServerServer).Commands(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoveServer/Commands", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoveServerServer).Commands(ctx, req.(*CommandsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoveServer_Radar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RadarRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoveServerServer).Radar(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoveServer/Radar", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoveServerServer).Radar(ctx, req.(*RadarRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoveServer_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RoverRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoveServerServer).Rover(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/rove.RoveServer/Rover", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoveServerServer).Rover(ctx, req.(*RoverRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _RoveServer_serviceDesc = grpc.ServiceDesc{ + ServiceName: "rove.RoveServer", + HandlerType: (*RoveServerServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "Commands", - Handler: _RoverServer_Commands_Handler, - }, - { - MethodName: "Radar", - Handler: _RoverServer_Radar_Handler, + MethodName: "Status", + Handler: _RoveServer_Status_Handler, }, { MethodName: "Register", - Handler: _RoverServer_Register_Handler, + Handler: _RoveServer_Register_Handler, + }, + { + MethodName: "Commands", + Handler: _RoveServer_Commands_Handler, + }, + { + MethodName: "Radar", + Handler: _RoveServer_Radar_Handler, }, { MethodName: "Rover", - Handler: _RoverServer_Rover_Handler, - }, - { - MethodName: "Status", - Handler: _RoverServer_Status_Handler, + Handler: _RoveServer_Rover_Handler, }, }, Streams: []grpc.StreamDesc{}, - Metadata: "rove.proto", + Metadata: "rove/rove.proto", } diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go new file mode 100644 index 0000000..f67af75 --- /dev/null +++ b/pkg/rove/rove.pb.gw.go @@ -0,0 +1,464 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: rove/rove.proto + +/* +Package rove is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package rove + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/empty" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.Status(ctx, &protoReq) + return msg, metadata, err + +} + +func request_RoveServer_Register_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RegisterRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Register(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_RoveServer_Register_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RegisterRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Register(ctx, &protoReq) + return msg, metadata, err + +} + +func request_RoveServer_Commands_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommandsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Commands(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_RoveServer_Commands_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommandsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Commands(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_RoveServer_Radar_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RadarRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Radar_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Radar(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RadarRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Radar_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Radar(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_RoveServer_Rover_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RoverRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Rover_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Rover(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RoverRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Rover_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Rover(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterRoveServerHandlerServer registers the http handlers for service RoveServer to "mux". +// UnaryRPC :call RoveServerServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoveServerServer) error { + + mux.Handle("GET", pattern_RoveServer_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoveServer_Status_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_RoveServer_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoveServer_Register_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_RoveServer_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoveServer_Commands_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_RoveServer_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoveServer_Radar_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_RoveServer_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoveServer_Rover_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterRoveServerHandlerFromEndpoint is same as RegisterRoveServerHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterRoveServerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterRoveServerHandler(ctx, mux, conn) +} + +// RegisterRoveServerHandler registers the http handlers for service RoveServer to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterRoveServerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRoveServerHandlerClient(ctx, mux, NewRoveServerClient(conn)) +} + +// RegisterRoveServerHandlerClient registers the http handlers for service RoveServer +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoveServerClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoveServerClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "RoveServerClient" to call the correct interceptors. +func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoveServerClient) error { + + mux.Handle("GET", pattern_RoveServer_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoveServer_Status_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_RoveServer_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoveServer_Register_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_RoveServer_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoveServer_Commands_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_RoveServer_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoveServer_Radar_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_RoveServer_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoveServer_Rover_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_RoveServer_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_RoveServer_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_RoveServer_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_RoveServer_Commands_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"commands"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_RoveServer_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_RoveServer_Rover_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"rover"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_RoveServer_Status_0 = runtime.ForwardResponseMessage + + forward_RoveServer_Register_0 = runtime.ForwardResponseMessage + + forward_RoveServer_Commands_0 = runtime.ForwardResponseMessage + + forward_RoveServer_Radar_0 = runtime.ForwardResponseMessage + + forward_RoveServer_Rover_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/accounts/accounts.proto b/proto/accounts/accounts.proto similarity index 100% rename from pkg/accounts/accounts.proto rename to proto/accounts/accounts.proto diff --git a/proto/google/README.grpc-gateway b/proto/google/README.grpc-gateway new file mode 100644 index 0000000..b7d1bea --- /dev/null +++ b/proto/google/README.grpc-gateway @@ -0,0 +1,23 @@ +Google APIs +============ + +Project: Google APIs +URL: https://github.com/google/googleapis +Revision: 3544ab16c3342d790b00764251e348705991ea4b +License: Apache License 2.0 + + +Imported Files +--------------- + +- google/api/annotations.proto +- google/api/http.proto +- google/api/httpbody.proto + + +Generated Files +---------------- + +They are generated from the .proto files by protoc-gen-go. +- google/api/annotations.pb.go +- google/api/http.pb.go diff --git a/proto/google/api/annotations.proto b/proto/google/api/annotations.proto new file mode 100644 index 0000000..85c361b --- /dev/null +++ b/proto/google/api/annotations.proto @@ -0,0 +1,31 @@ +// Copyright (c) 2015, Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/http.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See `HttpRule`. + HttpRule http = 72295728; +} diff --git a/proto/google/api/http.proto b/proto/google/api/http.proto new file mode 100644 index 0000000..2bd3a19 --- /dev/null +++ b/proto/google/api/http.proto @@ -0,0 +1,318 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +message Http { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated HttpRule rules = 1; + + // When set to true, URL path parmeters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + bool fully_decode_reserved_expansion = 2; +} + +// `HttpRule` defines the mapping of an RPC method to one or more HTTP +// REST API methods. The mapping specifies how different portions of the RPC +// request message are mapped to URL path, URL query parameters, and +// HTTP request body. The mapping is typically specified as an +// `google.api.http` annotation on the RPC method, +// see "google/api/annotations.proto" for details. +// +// The mapping consists of a field specifying the path template and +// method kind. The path template can refer to fields in the request +// message, as in the example below which describes a REST GET +// operation on a resource collection of messages: +// +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // mapped to the URL +// SubMessage sub = 2; // `sub.subfield` is url-mapped +// } +// message Message { +// string text = 1; // content of the resource +// } +// +// The same http annotation can alternatively be expressed inside the +// `GRPC API Configuration` YAML file. +// +// http: +// rules: +// - selector: .Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// This definition enables an automatic, bidrectional mapping of HTTP +// JSON to RPC. Example: +// +// HTTP | RPC +// -----|----- +// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` +// +// In general, not only fields but also field paths can be referenced +// from a path pattern. Fields mapped to the path pattern cannot be +// repeated and must have a primitive (non-message) type. +// +// Any fields in the request message which are not bound by the path +// pattern automatically become (optional) HTTP query +// parameters. Assume the following definition of the request message: +// +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http).get = "/v1/messages/{message_id}"; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // mapped to the URL +// int64 revision = 2; // becomes a parameter +// SubMessage sub = 3; // `sub.subfield` becomes a parameter +// } +// +// +// This enables a HTTP JSON to RPC mapping as below: +// +// HTTP | RPC +// -----|----- +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` +// +// Note that fields which are mapped to HTTP parameters must have a +// primitive type or a repeated primitive type. Message types are not +// allowed. In the case of a repeated type, the parameter can be +// repeated in the URL, as in `...?param=A¶m=B`. +// +// For HTTP method kinds which allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// put: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// HTTP | RPC +// -----|----- +// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// put: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// HTTP | RPC +// -----|----- +// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice of +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// +// This enables the following two alternative HTTP JSON to RPC +// mappings: +// +// HTTP | RPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` +// +// # Rules for HTTP mapping +// +// The rules for mapping HTTP path, query parameters, and body fields +// to the request message are as follows: +// +// 1. The `body` field specifies either `*` or a field path, or is +// omitted. If omitted, it indicates there is no HTTP request body. +// 2. Leaf fields (recursive expansion of nested messages in the +// request) can be classified into three types: +// (a) Matched in the URL template. +// (b) Covered by body (if body is `*`, everything except (a) fields; +// else everything under the body field) +// (c) All other fields. +// 3. URL query parameters found in the HTTP request are mapped to (c) fields. +// 4. Any body sent with an HTTP request can contain only (b) fields. +// +// The syntax of the path template is as follows: +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single path segment. The syntax `**` matches zero +// or more path segments, which must be the last part of the path except the +// `Verb`. The syntax `LITERAL` matches literal text in the path. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path, all characters +// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the +// Discovery Document as `{var}`. +// +// If a variable contains one or more path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path, all +// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables +// show up in the Discovery Document as `{+var}`. +// +// NOTE: While the single segment variable matches the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 +// Simple String Expansion, the multi segment variable **does not** match +// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. +// +// NOTE: the field paths in variables and in the `body` must not refer to +// repeated fields or map fields. +message HttpRule { + // Selects methods to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. + string selector = 1; + + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + oneof pattern { + // Used for listing and getting information about resources. + string get = 2; + + // Used for updating a resource. + string put = 3; + + // Used for creating a resource. + string post = 4; + + // Used for deleting a resource. + string delete = 5; + + // Used for updating a resource. + string patch = 6; + + // The custom pattern is used for specifying an HTTP method that is not + // included in the `pattern` field, such as HEAD, or "*" to leave the + // HTTP method unspecified for this rule. The wild-card rule is useful + // for services that provide content to Web (HTML) clients. + CustomHttpPattern custom = 8; + } + + // The name of the request field whose value is mapped to the HTTP body, or + // `*` for mapping all fields not captured by the path pattern to the HTTP + // body. NOTE: the referred field must not be a repeated field and must be + // present at the top-level of request message type. + string body = 7; + + // Optional. The name of the response field whose value is mapped to the HTTP + // body of response. Other response fields are ignored. When + // not set, the response message will be used as HTTP body of response. + string response_body = 12; + + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + repeated HttpRule additional_bindings = 11; +} + +// A custom pattern is used for defining custom HTTP verb. +message CustomHttpPattern { + // The name of this custom HTTP verb. + string kind = 1; + + // The path matched by this custom verb. + string path = 2; +} diff --git a/proto/google/api/httpbody.proto b/proto/google/api/httpbody.proto new file mode 100644 index 0000000..4428515 --- /dev/null +++ b/proto/google/api/httpbody.proto @@ -0,0 +1,78 @@ +// Copyright 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody"; +option java_multiple_files = true; +option java_outer_classname = "HttpBodyProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Message that represents an arbitrary HTTP body. It should only be used for +// payload formats that can't be represented as JSON, such as raw binary or +// an HTML page. +// +// +// This message can be used both in streaming and non-streaming API methods in +// the request as well as the response. +// +// It can be used as a top-level request field, which is convenient if one +// wants to extract parameters from either the URL or HTTP template into the +// request fields and also want access to the raw HTTP body. +// +// Example: +// +// message GetResourceRequest { +// // A unique request id. +// string request_id = 1; +// +// // The raw HTTP body is bound to this field. +// google.api.HttpBody http_body = 2; +// } +// +// service ResourceService { +// rpc GetResource(GetResourceRequest) returns (google.api.HttpBody); +// rpc UpdateResource(google.api.HttpBody) returns +// (google.protobuf.Empty); +// } +// +// Example with streaming methods: +// +// service CaldavService { +// rpc GetCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); +// rpc UpdateCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); +// } +// +// Use of this type only changes how the request and response bodies are +// handled, all other features will continue to work unchanged. +message HttpBody { + // The HTTP Content-Type header value specifying the content type of the body. + string content_type = 1; + + // The HTTP request/response body as raw binary. + bytes data = 2; + + // Application specific response metadata. Must be set in the first response + // for streaming APIs. + repeated google.protobuf.Any extensions = 3; +} \ No newline at end of file diff --git a/proto/google/rpc/code.proto b/proto/google/rpc/code.proto new file mode 100644 index 0000000..8fef411 --- /dev/null +++ b/proto/google/rpc/code.proto @@ -0,0 +1,186 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +option go_package = "google.golang.org/genproto/googleapis/rpc/code;code"; +option java_multiple_files = true; +option java_outer_classname = "CodeProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + + +// The canonical error codes for Google APIs. +// +// +// Sometimes multiple error codes may apply. Services should return +// the most specific error code that applies. For example, prefer +// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply. +// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`. +enum Code { + // Not an error; returned on success + // + // HTTP Mapping: 200 OK + OK = 0; + + // The operation was cancelled, typically by the caller. + // + // HTTP Mapping: 499 Client Closed Request + CANCELLED = 1; + + // Unknown error. For example, this error may be returned when + // a `Status` value received from another address space belongs to + // an error space that is not known in this address space. Also + // errors raised by APIs that do not return enough error information + // may be converted to this error. + // + // HTTP Mapping: 500 Internal Server Error + UNKNOWN = 2; + + // The client specified an invalid argument. Note that this differs + // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments + // that are problematic regardless of the state of the system + // (e.g., a malformed file name). + // + // HTTP Mapping: 400 Bad Request + INVALID_ARGUMENT = 3; + + // The deadline expired before the operation could complete. For operations + // that change the state of the system, this error may be returned + // even if the operation has completed successfully. For example, a + // successful response from a server could have been delayed long + // enough for the deadline to expire. + // + // HTTP Mapping: 504 Gateway Timeout + DEADLINE_EXCEEDED = 4; + + // Some requested entity (e.g., file or directory) was not found. + // + // Note to server developers: if a request is denied for an entire class + // of users, such as gradual feature rollout or undocumented whitelist, + // `NOT_FOUND` may be used. If a request is denied for some users within + // a class of users, such as user-based access control, `PERMISSION_DENIED` + // must be used. + // + // HTTP Mapping: 404 Not Found + NOT_FOUND = 5; + + // The entity that a client attempted to create (e.g., file or directory) + // already exists. + // + // HTTP Mapping: 409 Conflict + ALREADY_EXISTS = 6; + + // The caller does not have permission to execute the specified + // operation. `PERMISSION_DENIED` must not be used for rejections + // caused by exhausting some resource (use `RESOURCE_EXHAUSTED` + // instead for those errors). `PERMISSION_DENIED` must not be + // used if the caller can not be identified (use `UNAUTHENTICATED` + // instead for those errors). This error code does not imply the + // request is valid or the requested entity exists or satisfies + // other pre-conditions. + // + // HTTP Mapping: 403 Forbidden + PERMISSION_DENIED = 7; + + // The request does not have valid authentication credentials for the + // operation. + // + // HTTP Mapping: 401 Unauthorized + UNAUTHENTICATED = 16; + + // Some resource has been exhausted, perhaps a per-user quota, or + // perhaps the entire file system is out of space. + // + // HTTP Mapping: 429 Too Many Requests + RESOURCE_EXHAUSTED = 8; + + // The operation was rejected because the system is not in a state + // required for the operation's execution. For example, the directory + // to be deleted is non-empty, an rmdir operation is applied to + // a non-directory, etc. + // + // Service implementors can use the following guidelines to decide + // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: + // (a) Use `UNAVAILABLE` if the client can retry just the failing call. + // (b) Use `ABORTED` if the client should retry at a higher level + // (e.g., when a client-specified test-and-set fails, indicating the + // client should restart a read-modify-write sequence). + // (c) Use `FAILED_PRECONDITION` if the client should not retry until + // the system state has been explicitly fixed. E.g., if an "rmdir" + // fails because the directory is non-empty, `FAILED_PRECONDITION` + // should be returned since the client should not retry unless + // the files are deleted from the directory. + // + // HTTP Mapping: 400 Bad Request + FAILED_PRECONDITION = 9; + + // The operation was aborted, typically due to a concurrency issue such as + // a sequencer check failure or transaction abort. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 409 Conflict + ABORTED = 10; + + // The operation was attempted past the valid range. E.g., seeking or + // reading past end-of-file. + // + // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may + // be fixed if the system state changes. For example, a 32-bit file + // system will generate `INVALID_ARGUMENT` if asked to read at an + // offset that is not in the range [0,2^32-1], but it will generate + // `OUT_OF_RANGE` if asked to read from an offset past the current + // file size. + // + // There is a fair bit of overlap between `FAILED_PRECONDITION` and + // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific + // error) when it applies so that callers who are iterating through + // a space can easily look for an `OUT_OF_RANGE` error to detect when + // they are done. + // + // HTTP Mapping: 400 Bad Request + OUT_OF_RANGE = 11; + + // The operation is not implemented or is not supported/enabled in this + // service. + // + // HTTP Mapping: 501 Not Implemented + UNIMPLEMENTED = 12; + + // Internal errors. This means that some invariants expected by the + // underlying system have been broken. This error code is reserved + // for serious errors. + // + // HTTP Mapping: 500 Internal Server Error + INTERNAL = 13; + + // The service is currently unavailable. This is most likely a + // transient condition, which can be corrected by retrying with + // a backoff. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 503 Service Unavailable + UNAVAILABLE = 14; + + // Unrecoverable data loss or corruption. + // + // HTTP Mapping: 500 Internal Server Error + DATA_LOSS = 15; +} diff --git a/proto/google/rpc/error_details.proto b/proto/google/rpc/error_details.proto new file mode 100644 index 0000000..f24ae00 --- /dev/null +++ b/proto/google/rpc/error_details.proto @@ -0,0 +1,200 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/duration.proto"; + +option go_package = "google.golang.org/genproto/googleapis/rpc/errdetails;errdetails"; +option java_multiple_files = true; +option java_outer_classname = "ErrorDetailsProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + + +// Describes when the clients can retry a failed request. Clients could ignore +// the recommendation here or retry when this information is missing from error +// responses. +// +// It's always recommended that clients should use exponential backoff when +// retrying. +// +// Clients should wait until `retry_delay` amount of time has passed since +// receiving the error response before retrying. If retrying requests also +// fail, clients should use an exponential backoff scheme to gradually increase +// the delay between retries based on `retry_delay`, until either a maximum +// number of retires have been reached or a maximum retry delay cap has been +// reached. +message RetryInfo { + // Clients should wait at least this long between retrying the same request. + google.protobuf.Duration retry_delay = 1; +} + +// Describes additional debugging info. +message DebugInfo { + // The stack trace entries indicating where the error occurred. + repeated string stack_entries = 1; + + // Additional debugging information provided by the server. + string detail = 2; +} + +// Describes how a quota check failed. +// +// For example if a daily limit was exceeded for the calling project, +// a service could respond with a QuotaFailure detail containing the project +// id and the description of the quota limit that was exceeded. If the +// calling project hasn't enabled the service in the developer console, then +// a service could respond with the project id and set `service_disabled` +// to true. +// +// Also see RetryDetail and Help types for other details about handling a +// quota failure. +message QuotaFailure { + // A message type used to describe a single quota violation. For example, a + // daily quota or a custom quota that was exceeded. + message Violation { + // The subject on which the quota check failed. + // For example, "clientip:" or "project:". + string subject = 1; + + // A description of how the quota check failed. Clients can use this + // description to find more about the quota configuration in the service's + // public documentation, or find the relevant quota limit to adjust through + // developer console. + // + // For example: "Service disabled" or "Daily Limit for read operations + // exceeded". + string description = 2; + } + + // Describes all quota violations. + repeated Violation violations = 1; +} + +// Describes what preconditions have failed. +// +// For example, if an RPC failed because it required the Terms of Service to be +// acknowledged, it could list the terms of service violation in the +// PreconditionFailure message. +message PreconditionFailure { + // A message type used to describe a single precondition failure. + message Violation { + // The type of PreconditionFailure. We recommend using a service-specific + // enum type to define the supported precondition violation types. For + // example, "TOS" for "Terms of Service violation". + string type = 1; + + // The subject, relative to the type, that failed. + // For example, "google.com/cloud" relative to the "TOS" type would + // indicate which terms of service is being referenced. + string subject = 2; + + // A description of how the precondition failed. Developers can use this + // description to understand how to fix the failure. + // + // For example: "Terms of service not accepted". + string description = 3; + } + + // Describes all precondition violations. + repeated Violation violations = 1; +} + +// Describes violations in a client request. This error type focuses on the +// syntactic aspects of the request. +message BadRequest { + // A message type used to describe a single bad request field. + message FieldViolation { + // A path leading to a field in the request body. The value will be a + // sequence of dot-separated identifiers that identify a protocol buffer + // field. E.g., "field_violations.field" would identify this field. + string field = 1; + + // A description of why the request element is bad. + string description = 2; + } + + // Describes all violations in a client request. + repeated FieldViolation field_violations = 1; +} + +// Contains metadata about the request that clients can attach when filing a bug +// or providing other forms of feedback. +message RequestInfo { + // An opaque string that should only be interpreted by the service generating + // it. For example, it can be used to identify requests in the service's logs. + string request_id = 1; + + // Any data that was used to serve this request. For example, an encrypted + // stack trace that can be sent back to the service provider for debugging. + string serving_data = 2; +} + +// Describes the resource that is being accessed. +message ResourceInfo { + // A name for the type of resource being accessed, e.g. "sql table", + // "cloud storage bucket", "file", "Google calendar"; or the type URL + // of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + string resource_type = 1; + + // The name of the resource being accessed. For example, a shared calendar + // name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + // error is [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + string resource_name = 2; + + // The owner of the resource (optional). + // For example, "user:" or "project:". + string owner = 3; + + // Describes what error is encountered when accessing this resource. + // For example, updating a cloud project may require the `writer` permission + // on the developer console project. + string description = 4; +} + +// Provides links to documentation or for performing an out of band action. +// +// For example, if a quota check failed with an error indicating the calling +// project hasn't enabled the accessed service, this can contain a URL pointing +// directly to the right place in the developer console to flip the bit. +message Help { + // Describes a URL link. + message Link { + // Describes what the link offers. + string description = 1; + + // The URL of the link. + string url = 2; + } + + // URL(s) pointing to additional information on handling the current error. + repeated Link links = 1; +} + +// Provides a localized error message that is safe to return to the user +// which can be attached to an RPC error. +message LocalizedMessage { + // The locale used following the specification defined at + // http://www.rfc-editor.org/rfc/bcp/bcp47.txt. + // Examples are: "en-US", "fr-CH", "es-MX" + string locale = 1; + + // The localized error message in the above locale. + string message = 2; +} diff --git a/proto/google/rpc/status.proto b/proto/google/rpc/status.proto new file mode 100644 index 0000000..0839ee9 --- /dev/null +++ b/proto/google/rpc/status.proto @@ -0,0 +1,92 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/any.proto"; + +option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; +option java_multiple_files = true; +option java_outer_classname = "StatusProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + + +// The `Status` type defines a logical error model that is suitable for different +// programming environments, including REST APIs and RPC APIs. It is used by +// [gRPC](https://github.com/grpc). The error model is designed to be: +// +// - Simple to use and understand for most users +// - Flexible enough to meet unexpected needs +// +// # Overview +// +// The `Status` message contains three pieces of data: error code, error message, +// and error details. The error code should be an enum value of +// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The +// error message should be a developer-facing English message that helps +// developers *understand* and *resolve* the error. If a localized user-facing +// error message is needed, put the localized message in the error details or +// localize it in the client. The optional error details may contain arbitrary +// information about the error. There is a predefined set of error detail types +// in the package `google.rpc` that can be used for common error conditions. +// +// # Language mapping +// +// The `Status` message is the logical representation of the error model, but it +// is not necessarily the actual wire format. When the `Status` message is +// exposed in different client libraries and different wire protocols, it can be +// mapped differently. For example, it will likely be mapped to some exceptions +// in Java, but more likely mapped to some error codes in C. +// +// # Other uses +// +// The error model and the `Status` message can be used in a variety of +// environments, either with or without APIs, to provide a +// consistent developer experience across different environments. +// +// Example uses of this error model include: +// +// - Partial errors. If a service needs to return partial errors to the client, +// it may embed the `Status` in the normal response to indicate the partial +// errors. +// +// - Workflow errors. A typical workflow has multiple steps. Each step may +// have a `Status` message for error reporting. +// +// - Batch operations. If a client uses batch request and batch response, the +// `Status` message should be used directly inside batch response, one for +// each error sub-response. +// +// - Asynchronous operations. If an API call embeds asynchronous operation +// results in its response, the status of those operations should be +// represented directly using the `Status` message. +// +// - Logging. If some API errors are stored in logs, the message `Status` could +// be used directly after any stripping needed for security/privacy reasons. +message Status { + // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + int32 code = 1; + + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + string message = 2; + + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + repeated google.protobuf.Any details = 3; +} diff --git a/pkg/rove/rove.proto b/proto/rove/rove.proto similarity index 76% rename from pkg/rove/rove.proto rename to proto/rove/rove.proto index a4ce6b7..9546d52 100644 --- a/pkg/rove/rove.proto +++ b/proto/rove/rove.proto @@ -2,33 +2,58 @@ syntax = "proto3"; package rove; +option go_package = "github.com/mdiluz/rove/pkg/rove"; + import "google/protobuf/empty.proto"; +import "google/api/annotations.proto"; -service RoverServer { - // Send commands to rover +service RoveServer { + // Server status // - // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - rpc Commands(CommandsRequest) returns (google.protobuf.Empty) {} - - // Get radar information - // - // Gets the radar output for the given rover - rpc Radar(RadarRequest) returns (RadarResponse) {} + // Responds with various details about the current server status + rpc Status(google.protobuf.Empty) returns (StatusResponse) { + option (google.api.http) = { + get: "/status" + }; + } // Register an account // // Tries to register an account with the given name - rpc Register(RegisterRequest) returns (google.protobuf.Empty) {} + rpc Register(RegisterRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/register" + body: "*" + }; + } + + // Send commands to rover + // + // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + rpc Commands(CommandsRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/commands" + body: "*" + }; + } + + // Get radar information + // + // Gets the radar output for the given rover + rpc Radar(RadarRequest) returns (RadarResponse) { + option (google.api.http) = { + get: "/radar" + }; + } // Get rover information // // Gets information for the account's rover - rpc Rover(RoverRequest) returns (RoverResponse) {} - - // Server status - // - // Responds with various details about the current server status - rpc Status(google.protobuf.Empty) returns (StatusResponse) {} + rpc Rover(RoverRequest) returns (RoverResponse) { + option (google.api.http) = { + get: "/rover" + }; + } } message Command { diff --git a/proto/rove/rove.swagger.json b/proto/rove/rove.swagger.json new file mode 100644 index 0000000..290f037 --- /dev/null +++ b/proto/rove/rove.swagger.json @@ -0,0 +1,318 @@ +{ + "swagger": "2.0", + "info": { + "title": "rove/rove.proto", + "version": "version not set" + }, + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/commands": { + "post": { + "summary": "Send commands to rover", + "description": "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent", + "operationId": "RoveServer_Commands", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/roveCommandsRequest" + } + } + ], + "tags": [ + "RoveServer" + ] + } + }, + "/radar": { + "get": { + "summary": "Get radar information", + "description": "Gets the radar output for the given rover", + "operationId": "RoveServer_Radar", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/roveRadarResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "account", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "RoveServer" + ] + } + }, + "/register": { + "post": { + "summary": "Register an account", + "description": "Tries to register an account with the given name", + "operationId": "RoveServer_Register", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/roveRegisterRequest" + } + } + ], + "tags": [ + "RoveServer" + ] + } + }, + "/rover": { + "get": { + "summary": "Get rover information", + "description": "Gets information for the account's rover", + "operationId": "RoveServer_Rover", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/roveRoverResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "account", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "RoveServer" + ] + } + }, + "/status": { + "get": { + "summary": "Server status", + "description": "Responds with various details about the current server status", + "operationId": "RoveServer_Status", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/roveStatusResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "tags": [ + "RoveServer" + ] + } + } + }, + "definitions": { + "gatewayruntimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "roveCommand": { + "type": "object", + "properties": { + "command": { + "type": "string", + "description": "The command to execute, currently only accepts move, which requires a bearing and a duration." + }, + "bearing": { + "type": "string" + }, + "duration": { + "type": "integer", + "format": "int32" + } + } + }, + "roveCommandsRequest": { + "type": "object", + "properties": { + "account": { + "type": "string" + }, + "commands": { + "type": "array", + "items": { + "$ref": "#/definitions/roveCommand" + } + } + } + }, + "roveRadarResponse": { + "type": "object", + "properties": { + "range": { + "type": "integer", + "format": "int32", + "title": "The range in tiles from the rover of the radar data" + }, + "tiles": { + "type": "string", + "format": "byte", + "title": "A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row-\u003ecolumn order" + } + } + }, + "roveRegisterRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "roveRoverResponse": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "The name of the rover" + }, + "position": { + "$ref": "#/definitions/roveVector", + "title": "Position of the rover in world coordinates" + }, + "range": { + "type": "integer", + "format": "int32", + "title": "The range of this rover's radar" + }, + "speed": { + "type": "integer", + "format": "int32", + "title": "The speed the rover can move per tick" + } + } + }, + "roveStatusResponse": { + "type": "object", + "properties": { + "next_tick": { + "type": "string", + "title": "The time the next tick will occur" + }, + "ready": { + "type": "boolean", + "format": "boolean", + "title": "Whether the server is ready to accept requests" + }, + "tick": { + "type": "integer", + "format": "int32", + "title": "The tick rate of the server in minutes (how many minutes per tick)" + }, + "version": { + "type": "string", + "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" + } + } + }, + "roveVector": { + "type": "object", + "properties": { + "x": { + "type": "integer", + "format": "int32" + }, + "y": { + "type": "integer", + "format": "int32" + } + } + } + } +} diff --git a/tools/tools.go b/tools/tools.go new file mode 100644 index 0000000..2052d72 --- /dev/null +++ b/tools/tools.go @@ -0,0 +1,9 @@ +// +build tools + +package tools + +import ( + _ "github.com/golang/protobuf/protoc-gen-go" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger" +) From 51030ac1628ffc3401e971dc7c0a185569275ea3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:40:34 +0100 Subject: [PATCH 202/495] Fix swagger gen path --- Makefile | 2 +- {proto => pkg}/rove/rove.swagger.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) rename {proto => pkg}/rove/rove.swagger.json (95%) diff --git a/Makefile b/Makefile index 953856d..3b0361a 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ gen: @echo Generating rove server gRPC protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/rove/rove.proto protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto - protoc --proto_path proto --swagger_out=logtostderr=true:proto/ proto/rove/rove.proto + protoc --proto_path proto --swagger_out=logtostderr=true:pkg/ proto/rove/rove.proto test: @echo Unit tests diff --git a/proto/rove/rove.swagger.json b/pkg/rove/rove.swagger.json similarity index 95% rename from proto/rove/rove.swagger.json rename to pkg/rove/rove.swagger.json index 290f037..a25d00a 100644 --- a/proto/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -15,7 +15,7 @@ "post": { "summary": "Send commands to rover", "description": "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent", - "operationId": "RoveServer_Commands", + "operationId": "Rove_Commands", "responses": { "200": { "description": "A successful response.", @@ -41,7 +41,7 @@ } ], "tags": [ - "RoveServer" + "Rove" ] } }, @@ -49,7 +49,7 @@ "get": { "summary": "Get radar information", "description": "Gets the radar output for the given rover", - "operationId": "RoveServer_Radar", + "operationId": "Rove_Radar", "responses": { "200": { "description": "A successful response.", @@ -73,7 +73,7 @@ } ], "tags": [ - "RoveServer" + "Rove" ] } }, @@ -81,7 +81,7 @@ "post": { "summary": "Register an account", "description": "Tries to register an account with the given name", - "operationId": "RoveServer_Register", + "operationId": "Rove_Register", "responses": { "200": { "description": "A successful response.", @@ -107,7 +107,7 @@ } ], "tags": [ - "RoveServer" + "Rove" ] } }, @@ -115,7 +115,7 @@ "get": { "summary": "Get rover information", "description": "Gets information for the account's rover", - "operationId": "RoveServer_Rover", + "operationId": "Rove_Rover", "responses": { "200": { "description": "A successful response.", @@ -139,7 +139,7 @@ } ], "tags": [ - "RoveServer" + "Rove" ] } }, @@ -147,7 +147,7 @@ "get": { "summary": "Server status", "description": "Responds with various details about the current server status", - "operationId": "RoveServer_Status", + "operationId": "Rove_Status", "responses": { "200": { "description": "A successful response.", @@ -163,7 +163,7 @@ } }, "tags": [ - "RoveServer" + "Rove" ] } } From ccb34d4452d167b90de36985cd533cdeb514d1b4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:42:59 +0100 Subject: [PATCH 203/495] Make env variables required --- cmd/rove-server/internal/server.go | 3 +++ cmd/rove-server/main.go | 4 ++++ cmd/rove/main_test.go | 6 +----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 3495bbd..3e290e3 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -106,6 +106,9 @@ func (s *Server) Initialise(fillWorld bool) (err error) { s.sync.Add(1) // Connect to the accountant + if len(accountantAddress) == 0 { + log.Fatal("must set ACCOUNTANT_ADDRESS") + } log.Printf("Dialing accountant on %s\n", accountantAddress) s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) if err != nil { diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 53dba56..e1a989a 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -35,6 +35,10 @@ func InnerMain() { return } + if len(address) == 0 { + log.Fatalf("Must set HOST_ADDRESS") + } + log.Printf("Initialising version %s...\n", version.Version) // Set the persistence path diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 5ccff56..16cc333 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -12,15 +12,11 @@ import ( "github.com/stretchr/testify/assert" ) -const ( - defaultAddress = "localhost:8080" -) - func Test_InnerMain(t *testing.T) { var address = os.Getenv("ROVE_SERVER_ADDRESS") if len(address) == 0 { - address = defaultAddress + log.Fatal("Must set ROVE_SERVER_ADDRESS") } // Set up the flags to act locally and use a temporary file From 856771dac76f88909bcc54ffaa541eed792892d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:43:35 +0100 Subject: [PATCH 204/495] Rename the RoveServer proto to Rove --- cmd/rove-server/internal/server.go | 2 +- cmd/rove/main.go | 2 +- pkg/rove/rove.pb.go | 182 ++++++++++++++--------------- pkg/rove/rove.pb.gw.go | 140 +++++++++++----------- proto/rove/rove.proto | 2 +- 5 files changed, 164 insertions(+), 164 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 3e290e3..c63a743 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -132,7 +132,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { log.Fatalf("failed to listen: %v", err) } s.grpcServ = grpc.NewServer() - rove.RegisterRoveServerServer(s.grpcServ, s) + rove.RegisterRoveServer(s.grpcServ, s) return nil } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2ecd94f..79ca85c 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -98,7 +98,7 @@ func InnerMain(command string) error { if err != nil { return err } - var client = rove.NewRoveServerClient(clientConn) + var client = rove.NewRoveClient(clientConn) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 1dff955..e0a8cfe 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -651,33 +651,33 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, - 0x32, 0xfb, 0x02, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, - 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, 0x40, 0x0a, 0x05, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x42, 0x21, - 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, - 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x32, 0xf5, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, + 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, + 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, + 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, + 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -709,16 +709,16 @@ var file_rove_rove_proto_goTypes = []interface{}{ var file_rove_rove_proto_depIdxs = []int32{ 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command 9, // 1: rove.RoverResponse.position:type_name -> rove.Vector - 10, // 2: rove.RoveServer.Status:input_type -> google.protobuf.Empty - 5, // 3: rove.RoveServer.Register:input_type -> rove.RegisterRequest - 1, // 4: rove.RoveServer.Commands:input_type -> rove.CommandsRequest - 3, // 5: rove.RoveServer.Radar:input_type -> rove.RadarRequest - 6, // 6: rove.RoveServer.Rover:input_type -> rove.RoverRequest - 8, // 7: rove.RoveServer.Status:output_type -> rove.StatusResponse - 10, // 8: rove.RoveServer.Register:output_type -> google.protobuf.Empty - 10, // 9: rove.RoveServer.Commands:output_type -> google.protobuf.Empty - 4, // 10: rove.RoveServer.Radar:output_type -> rove.RadarResponse - 7, // 11: rove.RoveServer.Rover:output_type -> rove.RoverResponse + 10, // 2: rove.Rove.Status:input_type -> google.protobuf.Empty + 5, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest + 1, // 4: rove.Rove.Commands:input_type -> rove.CommandsRequest + 3, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest + 6, // 6: rove.Rove.Rover:input_type -> rove.RoverRequest + 8, // 7: rove.Rove.Status:output_type -> rove.StatusResponse + 10, // 8: rove.Rove.Register:output_type -> google.protobuf.Empty + 10, // 9: rove.Rove.Commands:output_type -> google.protobuf.Empty + 4, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse + 7, // 11: rove.Rove.Rover:output_type -> rove.RoverResponse 7, // [7:12] is the sub-list for method output_type 2, // [2:7] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -881,10 +881,10 @@ var _ grpc.ClientConnInterface // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 -// RoveServerClient is the client API for RoveServer service. +// RoveClient is the client API for Rove service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type RoveServerClient interface { +type RoveClient interface { // Server status // // Responds with various details about the current server status @@ -907,61 +907,61 @@ type RoveServerClient interface { Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) } -type roveServerClient struct { +type roveClient struct { cc grpc.ClientConnInterface } -func NewRoveServerClient(cc grpc.ClientConnInterface) RoveServerClient { - return &roveServerClient{cc} +func NewRoveClient(cc grpc.ClientConnInterface) RoveClient { + return &roveClient{cc} } -func (c *roveServerClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { +func (c *roveClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { out := new(StatusResponse) - err := c.cc.Invoke(ctx, "/rove.RoveServer/Status", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.Rove/Status", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *roveServerClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/rove.RoveServer/Register", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.Rove/Register", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *roveServerClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *roveClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/rove.RoveServer/Commands", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.Rove/Commands", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *roveServerClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { +func (c *roveClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { out := new(RadarResponse) - err := c.cc.Invoke(ctx, "/rove.RoveServer/Radar", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.Rove/Radar", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *roveServerClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { +func (c *roveClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { out := new(RoverResponse) - err := c.cc.Invoke(ctx, "/rove.RoveServer/Rover", in, out, opts...) + err := c.cc.Invoke(ctx, "/rove.Rove/Rover", in, out, opts...) if err != nil { return nil, err } return out, nil } -// RoveServerServer is the server API for RoveServer service. -type RoveServerServer interface { +// RoveServer is the server API for Rove service. +type RoveServer interface { // Server status // // Responds with various details about the current server status @@ -984,143 +984,143 @@ type RoveServerServer interface { Rover(context.Context, *RoverRequest) (*RoverResponse, error) } -// UnimplementedRoveServerServer can be embedded to have forward compatible implementations. -type UnimplementedRoveServerServer struct { +// UnimplementedRoveServer can be embedded to have forward compatible implementations. +type UnimplementedRoveServer struct { } -func (*UnimplementedRoveServerServer) Status(context.Context, *empty.Empty) (*StatusResponse, error) { +func (*UnimplementedRoveServer) Status(context.Context, *empty.Empty) (*StatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") } -func (*UnimplementedRoveServerServer) Register(context.Context, *RegisterRequest) (*empty.Empty, error) { +func (*UnimplementedRoveServer) Register(context.Context, *RegisterRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (*UnimplementedRoveServerServer) Commands(context.Context, *CommandsRequest) (*empty.Empty, error) { +func (*UnimplementedRoveServer) Commands(context.Context, *CommandsRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") } -func (*UnimplementedRoveServerServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { +func (*UnimplementedRoveServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") } -func (*UnimplementedRoveServerServer) Rover(context.Context, *RoverRequest) (*RoverResponse, error) { +func (*UnimplementedRoveServer) Rover(context.Context, *RoverRequest) (*RoverResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Rover not implemented") } -func RegisterRoveServerServer(s *grpc.Server, srv RoveServerServer) { - s.RegisterService(&_RoveServer_serviceDesc, srv) +func RegisterRoveServer(s *grpc.Server, srv RoveServer) { + s.RegisterService(&_Rove_serviceDesc, srv) } -func _RoveServer_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServerServer).Status(ctx, in) + return srv.(RoveServer).Status(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoveServer/Status", + FullMethod: "/rove.Rove/Status", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServerServer).Status(ctx, req.(*empty.Empty)) + return srv.(RoveServer).Status(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } -func _RoveServer_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _Rove_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RegisterRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServerServer).Register(ctx, in) + return srv.(RoveServer).Register(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoveServer/Register", + FullMethod: "/rove.Rove/Register", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServerServer).Register(ctx, req.(*RegisterRequest)) + return srv.(RoveServer).Register(ctx, req.(*RegisterRequest)) } return interceptor(ctx, in, info, handler) } -func _RoveServer_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _Rove_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CommandsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServerServer).Commands(ctx, in) + return srv.(RoveServer).Commands(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoveServer/Commands", + FullMethod: "/rove.Rove/Commands", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServerServer).Commands(ctx, req.(*CommandsRequest)) + return srv.(RoveServer).Commands(ctx, req.(*CommandsRequest)) } return interceptor(ctx, in, info, handler) } -func _RoveServer_Radar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _Rove_Radar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RadarRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServerServer).Radar(ctx, in) + return srv.(RoveServer).Radar(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoveServer/Radar", + FullMethod: "/rove.Rove/Radar", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServerServer).Radar(ctx, req.(*RadarRequest)) + return srv.(RoveServer).Radar(ctx, req.(*RadarRequest)) } return interceptor(ctx, in, info, handler) } -func _RoveServer_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _Rove_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RoverRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServerServer).Rover(ctx, in) + return srv.(RoveServer).Rover(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.RoveServer/Rover", + FullMethod: "/rove.Rove/Rover", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServerServer).Rover(ctx, req.(*RoverRequest)) + return srv.(RoveServer).Rover(ctx, req.(*RoverRequest)) } return interceptor(ctx, in, info, handler) } -var _RoveServer_serviceDesc = grpc.ServiceDesc{ - ServiceName: "rove.RoveServer", - HandlerType: (*RoveServerServer)(nil), +var _Rove_serviceDesc = grpc.ServiceDesc{ + ServiceName: "rove.Rove", + HandlerType: (*RoveServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "Status", - Handler: _RoveServer_Status_Handler, + Handler: _Rove_Status_Handler, }, { MethodName: "Register", - Handler: _RoveServer_Register_Handler, + Handler: _Rove_Register_Handler, }, { MethodName: "Commands", - Handler: _RoveServer_Commands_Handler, + Handler: _Rove_Commands_Handler, }, { MethodName: "Radar", - Handler: _RoveServer_Radar_Handler, + Handler: _Rove_Radar_Handler, }, { MethodName: "Rover", - Handler: _RoveServer_Rover_Handler, + Handler: _Rove_Rover_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index f67af75..cdd011c 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -32,7 +32,7 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage -func request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -41,7 +41,7 @@ func request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -50,7 +50,7 @@ func local_request_RoveServer_Status_0(ctx context.Context, marshaler runtime.Ma } -func request_RoveServer_Register_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Rove_Register_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RegisterRequest var metadata runtime.ServerMetadata @@ -67,7 +67,7 @@ func request_RoveServer_Register_0(ctx context.Context, marshaler runtime.Marsha } -func local_request_RoveServer_Register_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Rove_Register_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RegisterRequest var metadata runtime.ServerMetadata @@ -84,7 +84,7 @@ func local_request_RoveServer_Register_0(ctx context.Context, marshaler runtime. } -func request_RoveServer_Commands_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CommandsRequest var metadata runtime.ServerMetadata @@ -101,7 +101,7 @@ func request_RoveServer_Commands_0(ctx context.Context, marshaler runtime.Marsha } -func local_request_RoveServer_Commands_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CommandsRequest var metadata runtime.ServerMetadata @@ -119,17 +119,17 @@ func local_request_RoveServer_Commands_0(ctx context.Context, marshaler runtime. } var ( - filter_RoveServer_Radar_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_Rove_Radar_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RadarRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Radar_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Radar_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -138,14 +138,14 @@ func request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RadarRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Radar_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Radar_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -155,17 +155,17 @@ func local_request_RoveServer_Radar_0(ctx context.Context, marshaler runtime.Mar } var ( - filter_RoveServer_Rover_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_Rove_Rover_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Marshaler, client RoveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RoverRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Rover_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Rover_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -174,14 +174,14 @@ func request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RoverRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoveServer_Rover_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Rover_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -190,12 +190,12 @@ func local_request_RoveServer_Rover_0(ctx context.Context, marshaler runtime.Mar } -// RegisterRoveServerHandlerServer registers the http handlers for service RoveServer to "mux". -// UnaryRPC :call RoveServerServer directly. +// RegisterRoveHandlerServer registers the http handlers for service Rove to "mux". +// UnaryRPC :call RoveServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoveServerServer) error { +func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoveServer) error { - mux.Handle("GET", pattern_RoveServer_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -204,18 +204,18 @@ func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RoveServer_Status_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Status_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_RoveServer_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -224,18 +224,18 @@ func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RoveServer_Register_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Register_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_RoveServer_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -244,18 +244,18 @@ func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RoveServer_Commands_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Commands_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_RoveServer_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -264,18 +264,18 @@ func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RoveServer_Radar_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Radar_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_RoveServer_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -284,23 +284,23 @@ func RegisterRoveServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RoveServer_Rover_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Rover_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil } -// RegisterRoveServerHandlerFromEndpoint is same as RegisterRoveServerHandler but +// RegisterRoveHandlerFromEndpoint is same as RegisterRoveHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterRoveServerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { +func RegisterRoveHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { conn, err := grpc.Dial(endpoint, opts...) if err != nil { return err @@ -320,23 +320,23 @@ func RegisterRoveServerHandlerFromEndpoint(ctx context.Context, mux *runtime.Ser }() }() - return RegisterRoveServerHandler(ctx, mux, conn) + return RegisterRoveHandler(ctx, mux, conn) } -// RegisterRoveServerHandler registers the http handlers for service RoveServer to "mux". +// RegisterRoveHandler registers the http handlers for service Rove to "mux". // The handlers forward requests to the grpc endpoint over "conn". -func RegisterRoveServerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterRoveServerHandlerClient(ctx, mux, NewRoveServerClient(conn)) +func RegisterRoveHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRoveHandlerClient(ctx, mux, NewRoveClient(conn)) } -// RegisterRoveServerHandlerClient registers the http handlers for service RoveServer -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoveServerClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoveServerClient" +// RegisterRoveHandlerClient registers the http handlers for service Rove +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoveClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoveClient" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "RoveServerClient" to call the correct interceptors. -func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoveServerClient) error { +// "RoveClient" to call the correct interceptors. +func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoveClient) error { - mux.Handle("GET", pattern_RoveServer_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -345,18 +345,18 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_RoveServer_Status_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Status_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_RoveServer_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -365,18 +365,18 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_RoveServer_Register_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Register_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_RoveServer_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -385,18 +385,18 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_RoveServer_Commands_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Commands_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_RoveServer_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -405,18 +405,18 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_RoveServer_Radar_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Radar_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_RoveServer_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -425,14 +425,14 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_RoveServer_Rover_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Rover_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_RoveServer_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -440,25 +440,25 @@ func RegisterRoveServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, } var ( - pattern_RoveServer_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_RoveServer_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_RoveServer_Commands_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"commands"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Commands_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"commands"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_RoveServer_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_RoveServer_Rover_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"rover"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Rover_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"rover"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( - forward_RoveServer_Status_0 = runtime.ForwardResponseMessage + forward_Rove_Status_0 = runtime.ForwardResponseMessage - forward_RoveServer_Register_0 = runtime.ForwardResponseMessage + forward_Rove_Register_0 = runtime.ForwardResponseMessage - forward_RoveServer_Commands_0 = runtime.ForwardResponseMessage + forward_Rove_Commands_0 = runtime.ForwardResponseMessage - forward_RoveServer_Radar_0 = runtime.ForwardResponseMessage + forward_Rove_Radar_0 = runtime.ForwardResponseMessage - forward_RoveServer_Rover_0 = runtime.ForwardResponseMessage + forward_Rove_Rover_0 = runtime.ForwardResponseMessage ) diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 9546d52..c400cb8 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -7,7 +7,7 @@ option go_package = "github.com/mdiluz/rove/pkg/rove"; import "google/protobuf/empty.proto"; import "google/api/annotations.proto"; -service RoveServer { +service Rove { // Server status // // Responds with various details about the current server status From 84163ce9e1649a75a709e1e40fc1a2afd637254d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:44:03 +0100 Subject: [PATCH 205/495] Fix logging for rove-server --- cmd/rove-server/internal/server.go | 2 +- cmd/rove-server/main.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index c63a743..3df7fea 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -168,7 +168,7 @@ func (s *Server) Run() { } // Serve the RPC server - log.Printf("Serving rove on %s\n", s.address) + log.Printf("Serving gRPC on %s\n", s.address) if err := s.grpcServ.Serve(s.netListener); err != nil && err != grpc.ErrServerStopped { log.Fatalf("failed to serve gRPC: %s", err) } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index e1a989a..d81f424 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -85,7 +85,6 @@ func InnerMain() { } // Run the server - log.Printf("Serving HTTP on %s\n", s.Addr()) s.Run() // Close the server From 55cd4fe4a596d03915caac44ac0e672921ea22df Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:44:40 +0100 Subject: [PATCH 206/495] Fix rove-reverse-proxy as well --- cmd/rove-reverse-proxy/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-reverse-proxy/main.go index 63f6ca1..a818aec 100644 --- a/cmd/rove-reverse-proxy/main.go +++ b/cmd/rove-reverse-proxy/main.go @@ -26,7 +26,7 @@ func run() error { fmt.Printf("Hosting reverse-proxy on %s for %s\n", address, endpoint) mux := runtime.NewServeMux() opts := []grpc.DialOption{grpc.WithInsecure()} - err := rove.RegisterRoveServerHandlerFromEndpoint(ctx, mux, endpoint, opts) + err := rove.RegisterRoveHandlerFromEndpoint(ctx, mux, endpoint, opts) if err != nil { return err } From 9d91fb836f9dbc92c398d001f1e539b0a62f2b26 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:59:25 +0100 Subject: [PATCH 207/495] Re-instate the stagger doc server --- .github/workflows/docker-image.yml | 5 +++++ Dockerfile.docs | 8 ++++++++ docker-compose.yml | 12 +++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.docs diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 1d08aea..87a6e1e 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -21,6 +21,11 @@ jobs: - name: Install dict run: sudo apt-get update && sudo apt-get install wamerican + + - name: Install swagger + run: | + sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 + sudo chmod +x /usr/local/bin/swagger - name: Check out repo uses: actions/checkout@v2 diff --git a/Dockerfile.docs b/Dockerfile.docs new file mode 100644 index 0000000..c74f94b --- /dev/null +++ b/Dockerfile.docs @@ -0,0 +1,8 @@ +FROM quay.io/goswagger/swagger:latest +LABEL maintainer="Marc Di Luzio " + +WORKDIR /app +COPY . . + +CMD [ "serve", "pkg/rove/rove.swagger.json", "--no-open" ] + diff --git a/docker-compose.yml b/docker-compose.yml index 0aa33f1..f9568f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,8 +30,18 @@ services: - GRPC_ENDPOINT=rove-server:8082 command: [ ./rove-reverse-proxy ] + rove-docs: + build: + context: . + dockerfile: Dockerfile.docs + image: rove-docs:latest + ports: + - "80:80" + environment: + - PORT=80 + rove-server: - depends_on: [ rove-accountant, rove-reverse-proxy ] + depends_on: [ rove-accountant, rove-reverse-proxy, rove-docs] build: context: . dockerfile: Dockerfile From 7c830f58beec7899f3310be05b993f8a6a1d3cbe Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 10:59:47 +0100 Subject: [PATCH 208/495] Add missing log import --- cmd/rove/main_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 16cc333..16d5dd7 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -4,6 +4,7 @@ package main import ( "flag" + "log" "os" "path" "testing" From 98249948a1d9a447f6f6b76d02f15f48ddc9e761 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:17:52 +0100 Subject: [PATCH 209/495] Fix up host ports and env variables --- cmd/rove-accountant/main.go | 4 +-- cmd/rove-reverse-proxy/main.go | 36 ++++++++++++------------- cmd/rove-server/internal/server.go | 5 ++-- cmd/rove-server/internal/server_test.go | 3 +++ cmd/rove-server/main.go | 17 +++--------- cmd/rove-server/main_test.go | 6 ----- cmd/rove/main_test.go | 4 +-- docker-compose.yml | 18 ++++++------- 8 files changed, 38 insertions(+), 55 deletions(-) diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index 3e8e0d2..767f1f4 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -15,7 +15,6 @@ import ( "google.golang.org/grpc" ) -var address = os.Getenv("HOST_ADDRESS") var data = os.Getenv("DATA_PATH") // accountantServer is the internal object to manage the requests @@ -82,8 +81,9 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a // main func main() { // Verify the input + var address = os.Getenv("ROVE_ACCOUNTANT_GRPC") if len(address) == 0 { - log.Fatal("No address set with $HOST_ADDRESS") + log.Fatal("No address set with $ROVE_ACCOUNTANT_GRPC") } persistence.SetPath(data) diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-reverse-proxy/main.go index a818aec..8eeb5b9 100644 --- a/cmd/rove-reverse-proxy/main.go +++ b/cmd/rove-reverse-proxy/main.go @@ -2,44 +2,42 @@ package main import ( "context" - "flag" "fmt" + "log" "net/http" "os" - "github.com/golang/glog" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" "github.com/mdiluz/rove/pkg/rove" ) -var endpoint = os.Getenv("GRPC_ENDPOINT") -var address = os.Getenv("HOST_ADDRESS") - -func run() error { +func main() { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() - // Create a new mux and register it with the gRPC engpoint + var endpoint = os.Getenv("ROVE_GRPC") + if len(endpoint) == 0 { + log.Fatal("Must set $ROVE_GRPC") + } + + var address = os.Getenv("ROVE_HTTP") + if len(address) == 0 { + log.Fatal("Must set $ROVE_HTTP") + } + + // Create a new mux and register it with the gRPC endpoint fmt.Printf("Hosting reverse-proxy on %s for %s\n", address, endpoint) mux := runtime.NewServeMux() opts := []grpc.DialOption{grpc.WithInsecure()} - err := rove.RegisterRoveHandlerFromEndpoint(ctx, mux, endpoint, opts) - if err != nil { - return err + if err := rove.RegisterRoveHandlerFromEndpoint(ctx, mux, endpoint, opts); err != nil { + log.Fatal(err) } // Start the HTTP server and proxy calls to gRPC endpoint when needed - return http.ListenAndServe(address, mux) -} - -func main() { - flag.Parse() - defer glog.Flush() - - if err := run(); err != nil { - glog.Fatal(err) + if err := http.ListenAndServe(address, mux); err != nil { + log.Fatal(err) } } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 3df7fea..dc3500e 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -17,8 +17,6 @@ import ( "google.golang.org/grpc" ) -var accountantAddress = os.Getenv("ACCOUNTANT_ADDRESS") - const ( // PersistentData will allow the server to load and save it's state PersistentData = iota @@ -106,8 +104,9 @@ func (s *Server) Initialise(fillWorld bool) (err error) { s.sync.Add(1) // Connect to the accountant + accountantAddress := os.Getenv("ROVE_ACCOUNTANT_GRPC") if len(accountantAddress) == 0 { - log.Fatal("must set ACCOUNTANT_ADDRESS") + log.Fatal("must set $ROVE_ACCOUNTANT_GRPC") } log.Printf("Dialing accountant on %s\n", accountantAddress) s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) diff --git a/cmd/rove-server/internal/server_test.go b/cmd/rove-server/internal/server_test.go index 36db679..1297ec2 100644 --- a/cmd/rove-server/internal/server_test.go +++ b/cmd/rove-server/internal/server_test.go @@ -1,6 +1,7 @@ package internal import ( + "os" "testing" ) @@ -30,6 +31,7 @@ func TestNewServer_OptionPersistentData(t *testing.T) { } func TestServer_Run(t *testing.T) { + os.Setenv("ROVE_ACCOUNTANT_GRPC", "n/a") server := NewServer() if server == nil { t.Error("Failed to create server") @@ -45,6 +47,7 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { + os.Setenv("ROVE_ACCOUNTANT_GRPC", "n/a") server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index d81f424..cb489da 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -7,7 +7,6 @@ import ( "os/signal" "strconv" "syscall" - "time" "github.com/mdiluz/rove/cmd/rove-server/internal" "github.com/mdiluz/rove/pkg/persistence" @@ -15,10 +14,6 @@ import ( ) var ver = flag.Bool("version", false, "Display version number") -var quit = flag.Int("quit", 0, "Quit after n seconds, useful for testing") - -// Address to host the server on, automatically selected if empty -var address = os.Getenv("HOST_ADDRESS") // Path for persistent storage var data = os.Getenv("DATA_PATH") @@ -35,8 +30,10 @@ func InnerMain() { return } + // Address to host the server on, automatically selected if empty + var address = os.Getenv("ROVE_GRPC") if len(address) == 0 { - log.Fatalf("Must set HOST_ADDRESS") + log.Fatalf("Must set $ROVE_GRPC") } log.Printf("Initialising version %s...\n", version.Version) @@ -76,14 +73,6 @@ func InnerMain() { } }() - // Quit after a time if requested - if *quit != 0 { - go func() { - time.Sleep(time.Duration(*quit) * time.Second) - syscall.Kill(syscall.Getpid(), syscall.SIGTERM) - }() - } - // Run the server s.Run() diff --git a/cmd/rove-server/main_test.go b/cmd/rove-server/main_test.go index 64aa62c..fcf9a55 100644 --- a/cmd/rove-server/main_test.go +++ b/cmd/rove-server/main_test.go @@ -10,9 +10,3 @@ func Test_InnerMain_Version(t *testing.T) { InnerMain() flag.Set("version", "0") } - -func Test_InnerMain_Quit(t *testing.T) { - flag.Set("quit", "1") - InnerMain() - flag.Set("quit", "0") -} diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 16d5dd7..aea0b0e 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -15,9 +15,9 @@ import ( func Test_InnerMain(t *testing.T) { - var address = os.Getenv("ROVE_SERVER_ADDRESS") + var address = os.Getenv("ROVE_GRPC") if len(address) == 0 { - log.Fatal("Must set ROVE_SERVER_ADDRESS") + log.Fatal("Must set $ROVE_GRPC") } // Set up the flags to act locally and use a temporary file diff --git a/docker-compose.yml b/docker-compose.yml index f9568f4..4e0f490 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,9 +10,9 @@ services: dockerfile: Dockerfile image: rove:latest ports: - - "8081:8081" + - "9091:9091" environment: - - HOST_ADDRESS=:8081 + - ROVE_ACCOUNTANT_GRPC=:9091 - DATA_PATH=/mnt/rove-server volumes: - persistent-data:/mnt/rove-server:rw @@ -26,8 +26,8 @@ services: ports: - "8080:8080" environment: - - HOST_ADDRESS=:8080 - - GRPC_ENDPOINT=rove-server:8082 + - ROVE_HTTP=:8080 + - ROVE_GRPC=:9090 command: [ ./rove-reverse-proxy ] rove-docs: @@ -47,11 +47,11 @@ services: dockerfile: Dockerfile image: rove:latest ports: - - "8082:8082" + - "9090:9090" environment: - - HOST_ADDRESS=:8082 + - ROVE_GRPC=:9090 - DATA_PATH=/mnt/rove-server - - ACCOUNTANT_ADDRESS=rove-accountant:8081 + - ROVE_ACCOUNTANT_GRPC=:9091 volumes: - persistent-data:/mnt/rove-server:rw @@ -62,8 +62,8 @@ services: dockerfile: Dockerfile image: rove:latest environment: - - ACCOUNTANT_ADDRESS=rove-accountant:8081 - - ROVE_SERVER_ADDRESS=rove-reverse-proxy:8080 + - ROVE_ACCOUNTANT_GRPC=:9091 + - ROVE_GRPC=rove-server:9090 command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw From 3f879f9501015e785a6a861d2e6498eed2cae261 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:18:26 +0100 Subject: [PATCH 210/495] Add back a dummy HTTP test file --- cmd/rove-reverse-proxy/http_test.go | 94 +++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 cmd/rove-reverse-proxy/http_test.go diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go new file mode 100644 index 0000000..e8d64c3 --- /dev/null +++ b/cmd/rove-reverse-proxy/http_test.go @@ -0,0 +1,94 @@ +// +build integration + +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "os" + "testing" +) + +// Server is a simple wrapper to a server path +type Server string + +// Get performs a Get request +func (s Server) Get(path string, out interface{}) error { + u := url.URL{ + Scheme: "http", + Host: string(s), + Path: path, + } + if resp, err := http.Get(u.String()); err != nil { + return err + + } else if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) + } + return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) + + } else { + return json.NewDecoder(resp.Body).Decode(out) + } +} + +// Post performs a Post request +func (s Server) Post(path string, in, out interface{}) error { + u := url.URL{ + Scheme: "http", + Host: string(s), + Path: path, + } + client := &http.Client{} + + // Marshal the input + marshalled, err := json.Marshal(in) + if err != nil { + return err + } + + // Set up the request + req, err := http.NewRequest("POST", u.String(), bytes.NewReader(marshalled)) + if err != nil { + return err + } + + // Do the POST + req.Header.Set("Content-Type", "application/json") + if resp, err := client.Do(req); err != nil { + return err + + } else if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) + } + return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) + + } else { + return json.NewDecoder(resp.Body).Decode(out) + } +} + +var serv = Server(os.Getenv("ROVE_GRPC")) + +func TestServer_Status(t *testing.T) { +} + +func TestServer_Register(t *testing.T) { +} + +func TestServer_Command(t *testing.T) { +} + +func TestServer_Radar(t *testing.T) { +} + +func TestServer_Rover(t *testing.T) { +} From 914eef05c0d2660a14cd9157a33d6533b9fe0d05 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:41:24 +0100 Subject: [PATCH 211/495] Use standard PORT for host port --- cmd/rove-accountant/main.go | 16 +++++++++++----- cmd/rove-reverse-proxy/main.go | 15 ++++++++++----- cmd/rove-server/main.go | 14 +++++++++----- cmd/rove/main.go | 6 +++--- docker-compose.yml | 12 ++++++------ 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index 767f1f4..ff5036d 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -2,10 +2,12 @@ package main import ( "context" + "fmt" "log" "net" "os" "os/signal" + "strconv" "sync" "syscall" @@ -81,9 +83,13 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a // main func main() { // Verify the input - var address = os.Getenv("ROVE_ACCOUNTANT_GRPC") - if len(address) == 0 { - log.Fatal("No address set with $ROVE_ACCOUNTANT_GRPC") + var port = os.Getenv("PORT") + if len(port) == 0 { + log.Fatal("Must set $PORT") + } + iport, err := strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") } persistence.SetPath(data) @@ -95,7 +101,7 @@ func main() { } // Set up the RPC server and register - lis, err := net.Listen("tcp", address) + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", iport)) if err != nil { log.Fatalf("failed to listen: %v", err) } @@ -114,7 +120,7 @@ func main() { }() // Serve the RPC server - log.Printf("Serving accountant on %s\n", address) + log.Printf("Serving accountant on %s\n", port) if err := grpcServer.Serve(lis); err != nil { log.Fatalf("failed to serve gRPC: %s", err) } diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-reverse-proxy/main.go index 8eeb5b9..eaedc69 100644 --- a/cmd/rove-reverse-proxy/main.go +++ b/cmd/rove-reverse-proxy/main.go @@ -6,6 +6,7 @@ import ( "log" "net/http" "os" + "strconv" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" @@ -23,13 +24,17 @@ func main() { log.Fatal("Must set $ROVE_GRPC") } - var address = os.Getenv("ROVE_HTTP") - if len(address) == 0 { - log.Fatal("Must set $ROVE_HTTP") + var port = os.Getenv("PORT") + if len(port) == 0 { + log.Fatal("Must set $PORT") + } + iport, err := strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") } // Create a new mux and register it with the gRPC endpoint - fmt.Printf("Hosting reverse-proxy on %s for %s\n", address, endpoint) + fmt.Printf("Hosting reverse-proxy on %d for %s\n", iport, endpoint) mux := runtime.NewServeMux() opts := []grpc.DialOption{grpc.WithInsecure()} if err := rove.RegisterRoveHandlerFromEndpoint(ctx, mux, endpoint, opts); err != nil { @@ -37,7 +42,7 @@ func main() { } // Start the HTTP server and proxy calls to gRPC endpoint when needed - if err := http.ListenAndServe(address, mux); err != nil { + if err := http.ListenAndServe(fmt.Sprintf(":%d", iport), mux); err != nil { log.Fatal(err) } } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index cb489da..83ec280 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "log" "os" "os/signal" @@ -31,11 +32,14 @@ func InnerMain() { } // Address to host the server on, automatically selected if empty - var address = os.Getenv("ROVE_GRPC") - if len(address) == 0 { - log.Fatalf("Must set $ROVE_GRPC") + var port = os.Getenv("PORT") + if len(port) == 0 { + log.Fatal("Must set $PORT") + } + iport, err := strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") } - log.Printf("Initialising version %s...\n", version.Version) // Set the persistence path @@ -53,7 +57,7 @@ func InnerMain() { // Create the server data s := internal.NewServer( - internal.OptionAddress(address), + internal.OptionAddress(fmt.Sprintf(":%d", iport)), internal.OptionPersistentData(), internal.OptionTick(tickRate)) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 79ca85c..3347afa 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -17,8 +17,6 @@ import ( "google.golang.org/grpc" ) -var USAGE = "" - // Command usage func Usage() { fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [OPTIONS]...\n", os.Args[0]) @@ -36,6 +34,8 @@ func Usage() { var home = os.Getenv("HOME") var filepath = path.Join(home, ".local/share/rove.json") +const gRPCport = 9090 + // General usage var ver = flag.Bool("version", false, "Display version number") var host = flag.String("host", "", "path to game host server") @@ -94,7 +94,7 @@ func InnerMain(command string) error { } // Set up the server - clientConn, err := grpc.Dial(config.Host, grpc.WithInsecure()) + clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithInsecure()) if err != nil { return err } diff --git a/docker-compose.yml b/docker-compose.yml index 4e0f490..12b3dd8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: ports: - "9091:9091" environment: - - ROVE_ACCOUNTANT_GRPC=:9091 + - PORT=9091 - DATA_PATH=/mnt/rove-server volumes: - persistent-data:/mnt/rove-server:rw @@ -26,8 +26,8 @@ services: ports: - "8080:8080" environment: - - ROVE_HTTP=:8080 - - ROVE_GRPC=:9090 + - PORT=8080 + - ROVE_GRPC=rove-server:9090 command: [ ./rove-reverse-proxy ] rove-docs: @@ -49,9 +49,9 @@ services: ports: - "9090:9090" environment: - - ROVE_GRPC=:9090 + - PORT=9090 - DATA_PATH=/mnt/rove-server - - ROVE_ACCOUNTANT_GRPC=:9091 + - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 volumes: - persistent-data:/mnt/rove-server:rw @@ -62,7 +62,7 @@ services: dockerfile: Dockerfile image: rove:latest environment: - - ROVE_ACCOUNTANT_GRPC=:9091 + - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 - ROVE_GRPC=rove-server:9090 command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: From dc9eb8cf2e4eceb81d050396da1a328f24b566b2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:42:28 +0100 Subject: [PATCH 212/495] Fix filtering 's from babble names for rovers --- pkg/game/world.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index af0af11..626a4da 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -71,13 +71,10 @@ func (w *World) SpawnRover() (uuid.UUID, error) { Range: 5.0, // Set the name randomly - Name: babble.NewBabbler().Babble(), + Name: strings.ReplaceAll(babble.NewBabbler().Babble(), "'s", ""), }, } - // Dictionaries tend to include the possesive - strings.ReplaceAll(rover.Attributes.Name, "'s", "") - // Spawn in a random place near the origin rover.Attributes.Pos = vector.Vector{ X: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), From fcbc29c80bf4ae9d5e5344301a311275c25f89e8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:49:24 +0100 Subject: [PATCH 213/495] Fix rove gRPC path given to tests --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 12b3dd8..bacbfd4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -63,7 +63,7 @@ services: image: rove:latest environment: - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 - - ROVE_GRPC=rove-server:9090 + - ROVE_GRPC=rove-server command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw From a4a04a15fb85cbfe43c77f5b09f730c888b73d30 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 11:57:27 +0100 Subject: [PATCH 214/495] Remove empty proto i/o structs in favor of placeholders --- cmd/rove-server/internal/routes.go | 11 +- cmd/rove/main.go | 3 +- pkg/rove/rove.pb.go | 456 +++++++++++++++++++---------- pkg/rove/rove.pb.gw.go | 5 +- pkg/rove/rove.swagger.json | 29 +- proto/rove/rove.proto | 25 +- 6 files changed, 360 insertions(+), 169 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index eae2a1d..911de92 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/golang/protobuf/ptypes/empty" "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" @@ -13,7 +12,7 @@ import ( "google.golang.org/grpc" ) -func (s *Server) Status(context.Context, *empty.Empty) (*rove.StatusResponse, error) { +func (s *Server) Status(context.Context, *rove.StatusRequest) (*rove.StatusResponse, error) { response := &rove.StatusResponse{ Ready: true, Version: version.Version, @@ -30,7 +29,7 @@ func (s *Server) Status(context.Context, *empty.Empty) (*rove.StatusResponse, er return response, nil } -func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*empty.Empty, error) { +func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove.RegisterResponse, error) { if len(req.Name) == 0 { return nil, fmt.Errorf("empty account name") } @@ -46,7 +45,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*empt } - return &empty.Empty{}, nil + return &rove.RegisterResponse{}, nil } func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.RoverResponse, error) { @@ -104,7 +103,7 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar return response, nil } -func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*empty.Empty, error) { +func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove.CommandsResponse, error) { if len(req.Account) == 0 { return nil, fmt.Errorf("empty account") } @@ -131,5 +130,5 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*empt return nil, err } - return &empty.Empty{}, nil + return &rove.CommandsResponse{}, nil } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 3347afa..2df10d2 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -9,7 +9,6 @@ import ( "path" "time" - "github.com/golang/protobuf/ptypes/empty" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" @@ -108,7 +107,7 @@ func InnerMain(command string) error { // Handle all the commands switch command { case "status": - response, err := client.Status(ctx, &empty.Empty{}) + response, err := client.Status(ctx, &rove.StatusRequest{}) switch { case err != nil: return err diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index e0a8cfe..8a790ca 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -9,7 +9,6 @@ package rove import ( context "context" proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -37,9 +36,11 @@ type Command struct { unknownFields protoimpl.UnknownFields // The command to execute, currently only accepts move, which requires a bearing and a duration. - Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` - Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` - Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + // The bearing, example: NE + Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` + // The duration in ticks, example: 5 + Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` } func (x *Command) Reset() { @@ -100,7 +101,9 @@ type CommandsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The account to execture these commands + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The set of desired commands Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` } @@ -150,6 +153,45 @@ func (x *CommandsRequest) GetCommands() []*Command { return nil } +// Empty placeholder +type CommandsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CommandsResponse) Reset() { + *x = CommandsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommandsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommandsResponse) ProtoMessage() {} + +func (x *CommandsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommandsResponse.ProtoReflect.Descriptor instead. +func (*CommandsResponse) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{2} +} + type Error struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -162,7 +204,7 @@ type Error struct { func (x *Error) Reset() { *x = Error{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_rove_rove_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -175,7 +217,7 @@ func (x *Error) String() string { func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_rove_rove_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -188,7 +230,7 @@ func (x *Error) ProtoReflect() protoreflect.Message { // Deprecated: Use Error.ProtoReflect.Descriptor instead. func (*Error) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{2} + return file_rove_rove_proto_rawDescGZIP(), []int{3} } func (x *Error) GetError() string { @@ -203,13 +245,14 @@ type RadarRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The account for this request Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } func (x *RadarRequest) Reset() { *x = RadarRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[3] + mi := &file_rove_rove_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -222,7 +265,7 @@ func (x *RadarRequest) String() string { func (*RadarRequest) ProtoMessage() {} func (x *RadarRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[3] + mi := &file_rove_rove_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -235,7 +278,7 @@ func (x *RadarRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarRequest.ProtoReflect.Descriptor instead. func (*RadarRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{3} + return file_rove_rove_proto_rawDescGZIP(), []int{4} } func (x *RadarRequest) GetAccount() string { @@ -259,7 +302,7 @@ type RadarResponse struct { func (x *RadarResponse) Reset() { *x = RadarResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_rove_rove_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -272,7 +315,7 @@ func (x *RadarResponse) String() string { func (*RadarResponse) ProtoMessage() {} func (x *RadarResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_rove_rove_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -285,7 +328,7 @@ func (x *RadarResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarResponse.ProtoReflect.Descriptor instead. func (*RadarResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{4} + return file_rove_rove_proto_rawDescGZIP(), []int{5} } func (x *RadarResponse) GetRange() int32 { @@ -302,18 +345,58 @@ func (x *RadarResponse) GetTiles() []byte { return nil } +// Empty placeholder +type RegisterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RegisterResponse) Reset() { + *x = RegisterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterResponse) ProtoMessage() {} + +func (x *RegisterResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. +func (*RegisterResponse) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{6} +} + type RegisterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The desired account name Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *RegisterRequest) Reset() { *x = RegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_rove_rove_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -326,7 +409,7 @@ func (x *RegisterRequest) String() string { func (*RegisterRequest) ProtoMessage() {} func (x *RegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_rove_rove_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -339,7 +422,7 @@ func (x *RegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. func (*RegisterRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{5} + return file_rove_rove_proto_rawDescGZIP(), []int{7} } func (x *RegisterRequest) GetName() string { @@ -354,13 +437,14 @@ type RoverRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The account for this request Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } func (x *RoverRequest) Reset() { *x = RoverRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[6] + mi := &file_rove_rove_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -373,7 +457,7 @@ func (x *RoverRequest) String() string { func (*RoverRequest) ProtoMessage() {} func (x *RoverRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[6] + mi := &file_rove_rove_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -386,7 +470,7 @@ func (x *RoverRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RoverRequest.ProtoReflect.Descriptor instead. func (*RoverRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{6} + return file_rove_rove_proto_rawDescGZIP(), []int{8} } func (x *RoverRequest) GetAccount() string { @@ -414,7 +498,7 @@ type RoverResponse struct { func (x *RoverResponse) Reset() { *x = RoverResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_rove_rove_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -427,7 +511,7 @@ func (x *RoverResponse) String() string { func (*RoverResponse) ProtoMessage() {} func (x *RoverResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_rove_rove_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -440,7 +524,7 @@ func (x *RoverResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RoverResponse.ProtoReflect.Descriptor instead. func (*RoverResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{7} + return file_rove_rove_proto_rawDescGZIP(), []int{9} } func (x *RoverResponse) GetName() string { @@ -471,6 +555,45 @@ func (x *RoverResponse) GetSpeed() int32 { return 0 } +// Empty placeholder +type StatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{10} +} + type StatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -489,7 +612,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_rove_rove_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -502,7 +625,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_rove_rove_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -515,7 +638,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{8} + return file_rove_rove_proto_rawDescGZIP(), []int{11} } func (x *StatusResponse) GetNextTick() string { @@ -558,7 +681,7 @@ type Vector struct { func (x *Vector) Reset() { *x = Vector{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -571,7 +694,7 @@ func (x *Vector) String() string { func (*Vector) ProtoMessage() {} func (x *Vector) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -584,7 +707,7 @@ func (x *Vector) ProtoReflect() protoreflect.Message { // Deprecated: Use Vector.ProtoReflect.Descriptor instead. func (*Vector) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{9} + return file_rove_rove_proto_rawDescGZIP(), []int{12} } func (x *Vector) GetX() int32 { @@ -605,79 +728,80 @@ var File_rove_rove_proto protoreflect.FileDescriptor var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, - 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, - 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, - 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x0d, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, - 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, - 0x32, 0xf5, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, + 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, 0x0c, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, + 0x65, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, + 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf2, 0x02, 0x0a, + 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, - 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, - 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, 0x40, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, - 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, - 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, + 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, + 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, + 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, + 0x40, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -692,33 +816,35 @@ func file_rove_rove_proto_rawDescGZIP() []byte { return file_rove_rove_proto_rawDescData } -var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_rove_rove_proto_goTypes = []interface{}{ - (*Command)(nil), // 0: rove.Command - (*CommandsRequest)(nil), // 1: rove.CommandsRequest - (*Error)(nil), // 2: rove.Error - (*RadarRequest)(nil), // 3: rove.RadarRequest - (*RadarResponse)(nil), // 4: rove.RadarResponse - (*RegisterRequest)(nil), // 5: rove.RegisterRequest - (*RoverRequest)(nil), // 6: rove.RoverRequest - (*RoverResponse)(nil), // 7: rove.RoverResponse - (*StatusResponse)(nil), // 8: rove.StatusResponse - (*Vector)(nil), // 9: rove.Vector - (*empty.Empty)(nil), // 10: google.protobuf.Empty + (*Command)(nil), // 0: rove.Command + (*CommandsRequest)(nil), // 1: rove.CommandsRequest + (*CommandsResponse)(nil), // 2: rove.CommandsResponse + (*Error)(nil), // 3: rove.Error + (*RadarRequest)(nil), // 4: rove.RadarRequest + (*RadarResponse)(nil), // 5: rove.RadarResponse + (*RegisterResponse)(nil), // 6: rove.RegisterResponse + (*RegisterRequest)(nil), // 7: rove.RegisterRequest + (*RoverRequest)(nil), // 8: rove.RoverRequest + (*RoverResponse)(nil), // 9: rove.RoverResponse + (*StatusRequest)(nil), // 10: rove.StatusRequest + (*StatusResponse)(nil), // 11: rove.StatusResponse + (*Vector)(nil), // 12: rove.Vector } var file_rove_rove_proto_depIdxs = []int32{ 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command - 9, // 1: rove.RoverResponse.position:type_name -> rove.Vector - 10, // 2: rove.Rove.Status:input_type -> google.protobuf.Empty - 5, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest + 12, // 1: rove.RoverResponse.position:type_name -> rove.Vector + 10, // 2: rove.Rove.Status:input_type -> rove.StatusRequest + 7, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest 1, // 4: rove.Rove.Commands:input_type -> rove.CommandsRequest - 3, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest - 6, // 6: rove.Rove.Rover:input_type -> rove.RoverRequest - 8, // 7: rove.Rove.Status:output_type -> rove.StatusResponse - 10, // 8: rove.Rove.Register:output_type -> google.protobuf.Empty - 10, // 9: rove.Rove.Commands:output_type -> google.protobuf.Empty - 4, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse - 7, // 11: rove.Rove.Rover:output_type -> rove.RoverResponse + 4, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest + 8, // 6: rove.Rove.Rover:input_type -> rove.RoverRequest + 11, // 7: rove.Rove.Status:output_type -> rove.StatusResponse + 6, // 8: rove.Rove.Register:output_type -> rove.RegisterResponse + 2, // 9: rove.Rove.Commands:output_type -> rove.CommandsResponse + 5, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse + 9, // 11: rove.Rove.Rover:output_type -> rove.RoverResponse 7, // [7:12] is the sub-list for method output_type 2, // [2:7] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -757,7 +883,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { + switch v := v.(*CommandsResponse); i { case 0: return &v.state case 1: @@ -769,7 +895,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RadarRequest); i { + switch v := v.(*Error); i { case 0: return &v.state case 1: @@ -781,7 +907,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RadarResponse); i { + switch v := v.(*RadarRequest); i { case 0: return &v.state case 1: @@ -793,7 +919,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterRequest); i { + switch v := v.(*RadarResponse); i { case 0: return &v.state case 1: @@ -805,7 +931,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoverRequest); i { + switch v := v.(*RegisterResponse); i { case 0: return &v.state case 1: @@ -817,7 +943,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoverResponse); i { + switch v := v.(*RegisterRequest); i { case 0: return &v.state case 1: @@ -829,7 +955,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse); i { + switch v := v.(*RoverRequest); i { case 0: return &v.state case 1: @@ -841,6 +967,42 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Vector); i { case 0: return &v.state @@ -859,7 +1021,7 @@ func file_rove_rove_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rove_rove_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, @@ -888,15 +1050,15 @@ type RoveClient interface { // Server status // // Responds with various details about the current server status - Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) + Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) // Register an account // // Tries to register an account with the given name - Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) + Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) + Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*CommandsResponse, error) // Get radar information // // Gets the radar output for the given rover @@ -915,7 +1077,7 @@ func NewRoveClient(cc grpc.ClientConnInterface) RoveClient { return &roveClient{cc} } -func (c *roveClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*StatusResponse, error) { +func (c *roveClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { out := new(StatusResponse) err := c.cc.Invoke(ctx, "/rove.Rove/Status", in, out, opts...) if err != nil { @@ -924,8 +1086,8 @@ func (c *roveClient) Status(ctx context.Context, in *empty.Empty, opts ...grpc.C return out, nil } -func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) { + out := new(RegisterResponse) err := c.cc.Invoke(ctx, "/rove.Rove/Register", in, out, opts...) if err != nil { return nil, err @@ -933,8 +1095,8 @@ func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ... return out, nil } -func (c *roveClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *roveClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*CommandsResponse, error) { + out := new(CommandsResponse) err := c.cc.Invoke(ctx, "/rove.Rove/Commands", in, out, opts...) if err != nil { return nil, err @@ -965,15 +1127,15 @@ type RoveServer interface { // Server status // // Responds with various details about the current server status - Status(context.Context, *empty.Empty) (*StatusResponse, error) + Status(context.Context, *StatusRequest) (*StatusResponse, error) // Register an account // // Tries to register an account with the given name - Register(context.Context, *RegisterRequest) (*empty.Empty, error) + Register(context.Context, *RegisterRequest) (*RegisterResponse, error) // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - Commands(context.Context, *CommandsRequest) (*empty.Empty, error) + Commands(context.Context, *CommandsRequest) (*CommandsResponse, error) // Get radar information // // Gets the radar output for the given rover @@ -988,13 +1150,13 @@ type RoveServer interface { type UnimplementedRoveServer struct { } -func (*UnimplementedRoveServer) Status(context.Context, *empty.Empty) (*StatusResponse, error) { +func (*UnimplementedRoveServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") } -func (*UnimplementedRoveServer) Register(context.Context, *RegisterRequest) (*empty.Empty, error) { +func (*UnimplementedRoveServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (*UnimplementedRoveServer) Commands(context.Context, *CommandsRequest) (*empty.Empty, error) { +func (*UnimplementedRoveServer) Commands(context.Context, *CommandsRequest) (*CommandsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") } func (*UnimplementedRoveServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { @@ -1009,7 +1171,7 @@ func RegisterRoveServer(s *grpc.Server, srv RoveServer) { } func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(StatusRequest) if err := dec(in); err != nil { return nil, err } @@ -1021,7 +1183,7 @@ func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interfa FullMethod: "/rove.Rove/Status", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServer).Status(ctx, req.(*empty.Empty)) + return srv.(RoveServer).Status(ctx, req.(*StatusRequest)) } return interceptor(ctx, in, info, handler) } diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index cdd011c..f22b6a0 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -15,7 +15,6 @@ import ( "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" "google.golang.org/grpc" @@ -33,7 +32,7 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq StatusRequest var metadata runtime.ServerMetadata msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -42,7 +41,7 @@ func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, cli } func local_request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq StatusRequest var metadata runtime.ServerMetadata msg, err := server.Status(ctx, &protoReq) diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index a25d00a..3b46b33 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -20,7 +20,7 @@ "200": { "description": "A successful response.", "schema": { - "properties": {} + "$ref": "#/definitions/roveCommandsResponse" } }, "default": { @@ -67,6 +67,7 @@ "parameters": [ { "name": "account", + "description": "The account for this request.", "in": "query", "required": false, "type": "string" @@ -86,7 +87,7 @@ "200": { "description": "A successful response.", "schema": { - "properties": {} + "$ref": "#/definitions/roveRegisterResponse" } }, "default": { @@ -133,6 +134,7 @@ "parameters": [ { "name": "account", + "description": "The account for this request.", "in": "query", "required": false, "type": "string" @@ -210,11 +212,13 @@ "description": "The command to execute, currently only accepts move, which requires a bearing and a duration." }, "bearing": { - "type": "string" + "type": "string", + "title": "The bearing, example: NE" }, "duration": { "type": "integer", - "format": "int32" + "format": "int32", + "title": "The duration in ticks, example: 5" } } }, @@ -222,16 +226,22 @@ "type": "object", "properties": { "account": { - "type": "string" + "type": "string", + "title": "The account to execture these commands" }, "commands": { "type": "array", "items": { "$ref": "#/definitions/roveCommand" - } + }, + "title": "The set of desired commands" } } }, + "roveCommandsResponse": { + "type": "object", + "title": "Empty placeholder" + }, "roveRadarResponse": { "type": "object", "properties": { @@ -251,10 +261,15 @@ "type": "object", "properties": { "name": { - "type": "string" + "type": "string", + "title": "The desired account name" } } }, + "roveRegisterResponse": { + "type": "object", + "title": "Empty placeholder" + }, "roveRoverResponse": { "type": "object", "properties": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index c400cb8..d40bed0 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -4,14 +4,13 @@ package rove; option go_package = "github.com/mdiluz/rove/pkg/rove"; -import "google/protobuf/empty.proto"; import "google/api/annotations.proto"; service Rove { // Server status // // Responds with various details about the current server status - rpc Status(google.protobuf.Empty) returns (StatusResponse) { + rpc Status(StatusRequest) returns (StatusResponse) { option (google.api.http) = { get: "/status" }; @@ -20,7 +19,7 @@ service Rove { // Register an account // // Tries to register an account with the given name - rpc Register(RegisterRequest) returns (google.protobuf.Empty) { + rpc Register(RegisterRequest) returns (RegisterResponse) { option (google.api.http) = { post: "/register" body: "*" @@ -30,7 +29,7 @@ service Rove { // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - rpc Commands(CommandsRequest) returns (google.protobuf.Empty) { + rpc Commands(CommandsRequest) returns (CommandsResponse) { option (google.api.http) = { post: "/commands" body: "*" @@ -60,21 +59,31 @@ message Command { // The command to execute, currently only accepts move, which requires a bearing and a duration. string command = 1; + // The bearing, example: NE string bearing = 2; + + // The duration in ticks, example: 5 int32 duration = 3; } message CommandsRequest { + // The account to execture these commands string account = 1; + + // The set of desired commands repeated Command commands = 2; } +// Empty placeholder +message CommandsResponse {} + message Error { // An explanation for the HTTP error returned string error = 1; } message RadarRequest { + // The account for this request string account = 1; } @@ -86,11 +95,16 @@ message RadarResponse { bytes tiles = 2; } +// Empty placeholder +message RegisterResponse{} + message RegisterRequest { + // The desired account name string name = 1; } message RoverRequest { + // The account for this request string account = 1; } @@ -108,6 +122,9 @@ message RoverResponse { int32 speed = 4; } +// Empty placeholder +message StatusRequest {} + message StatusResponse { // The time the next tick will occur string next_tick = 1; From 389fb7e9db19104e0f3ef1cb3ea565caed50d567 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 12:14:54 +0100 Subject: [PATCH 215/495] Add wait-for-it.sh from https://github.com/vishnubob/wait-for-it at c096cfa --- script/wait-for-it.sh | 182 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100755 script/wait-for-it.sh diff --git a/script/wait-for-it.sh b/script/wait-for-it.sh new file mode 100755 index 0000000..5e8679e --- /dev/null +++ b/script/wait-for-it.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi From 42ee69b1a2c75be3d41e14bca27453b42acfe71a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 12:16:05 +0100 Subject: [PATCH 216/495] Prepend license to wait-for-it --- script/wait-for-it.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/script/wait-for-it.sh b/script/wait-for-it.sh index 5e8679e..f9c60e2 100755 --- a/script/wait-for-it.sh +++ b/script/wait-for-it.sh @@ -1,4 +1,24 @@ #!/usr/bin/env bash +# The MIT License (MIT) +# Copyright (c) 2016 Giles Hall + +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. # Use this script to test if a given TCP host/port are available WAITFORIT_cmdname=${0##*/} From ba52458fd6084fe93d50197f51c3dee262c8ebc7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 12:35:37 +0100 Subject: [PATCH 217/495] Start to implement proper validation of HTTP interface --- Makefile | 1 + cmd/rove-reverse-proxy/http_test.go | 40 ++++++++++------------------- docker-compose.yml | 33 +++++++++++++----------- 3 files changed, 32 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 3b0361a..31d0ab3 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ test: @echo Integration tests docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests + docker-compose down go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html @echo Done, coverage data can be found in /tmp/coverage.html diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index e8d64c3..4f6b5ce 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -7,42 +7,23 @@ import ( "encoding/json" "fmt" "io/ioutil" + "log" "net/http" "net/url" "os" "testing" + + "github.com/mdiluz/rove/pkg/rove" ) // Server is a simple wrapper to a server path type Server string -// Get performs a Get request -func (s Server) Get(path string, out interface{}) error { +// Request performs a HTTP +func (s Server) Request(method, path string, in, out interface{}) error { u := url.URL{ Scheme: "http", - Host: string(s), - Path: path, - } - if resp, err := http.Get(u.String()); err != nil { - return err - - } else if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) - } - return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) - - } else { - return json.NewDecoder(resp.Body).Decode(out) - } -} - -// Post performs a Post request -func (s Server) Post(path string, in, out interface{}) error { - u := url.URL{ - Scheme: "http", - Host: string(s), + Host: fmt.Sprintf("%s:8080", string(s)), Path: path, } client := &http.Client{} @@ -54,7 +35,7 @@ func (s Server) Post(path string, in, out interface{}) error { } // Set up the request - req, err := http.NewRequest("POST", u.String(), bytes.NewReader(marshalled)) + req, err := http.NewRequest(method, u.String(), bytes.NewReader(marshalled)) if err != nil { return err } @@ -76,9 +57,14 @@ func (s Server) Post(path string, in, out interface{}) error { } } -var serv = Server(os.Getenv("ROVE_GRPC")) +var serv = Server(os.Getenv("ROVE_HTTP")) func TestServer_Status(t *testing.T) { + req := &rove.StatusRequest{} + resp := &rove.StatusResponse{} + if err := serv.Request("GET", "status", req, resp); err != nil { + log.Fatal(err) + } } func TestServer_Register(t *testing.T) { diff --git a/docker-compose.yml b/docker-compose.yml index bacbfd4..3c45612 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,18 +18,6 @@ services: - persistent-data:/mnt/rove-server:rw command: [ ./rove-accountant ] - rove-reverse-proxy: - build: - context: . - dockerfile: Dockerfile - image: rove:latest - ports: - - "8080:8080" - environment: - - PORT=8080 - - ROVE_GRPC=rove-server:9090 - command: [ ./rove-reverse-proxy ] - rove-docs: build: context: . @@ -41,7 +29,7 @@ services: - PORT=80 rove-server: - depends_on: [ rove-accountant, rove-reverse-proxy, rove-docs] + depends_on: [ rove-accountant ] build: context: . dockerfile: Dockerfile @@ -54,17 +42,32 @@ services: - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 volumes: - persistent-data:/mnt/rove-server:rw + command: [ "./script/wait-for-it.sh", "rove-accountant:9091", "--", "./rove-server"] + + rove: + depends_on: [ rove-server, rove-docs ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + ports: + - "8080:8080" + environment: + - PORT=8080 + - ROVE_GRPC=rove-server:9090 + command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "./rove-reverse-proxy" ] rove-tests: - depends_on: [ rove-server ] + depends_on: [ rove ] build: context: . dockerfile: Dockerfile image: rove:latest environment: - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 + - ROVE_HTTP=rove - ROVE_GRPC=rove-server - command: [ "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] + command: [ "./script/wait-for-it.sh", "rove:8080", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw From 187a0a6165f3b579749773864281f391f0b51944 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 13:18:22 +0100 Subject: [PATCH 218/495] Finish HTTP tests and adjust APIs to allow them to pass --- cmd/rove-reverse-proxy/http_test.go | 48 +++++++++++++++++++++++++++++ cmd/rove-server/internal/routes.go | 2 ++ pkg/rove/rove.pb.go | 21 +++++++------ pkg/rove/rove.pb.gw.go | 44 ++++++++++++-------------- pkg/rove/rove.swagger.json | 44 ++++++++++++++++++-------- proto/rove/rove.proto | 6 ++-- 6 files changed, 117 insertions(+), 48 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 4f6b5ce..7fe55a2 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -13,7 +13,9 @@ import ( "os" "testing" + "github.com/google/uuid" "github.com/mdiluz/rove/pkg/rove" + "github.com/stretchr/testify/assert" ) // Server is a simple wrapper to a server path @@ -68,13 +70,59 @@ func TestServer_Status(t *testing.T) { } func TestServer_Register(t *testing.T) { + req := &rove.RegisterRequest{Name: uuid.New().String()} + resp := &rove.RegisterResponse{} + err := serv.Request("POST", "register", req, resp) + assert.NoError(t, err, "First register attempt should pass") + err = serv.Request("POST", "register", req, resp) + assert.Error(t, err, "Second identical register attempt should fail") } func TestServer_Command(t *testing.T) { + acc := uuid.New().String() + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + assert.NoError(t, err, "First register attempt should pass") + + err = serv.Request("POST", "commands", &rove.CommandsRequest{ + Account: acc, + Commands: []*rove.Command{ + { + Command: "move", + Bearing: "NE", + Duration: 1, + }, + }, + }, &rove.CommandsResponse{}) + assert.NoError(t, err, "Commands should should pass") } func TestServer_Radar(t *testing.T) { + acc := uuid.New().String() + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + assert.NoError(t, err, "First register attempt should pass") + + resp := &rove.RadarResponse{} + err = serv.Request("POST", "radar", &rove.RadarRequest{ + Account: acc, + }, resp) + assert.NoError(t, err, "Radar sould pass should pass") + assert.NotZero(t, resp.Range, "Radar should return valid range") + w := int(resp.Range*2 + 1) + assert.Equal(t, w*w, len(resp.Tiles), "radar should return correct number of tiles") } func TestServer_Rover(t *testing.T) { + acc := uuid.New().String() + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + assert.NoError(t, err, "First register attempt should pass") + + resp := &rove.RoverResponse{} + err = serv.Request("POST", "rover", &rove.RoverRequest{ + Account: acc, + }, resp) + assert.NoError(t, err, "Rover sould pass should pass") + assert.NotZero(t, resp.Range, "Rover should return valid range") + assert.NotZero(t, len(resp.Name), "Rover should return valid name") + assert.NotZero(t, resp.Speed, "Rover should return valid speed") + assert.NotZero(t, resp.Position, "Rover should return valid position") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 911de92..14eddf9 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -69,6 +69,8 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover X: int32(attrib.Pos.X), Y: int32(attrib.Pos.Y), }, + Speed: int32(attrib.Speed), + Range: int32(attrib.Range), } } return response, nil diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 8a790ca..67c5b11 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -775,7 +775,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf2, 0x02, 0x0a, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, @@ -790,18 +790,19 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x40, 0x0a, + 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x12, - 0x40, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x72, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, + 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index f22b6a0..0d19891 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -117,18 +117,15 @@ func local_request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marsha } -var ( - filter_Rove_Radar_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - func request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RadarRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Radar_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -141,10 +138,11 @@ func local_request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler var protoReq RadarRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Radar_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -153,18 +151,15 @@ func local_request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler } -var ( - filter_Rove_Rover_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - func request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RoverRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Rover_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -177,10 +172,11 @@ func local_request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler var protoReq RoverRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Rove_Rover_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -254,7 +250,7 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve }) - mux.Handle("GET", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -274,7 +270,7 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve }) - mux.Handle("GET", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -395,7 +391,7 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien }) - mux.Handle("GET", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -415,7 +411,7 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien }) - mux.Handle("GET", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 3b46b33..6969424 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -46,7 +46,7 @@ } }, "/radar": { - "get": { + "post": { "summary": "Get radar information", "description": "Gets the radar output for the given rover", "operationId": "Rove_Radar", @@ -66,11 +66,12 @@ }, "parameters": [ { - "name": "account", - "description": "The account for this request.", - "in": "query", - "required": false, - "type": "string" + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/roveRadarRequest" + } } ], "tags": [ @@ -113,7 +114,7 @@ } }, "/rover": { - "get": { + "post": { "summary": "Get rover information", "description": "Gets information for the account's rover", "operationId": "Rove_Rover", @@ -133,11 +134,12 @@ }, "parameters": [ { - "name": "account", - "description": "The account for this request.", - "in": "query", - "required": false, - "type": "string" + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/roveRoverRequest" + } } ], "tags": [ @@ -242,6 +244,15 @@ "type": "object", "title": "Empty placeholder" }, + "roveRadarRequest": { + "type": "object", + "properties": { + "account": { + "type": "string", + "title": "The account for this request" + } + } + }, "roveRadarResponse": { "type": "object", "properties": { @@ -270,6 +281,15 @@ "type": "object", "title": "Empty placeholder" }, + "roveRoverRequest": { + "type": "object", + "properties": { + "account": { + "type": "string", + "title": "The account for this request" + } + } + }, "roveRoverResponse": { "type": "object", "properties": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index d40bed0..d492671 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -41,7 +41,8 @@ service Rove { // Gets the radar output for the given rover rpc Radar(RadarRequest) returns (RadarResponse) { option (google.api.http) = { - get: "/radar" + post: "/radar" + body: "*" }; } @@ -50,7 +51,8 @@ service Rove { // Gets information for the account's rover rpc Rover(RoverRequest) returns (RoverResponse) { option (google.api.http) = { - get: "/rover" + post: "/rover" + body: "*" }; } } From bea08d54f167183cbed5e6ccd61d72cbbc402bb5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 13 Jun 2020 13:38:12 +0100 Subject: [PATCH 219/495] Add description to rove documentation --- pkg/rove/rove.pb.go | 4 ++++ pkg/rove/rove.swagger.json | 3 ++- proto/rove/rove.proto | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 67c5b11..46cd3c8 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -4,6 +4,10 @@ // protoc v3.6.1 // source: rove/rove.proto +// Rove +// +// Rove is an asychronous nomadic game about exploring a planet as part of a loose community + package rove import ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 6969424..dcf48ee 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -1,7 +1,8 @@ { "swagger": "2.0", "info": { - "title": "rove/rove.proto", + "title": "Rove", + "description": "Rove is an asychronous nomadic game about exploring a planet as part of a loose community", "version": "version not set" }, "consumes": [ diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index d492671..12d50eb 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -1,5 +1,8 @@ syntax = "proto3"; +// Rove +// +// Rove is an asychronous nomadic game about exploring a planet as part of a loose community package rove; option go_package = "github.com/mdiluz/rove/pkg/rove"; From b33e3665003430991131e609ba5265c67af37715 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 11:12:43 +0100 Subject: [PATCH 220/495] Fix up param names for conventions --- cmd/rove/main.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2df10d2..c0472de 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -17,7 +17,7 @@ import ( ) // Command usage -func Usage() { +func printUsage() { fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [OPTIONS]...\n", os.Args[0]) fmt.Fprintln(os.Stderr, "\nCommands:") fmt.Fprintln(os.Stderr, "\tstatus \tprints the server status") @@ -31,14 +31,14 @@ func Usage() { } var home = os.Getenv("HOME") -var filepath = path.Join(home, ".local/share/rove.json") +var defaultData = path.Join(home, ".local/share/rove.json") const gRPCport = 9090 // General usage var ver = flag.Bool("version", false, "Display version number") var host = flag.String("host", "", "path to game host server") -var data = flag.String("data", filepath, "data file for storage") +var data = flag.String("data", defaultData, "data file for storage") // For register command var name = flag.String("name", "", "used with status command for the account name") @@ -53,8 +53,8 @@ type Config struct { Accounts map[string]string `json:"accounts,omitempty"` } -// verifyId will verify an account ID -func verifyId(id string) error { +// verifyID will verify an account ID +func verifyID(id string) error { if len(id) == 0 { return fmt.Errorf("no account ID set, must register first") } @@ -148,7 +148,7 @@ func InnerMain(command string) error { }, } - if err := verifyId(account); err != nil { + if err := verifyID(account); err != nil { return err } @@ -163,7 +163,7 @@ func InnerMain(command string) error { case "radar": dat := rove.RadarRequest{Account: account} - if err := verifyId(account); err != nil { + if err := verifyID(account); err != nil { return err } @@ -179,7 +179,7 @@ func InnerMain(command string) error { case "rover": req := rove.RoverRequest{Account: account} - if err := verifyId(account); err != nil { + if err := verifyID(account); err != nil { return err } response, err := client.Rover(ctx, &req) @@ -197,7 +197,7 @@ func InnerMain(command string) error { default: // Print the usage fmt.Fprintf(os.Stderr, "Error: unknown command %s\n", command) - Usage() + printUsage() os.Exit(1) } @@ -213,11 +213,11 @@ func InnerMain(command string) error { // Simple main func main() { - flag.Usage = Usage + flag.Usage = printUsage // Bail without any args if len(os.Args) == 1 { - Usage() + printUsage() os.Exit(1) } From 3f1b8a4c2aa07ff1d7cd8f50c052965c2f30a9c4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 11:14:08 +0100 Subject: [PATCH 221/495] Create the filepath for the config file --- cmd/rove/main.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index c0472de..e9453fc 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "os" "path" + "path/filepath" "time" "github.com/mdiluz/rove/pkg/game" @@ -68,17 +69,26 @@ func InnerMain(command string) error { var config = Config{ Accounts: make(map[string]string), } - _, err := os.Stat(*data) - if !os.IsNotExist(err) { - if b, err := ioutil.ReadFile(*data); err != nil { - return fmt.Errorf("failed to read file %s error: %s", *data, err) - } else if len(b) == 0 { - return fmt.Errorf("file %s was empty, assumin fresh data", *data) + // Create the path if needed + path := filepath.Dir(*data) + _, err := os.Stat(path) + if os.IsNotExist(err) { + os.MkdirAll(path, os.ModePerm) + } else { + // Read the file + _, err = os.Stat(*data) + if !os.IsNotExist(err) { + if b, err := ioutil.ReadFile(*data); err != nil { + return fmt.Errorf("failed to read file %s error: %s", *data, err) - } else if err := json.Unmarshal(b, &config); err != nil { - return fmt.Errorf("failed to unmarshal file %s error: %s", *data, err) + } else if len(b) == 0 { + return fmt.Errorf("file %s was empty, assumin fresh data", *data) + } else if err := json.Unmarshal(b, &config); err != nil { + return fmt.Errorf("failed to unmarshal file %s error: %s", *data, err) + + } } } From 06e5c0bf2f4410cc31e5a0d0ef5540eb9b9b95a5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 11:15:23 +0100 Subject: [PATCH 222/495] Add starter snapcraft configuration Contains a few leftover TODOs, the build version one is the most problematic due to the go plugin having no current support for adding ldflags --- snap/snapcraft.yaml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 snap/snapcraft.yaml diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..1f6fa18 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,25 @@ +name: rove # Nn-registered, use `snap register` +base: core20 +version: '0.1' # TODO: Set this up programatically +summary: An asynchronous nomadic game about exploring as part of a loose community. +# TODO: Add more to the description +description: | + An asynchronous nomadic game about exploring as part of a loose community. +grade: devel # Upgrade to 'stable' when ready +confinement: strict + +apps: + rove: + command: bin/rove + plugs: + - network # Needed for access to hosted servers + +parts: + go-rove: + plugin: go + source-type: local + source: . + build-packages: + - gcc-multilib + # TODO: Add version somehow + # TODO: Only build cmd/rove with 'go-buildtags' From edce245c6fc393fac1c9187dd10c3c11a70b8fc0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 15:59:07 +0100 Subject: [PATCH 223/495] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..19e70bd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Marc Di Luzio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From d4b686f51031bc776c58c9a8cad1c872b0ef69e0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 16:16:16 +0100 Subject: [PATCH 224/495] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e452179..df960f9 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,5 @@ Build Status ------------ ![Build and Test](https://github.com/mdiluz/rove/workflows/Build%20and%20Test/badge.svg) +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/rove) + From cc29f13ce5e049463a0916b8a2097e6835d54098 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 18:14:06 +0100 Subject: [PATCH 225/495] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index df960f9..fa4b149 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,5 @@ See [api.go](https://github.com/mdiluz/rove/blob/master/pkg/rove/api.go) for the Build Status ------------ -![Build and Test](https://github.com/mdiluz/rove/workflows/Build%20and%20Test/badge.svg) - -[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/rove) +![Build and Test](https://github.com/mdiluz/rove/workflows/Build%20and%20Test/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) From 9fb0a794801cf41e0ebfeb52c69844658ee6c0bc Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 22 Jun 2020 22:36:39 +0100 Subject: [PATCH 226/495] Remove comment about unregistered name --- snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 1f6fa18..719afa0 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,4 +1,4 @@ -name: rove # Nn-registered, use `snap register` +name: rove base: core20 version: '0.1' # TODO: Set this up programatically summary: An asynchronous nomadic game about exploring as part of a loose community. From dd76e61e4462eace53af3f7b3408626601b77690 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 00:05:26 +0100 Subject: [PATCH 227/495] Make the ports have default values --- cmd/rove-accountant/main.go | 15 +++++++++------ cmd/rove-reverse-proxy/main.go | 15 +++++++++------ cmd/rove-server/internal/server.go | 2 +- cmd/rove-server/main.go | 15 +++++++++------ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index ff5036d..31f2914 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -82,14 +82,17 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a // main func main() { - // Verify the input + // Get the port + var iport int var port = os.Getenv("PORT") if len(port) == 0 { - log.Fatal("Must set $PORT") - } - iport, err := strconv.Atoi(port) - if err != nil { - log.Fatal("$PORT not valid int") + iport = 9091 + } else { + var err error + iport, err = strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") + } } persistence.SetPath(data) diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-reverse-proxy/main.go index eaedc69..06653b6 100644 --- a/cmd/rove-reverse-proxy/main.go +++ b/cmd/rove-reverse-proxy/main.go @@ -21,16 +21,19 @@ func main() { var endpoint = os.Getenv("ROVE_GRPC") if len(endpoint) == 0 { - log.Fatal("Must set $ROVE_GRPC") + endpoint = "localhost:9090" } + var iport int var port = os.Getenv("PORT") if len(port) == 0 { - log.Fatal("Must set $PORT") - } - iport, err := strconv.Atoi(port) - if err != nil { - log.Fatal("$PORT not valid int") + iport = 8080 + } else { + var err error + iport, err = strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") + } } // Create a new mux and register it with the gRPC endpoint diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index dc3500e..449d9e2 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -106,7 +106,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { // Connect to the accountant accountantAddress := os.Getenv("ROVE_ACCOUNTANT_GRPC") if len(accountantAddress) == 0 { - log.Fatal("must set $ROVE_ACCOUNTANT_GRPC") + accountantAddress = "localhost:9091" } log.Printf("Dialing accountant on %s\n", accountantAddress) s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 83ec280..d2848b2 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -31,14 +31,17 @@ func InnerMain() { return } - // Address to host the server on, automatically selected if empty + // Address to host the server on + var iport int var port = os.Getenv("PORT") if len(port) == 0 { - log.Fatal("Must set $PORT") - } - iport, err := strconv.Atoi(port) - if err != nil { - log.Fatal("$PORT not valid int") + iport = 9090 + } else { + var err error + iport, err = strconv.Atoi(port) + if err != nil { + log.Fatal("$PORT not valid int") + } } log.Printf("Initialising version %s...\n", version.Version) From 19b3685e8cbfe9e34fdeaea2521873162489c87a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 00:05:45 +0100 Subject: [PATCH 228/495] Add the server, accountant, and rest proxy to the snap --- snap/snapcraft.yaml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 719afa0..3162bf6 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -12,7 +12,22 @@ apps: rove: command: bin/rove plugs: - - network # Needed for access to hosted servers + - network + rove-server: + command: bin/rove-server + plugs: + - network + - network-bind + rove-accountant: + command: bin/rove-accountant + plugs: + - network + - network-bind + rove-rest-server: + command: bin/rove-reverse-proxy + plugs: + - network + - network-bind parts: go-rove: @@ -22,4 +37,4 @@ parts: build-packages: - gcc-multilib # TODO: Add version somehow - # TODO: Only build cmd/rove with 'go-buildtags' + # TODO: Server needs /usr/share/dict/words From c268555e2eaf3faffc3afdb17dbb73079076e0a4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:03:36 +0100 Subject: [PATCH 229/495] Change "-version" to a command --- cmd/rove/main.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index e9453fc..8c759d1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -27,6 +27,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tradar \tgathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\trover \tgets data for current rover") fmt.Fprintln(os.Stderr, "\tconfig \toutputs the local config info") + fmt.Fprintln(os.Stderr, "\tversion \toutputs version info") fmt.Fprintln(os.Stderr, "\nOptions:") flag.PrintDefaults() } @@ -37,7 +38,6 @@ var defaultData = path.Join(home, ".local/share/rove.json") const gRPCport = 9090 // General usage -var ver = flag.Bool("version", false, "Display version number") var host = flag.String("host", "", "path to game host server") var data = flag.String("data", defaultData, "data file for storage") @@ -116,6 +116,9 @@ func InnerMain(command string) error { // Handle all the commands switch command { + case "version": + fmt.Println(version.Version) + case "status": response, err := client.Status(ctx, &rove.StatusRequest{}) switch { @@ -233,12 +236,6 @@ func main() { flag.CommandLine.Parse(os.Args[2:]) - // Print the version if requested - if *ver { - fmt.Println(version.Version) - return - } - // Run the inner main if err := InnerMain(os.Args[1]); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) From ef718199f0558cb276f79e268a254fa16dde2e18 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:04:47 +0100 Subject: [PATCH 230/495] Add the license and architectures to the snapcraft file --- snap/snapcraft.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 3162bf6..f484957 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,6 +1,10 @@ name: rove +title: Rove base: core20 -version: '0.1' # TODO: Set this up programatically +license: "MIT" +architectures: [ "amd64" ] +version: git +# TODO icon: summary: An asynchronous nomadic game about exploring as part of a loose community. # TODO: Add more to the description description: | @@ -36,5 +40,5 @@ parts: source: . build-packages: - gcc-multilib - # TODO: Add version somehow + # TODO: Add the version into the build itself (currently using ldflags) # TODO: Server needs /usr/share/dict/words From 4232c547cead66aed9d4171b8aa24e4ea86b80ad Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:09:11 +0100 Subject: [PATCH 231/495] Fix quotes in yaml --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index f484957..4b669b0 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,8 +1,8 @@ name: rove title: Rove base: core20 -license: "MIT" -architectures: [ "amd64" ] +license: MIT +architectures: [ amd64 ] version: git # TODO icon: summary: An asynchronous nomadic game about exploring as part of a loose community. From ddc2631bb0913d2e448404c3b2d5b4a51243cf24 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:21:22 +0100 Subject: [PATCH 232/495] Customise the snap version define directly --- snap/snapcraft.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 4b669b0..bac425d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -3,7 +3,6 @@ title: Rove base: core20 license: MIT architectures: [ amd64 ] -version: git # TODO icon: summary: An asynchronous nomadic game about exploring as part of a loose community. # TODO: Add more to the description @@ -11,6 +10,7 @@ description: | An asynchronous nomadic game about exploring as part of a loose community. grade: devel # Upgrade to 'stable' when ready confinement: strict +adopt-info: go-rove apps: rove: @@ -40,5 +40,8 @@ parts: source: . build-packages: - gcc-multilib + override-pull: | + snapcraftctl pull + snapcraftctl set-version $(git describe --always --long --dirty --tags) # TODO: Add the version into the build itself (currently using ldflags) # TODO: Server needs /usr/share/dict/words From 073f8846aab8289b1e4d8ecd268d5492d1c10799 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:25:58 +0100 Subject: [PATCH 233/495] Set the built snap to stable when it's tagged or devel when not --- snap/snapcraft.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index bac425d..29a7b7e 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -8,7 +8,6 @@ summary: An asynchronous nomadic game about exploring as part of a loose communi # TODO: Add more to the description description: | An asynchronous nomadic game about exploring as part of a loose community. -grade: devel # Upgrade to 'stable' when ready confinement: strict adopt-info: go-rove @@ -43,5 +42,7 @@ parts: override-pull: | snapcraftctl pull snapcraftctl set-version $(git describe --always --long --dirty --tags) + git describe --exact-match HEAD 2> /dev/null && snapcraftctl set-grade "stable" || snapcraftctl set-grade "devel" + # TODO: Add the version into the build itself (currently using ldflags) # TODO: Server needs /usr/share/dict/words From 996970fd81f7b261c563f51c02005b57c77d0524 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:47:46 +0100 Subject: [PATCH 234/495] Move version and config out to early bails --- cmd/rove/main.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8c759d1..37fef86 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -92,6 +92,16 @@ func InnerMain(command string) error { } } + // Early bails + switch command { + case "version": + fmt.Println(version.Version) + return nil + case "config": + fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Accounts[config.Host]) + return nil + } + // If there's a host set on the command line, override the one in the config if len(*host) != 0 { config.Host = *host @@ -111,14 +121,8 @@ func InnerMain(command string) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - // Grab the account - var account = config.Accounts[config.Host] - // Handle all the commands switch command { - case "version": - fmt.Println(version.Version) - case "status": response, err := client.Status(ctx, &rove.StatusRequest{}) switch { @@ -151,7 +155,7 @@ func InnerMain(command string) error { case "move": d := rove.CommandsRequest{ - Account: account, + Account: config.Accounts[config.Host], Commands: []*rove.Command{ { Command: game.CommandMove, @@ -161,7 +165,7 @@ func InnerMain(command string) error { }, } - if err := verifyID(account); err != nil { + if err := verifyID(d.Account); err != nil { return err } @@ -175,8 +179,8 @@ func InnerMain(command string) error { } case "radar": - dat := rove.RadarRequest{Account: account} - if err := verifyID(account); err != nil { + dat := rove.RadarRequest{Account: config.Accounts[config.Host]} + if err := verifyID(dat.Account); err != nil { return err } @@ -191,8 +195,8 @@ func InnerMain(command string) error { } case "rover": - req := rove.RoverRequest{Account: account} - if err := verifyID(account); err != nil { + req := rove.RoverRequest{Account: config.Accounts[config.Host]} + if err := verifyID(req.Account); err != nil { return err } response, err := client.Rover(ctx, &req) @@ -204,8 +208,6 @@ func InnerMain(command string) error { default: fmt.Printf("attributes: %+v\n", response) } - case "config": - fmt.Printf("host: %s\taccount: %s\n", config.Host, account) default: // Print the usage From 98349b89356306cbb1cc987024e4618d35b5c331 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 18:47:59 +0100 Subject: [PATCH 235/495] Ensure we label with proper tags and version the build --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 29a7b7e..55815cb 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -42,7 +42,7 @@ parts: override-pull: | snapcraftctl pull snapcraftctl set-version $(git describe --always --long --dirty --tags) - git describe --exact-match HEAD 2> /dev/null && snapcraftctl set-grade "stable" || snapcraftctl set-grade "devel" + git describe --exact-match --tags HEAD 2> /dev/null && snapcraftctl set-grade "stable" || snapcraftctl set-grade "devel" + sed -i "s/undefined/$(git describe --always --long --dirty --tags)/" pkg/version/version.go - # TODO: Add the version into the build itself (currently using ldflags) # TODO: Server needs /usr/share/dict/words From 5f732bd6c52b196baef1111b6edc90f196da24be Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 23 Jun 2020 19:45:10 +0100 Subject: [PATCH 236/495] Add public domain words file from https://github.com/dwyl/english-words at 728408da58fc6010ad2e5503442927d87e21065c --- data/words_alpha.txt | 370104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 370104 insertions(+) create mode 100644 data/words_alpha.txt diff --git a/data/words_alpha.txt b/data/words_alpha.txt new file mode 100644 index 0000000..5852475 --- /dev/null +++ b/data/words_alpha.txt @@ -0,0 +1,370104 @@ +a +aa +aaa +aah +aahed +aahing +aahs +aal +aalii +aaliis +aals +aam +aani +aardvark +aardvarks +aardwolf +aardwolves +aargh +aaron +aaronic +aaronical +aaronite +aaronitic +aarrgh +aarrghh +aaru +aas +aasvogel +aasvogels +ab +aba +ababdeh +ababua +abac +abaca +abacay +abacas +abacate +abacaxi +abaci +abacinate +abacination +abacisci +abaciscus +abacist +aback +abacli +abacot +abacterial +abactinal +abactinally +abaction +abactor +abaculi +abaculus +abacus +abacuses +abada +abaddon +abadejo +abadengo +abadia +abadite +abaff +abaft +abay +abayah +abaisance +abaised +abaiser +abaisse +abaissed +abaka +abakas +abalation +abalienate +abalienated +abalienating +abalienation +abalone +abalones +abama +abamp +abampere +abamperes +abamps +aband +abandon +abandonable +abandoned +abandonedly +abandonee +abandoner +abandoners +abandoning +abandonment +abandonments +abandons +abandum +abanet +abanga +abanic +abannition +abantes +abapical +abaptiston +abaptistum +abarambo +abaris +abarthrosis +abarticular +abarticulation +abas +abase +abased +abasedly +abasedness +abasement +abasements +abaser +abasers +abases +abasgi +abash +abashed +abashedly +abashedness +abashes +abashing +abashless +abashlessly +abashment +abashments +abasia +abasias +abasic +abasing +abasio +abask +abassi +abassin +abastard +abastardize +abastral +abatable +abatage +abate +abated +abatement +abatements +abater +abaters +abates +abatic +abating +abatis +abatised +abatises +abatjour +abatjours +abaton +abator +abators +abattage +abattis +abattised +abattises +abattoir +abattoirs +abattu +abattue +abatua +abature +abaue +abave +abaxial +abaxile +abaze +abb +abba +abbacy +abbacies +abbacomes +abbadide +abbaye +abbandono +abbas +abbasi +abbasid +abbassi +abbasside +abbate +abbatial +abbatical +abbatie +abbe +abbey +abbeys +abbeystead +abbeystede +abbes +abbess +abbesses +abbest +abbevillian +abby +abbie +abboccato +abbogada +abbot +abbotcy +abbotcies +abbotnullius +abbotric +abbots +abbotship +abbotships +abbott +abbozzo +abbr +abbrev +abbreviatable +abbreviate +abbreviated +abbreviately +abbreviates +abbreviating +abbreviation +abbreviations +abbreviator +abbreviatory +abbreviators +abbreviature +abbroachment +abc +abcess +abcissa +abcoulomb +abd +abdal +abdali +abdaria +abdat +abderian +abderite +abdest +abdicable +abdicant +abdicate +abdicated +abdicates +abdicating +abdication +abdications +abdicative +abdicator +abdiel +abditive +abditory +abdom +abdomen +abdomens +abdomina +abdominal +abdominales +abdominalia +abdominalian +abdominally +abdominals +abdominoanterior +abdominocardiac +abdominocentesis +abdominocystic +abdominogenital +abdominohysterectomy +abdominohysterotomy +abdominoposterior +abdominoscope +abdominoscopy +abdominothoracic +abdominous +abdominovaginal +abdominovesical +abduce +abduced +abducens +abducent +abducentes +abduces +abducing +abduct +abducted +abducting +abduction +abductions +abductor +abductores +abductors +abducts +abe +abeam +abear +abearance +abecedaire +abecedary +abecedaria +abecedarian +abecedarians +abecedaries +abecedarium +abecedarius +abed +abede +abedge +abegge +abey +abeyance +abeyances +abeyancy +abeyancies +abeyant +abeigh +abel +abele +abeles +abelia +abelian +abelicea +abelite +abelmoschus +abelmosk +abelmosks +abelmusk +abelonian +abeltree +abencerrages +abend +abends +abenteric +abepithymia +aberdavine +aberdeen +aberdevine +aberdonian +aberduvine +aberia +abernethy +aberr +aberrance +aberrancy +aberrancies +aberrant +aberrantly +aberrants +aberrate +aberrated +aberrating +aberration +aberrational +aberrations +aberrative +aberrator +aberrometer +aberroscope +aberuncate +aberuncator +abesse +abessive +abet +abetment +abetments +abets +abettal +abettals +abetted +abetter +abetters +abetting +abettor +abettors +abevacuation +abfarad +abfarads +abhenry +abhenries +abhenrys +abhinaya +abhiseka +abhominable +abhor +abhorred +abhorrence +abhorrences +abhorrency +abhorrent +abhorrently +abhorrer +abhorrers +abhorrible +abhorring +abhors +abhorson +aby +abib +abichite +abidal +abidance +abidances +abidden +abide +abided +abider +abiders +abides +abidi +abiding +abidingly +abidingness +abie +abye +abiegh +abience +abient +abies +abyes +abietate +abietene +abietic +abietin +abietineae +abietineous +abietinic +abietite +abiezer +abigail +abigails +abigailship +abigeat +abigei +abigeus +abying +abilao +abilene +abiliment +abilitable +ability +abilities +abilla +abilo +abime +abintestate +abiogeneses +abiogenesis +abiogenesist +abiogenetic +abiogenetical +abiogenetically +abiogeny +abiogenist +abiogenous +abiology +abiological +abiologically +abioses +abiosis +abiotic +abiotical +abiotically +abiotrophy +abiotrophic +abipon +abir +abirritant +abirritate +abirritated +abirritating +abirritation +abirritative +abys +abysm +abysmal +abysmally +abysms +abyss +abyssa +abyssal +abysses +abyssinia +abyssinian +abyssinians +abyssobenthonic +abyssolith +abyssopelagic +abyssus +abiston +abit +abitibi +abiuret +abject +abjectedness +abjection +abjections +abjective +abjectly +abjectness +abjoint +abjudge +abjudged +abjudging +abjudicate +abjudicated +abjudicating +abjudication +abjudicator +abjugate +abjunct +abjunction +abjunctive +abjuration +abjurations +abjuratory +abjure +abjured +abjurement +abjurer +abjurers +abjures +abjuring +abkar +abkari +abkary +abkhas +abkhasian +abl +ablach +ablactate +ablactated +ablactating +ablactation +ablaqueate +ablare +ablastemic +ablastin +ablastous +ablate +ablated +ablates +ablating +ablation +ablations +ablatitious +ablatival +ablative +ablatively +ablatives +ablator +ablaut +ablauts +ablaze +able +ableeze +ablegate +ablegates +ablegation +ablend +ableness +ablepharia +ablepharon +ablepharous +ablepharus +ablepsy +ablepsia +ableptical +ableptically +abler +ables +ablesse +ablest +ablet +ablewhackets +ably +ablings +ablins +ablock +abloom +ablow +ablude +abluent +abluents +ablush +ablute +abluted +ablution +ablutionary +ablutions +abluvion +abmho +abmhos +abmodality +abmodalities +abn +abnaki +abnegate +abnegated +abnegates +abnegating +abnegation +abnegations +abnegative +abnegator +abnegators +abner +abnerval +abnet +abneural +abnormal +abnormalcy +abnormalcies +abnormalise +abnormalised +abnormalising +abnormalism +abnormalist +abnormality +abnormalities +abnormalize +abnormalized +abnormalizing +abnormally +abnormalness +abnormals +abnormity +abnormities +abnormous +abnumerable +abo +aboard +aboardage +abobra +abococket +abodah +abode +aboded +abodement +abodes +abody +aboding +abogado +abogados +abohm +abohms +aboideau +aboideaus +aboideaux +aboil +aboiteau +aboiteaus +aboiteaux +abolete +abolish +abolishable +abolished +abolisher +abolishers +abolishes +abolishing +abolishment +abolishments +abolition +abolitionary +abolitionise +abolitionised +abolitionising +abolitionism +abolitionist +abolitionists +abolitionize +abolitionized +abolitionizing +abolla +abollae +aboma +abomas +abomasa +abomasal +abomasi +abomasum +abomasus +abomasusi +abominability +abominable +abominableness +abominably +abominate +abominated +abominates +abominating +abomination +abominations +abominator +abominators +abomine +abondance +abongo +abonne +abonnement +aboon +aborad +aboral +aborally +abord +aboriginal +aboriginality +aboriginally +aboriginals +aboriginary +aborigine +aborigines +aborning +aborsement +aborsive +abort +aborted +aborter +aborters +aborticide +abortient +abortifacient +abortin +aborting +abortion +abortional +abortionist +abortionists +abortions +abortive +abortively +abortiveness +abortogenic +aborts +abortus +abortuses +abos +abote +abouchement +aboudikro +abought +aboulia +aboulias +aboulic +abound +abounded +abounder +abounding +aboundingly +abounds +about +abouts +above +aboveboard +abovedeck +aboveground +abovementioned +aboveproof +aboves +abovesaid +abovestairs +abow +abox +abp +abr +abracadabra +abrachia +abrachias +abradable +abradant +abradants +abrade +abraded +abrader +abraders +abrades +abrading +abraham +abrahamic +abrahamidae +abrahamite +abrahamitic +abray +abraid +abram +abramis +abranchial +abranchialism +abranchian +abranchiata +abranchiate +abranchious +abrasax +abrase +abrased +abraser +abrash +abrasing +abrasiometer +abrasion +abrasions +abrasive +abrasively +abrasiveness +abrasives +abrastol +abraum +abraxas +abrazite +abrazitic +abrazo +abrazos +abreact +abreacted +abreacting +abreaction +abreactions +abreacts +abreast +abreed +abrege +abreid +abrenounce +abrenunciate +abrenunciation +abreption +abret +abreuvoir +abri +abrico +abricock +abricot +abridgable +abridge +abridgeable +abridged +abridgedly +abridgement +abridgements +abridger +abridgers +abridges +abridging +abridgment +abridgments +abrim +abrin +abrine +abris +abristle +abroach +abroad +abrocoma +abrocome +abrogable +abrogate +abrogated +abrogates +abrogating +abrogation +abrogations +abrogative +abrogator +abrogators +abroma +abronia +abrood +abrook +abrosia +abrosias +abrotanum +abrotin +abrotine +abrupt +abruptedly +abrupter +abruptest +abruptio +abruption +abruptiones +abruptly +abruptness +abrus +abs +absalom +absampere +absaroka +absarokite +abscam +abscess +abscessed +abscesses +abscessing +abscession +abscessroot +abscind +abscise +abscised +abscises +abscising +abscisins +abscision +absciss +abscissa +abscissae +abscissas +abscisse +abscissin +abscission +abscissions +absconce +abscond +absconded +abscondedly +abscondence +absconder +absconders +absconding +absconds +absconsa +abscoulomb +abscound +absee +absey +abseil +abseiled +abseiling +abseils +absence +absences +absent +absentation +absented +absentee +absenteeism +absentees +absenteeship +absenter +absenters +absentia +absenting +absently +absentment +absentminded +absentmindedly +absentmindedness +absentness +absents +absfarad +abshenry +absi +absinth +absinthe +absinthes +absinthial +absinthian +absinthiate +absinthiated +absinthiating +absinthic +absinthiin +absinthin +absinthine +absinthism +absinthismic +absinthium +absinthol +absinthole +absinths +absyrtus +absis +absist +absistos +absit +absmho +absohm +absoil +absolent +absolute +absolutely +absoluteness +absoluter +absolutes +absolutest +absolution +absolutions +absolutism +absolutist +absolutista +absolutistic +absolutistically +absolutists +absolutive +absolutization +absolutize +absolutory +absolvable +absolvatory +absolve +absolved +absolvent +absolver +absolvers +absolves +absolving +absolvitor +absolvitory +absonant +absonous +absorb +absorbability +absorbable +absorbance +absorbancy +absorbant +absorbed +absorbedly +absorbedness +absorbefacient +absorbency +absorbencies +absorbent +absorbents +absorber +absorbers +absorbing +absorbingly +absorbition +absorbs +absorbtion +absorpt +absorptance +absorptiometer +absorptiometric +absorption +absorptional +absorptions +absorptive +absorptively +absorptiveness +absorptivity +absquatulate +absquatulation +abstain +abstained +abstainer +abstainers +abstaining +abstainment +abstains +abstemious +abstemiously +abstemiousness +abstention +abstentionism +abstentionist +abstentions +abstentious +absterge +absterged +abstergent +absterges +absterging +absterse +abstersion +abstersive +abstersiveness +abstertion +abstinence +abstinency +abstinent +abstinential +abstinently +abstort +abstr +abstract +abstractable +abstracted +abstractedly +abstractedness +abstracter +abstracters +abstractest +abstracting +abstraction +abstractional +abstractionism +abstractionist +abstractionists +abstractions +abstractitious +abstractive +abstractively +abstractiveness +abstractly +abstractness +abstractor +abstractors +abstracts +abstrahent +abstrict +abstricted +abstricting +abstriction +abstricts +abstrude +abstruse +abstrusely +abstruseness +abstrusenesses +abstruser +abstrusest +abstrusion +abstrusity +abstrusities +absume +absumption +absurd +absurder +absurdest +absurdism +absurdist +absurdity +absurdities +absurdly +absurdness +absurds +absurdum +absvolt +abt +abterminal +abthain +abthainry +abthainrie +abthanage +abtruse +abu +abubble +abucco +abuilding +abuleia +abulia +abulias +abulic +abulyeit +abulomania +abumbral +abumbrellar +abuna +abundance +abundances +abundancy +abundant +abundantia +abundantly +abune +abura +aburabozu +aburagiri +aburban +aburst +aburton +abusable +abusage +abuse +abused +abusedly +abusee +abuseful +abusefully +abusefulness +abuser +abusers +abuses +abush +abusing +abusion +abusious +abusive +abusively +abusiveness +abut +abuta +abutilon +abutilons +abutment +abutments +abuts +abuttal +abuttals +abutted +abutter +abutters +abutting +abuzz +abv +abvolt +abvolts +abwab +abwatt +abwatts +ac +acacatechin +acacatechol +acacetin +acacia +acacian +acacias +acaciin +acacin +acacine +acad +academe +academes +academy +academia +academial +academian +academias +academic +academical +academically +academicals +academician +academicians +academicianship +academicism +academics +academie +academies +academise +academised +academising +academism +academist +academite +academization +academize +academized +academizing +academus +acadia +acadialite +acadian +acadie +acaena +acajou +acajous +acalculia +acale +acaleph +acalepha +acalephae +acalephan +acalephe +acalephes +acalephoid +acalephs +acalycal +acalycine +acalycinous +acalyculate +acalypha +acalypterae +acalyptrata +acalyptratae +acalyptrate +acamar +acampsia +acana +acanaceous +acanonical +acanth +acantha +acanthaceae +acanthaceous +acanthad +acantharia +acanthi +acanthia +acanthial +acanthin +acanthine +acanthion +acanthite +acanthocarpous +acanthocephala +acanthocephalan +acanthocephali +acanthocephalous +acanthocereus +acanthocladous +acanthodea +acanthodean +acanthodei +acanthodes +acanthodian +acanthodidae +acanthodii +acanthodini +acanthoid +acantholimon +acantholysis +acanthology +acanthological +acanthoma +acanthomas +acanthomeridae +acanthon +acanthopanax +acanthophis +acanthophorous +acanthopod +acanthopodous +acanthopomatous +acanthopore +acanthopteran +acanthopteri +acanthopterygian +acanthopterygii +acanthopterous +acanthoses +acanthosis +acanthotic +acanthous +acanthuridae +acanthurus +acanthus +acanthuses +acanthuthi +acapnia +acapnial +acapnias +acappella +acapsular +acapu +acapulco +acara +acarapis +acarari +acardia +acardiac +acardite +acari +acarian +acariasis +acariatre +acaricidal +acaricide +acarid +acarida +acaridae +acaridan +acaridans +acaridea +acaridean +acaridomatia +acaridomatium +acarids +acariform +acarina +acarine +acarines +acarinosis +acarocecidia +acarocecidium +acarodermatitis +acaroid +acarol +acarology +acarologist +acarophilous +acarophobia +acarotoxic +acarpellous +acarpelous +acarpous +acarus +acast +acastus +acatalectic +acatalepsy +acatalepsia +acataleptic +acatallactic +acatamathesia +acataphasia +acataposis +acatastasia +acatastatic +acate +acategorical +acater +acatery +acates +acatharsy +acatharsia +acatholic +acaudal +acaudate +acaudelescent +acaulescence +acaulescent +acauline +acaulose +acaulous +acc +acca +accable +accademia +accadian +acce +accede +acceded +accedence +acceder +acceders +accedes +acceding +accel +accelerable +accelerando +accelerant +accelerate +accelerated +acceleratedly +accelerates +accelerating +acceleratingly +acceleration +accelerations +accelerative +accelerator +acceleratorh +acceleratory +accelerators +accelerograph +accelerometer +accelerometers +accend +accendibility +accendible +accensed +accension +accensor +accent +accented +accenting +accentless +accentor +accentors +accents +accentuable +accentual +accentuality +accentually +accentuate +accentuated +accentuates +accentuating +accentuation +accentuator +accentus +accept +acceptability +acceptable +acceptableness +acceptably +acceptance +acceptances +acceptancy +acceptancies +acceptant +acceptation +acceptavit +accepted +acceptedly +acceptee +acceptees +accepter +accepters +acceptilate +acceptilated +acceptilating +acceptilation +accepting +acceptingly +acceptingness +acception +acceptive +acceptor +acceptors +acceptress +accepts +accerse +accersition +accersitor +access +accessability +accessable +accessary +accessaries +accessarily +accessariness +accessaryship +accessed +accesses +accessibility +accessible +accessibleness +accessibly +accessing +accession +accessional +accessioned +accessioner +accessioning +accessions +accessit +accessive +accessively +accessless +accessor +accessory +accessorial +accessories +accessorii +accessorily +accessoriness +accessorius +accessoriusorii +accessorize +accessorized +accessorizing +accessors +acciaccatura +acciaccaturas +acciaccature +accidence +accidency +accidencies +accident +accidental +accidentalism +accidentalist +accidentality +accidentally +accidentalness +accidentals +accidentary +accidentarily +accidented +accidential +accidentiality +accidently +accidents +accidia +accidie +accidies +accinge +accinged +accinging +accipenser +accipient +accipiter +accipitral +accipitrary +accipitres +accipitrine +accipter +accise +accismus +accite +acclaim +acclaimable +acclaimed +acclaimer +acclaimers +acclaiming +acclaims +acclamation +acclamations +acclamator +acclamatory +acclimatable +acclimatation +acclimate +acclimated +acclimatement +acclimates +acclimating +acclimation +acclimatisable +acclimatisation +acclimatise +acclimatised +acclimatiser +acclimatising +acclimatizable +acclimatization +acclimatize +acclimatized +acclimatizer +acclimatizes +acclimatizing +acclimature +acclinal +acclinate +acclivity +acclivities +acclivitous +acclivous +accloy +accoast +accoy +accoyed +accoying +accoil +accolade +accoladed +accolades +accolated +accolent +accoll +accolle +accolled +accollee +accombination +accommodable +accommodableness +accommodate +accommodated +accommodately +accommodateness +accommodates +accommodating +accommodatingly +accommodatingness +accommodation +accommodational +accommodationist +accommodations +accommodative +accommodatively +accommodativeness +accommodator +accommodators +accomodate +accompanable +accompany +accompanied +accompanier +accompanies +accompanying +accompanyist +accompaniment +accompanimental +accompaniments +accompanist +accompanists +accomplement +accompletive +accompli +accomplice +accomplices +accompliceship +accomplicity +accomplis +accomplish +accomplishable +accomplished +accomplisher +accomplishers +accomplishes +accomplishing +accomplishment +accomplishments +accomplisht +accompt +accord +accordable +accordance +accordances +accordancy +accordant +accordantly +accordatura +accordaturas +accordature +accorded +accorder +accorders +according +accordingly +accordion +accordionist +accordionists +accordions +accords +accorporate +accorporation +accost +accostable +accosted +accosting +accosts +accouche +accouchement +accouchements +accoucheur +accoucheurs +accoucheuse +accoucheuses +accounsel +account +accountability +accountable +accountableness +accountably +accountancy +accountant +accountants +accountantship +accounted +accounter +accounters +accounting +accountment +accountrement +accounts +accouple +accouplement +accourage +accourt +accouter +accoutered +accoutering +accouterment +accouterments +accouters +accoutre +accoutred +accoutrement +accoutrements +accoutres +accoutring +accra +accrease +accredit +accreditable +accreditate +accreditation +accreditations +accredited +accreditee +accrediting +accreditment +accredits +accrementitial +accrementition +accresce +accrescence +accrescendi +accrescendo +accrescent +accretal +accrete +accreted +accretes +accreting +accretion +accretionary +accretions +accretive +accriminate +accroach +accroached +accroaching +accroachment +accroides +accruable +accrual +accruals +accrue +accrued +accruement +accruer +accrues +accruing +acct +accts +accubation +accubita +accubitum +accubitus +accueil +accultural +acculturate +acculturated +acculturates +acculturating +acculturation +acculturational +acculturationist +acculturative +acculturize +acculturized +acculturizing +accum +accumb +accumbency +accumbent +accumber +accumulable +accumulate +accumulated +accumulates +accumulating +accumulation +accumulations +accumulativ +accumulative +accumulatively +accumulativeness +accumulator +accumulators +accupy +accur +accuracy +accuracies +accurate +accurately +accurateness +accurre +accurse +accursed +accursedly +accursedness +accursing +accurst +accurtation +accus +accusable +accusably +accusal +accusals +accusant +accusants +accusation +accusations +accusatival +accusative +accusatively +accusativeness +accusatives +accusator +accusatory +accusatorial +accusatorially +accusatrix +accusatrixes +accuse +accused +accuser +accusers +accuses +accusing +accusingly +accusive +accusor +accustom +accustomation +accustomed +accustomedly +accustomedness +accustoming +accustomize +accustomized +accustomizing +accustoms +ace +aceacenaphthene +aceanthrene +aceanthrenequinone +acecaffin +acecaffine +aceconitic +aced +acedy +acedia +acediamin +acediamine +acedias +acediast +aceite +aceituna +aceldama +aceldamas +acellular +acemetae +acemetic +acemila +acenaphthene +acenaphthenyl +acenaphthylene +acenesthesia +acensuada +acensuador +acentric +acentrous +aceology +aceologic +acephal +acephala +acephalan +acephali +acephalia +acephalina +acephaline +acephalism +acephalist +acephalite +acephalocyst +acephalous +acephalus +acepots +acequia +acequiador +acequias +acer +aceraceae +aceraceous +acerae +acerata +acerate +acerated +acerates +acerathere +aceratherium +aceratosis +acerb +acerbas +acerbate +acerbated +acerbates +acerbating +acerber +acerbest +acerbic +acerbically +acerbity +acerbityacerose +acerbities +acerbitude +acerbly +acerbophobia +acerdol +aceric +acerin +acerli +acerola +acerolas +acerose +acerous +acerra +acertannin +acerval +acervate +acervately +acervatim +acervation +acervative +acervose +acervuli +acervuline +acervulus +aces +acescence +acescency +acescent +acescents +aceship +acesodyne +acesodynous +acestes +acestoma +aceta +acetable +acetabula +acetabular +acetabularia +acetabuliferous +acetabuliform +acetabulous +acetabulum +acetabulums +acetacetic +acetal +acetaldehydase +acetaldehyde +acetaldehydrase +acetaldol +acetalization +acetalize +acetals +acetamid +acetamide +acetamidin +acetamidine +acetamido +acetamids +acetaminol +acetaminophen +acetanilid +acetanilide +acetanion +acetaniside +acetanisidide +acetanisidine +acetannin +acetary +acetarious +acetars +acetarsone +acetate +acetated +acetates +acetation +acetazolamide +acetbromamide +acetenyl +acethydrazide +acetiam +acetic +acetify +acetification +acetified +acetifier +acetifies +acetifying +acetyl +acetylacetonates +acetylacetone +acetylamine +acetylaminobenzene +acetylaniline +acetylasalicylic +acetylate +acetylated +acetylating +acetylation +acetylative +acetylator +acetylbenzene +acetylbenzoate +acetylbenzoic +acetylbiuret +acetylcarbazole +acetylcellulose +acetylcholine +acetylcholinesterase +acetylcholinic +acetylcyanide +acetylenation +acetylene +acetylenediurein +acetylenic +acetylenyl +acetylenogen +acetylfluoride +acetylglycin +acetylglycine +acetylhydrazine +acetylic +acetylid +acetylide +acetyliodide +acetylizable +acetylization +acetylize +acetylized +acetylizer +acetylizing +acetylmethylcarbinol +acetylperoxide +acetylphenylhydrazine +acetylphenol +acetylrosaniline +acetyls +acetylsalicylate +acetylsalicylic +acetylsalol +acetyltannin +acetylthymol +acetyltropeine +acetylurea +acetimeter +acetimetry +acetimetric +acetin +acetine +acetins +acetite +acetize +acetla +acetmethylanilide +acetnaphthalide +acetoacetanilide +acetoacetate +acetoacetic +acetoamidophenol +acetoarsenite +acetobacter +acetobenzoic +acetobromanilide +acetochloral +acetocinnamene +acetoin +acetol +acetolysis +acetolytic +acetometer +acetometry +acetometric +acetometrical +acetometrically +acetomorphin +acetomorphine +acetonaemia +acetonaemic +acetonaphthone +acetonate +acetonation +acetone +acetonemia +acetonemic +acetones +acetonic +acetonyl +acetonylacetone +acetonylidene +acetonitrile +acetonization +acetonize +acetonuria +acetonurometer +acetophenetide +acetophenetidin +acetophenetidine +acetophenin +acetophenine +acetophenone +acetopiperone +acetopyrin +acetopyrine +acetosalicylic +acetose +acetosity +acetosoluble +acetostearin +acetothienone +acetotoluid +acetotoluide +acetotoluidine +acetous +acetoveratrone +acetoxyl +acetoxyls +acetoxim +acetoxime +acetoxyphthalide +acetphenetid +acetphenetidin +acetract +acettoluide +acetum +aceturic +ach +achaean +achaemenian +achaemenid +achaemenidae +achaemenidian +achaenocarp +achaenodon +achaeta +achaetous +achafe +achage +achagua +achakzai +achalasia +achamoth +achango +achape +achaque +achar +acharya +achariaceae +achariaceous +acharne +acharnement +achate +achates +achatina +achatinella +achatinidae +achatour +ache +acheat +achech +acheck +ached +acheer +acheilary +acheilia +acheilous +acheiria +acheirous +acheirus +achen +achene +achenes +achenia +achenial +achenium +achenocarp +achenodia +achenodium +acher +achernar +acheron +acheronian +acherontic +acherontical +aches +achesoun +achete +achetidae +acheulean +acheweed +achy +achier +achiest +achievability +achievable +achieve +achieved +achievement +achievements +achiever +achievers +achieves +achieving +achigan +achilary +achylia +achill +achillea +achillean +achilleas +achilleid +achillein +achilleine +achilles +achillize +achillobursitis +achillodynia +achilous +achylous +achime +achimenes +achymia +achymous +achinese +achiness +achinesses +aching +achingly +achiote +achiotes +achira +achyranthes +achirite +achyrodes +achitophel +achkan +achlamydate +achlamydeae +achlamydeous +achlorhydria +achlorhydric +achlorophyllous +achloropsia +achluophobia +achmetha +achoke +acholia +acholias +acholic +acholoe +acholous +acholuria +acholuric +achomawi +achondrite +achondritic +achondroplasia +achondroplastic +achoo +achor +achordal +achordata +achordate +achorion +achras +achree +achroacyte +achroanthes +achrodextrin +achrodextrinase +achroglobin +achroiocythaemia +achroiocythemia +achroite +achroma +achromacyte +achromasia +achromat +achromate +achromatiaceae +achromatic +achromatically +achromaticity +achromatin +achromatinic +achromatisation +achromatise +achromatised +achromatising +achromatism +achromatium +achromatizable +achromatization +achromatize +achromatized +achromatizing +achromatocyte +achromatolysis +achromatope +achromatophil +achromatophile +achromatophilia +achromatophilic +achromatopia +achromatopsy +achromatopsia +achromatosis +achromatous +achromats +achromaturia +achromia +achromic +achromobacter +achromobacterieae +achromoderma +achromophilous +achromotrichia +achromous +achronical +achronychous +achronism +achroodextrin +achroodextrinase +achroous +achropsia +achtehalber +achtel +achtelthaler +achter +achterveld +achuas +achuete +acy +acyanoblepsia +acyanopsia +acichlorid +acichloride +acyclic +acyclically +acicula +aciculae +acicular +acicularity +acicularly +aciculas +aciculate +aciculated +aciculum +aciculums +acid +acidaemia +acidanthera +acidaspis +acidemia +acidemias +acider +acidhead +acidheads +acidy +acidic +acidiferous +acidify +acidifiable +acidifiant +acidific +acidification +acidified +acidifier +acidifiers +acidifies +acidifying +acidyl +acidimeter +acidimetry +acidimetric +acidimetrical +acidimetrically +acidite +acidity +acidities +acidize +acidized +acidizing +acidly +acidness +acidnesses +acidogenic +acidoid +acidolysis +acidology +acidometer +acidometry +acidophil +acidophile +acidophilic +acidophilous +acidophilus +acidoproteolytic +acidoses +acidosis +acidosteophyte +acidotic +acidproof +acids +acidulant +acidulate +acidulated +acidulates +acidulating +acidulation +acidulent +acidulous +acidulously +acidulousness +aciduria +acidurias +aciduric +acier +acierage +acieral +acierate +acierated +acierates +acierating +acieration +acies +acyesis +acyetic +aciform +acyl +acylal +acylamido +acylamidobenzene +acylamino +acylase +acylate +acylated +acylates +acylating +acylation +aciliate +aciliated +acilius +acylogen +acyloin +acyloins +acyloxy +acyloxymethane +acyls +acinaceous +acinaces +acinacifoliate +acinacifolious +acinaciform +acinacious +acinacity +acinar +acinary +acinarious +acineta +acinetae +acinetan +acinetaria +acinetarian +acinetic +acinetiform +acinetina +acinetinan +acing +acini +acinic +aciniform +acinose +acinotubular +acinous +acinuni +acinus +acipenser +acipenseres +acipenserid +acipenseridae +acipenserine +acipenseroid +acipenseroidei +acyrology +acyrological +acis +acystia +aciurgy +ack +ackee +ackees +ackey +ackeys +acker +ackman +ackmen +acknew +acknow +acknowing +acknowledge +acknowledgeable +acknowledged +acknowledgedly +acknowledgement +acknowledgements +acknowledger +acknowledgers +acknowledges +acknowledging +acknowledgment +acknowledgments +acknown +ackton +aclastic +acle +acleidian +acleistocardia +acleistous +aclemon +aclydes +aclidian +aclinal +aclinic +aclys +acloud +aclu +acmaea +acmaeidae +acmaesthesia +acmatic +acme +acmes +acmesthesia +acmic +acmispon +acmite +acne +acned +acneform +acneiform +acnemia +acnes +acnida +acnodal +acnode +acnodes +acoasm +acoasma +acocanthera +acocantherin +acock +acockbill +acocotl +acoela +acoelomata +acoelomate +acoelomatous +acoelomi +acoelomous +acoelous +acoemetae +acoemeti +acoemetic +acoenaesthesia +acoin +acoine +acolapissa +acold +acolhua +acolhuan +acolyctine +acolyte +acolytes +acolyth +acolythate +acolytus +acology +acologic +acolous +acoluthic +acoma +acomia +acomous +aconative +acondylose +acondylous +acone +aconelline +aconic +aconin +aconine +aconital +aconite +aconites +aconitia +aconitic +aconitin +aconitine +aconitum +aconitums +acontia +acontias +acontium +acontius +aconuresis +acool +acop +acopic +acopyrin +acopyrine +acopon +acor +acorea +acoria +acorn +acorned +acorns +acorus +acosmic +acosmism +acosmist +acosmistic +acost +acotyledon +acotyledonous +acouasm +acouchi +acouchy +acoumeter +acoumetry +acounter +acouometer +acouophonia +acoup +acoupa +acoupe +acousma +acousmas +acousmata +acousmatic +acoustic +acoustical +acoustically +acoustician +acousticolateral +acousticon +acousticophobia +acoustics +acoustoelectric +acpt +acquaint +acquaintance +acquaintances +acquaintanceship +acquaintanceships +acquaintancy +acquaintant +acquainted +acquaintedness +acquainting +acquaints +acquent +acquereur +acquest +acquests +acquiesce +acquiesced +acquiescement +acquiescence +acquiescency +acquiescent +acquiescently +acquiescer +acquiesces +acquiescing +acquiescingly +acquiesence +acquiet +acquirability +acquirable +acquire +acquired +acquirement +acquirements +acquirenda +acquirer +acquirers +acquires +acquiring +acquisible +acquisita +acquisite +acquisited +acquisition +acquisitional +acquisitions +acquisitive +acquisitively +acquisitiveness +acquisitor +acquisitum +acquist +acquit +acquital +acquitment +acquits +acquittal +acquittals +acquittance +acquitted +acquitter +acquitting +acquophonia +acrab +acracy +acraein +acraeinae +acraldehyde +acrania +acranial +acraniate +acrasy +acrasia +acrasiaceae +acrasiales +acrasias +acrasida +acrasieae +acrasin +acrasins +acraspeda +acraspedote +acratia +acraturesis +acrawl +acraze +acre +acreable +acreage +acreages +acreak +acream +acred +acredula +acreman +acremen +acres +acrestaff +acrid +acridan +acridane +acrider +acridest +acridian +acridic +acridid +acrididae +acridiidae +acridyl +acridin +acridine +acridines +acridinic +acridinium +acridity +acridities +acridium +acrydium +acridly +acridness +acridone +acridonium +acridophagus +acriflavin +acriflavine +acryl +acrylaldehyde +acrylate +acrylates +acrylic +acrylics +acrylyl +acrylonitrile +acrimony +acrimonies +acrimonious +acrimoniously +acrimoniousness +acrindolin +acrindoline +acrinyl +acrisy +acrisia +acrisius +acrita +acritan +acrite +acrity +acritical +acritochromacy +acritol +acritude +acroa +acroaesthesia +acroama +acroamata +acroamatic +acroamatical +acroamatics +acroanesthesia +acroarthritis +acroasis +acroasphyxia +acroataxia +acroatic +acrobacy +acrobacies +acrobat +acrobates +acrobatholithic +acrobatic +acrobatical +acrobatically +acrobatics +acrobatism +acrobats +acrobystitis +acroblast +acrobryous +acrocarpi +acrocarpous +acrocentric +acrocephaly +acrocephalia +acrocephalic +acrocephalous +acrocera +acroceratidae +acroceraunian +acroceridae +acrochordidae +acrochordinae +acrochordon +acrocyanosis +acrocyst +acrock +acroclinium +acrocomia +acroconidium +acrocontracture +acrocoracoid +acrodactyla +acrodactylum +acrodermatitis +acrodynia +acrodont +acrodontism +acrodonts +acrodrome +acrodromous +acrodus +acroesthesia +acrogamy +acrogamous +acrogen +acrogenic +acrogenous +acrogenously +acrogens +acrogynae +acrogynous +acrography +acrolein +acroleins +acrolith +acrolithan +acrolithic +acroliths +acrology +acrologic +acrologically +acrologies +acrologism +acrologue +acromania +acromastitis +acromegaly +acromegalia +acromegalic +acromegalies +acromelalgia +acrometer +acromia +acromial +acromicria +acromimia +acromioclavicular +acromiocoracoid +acromiodeltoid +acromyodi +acromyodian +acromyodic +acromyodous +acromiohyoid +acromiohumeral +acromion +acromioscapular +acromiosternal +acromiothoracic +acromyotonia +acromyotonus +acromonogrammatic +acromphalus +acron +acronal +acronarcotic +acroneurosis +acronic +acronyc +acronical +acronycal +acronically +acronycally +acronych +acronichal +acronychal +acronichally +acronychally +acronychous +acronycta +acronyctous +acronym +acronymic +acronymically +acronymize +acronymized +acronymizing +acronymous +acronyms +acronyx +acronomy +acrook +acroparalysis +acroparesthesia +acropathy +acropathology +acropetal +acropetally +acrophobia +acrophonetic +acrophony +acrophonic +acrophonically +acrophonies +acropodia +acropodium +acropoleis +acropolis +acropolises +acropolitan +acropora +acropore +acrorhagus +acrorrheuma +acrosarc +acrosarca +acrosarcum +acroscleriasis +acroscleroderma +acroscopic +acrose +acrosome +acrosomes +acrosphacelus +acrospire +acrospired +acrospiring +acrospore +acrosporous +across +acrostic +acrostical +acrostically +acrostichal +acrosticheae +acrostichic +acrostichoid +acrostichum +acrosticism +acrostics +acrostolia +acrostolion +acrostolium +acrotarsial +acrotarsium +acroteleutic +acroter +acroteral +acroteria +acroterial +acroteric +acroterion +acroterium +acroterteria +acrothoracica +acrotic +acrotism +acrotisms +acrotomous +acrotreta +acrotretidae +acrotrophic +acrotrophoneurosis +acrux +act +acta +actability +actable +actaea +actaeaceae +actaeon +actaeonidae +acted +actg +actiad +actian +actify +actification +actifier +actin +actinal +actinally +actinautography +actinautographic +actine +actinenchyma +acting +actings +actinia +actiniae +actinian +actinians +actiniaria +actiniarian +actinias +actinic +actinical +actinically +actinide +actinides +actinidia +actinidiaceae +actiniferous +actiniform +actinine +actiniochrome +actiniohematin +actiniomorpha +actinism +actinisms +actinistia +actinium +actiniums +actinobaccilli +actinobacilli +actinobacillosis +actinobacillotic +actinobacillus +actinoblast +actinobranch +actinobranchia +actinocarp +actinocarpic +actinocarpous +actinochemical +actinochemistry +actinocrinid +actinocrinidae +actinocrinite +actinocrinus +actinocutitis +actinodermatitis +actinodielectric +actinodrome +actinodromous +actinoelectric +actinoelectrically +actinoelectricity +actinogonidiate +actinogram +actinograph +actinography +actinographic +actinoid +actinoida +actinoidea +actinoids +actinolite +actinolitic +actinology +actinologous +actinologue +actinomere +actinomeric +actinometer +actinometers +actinometry +actinometric +actinometrical +actinometricy +actinomyces +actinomycese +actinomycesous +actinomycestal +actinomycetaceae +actinomycetal +actinomycetales +actinomycete +actinomycetous +actinomycin +actinomycoma +actinomycosis +actinomycosistic +actinomycotic +actinomyxidia +actinomyxidiida +actinomorphy +actinomorphic +actinomorphous +actinon +actinonema +actinoneuritis +actinons +actinophone +actinophonic +actinophore +actinophorous +actinophryan +actinophrys +actinopod +actinopoda +actinopraxis +actinopteran +actinopteri +actinopterygian +actinopterygii +actinopterygious +actinopterous +actinoscopy +actinosoma +actinosome +actinosphaerium +actinost +actinostereoscopy +actinostomal +actinostome +actinotherapeutic +actinotherapeutics +actinotherapy +actinotoxemia +actinotrichium +actinotrocha +actinouranium +actinozoa +actinozoal +actinozoan +actinozoon +actins +actinula +actinulae +action +actionability +actionable +actionably +actional +actionary +actioner +actiones +actionist +actionize +actionized +actionizing +actionless +actions +actious +actipylea +actium +activable +activate +activated +activates +activating +activation +activations +activator +activators +active +actively +activeness +actives +activin +activism +activisms +activist +activistic +activists +activital +activity +activities +activize +activized +activizing +actless +actomyosin +acton +actor +actory +actorish +actors +actorship +actos +actress +actresses +actressy +acts +actu +actual +actualisation +actualise +actualised +actualising +actualism +actualist +actualistic +actuality +actualities +actualization +actualize +actualized +actualizes +actualizing +actually +actualness +actuals +actuary +actuarial +actuarially +actuarian +actuaries +actuaryship +actuate +actuated +actuates +actuating +actuation +actuator +actuators +actuose +acture +acturience +actus +actutate +acuaesthesia +acuan +acuate +acuating +acuation +acubens +acuchi +acuclosure +acuductor +acuerdo +acuerdos +acuesthesia +acuity +acuities +aculea +aculeae +aculeata +aculeate +aculeated +aculei +aculeiform +aculeolate +aculeolus +aculeus +acumble +acumen +acumens +acuminate +acuminated +acuminating +acumination +acuminose +acuminous +acuminulate +acupress +acupressure +acupunctuate +acupunctuation +acupuncturation +acupuncturator +acupuncture +acupunctured +acupuncturing +acupuncturist +acupuncturists +acurative +acus +acusection +acusector +acushla +acustom +acutance +acutances +acutangular +acutate +acute +acutely +acutenaculum +acuteness +acuter +acutes +acutest +acutiator +acutifoliate +acutilinguae +acutilingual +acutilobate +acutiplantar +acutish +acutograve +acutonodose +acutorsion +acxoyatl +ad +ada +adactyl +adactylia +adactylism +adactylous +adad +adage +adages +adagy +adagial +adagietto +adagiettos +adagio +adagios +adagissimo +adai +aday +adays +adaize +adalat +adalid +adam +adamance +adamances +adamancy +adamancies +adamant +adamantean +adamantine +adamantinoma +adamantly +adamantness +adamantoblast +adamantoblastoma +adamantoid +adamantoma +adamants +adamas +adamastor +adambulacral +adamellite +adamhood +adamic +adamical +adamically +adamine +adamite +adamitic +adamitical +adamitism +adams +adamsia +adamsite +adamsites +adance +adangle +adansonia +adapa +adapid +adapis +adapt +adaptability +adaptable +adaptableness +adaptably +adaptation +adaptational +adaptationally +adaptations +adaptative +adapted +adaptedness +adapter +adapters +adapting +adaption +adaptional +adaptionism +adaptions +adaptitude +adaptive +adaptively +adaptiveness +adaptivity +adaptometer +adaptor +adaptorial +adaptors +adapts +adar +adarbitrium +adarme +adarticulation +adat +adati +adaty +adatis +adatom +adaunt +adaw +adawe +adawlut +adawn +adaxial +adazzle +adc +adcon +adcons +adcraft +add +adda +addability +addable +addax +addaxes +addda +addebted +added +addedly +addeem +addend +addenda +addends +addendum +addendums +adder +adderbolt +adderfish +adders +adderspit +adderwort +addy +addibility +addible +addice +addicent +addict +addicted +addictedness +addicting +addiction +addictions +addictive +addictively +addictiveness +addictives +addicts +addie +addiment +adding +addio +addis +addison +addisonian +addisoniana +addita +additament +additamentary +additiment +addition +additional +additionally +additionary +additionist +additions +addititious +additive +additively +additives +additivity +additory +additum +additur +addle +addlebrain +addlebrained +addled +addlehead +addleheaded +addleheadedly +addleheadedness +addlement +addleness +addlepate +addlepated +addlepatedness +addleplot +addles +addling +addlings +addlins +addn +addnl +addoom +addorsed +addossed +addr +address +addressability +addressable +addressed +addressee +addressees +addresser +addressers +addresses +addressful +addressing +addressograph +addressor +addrest +adds +addu +adduce +adduceable +adduced +adducent +adducer +adducers +adduces +adducible +adducing +adduct +adducted +adducting +adduction +adductive +adductor +adductors +adducts +addulce +ade +adead +adeem +adeemed +adeeming +adeems +adeep +adela +adelaide +adelantado +adelantados +adelante +adelarthra +adelarthrosomata +adelarthrosomatous +adelaster +adelbert +adelea +adeleidae +adelges +adelia +adelina +adeline +adeling +adelite +adeliza +adelocerous +adelochorda +adelocodonic +adelomorphic +adelomorphous +adelopod +adelops +adelphi +adelphian +adelphic +adelphogamy +adelphoi +adelpholite +adelphophagy +adelphous +ademonist +adempt +adempted +ademption +aden +adenalgy +adenalgia +adenanthera +adenase +adenasthenia +adendric +adendritic +adenectomy +adenectomies +adenectopia +adenectopic +adenemphractic +adenemphraxis +adenia +adeniform +adenyl +adenylic +adenylpyrophosphate +adenyls +adenin +adenine +adenines +adenitis +adenitises +adenization +adenoacanthoma +adenoblast +adenocancroid +adenocarcinoma +adenocarcinomas +adenocarcinomata +adenocarcinomatous +adenocele +adenocellulitis +adenochondroma +adenochondrosarcoma +adenochrome +adenocyst +adenocystoma +adenocystomatous +adenodermia +adenodiastasis +adenodynia +adenofibroma +adenofibrosis +adenogenesis +adenogenous +adenographer +adenography +adenographic +adenographical +adenohypersthenia +adenohypophyseal +adenohypophysial +adenohypophysis +adenoid +adenoidal +adenoidectomy +adenoidectomies +adenoidism +adenoiditis +adenoids +adenolymphocele +adenolymphoma +adenoliomyofibroma +adenolipoma +adenolipomatosis +adenologaditis +adenology +adenological +adenoma +adenomalacia +adenomas +adenomata +adenomatome +adenomatous +adenomeningeal +adenometritis +adenomycosis +adenomyofibroma +adenomyoma +adenomyxoma +adenomyxosarcoma +adenoncus +adenoneural +adenoneure +adenopathy +adenopharyngeal +adenopharyngitis +adenophyllous +adenophyma +adenophlegmon +adenophora +adenophore +adenophoreus +adenophorous +adenophthalmia +adenopodous +adenosarcoma +adenosarcomas +adenosarcomata +adenosclerosis +adenose +adenoses +adenosine +adenosis +adenostemonous +adenostoma +adenotyphoid +adenotyphus +adenotome +adenotomy +adenotomic +adenous +adenoviral +adenovirus +adenoviruses +adeodatus +adeona +adephaga +adephagan +adephagia +adephagous +adeps +adept +adepter +adeptest +adeption +adeptly +adeptness +adepts +adeptship +adequacy +adequacies +adequate +adequately +adequateness +adequation +adequative +adermia +adermin +adermine +adesmy +adespota +adespoton +adessenarian +adessive +adeste +adet +adeuism +adevism +adfected +adffroze +adffrozen +adfiliate +adfix +adfluxion +adfreeze +adfreezing +adfroze +adfrozen +adglutinate +adhafera +adhaka +adhamant +adhara +adharma +adherant +adhere +adhered +adherence +adherences +adherency +adherend +adherends +adherent +adherently +adherents +adherer +adherers +adheres +adherescence +adherescent +adhering +adhesion +adhesional +adhesions +adhesive +adhesively +adhesivemeter +adhesiveness +adhesives +adhibit +adhibited +adhibiting +adhibition +adhibits +adhocracy +adhort +ady +adiabat +adiabatic +adiabatically +adiabolist +adiactinic +adiadochokinesia +adiadochokinesis +adiadokokinesi +adiadokokinesia +adiagnostic +adiamorphic +adiamorphism +adiantiform +adiantum +adiaphanous +adiaphanousness +adiaphon +adiaphonon +adiaphora +adiaphoral +adiaphoresis +adiaphoretic +adiaphory +adiaphorism +adiaphorist +adiaphoristic +adiaphorite +adiaphoron +adiaphorous +adiapneustia +adiate +adiated +adiathermal +adiathermancy +adiathermanous +adiathermic +adiathetic +adiating +adiation +adib +adibasi +adicea +adicity +adiel +adience +adient +adieu +adieus +adieux +adigei +adighe +adight +adigranth +adin +adynamy +adynamia +adynamias +adynamic +adinida +adinidan +adinole +adinvention +adion +adios +adipate +adipescent +adiphenine +adipic +adipyl +adipinic +adipocele +adipocellulose +adipocere +adipoceriform +adipocerite +adipocerous +adipocyte +adipofibroma +adipogenic +adipogenous +adipoid +adipolysis +adipolytic +adipoma +adipomata +adipomatous +adipometer +adiponitrile +adipopectic +adipopexia +adipopexic +adipopexis +adipose +adiposeness +adiposes +adiposis +adiposity +adiposities +adiposogenital +adiposuria +adipous +adipsy +adipsia +adipsic +adipsous +adirondack +adit +adyta +adital +aditio +adyton +adits +adytta +adytum +aditus +adj +adjacence +adjacency +adjacencies +adjacent +adjacently +adjag +adject +adjection +adjectional +adjectitious +adjectival +adjectivally +adjective +adjectively +adjectives +adjectivism +adjectivitis +adjiga +adjiger +adjoin +adjoinant +adjoined +adjoinedly +adjoiner +adjoining +adjoiningness +adjoins +adjoint +adjoints +adjourn +adjournal +adjourned +adjourning +adjournment +adjournments +adjourns +adjoust +adjt +adjudge +adjudgeable +adjudged +adjudger +adjudges +adjudging +adjudgment +adjudicata +adjudicate +adjudicated +adjudicates +adjudicating +adjudication +adjudications +adjudicative +adjudicator +adjudicatory +adjudicators +adjudicature +adjugate +adjument +adjunct +adjunction +adjunctive +adjunctively +adjunctly +adjuncts +adjuration +adjurations +adjuratory +adjure +adjured +adjurer +adjurers +adjures +adjuring +adjuror +adjurors +adjust +adjustability +adjustable +adjustably +adjustage +adjustation +adjusted +adjuster +adjusters +adjusting +adjustive +adjustment +adjustmental +adjustments +adjustor +adjustores +adjustoring +adjustors +adjusts +adjutage +adjutancy +adjutancies +adjutant +adjutants +adjutantship +adjutator +adjute +adjutor +adjutory +adjutorious +adjutrice +adjutrix +adjuvant +adjuvants +adjuvate +adlai +adlay +adlegation +adlegiare +adlerian +adless +adlet +adlumia +adlumidin +adlumidine +adlumin +adlumine +adm +adman +admarginate +admass +admaxillary +admeasure +admeasured +admeasurement +admeasurer +admeasuring +admedial +admedian +admen +admensuration +admerveylle +admetus +admi +admin +adminicle +adminicula +adminicular +adminiculary +adminiculate +adminiculation +adminiculum +administer +administerd +administered +administerial +administering +administerings +administers +administrable +administrant +administrants +administrate +administrated +administrates +administrating +administration +administrational +administrationist +administrations +administrative +administratively +administrator +administrators +administratorship +administratress +administratrices +administratrix +adminstration +admirability +admirable +admirableness +admirably +admiral +admirals +admiralship +admiralships +admiralty +admiralties +admirance +admiration +admirations +admirative +admiratively +admirator +admire +admired +admiredly +admirer +admirers +admires +admiring +admiringly +admissability +admissable +admissibility +admissible +admissibleness +admissibly +admission +admissions +admissive +admissively +admissory +admit +admits +admittable +admittance +admittances +admittatur +admitted +admittedly +admittee +admitter +admitters +admitty +admittible +admitting +admix +admixed +admixes +admixing +admixt +admixtion +admixture +admixtures +admonish +admonished +admonisher +admonishes +admonishing +admonishingly +admonishment +admonishments +admonition +admonitioner +admonitionist +admonitions +admonitive +admonitively +admonitor +admonitory +admonitorial +admonitorily +admonitrix +admortization +admov +admove +admrx +adnascence +adnascent +adnate +adnation +adnations +adnephrine +adnerval +adnescent +adneural +adnex +adnexa +adnexal +adnexed +adnexitis +adnexopexy +adnominal +adnominally +adnomination +adnoun +adnouns +adnumber +ado +adobe +adobes +adobo +adobos +adod +adolesce +adolesced +adolescence +adolescency +adolescent +adolescently +adolescents +adolescing +adolf +adolph +adolphus +adon +adonai +adonean +adonia +adoniad +adonian +adonic +adonidin +adonin +adoniram +adonis +adonises +adonist +adonite +adonitol +adonize +adonized +adonizing +adoors +adoperate +adoperation +adopt +adoptability +adoptabilities +adoptable +adoptant +adoptative +adopted +adoptedly +adoptee +adoptees +adopter +adopters +adoptian +adoptianism +adoptianist +adopting +adoption +adoptional +adoptionism +adoptionist +adoptions +adoptious +adoptive +adoptively +adopts +ador +adorability +adorable +adorableness +adorably +adoral +adorally +adorant +adorantes +adoration +adoratory +adore +adored +adorer +adorers +adores +adoretus +adoring +adoringly +adorn +adornation +adorned +adorner +adorners +adorning +adorningly +adornment +adornments +adorno +adornos +adorns +adorsed +ados +adosculation +adossed +adossee +adoulie +adown +adoxa +adoxaceae +adoxaceous +adoxy +adoxies +adoxography +adoze +adp +adpao +adposition +adpress +adpromission +adpromissor +adrad +adradial +adradially +adradius +adramelech +adrammelech +adread +adream +adreamed +adreamt +adrectal +adrenal +adrenalcortical +adrenalectomy +adrenalectomies +adrenalectomize +adrenalectomized +adrenalectomizing +adrenalin +adrenaline +adrenalize +adrenally +adrenalone +adrenals +adrench +adrenergic +adrenin +adrenine +adrenitis +adreno +adrenochrome +adrenocortical +adrenocorticosteroid +adrenocorticotrophic +adrenocorticotrophin +adrenocorticotropic +adrenolysis +adrenolytic +adrenomedullary +adrenosterone +adrenotrophin +adrenotropic +adrent +adret +adry +adrian +adriana +adriatic +adrienne +adrift +adrip +adrogate +adroit +adroiter +adroitest +adroitly +adroitness +adroop +adrop +adrostal +adrostral +adrowse +adrue +ads +adsbud +adscendent +adscititious +adscititiously +adscript +adscripted +adscription +adscriptitious +adscriptitius +adscriptive +adscripts +adsessor +adsheart +adsignify +adsignification +adsmith +adsmithing +adsorb +adsorbability +adsorbable +adsorbate +adsorbates +adsorbed +adsorbent +adsorbents +adsorbing +adsorbs +adsorption +adsorptive +adsorptively +adsorptiveness +adspiration +adstipulate +adstipulated +adstipulating +adstipulation +adstipulator +adstrict +adstringe +adsum +adterminal +adtevac +aduana +adular +adularescence +adularescent +adularia +adularias +adulate +adulated +adulates +adulating +adulation +adulator +adulatory +adulators +adulatress +adulce +adullam +adullamite +adult +adulter +adulterant +adulterants +adulterate +adulterated +adulterately +adulterateness +adulterates +adulterating +adulteration +adulterator +adulterators +adulterer +adulterers +adulteress +adulteresses +adultery +adulteries +adulterine +adulterize +adulterous +adulterously +adulterousness +adulthood +adulticidal +adulticide +adultly +adultlike +adultness +adultoid +adultress +adults +adumbral +adumbrant +adumbrate +adumbrated +adumbrates +adumbrating +adumbration +adumbrations +adumbrative +adumbratively +adumbrellar +adunation +adunc +aduncate +aduncated +aduncity +aduncous +adure +adurent +adusk +adust +adustion +adustiosis +adustive +adv +advaita +advance +advanceable +advanced +advancedness +advancement +advancements +advancer +advancers +advances +advancing +advancingly +advancive +advantage +advantaged +advantageous +advantageously +advantageousness +advantages +advantaging +advect +advected +advecting +advection +advectitious +advective +advects +advehent +advena +advenae +advene +advenience +advenient +advent +advential +adventism +adventist +adventists +adventitia +adventitial +adventitious +adventitiously +adventitiousness +adventive +adventively +adventry +advents +adventual +adventure +adventured +adventureful +adventurement +adventurer +adventurers +adventures +adventureship +adventuresome +adventuresomely +adventuresomeness +adventuresomes +adventuress +adventuresses +adventuring +adventurish +adventurism +adventurist +adventuristic +adventurous +adventurously +adventurousness +adverb +adverbial +adverbiality +adverbialize +adverbially +adverbiation +adverbless +adverbs +adversa +adversant +adversary +adversaria +adversarial +adversaries +adversariness +adversarious +adversative +adversatively +adverse +adversed +adversely +adverseness +adversifoliate +adversifolious +adversing +adversion +adversity +adversities +adversive +adversus +advert +adverted +advertence +advertency +advertent +advertently +adverting +advertisable +advertise +advertised +advertisee +advertisement +advertisements +advertiser +advertisers +advertises +advertising +advertizable +advertize +advertized +advertizement +advertizer +advertizes +advertizing +adverts +advice +adviceful +advices +advisability +advisable +advisableness +advisably +advisal +advisatory +advise +advised +advisedly +advisedness +advisee +advisees +advisement +advisements +adviser +advisers +advisership +advises +advisy +advising +advisive +advisiveness +adviso +advisor +advisory +advisories +advisorily +advisors +advitant +advocaat +advocacy +advocacies +advocate +advocated +advocates +advocateship +advocatess +advocating +advocation +advocative +advocator +advocatory +advocatress +advocatrice +advocatrix +advoyer +advoke +advolution +advoteresse +advowee +advowry +advowsance +advowson +advowsons +advt +adward +adwesch +adz +adze +adzer +adzes +adzooks +ae +aeacides +aeacus +aeaean +aechmophorus +aecia +aecial +aecidia +aecidiaceae +aecidial +aecidioform +aecidiomycetes +aecidiospore +aecidiostage +aecidium +aeciospore +aeciostage +aeciotelia +aecioteliospore +aeciotelium +aecium +aedeagal +aedeagi +aedeagus +aedegi +aedes +aedicula +aediculae +aedicule +aedile +aediles +aedileship +aedilian +aedilic +aedility +aedilitian +aedilities +aedine +aedoeagi +aedoeagus +aedoeology +aefald +aefaldy +aefaldness +aefauld +aegagri +aegagropila +aegagropilae +aegagropile +aegagropiles +aegagrus +aegean +aegemony +aeger +aegerian +aegeriid +aegeriidae +aegialitis +aegicrania +aegilops +aegina +aeginetan +aeginetic +aegipan +aegyptilla +aegir +aegirine +aegirinolite +aegirite +aegyrite +aegis +aegises +aegisthus +aegithalos +aegithognathae +aegithognathism +aegithognathous +aegle +aegophony +aegopodium +aegritude +aegrotant +aegrotat +aeipathy +aelodicon +aeluroid +aeluroidea +aelurophobe +aelurophobia +aeluropodous +aenach +aenean +aeneas +aeneid +aeneolithic +aeneous +aeneus +aenigma +aenigmatite +aeolharmonica +aeolia +aeolian +aeolic +aeolicism +aeolid +aeolidae +aeolididae +aeolight +aeolina +aeoline +aeolipile +aeolipyle +aeolis +aeolism +aeolist +aeolistic +aeolodicon +aeolodion +aeolomelodicon +aeolopantalon +aeolotropy +aeolotropic +aeolotropism +aeolsklavier +aeolus +aeon +aeonial +aeonian +aeonic +aeonicaeonist +aeonist +aeons +aepyceros +aepyornis +aepyornithidae +aepyornithiformes +aeq +aequi +aequian +aequiculi +aequipalpia +aequor +aequoreal +aequorin +aequorins +aer +aerage +aeraria +aerarian +aerarium +aerate +aerated +aerates +aerating +aeration +aerations +aerator +aerators +aerenchyma +aerenterectasia +aery +aerial +aerialist +aerialists +aeriality +aerially +aerialness +aerials +aeric +aerical +aerides +aerie +aeried +aerier +aeries +aeriest +aerifaction +aeriferous +aerify +aerification +aerified +aerifies +aerifying +aeriform +aerily +aeriness +aero +aeroacoustic +aerobacter +aerobacteriology +aerobacteriological +aerobacteriologically +aerobacteriologist +aerobacters +aeroballistic +aeroballistics +aerobate +aerobated +aerobatic +aerobatics +aerobating +aerobe +aerobee +aerobes +aerobia +aerobian +aerobic +aerobically +aerobics +aerobiology +aerobiologic +aerobiological +aerobiologically +aerobiologist +aerobion +aerobiont +aerobioscope +aerobiosis +aerobiotic +aerobiotically +aerobious +aerobium +aeroboat +aerobranchia +aerobranchiate +aerobus +aerocamera +aerocar +aerocartograph +aerocartography +aerocharidae +aerocyst +aerocolpos +aerocraft +aerocurve +aerodermectasia +aerodynamic +aerodynamical +aerodynamically +aerodynamicist +aerodynamics +aerodyne +aerodynes +aerodone +aerodonetic +aerodonetics +aerodontalgia +aerodontia +aerodontic +aerodrome +aerodromes +aerodromics +aeroduct +aeroducts +aeroelastic +aeroelasticity +aeroelastics +aeroembolism +aeroenterectasia +aerofoil +aerofoils +aerogel +aerogels +aerogen +aerogene +aerogenes +aerogenesis +aerogenic +aerogenically +aerogenous +aerogeography +aerogeology +aerogeologist +aerognosy +aerogram +aerogramme +aerograms +aerograph +aerographer +aerography +aerographic +aerographical +aerographics +aerographies +aerogun +aerohydrodynamic +aerohydropathy +aerohydroplane +aerohydrotherapy +aerohydrous +aeroyacht +aeroides +aerolite +aerolites +aerolith +aerolithology +aeroliths +aerolitic +aerolitics +aerology +aerologic +aerological +aerologies +aerologist +aerologists +aeromaechanic +aeromagnetic +aeromancer +aeromancy +aeromantic +aeromarine +aeromechanic +aeromechanical +aeromechanics +aeromedical +aeromedicine +aerometeorograph +aerometer +aerometry +aerometric +aeromotor +aeron +aeronat +aeronaut +aeronautic +aeronautical +aeronautically +aeronautics +aeronautism +aeronauts +aeronef +aeroneurosis +aeronomer +aeronomy +aeronomic +aeronomical +aeronomics +aeronomies +aeronomist +aeropathy +aeropause +aerope +aeroperitoneum +aeroperitonia +aerophagy +aerophagia +aerophagist +aerophane +aerophilately +aerophilatelic +aerophilatelist +aerophile +aerophilia +aerophilic +aerophilous +aerophysical +aerophysicist +aerophysics +aerophyte +aerophobia +aerophobic +aerophone +aerophor +aerophore +aerophoto +aerophotography +aerophotos +aeroplane +aeroplaner +aeroplanes +aeroplanist +aeroplankton +aeropleustic +aeroporotomy +aeropulse +aerosat +aerosats +aeroscepsy +aeroscepsis +aeroscope +aeroscopy +aeroscopic +aeroscopically +aerose +aerosiderite +aerosiderolite +aerosinusitis +aerosol +aerosolization +aerosolize +aerosolized +aerosolizing +aerosols +aerospace +aerosphere +aerosporin +aerostat +aerostatic +aerostatical +aerostatics +aerostation +aerostats +aerosteam +aerotactic +aerotaxis +aerotechnical +aerotechnics +aerotherapeutics +aerotherapy +aerothermodynamic +aerothermodynamics +aerotonometer +aerotonometry +aerotonometric +aerotow +aerotropic +aerotropism +aeroview +aeruginous +aerugo +aerugos +aes +aesc +aeschylean +aeschylus +aeschynanthus +aeschynite +aeschynomene +aeschynomenous +aesculaceae +aesculaceous +aesculapian +aesculapius +aesculetin +aesculin +aesculus +aesir +aesop +aesopian +aesopic +aestethic +aesthesia +aesthesics +aesthesis +aesthesodic +aesthete +aesthetes +aesthetic +aesthetical +aesthetically +aesthetician +aestheticism +aestheticist +aestheticize +aesthetics +aesthiology +aesthophysiology +aestii +aestival +aestivate +aestivated +aestivates +aestivating +aestivation +aestivator +aestive +aestuary +aestuate +aestuation +aestuous +aesture +aestus +aet +aetat +aethalia +aethalioid +aethalium +aetheling +aetheogam +aetheogamic +aetheogamous +aether +aethereal +aethered +aetheric +aethers +aethionema +aethogen +aethon +aethrioscope +aethusa +aetian +aetiogenic +aetiology +aetiological +aetiologically +aetiologies +aetiologist +aetiologue +aetiophyllin +aetiotropic +aetiotropically +aetites +aetobatidae +aetobatus +aetolian +aetomorphae +aetosaur +aetosaurian +aetosaurus +aettekees +aevia +aeviternal +aevum +af +aface +afaced +afacing +afaint +afar +afara +afars +afb +afd +afdecho +afear +afeard +afeared +afebrile +afenil +afer +afernan +afetal +aff +affa +affability +affable +affableness +affably +affabrous +affair +affaire +affaires +affairs +affaite +affamish +affatuate +affect +affectability +affectable +affectate +affectation +affectationist +affectations +affected +affectedly +affectedness +affecter +affecters +affectibility +affectible +affecting +affectingly +affection +affectional +affectionally +affectionate +affectionately +affectionateness +affectioned +affectionless +affections +affectious +affective +affectively +affectivity +affectless +affectlessness +affector +affects +affectual +affectum +affectuous +affectus +affeeble +affeer +affeerer +affeerment +affeeror +affeir +affenpinscher +affenspalte +affere +afferent +afferently +affettuoso +affettuosos +affy +affiance +affianced +affiancer +affiances +affiancing +affiant +affiants +affich +affiche +affiches +afficionado +affidare +affidation +affidavy +affydavy +affidavit +affidavits +affied +affies +affying +affile +affiliable +affiliate +affiliated +affiliates +affiliating +affiliation +affiliations +affinage +affinal +affination +affine +affined +affinely +affines +affing +affinitative +affinitatively +affinite +affinity +affinities +affinition +affinitive +affirm +affirmable +affirmably +affirmance +affirmant +affirmation +affirmations +affirmative +affirmatively +affirmativeness +affirmatives +affirmatory +affirmed +affirmer +affirmers +affirming +affirmingly +affirmly +affirms +affix +affixable +affixal +affixation +affixed +affixer +affixers +affixes +affixial +affixing +affixion +affixment +affixt +affixture +afflate +afflated +afflation +afflatus +afflatuses +afflict +afflicted +afflictedness +afflicter +afflicting +afflictingly +affliction +afflictionless +afflictions +afflictive +afflictively +afflicts +affloof +afflue +affluence +affluency +affluent +affluently +affluentness +affluents +afflux +affluxes +affluxion +affodill +afforce +afforced +afforcement +afforcing +afford +affordable +afforded +affording +affords +afforest +afforestable +afforestation +afforestational +afforested +afforesting +afforestment +afforests +afformative +affray +affrayed +affrayer +affrayers +affraying +affrays +affranchise +affranchised +affranchisement +affranchising +affrap +affreight +affreighter +affreightment +affret +affrettando +affreux +affricate +affricated +affricates +affrication +affricative +affriended +affright +affrighted +affrightedly +affrighter +affrightful +affrightfully +affrighting +affrightingly +affrightment +affrights +affront +affronte +affronted +affrontedly +affrontedness +affrontee +affronter +affronty +affronting +affrontingly +affrontingness +affrontive +affrontiveness +affrontment +affronts +afft +affuse +affusedaffusing +affusion +affusions +afghan +afghanets +afghani +afghanis +afghanistan +afghans +afgod +afibrinogenemia +aficionada +aficionadas +aficionado +aficionados +afield +afifi +afikomen +afire +aflagellar +aflame +aflare +aflat +aflatoxin +aflatus +aflaunt +afley +aflicker +aflight +afloat +aflow +aflower +afluking +aflush +aflutter +afoam +afocal +afoot +afore +aforegoing +aforehand +aforementioned +aforenamed +aforesaid +aforethought +aforetime +aforetimes +aforeward +afortiori +afoul +afounde +afray +afraid +afraidness +aframerican +afrasia +afrasian +afreet +afreets +afresca +afresh +afret +afrete +afric +africa +african +africana +africander +africanism +africanist +africanization +africanize +africanoid +africans +africanthropus +afridi +afright +afrikaans +afrikander +afrikanderdom +afrikanderism +afrikaner +afrit +afrite +afrits +afro +afrogaea +afrogaean +afront +afrormosia +afros +afrown +afshah +afshar +aft +aftaba +after +afteract +afterage +afterattack +afterbay +afterband +afterbeat +afterbirth +afterbirths +afterblow +afterbody +afterbodies +afterbrain +afterbreach +afterbreast +afterburner +afterburners +afterburning +aftercare +aftercareer +aftercast +aftercataract +aftercause +afterchance +afterchrome +afterchurch +afterclap +afterclause +aftercome +aftercomer +aftercoming +aftercooler +aftercost +aftercourse +aftercrop +aftercure +afterdays +afterdamp +afterdate +afterdated +afterdeal +afterdeath +afterdeck +afterdecks +afterdinner +afterdischarge +afterdrain +afterdrops +aftereffect +aftereffects +aftereye +afterend +afterfall +afterfame +afterfeed +afterfermentation +afterform +afterfriend +afterfruits +afterfuture +aftergame +aftergas +afterglide +afterglow +afterglows +aftergo +aftergood +aftergrass +aftergrave +aftergrief +aftergrind +aftergrowth +afterguard +afterguns +afterhand +afterharm +afterhatch +afterheat +afterhelp +afterhend +afterhold +afterhope +afterhours +afteryears +afterimage +afterimages +afterimpression +afterings +afterking +afterknowledge +afterlife +afterlifetime +afterlight +afterlives +afterloss +afterlove +aftermark +aftermarket +aftermarriage +aftermass +aftermast +aftermath +aftermaths +aftermatter +aftermeal +aftermilk +aftermost +afternight +afternoon +afternoons +afternose +afternote +afteroar +afterpain +afterpains +afterpart +afterpast +afterpeak +afterpiece +afterplay +afterplanting +afterpotential +afterpressure +afterproof +afterrake +afterreckoning +afterrider +afterripening +afterroll +afters +afterschool +aftersend +aftersensation +aftershaft +aftershafted +aftershave +aftershaves +aftershine +aftership +aftershock +aftershocks +aftersong +aftersound +afterspeech +afterspring +afterstain +afterstate +afterstorm +afterstrain +afterstretch +afterstudy +aftersupper +afterswarm +afterswarming +afterswell +aftertan +aftertask +aftertaste +aftertastes +aftertax +afterthinker +afterthought +afterthoughted +afterthoughts +afterthrift +aftertime +aftertimes +aftertouch +aftertreatment +aftertrial +afterturn +aftervision +afterwale +afterwar +afterward +afterwards +afterwash +afterwhile +afterwisdom +afterwise +afterwit +afterwitted +afterword +afterwork +afterworking +afterworld +afterwort +afterwrath +afterwrist +aftmost +aftonian +aftosa +aftosas +aftward +aftwards +afunction +afunctional +afwillite +afzelia +ag +aga +agabanee +agacant +agacante +agacella +agacerie +agaces +agad +agada +agade +agadic +agag +again +againbuy +againsay +against +againstand +againward +agal +agalactia +agalactic +agalactous +agalawood +agalaxy +agalaxia +agalena +agalenidae +agalinis +agalite +agalloch +agallochs +agallochum +agallop +agalma +agalmatolite +agalwood +agalwoods +agama +agamae +agamas +agamemnon +agamete +agametes +agami +agamy +agamian +agamic +agamically +agamid +agamidae +agamis +agamist +agammaglobulinemia +agammaglobulinemic +agamobia +agamobium +agamogenesis +agamogenetic +agamogenetically +agamogony +agamoid +agamont +agamospermy +agamospore +agamous +aganglionic +aganice +aganippe +agao +agaonidae +agapae +agapai +agapanthus +agapanthuses +agape +agapeic +agapeically +agapemone +agapemonian +agapemonist +agapemonite +agapetae +agapeti +agapetid +agapetidae +agaphite +agapornis +agar +agaric +agaricaceae +agaricaceous +agaricales +agaricic +agariciform +agaricin +agaricine +agaricinic +agaricoid +agarics +agaricus +agaristidae +agarita +agaroid +agarose +agaroses +agars +agarum +agarwal +agas +agasp +agast +agastache +agastreae +agastric +agastroneuria +agata +agate +agatelike +agates +agateware +agatha +agathaea +agathaumas +agathin +agathis +agathism +agathist +agathodaemon +agathodaemonic +agathodemon +agathokakological +agathology +agathosma +agaty +agatiferous +agatiform +agatine +agatize +agatized +agatizes +agatizing +agatoid +agau +agave +agaves +agavose +agawam +agaz +agaze +agazed +agba +agcy +agdistis +age +ageable +aged +agedly +agedness +agednesses +agee +ageing +ageings +ageism +ageisms +ageist +ageists +agelacrinites +agelacrinitidae +agelaius +agelast +agelaus +ageless +agelessly +agelessness +agelong +agen +agena +agency +agencies +agend +agenda +agendaless +agendas +agendum +agendums +agene +agenes +ageneses +agenesia +agenesias +agenesic +agenesis +agenetic +agenize +agenized +agenizes +agenizing +agennesis +agennetic +agent +agentess +agential +agenting +agentival +agentive +agentives +agentry +agentries +agents +agentship +ageometrical +ager +agerasia +ageratum +ageratums +agers +ages +aget +agete +ageusia +ageusic +ageustia +aggadic +aggelation +aggenerate +agger +aggerate +aggeration +aggerose +aggers +aggest +aggie +aggies +aggiornamenti +aggiornamento +agglomerant +agglomerate +agglomerated +agglomerates +agglomeratic +agglomerating +agglomeration +agglomerations +agglomerative +agglomerator +agglutinability +agglutinable +agglutinant +agglutinate +agglutinated +agglutinates +agglutinating +agglutination +agglutinationist +agglutinations +agglutinative +agglutinatively +agglutinator +agglutinin +agglutinins +agglutinize +agglutinogen +agglutinogenic +agglutinoid +agglutinoscope +agglutogenic +aggrace +aggradation +aggradational +aggrade +aggraded +aggrades +aggrading +aggrammatism +aggrandise +aggrandised +aggrandisement +aggrandiser +aggrandising +aggrandizable +aggrandize +aggrandized +aggrandizement +aggrandizements +aggrandizer +aggrandizers +aggrandizes +aggrandizing +aggrate +aggravable +aggravate +aggravated +aggravates +aggravating +aggravatingly +aggravation +aggravations +aggravative +aggravator +aggregable +aggregant +aggregata +aggregatae +aggregate +aggregated +aggregately +aggregateness +aggregates +aggregating +aggregation +aggregational +aggregations +aggregative +aggregatively +aggregator +aggregatory +aggrege +aggress +aggressed +aggresses +aggressin +aggressing +aggression +aggressionist +aggressions +aggressive +aggressively +aggressiveness +aggressivity +aggressor +aggressors +aggry +aggrievance +aggrieve +aggrieved +aggrievedly +aggrievedness +aggrievement +aggrieves +aggrieving +aggro +aggros +aggroup +aggroupment +aggur +agha +aghan +aghanee +aghas +aghast +aghastness +aghlabite +aghorapanthi +aghori +agy +agialid +agib +agible +agiel +agyieus +agyiomania +agilawood +agile +agilely +agileness +agility +agilities +agillawood +agilmente +agin +agynary +agynarious +aging +agings +agynic +aginner +aginners +agynous +agio +agios +agiotage +agiotages +agyrate +agyria +agyrophobia +agism +agisms +agist +agistator +agisted +agister +agisting +agistment +agistor +agists +agit +agitability +agitable +agitant +agitate +agitated +agitatedly +agitates +agitating +agitation +agitational +agitationist +agitations +agitative +agitato +agitator +agitatorial +agitators +agitatrix +agitprop +agitpropist +agitprops +agitpunkt +agkistrodon +agla +aglaia +aglance +aglaonema +aglaos +aglaozonia +aglare +aglaspis +aglauros +agleaf +agleam +aglee +agley +aglet +aglethead +aglets +agly +aglycon +aglycone +aglycones +aglycons +aglycosuric +aglimmer +aglint +aglipayan +aglipayano +aglypha +aglyphodont +aglyphodonta +aglyphodontia +aglyphous +aglisten +aglitter +aglobulia +aglobulism +aglossa +aglossal +aglossate +aglossia +aglow +aglucon +aglucone +aglutition +agma +agmas +agmatine +agmatology +agminate +agminated +agnail +agnails +agname +agnamed +agnat +agnate +agnates +agnatha +agnathia +agnathic +agnathostomata +agnathostomatous +agnathous +agnatic +agnatical +agnatically +agnation +agnations +agnean +agneau +agneaux +agnel +agnes +agnification +agnition +agnize +agnized +agnizes +agnizing +agnoetae +agnoete +agnoetism +agnoiology +agnoite +agnoites +agnomen +agnomens +agnomical +agnomina +agnominal +agnomination +agnosy +agnosia +agnosias +agnosis +agnostic +agnostical +agnostically +agnosticism +agnostics +agnostus +agnotozoic +agnus +agnuses +ago +agog +agoge +agogic +agogics +agoho +agoing +agomensin +agomphiasis +agomphious +agomphosis +agon +agonal +agone +agones +agony +agonia +agoniada +agoniadin +agoniatite +agoniatites +agonic +agonied +agonies +agonise +agonised +agonises +agonising +agonisingly +agonist +agonista +agonistarch +agonistic +agonistical +agonistically +agonistics +agonists +agonium +agonize +agonized +agonizedly +agonizer +agonizes +agonizing +agonizingly +agonizingness +agonostomus +agonothet +agonothete +agonothetic +agons +agora +agorae +agoramania +agoranome +agoranomus +agoraphobia +agoraphobiac +agoraphobic +agoras +agorot +agoroth +agos +agostadero +agouara +agouta +agouti +agouty +agouties +agoutis +agpaite +agpaitic +agr +agra +agrace +agrafe +agrafes +agraffe +agraffee +agraffes +agrah +agral +agramed +agrammaphasia +agrammatica +agrammatical +agrammatism +agrammatologia +agrania +agranulocyte +agranulocytosis +agranuloplastic +agrapha +agraphia +agraphias +agraphic +agraria +agrarian +agrarianism +agrarianize +agrarianly +agrarians +agrauleum +agravic +agre +agreat +agreation +agreations +agree +agreeability +agreeable +agreeableness +agreeably +agreed +agreeing +agreeingly +agreement +agreements +agreer +agreers +agrees +agregation +agrege +agreges +agreing +agremens +agrement +agrements +agrest +agrestal +agrestial +agrestian +agrestic +agrestical +agrestis +agria +agrias +agribusiness +agribusinesses +agric +agricere +agricole +agricolist +agricolite +agricolous +agricultor +agricultural +agriculturalist +agriculturalists +agriculturally +agriculture +agriculturer +agricultures +agriculturist +agriculturists +agrief +agrilus +agrimony +agrimonia +agrimonies +agrimotor +agrin +agriochoeridae +agriochoerus +agriology +agriological +agriologist +agrionia +agrionid +agrionidae +agriot +agriotes +agriotype +agriotypidae +agriotypus +agrypnia +agrypniai +agrypnias +agrypnode +agrypnotic +agrise +agrised +agrising +agrito +agritos +agroan +agrobacterium +agrobiology +agrobiologic +agrobiological +agrobiologically +agrobiologist +agrodolce +agrogeology +agrogeological +agrogeologically +agrology +agrologic +agrological +agrologically +agrologies +agrologist +agrom +agromania +agromyza +agromyzid +agromyzidae +agron +agronome +agronomy +agronomial +agronomic +agronomical +agronomically +agronomics +agronomies +agronomist +agronomists +agroof +agrope +agropyron +agrostemma +agrosteral +agrosterol +agrostis +agrostographer +agrostography +agrostographic +agrostographical +agrostographies +agrostology +agrostologic +agrostological +agrostologist +agrote +agrotechny +agrotype +agrotis +aground +agrufe +agruif +agsam +agst +agt +agtbasic +agua +aguacate +aguacateca +aguada +aguador +aguaji +aguamas +aguamiel +aguara +aguardiente +aguavina +agudist +ague +aguey +aguelike +agueproof +agues +agueweed +agueweeds +aguglia +aguilarite +aguilawood +aguilt +aguinaldo +aguinaldos +aguirage +aguise +aguish +aguishly +aguishness +agujon +agunah +agura +aguroth +agush +agust +ah +aha +ahaaina +ahab +ahamkara +ahankara +ahantchuyuk +ahartalav +ahaunch +ahchoo +ahead +aheap +ahey +aheight +ahem +ahems +ahepatokla +ahet +ahi +ahimsa +ahimsas +ahind +ahint +ahypnia +ahir +ahistoric +ahistorical +ahluwalia +ahmadi +ahmadiya +ahmed +ahmedi +ahmet +ahnfeltia +aho +ahoy +ahold +aholds +aholt +ahom +ahong +ahorse +ahorseback +ahousaht +ahrendahronon +ahriman +ahrimanian +ahs +ahsan +aht +ahtena +ahu +ahuaca +ahuatle +ahuehuete +ahull +ahum +ahungered +ahungry +ahunt +ahura +ahurewa +ahush +ahuula +ahwal +ai +ay +ayacahuite +ayah +ayahausca +ayahs +ayahuasca +ayahuca +ayapana +aias +ayatollah +ayatollahs +aiawong +aiblins +aichmophobia +aid +aidable +aidance +aidant +aide +aided +aydendron +aidenn +aider +aiders +aides +aidful +aiding +aidless +aidman +aidmanmen +aidmen +aids +aye +ayegreen +aiel +ayelp +ayen +ayenbite +ayens +ayenst +aiery +ayes +aiger +aigialosaur +aigialosauridae +aigialosaurus +aiglet +aiglets +aiglette +aigre +aigremore +aigret +aigrets +aigrette +aigrettes +aiguelle +aiguellette +aiguiere +aiguille +aiguilles +aiguillesque +aiguillette +aiguilletted +ayield +ayin +ayins +ayyubid +aik +aikane +aikido +aikidos +aikinite +aikona +aikuchi +ail +ailantery +ailanthic +ailanthus +ailanthuses +ailantine +ailanto +aile +ailed +aileen +aileron +ailerons +aylesbury +ayless +aylet +ailette +ailie +ailing +aillt +ayllu +ailment +ailments +ails +ailsyte +ailuridae +ailuro +ailuroid +ailuroidea +ailuromania +ailurophile +ailurophilia +ailurophilic +ailurophobe +ailurophobia +ailurophobic +ailuropoda +ailuropus +ailurus +ailweed +aim +aimable +aimak +aimara +aymara +aymaran +ayme +aimed +aimee +aimer +aimers +aimful +aimfully +aiming +aimless +aimlessly +aimlessness +aimore +aymoro +aims +aimworthiness +ain +ainaleh +aine +ayne +ainee +ainhum +ainoi +ains +ainsell +ainsells +aint +ainu +ainus +aioli +aiolis +aion +ayond +aionial +ayont +ayous +air +aira +airable +airampo +airan +airbag +airbags +airbill +airbills +airboat +airboats +airborn +airborne +airbound +airbrained +airbrasive +airbrick +airbrush +airbrushed +airbrushes +airbrushing +airburst +airbursts +airbus +airbuses +airbusses +aircheck +airchecks +aircoach +aircoaches +aircraft +aircraftman +aircraftmen +aircrafts +aircraftsman +aircraftsmen +aircraftswoman +aircraftswomen +aircraftwoman +aircrew +aircrewman +aircrewmen +aircrews +airdate +airdates +airdock +airdrome +airdromes +airdrop +airdropped +airdropping +airdrops +aire +ayre +aired +airedale +airedales +airer +airers +airest +airfare +airfares +airfield +airfields +airflow +airflows +airfoil +airfoils +airframe +airframes +airfreight +airfreighter +airglow +airglows +airgraph +airgraphics +airhead +airheads +airy +airier +airiest +airiferous +airify +airified +airily +airiness +airinesses +airing +airings +airish +airless +airlessly +airlessness +airlift +airlifted +airlifting +airlifts +airlight +airlike +airline +airliner +airliners +airlines +airling +airlock +airlocks +airmail +airmailed +airmailing +airmails +airman +airmanship +airmark +airmarker +airmass +airmen +airmobile +airmonger +airn +airns +airohydrogen +airometer +airpark +airparks +airphobia +airplay +airplays +airplane +airplaned +airplaner +airplanes +airplaning +airplanist +airplot +airport +airports +airpost +airposts +airproof +airproofed +airproofing +airproofs +airs +airscape +airscapes +airscrew +airscrews +airshed +airsheds +airsheet +airship +airships +ayrshire +airsick +airsickness +airsome +airspace +airspaces +airspeed +airspeeds +airstream +airstrip +airstrips +airt +airted +airth +airthed +airthing +airths +airtight +airtightly +airtightness +airtime +airtimes +airting +airts +airview +airway +airwaybill +airwayman +airways +airward +airwards +airwash +airwave +airwaves +airwise +airwoman +airwomen +airworthy +airworthier +airworthiest +airworthiness +ais +ays +aischrolatreia +aiseweed +aisle +aisled +aisleless +aisles +aisling +aissaoua +aissor +aisteoir +aistopod +aistopoda +aistopodes +ait +aitch +aitchbone +aitches +aitchless +aitchpiece +aitesis +aith +aythya +aithochroi +aitiology +aition +aitiotropic +aitis +aitkenite +aits +aitutakian +ayu +ayubite +ayudante +ayuyu +ayuntamiento +ayuntamientos +ayurveda +ayurvedas +aiver +aivers +aivr +aiwain +aiwan +aywhere +aix +aizle +aizoaceae +aizoaceous +aizoon +ajaja +ajangle +ajar +ajari +ajatasatru +ajava +ajax +ajee +ajenjo +ajhar +ajimez +ajitter +ajiva +ajivas +ajivika +ajog +ajoint +ajonjoli +ajoure +ajourise +ajowan +ajowans +ajuga +ajugas +ajutment +ak +aka +akaakai +akal +akala +akali +akalimba +akamai +akamatsu +akamnik +akan +akanekunik +akania +akaniaceae +akaroa +akasa +akasha +akawai +akazga +akazgin +akazgine +akcheh +ake +akeake +akebi +akebia +aked +akee +akees +akehorne +akey +akeki +akela +akelas +akeley +akemboll +akenbold +akene +akenes +akenobeite +akepiro +akepiros +aker +akerite +aketon +akha +akhara +akhyana +akhissar +akhlame +akhmimic +akhoond +akhrot +akhund +akhundzada +akia +akiyenik +akim +akimbo +akin +akindle +akinesia +akinesic +akinesis +akinete +akinetic +aking +akiskemikinik +akka +akkad +akkadian +akkadist +akmite +akmudar +akmuddar +aknee +aknow +ako +akoasm +akoasma +akolouthia +akoluthia +akonge +akontae +akoulalion +akov +akpek +akra +akrabattine +akre +akroasis +akrochordite +akron +akroter +akroteria +akroterial +akroterion +akrteria +aktiebolag +aktistetae +aktistete +aktivismus +aktivist +aku +akuammin +akuammine +akule +akund +akvavit +akvavits +akwapim +al +ala +alabama +alabaman +alabamian +alabamians +alabamide +alabamine +alabandine +alabandite +alabarch +alabaster +alabastoi +alabastos +alabastra +alabastrian +alabastrine +alabastrites +alabastron +alabastrons +alabastrum +alabastrums +alablaster +alacha +alachah +alack +alackaday +alacran +alacreatine +alacreatinin +alacreatinine +alacrify +alacrious +alacriously +alacrity +alacrities +alacritous +alactaga +alada +aladdin +aladdinize +aladfar +aladinist +alae +alagao +alagarto +alagau +alahee +alai +alay +alaihi +alain +alaite +alaki +alala +alalia +alalite +alaloi +alalonga +alalunga +alalus +alamanni +alamannian +alamannic +alambique +alameda +alamedas +alamiqui +alamire +alamo +alamodality +alamode +alamodes +alamonti +alamort +alamos +alamosite +alamoth +alan +aland +alands +alane +alang +alange +alangiaceae +alangin +alangine +alangium +alani +alanyl +alanyls +alanin +alanine +alanines +alanins +alannah +alans +alant +alantic +alantin +alantol +alantolactone +alantolic +alants +alap +alapa +alar +alarbus +alares +alarge +alary +alaria +alaric +alarm +alarmable +alarmclock +alarmed +alarmedly +alarming +alarmingly +alarmingness +alarmism +alarmisms +alarmist +alarmists +alarms +alarodian +alarum +alarumed +alaruming +alarums +alas +alasas +alascan +alaska +alaskaite +alaskan +alaskans +alaskas +alaskite +alastair +alaster +alastor +alastors +alastrim +alate +alated +alatern +alaternus +alation +alations +alauda +alaudidae +alaudine +alaund +alaunian +alaunt +alawi +alazor +alb +alba +albacea +albacora +albacore +albacores +albahaca +albainn +alban +albanenses +albanensian +albany +albania +albanian +albanians +albanite +albarco +albardine +albarelli +albarello +albarellos +albarium +albas +albaspidin +albata +albatas +albation +albatros +albatross +albatrosses +albe +albedo +albedograph +albedometer +albedos +albee +albeit +alberca +alberene +albergatrice +alberge +alberghi +albergo +alberich +albert +alberta +albertin +albertina +albertine +albertinian +albertype +albertist +albertite +alberto +alberttype +albertustaler +albescence +albescent +albespine +albespyne +albeston +albetad +albi +albian +albicans +albicant +albication +albicore +albicores +albiculi +albify +albification +albificative +albified +albifying +albiflorous +albigenses +albigensian +albigensianism +albin +albyn +albinal +albines +albiness +albinic +albinism +albinisms +albinistic +albino +albinoism +albinos +albinotic +albinuria +albion +albireo +albite +albites +albitic +albitical +albitite +albitization +albitophyre +albizia +albizias +albizzia +albizzias +albocarbon +albocinereous +albococcus +albocracy +alboin +albolite +albolith +albopannin +albopruinose +alborada +alborak +alboranite +albrecht +albricias +albright +albronze +albruna +albs +albuca +albuginaceae +albuginea +albugineous +albugines +albuginitis +albugo +album +albumean +albumen +albumeniizer +albumenisation +albumenise +albumenised +albumeniser +albumenising +albumenization +albumenize +albumenized +albumenizer +albumenizing +albumenoid +albumens +albumimeter +albumin +albuminate +albuminaturia +albuminiferous +albuminiform +albuminimeter +albuminimetry +albuminiparous +albuminise +albuminised +albuminising +albuminization +albuminize +albuminized +albuminizing +albuminocholia +albuminofibrin +albuminogenous +albuminoid +albuminoidal +albuminolysis +albuminometer +albuminometry +albuminone +albuminorrhea +albuminoscope +albuminose +albuminosis +albuminous +albuminousness +albumins +albuminuria +albuminuric +albuminurophobia +albumoid +albumoscope +albumose +albumoses +albumosuria +albums +albuquerque +alburn +alburnous +alburnum +alburnums +albus +albutannin +alc +alca +alcaaba +alcabala +alcade +alcades +alcae +alcahest +alcahests +alcaic +alcaiceria +alcaics +alcaid +alcaide +alcayde +alcaides +alcaydes +alcalde +alcaldes +alcaldeship +alcaldia +alcali +alcaligenes +alcalizate +alcalzar +alcamine +alcanna +alcantara +alcantarines +alcapton +alcaptonuria +alcargen +alcarraza +alcatras +alcavala +alcazaba +alcazar +alcazars +alcazava +alce +alcedines +alcedinidae +alcedininae +alcedo +alcelaphine +alcelaphus +alces +alcestis +alchem +alchemy +alchemic +alchemical +alchemically +alchemies +alchemilla +alchemise +alchemised +alchemising +alchemist +alchemister +alchemistic +alchemistical +alchemistry +alchemists +alchemize +alchemized +alchemizing +alchera +alcheringa +alchimy +alchymy +alchymies +alchitran +alchochoden +alchornea +alcibiadean +alcibiades +alcicornium +alcid +alcidae +alcidine +alcids +alcine +alcyon +alcyonacea +alcyonacean +alcyonaria +alcyonarian +alcyone +alcyones +alcyoniaceae +alcyonic +alcyoniform +alcyonium +alcyonoid +alcippe +alclad +alcmene +alco +alcoate +alcogel +alcogene +alcohate +alcohol +alcoholate +alcoholature +alcoholdom +alcoholemia +alcoholic +alcoholically +alcoholicity +alcoholics +alcoholimeter +alcoholisation +alcoholise +alcoholised +alcoholising +alcoholysis +alcoholism +alcoholist +alcoholytic +alcoholizable +alcoholization +alcoholize +alcoholized +alcoholizing +alcoholmeter +alcoholmetric +alcoholomania +alcoholometer +alcoholometry +alcoholometric +alcoholometrical +alcoholophilia +alcohols +alcoholuria +alconde +alcoothionic +alcor +alcoran +alcoranic +alcoranist +alcornoco +alcornoque +alcosol +alcotate +alcove +alcoved +alcoves +alcovinometer +alcuinian +alcumy +ald +alday +aldamin +aldamine +aldane +aldazin +aldazine +aldea +aldeament +aldebaran +aldebaranium +aldehydase +aldehyde +aldehydes +aldehydic +aldehydine +aldehydrol +aldehol +aldeia +alden +alder +alderamin +alderfly +alderflies +alderliefest +alderling +alderman +aldermanate +aldermancy +aldermaness +aldermanic +aldermanical +aldermanity +aldermanly +aldermanlike +aldermanry +aldermanries +aldermanship +aldermen +aldern +alderney +alders +alderwoman +alderwomen +aldhafara +aldhafera +aldide +aldim +aldime +aldimin +aldimine +aldine +alditol +aldm +aldoheptose +aldohexose +aldoketene +aldol +aldolase +aldolases +aldolization +aldolize +aldolized +aldolizing +aldols +aldononose +aldopentose +aldose +aldoses +aldoside +aldosterone +aldosteronism +aldoxime +aldrin +aldrins +aldrovanda +aldus +ale +alea +aleak +aleatory +aleatoric +alebench +aleberry +alebion +alebush +alec +alecithal +alecithic +alecize +aleck +aleconner +alecost +alecs +alectoria +alectoriae +alectorides +alectoridine +alectorioid +alectoris +alectoromachy +alectoromancy +alectoromorphae +alectoromorphous +alectoropodes +alectoropodous +alectryomachy +alectryomancy +alectrion +alectryon +alectrionidae +alecup +alee +alef +alefnull +alefs +aleft +alefzero +alegar +alegars +aleger +alehoof +alehouse +alehouses +aleyard +aleikoum +aleikum +aleiptes +aleiptic +aleyrodes +aleyrodid +aleyrodidae +alejandro +aleknight +alem +alemana +alemanni +alemannian +alemannic +alemannish +alembic +alembicate +alembicated +alembics +alembroth +alemite +alemmal +alemonger +alen +alencon +alencons +alenge +alength +alentours +alenu +aleochara +aleph +alephs +alephzero +alepidote +alepine +alepole +alepot +aleppine +aleppo +alerce +alerion +alerse +alert +alerta +alerted +alertedly +alerter +alerters +alertest +alerting +alertly +alertness +alerts +ales +alesan +aleshot +alestake +aletap +aletaster +alethea +alethic +alethiology +alethiologic +alethiological +alethiologist +alethopteis +alethopteroid +alethoscope +aletocyte +aletris +alette +aleucaemic +aleucemic +aleukaemic +aleukemic +aleurites +aleuritic +aleurobius +aleurodes +aleurodidae +aleuromancy +aleurometer +aleuron +aleuronat +aleurone +aleurones +aleuronic +aleurons +aleuroscope +aleut +aleutian +aleutians +aleutic +aleutite +alevin +alevins +alew +alewhap +alewife +alewives +alex +alexander +alexanders +alexandra +alexandreid +alexandria +alexandrian +alexandrianism +alexandrina +alexandrine +alexandrines +alexandrite +alexas +alexia +alexian +alexias +alexic +alexin +alexine +alexines +alexinic +alexins +alexipharmacon +alexipharmacum +alexipharmic +alexipharmical +alexipyretic +alexis +alexiteric +alexiterical +alexius +alezan +alf +alfa +alfaje +alfaki +alfakis +alfalfa +alfalfas +alfaqui +alfaquin +alfaquins +alfaquis +alfarga +alfas +alfenide +alferes +alferez +alfet +alfilaria +alfileria +alfilerilla +alfilerillo +alfin +alfiona +alfione +alfirk +alfoncino +alfonsin +alfonso +alforge +alforja +alforjas +alfred +alfreda +alfresco +alfridary +alfridaric +alfur +alfurese +alfuro +alg +alga +algae +algaecide +algaeology +algaeological +algaeologist +algaesthesia +algaesthesis +algal +algalia +algarad +algarde +algaroba +algarobas +algarot +algaroth +algarroba +algarrobilla +algarrobin +algarsyf +algarsife +algas +algate +algates +algazel +algebar +algebra +algebraic +algebraical +algebraically +algebraist +algebraists +algebraization +algebraize +algebraized +algebraizing +algebras +algebrization +algedi +algedo +algedonic +algedonics +algefacient +algenib +algeria +algerian +algerians +algerienne +algerine +algerines +algerita +algerite +algernon +algesia +algesic +algesimeter +algesiometer +algesireceptor +algesis +algesthesis +algetic +algy +algic +algicidal +algicide +algicides +algid +algidity +algidities +algidness +algieba +algiers +algific +algin +alginate +alginates +algine +alginic +algins +alginuresis +algiomuscular +algist +algivorous +algocyan +algodon +algodoncillo +algodonite +algoesthesiometer +algogenic +algoid +algol +algolagny +algolagnia +algolagnic +algolagnist +algology +algological +algologically +algologies +algologist +algoman +algometer +algometry +algometric +algometrical +algometrically +algomian +algomic +algonkian +algonquian +algonquians +algonquin +algonquins +algophagous +algophilia +algophilist +algophobia +algor +algorab +algores +algorism +algorismic +algorisms +algorist +algoristic +algorithm +algorithmic +algorithmically +algorithms +algors +algosis +algous +algovite +algraphy +algraphic +alguacil +alguazil +alguifou +algum +algums +alhacena +alhagi +alhambra +alhambraic +alhambresque +alhandal +alhena +alhenna +alhet +aly +alia +alya +aliamenta +alias +aliased +aliases +aliasing +alibamu +alibangbang +alibi +alibied +alibies +alibiing +alibility +alibis +alible +alicant +alice +alichel +alichino +alicia +alicyclic +alick +alicoche +alycompaine +alictisal +alicula +aliculae +alida +alidad +alidada +alidade +alidades +alidads +alids +alien +alienability +alienabilities +alienable +alienage +alienages +alienate +alienated +alienates +alienating +alienation +alienator +aliency +aliene +aliened +alienee +alienees +aliener +alieners +alienicola +alienicolae +alienigenate +aliening +alienism +alienisms +alienist +alienists +alienize +alienly +alienness +alienor +alienors +aliens +alienship +aliesterase +aliet +aliethmoid +aliethmoidal +alif +alife +aliferous +aliform +alifs +aligerous +alight +alighted +alighten +alighting +alightment +alights +align +aligned +aligner +aligners +aligning +alignment +alignments +aligns +aligreek +alii +aliya +aliyah +aliyahaliyahs +aliyas +aliyos +aliyoth +aliipoe +alike +alikeness +alikewise +alikuluf +alikulufan +alilonghi +alima +alimenation +aliment +alimental +alimentally +alimentary +alimentariness +alimentation +alimentative +alimentatively +alimentativeness +alimented +alimenter +alimentic +alimenting +alimentive +alimentiveness +alimentotherapy +aliments +alimentum +alimony +alimonied +alimonies +alymphia +alymphopotent +alin +alinasal +aline +alineation +alined +alinement +aliner +aliners +alines +alingual +alining +alinit +alinota +alinotum +alintatao +aliofar +alioth +alipata +aliped +alipeds +aliphatic +alipin +alypin +alypine +aliptae +alipteria +alipterion +aliptes +aliptic +aliptteria +alypum +aliquant +aliquid +aliquot +aliquots +alisanders +aliseptal +alish +alisier +alisma +alismaceae +alismaceous +alismad +alismal +alismales +alismataceae +alismoid +aliso +alison +alisonite +alisos +alisp +alispheno +alisphenoid +alisphenoidal +alysson +alyssum +alyssums +alist +alister +alit +alytarch +alite +aliter +alytes +ality +alitrunk +aliturgic +aliturgical +aliunde +alive +aliveness +alives +alivincular +alix +alizarate +alizari +alizarin +alizarine +alizarins +aljama +aljamado +aljamia +aljamiado +aljamiah +aljoba +aljofaina +alk +alkahest +alkahestic +alkahestica +alkahestical +alkahests +alkaid +alkalamide +alkalemia +alkalescence +alkalescency +alkalescent +alkali +alkalic +alkalies +alkaliferous +alkalify +alkalifiable +alkalified +alkalifies +alkalifying +alkaligen +alkaligenous +alkalimeter +alkalimetry +alkalimetric +alkalimetrical +alkalimetrically +alkalin +alkaline +alkalinisation +alkalinise +alkalinised +alkalinising +alkalinity +alkalinities +alkalinization +alkalinize +alkalinized +alkalinizes +alkalinizing +alkalinuria +alkalis +alkalisable +alkalisation +alkalise +alkalised +alkaliser +alkalises +alkalising +alkalizable +alkalizate +alkalization +alkalize +alkalized +alkalizer +alkalizes +alkalizing +alkaloid +alkaloidal +alkaloids +alkalometry +alkalosis +alkalous +alkalurops +alkamin +alkamine +alkanal +alkane +alkanes +alkanet +alkanethiol +alkanets +alkanna +alkannin +alkanol +alkaphrah +alkapton +alkaptone +alkaptonuria +alkaptonuric +alkargen +alkarsin +alkarsine +alkatively +alkedavy +alkekengi +alkene +alkenes +alkenyl +alkenna +alkermes +alkes +alky +alkyd +alkide +alkyds +alkies +alkyl +alkylamine +alkylamino +alkylarylsulfonate +alkylate +alkylated +alkylates +alkylating +alkylation +alkylbenzenesulfonate +alkylbenzenesulfonates +alkylene +alkylic +alkylidene +alkylize +alkylogen +alkylol +alkyloxy +alkyls +alkin +alkine +alkyne +alkines +alkynes +alkitran +alkool +alkoran +alkoranic +alkoxy +alkoxid +alkoxide +alkoxyl +all +allabuta +allachesthesia +allactite +allaeanthus +allagite +allagophyllous +allagostemonous +allah +allay +allayed +allayer +allayers +allaying +allayment +allays +allalinite +allamanda +allamonti +allamoth +allamotti +allan +allanite +allanites +allanitic +allantiasis +allantochorion +allantoic +allantoid +allantoidal +allantoidea +allantoidean +allantoides +allantoidian +allantoin +allantoinase +allantoinuria +allantois +allantoxaidin +allanturic +allargando +allasch +allassotonic +allative +allatrate +allbone +alle +allecret +allect +allectory +allegata +allegate +allegation +allegations +allegator +allegatum +allege +allegeable +alleged +allegedly +allegement +alleger +allegers +alleges +allegheny +alleghenian +allegiance +allegiances +allegiancy +allegiant +allegiantly +allegiare +alleging +allegory +allegoric +allegorical +allegorically +allegoricalness +allegories +allegorisation +allegorise +allegorised +allegoriser +allegorising +allegorism +allegorist +allegorister +allegoristic +allegorists +allegorization +allegorize +allegorized +allegorizer +allegorizing +allegresse +allegretto +allegrettos +allegro +allegros +alley +alleyed +alleyite +alleys +alleyway +alleyways +allele +alleles +alleleu +allelic +allelism +allelisms +allelocatalytic +allelomorph +allelomorphic +allelomorphism +allelopathy +allelotropy +allelotropic +allelotropism +alleluia +alleluiah +alleluias +alleluiatic +alleluja +allelvia +allemand +allemande +allemandes +allemands +allemontite +allen +allenarly +allene +alleniate +allentando +allentato +allentiac +allentiacan +aller +allergen +allergenic +allergenicity +allergens +allergy +allergia +allergic +allergies +allergin +allergins +allergist +allergists +allergology +allerion +allesthesia +allethrin +alleve +alleviant +alleviate +alleviated +alleviater +alleviaters +alleviates +alleviating +alleviatingly +alleviation +alleviations +alleviative +alleviator +alleviatory +alleviators +allez +allgood +allgovite +allhallow +allhallows +allhallowtide +allheal +allheals +ally +alliable +alliably +alliaceae +alliaceous +alliage +alliance +allianced +alliancer +alliances +alliancing +alliant +alliaria +allicampane +allice +allicholly +alliciency +allicient +allicin +allicins +allicit +allie +allied +allies +alligate +alligated +alligating +alligation +alligations +alligator +alligatored +alligatorfish +alligatorfishes +alligatoring +alligators +allyic +allying +allyl +allylamine +allylate +allylation +allylene +allylic +allyls +allylthiourea +allineate +allineation +allionia +allioniaceae +allyou +allis +allision +alliteral +alliterate +alliterated +alliterates +alliterating +alliteration +alliterational +alliterationist +alliterations +alliterative +alliteratively +alliterativeness +alliterator +allituric +allium +alliums +allivalite +allmouth +allmouths +allness +allo +alloantibody +allobar +allobaric +allobars +allobroges +allobrogical +allocability +allocable +allocaffeine +allocatable +allocate +allocated +allocatee +allocates +allocating +allocation +allocations +allocator +allocators +allocatur +allocheiria +allochetia +allochetite +allochezia +allochiral +allochirally +allochiria +allochlorophyll +allochroic +allochroite +allochromatic +allochroous +allochthon +allochthonous +allocyanine +allocinnamic +alloclase +alloclasite +allocochick +allocryptic +allocrotonic +allocthonous +allocute +allocution +allocutive +allod +allodelphite +allodesmism +allodge +allody +allodia +allodial +allodialism +allodialist +allodiality +allodially +allodian +allodiary +allodiaries +allodies +allodification +allodium +allods +alloeosis +alloeostropha +alloeotic +alloerotic +alloerotism +allogamy +allogamies +allogamous +allogene +allogeneic +allogeneity +allogeneous +allogenic +allogenically +allograft +allograph +allographic +alloy +alloyage +alloyed +alloying +alloimmune +alloiogenesis +alloiometry +alloiometric +alloys +alloisomer +alloisomeric +alloisomerism +allokinesis +allokinetic +allokurtic +allolalia +allolalic +allomerism +allomerization +allomerize +allomerized +allomerizing +allomerous +allometry +allometric +allomorph +allomorphic +allomorphism +allomorphite +allomucic +allonge +allonges +allonym +allonymous +allonymously +allonyms +allonomous +alloo +allopalladium +allopath +allopathetic +allopathetically +allopathy +allopathic +allopathically +allopathies +allopathist +allopaths +allopatry +allopatric +allopatrically +allopelagic +allophanamid +allophanamide +allophanate +allophanates +allophane +allophanic +allophyle +allophylian +allophylic +allophylus +allophite +allophytoid +allophone +allophones +allophonic +allophonically +allophore +alloplasm +alloplasmatic +alloplasmic +alloplast +alloplasty +alloplastic +alloploidy +allopolyploid +allopolyploidy +allopsychic +allopurinol +alloquy +alloquial +alloquialism +allorhythmia +allorrhyhmia +allorrhythmic +allosaur +allosaurus +allose +allosematic +allosyndesis +allosyndetic +allosome +allosteric +allosterically +allot +alloted +allotee +allotelluric +allotheism +allotheist +allotheistic +allotheria +allothigene +allothigenetic +allothigenetically +allothigenic +allothigenous +allothimorph +allothimorphic +allothogenic +allothogenous +allotype +allotypes +allotypy +allotypic +allotypical +allotypically +allotypies +allotment +allotments +allotransplant +allotransplantation +allotrylic +allotriodontia +allotriognathi +allotriomorphic +allotriophagy +allotriophagia +allotriuria +allotrope +allotropes +allotrophic +allotropy +allotropic +allotropical +allotropically +allotropicity +allotropies +allotropism +allotropize +allotropous +allots +allottable +allotted +allottee +allottees +allotter +allottery +allotters +allotting +allover +allovers +allow +allowable +allowableness +allowably +allowance +allowanced +allowances +allowancing +allowed +allowedly +allower +allowing +allows +alloxan +alloxanate +alloxanic +alloxans +alloxantin +alloxy +alloxyproteic +alloxuraemia +alloxuremia +alloxuric +allozooid +allround +alls +allseed +allseeds +allspice +allspices +allthing +allthorn +alltud +allude +alluded +alludes +alluding +allumette +allumine +alluminor +allurance +allure +allured +allurement +allurements +allurer +allurers +allures +alluring +alluringly +alluringness +allusion +allusions +allusive +allusively +allusiveness +allusory +allutterly +alluvia +alluvial +alluvials +alluviate +alluviation +alluvio +alluvion +alluvions +alluvious +alluvium +alluviums +alluvivia +alluviviums +allwhere +allwhither +allwork +allworthy +alma +almacantar +almacen +almacenista +almach +almaciga +almacigo +almadia +almadie +almagest +almagests +almagra +almah +almahs +almain +almaine +alman +almanac +almanacs +almander +almandine +almandines +almandite +almanner +almas +alme +almeh +almehs +almeidina +almemar +almemars +almemor +almendro +almendron +almery +almerian +almeries +almeriite +almes +almice +almicore +almida +almight +almighty +almightily +almightiness +almique +almira +almirah +almistry +almner +almners +almochoden +almocrebe +almogavar +almohad +almohade +almohades +almoign +almoin +almon +almonage +almond +almondy +almondlike +almonds +almoner +almoners +almonership +almoning +almonry +almonries +almoravid +almoravide +almoravides +almose +almost +almous +alms +almsdeed +almsfolk +almsful +almsgiver +almsgiving +almshouse +almshouses +almsman +almsmen +almsmoney +almswoman +almswomen +almucantar +almuce +almuces +almud +almude +almudes +almuds +almuerzo +almug +almugs +almuredin +almury +almuten +aln +alnage +alnager +alnagership +alnaschar +alnascharism +alnath +alnein +alnico +alnicoes +alnilam +alniresinol +alnitak +alnitham +alniviridol +alnoite +alnuin +alnus +alo +aloadae +alocasia +alochia +alod +aloddia +alody +alodia +alodial +alodialism +alodialist +alodiality +alodially +alodialty +alodian +alodiary +alodiaries +alodies +alodification +alodium +aloe +aloed +aloedary +aloelike +aloemodin +aloeroot +aloes +aloesol +aloeswood +aloetic +aloetical +aloewood +aloft +alogy +alogia +alogian +alogical +alogically +alogism +alogotrophy +aloha +alohas +aloyau +aloid +aloin +aloins +alois +aloysia +aloisiite +aloysius +aloma +alomancy +alone +alonely +aloneness +along +alongships +alongshore +alongshoreman +alongside +alongst +alonso +alonsoa +alonzo +aloof +aloofe +aloofly +aloofness +aloose +alop +alopathic +alopecia +alopecias +alopecic +alopecist +alopecoid +alopecurus +alopekai +alopeke +alophas +alopias +alopiidae +alorcinic +alosa +alose +alouatta +alouatte +aloud +alouette +alouettes +alout +alow +alowe +aloxite +alp +alpaca +alpacas +alpargata +alpasotes +alpax +alpeen +alpen +alpenglow +alpenhorn +alpenhorns +alpenstock +alpenstocker +alpenstocks +alpestral +alpestrian +alpestrine +alpha +alphabet +alphabetary +alphabetarian +alphabeted +alphabetic +alphabetical +alphabetically +alphabetics +alphabetiform +alphabeting +alphabetisation +alphabetise +alphabetised +alphabetiser +alphabetising +alphabetism +alphabetist +alphabetization +alphabetize +alphabetized +alphabetizer +alphabetizers +alphabetizes +alphabetizing +alphabetology +alphabets +alphameric +alphamerical +alphamerically +alphanumeric +alphanumerical +alphanumerically +alphanumerics +alphard +alphas +alphatoluic +alphean +alphecca +alphenic +alpheratz +alpheus +alphyl +alphyls +alphin +alphyn +alphitomancy +alphitomorphous +alphol +alphonist +alphonse +alphonsin +alphonsine +alphonsism +alphonso +alphorn +alphorns +alphos +alphosis +alphosises +alpian +alpid +alpieu +alpigene +alpine +alpinely +alpinery +alpines +alpinesque +alpinia +alpiniaceae +alpinism +alpinisms +alpinist +alpinists +alpist +alpiste +alps +alpujarra +alqueire +alquier +alquifou +alraun +already +alreadiness +alright +alrighty +alroot +alruna +alrune +als +alsatia +alsatian +alsbachite +alshain +alsifilm +alsike +alsikes +alsinaceae +alsinaceous +alsine +alsmekill +also +alsoon +alsophila +alstonia +alstonidine +alstonine +alstonite +alstroemeria +alsweill +alswith +alt +altaian +altaic +altaid +altair +altaite +altaltissimo +altamira +altar +altarage +altared +altarist +altarlet +altarpiece +altarpieces +altars +altarwise +altazimuth +alter +alterability +alterable +alterableness +alterably +alterant +alterants +alterate +alteration +alterations +alterative +alteratively +altercate +altercated +altercating +altercation +altercations +altercative +altered +alteregoism +alteregoistic +alterer +alterers +altering +alterity +alterius +alterman +altern +alternacy +alternamente +alternance +alternant +alternanthera +alternaria +alternariose +alternat +alternate +alternated +alternately +alternateness +alternater +alternates +alternating +alternatingly +alternation +alternationist +alternations +alternative +alternatively +alternativeness +alternatives +alternativity +alternativo +alternator +alternators +alterne +alternifoliate +alternipetalous +alternipinnate +alternisepalous +alternity +alternize +alterocentric +alters +alterum +altesse +alteza +altezza +althaea +althaeas +althaein +althea +altheas +althein +altheine +althing +althionic +altho +althorn +althorns +although +altica +alticamelus +altify +altigraph +altilik +altiloquence +altiloquent +altimeter +altimeters +altimetry +altimetrical +altimetrically +altimettrically +altin +altincar +altingiaceae +altingiaceous +altininck +altiplanicie +altiplano +altiscope +altisonant +altisonous +altissimo +altitonant +altitude +altitudes +altitudinal +altitudinarian +altitudinous +alto +altocumulus +altogether +altogetherness +altoist +altometer +altos +altostratus +altoun +altrices +altricial +altropathy +altrose +altruism +altruisms +altruist +altruistic +altruistically +altruists +alts +altschin +altumal +altun +alture +altus +aluco +aluconidae +aluconinae +aludel +aludels +aludra +alula +alulae +alular +alulet +alulim +alum +alumbloom +alumbrado +alumel +alumen +alumetize +alumian +alumic +alumiferous +alumin +alumina +aluminaphone +aluminas +aluminate +alumine +alumines +aluminic +aluminide +aluminiferous +aluminiform +aluminyl +aluminise +aluminised +aluminish +aluminising +aluminite +aluminium +aluminize +aluminized +aluminizes +aluminizing +aluminoferric +aluminography +aluminographic +aluminose +aluminosilicate +aluminosis +aluminosity +aluminothermy +aluminothermic +aluminothermics +aluminotype +aluminous +alumins +aluminum +aluminums +alumish +alumite +alumium +alumna +alumnae +alumnal +alumni +alumniate +alumnol +alumnus +alumohydrocalcite +alumroot +alumroots +alums +alumstone +alundum +aluniferous +alunite +alunites +alunogen +alupag +alur +alure +alurgite +alushtite +aluta +alutaceous +alvah +alvan +alvar +alveary +alvearies +alvearium +alveated +alvelos +alveloz +alveola +alveolae +alveolar +alveolary +alveolariform +alveolarly +alveolars +alveolate +alveolated +alveolation +alveole +alveolectomy +alveoli +alveoliform +alveolite +alveolites +alveolitis +alveoloclasia +alveolocondylean +alveolodental +alveololabial +alveololingual +alveolonasal +alveolosubnasal +alveolotomy +alveolus +alveus +alvia +alviducous +alvin +alvina +alvine +alvissmal +alvite +alvus +alw +alway +always +alwise +alwite +alzheimer +am +ama +amaas +amabel +amabile +amability +amable +amacratic +amacrinal +amacrine +amadan +amadavat +amadavats +amadelphous +amadi +amadis +amadou +amadous +amaethon +amafingo +amaga +amah +amahs +amahuaca +amay +amain +amaine +amaist +amaister +amakebe +amakosa +amal +amala +amalaita +amalaka +amalekite +amalett +amalfian +amalfitan +amalg +amalgam +amalgamable +amalgamate +amalgamated +amalgamater +amalgamates +amalgamating +amalgamation +amalgamationist +amalgamations +amalgamative +amalgamatize +amalgamator +amalgamators +amalgamist +amalgamization +amalgamize +amalgams +amalic +amalings +amalrician +amaltas +amamau +amampondo +amanda +amande +amandin +amandine +amandus +amang +amani +amania +amanist +amanita +amanitas +amanitin +amanitine +amanitins +amanitopsis +amanori +amanous +amant +amantadine +amante +amantillo +amanuenses +amanuensis +amapa +amapondo +amar +amara +amaracus +amarant +amarantaceae +amarantaceous +amaranth +amaranthaceae +amaranthaceous +amaranthine +amaranthoid +amaranths +amaranthus +amarantine +amarantite +amarantus +amarelle +amarelles +amarettos +amarevole +amargosa +amargoso +amargosos +amaryllid +amaryllidaceae +amaryllidaceous +amaryllideous +amaryllis +amaryllises +amarillo +amarillos +amarin +amarine +amarity +amaritude +amarna +amaroid +amaroidal +amarth +amarthritis +amarvel +amas +amasesis +amass +amassable +amassed +amasser +amassers +amasses +amassette +amassing +amassment +amassments +amasta +amasthenic +amasty +amastia +amate +amated +amatembu +amaterialistic +amateur +amateurish +amateurishly +amateurishness +amateurism +amateurs +amateurship +amathophobia +amati +amating +amatito +amative +amatively +amativeness +amatol +amatols +amatory +amatorial +amatorially +amatorian +amatories +amatorio +amatorious +amatrice +amatungula +amaurosis +amaurotic +amaut +amaxomania +amaze +amazed +amazedly +amazedness +amazeful +amazement +amazer +amazers +amazes +amazia +amazilia +amazing +amazingly +amazon +amazona +amazonian +amazonism +amazonite +amazons +amazonstone +amazulu +amb +amba +ambach +ambage +ambages +ambagiosity +ambagious +ambagiously +ambagiousness +ambagitory +ambay +ambalam +amban +ambar +ambaree +ambarella +ambari +ambary +ambaries +ambaris +ambas +ambash +ambassade +ambassadeur +ambassador +ambassadorial +ambassadorially +ambassadors +ambassadorship +ambassadorships +ambassadress +ambassage +ambassy +ambassiate +ambatch +ambatoarinite +ambe +ambeer +ambeers +amber +amberfish +amberfishes +ambergrease +ambergris +ambery +amberies +amberiferous +amberina +amberite +amberjack +amberjacks +amberlike +amberoid +amberoids +amberous +ambers +ambiance +ambiances +ambicolorate +ambicoloration +ambidexter +ambidexterity +ambidexterities +ambidexterous +ambidextral +ambidextrous +ambidextrously +ambidextrousness +ambience +ambiences +ambiency +ambiens +ambient +ambients +ambier +ambigenal +ambigenous +ambigu +ambiguity +ambiguities +ambiguous +ambiguously +ambiguousness +ambilaevous +ambilateral +ambilateralaterally +ambilaterality +ambilaterally +ambilevous +ambilian +ambilogy +ambiopia +ambiparous +ambisextrous +ambisexual +ambisexuality +ambisexualities +ambisyllabic +ambisinister +ambisinistrous +ambisporangiate +ambystoma +ambystomidae +ambit +ambital +ambitendency +ambitendencies +ambitendent +ambition +ambitioned +ambitioning +ambitionist +ambitionless +ambitionlessly +ambitions +ambitious +ambitiously +ambitiousness +ambits +ambitty +ambitus +ambivalence +ambivalency +ambivalent +ambivalently +ambiversion +ambiversive +ambivert +ambiverts +amble +ambled +ambleocarpus +ambler +amblers +ambles +amblyacousia +amblyaphia +amblycephalidae +amblycephalus +amblychromatic +amblydactyla +amblygeusia +amblygon +amblygonal +amblygonite +ambling +amblingly +amblyocarpous +amblyomma +amblyope +amblyopia +amblyopic +amblyopsidae +amblyopsis +amblyoscope +amblypod +amblypoda +amblypodous +amblyrhynchus +amblystegite +amblystoma +amblosis +amblotic +ambo +amboceptoid +amboceptor +ambocoelia +ambodexter +amboina +amboyna +amboinas +amboynas +amboinese +ambolic +ambomalleal +ambon +ambones +ambonite +ambonnay +ambos +ambosexous +ambosexual +ambracan +ambrain +ambreate +ambreic +ambrein +ambrette +ambrettolide +ambry +ambrica +ambries +ambrite +ambroid +ambroids +ambrology +ambrose +ambrosia +ambrosiac +ambrosiaceae +ambrosiaceous +ambrosial +ambrosially +ambrosian +ambrosias +ambrosiate +ambrosin +ambrosine +ambrosio +ambrosterol +ambrotype +ambsace +ambsaces +ambulacra +ambulacral +ambulacriform +ambulacrum +ambulance +ambulanced +ambulancer +ambulances +ambulancing +ambulant +ambulante +ambulantes +ambulate +ambulated +ambulates +ambulating +ambulatio +ambulation +ambulative +ambulator +ambulatory +ambulatoria +ambulatorial +ambulatories +ambulatorily +ambulatorium +ambulatoriums +ambulators +ambulia +ambuling +ambulomancy +amburbial +ambury +ambuscade +ambuscaded +ambuscader +ambuscades +ambuscading +ambuscado +ambuscadoed +ambuscados +ambush +ambushed +ambusher +ambushers +ambushes +ambushing +ambushlike +ambushment +ambustion +amchoor +amdahl +amdt +ame +ameba +amebae +ameban +amebas +amebean +amebian +amebiasis +amebic +amebicidal +amebicide +amebid +amebiform +amebobacter +amebocyte +ameboid +ameboidism +amebous +amebula +amedeo +ameed +ameen +ameer +ameerate +ameerates +ameers +ameiosis +ameiotic +ameiuridae +ameiurus +ameiva +amel +amelanchier +ameland +amelcorn +amelcorns +amelet +amelia +amelification +ameliorable +ameliorableness +ameliorant +ameliorate +ameliorated +ameliorates +ameliorating +amelioration +ameliorations +ameliorativ +ameliorative +amelioratively +ameliorator +amelioratory +amellus +ameloblast +ameloblastic +amelu +amelus +amen +amenability +amenable +amenableness +amenably +amenage +amenance +amend +amendable +amendableness +amendatory +amende +amended +amender +amenders +amending +amendment +amendments +amends +amene +amenia +amenism +amenite +amenity +amenities +amenorrhea +amenorrheal +amenorrheic +amenorrho +amenorrhoea +amenorrhoeal +amenorrhoeic +amens +ament +amenta +amentaceous +amental +amenty +amentia +amentias +amentiferae +amentiferous +amentiform +aments +amentula +amentulum +amentum +amenuse +amerce +amerceable +amerced +amercement +amercements +amercer +amercers +amerces +amerciable +amerciament +amercing +america +american +americana +americanese +americanism +americanisms +americanist +americanistic +americanitis +americanization +americanize +americanized +americanizer +americanizes +americanizing +americanly +americanoid +americans +americanum +americanumancestors +americas +americaward +americawards +americium +americomania +americophobe +amerikani +amerimnon +amerind +amerindian +amerindians +amerindic +amerinds +amerism +ameristic +amerveil +amesace +amesaces +amesite +amess +ametabola +ametabole +ametaboly +ametabolia +ametabolian +ametabolic +ametabolism +ametabolous +ametallous +amethyst +amethystine +amethystlike +amethysts +amethodical +amethodically +ametoecious +ametria +ametrometer +ametrope +ametropia +ametropic +ametrous +amex +amgarn +amhar +amharic +amherstite +amhran +ami +amy +amia +amiability +amiable +amiableness +amiably +amiant +amianth +amianthiform +amianthine +amianthium +amianthoid +amianthoidal +amianthus +amiantus +amiantuses +amias +amyatonic +amic +amicability +amicabilities +amicable +amicableness +amicably +amical +amice +amiced +amices +amici +amicicide +amyclaean +amyclas +amicous +amicrobic +amicron +amicronucleate +amyctic +amictus +amicus +amid +amidase +amidases +amidate +amidated +amidating +amidation +amide +amides +amidic +amidid +amidide +amidin +amidine +amidins +amidism +amidist +amidmost +amido +amidoacetal +amidoacetic +amidoacetophenone +amidoaldehyde +amidoazo +amidoazobenzene +amidoazobenzol +amidocaffeine +amidocapric +amidocyanogen +amidofluorid +amidofluoride +amidogen +amidogens +amidoguaiacol +amidohexose +amidoketone +amidol +amidols +amidomyelin +amidon +amydon +amidone +amidophenol +amidophosphoric +amidopyrine +amidoplast +amidoplastid +amidosuccinamic +amidosulphonal +amidothiazole +amidoxy +amidoxyl +amidoxime +amidrazone +amids +amidship +amidships +amidst +amidstream +amidulin +amidward +amie +amyelencephalia +amyelencephalic +amyelencephalous +amyelia +amyelic +amyelinic +amyelonic +amyelotrophy +amyelous +amies +amiga +amigas +amygdal +amygdala +amygdalaceae +amygdalaceous +amygdalae +amygdalase +amygdalate +amygdale +amygdalectomy +amygdales +amygdalic +amygdaliferous +amygdaliform +amygdalin +amygdaline +amygdalinic +amygdalitis +amygdaloid +amygdaloidal +amygdalolith +amygdaloncus +amygdalopathy +amygdalothripsis +amygdalotome +amygdalotomy +amygdalus +amygdonitrile +amygdophenin +amygdule +amygdules +amigo +amigos +amiidae +amil +amyl +amylaceous +amylamine +amylan +amylase +amylases +amylate +amildar +amylemia +amylene +amylenes +amylenol +amiles +amylic +amylidene +amyliferous +amylin +amylo +amylocellulose +amyloclastic +amylocoagulase +amylodextrin +amylodyspepsia +amylogen +amylogenesis +amylogenic +amylogens +amylohydrolysis +amylohydrolytic +amyloid +amyloidal +amyloidoses +amyloidosis +amyloids +amyloleucite +amylolysis +amylolytic +amylom +amylome +amylometer +amylon +amylopectin +amylophagia +amylophosphate +amylophosphoric +amyloplast +amyloplastic +amyloplastid +amylopsase +amylopsin +amylose +amyloses +amylosynthesis +amylosis +amiloun +amyls +amylum +amylums +amyluria +amimia +amimide +amin +aminase +aminate +aminated +aminating +amination +aminded +amine +amines +amini +aminic +aminish +aminity +aminities +aminization +aminize +amino +aminoacetal +aminoacetanilide +aminoacetic +aminoacetone +aminoacetophenetidine +aminoacetophenone +aminoacidemia +aminoaciduria +aminoanthraquinone +aminoazo +aminoazobenzene +aminobarbituric +aminobenzaldehyde +aminobenzamide +aminobenzene +aminobenzine +aminobenzoic +aminocaproic +aminodiphenyl +amynodon +amynodont +aminoethionic +aminoformic +aminogen +aminoglutaric +aminoguanidine +aminoid +aminoketone +aminolipin +aminolysis +aminolytic +aminomalonic +aminomyelin +aminopeptidase +aminophenol +aminopherase +aminophylline +aminopyrine +aminoplast +aminoplastic +aminopolypeptidase +aminopropionic +aminopurine +aminoquin +aminoquinoline +aminosis +aminosuccinamic +aminosulphonic +aminothiophen +aminotransferase +aminotriazole +aminovaleric +aminoxylol +amins +aminta +amintor +amioidei +amyosthenia +amyosthenic +amyotaxia +amyotonia +amyotrophy +amyotrophia +amyotrophic +amyous +amir +amiray +amiral +amyraldism +amyraldist +amiranha +amirate +amirates +amire +amyridaceae +amyrin +amyris +amyrol +amyroot +amirs +amirship +amis +amish +amishgo +amiss +amissibility +amissible +amissing +amission +amissness +amit +amita +amitabha +amytal +amitate +amity +amitie +amities +amitoses +amitosis +amitotic +amitotically +amitriptyline +amitrole +amitroles +amitular +amixia +amyxorrhea +amyxorrhoea +amizilis +amla +amlacra +amlet +amli +amlikar +amlong +amma +amman +ammanite +ammelide +ammelin +ammeline +ammeos +ammer +ammeter +ammeters +ammi +ammiaceae +ammiaceous +ammine +ammines +ammino +amminochloride +amminolysis +amminolytic +ammiolite +ammiral +ammites +ammo +ammobium +ammocete +ammocetes +ammochaeta +ammochaetae +ammochryse +ammocoete +ammocoetes +ammocoetid +ammocoetidae +ammocoetiform +ammocoetoid +ammodyte +ammodytes +ammodytidae +ammodytoid +ammonal +ammonals +ammonate +ammonation +ammonea +ammonia +ammoniac +ammoniacal +ammoniacs +ammoniacum +ammoniaemia +ammonias +ammoniate +ammoniated +ammoniating +ammoniation +ammonic +ammonical +ammoniemia +ammonify +ammonification +ammonified +ammonifier +ammonifies +ammonifying +ammoniojarosite +ammonion +ammonionitrate +ammonite +ammonites +ammonitess +ammonitic +ammoniticone +ammonitiferous +ammonitish +ammonitoid +ammonitoidea +ammonium +ammoniums +ammoniuret +ammoniureted +ammoniuria +ammonization +ammono +ammonobasic +ammonocarbonic +ammonocarbonous +ammonoid +ammonoidea +ammonoidean +ammonoids +ammonolyses +ammonolysis +ammonolitic +ammonolytic +ammonolyze +ammonolyzed +ammonolyzing +ammophila +ammophilous +ammoresinol +ammoreslinol +ammos +ammotherapy +ammu +ammunition +amnemonic +amnesia +amnesiac +amnesiacs +amnesias +amnesic +amnesics +amnesty +amnestic +amnestied +amnesties +amnestying +amnia +amniac +amniatic +amnic +amnigenia +amninia +amninions +amnioallantoic +amniocentesis +amniochorial +amnioclepsis +amniomancy +amnion +amnionata +amnionate +amnionia +amnionic +amnions +amniorrhea +amnios +amniota +amniote +amniotes +amniotic +amniotin +amniotitis +amniotome +amobarbital +amober +amobyr +amoeba +amoebae +amoebaea +amoebaean +amoebaeum +amoebalike +amoeban +amoebas +amoebean +amoebeum +amoebian +amoebiasis +amoebic +amoebicidal +amoebicide +amoebid +amoebida +amoebidae +amoebiform +amoebobacter +amoebobacterieae +amoebocyte +amoebogeniae +amoeboid +amoeboidism +amoebous +amoebula +amoy +amoyan +amoibite +amoyese +amoinder +amok +amoke +amoks +amole +amoles +amolilla +amolish +amollish +amomal +amomales +amomis +amomum +among +amongst +amontillado +amontillados +amor +amora +amorado +amoraic +amoraim +amoral +amoralism +amoralist +amorality +amoralize +amorally +amores +amoret +amoretti +amoretto +amorettos +amoreuxia +amorini +amorino +amorism +amorist +amoristic +amorists +amorite +amoritic +amoritish +amornings +amorosa +amorosity +amoroso +amorous +amorously +amorousness +amorph +amorpha +amorphi +amorphy +amorphia +amorphic +amorphinism +amorphism +amorphophallus +amorphophyte +amorphotae +amorphous +amorphously +amorphousness +amorphozoa +amorphus +amort +amortisable +amortise +amortised +amortises +amortising +amortissement +amortisseur +amortizable +amortization +amortize +amortized +amortizement +amortizes +amortizing +amorua +amos +amosite +amoskeag +amotion +amotions +amotus +amouli +amount +amounted +amounter +amounters +amounting +amounts +amour +amouret +amourette +amourist +amours +amovability +amovable +amove +amoved +amoving +amowt +amp +ampalaya +ampalea +ampangabeite +amparo +ampasimenite +ampassy +ampelidaceae +ampelidaceous +ampelidae +ampelideous +ampelis +ampelite +ampelitic +ampelography +ampelographist +ampelograpny +ampelopsidin +ampelopsin +ampelopsis +ampelosicyos +ampelotherapy +amper +amperage +amperages +ampere +amperemeter +amperes +ampery +amperian +amperometer +amperometric +ampersand +ampersands +amphanthia +amphanthium +ampheclexis +ampherotoky +ampherotokous +amphetamine +amphetamines +amphi +amphiarthrodial +amphiarthroses +amphiarthrosis +amphiaster +amphib +amphibali +amphibalus +amphibia +amphibial +amphibian +amphibians +amphibichnite +amphibiety +amphibiology +amphibiological +amphibion +amphibiontic +amphibiotic +amphibiotica +amphibious +amphibiously +amphibiousness +amphibium +amphiblastic +amphiblastula +amphiblestritis +amphibola +amphibole +amphiboles +amphiboly +amphibolia +amphibolic +amphibolies +amphiboliferous +amphiboline +amphibolite +amphibolitic +amphibology +amphibological +amphibologically +amphibologies +amphibologism +amphibolostylous +amphibolous +amphibrach +amphibrachic +amphibryous +amphicarpa +amphicarpaea +amphicarpia +amphicarpic +amphicarpium +amphicarpogenous +amphicarpous +amphicarpus +amphicentric +amphichroic +amphichrom +amphichromatic +amphichrome +amphichromy +amphicyon +amphicyonidae +amphicyrtic +amphicyrtous +amphicytula +amphicoelian +amphicoelous +amphicome +amphicondyla +amphicondylous +amphicrania +amphicreatinine +amphicribral +amphictyon +amphictyony +amphictyonian +amphictyonic +amphictyonies +amphictyons +amphid +amphide +amphidesmous +amphidetic +amphidiarthrosis +amphidiploid +amphidiploidy +amphidisc +amphidiscophora +amphidiscophoran +amphidisk +amphidromia +amphidromic +amphierotic +amphierotism +amphigaea +amphigaean +amphigam +amphigamae +amphigamous +amphigastria +amphigastrium +amphigastrula +amphigean +amphigen +amphigene +amphigenesis +amphigenetic +amphigenous +amphigenously +amphigony +amphigonia +amphigonic +amphigonium +amphigonous +amphigory +amphigoric +amphigories +amphigouri +amphigouris +amphikaryon +amphikaryotic +amphilogy +amphilogism +amphimacer +amphimictic +amphimictical +amphimictically +amphimixes +amphimixis +amphimorula +amphimorulae +amphinesian +amphineura +amphineurous +amphinucleus +amphion +amphionic +amphioxi +amphioxidae +amphioxides +amphioxididae +amphioxis +amphioxus +amphioxuses +amphipeptone +amphiphithyra +amphiphloic +amphipyrenin +amphiplatyan +amphipleura +amphiploid +amphiploidy +amphipneust +amphipneusta +amphipneustic +amphipnous +amphipod +amphipoda +amphipodal +amphipodan +amphipodiform +amphipodous +amphipods +amphiprostylar +amphiprostyle +amphiprotic +amphirhina +amphirhinal +amphirhine +amphisarca +amphisbaena +amphisbaenae +amphisbaenas +amphisbaenian +amphisbaenic +amphisbaenid +amphisbaenidae +amphisbaenoid +amphisbaenous +amphiscians +amphiscii +amphisile +amphisilidae +amphispermous +amphisporangiate +amphispore +amphistylar +amphistyly +amphistylic +amphistoma +amphistomatic +amphistome +amphistomoid +amphistomous +amphistomum +amphitene +amphithalami +amphithalamus +amphithalmi +amphitheater +amphitheatered +amphitheaters +amphitheatral +amphitheatre +amphitheatric +amphitheatrical +amphitheatrically +amphitheccia +amphithecia +amphithecial +amphithecium +amphithect +amphithere +amphithyra +amphithyron +amphithyrons +amphithura +amphithuron +amphithurons +amphithurthura +amphitokal +amphitoky +amphitokous +amphitriaene +amphitricha +amphitrichate +amphitrichous +amphitryon +amphitrite +amphitron +amphitropal +amphitropous +amphitruo +amphiuma +amphiumidae +amphivasal +amphivorous +amphizoidae +amphodarch +amphodelite +amphodiplopia +amphogeny +amphogenic +amphogenous +ampholyte +ampholytic +amphopeptone +amphophil +amphophile +amphophilic +amphophilous +amphora +amphorae +amphoral +amphoras +amphore +amphorette +amphoric +amphoricity +amphoriloquy +amphoriskoi +amphoriskos +amphorophony +amphorous +amphoteric +amphotericin +amphrysian +ampyces +ampicillin +ampitheater +ampyx +ampyxes +ample +amplect +amplectant +ampleness +ampler +amplest +amplex +amplexation +amplexicaudate +amplexicaul +amplexicauline +amplexifoliate +amplexus +amplexuses +amply +ampliate +ampliation +ampliative +amplication +amplicative +amplidyne +amplify +amplifiable +amplificate +amplification +amplifications +amplificative +amplificator +amplificatory +amplified +amplifier +amplifiers +amplifies +amplifying +amplitude +amplitudes +amplitudinous +ampollosity +ampongue +ampoule +ampoules +amps +ampul +ampulate +ampulated +ampulating +ampule +ampules +ampulla +ampullaceous +ampullae +ampullar +ampullary +ampullaria +ampullariidae +ampullate +ampullated +ampulliform +ampullitis +ampullosity +ampullula +ampullulae +ampuls +amputate +amputated +amputates +amputating +amputation +amputational +amputations +amputative +amputator +amputee +amputees +amra +amreeta +amreetas +amrelle +amrit +amrita +amritas +amritsar +amsath +amsel +amsonia +amsterdam +amsterdamer +amt +amtman +amtmen +amtrac +amtrack +amtracks +amtracs +amtrak +amu +amuchco +amuck +amucks +amueixa +amugis +amuguis +amuyon +amuyong +amula +amulae +amulas +amulet +amuletic +amulets +amulla +amunam +amurca +amurcosity +amurcous +amurru +amus +amusable +amuse +amused +amusedly +amusee +amusement +amusements +amuser +amusers +amuses +amusette +amusgo +amusia +amusias +amusing +amusingly +amusingness +amusive +amusively +amusiveness +amutter +amuze +amuzzle +amvis +amzel +an +ana +anabaena +anabaenas +anabantid +anabantidae +anabaptism +anabaptist +anabaptistic +anabaptistical +anabaptistically +anabaptistry +anabaptists +anabaptize +anabaptized +anabaptizing +anabas +anabases +anabasin +anabasine +anabasis +anabasse +anabata +anabathmoi +anabathmos +anabathrum +anabatic +anaberoga +anabia +anabibazon +anabiosis +anabiotic +anablepidae +anableps +anablepses +anabo +anabohitsite +anaboly +anabolic +anabolin +anabolism +anabolite +anabolitic +anabolize +anabong +anabranch +anabrosis +anabrotic +anacahuita +anacahuite +anacalypsis +anacampsis +anacamptic +anacamptically +anacamptics +anacamptometer +anacanth +anacanthine +anacanthini +anacanthous +anacara +anacard +anacardiaceae +anacardiaceous +anacardic +anacardium +anacatadidymus +anacatharsis +anacathartic +anacephalaeosis +anacephalize +anaces +anacharis +anachoret +anachorism +anachromasis +anachronic +anachronical +anachronically +anachronism +anachronismatical +anachronisms +anachronist +anachronistic +anachronistical +anachronistically +anachronize +anachronous +anachronously +anachueta +anacyclus +anacid +anacidity +anack +anaclasis +anaclastic +anaclastics +anaclete +anacletica +anacleticum +anaclinal +anaclisis +anaclitic +anacoenoses +anacoenosis +anacolutha +anacoluthia +anacoluthic +anacoluthically +anacoluthon +anacoluthons +anacoluttha +anaconda +anacondas +anacoustic +anacreon +anacreontic +anacreontically +anacrisis +anacrogynae +anacrogynous +anacromyodian +anacrotic +anacrotism +anacruses +anacrusis +anacrustic +anacrustically +anaculture +anacusia +anacusic +anacusis +anadem +anadems +anadenia +anadesm +anadicrotic +anadicrotism +anadidymus +anadyomene +anadiplosis +anadipsia +anadipsic +anadrom +anadromous +anaematosis +anaemia +anaemias +anaemic +anaemotropy +anaeretic +anaerobation +anaerobe +anaerobes +anaerobia +anaerobian +anaerobic +anaerobically +anaerobies +anaerobion +anaerobiont +anaerobiosis +anaerobiotic +anaerobiotically +anaerobious +anaerobism +anaerobium +anaerophyte +anaeroplasty +anaeroplastic +anaesthatic +anaesthesia +anaesthesiant +anaesthesiology +anaesthesiologist +anaesthesis +anaesthetic +anaesthetically +anaesthetics +anaesthetist +anaesthetization +anaesthetize +anaesthetized +anaesthetizer +anaesthetizing +anaesthyl +anaetiological +anagalactic +anagallis +anagap +anagenesis +anagenetic +anagenetical +anagennesis +anagep +anagignoskomena +anagyrin +anagyrine +anagyris +anaglyph +anaglyphy +anaglyphic +anaglyphical +anaglyphics +anaglyphoscope +anaglyphs +anaglypta +anaglyptic +anaglyptical +anaglyptics +anaglyptograph +anaglyptography +anaglyptographic +anaglypton +anagnorises +anagnorisis +anagnost +anagnostes +anagoge +anagoges +anagogy +anagogic +anagogical +anagogically +anagogics +anagogies +anagram +anagrammatic +anagrammatical +anagrammatically +anagrammatise +anagrammatised +anagrammatising +anagrammatism +anagrammatist +anagrammatization +anagrammatize +anagrammatized +anagrammatizing +anagrammed +anagramming +anagrams +anagraph +anagua +anahao +anahau +anaheim +anahita +anay +anaitis +anakes +anakinesis +anakinetic +anakinetomer +anakinetomeric +anakoluthia +anakrousis +anaktoron +anal +analabos +analagous +analav +analcime +analcimes +analcimic +analcimite +analcite +analcites +analcitite +analecta +analectic +analects +analemma +analemmas +analemmata +analemmatic +analepses +analepsy +analepsis +analeptic +analeptical +analgen +analgene +analgesia +analgesic +analgesics +analgesidae +analgesis +analgesist +analgetic +analgia +analgias +analgic +analgize +analysability +analysable +analysand +analysands +analysation +analyse +analysed +analyser +analysers +analyses +analysing +analysis +analyst +analysts +analyt +anality +analytic +analytical +analytically +analyticity +analyticities +analytics +analities +analytique +analyzability +analyzable +analyzation +analyze +analyzed +analyzer +analyzers +analyzes +analyzing +analkalinity +anallagmatic +anallagmatis +anallantoic +anallantoidea +anallantoidean +anallergic +anally +analog +analoga +analogal +analogy +analogia +analogic +analogical +analogically +analogicalness +analogice +analogies +analogion +analogions +analogise +analogised +analogising +analogism +analogist +analogistic +analogize +analogized +analogizing +analogon +analogous +analogously +analogousness +analogs +analogue +analogues +analphabet +analphabete +analphabetic +analphabetical +analphabetism +anam +anama +anamesite +anametadromous +anamirta +anamirtin +anamite +anammonid +anammonide +anamneses +anamnesis +anamnestic +anamnestically +anamnia +anamniata +anamnionata +anamnionic +anamniota +anamniote +anamniotic +anamorphic +anamorphism +anamorphoscope +anamorphose +anamorphoses +anamorphosis +anamorphote +anamorphous +anan +anana +ananaplas +ananaples +ananas +ananda +anandrarious +anandria +anandrious +anandrous +ananepionic +anangioid +anangular +ananias +ananym +ananism +ananite +anankastic +ananke +anankes +anansi +ananta +ananter +anantherate +anantherous +ananthous +ananthropism +anapaest +anapaestic +anapaestical +anapaestically +anapaests +anapaganize +anapaite +anapanapa +anapeiratic +anapes +anapest +anapestic +anapestically +anapests +anaphalantiasis +anaphalis +anaphase +anaphases +anaphasic +anaphe +anaphia +anaphylactic +anaphylactically +anaphylactin +anaphylactogen +anaphylactogenic +anaphylactoid +anaphylatoxin +anaphylaxis +anaphyte +anaphora +anaphoral +anaphoras +anaphoria +anaphoric +anaphorical +anaphorically +anaphrodisia +anaphrodisiac +anaphroditic +anaphroditous +anaplasia +anaplasis +anaplasm +anaplasma +anaplasmoses +anaplasmosis +anaplasty +anaplastic +anapleroses +anaplerosis +anaplerotic +anapnea +anapneic +anapnoeic +anapnograph +anapnoic +anapnometer +anapodeictic +anapophyses +anapophysial +anapophysis +anapsid +anapsida +anapsidan +anapterygota +anapterygote +anapterygotism +anapterygotous +anaptychi +anaptychus +anaptyctic +anaptyctical +anaptyxes +anaptyxis +anaptomorphidae +anaptomorphus +anaptotic +anaqua +anarcestean +anarcestes +anarch +anarchal +anarchy +anarchial +anarchic +anarchical +anarchically +anarchies +anarchism +anarchist +anarchistic +anarchists +anarchize +anarcho +anarchoindividualist +anarchosyndicalism +anarchosyndicalist +anarchosocialist +anarchs +anarcotin +anareta +anaretic +anaretical +anargyroi +anargyros +anarya +anaryan +anarithia +anarithmia +anarthria +anarthric +anarthropod +anarthropoda +anarthropodous +anarthrosis +anarthrous +anarthrously +anarthrousness +anartismos +anas +anasa +anasarca +anasarcas +anasarcous +anasazi +anaschistic +anaseismic +anasitch +anaspadias +anaspalin +anaspid +anaspida +anaspidacea +anaspides +anastalsis +anastaltic +anastases +anastasia +anastasian +anastasimon +anastasimos +anastasis +anastasius +anastate +anastatic +anastatica +anastatus +anastigmat +anastigmatic +anastomos +anastomose +anastomosed +anastomoses +anastomosing +anastomosis +anastomotic +anastomus +anastrophe +anastrophy +anastrophia +anat +anatabine +anatase +anatases +anatexes +anatexis +anathem +anathema +anathemas +anathemata +anathematic +anathematical +anathematically +anathematisation +anathematise +anathematised +anathematiser +anathematising +anathematism +anathematization +anathematize +anathematized +anathematizer +anathematizes +anathematizing +anatheme +anathemize +anatherum +anatidae +anatifa +anatifae +anatifer +anatiferous +anatinacea +anatinae +anatine +anatira +anatman +anatocism +anatole +anatoly +anatolian +anatolic +anatomy +anatomic +anatomical +anatomically +anatomicals +anatomicobiological +anatomicochirurgical +anatomicomedical +anatomicopathologic +anatomicopathological +anatomicophysiologic +anatomicophysiological +anatomicosurgical +anatomies +anatomiless +anatomisable +anatomisation +anatomise +anatomised +anatomiser +anatomising +anatomism +anatomist +anatomists +anatomizable +anatomization +anatomize +anatomized +anatomizer +anatomizes +anatomizing +anatomopathologic +anatomopathological +anatopism +anatosaurus +anatox +anatoxin +anatoxins +anatreptic +anatripsis +anatripsology +anatriptic +anatron +anatropal +anatropia +anatropous +anatta +anatto +anattos +anatum +anaudia +anaudic +anaunter +anaunters +anauxite +anax +anaxagorean +anaxagorize +anaxial +anaximandrian +anaxon +anaxone +anaxonia +anazoturia +anba +anbury +anc +ancerata +ancestor +ancestorial +ancestorially +ancestors +ancestral +ancestrally +ancestress +ancestresses +ancestry +ancestrial +ancestrian +ancestries +ancha +anchat +anchietea +anchietin +anchietine +anchieutectic +anchylose +anchylosed +anchylosing +anchylosis +anchylotic +anchimonomineral +anchisaurus +anchises +anchistea +anchistopoda +anchithere +anchitherioid +anchoic +anchor +anchorable +anchorage +anchorages +anchorate +anchored +anchorer +anchoress +anchoresses +anchoret +anchoretic +anchoretical +anchoretish +anchoretism +anchorets +anchorhold +anchory +anchoring +anchorite +anchorites +anchoritess +anchoritic +anchoritical +anchoritically +anchoritish +anchoritism +anchorless +anchorlike +anchorman +anchormen +anchors +anchorwise +anchoveta +anchovy +anchovies +anchtherium +anchusa +anchusas +anchusin +anchusine +anchusins +ancien +ancience +anciency +anciennete +anciens +ancient +ancienter +ancientest +ancienty +ancientism +anciently +ancientness +ancientry +ancients +ancile +ancilia +ancilla +ancillae +ancillary +ancillaries +ancillas +ancille +ancyloceras +ancylocladus +ancylodactyla +ancylopod +ancylopoda +ancylose +ancylostoma +ancylostome +ancylostomiasis +ancylostomum +ancylus +ancipital +ancipitous +ancyrean +ancyrene +ancyroid +ancistrocladaceae +ancistrocladaceous +ancistrocladus +ancistrodon +ancistroid +ancle +ancodont +ancoly +ancome +ancon +ancona +anconad +anconagra +anconal +anconas +ancone +anconeal +anconei +anconeous +ancones +anconeus +ancony +anconitis +anconoid +ancor +ancora +ancoral +ancraophobia +ancre +ancress +ancresses +and +anda +andabata +andabatarian +andabatism +andalusian +andalusite +andaman +andamanese +andamenta +andamento +andamentos +andante +andantes +andantini +andantino +andantinos +andaqui +andaquian +andarko +andaste +ande +andean +anders +anderson +anderun +andes +andesic +andesine +andesinite +andesite +andesyte +andesites +andesytes +andesitic +andevo +andhra +andi +andy +andia +andian +andine +anding +andira +andirin +andirine +andiroba +andiron +andirons +andoke +andor +andorite +andoroba +andorobo +andorra +andorran +andouille +andouillet +andouillette +andradite +andragogy +andranatomy +andrarchy +andre +andrea +andreaea +andreaeaceae +andreaeales +andreas +andrena +andrenid +andrenidae +andrew +andrewartha +andrewsite +andria +andriana +andrias +andric +andries +andrite +androcentric +androcephalous +androcephalum +androcyte +androclclinia +androcles +androclinia +androclinium +androclus +androconia +androconium +androcracy +androcratic +androdynamous +androdioecious +androdioecism +androeccia +androecia +androecial +androecium +androgametangium +androgametophore +androgamone +androgen +androgenesis +androgenetic +androgenic +androgenous +androgens +androgyn +androgynal +androgynary +androgyne +androgyneity +androgyny +androgynia +androgynic +androgynies +androgynism +androginous +androgynous +androgynus +androgone +androgonia +androgonial +androgonidium +androgonium +andrographis +andrographolide +android +androidal +androides +androids +androkinin +androl +androlepsy +androlepsia +andromache +andromania +andromaque +andromed +andromeda +andromede +andromedotoxin +andromonoecious +andromonoecism +andromorphous +andron +andronicus +andronitis +andropetalar +andropetalous +androphagous +androphyll +androphobia +androphonomania +androphore +androphorous +androphorum +andropogon +androsace +androscoggin +androseme +androsin +androsphinges +androsphinx +androsphinxes +androsporangium +androspore +androsterone +androtauric +androtomy +ands +andvari +ane +anear +aneared +anearing +anears +aneath +anecdysis +anecdota +anecdotage +anecdotal +anecdotalism +anecdotalist +anecdotally +anecdote +anecdotes +anecdotic +anecdotical +anecdotically +anecdotist +anecdotists +anechoic +anelace +anelastic +anelasticity +anele +anelectric +anelectrode +anelectrotonic +anelectrotonus +aneled +aneles +aneling +anelytrous +anematize +anematized +anematizing +anematosis +anemia +anemias +anemic +anemically +anemious +anemobiagraph +anemochord +anemochore +anemochoric +anemochorous +anemoclastic +anemogram +anemograph +anemography +anemographic +anemographically +anemology +anemologic +anemological +anemometer +anemometers +anemometry +anemometric +anemometrical +anemometrically +anemometrograph +anemometrographic +anemometrographically +anemonal +anemone +anemonella +anemones +anemony +anemonin +anemonol +anemopathy +anemophile +anemophily +anemophilous +anemopsis +anemoscope +anemoses +anemosis +anemotactic +anemotaxis +anemotropic +anemotropism +anencephaly +anencephalia +anencephalic +anencephalotrophia +anencephalous +anencephalus +anend +anenergia +anenst +anent +anenterous +anepia +anepigraphic +anepigraphous +anepiploic +anepithymia +anerethisia +aneretic +anergy +anergia +anergias +anergic +anergies +anerythroplasia +anerythroplastic +anerly +aneroid +aneroidograph +aneroids +anerotic +anes +anesis +anesone +anesthesia +anesthesiant +anesthesimeter +anesthesiology +anesthesiologies +anesthesiologist +anesthesiologists +anesthesiometer +anesthesis +anesthetic +anesthetically +anesthetics +anesthetist +anesthetists +anesthetization +anesthetize +anesthetized +anesthetizer +anesthetizes +anesthetizing +anesthyl +anestri +anestrous +anestrus +anet +anethene +anethol +anethole +anetholes +anethols +anethum +anetic +anetiological +aneuch +aneuploid +aneuploidy +aneuria +aneuric +aneurilemmic +aneurin +aneurine +aneurism +aneurysm +aneurismal +aneurysmal +aneurismally +aneurysmally +aneurismatic +aneurysmatic +aneurisms +aneurysms +anew +anezeh +anfeeld +anfract +anfractuose +anfractuosity +anfractuous +anfractuousness +anfracture +anga +angakok +angakoks +angakut +angami +angara +angaralite +angareb +angareeb +angarep +angary +angaria +angarias +angariation +angaries +angas +angdistis +angeyok +angekkok +angekok +angekut +angel +angela +angelate +angeldom +angeleen +angeleyes +angeleno +angeles +angelet +angelfish +angelfishes +angelhood +angelic +angelica +angelical +angelically +angelicalness +angelican +angelicas +angelicic +angelicize +angelicness +angelico +angelim +angelin +angelina +angeline +angelinformal +angelique +angelito +angelize +angelized +angelizing +angellike +angelo +angelocracy +angelographer +angelolater +angelolatry +angelology +angelologic +angelological +angelomachy +angelon +angelonia +angelophany +angelophanic +angelot +angels +angelship +angelus +angeluses +anger +angered +angering +angerless +angerly +angerona +angeronalia +angers +angetenar +angevin +angia +angiasthenia +angico +angie +angiectasis +angiectopia +angiemphraxis +angiitis +angild +angili +angilo +angina +anginal +anginas +anginiform +anginoid +anginophobia +anginose +anginous +angioasthenia +angioataxia +angioblast +angioblastic +angiocardiography +angiocardiographic +angiocardiographies +angiocarditis +angiocarp +angiocarpy +angiocarpian +angiocarpic +angiocarpous +angiocavernous +angiocholecystitis +angiocholitis +angiochondroma +angiocyst +angioclast +angiodermatitis +angiodiascopy +angioelephantiasis +angiofibroma +angiogenesis +angiogeny +angiogenic +angioglioma +angiogram +angiograph +angiography +angiographic +angiohemophilia +angiohyalinosis +angiohydrotomy +angiohypertonia +angiohypotonia +angioid +angiokeratoma +angiokinesis +angiokinetic +angioleucitis +angiolymphitis +angiolymphoma +angiolipoma +angiolith +angiology +angioma +angiomalacia +angiomas +angiomata +angiomatosis +angiomatous +angiomegaly +angiometer +angiomyocardiac +angiomyoma +angiomyosarcoma +angioneoplasm +angioneurosis +angioneurotic +angionoma +angionosis +angioparalysis +angioparalytic +angioparesis +angiopathy +angiophorous +angioplany +angioplasty +angioplerosis +angiopoietic +angiopressure +angiorrhagia +angiorrhaphy +angiorrhea +angiorrhexis +angiosarcoma +angiosclerosis +angiosclerotic +angioscope +angiosymphysis +angiosis +angiospasm +angiospastic +angiosperm +angiospermae +angiospermal +angiospermatous +angiospermic +angiospermous +angiosperms +angiosporous +angiostegnosis +angiostenosis +angiosteosis +angiostomy +angiostomize +angiostrophy +angiotasis +angiotelectasia +angiotenosis +angiotensin +angiotensinase +angiothlipsis +angiotome +angiotomy +angiotonase +angiotonic +angiotonin +angiotribe +angiotripsy +angiotrophic +angiport +angka +angkhak +anglaise +angle +angleberry +angled +angledog +angledozer +anglehook +anglemeter +anglepod +anglepods +angler +anglers +angles +anglesite +anglesmith +angletouch +angletwitch +anglewing +anglewise +angleworm +angleworms +angliae +anglian +anglians +anglic +anglican +anglicanism +anglicanisms +anglicanize +anglicanly +anglicans +anglicanum +anglice +anglicisation +anglicism +anglicisms +anglicist +anglicization +anglicize +anglicized +anglicizes +anglicizing +anglify +anglification +anglimaniac +angling +anglings +anglish +anglist +anglistics +anglo +anglogaea +anglogaean +angloid +angloman +anglomane +anglomania +anglomaniac +anglophil +anglophile +anglophiles +anglophily +anglophilia +anglophiliac +anglophilic +anglophilism +anglophobe +anglophobes +anglophobia +anglophobiac +anglophobic +anglophobist +anglos +ango +angoise +angola +angolan +angolans +angolar +angolese +angor +angora +angoras +angostura +angouleme +angoumian +angraecum +angry +angrier +angriest +angrily +angriness +angrite +angst +angster +angstrom +angstroms +angsts +anguid +anguidae +anguiform +anguilla +anguillaria +anguille +anguillidae +anguilliform +anguilloid +anguillula +anguillule +anguillulidae +anguimorpha +anguine +anguineal +anguineous +anguinidae +anguiped +anguis +anguish +anguished +anguishes +anguishful +anguishing +anguishous +anguishously +angula +angular +angulare +angularia +angularity +angularities +angularization +angularize +angularly +angularness +angulate +angulated +angulately +angulateness +angulates +angulating +angulation +angulatogibbous +angulatosinuous +angule +anguliferous +angulinerved +anguloa +angulodentate +angulometer +angulose +angulosity +angulosplenial +angulous +angulus +anguria +angus +anguses +angust +angustate +angustia +angusticlave +angustifoliate +angustifolious +angustirostrate +angustisellate +angustiseptal +angustiseptate +angustura +angwantibo +angwich +anhaematopoiesis +anhaematosis +anhaemolytic +anhalamine +anhaline +anhalonidine +anhalonin +anhalonine +anhalonium +anhalouidine +anhang +anhanga +anharmonic +anhedonia +anhedonic +anhedral +anhedron +anhelation +anhele +anhelose +anhelous +anhematopoiesis +anhematosis +anhemitonic +anhemolytic +anhyd +anhydraemia +anhydraemic +anhydrate +anhydrated +anhydrating +anhydration +anhydremia +anhydremic +anhydric +anhydride +anhydrides +anhydridization +anhydridize +anhydrite +anhydrization +anhydrize +anhydroglocose +anhydromyelia +anhidrosis +anhydrosis +anhidrotic +anhydrotic +anhydrous +anhydrously +anhydroxime +anhima +anhimae +anhimidae +anhinga +anhingas +anhysteretic +anhistic +anhistous +anhungered +anhungry +ani +any +aniba +anybody +anybodyd +anybodies +anicca +anice +anychia +aniconic +aniconism +anicular +anicut +anidian +anidiomatic +anidiomatical +anidrosis +aniellidae +aniente +anientise +anigh +anight +anights +anyhow +anil +anilao +anilau +anile +anileness +anilic +anilid +anilide +anilidic +anilidoxime +aniliid +anilin +anilinctus +aniline +anilines +anilingus +anilinism +anilino +anilinophile +anilinophilous +anilins +anility +anilities +anilla +anilopyrin +anilopyrine +anils +anim +anima +animability +animable +animableness +animacule +animadversal +animadversion +animadversional +animadversions +animadversive +animadversiveness +animadvert +animadverted +animadverter +animadverting +animadverts +animal +animala +animalcula +animalculae +animalcular +animalcule +animalcules +animalculine +animalculism +animalculist +animalculous +animalculum +animalhood +animalia +animalian +animalic +animalier +animalillio +animalisation +animalise +animalised +animalish +animalising +animalism +animalist +animalistic +animality +animalities +animalivora +animalivore +animalivorous +animalization +animalize +animalized +animalizing +animally +animallike +animalness +animals +animando +animant +animas +animastic +animastical +animate +animated +animatedly +animately +animateness +animater +animaters +animates +animating +animatingly +animation +animations +animatism +animatist +animatistic +animative +animato +animatograph +animator +animators +anime +animes +animetta +animi +animikean +animikite +animine +animis +animism +animisms +animist +animistic +animists +animize +animized +animo +anymore +animose +animoseness +animosity +animosities +animoso +animotheism +animous +animus +animuses +anion +anyone +anionic +anionically +anionics +anions +anyplace +aniridia +anis +anisado +anisal +anisalcohol +anisaldehyde +anisaldoxime +anisamide +anisandrous +anisanilide +anisanthous +anisate +anisated +anischuria +anise +aniseed +aniseeds +aniseikonia +aniseikonic +aniselike +aniseroot +anises +anisette +anisettes +anisic +anisidin +anisidine +anisidino +anisil +anisyl +anisilic +anisylidene +anisobranchiate +anisocarpic +anisocarpous +anisocercal +anisochromatic +anisochromia +anisocycle +anisocytosis +anisocoria +anisocotyledonous +anisocotyly +anisocratic +anisodactyl +anisodactyla +anisodactyle +anisodactyli +anisodactylic +anisodactylous +anisodont +anisogamete +anisogametes +anisogametic +anisogamy +anisogamic +anisogamous +anisogeny +anisogenous +anisogynous +anisognathism +anisognathous +anisoiconia +anisoyl +anisoin +anisokonia +anisol +anisole +anisoles +anisoleucocytosis +anisomeles +anisomelia +anisomelus +anisomeric +anisomerous +anisometric +anisometrope +anisometropia +anisometropic +anisomyarian +anisomyodi +anisomyodian +anisomyodous +anisopetalous +anisophylly +anisophyllous +anisopia +anisopleural +anisopleurous +anisopod +anisopoda +anisopodal +anisopodous +anisopogonous +anisoptera +anisopteran +anisopterous +anisosepalous +anisospore +anisostaminous +anisostemonous +anisosthenic +anisostichous +anisostichus +anisostomous +anisotonic +anisotropal +anisotrope +anisotropy +anisotropic +anisotropical +anisotropically +anisotropies +anisotropism +anisotropous +anystidae +anisum +anisuria +anita +anither +anything +anythingarian +anythingarianism +anythings +anytime +anitinstitutionalism +anitos +anitrogenous +anyway +anyways +anywhen +anywhence +anywhere +anywhereness +anywheres +anywhy +anywhither +anywise +anywither +anjan +anjou +ankara +ankaramite +ankaratrite +ankee +anker +ankerhold +ankerite +ankerites +ankh +ankhs +ankylenteron +ankyloblepharon +ankylocheilia +ankylodactylia +ankylodontia +ankyloglossia +ankylomele +ankylomerism +ankylophobia +ankylopodia +ankylopoietic +ankyloproctia +ankylorrhinia +ankylos +ankylosaur +ankylosaurus +ankylose +ankylosed +ankyloses +ankylosing +ankylosis +ankylostoma +ankylostomiasis +ankylotia +ankylotic +ankylotome +ankylotomy +ankylurethria +ankyroid +ankle +anklebone +anklebones +anklejack +ankles +anklet +anklets +anklong +anklung +ankoli +ankou +ankus +ankuses +ankush +ankusha +ankushes +anlace +anlaces +anlage +anlagen +anlages +anlas +anlases +anlaut +anlaute +anlet +anlia +anmia +ann +anna +annabel +annabergite +annal +annale +annaly +annalia +annaline +annalism +annalist +annalistic +annalistically +annalists +annalize +annals +annam +annamese +annamite +annamitic +annapolis +annapurna +annard +annary +annas +annat +annates +annats +annatto +annattos +anne +anneal +annealed +annealer +annealers +annealing +anneals +annect +annectant +annectent +annection +annelid +annelida +annelidan +annelides +annelidian +annelidous +annelids +annelism +annellata +anneloid +annerodite +annerre +anneslia +annet +annette +annex +annexa +annexable +annexal +annexation +annexational +annexationism +annexationist +annexations +annexe +annexed +annexer +annexes +annexing +annexion +annexionist +annexitis +annexive +annexment +annexure +anni +annicut +annidalin +annie +anniellidae +annihil +annihilability +annihilable +annihilate +annihilated +annihilates +annihilating +annihilation +annihilationism +annihilationist +annihilationistic +annihilationistical +annihilative +annihilator +annihilatory +annihilators +annist +annite +anniv +anniversalily +anniversary +anniversaries +anniversarily +anniversariness +anniverse +anno +annodated +annoy +annoyance +annoyancer +annoyances +annoyed +annoyer +annoyers +annoyful +annoying +annoyingly +annoyingness +annoyment +annoyous +annoyously +annoys +annominate +annomination +annona +annonaceae +annonaceous +annonce +annot +annotate +annotated +annotater +annotates +annotating +annotation +annotations +annotative +annotatively +annotativeness +annotator +annotatory +annotators +annotine +annotinous +annotto +announce +announceable +announced +announcement +announcements +announcer +announcers +announces +announcing +annual +annualist +annualize +annualized +annually +annuals +annuary +annuation +annueler +annueller +annuent +annuisance +annuitant +annuitants +annuity +annuities +annul +annular +annulary +annularia +annularity +annularly +annulata +annulate +annulated +annulately +annulation +annulations +annule +annuler +annulet +annulets +annulettee +annuli +annulism +annullable +annullate +annullation +annulled +annuller +annulli +annulling +annulment +annulments +annuloid +annuloida +annulosa +annulosan +annulose +annuls +annulus +annuluses +annum +annumerate +annunciable +annunciade +annunciate +annunciated +annunciates +annunciating +annunciation +annunciations +annunciative +annunciator +annunciatory +annunciators +annus +anoa +anoas +anobiidae +anobing +anocarpous +anocathartic +anociassociation +anociation +anocithesia +anococcygeal +anodal +anodally +anode +anodendron +anodes +anodic +anodically +anodine +anodyne +anodynes +anodynia +anodynic +anodynous +anodization +anodize +anodized +anodizes +anodizing +anodon +anodonta +anodontia +anodos +anoegenetic +anoesia +anoesis +anoestrous +anoestrum +anoestrus +anoetic +anogenic +anogenital +anogra +anoia +anoil +anoine +anoint +anointed +anointer +anointers +anointing +anointment +anointments +anoints +anole +anoles +anoli +anolian +anolympiad +anolis +anolyte +anolytes +anomal +anomala +anomaly +anomalies +anomaliflorous +anomaliped +anomalipod +anomalism +anomalist +anomalistic +anomalistical +anomalistically +anomalocephalus +anomaloflorous +anomalogonatae +anomalogonatous +anomalon +anomalonomy +anomalopteryx +anomaloscope +anomalotrophy +anomalous +anomalously +anomalousness +anomalure +anomaluridae +anomalurus +anomatheca +anomer +anomy +anomia +anomiacea +anomic +anomie +anomies +anomiidae +anomite +anomocarpous +anomodont +anomodontia +anomoean +anomoeanism +anomoeomery +anomophyllous +anomorhomboid +anomorhomboidal +anomouran +anomphalous +anomura +anomural +anomuran +anomurous +anon +anonaceous +anonad +anonang +anoncillo +anonychia +anonym +anonyma +anonyme +anonymity +anonymities +anonymous +anonymously +anonymousness +anonyms +anonymuncule +anonol +anoopsia +anoopsias +anoperineal +anophele +anopheles +anophelinae +anopheline +anophyte +anophoria +anophthalmia +anophthalmos +anophthalmus +anopia +anopias +anopisthograph +anopisthographic +anopisthographically +anopla +anoplanthus +anoplocephalic +anoplonemertean +anoplonemertini +anoplothere +anoplotheriidae +anoplotherioid +anoplotherium +anoplotheroid +anoplura +anopluriform +anopsy +anopsia +anopsias +anopubic +anorak +anoraks +anorchi +anorchia +anorchism +anorchous +anorchus +anorectal +anorectic +anorectous +anoretic +anorexy +anorexia +anorexiant +anorexias +anorexic +anorexics +anorexies +anorexigenic +anorgana +anorganic +anorganism +anorganology +anormal +anormality +anorn +anorogenic +anorth +anorthic +anorthite +anorthitic +anorthitite +anorthoclase +anorthography +anorthographic +anorthographical +anorthographically +anorthophyre +anorthopia +anorthoscope +anorthose +anorthosite +anoscope +anoscopy +anosia +anosmatic +anosmia +anosmias +anosmic +anosognosia +anosphrasia +anosphresia +anospinal +anostosis +anostraca +anoterite +another +anotherguess +anotherkins +anotia +anotropia +anotta +anotto +anotus +anounou +anour +anoura +anoure +anourous +anous +anova +anovesical +anovulant +anovular +anovulatory +anoxaemia +anoxaemic +anoxemia +anoxemias +anoxemic +anoxia +anoxias +anoxybiosis +anoxybiotic +anoxic +anoxidative +anoxyscope +anquera +anre +ans +ansa +ansae +ansar +ansarian +ansarie +ansate +ansated +ansation +anschauung +anschluss +anseis +ansel +anselm +anselmian +anser +anserated +anseres +anseriformes +anserin +anserinae +anserine +anserines +anserous +ansi +anspessade +anstoss +anstosse +ansu +ansulate +answer +answerability +answerable +answerableness +answerably +answered +answerer +answerers +answering +answeringly +answerless +answerlessly +answers +ant +anta +antacid +antacids +antacrid +antadiform +antae +antaean +antaeus +antagony +antagonisable +antagonisation +antagonise +antagonised +antagonising +antagonism +antagonisms +antagonist +antagonistic +antagonistical +antagonistically +antagonists +antagonizable +antagonization +antagonize +antagonized +antagonizer +antagonizes +antagonizing +antaimerina +antaios +antaiva +antal +antalgesic +antalgic +antalgics +antalgol +antalkali +antalkalies +antalkaline +antalkalis +antambulacral +antanacathartic +antanaclasis +antanagoge +antanandro +antanemic +antapex +antapexes +antaphrodisiac +antaphroditic +antapices +antapocha +antapodosis +antapology +antapoplectic +antar +antara +antarala +antaranga +antarchy +antarchism +antarchist +antarchistic +antarchistical +antarctalia +antarctalian +antarctic +antarctica +antarctical +antarctically +antarctogaea +antarctogaean +antares +antarthritic +antas +antasphyctic +antasthenic +antasthmatic +antatrophic +antbird +antdom +ante +anteact +anteal +anteambulate +anteambulation +anteater +anteaters +antebaptismal +antebath +antebellum +antebrachia +antebrachial +antebrachium +antebridal +antecabinet +antecaecal +antecardium +antecavern +antecedal +antecedaneous +antecedaneously +antecede +anteceded +antecedence +antecedency +antecedent +antecedental +antecedently +antecedents +antecedes +anteceding +antecell +antecessor +antechamber +antechambers +antechapel +antechinomys +antechoir +antechoirs +antechurch +anteclassical +antecloset +antecolic +antecommunion +anteconsonantal +antecornu +antecourt +antecoxal +antecubital +antecurvature +anted +antedate +antedated +antedates +antedating +antedawn +antediluvial +antediluvially +antediluvian +antedon +antedonin +antedorsal +anteed +antefact +antefebrile +antefix +antefixa +antefixal +antefixes +anteflected +anteflexed +anteflexion +antefurca +antefurcae +antefurcal +antefuture +antegarden +antegrade +antehall +antehypophysis +antehistoric +antehuman +anteing +anteinitial +antejentacular +antejudiciary +antejuramentum +antelabium +antelation +antelegal +antelocation +antelope +antelopes +antelopian +antelopine +antelucan +antelude +anteluminary +antemarginal +antemarital +antemask +antemedial +antemeridian +antemetallic +antemetic +antemillennial +antemingent +antemortal +antemortem +antemundane +antemural +antenarial +antenatal +antenatalitial +antenati +antenatus +antenave +antenna +antennae +antennal +antennary +antennaria +antennariid +antennariidae +antennarius +antennas +antennata +antennate +antennifer +antenniferous +antenniform +antennula +antennular +antennulary +antennule +antenodal +antenoon +antenor +antenumber +antenuptial +anteoccupation +anteocular +anteopercle +anteoperculum +anteorbital +antepagment +antepagmenta +antepagments +antepalatal +antepartum +antepaschal +antepaschel +antepast +antepasts +antepatriarchal +antepectoral +antepectus +antependia +antependium +antependiums +antepenuit +antepenult +antepenultima +antepenultimate +antepenults +antephialtic +antepileptic +antepyretic +antepirrhema +antepone +anteporch +anteport +anteportico +anteporticoes +anteporticos +anteposition +anteposthumous +anteprandial +antepredicament +antepredicamental +antepreterit +antepretonic +anteprohibition +anteprostate +anteprostatic +antequalm +antereformation +antereformational +anteresurrection +anterethic +anterevolutional +anterevolutionary +antergic +anteri +anteriad +anterin +anterioyancer +anterior +anteriority +anteriorly +anteriorness +anteriors +anteroclusion +anterodorsal +anteroexternal +anterofixation +anteroflexion +anterofrontal +anterograde +anteroinferior +anterointerior +anterointernal +anterolateral +anterolaterally +anteromedial +anteromedian +anteroom +anterooms +anteroparietal +anteropygal +anteroposterior +anteroposteriorly +anterospinal +anterosuperior +anteroventral +anteroventrally +antes +antescript +antesignani +antesignanus +antespring +antestature +antesternal +antesternum +antesunrise +antesuperior +antetemple +antethem +antetype +antetypes +anteva +antevenient +anteversion +antevert +anteverted +anteverting +anteverts +antevocalic +antewar +anthdia +anthecology +anthecological +anthecologist +antheia +anthela +anthelae +anthelia +anthelices +anthelion +anthelions +anthelix +anthelminthic +anthelmintic +anthem +anthema +anthemas +anthemata +anthemed +anthemene +anthemy +anthemia +anthemideae +antheming +anthemion +anthemis +anthems +anthemwise +anther +antheraea +antheral +anthericum +antherid +antheridia +antheridial +antheridiophore +antheridium +antherids +antheriferous +antheriform +antherine +antherless +antherogenous +antheroid +antherozoid +antherozoidal +antherozooid +antherozooidal +anthers +antheses +anthesis +anthesteria +anthesteriac +anthesterin +anthesterion +anthesterol +antheximeter +anthicidae +anthidium +anthill +anthyllis +anthills +anthinae +anthine +anthypnotic +anthypophora +anthypophoretic +anthobian +anthobiology +anthocarp +anthocarpous +anthocephalous +anthoceros +anthocerotaceae +anthocerotales +anthocerote +anthochlor +anthochlorine +anthocyan +anthocyanidin +anthocyanin +anthoclinium +anthodia +anthodium +anthoecology +anthoecological +anthoecologist +anthogenesis +anthogenetic +anthogenous +anthography +anthoid +anthokyan +anthol +antholysis +antholite +antholyza +anthology +anthological +anthologically +anthologies +anthologion +anthologise +anthologised +anthologising +anthologist +anthologists +anthologize +anthologized +anthologizer +anthologizes +anthologizing +anthomania +anthomaniac +anthomedusae +anthomedusan +anthomyia +anthomyiid +anthomyiidae +anthony +anthonin +anthonomus +anthood +anthophagy +anthophagous +anthophila +anthophile +anthophilian +anthophyllite +anthophyllitic +anthophilous +anthophyta +anthophyte +anthophobia +anthophora +anthophore +anthophoridae +anthophorous +anthorine +anthos +anthosiderite +anthospermum +anthotaxy +anthotaxis +anthotropic +anthotropism +anthoxanthin +anthoxanthum +anthozoa +anthozoan +anthozoic +anthozooid +anthozoon +anthracaemia +anthracemia +anthracene +anthraceniferous +anthraces +anthrachrysone +anthracia +anthracic +anthraciferous +anthracyl +anthracin +anthracite +anthracitic +anthracitiferous +anthracitious +anthracitism +anthracitization +anthracitous +anthracnose +anthracnosis +anthracocide +anthracoid +anthracolithic +anthracomancy +anthracomarti +anthracomartian +anthracomartus +anthracometer +anthracometric +anthraconecrosis +anthraconite +anthracosaurus +anthracosilicosis +anthracosis +anthracothere +anthracotheriidae +anthracotherium +anthracotic +anthracoxen +anthradiol +anthradiquinone +anthraflavic +anthragallol +anthrahydroquinone +anthralin +anthramin +anthramine +anthranil +anthranyl +anthranilate +anthranilic +anthranoyl +anthranol +anthranone +anthraphenone +anthrapyridine +anthrapurpurin +anthraquinol +anthraquinone +anthraquinonyl +anthrarufin +anthrasilicosis +anthratetrol +anthrathiophene +anthratriol +anthrax +anthraxylon +anthraxolite +anthrenus +anthribid +anthribidae +anthryl +anthrylene +anthriscus +anthrohopobiological +anthroic +anthrol +anthrone +anthrop +anthrophore +anthropic +anthropical +anthropidae +anthropobiology +anthropobiologist +anthropocentric +anthropocentrically +anthropocentricity +anthropocentrism +anthropoclimatology +anthropoclimatologist +anthropocosmic +anthropodeoxycholic +anthropodus +anthropogenesis +anthropogenetic +anthropogeny +anthropogenic +anthropogenist +anthropogenous +anthropogeographer +anthropogeography +anthropogeographic +anthropogeographical +anthropoglot +anthropogony +anthropography +anthropographic +anthropoid +anthropoidal +anthropoidea +anthropoidean +anthropoids +anthropol +anthropolater +anthropolatry +anthropolatric +anthropolite +anthropolith +anthropolithic +anthropolitic +anthropology +anthropologic +anthropological +anthropologically +anthropologies +anthropologist +anthropologists +anthropomancy +anthropomantic +anthropomantist +anthropometer +anthropometry +anthropometric +anthropometrical +anthropometrically +anthropometrist +anthropomophitism +anthropomorph +anthropomorpha +anthropomorphic +anthropomorphical +anthropomorphically +anthropomorphidae +anthropomorphisation +anthropomorphise +anthropomorphised +anthropomorphising +anthropomorphism +anthropomorphisms +anthropomorphist +anthropomorphite +anthropomorphitic +anthropomorphitical +anthropomorphitism +anthropomorphization +anthropomorphize +anthropomorphized +anthropomorphizing +anthropomorphology +anthropomorphological +anthropomorphologically +anthropomorphosis +anthropomorphotheist +anthropomorphous +anthropomorphously +anthroponym +anthroponomy +anthroponomical +anthroponomics +anthroponomist +anthropopathy +anthropopathia +anthropopathic +anthropopathically +anthropopathism +anthropopathite +anthropophagi +anthropophagy +anthropophagic +anthropophagical +anthropophaginian +anthropophagism +anthropophagist +anthropophagistic +anthropophagit +anthropophagite +anthropophagize +anthropophagous +anthropophagously +anthropophagus +anthropophilous +anthropophysiography +anthropophysite +anthropophobia +anthropophuism +anthropophuistic +anthropopithecus +anthropopsychic +anthropopsychism +anthropos +anthroposcopy +anthroposociology +anthroposociologist +anthroposomatology +anthroposophy +anthroposophic +anthroposophical +anthroposophist +anthropoteleoclogy +anthropoteleological +anthropotheism +anthropotheist +anthropotheistic +anthropotomy +anthropotomical +anthropotomist +anthropotoxin +anthropozoic +anthropurgic +anthroropolith +anthroxan +anthroxanic +anththeridia +anthurium +anthus +anti +antiabolitionist +antiabortion +antiabrasion +antiabrin +antiabsolutist +antiacid +antiadiaphorist +antiaditis +antiadministration +antiae +antiaesthetic +antiager +antiagglutinant +antiagglutinating +antiagglutination +antiagglutinative +antiagglutinin +antiaggression +antiaggressionist +antiaggressive +antiaggressively +antiaggressiveness +antiaircraft +antialbumid +antialbumin +antialbumose +antialcoholic +antialcoholism +antialcoholist +antialdoxime +antialexin +antialien +antiamboceptor +antiamylase +antiamusement +antianaphylactogen +antianaphylaxis +antianarchic +antianarchist +antiangular +antiannexation +antiannexationist +antianopheline +antianthrax +antianthropocentric +antianthropomorphism +antiantibody +antiantidote +antiantienzyme +antiantitoxin +antianxiety +antiaphrodisiac +antiaphthic +antiapoplectic +antiapostle +antiaquatic +antiar +antiarcha +antiarchi +antiarin +antiarins +antiaris +antiaristocracy +antiaristocracies +antiaristocrat +antiaristocratic +antiaristocratical +antiaristocratically +antiarrhythmic +antiars +antiarthritic +antiascetic +antiasthmatic +antiastronomical +antiatheism +antiatheist +antiatheistic +antiatheistical +antiatheistically +antiatom +antiatoms +antiatonement +antiattrition +antiauthoritarian +antiauthoritarianism +antiautolysin +antiauxin +antibacchic +antibacchii +antibacchius +antibacterial +antibacteriolytic +antiballistic +antiballooner +antibalm +antibank +antibaryon +antibasilican +antibenzaldoxime +antiberiberin +antibias +antibibliolatry +antibigotry +antibilious +antibiont +antibiosis +antibiotic +antibiotically +antibiotics +antibishop +antiblack +antiblackism +antiblastic +antiblennorrhagic +antiblock +antiblue +antibody +antibodies +antiboss +antiboxing +antibrachial +antibreakage +antibridal +antibromic +antibubonic +antibug +antiburgher +antibusing +antic +antica +anticachectic +antical +anticalcimine +anticalculous +antically +anticalligraphic +anticamera +anticancer +anticancerous +anticapital +anticapitalism +anticapitalist +anticapitalistic +anticapitalistically +anticapitalists +anticar +anticardiac +anticardium +anticarious +anticarnivorous +anticaste +anticatalase +anticatalyst +anticatalytic +anticatalytically +anticatalyzer +anticatarrhal +anticathexis +anticathode +anticatholic +anticausotic +anticaustic +anticensorial +anticensorious +anticensoriously +anticensoriousness +anticensorship +anticentralism +anticentralist +anticentralization +anticephalalgic +anticeremonial +anticeremonialism +anticeremonialist +anticeremonially +anticeremonious +anticeremoniously +anticeremoniousness +antichamber +antichance +anticheater +antichymosin +antichlor +antichlorine +antichloristic +antichlorotic +anticholagogue +anticholinergic +anticholinesterase +antichoromanic +antichorus +antichreses +antichresis +antichretic +antichrist +antichristian +antichristianism +antichristianity +antichristianly +antichrists +antichrome +antichronical +antichronically +antichronism +antichthon +antichthones +antichurch +antichurchian +anticyclic +anticyclical +anticyclically +anticyclogenesis +anticyclolysis +anticyclone +anticyclones +anticyclonic +anticyclonically +anticynic +anticynical +anticynically +anticynicism +anticipant +anticipatable +anticipate +anticipated +anticipates +anticipating +anticipatingly +anticipation +anticipations +anticipative +anticipatively +anticipator +anticipatory +anticipatorily +anticipators +anticity +anticytolysin +anticytotoxin +anticivic +anticivil +anticivilian +anticivism +anticize +antick +anticked +anticker +anticking +anticks +antickt +anticlactic +anticlassical +anticlassicalism +anticlassicalist +anticlassically +anticlassicalness +anticlassicism +anticlassicist +anticlastic +anticlea +anticlergy +anticlerical +anticlericalism +anticlericalist +anticly +anticlimactic +anticlimactical +anticlimactically +anticlimax +anticlimaxes +anticlinal +anticline +anticlines +anticlinoria +anticlinorium +anticlnoria +anticlockwise +anticlogging +anticnemion +anticness +anticoagulan +anticoagulant +anticoagulants +anticoagulate +anticoagulating +anticoagulation +anticoagulative +anticoagulator +anticoagulin +anticodon +anticogitative +anticoincidence +anticold +anticolic +anticombination +anticomet +anticomment +anticommercial +anticommercialism +anticommercialist +anticommercialistic +anticommerciality +anticommercially +anticommercialness +anticommunism +anticommunist +anticommunistic +anticommunistical +anticommunistically +anticommunists +anticommutative +anticompetitive +anticomplement +anticomplementary +anticomplex +anticonceptionist +anticonductor +anticonfederationism +anticonfederationist +anticonfederative +anticonformist +anticonformity +anticonformities +anticonscience +anticonscription +anticonscriptive +anticonservatism +anticonservative +anticonservatively +anticonservativeness +anticonstitution +anticonstitutional +anticonstitutionalism +anticonstitutionalist +anticonstitutionally +anticontagion +anticontagionist +anticontagious +anticontagiously +anticontagiousness +anticonvellent +anticonvention +anticonventional +anticonventionalism +anticonventionalist +anticonventionally +anticonvulsant +anticonvulsive +anticor +anticorn +anticorona +anticorrosion +anticorrosive +anticorrosively +anticorrosiveness +anticorrosives +anticorset +anticosine +anticosmetic +anticosmetics +anticouncil +anticourt +anticourtier +anticous +anticovenanter +anticovenanting +anticreation +anticreational +anticreationism +anticreationist +anticreative +anticreatively +anticreativeness +anticreativity +anticreator +anticreep +anticreeper +anticreeping +anticrepuscular +anticrepuscule +anticryptic +anticryptically +anticrisis +anticritic +anticritical +anticritically +anticriticalness +anticritique +anticrochet +anticrotalic +antics +anticularia +anticult +anticum +anticus +antidactyl +antidancing +antidecalogue +antideflation +antidemocracy +antidemocracies +antidemocrat +antidemocratic +antidemocratical +antidemocratically +antidemoniac +antidepressant +antidepressants +antidepressive +antiderivative +antidetonant +antidetonating +antidiabetic +antidiastase +antidicomarian +antidicomarianite +antidictionary +antidiffuser +antidynamic +antidynasty +antidynastic +antidynastical +antidynastically +antidinic +antidiphtheria +antidiphtheric +antidiphtherin +antidiphtheritic +antidisciplinarian +antidyscratic +antidysenteric +antidisestablishmentarian +antidisestablishmentarianism +antidysuric +antidiuretic +antidivine +antidivorce +antidogmatic +antidogmatical +antidogmatically +antidogmatism +antidogmatist +antidomestic +antidomestically +antidominican +antidora +antidorcas +antidoron +antidotal +antidotally +antidotary +antidote +antidoted +antidotes +antidotical +antidotically +antidoting +antidotism +antidraft +antidrag +antidromal +antidromy +antidromic +antidromically +antidromous +antidrug +antiduke +antidumping +antiecclesiastic +antiecclesiastical +antiecclesiastically +antiecclesiasticism +antiedemic +antieducation +antieducational +antieducationalist +antieducationally +antieducationist +antiegoism +antiegoist +antiegoistic +antiegoistical +antiegoistically +antiegotism +antiegotist +antiegotistic +antiegotistical +antiegotistically +antieyestrain +antiejaculation +antielectron +antielectrons +antiemetic +antiemperor +antiempiric +antiempirical +antiempirically +antiempiricism +antiempiricist +antiendotoxin +antiendowment +antienergistic +antient +antienthusiasm +antienthusiast +antienthusiastic +antienthusiastically +antienvironmentalism +antienvironmentalist +antienvironmentalists +antienzymatic +antienzyme +antienzymic +antiepicenter +antiepileptic +antiepiscopal +antiepiscopist +antiepithelial +antierysipelas +antierosion +antierosive +antiestablishment +antietam +antiethnic +antieugenic +antievangelical +antievolution +antievolutional +antievolutionally +antievolutionary +antievolutionist +antievolutionistic +antiexpansion +antiexpansionism +antiexpansionist +antiexporting +antiexpressionism +antiexpressionist +antiexpressionistic +antiexpressive +antiexpressively +antiexpressiveness +antiextreme +antiface +antifaction +antifame +antifanatic +antifascism +antifascist +antifascists +antifat +antifatigue +antifebrile +antifebrin +antifederal +antifederalism +antifederalist +antifelon +antifelony +antifeminism +antifeminist +antifeministic +antiferment +antifermentative +antiferroelectric +antiferromagnet +antiferromagnetic +antiferromagnetism +antifertility +antifertilizer +antifeudal +antifeudalism +antifeudalist +antifeudalistic +antifeudalization +antifibrinolysin +antifibrinolysis +antifideism +antifire +antiflash +antiflattering +antiflatulent +antiflux +antifoam +antifoaming +antifoggant +antifogmatic +antiforeign +antiforeignism +antiformant +antiformin +antifouler +antifouling +antifowl +antifreeze +antifreezes +antifreezing +antifriction +antifrictional +antifrost +antifundamentalism +antifundamentalist +antifungal +antifungin +antigay +antigalactagogue +antigalactic +antigambling +antiganting +antigen +antigene +antigenes +antigenic +antigenically +antigenicity +antigens +antighostism +antigigmanic +antigyrous +antiglare +antiglyoxalase +antiglobulin +antignostic +antignostical +antigod +antigone +antigonococcic +antigonon +antigonorrheic +antigonus +antigorite +antigovernment +antigovernmental +antigovernmentally +antigraft +antigrammatical +antigrammatically +antigrammaticalness +antigraph +antigraphy +antigravitate +antigravitation +antigravitational +antigravitationally +antigravity +antigropelos +antigrowth +antiguan +antiguggler +antigun +antihalation +antiharmonist +antihectic +antihelices +antihelix +antihelixes +antihelminthic +antihemagglutinin +antihemisphere +antihemoglobin +antihemolysin +antihemolytic +antihemophilic +antihemorrhagic +antihemorrheidal +antihero +antiheroes +antiheroic +antiheroism +antiheterolysin +antihydrophobic +antihydropic +antihydropin +antihidrotic +antihierarchal +antihierarchy +antihierarchic +antihierarchical +antihierarchically +antihierarchies +antihierarchism +antihierarchist +antihygienic +antihygienically +antihylist +antihypertensive +antihypertensives +antihypnotic +antihypnotically +antihypochondriac +antihypophora +antihistamine +antihistamines +antihistaminic +antihysteric +antihistorical +antiholiday +antihormone +antihuff +antihum +antihuman +antihumanism +antihumanist +antihumanistic +antihumbuggist +antihunting +antiinflammatory +antiinflammatories +antiinstitutionalist +antiinstitutionalists +antiinsurrectionally +antiinsurrectionists +antijam +antikamnia +antikathode +antikenotoxin +antiketogen +antiketogenesis +antiketogenic +antikinase +antiking +antikings +antiknock +antiknocks +antilabor +antilaborist +antilacrosse +antilacrosser +antilactase +antilapsarian +antilapse +antileague +antileak +antileft +antilegalist +antilegomena +antilemic +antilens +antilepsis +antileptic +antilepton +antilethargic +antileukemic +antileveling +antilevelling +antilia +antiliberal +antiliberalism +antiliberalist +antiliberalistic +antiliberally +antiliberalness +antiliberals +antilibration +antilife +antilift +antilynching +antilipase +antilipoid +antiliquor +antilysin +antilysis +antilyssic +antilithic +antilytic +antilitter +antiliturgy +antiliturgic +antiliturgical +antiliturgically +antiliturgist +antillean +antilles +antilobium +antilocapra +antilocapridae +antilochus +antiloemic +antilog +antilogarithm +antilogarithmic +antilogarithms +antilogy +antilogic +antilogical +antilogies +antilogism +antilogistic +antilogistically +antilogous +antilogs +antiloimic +antilope +antilopinae +antilopine +antiloquy +antilottery +antiluetic +antiluetin +antimacassar +antimacassars +antimachination +antimachine +antimachinery +antimagistratical +antimagnetic +antimalaria +antimalarial +antimale +antimallein +antiman +antimaniac +antimaniacal +antimarian +antimark +antimartyr +antimask +antimasker +antimasks +antimason +antimasonic +antimasonry +antimasque +antimasquer +antimasquerade +antimaterialism +antimaterialist +antimaterialistic +antimaterialistically +antimatrimonial +antimatrimonialist +antimatter +antimechanism +antimechanist +antimechanistic +antimechanistically +antimechanization +antimediaeval +antimediaevalism +antimediaevalist +antimediaevally +antimedical +antimedically +antimedication +antimedicative +antimedicine +antimedieval +antimedievalism +antimedievalist +antimedievally +antimelancholic +antimellin +antimeningococcic +antimensia +antimension +antimensium +antimephitic +antimere +antimeres +antimerger +antimerging +antimeric +antimerina +antimerism +antimeristem +antimesia +antimeson +antimetabole +antimetabolite +antimetathesis +antimetathetic +antimeter +antimethod +antimethodic +antimethodical +antimethodically +antimethodicalness +antimetrical +antimetropia +antimetropic +antimiasmatic +antimycotic +antimicrobial +antimicrobic +antimilitary +antimilitarism +antimilitarist +antimilitaristic +antimilitaristically +antiministerial +antiministerialist +antiministerially +antiminsia +antiminsion +antimiscegenation +antimissile +antimission +antimissionary +antimissioner +antimystic +antimystical +antimystically +antimysticalness +antimysticism +antimythic +antimythical +antimitotic +antimixing +antimnemonic +antimodel +antimodern +antimodernism +antimodernist +antimodernistic +antimodernization +antimodernly +antimodernness +antimonarch +antimonarchal +antimonarchally +antimonarchy +antimonarchial +antimonarchic +antimonarchical +antimonarchically +antimonarchicalness +antimonarchism +antimonarchist +antimonarchistic +antimonarchists +antimonate +antimony +antimonial +antimoniate +antimoniated +antimonic +antimonid +antimonide +antimonies +antimoniferous +antimonyl +antimonious +antimonite +antimonium +antimoniuret +antimoniureted +antimoniuretted +antimonopoly +antimonopolism +antimonopolist +antimonopolistic +antimonopolization +antimonous +antimonsoon +antimoral +antimoralism +antimoralist +antimoralistic +antimorality +antimosquito +antimusical +antimusically +antimusicalness +antinarcotic +antinarcotics +antinarrative +antinational +antinationalism +antinationalist +antinationalistic +antinationalistically +antinationalists +antinationalization +antinationally +antinatural +antinaturalism +antinaturalist +antinaturalistic +antinaturally +antinaturalness +antinegro +antinegroism +antineologian +antineoplastic +antinephritic +antinepotic +antineuralgic +antineuritic +antineurotoxin +antineutral +antineutralism +antineutrality +antineutrally +antineutrino +antineutrinos +antineutron +antineutrons +anting +antinganting +antings +antinial +antinicotine +antinihilism +antinihilist +antinihilistic +antinion +antinodal +antinode +antinodes +antinoise +antinome +antinomy +antinomian +antinomianism +antinomians +antinomic +antinomical +antinomies +antinomist +antinoness +antinormal +antinormality +antinormalness +antinosarian +antinous +antinovel +antinovelist +antinovels +antinucleon +antinucleons +antinuke +antiochene +antiochian +antiochianism +antiodont +antiodontalgic +antiope +antiopelmous +antiophthalmic +antiopium +antiopiumist +antiopiumite +antioptimism +antioptimist +antioptimistic +antioptimistical +antioptimistically +antioptionist +antiorgastic +antiorthodox +antiorthodoxy +antiorthodoxly +antioxidant +antioxidants +antioxidase +antioxidizer +antioxidizing +antioxygen +antioxygenating +antioxygenation +antioxygenator +antioxygenic +antiozonant +antipacifism +antipacifist +antipacifistic +antipacifists +antipapacy +antipapal +antipapalist +antipapism +antipapist +antipapistic +antipapistical +antiparabema +antiparabemata +antiparagraphe +antiparagraphic +antiparalytic +antiparalytical +antiparallel +antiparallelogram +antiparasitic +antiparasitical +antiparasitically +antiparastatitis +antiparliament +antiparliamental +antiparliamentary +antiparliamentarian +antiparliamentarians +antiparliamentarist +antiparliamenteer +antipart +antiparticle +antiparticles +antipasch +antipascha +antipass +antipasti +antipastic +antipasto +antipastos +antipatharia +antipatharian +antipathetic +antipathetical +antipathetically +antipatheticalness +antipathy +antipathic +antipathida +antipathies +antipathist +antipathize +antipathogen +antipathogene +antipathogenic +antipatriarch +antipatriarchal +antipatriarchally +antipatriarchy +antipatriot +antipatriotic +antipatriotically +antipatriotism +antipedal +antipedobaptism +antipedobaptist +antipeduncular +antipellagric +antipendium +antipepsin +antipeptone +antiperiodic +antiperistalsis +antiperistaltic +antiperistasis +antiperistatic +antiperistatical +antiperistatically +antipersonnel +antiperspirant +antiperspirants +antiperthite +antipestilence +antipestilent +antipestilential +antipestilently +antipetalous +antipewism +antiphagocytic +antipharisaic +antipharmic +antiphase +antiphylloxeric +antiphilosophy +antiphilosophic +antiphilosophical +antiphilosophically +antiphilosophies +antiphilosophism +antiphysic +antiphysical +antiphysically +antiphysicalness +antiphysician +antiphlogistian +antiphlogistic +antiphlogistin +antiphon +antiphona +antiphonal +antiphonally +antiphonary +antiphonaries +antiphoner +antiphonetic +antiphony +antiphonic +antiphonical +antiphonically +antiphonies +antiphonon +antiphons +antiphrases +antiphrasis +antiphrastic +antiphrastical +antiphrastically +antiphthisic +antiphthisical +antipyic +antipyics +antipill +antipyonin +antipyresis +antipyretic +antipyretics +antipyryl +antipyrin +antipyrine +antipyrotic +antiplague +antiplanet +antiplastic +antiplatelet +antipleion +antiplenist +antiplethoric +antipleuritic +antiplurality +antipneumococcic +antipodagric +antipodagron +antipodal +antipode +antipodean +antipodeans +antipodes +antipodic +antipodism +antipodist +antipoetic +antipoetical +antipoetically +antipoints +antipolar +antipole +antipolemist +antipoles +antipolygamy +antipolyneuritic +antipolitical +antipolitically +antipolitics +antipollution +antipolo +antipool +antipooling +antipope +antipopery +antipopes +antipopular +antipopularization +antipopulationist +antipopulism +antiportable +antiposition +antipot +antipoverty +antipragmatic +antipragmatical +antipragmatically +antipragmaticism +antipragmatism +antipragmatist +antiprecipitin +antipredeterminant +antiprelate +antiprelatic +antiprelatism +antiprelatist +antipreparedness +antiprestidigitation +antipriest +antipriestcraft +antipriesthood +antiprime +antiprimer +antipriming +antiprinciple +antiprism +antiproductionist +antiproductive +antiproductively +antiproductiveness +antiproductivity +antiprofiteering +antiprogressive +antiprohibition +antiprohibitionist +antiprojectivity +antiprophet +antiprostate +antiprostatic +antiprotease +antiproteolysis +antiproton +antiprotons +antiprotozoal +antiprudential +antipruritic +antipsalmist +antipsychiatry +antipsychotic +antipsoric +antiptosis +antipudic +antipuritan +antiputrefaction +antiputrefactive +antiputrescent +antiputrid +antiq +antiqua +antiquary +antiquarian +antiquarianism +antiquarianize +antiquarianly +antiquarians +antiquaries +antiquarism +antiquarium +antiquartan +antiquate +antiquated +antiquatedness +antiquates +antiquating +antiquation +antique +antiqued +antiquely +antiqueness +antiquer +antiquers +antiques +antiquing +antiquist +antiquitarian +antiquity +antiquities +antiquum +antirabic +antirabies +antiracemate +antiracer +antirachitic +antirachitically +antiracial +antiracially +antiracing +antiracism +antiradiant +antiradiating +antiradiation +antiradical +antiradicalism +antiradically +antiradicals +antirailwayist +antirape +antirational +antirationalism +antirationalist +antirationalistic +antirationality +antirationally +antirattler +antireacting +antireaction +antireactionary +antireactionaries +antireactive +antirealism +antirealist +antirealistic +antirealistically +antireality +antirebating +antirecruiting +antired +antiredeposition +antireducer +antireducing +antireduction +antireductive +antireflexive +antireform +antireformer +antireforming +antireformist +antireligion +antireligionist +antireligiosity +antireligious +antireligiously +antiremonstrant +antirennet +antirennin +antirent +antirenter +antirentism +antirepublican +antirepublicanism +antireservationist +antiresonance +antiresonator +antirestoration +antireticular +antirevisionist +antirevolution +antirevolutionary +antirevolutionaries +antirevolutionist +antirheumatic +antiricin +antirickets +antiriot +antiritual +antiritualism +antiritualist +antiritualistic +antirobin +antiroyal +antiroyalism +antiroyalist +antiroll +antiromance +antiromantic +antiromanticism +antiromanticist +antirrhinum +antirumor +antirun +antirust +antirusts +antis +antisabbatarian +antisacerdotal +antisacerdotalist +antisag +antisaloon +antisalooner +antisavage +antiscabious +antiscale +antisceptic +antisceptical +antiscepticism +antischolastic +antischolastically +antischolasticism +antischool +antiscia +antiscians +antiscience +antiscientific +antiscientifically +antiscii +antiscion +antiscolic +antiscorbutic +antiscorbutical +antiscriptural +antiscripturism +antiscrofulous +antiseismic +antiselene +antisemite +antisemitic +antisemitism +antisensitivity +antisensitizer +antisensitizing +antisensuality +antisensuous +antisensuously +antisensuousness +antisepalous +antisepsin +antisepsis +antiseptic +antiseptical +antiseptically +antisepticise +antisepticised +antisepticising +antisepticism +antisepticist +antisepticize +antisepticized +antisepticizing +antiseptics +antiseption +antiseptize +antisera +antiserum +antiserums +antiserumsera +antisex +antisexist +antiship +antishipping +antisi +antisialagogue +antisialic +antisiccative +antisideric +antisilverite +antisymmetry +antisymmetric +antisymmetrical +antisimoniacal +antisyndicalism +antisyndicalist +antisyndication +antisine +antisynod +antisyphilitic +antisiphon +antisiphonal +antiskeptic +antiskeptical +antiskepticism +antiskid +antiskidding +antislavery +antislaveryism +antislickens +antislip +antismog +antismoking +antismut +antisnapper +antisnob +antisocial +antisocialist +antisocialistic +antisocialistically +antisociality +antisocially +antisolar +antisophism +antisophist +antisophistic +antisophistication +antisophistry +antisoporific +antispace +antispadix +antispasis +antispasmodic +antispasmodics +antispast +antispastic +antispectroscopic +antispeculation +antispermotoxin +antispiritual +antispiritualism +antispiritualist +antispiritualistic +antispiritually +antispirochetic +antisplasher +antisplenetic +antisplitting +antispreader +antispreading +antisquama +antisquatting +antistadholder +antistadholderian +antistalling +antistaphylococcic +antistat +antistate +antistater +antistatic +antistatism +antistatist +antisteapsin +antisterility +antistes +antistimulant +antistimulation +antistock +antistreptococcal +antistreptococcic +antistreptococcin +antistreptococcus +antistrike +antistriker +antistrophal +antistrophe +antistrophic +antistrophically +antistrophize +antistrophon +antistrumatic +antistrumous +antisubmarine +antisubstance +antisudoral +antisudorific +antisuffrage +antisuffragist +antisun +antisupernatural +antisupernaturalism +antisupernaturalist +antisupernaturalistic +antisurplician +antitabetic +antitabloid +antitangent +antitank +antitarnish +antitarnishing +antitartaric +antitax +antitaxation +antiteetotalism +antitegula +antitemperance +antitetanic +antitetanolysin +antithalian +antitheft +antitheism +antitheist +antitheistic +antitheistical +antitheistically +antithenar +antitheology +antitheologian +antitheological +antitheologizing +antithermic +antithermin +antitheses +antithesis +antithesism +antithesize +antithet +antithetic +antithetical +antithetically +antithetics +antithyroid +antithrombic +antithrombin +antitintinnabularian +antitypal +antitype +antitypes +antityphoid +antitypy +antitypic +antitypical +antitypically +antitypous +antityrosinase +antitobacco +antitobacconal +antitobacconist +antitonic +antitorpedo +antitoxic +antitoxin +antitoxine +antitoxins +antitrade +antitrades +antitradition +antitraditional +antitraditionalist +antitraditionally +antitragal +antitragi +antitragic +antitragicus +antitragus +antitrinitarian +antitrypsin +antitryptic +antitrismus +antitrochanter +antitropal +antitrope +antitropy +antitropic +antitropical +antitropous +antitrust +antitruster +antitubercular +antituberculin +antituberculosis +antituberculotic +antituberculous +antitumor +antitumoral +antiturnpikeism +antitussive +antitwilight +antiuating +antiunion +antiunionist +antiuratic +antiurease +antiusurious +antiutilitarian +antiutilitarianism +antivaccination +antivaccinationist +antivaccinator +antivaccinist +antivariolous +antivenefic +antivenene +antivenereal +antivenin +antivenine +antivenins +antivenom +antivenomous +antivermicular +antivibrating +antivibrator +antivibratory +antivice +antiviral +antivirotic +antivirus +antivitalist +antivitalistic +antivitamin +antivivisection +antivivisectionist +antivivisectionists +antivolition +antiwar +antiwarlike +antiwaste +antiwear +antiwedge +antiweed +antiwhite +antiwhitism +antiwit +antiworld +antixerophthalmic +antizealot +antizymic +antizymotic +antizoea +antjar +antler +antlered +antlerite +antlerless +antlers +antlia +antliate +antlid +antlike +antling +antlion +antlions +antlophobia +antluetic +antocular +antodontalgic +antoeci +antoecian +antoecians +antoinette +anton +antonella +antony +antonia +antonym +antonymy +antonymic +antonymies +antonymous +antonyms +antonina +antoniniani +antoninianus +antonio +antonomasy +antonomasia +antonomastic +antonomastical +antonomastically +antonovics +antorbital +antozone +antozonite +antproof +antra +antral +antralgia +antre +antrectomy +antres +antrin +antritis +antrocele +antronasal +antrophore +antrophose +antrorse +antrorsely +antroscope +antroscopy +antrostomus +antrotympanic +antrotympanitis +antrotome +antrotomy +antroversion +antrovert +antrum +antrums +antrustion +antrustionship +ants +antship +antshrike +antsy +antsier +antsiest +antsigne +antthrush +antu +antum +antwerp +antwise +anubin +anubing +anubis +anucleate +anucleated +anukabiet +anukit +anuloma +anunder +anura +anural +anuran +anurans +anureses +anuresis +anuretic +anury +anuria +anurias +anuric +anurous +anus +anuses +anusim +anusvara +anutraminosa +anvasser +anvil +anviled +anviling +anvilled +anvilling +anvils +anvilsmith +anviltop +anviltops +anxiety +anxieties +anxietude +anxiolytic +anxious +anxiously +anxiousness +anzac +anzanian +ao +aob +aogiri +aoife +aoli +aonach +aonian +aor +aorist +aoristic +aoristically +aorists +aorta +aortae +aortal +aortarctia +aortas +aortectasia +aortectasis +aortic +aorticorenal +aortism +aortitis +aortoclasia +aortoclasis +aortography +aortographic +aortographies +aortoiliac +aortolith +aortomalacia +aortomalaxis +aortopathy +aortoptosia +aortoptosis +aortorrhaphy +aortosclerosis +aortostenosis +aortotomy +aosmic +aotea +aotearoa +aotes +aotus +aouad +aouads +aoudad +aoudads +aouellimiden +aoul +ap +apa +apabhramsa +apace +apache +apaches +apachette +apachism +apachite +apadana +apaesthesia +apaesthetic +apaesthetize +apaestically +apagoge +apagoges +apagogic +apagogical +apagogically +apagogue +apay +apayao +apaid +apair +apaise +apalachee +apalit +apama +apanage +apanaged +apanages +apanaging +apandry +apanteles +apantesis +apanthropy +apanthropia +apar +aparai +aparaphysate +aparavidya +apardon +aparejo +aparejos +apargia +aparithmesis +apart +apartado +apartheid +aparthrosis +apartment +apartmental +apartments +apartness +apasote +apass +apast +apastra +apastron +apasttra +apatan +apatela +apatetic +apathaton +apatheia +apathetic +apathetical +apathetically +apathy +apathia +apathic +apathies +apathism +apathist +apathistical +apathize +apathogenic +apathus +apatite +apatites +apatornis +apatosaurus +apaturia +ape +apeak +apectomy +aped +apedom +apeek +apehood +apeiron +apeirophobia +apelet +apelike +apeling +apelles +apellous +apeman +apemantus +apennine +apennines +apenteric +apepsy +apepsia +apepsinia +apeptic +aper +aperch +apercu +apercus +aperea +apery +aperient +aperients +aperies +aperiodic +aperiodically +aperiodicity +aperispermic +aperistalsis +aperitif +aperitifs +aperitive +apers +apersee +apert +apertion +apertly +apertness +apertometer +apertum +apertural +aperture +apertured +apertures +aperu +aperulosid +apes +apesthesia +apesthetic +apesthetize +apetalae +apetaly +apetalies +apetaloid +apetalose +apetalous +apetalousness +apex +apexed +apexes +apexing +aph +aphacia +aphacial +aphacic +aphaeresis +aphaeretic +aphagia +aphagias +aphakia +aphakial +aphakic +aphanapteryx +aphanes +aphanesite +aphaniptera +aphanipterous +aphanisia +aphanisis +aphanite +aphanites +aphanitic +aphanitism +aphanomyces +aphanophyre +aphanozygous +apharsathacites +aphasia +aphasiac +aphasiacs +aphasias +aphasic +aphasics +aphasiology +aphelandra +aphelenchus +aphelia +aphelian +aphelilia +aphelilions +aphelinus +aphelion +apheliotropic +apheliotropically +apheliotropism +aphelops +aphemia +aphemic +aphengescope +aphengoscope +aphenoscope +apheresis +apheretic +apheses +aphesis +apheta +aphetic +aphetically +aphetism +aphetize +aphicidal +aphicide +aphid +aphides +aphidian +aphidians +aphidicide +aphidicolous +aphidid +aphididae +aphidiinae +aphidious +aphidius +aphidivorous +aphidlion +aphidolysin +aphidophagous +aphidozer +aphydrotropic +aphydrotropism +aphids +aphilanthropy +aphylly +aphyllies +aphyllose +aphyllous +aphyric +aphis +aphislion +aphizog +aphlaston +aphlebia +aphlogistic +aphnology +aphodal +aphodi +aphodian +aphodius +aphodus +apholate +apholates +aphony +aphonia +aphonias +aphonic +aphonics +aphonous +aphoria +aphorise +aphorised +aphoriser +aphorises +aphorising +aphorism +aphorismatic +aphorismer +aphorismic +aphorismical +aphorismos +aphorisms +aphorist +aphoristic +aphoristical +aphoristically +aphorists +aphorize +aphorized +aphorizer +aphorizes +aphorizing +aphoruridae +aphotaxis +aphotic +aphototactic +aphototaxis +aphototropic +aphototropism +aphra +aphrasia +aphrite +aphrizite +aphrodesiac +aphrodisia +aphrodisiac +aphrodisiacal +aphrodisiacs +aphrodisian +aphrodisiomania +aphrodisiomaniac +aphrodisiomaniacal +aphrodision +aphrodistic +aphrodite +aphroditeum +aphroditic +aphroditidae +aphroditous +aphrolite +aphronia +aphronitre +aphrosiderite +aphtha +aphthae +aphthartodocetae +aphthartodocetic +aphthartodocetism +aphthic +aphthitalite +aphthoid +aphthong +aphthongal +aphthongia +aphthonite +aphthous +apiaca +apiaceae +apiaceous +apiales +apian +apiararies +apiary +apiarian +apiarians +apiaries +apiarist +apiarists +apiator +apicad +apical +apically +apices +apicial +apician +apicifixed +apicilar +apicillary +apicitis +apickaback +apickback +apickpack +apicoectomy +apicolysis +apicula +apicular +apiculate +apiculated +apiculation +apiculi +apicultural +apiculture +apiculturist +apiculus +apidae +apiece +apieces +apigenin +apii +apiin +apikores +apikoros +apikorsim +apilary +apili +apimania +apimanias +apina +apinae +apinage +apinch +aping +apinoid +apio +apioceridae +apiocrinite +apioid +apioidal +apiol +apiole +apiolin +apiology +apiologies +apiologist +apyonin +apionol +apios +apiose +apiosoma +apiphobia +apyrase +apyrases +apyrene +apyretic +apyrexy +apyrexia +apyrexial +apyrotype +apyrous +apis +apish +apishamore +apishly +apishness +apism +apitong +apitpat +apium +apivorous +apjohnite +apl +aplace +aplacental +aplacentalia +aplacentaria +aplacophora +aplacophoran +aplacophorous +aplanat +aplanatic +aplanatically +aplanatism +aplanobacter +aplanogamete +aplanospore +aplasia +aplasias +aplastic +aplectrum +aplenty +aplysia +aplite +aplites +aplitic +aplobasalt +aplodiorite +aplodontia +aplodontiidae +aplomb +aplombs +aplome +aplopappus +aploperistomatous +aplostemonous +aplotaxene +aplotomy +apluda +aplustra +aplustre +aplustria +apnea +apneal +apneas +apneic +apneumatic +apneumatosis +apneumona +apneumonous +apneusis +apneustic +apnoea +apnoeal +apnoeas +apnoeic +apoaconitine +apoapsides +apoapsis +apoatropine +apobiotic +apoblast +apocaffeine +apocalypse +apocalypses +apocalypst +apocalypt +apocalyptic +apocalyptical +apocalyptically +apocalypticism +apocalyptism +apocalyptist +apocamphoric +apocarp +apocarpy +apocarpies +apocarpous +apocarps +apocatastasis +apocatastatic +apocatharsis +apocathartic +apocenter +apocentre +apocentric +apocentricity +apocha +apochae +apocholic +apochromat +apochromatic +apochromatism +apocynaceae +apocynaceous +apocinchonine +apocyneous +apocynthion +apocynthions +apocynum +apocyte +apocodeine +apocopate +apocopated +apocopating +apocopation +apocope +apocopes +apocopic +apocrenic +apocrine +apocryph +apocrypha +apocryphal +apocryphalist +apocryphally +apocryphalness +apocryphate +apocryphon +apocrisiary +apocrita +apocrustic +apod +apoda +apodal +apodan +apodedeipna +apodeictic +apodeictical +apodeictically +apodeipna +apodeipnon +apodeixis +apodema +apodemal +apodemas +apodemata +apodematal +apodeme +apodes +apodia +apodiabolosis +apodictic +apodictical +apodictically +apodictive +apodidae +apodioxis +apodyteria +apodyterium +apodixis +apodoses +apodosis +apodous +apods +apoembryony +apoenzyme +apofenchene +apoferritin +apogaeic +apogaic +apogalacteum +apogamy +apogamic +apogamically +apogamies +apogamous +apogamously +apogeal +apogean +apogee +apogees +apogeic +apogeny +apogenous +apogeotropic +apogeotropically +apogeotropism +apogon +apogonid +apogonidae +apograph +apographal +apographic +apographical +apoharmine +apohyal +apoidea +apoikia +apoious +apoise +apojove +apokatastasis +apokatastatic +apokrea +apokreos +apolar +apolarity +apolaustic +apolegamic +apolysin +apolysis +apolista +apolistan +apolitical +apolitically +apolytikion +apollinarian +apollinarianism +apolline +apollinian +apollyon +apollo +apollonia +apollonian +apollonic +apollonicon +apollonistic +apollos +apolloship +apolog +apologal +apologer +apologete +apologetic +apologetical +apologetically +apologetics +apology +apologia +apologiae +apologias +apological +apologies +apologise +apologised +apologiser +apologising +apologist +apologists +apologize +apologized +apologizer +apologizers +apologizes +apologizing +apologs +apologue +apologues +apolousis +apolune +apolunes +apolusis +apomecometer +apomecometry +apometaboly +apometabolic +apometabolism +apometabolous +apomict +apomictic +apomictical +apomictically +apomicts +apomixes +apomixis +apomorphia +apomorphin +apomorphine +aponeurology +aponeurorrhaphy +aponeuroses +aponeurosis +aponeurositis +aponeurotic +aponeurotome +aponeurotomy +aponia +aponic +aponogeton +aponogetonaceae +aponogetonaceous +apoop +apopemptic +apopenptic +apopetalous +apophantic +apophasis +apophatic +apophyeeal +apophyge +apophyges +apophylactic +apophylaxis +apophyllite +apophyllous +apophis +apophysary +apophysate +apophyseal +apophyses +apophysial +apophysis +apophysitis +apophlegm +apophlegmatic +apophlegmatism +apophony +apophonia +apophonic +apophonies +apophorometer +apophthegm +apophthegmatic +apophthegmatical +apophthegmatist +apopyle +apoplasmodial +apoplastogamous +apoplectic +apoplectical +apoplectically +apoplectiform +apoplectoid +apoplex +apoplexy +apoplexies +apoplexious +apoquinamine +apoquinine +aporetic +aporetical +aporhyolite +aporia +aporiae +aporias +aporobranchia +aporobranchian +aporobranchiata +aporocactus +aporosa +aporose +aporphin +aporphine +aporrhaidae +aporrhais +aporrhaoid +aporrhea +aporrhegma +aporrhiegma +aporrhoea +aport +aportlast +aportoise +aposafranine +aposaturn +aposaturnium +aposelene +aposematic +aposematically +aposepalous +aposia +aposiopeses +aposiopesis +aposiopestic +aposiopetic +apositia +apositic +aposoro +apospory +aposporic +apospories +aposporogony +aposporous +apostacy +apostacies +apostacize +apostasy +apostasies +apostasis +apostate +apostates +apostatic +apostatical +apostatically +apostatise +apostatised +apostatising +apostatism +apostatize +apostatized +apostatizes +apostatizing +apostaxis +apostem +apostemate +apostematic +apostemation +apostematous +aposteme +aposteriori +aposthia +aposthume +apostil +apostille +apostils +apostle +apostlehood +apostles +apostleship +apostleships +apostoile +apostolate +apostoless +apostoli +apostolian +apostolic +apostolical +apostolically +apostolicalness +apostolici +apostolicism +apostolicity +apostolize +apostolos +apostrophal +apostrophation +apostrophe +apostrophes +apostrophi +apostrophic +apostrophied +apostrophise +apostrophised +apostrophising +apostrophize +apostrophized +apostrophizes +apostrophizing +apostrophus +apostume +apotactic +apotactici +apotactite +apotelesm +apotelesmatic +apotelesmatical +apothec +apothecal +apothecarcaries +apothecary +apothecaries +apothecaryship +apothece +apotheces +apothecia +apothecial +apothecium +apothegm +apothegmatic +apothegmatical +apothegmatically +apothegmatist +apothegmatize +apothegms +apothem +apothems +apotheose +apotheoses +apotheosis +apotheosise +apotheosised +apotheosising +apotheosize +apotheosized +apotheosizing +apothesine +apothesis +apothgm +apotihecal +apotype +apotypic +apotome +apotracheal +apotropaic +apotropaically +apotropaion +apotropaism +apotropous +apoturmeric +apout +apoxesis +apoxyomenos +apozem +apozema +apozemical +apozymase +app +appay +appair +appal +appalachia +appalachian +appalachians +appale +appall +appalled +appalling +appallingly +appallingness +appallment +appalls +appalment +appaloosa +appaloosas +appals +appalto +appanage +appanaged +appanages +appanaging +appanagist +appar +apparail +apparance +apparat +apparatchik +apparatchiki +apparatchiks +apparation +apparats +apparatus +apparatuses +apparel +appareled +appareling +apparelled +apparelling +apparelment +apparels +apparence +apparency +apparencies +apparens +apparent +apparentation +apparentement +apparentements +apparently +apparentness +apparition +apparitional +apparitions +apparitor +appartement +appassionata +appassionatamente +appassionate +appassionato +appast +appaume +appaumee +appd +appeach +appeacher +appeachment +appeal +appealability +appealable +appealed +appealer +appealers +appealing +appealingly +appealingness +appeals +appear +appearance +appearanced +appearances +appeared +appearer +appearers +appearing +appears +appeasable +appeasableness +appeasably +appease +appeased +appeasement +appeasements +appeaser +appeasers +appeases +appeasing +appeasingly +appeasive +appel +appellability +appellable +appellancy +appellant +appellants +appellate +appellation +appellational +appellations +appellative +appellatived +appellatively +appellativeness +appellatory +appellee +appellees +appellor +appellors +appels +appenage +append +appendage +appendaged +appendages +appendalgia +appendance +appendancy +appendant +appendectomy +appendectomies +appended +appendence +appendency +appendent +appender +appenders +appendical +appendicalgia +appendicate +appendice +appendiceal +appendicectasis +appendicectomy +appendicectomies +appendices +appendicial +appendicious +appendicitis +appendicle +appendicocaecostomy +appendicostomy +appendicular +appendicularia +appendicularian +appendiculariidae +appendiculata +appendiculate +appendiculated +appending +appenditious +appendix +appendixed +appendixes +appendixing +appendorontgenography +appendotome +appends +appennage +appense +appentice +appenzell +apperceive +apperceived +apperceiving +apperception +apperceptionism +apperceptionist +apperceptionistic +apperceptive +apperceptively +appercipient +appere +apperil +appersonation +appersonification +appert +appertain +appertained +appertaining +appertainment +appertains +appertinent +appertise +appestat +appestats +appet +appete +appetence +appetency +appetencies +appetent +appetently +appetibility +appetible +appetibleness +appetiser +appetising +appetisse +appetit +appetite +appetites +appetition +appetitional +appetitious +appetitive +appetitiveness +appetitost +appetize +appetized +appetizement +appetizer +appetizers +appetizing +appetizingly +appinite +appius +appl +applanate +applanation +applaud +applaudable +applaudably +applauded +applauder +applauders +applauding +applaudingly +applauds +applause +applauses +applausive +applausively +apple +appleberry +appleblossom +applecart +appled +appledrane +appledrone +applegrower +applejack +applejohn +applemonger +applenut +appleringy +appleringie +appleroot +apples +applesauce +applesnits +applewife +applewoman +applewood +apply +appliable +appliableness +appliably +appliance +appliances +appliant +applicability +applicabilities +applicable +applicableness +applicably +applicancy +applicant +applicants +applicate +application +applications +applicative +applicatively +applicator +applicatory +applicatorily +applicators +applied +appliedly +applier +appliers +applies +applying +applyingly +applyment +appling +applique +appliqued +appliqueing +appliques +applosion +applosive +applot +applotment +appmt +appoggiatura +appoggiaturas +appoggiature +appoint +appointable +appointe +appointed +appointee +appointees +appointer +appointers +appointing +appointive +appointively +appointment +appointments +appointor +appoints +appomatox +appomattoc +appomattox +apport +apportion +apportionable +apportionate +apportioned +apportioner +apportioning +apportionment +apportionments +apportions +apposability +apposable +appose +apposed +apposer +apposers +apposes +apposing +apposiopestic +apposite +appositely +appositeness +apposition +appositional +appositionally +appositions +appositive +appositively +apppetible +appraisable +appraisal +appraisals +appraise +appraised +appraisement +appraiser +appraisers +appraises +appraising +appraisingly +appraisive +apprecate +appreciable +appreciably +appreciant +appreciate +appreciated +appreciates +appreciating +appreciatingly +appreciation +appreciational +appreciations +appreciativ +appreciative +appreciatively +appreciativeness +appreciator +appreciatory +appreciatorily +appreciators +appredicate +apprehend +apprehendable +apprehended +apprehender +apprehending +apprehendingly +apprehends +apprehensibility +apprehensible +apprehensibly +apprehension +apprehensions +apprehensive +apprehensively +apprehensiveness +apprend +apprense +apprentice +apprenticed +apprenticehood +apprenticement +apprentices +apprenticeship +apprenticeships +apprenticing +appress +appressed +appressor +appressoria +appressorial +appressorium +apprest +appreteur +appreve +apprise +apprised +appriser +apprisers +apprises +apprising +apprizal +apprize +apprized +apprizement +apprizer +apprizers +apprizes +apprizing +appro +approach +approachability +approachabl +approachable +approachableness +approached +approacher +approachers +approaches +approaching +approachless +approachment +approbate +approbated +approbating +approbation +approbations +approbative +approbativeness +approbator +approbatory +apprompt +approof +appropinquate +appropinquation +appropinquity +appropre +appropriable +appropriament +appropriate +appropriated +appropriately +appropriateness +appropriates +appropriating +appropriation +appropriations +appropriative +appropriativeness +appropriator +appropriators +approvability +approvable +approvableness +approvably +approval +approvals +approvance +approve +approved +approvedly +approvedness +approvement +approver +approvers +approves +approving +approvingly +approx +approximable +approximal +approximant +approximants +approximate +approximated +approximately +approximates +approximating +approximation +approximations +approximative +approximatively +approximativeness +approximator +appt +apptd +appui +appulse +appulses +appulsion +appulsive +appulsively +appunctuation +appurtenance +appurtenances +appurtenant +apr +apractic +apraxia +apraxias +apraxic +apreynte +aprendiz +apres +apricate +aprication +aprickle +apricot +apricots +april +aprilesque +apriline +aprilis +apriori +apriorism +apriorist +aprioristic +aprioristically +apriority +apritif +aprocta +aproctia +aproctous +apron +aproned +aproneer +apronful +aproning +apronless +apronlike +aprons +apronstring +apropos +aprosexia +aprosopia +aprosopous +aproterodont +aprowl +apse +apselaphesia +apselaphesis +apses +apsychia +apsychical +apsid +apsidal +apsidally +apsides +apsidiole +apsinthion +apsis +apt +aptal +aptate +aptenodytes +apter +aptera +apteral +apteran +apteria +apterial +apteryges +apterygial +apterygidae +apterygiformes +apterygogenea +apterygota +apterygote +apterygotous +apteryla +apterium +apteryx +apteryxes +apteroid +apterous +aptest +aptyalia +aptyalism +aptian +aptiana +aptychus +aptitude +aptitudes +aptitudinal +aptitudinally +aptly +aptness +aptnesses +aptote +aptotic +apts +apulian +apulmonic +apulse +apurpose +apus +apx +aq +aqua +aquabelle +aquabib +aquacade +aquacades +aquacultural +aquaculture +aquadag +aquaduct +aquaducts +aquae +aquaemanale +aquaemanalia +aquafer +aquafortis +aquafortist +aquage +aquagreen +aquake +aqualung +aqualunger +aquamanale +aquamanalia +aquamanile +aquamaniles +aquamanilia +aquamarine +aquamarines +aquameter +aquanaut +aquanauts +aquaphobia +aquaplane +aquaplaned +aquaplaner +aquaplanes +aquaplaning +aquapuncture +aquaregia +aquarelle +aquarelles +aquarellist +aquaria +aquarial +aquarian +aquarians +aquarid +aquarii +aquariia +aquariist +aquariiums +aquarist +aquarists +aquarium +aquariums +aquarius +aquarter +aquas +aquascope +aquascutum +aquashow +aquate +aquatic +aquatical +aquatically +aquatics +aquatile +aquatint +aquatinta +aquatinted +aquatinter +aquatinting +aquatintist +aquatints +aquation +aquativeness +aquatone +aquatones +aquavalent +aquavit +aquavits +aqueduct +aqueducts +aqueity +aquench +aqueoglacial +aqueoigneous +aqueomercurial +aqueous +aqueously +aqueousness +aquerne +aquiclude +aquicolous +aquicultural +aquiculture +aquiculturist +aquifer +aquiferous +aquifers +aquifoliaceae +aquifoliaceous +aquiform +aquifuge +aquila +aquilaria +aquilawood +aquilege +aquilegia +aquilia +aquilian +aquilid +aquiline +aquilinity +aquilino +aquilon +aquinas +aquincubital +aquincubitalism +aquinist +aquintocubital +aquintocubitalism +aquiparous +aquitanian +aquiver +aquo +aquocapsulitis +aquocarbonic +aquocellolitis +aquopentamminecobaltic +aquose +aquosity +aquotization +aquotize +ar +ara +arab +araba +araban +arabana +arabella +arabesk +arabesks +arabesque +arabesquely +arabesquerie +arabesques +araby +arabia +arabian +arabianize +arabians +arabic +arabica +arabicism +arabicize +arabidopsis +arabiyeh +arability +arabin +arabine +arabinic +arabinose +arabinosic +arabinoside +arabis +arabism +arabist +arabit +arabite +arabitol +arabize +arabized +arabizes +arabizing +arable +arables +arabophil +arabs +araca +aracana +aracanga +aracari +arace +araceae +araceous +arach +arache +arachic +arachide +arachidic +arachidonic +arachin +arachis +arachnactis +arachne +arachnean +arachnephobia +arachnid +arachnida +arachnidan +arachnidial +arachnidism +arachnidium +arachnids +arachnism +arachnites +arachnitis +arachnoid +arachnoidal +arachnoidea +arachnoidean +arachnoiditis +arachnology +arachnological +arachnologist +arachnomorphae +arachnophagous +arachnopia +arad +aradid +aradidae +arado +araeometer +araeosystyle +araeostyle +araeotic +aragallus +arage +aragonese +aragonian +aragonite +aragonitic +aragonspath +araguane +araguato +araignee +arain +arayne +arains +araire +araise +arak +arakanese +arakawaite +arake +araks +arales +aralia +araliaceae +araliaceous +araliad +araliaephyllum +aralie +araliophyllum +aralkyl +aralkylated +aramaean +aramaic +aramaicize +aramayoite +aramaism +aramid +aramidae +aramids +aramina +araminta +aramis +aramitess +aramu +aramus +aranea +araneae +araneid +araneida +araneidal +araneidan +araneids +araneiform +araneiformes +araneiformia +aranein +araneina +araneoidea +araneology +araneologist +araneose +araneous +aranga +arango +arangoes +aranyaka +arank +aranzada +arapahite +arapaho +arapahos +arapaima +arapaimas +araphorostic +araphostic +araponga +arapunga +araquaju +arar +arara +araracanga +ararao +ararauna +arariba +araroba +ararobas +araru +arase +arati +aratinga +aration +aratory +araua +arauan +araucan +araucanian +araucano +araucaria +araucariaceae +araucarian +araucarioxylon +araujia +arauna +arawa +arawak +arawakan +arawakian +arb +arba +arbacia +arbacin +arbalest +arbalester +arbalestre +arbalestrier +arbalests +arbalist +arbalister +arbalists +arbalo +arbalos +arbela +arber +arbinose +arbiter +arbiters +arbith +arbitrable +arbitrage +arbitrager +arbitragers +arbitrages +arbitrageur +arbitragist +arbitral +arbitrament +arbitraments +arbitrary +arbitraries +arbitrarily +arbitrariness +arbitrate +arbitrated +arbitrates +arbitrating +arbitration +arbitrational +arbitrationist +arbitrations +arbitrative +arbitrator +arbitrators +arbitratorship +arbitratrix +arbitre +arbitrement +arbitrer +arbitress +arbitry +arblast +arboloco +arbor +arboraceous +arboral +arborary +arborator +arborea +arboreal +arboreally +arborean +arbored +arboreous +arborer +arbores +arborescence +arborescent +arborescently +arboresque +arboret +arboreta +arboretum +arboretums +arbory +arborical +arboricole +arboricoline +arboricolous +arboricultural +arboriculture +arboriculturist +arboriform +arborise +arborist +arborists +arborization +arborize +arborized +arborizes +arborizing +arboroid +arborolater +arborolatry +arborous +arbors +arborvitae +arborvitaes +arborway +arbota +arbour +arboured +arbours +arbovirus +arbs +arbtrn +arbuscle +arbuscles +arbuscula +arbuscular +arbuscule +arbust +arbusta +arbusterin +arbusterol +arbustum +arbutase +arbute +arbutean +arbutes +arbutin +arbutinase +arbutus +arbutuses +arc +arca +arcabucero +arcacea +arcade +arcaded +arcades +arcady +arcadia +arcadian +arcadianism +arcadianly +arcadians +arcadias +arcadic +arcading +arcadings +arcae +arcana +arcanal +arcane +arcanist +arcanite +arcanum +arcate +arcato +arcature +arcatures +arcboutant +arccos +arccosine +arced +arcella +arces +arceuthobium +arcform +arch +archabomination +archae +archaean +archaecraniate +archaeoceti +archaeocyathidae +archaeocyathus +archaeocyte +archaeogeology +archaeography +archaeographic +archaeographical +archaeohippus +archaeol +archaeolater +archaeolatry +archaeolith +archaeolithic +archaeologer +archaeology +archaeologian +archaeologic +archaeological +archaeologically +archaeologist +archaeologists +archaeomagnetism +archaeopithecus +archaeopterygiformes +archaeopteris +archaeopteryx +archaeornis +archaeornithes +archaeostoma +archaeostomata +archaeostomatous +archaeotherium +archaeus +archagitator +archai +archaic +archaical +archaically +archaicism +archaicness +archaise +archaised +archaiser +archaises +archaising +archaism +archaisms +archaist +archaistic +archaists +archaize +archaized +archaizer +archaizes +archaizing +archangel +archangelic +archangelica +archangelical +archangels +archangelship +archantagonist +archanthropine +archantiquary +archapostate +archapostle +archarchitect +archarios +archartist +archbanc +archbancs +archband +archbeacon +archbeadle +archbishop +archbishopess +archbishopry +archbishopric +archbishoprics +archbishops +archbotcher +archboutefeu +archbuffoon +archbuilder +archchampion +archchaplain +archcharlatan +archcheater +archchemic +archchief +archchronicler +archcity +archconfraternity +archconfraternities +archconsoler +archconspirator +archcorrupter +archcorsair +archcount +archcozener +archcriminal +archcritic +archcrown +archcupbearer +archd +archdapifer +archdapifership +archdeacon +archdeaconate +archdeaconess +archdeaconry +archdeaconries +archdeacons +archdeaconship +archdean +archdeanery +archdeceiver +archdefender +archdemon +archdepredator +archdespot +archdetective +archdevil +archdiocesan +archdiocese +archdioceses +archdiplomatist +archdissembler +archdisturber +archdivine +archdogmatist +archdolt +archdruid +archducal +archduchess +archduchesses +archduchy +archduchies +archduke +archdukedom +archdukes +archduxe +arche +archeal +archean +archearl +archebanc +archebancs +archebiosis +archecclesiastic +archecentric +arched +archegay +archegone +archegony +archegonia +archegonial +archegoniata +archegoniatae +archegoniate +archegoniophore +archegonium +archegosaurus +archeion +archelaus +archelenis +archelogy +archelon +archemastry +archemperor +archencephala +archencephalic +archenemy +archenemies +archengineer +archenia +archenteric +archenteron +archeocyte +archeol +archeolithic +archeology +archeologian +archeologic +archeological +archeologically +archeologist +archeopteryx +archeostome +archeozoic +archer +archeress +archerfish +archerfishes +archery +archeries +archers +archership +arches +archespore +archespores +archesporia +archesporial +archesporium +archespsporia +archest +archetypal +archetypally +archetype +archetypes +archetypic +archetypical +archetypically +archetypist +archetto +archettos +archeunuch +archeus +archexorcist +archfelon +archfiend +archfiends +archfire +archflamen +archflatterer +archfoe +archfool +archform +archfounder +archfriend +archgenethliac +archgod +archgomeral +archgovernor +archgunner +archhead +archheart +archheresy +archheretic +archhypocrisy +archhypocrite +archhost +archhouse +archhumbug +archy +archiannelida +archiater +archibald +archibenthal +archibenthic +archibenthos +archiblast +archiblastic +archiblastoma +archiblastula +archibuteo +archical +archicantor +archicarp +archicerebra +archicerebrum +archichlamydeae +archichlamydeous +archicyte +archicytula +archicleistogamy +archicleistogamous +archicoele +archicontinent +archidamus +archidiaceae +archidiaconal +archidiaconate +archididascalian +archididascalos +archidiskodon +archidium +archidome +archidoxis +archie +archiepiscopacy +archiepiscopal +archiepiscopality +archiepiscopally +archiepiscopate +archiereus +archigaster +archigastrula +archigenesis +archigony +archigonic +archigonocyte +archiheretical +archikaryon +archil +archilithic +archilla +archilochian +archilowe +archils +archilute +archimage +archimago +archimagus +archimandrite +archimandrites +archimedean +archimedes +archimycetes +archimime +archimorphic +archimorula +archimperial +archimperialism +archimperialist +archimperialistic +archimpressionist +archin +archine +archines +archineuron +archinfamy +archinformer +arching +archings +archipallial +archipallium +archipelagian +archipelagic +archipelago +archipelagoes +archipelagos +archiphoneme +archipin +archiplasm +archiplasmic +archiplata +archiprelatical +archipresbyter +archipterygial +archipterygium +archisymbolical +archisynagogue +archisperm +archispermae +archisphere +archispore +archistome +archisupreme +archit +architect +architective +architectonic +architectonica +architectonically +architectonics +architectress +architects +architectural +architecturalist +architecturally +architecture +architectures +architecturesque +architecure +architeuthis +architypographer +architis +architraval +architrave +architraved +architraves +architricline +archival +archivault +archive +archived +archiver +archivers +archives +archiving +archivist +archivists +archivolt +archizoic +archjockey +archking +archknave +archleader +archlecher +archlet +archleveler +archlexicographer +archly +archliar +archlute +archmachine +archmagician +archmagirist +archmarshal +archmediocrity +archmessenger +archmilitarist +archmime +archminister +archmystagogue +archmock +archmocker +archmockery +archmonarch +archmonarchy +archmonarchist +archmugwump +archmurderer +archness +archnesses +archocele +archocystosyrinx +archology +archon +archons +archonship +archonships +archont +archontate +archontia +archontic +archoplasm +archoplasma +archoplasmic +archoptoma +archoptosis +archorrhagia +archorrhea +archosyrinx +archostegnosis +archostenosis +archoverseer +archpall +archpapist +archpastor +archpatriarch +archpatron +archphylarch +archphilosopher +archpiece +archpilferer +archpillar +archpirate +archplagiary +archplagiarist +archplayer +archplotter +archplunderer +archplutocrat +archpoet +archpolitician +archpontiff +archpractice +archprelate +archprelatic +archprelatical +archpresbyter +archpresbyterate +archpresbytery +archpretender +archpriest +archpriesthood +archpriestship +archprimate +archprince +archprophet +archprotopope +archprototype +archpublican +archpuritan +archradical +archrascal +archreactionary +archrebel +archregent +archrepresentative +archrobber +archrogue +archruler +archsacrificator +archsacrificer +archsaint +archsatrap +archscoundrel +archseducer +archsee +archsewer +archshepherd +archsin +archsynagogue +archsnob +archspy +archspirit +archsteward +archswindler +archt +archtempter +archthief +archtyrant +archtraitor +archtreasurer +archtreasurership +archturncoat +archurger +archvagabond +archvampire +archvestryman +archvillain +archvillainy +archvisitor +archwag +archway +archways +archwench +archwife +archwise +archworker +archworkmaster +arcidae +arcifera +arciferous +arcifinious +arciform +arcing +arcite +arcked +arcking +arclength +arclike +arco +arcocentrous +arcocentrum +arcograph +arcos +arcose +arcosolia +arcosoliulia +arcosolium +arcs +arcsin +arcsine +arcsines +arctalia +arctalian +arctamerican +arctan +arctangent +arctation +arctia +arctian +arctic +arctically +arctician +arcticize +arcticized +arcticizing +arcticology +arcticologist +arctics +arcticward +arcticwards +arctiid +arctiidae +arctisca +arctitude +arctium +arctocephalus +arctogaea +arctogaeal +arctogaean +arctoid +arctoidea +arctoidean +arctomys +arctos +arctosis +arctostaphylos +arcturia +arcturus +arcual +arcuale +arcualia +arcuate +arcuated +arcuately +arcuation +arcubalist +arcubalister +arcubos +arcula +arculite +arcus +arcuses +ardass +ardassine +ardea +ardeae +ardeb +ardebs +ardeid +ardeidae +ardelia +ardelio +ardella +ardellae +ardency +ardencies +ardennite +ardent +ardently +ardentness +arder +ardhamagadhi +ardhanari +ardilla +ardish +ardisia +ardisiaceae +arditi +ardito +ardoise +ardor +ardors +ardour +ardours +ardri +ardrigh +ardu +arduinite +arduous +arduously +arduousness +ardure +ardurous +are +area +areach +aread +aready +areae +areal +areality +areally +arean +arear +areas +areason +areasoner +areaway +areaways +areawide +areca +arecaceae +arecaceous +arecaidin +arecaidine +arecain +arecaine +arecales +arecas +areche +arecolidin +arecolidine +arecolin +arecoline +arecuna +ared +areek +areel +arefact +arefaction +arefy +areg +aregenerative +aregeneratory +areic +areito +aren +arena +arenaceous +arenae +arenaria +arenariae +arenarious +arenas +arenation +arend +arendalite +arendator +areng +arenga +arenicola +arenicole +arenicolite +arenicolor +arenicolous +arenig +arenilitic +arenite +arenites +arenoid +arenose +arenosity +arenous +arent +arenulous +areocentric +areographer +areography +areographic +areographical +areographically +areola +areolae +areolar +areolas +areolate +areolated +areolation +areole +areoles +areolet +areology +areologic +areological +areologically +areologies +areologist +areometer +areometry +areometric +areometrical +areopagy +areopagist +areopagite +areopagitic +areopagitica +areopagus +areosystyle +areostyle +areotectonics +arere +arerola +areroscope +ares +arest +aret +aretaics +aretalogy +arete +aretes +arethusa +arethusas +arethuse +aretinian +arette +arew +arf +arfillite +arfvedsonite +arg +argaile +argal +argala +argalas +argali +argalis +argals +argan +argand +argans +argante +argas +argasid +argasidae +argean +argeers +argel +argema +argemone +argemony +argenol +argent +argental +argentamid +argentamide +argentamin +argentamine +argentan +argentarii +argentarius +argentate +argentation +argenteous +argenter +argenteum +argentic +argenticyanide +argentide +argentiferous +argentin +argentina +argentine +argentinean +argentineans +argentines +argentinian +argentinidae +argentinitrate +argentinize +argentino +argention +argentite +argentojarosite +argentol +argentometer +argentometry +argentometric +argentometrically +argenton +argentoproteinum +argentose +argentous +argentry +argents +argentum +argentums +argestes +argh +arghan +arghel +arghool +arghoul +argid +argify +argil +argyle +argyles +argyll +argillaceous +argillic +argilliferous +argillite +argillitic +argilloarenaceous +argillocalcareous +argillocalcite +argilloferruginous +argilloid +argillomagnesian +argillous +argylls +argils +argin +arginase +arginases +argine +arginine +argininephosphoric +arginines +argynnis +argiope +argiopidae +argiopoidea +argyranthemous +argyranthous +argyraspides +argyria +argyric +argyrite +argyrythrose +argyrocephalous +argyrodite +argyrol +argyroneta +argyropelecus +argyrose +argyrosis +argyrosomus +argive +argle +arglebargle +arglebargled +arglebargling +argled +argles +argling +argo +argoan +argol +argolet +argoletier +argolian +argolic +argolid +argols +argon +argonaut +argonauta +argonautic +argonautid +argonauts +argonne +argonon +argons +argos +argosy +argosies +argosine +argot +argotic +argots +argovian +arguable +arguably +argue +argued +arguendo +arguer +arguers +argues +argufy +argufied +argufier +argufiers +argufies +argufying +arguing +arguitively +argulus +argument +argumenta +argumental +argumentation +argumentatious +argumentative +argumentatively +argumentativeness +argumentator +argumentatory +argumentive +arguments +argumentum +argus +arguses +argusfish +argusfishes +argusianus +arguslike +arguta +argutation +argute +argutely +arguteness +arhar +arhat +arhats +arhatship +arhauaco +arhythmia +arhythmic +arhythmical +arhythmically +ary +aria +arya +ariadne +arian +aryan +ariana +arianism +aryanism +arianist +arianistic +arianistical +arianists +aryanization +arianize +aryanize +arianizer +arianrhod +aryans +arias +aryballi +aryballoi +aryballoid +aryballos +aryballus +arybballi +aribin +aribine +ariboflavinosis +arician +aricin +aricine +arid +arided +arider +aridest +aridge +aridian +aridity +aridities +aridly +aridness +aridnesses +ariegite +ariel +ariels +arienzo +aryepiglottic +aryepiglottidean +aries +arietate +arietation +arietid +arietinous +arietta +ariettas +ariette +ariettes +aright +arightly +arigue +ariidae +arikara +ariki +aril +aryl +arylamine +arylamino +arylate +arylated +arylating +arylation +ariled +arylide +arillary +arillate +arillated +arilled +arilli +arilliform +arillode +arillodes +arillodium +arilloid +arillus +arils +aryls +arimasp +arimaspian +arimathaean +ariocarpus +arioi +arioian +ariolate +ariole +arion +ariose +ariosi +arioso +ariosos +ariot +aripple +arisaema +arisaid +arisard +arise +arised +arisen +ariser +arises +arish +arising +arisings +arist +arista +aristae +aristarch +aristarchy +aristarchian +aristarchies +aristas +aristate +ariste +aristeas +aristeia +aristida +aristides +aristippus +aristo +aristocracy +aristocracies +aristocrat +aristocratic +aristocratical +aristocratically +aristocraticalness +aristocraticism +aristocraticness +aristocratism +aristocrats +aristodemocracy +aristodemocracies +aristodemocratical +aristogenesis +aristogenetic +aristogenic +aristogenics +aristoi +aristol +aristolochia +aristolochiaceae +aristolochiaceous +aristolochiales +aristolochin +aristolochine +aristology +aristological +aristologist +aristomonarchy +aristophanic +aristorepublicanism +aristos +aristotelean +aristotelian +aristotelianism +aristotelic +aristotelism +aristotype +aristotle +aristulate +arite +arytenoepiglottic +arytenoid +arytenoidal +arith +arithmancy +arithmetic +arithmetical +arithmetically +arithmetician +arithmeticians +arithmetics +arithmetization +arithmetizations +arithmetize +arithmetized +arithmetizes +arythmia +arythmias +arithmic +arythmic +arythmical +arythmically +arithmocracy +arithmocratic +arithmogram +arithmograph +arithmography +arithmomancy +arithmomania +arithmometer +arithromania +arius +arivaipa +arizona +arizonan +arizonans +arizonian +arizonians +arizonite +arjun +ark +arkab +arkansan +arkansans +arkansas +arkansawyer +arkansite +arkie +arkite +arkose +arkoses +arkosic +arks +arksutite +arkwright +arle +arlene +arleng +arlequinade +arles +arless +arline +arling +arlington +arloup +arm +armada +armadas +armadilla +armadillididae +armadillidium +armadillo +armadillos +armado +armageddon +armageddonist +armagnac +armagnacs +armament +armamentary +armamentaria +armamentarium +armaments +armangite +armary +armaria +armarian +armaries +armariolum +armarium +armariumaria +armata +armatoles +armatoli +armature +armatured +armatures +armaturing +armband +armbands +armbone +armchair +armchaired +armchairs +armed +armenia +armeniaceous +armenian +armenians +armenic +armenite +armenize +armenoid +armer +armeria +armeriaceae +armers +armet +armets +armful +armfuls +armgaunt +armguard +armhole +armholes +armhoop +army +armida +armied +armies +armiferous +armiger +armigeral +armigeri +armigero +armigeros +armigerous +armigers +armil +armill +armilla +armillae +armillary +armillaria +armillas +armillate +armillated +armine +arming +armings +arminian +arminianism +arminianize +arminianizer +armipotence +armipotent +armisonant +armisonous +armistice +armistices +armit +armitas +armyworm +armyworms +armless +armlessly +armlessness +armlet +armlets +armlike +armload +armloads +armlock +armlocks +armoire +armoires +armomancy +armoniac +armonica +armonicas +armor +armoracia +armorbearer +armored +armorer +armorers +armory +armorial +armorially +armorials +armoric +armorica +armorican +armorician +armoried +armories +armoring +armorist +armorless +armorplated +armorproof +armors +armorwise +armouchiquois +armour +armourbearer +armoured +armourer +armourers +armoury +armouries +armouring +armours +armozeen +armozine +armpad +armpiece +armpit +armpits +armplate +armrack +armrest +armrests +arms +armscye +armseye +armsful +armsize +armstrong +armure +armures +arn +arna +arnatta +arnatto +arnattos +arnaut +arnberry +arne +arneb +arnebia +arnee +arnement +arni +arnica +arnicas +arnold +arnoldist +arnoseris +arnotta +arnotto +arnottos +arnusian +arnut +aro +aroar +aroast +arock +aroeira +aroid +aroideous +aroides +aroids +aroint +aroynt +arointed +aroynted +arointing +aroynting +aroints +aroynts +arolia +arolium +arolla +aroma +aromacity +aromadendrin +aromal +aromas +aromata +aromatic +aromatical +aromatically +aromaticity +aromaticness +aromatics +aromatise +aromatised +aromatiser +aromatising +aromatitae +aromatite +aromatites +aromatization +aromatize +aromatized +aromatizer +aromatizing +aromatophor +aromatophore +aromatous +aronia +aroon +aroph +aroras +arosaguntacook +arose +around +arousable +arousal +arousals +arouse +aroused +arousement +arouser +arousers +arouses +arousing +arow +aroxyl +arpanet +arpeggiando +arpeggiated +arpeggiation +arpeggio +arpeggioed +arpeggios +arpen +arpens +arpent +arpenteur +arpents +arquated +arquebus +arquebuses +arquebusier +arquerite +arquifoux +arr +arracach +arracacha +arracacia +arrace +arrach +arrack +arracks +arrage +arragonite +arrah +array +arrayal +arrayals +arrayan +arrayed +arrayer +arrayers +arraign +arraignability +arraignable +arraignableness +arraigned +arraigner +arraigning +arraignment +arraignments +arraigns +arraying +arrayment +arrays +arrame +arrand +arrange +arrangeable +arranged +arrangement +arrangements +arranger +arrangers +arranges +arranging +arrant +arrantly +arrantness +arras +arrased +arrasene +arrases +arrastra +arrastre +arratel +arrau +arrear +arrearage +arrearages +arrears +arrect +arrectary +arrector +arrendation +arrendator +arrenotoky +arrenotokous +arrent +arrentable +arrentation +arreption +arreptitious +arrest +arrestable +arrestant +arrestation +arrested +arrestee +arrestees +arrester +arresters +arresting +arrestingly +arrestive +arrestment +arrestor +arrestors +arrests +arret +arretez +arretine +arrgt +arrha +arrhal +arrhenal +arrhenatherum +arrhenoid +arrhenotoky +arrhenotokous +arrhinia +arrhythmy +arrhythmia +arrhythmias +arrhythmic +arrhythmical +arrhythmically +arrhythmous +arrhizal +arrhizous +arri +arry +arriage +arriba +arribadas +arricci +arricciati +arricciato +arricciatos +arriccio +arriccioci +arriccios +arride +arrided +arridge +arriding +arrie +arriere +arriero +arriet +arryish +arrimby +arris +arrises +arrish +arrisways +arriswise +arrythmia +arrythmic +arrythmical +arrythmically +arrivage +arrival +arrivals +arrivance +arrive +arrived +arrivederci +arrivederla +arriver +arrivers +arrives +arriving +arrivism +arrivisme +arrivist +arriviste +arrivistes +arroba +arrobas +arrode +arrogance +arrogancy +arrogant +arrogantly +arrogantness +arrogate +arrogated +arrogates +arrogating +arrogatingly +arrogation +arrogations +arrogative +arrogator +arroya +arroyo +arroyos +arroyuelo +arrojadite +arrondi +arrondissement +arrondissements +arrope +arrosion +arrosive +arround +arrouse +arrow +arrowbush +arrowed +arrowhead +arrowheaded +arrowheads +arrowy +arrowing +arrowleaf +arrowless +arrowlet +arrowlike +arrowplate +arrowroot +arrowroots +arrows +arrowsmith +arrowstone +arrowweed +arrowwood +arrowworm +arroz +arrtez +arruague +ars +arsacid +arsacidan +arsanilic +arse +arsedine +arsefoot +arsehole +arsenal +arsenals +arsenate +arsenates +arsenation +arseneted +arsenetted +arsenfast +arsenferratose +arsenhemol +arseniasis +arseniate +arsenic +arsenical +arsenicalism +arsenicate +arsenicated +arsenicating +arsenicism +arsenicize +arsenicked +arsenicking +arsenicophagy +arsenics +arsenide +arsenides +arseniferous +arsenyl +arsenillo +arseniopleite +arseniosiderite +arsenious +arsenism +arsenite +arsenites +arsenium +arseniuret +arseniureted +arseniuretted +arsenization +arseno +arsenobenzene +arsenobenzol +arsenobismite +arsenoferratin +arsenofuran +arsenohemol +arsenolite +arsenophagy +arsenophen +arsenophenylglycin +arsenophenol +arsenopyrite +arsenostyracol +arsenotherapy +arsenotungstates +arsenotungstic +arsenous +arsenoxide +arses +arsesmart +arsheen +arshin +arshine +arshins +arsyl +arsylene +arsine +arsines +arsinic +arsino +arsinoitherium +arsis +arsyversy +arsle +arsmetik +arsmetry +arsmetrik +arsmetrike +arsnicker +arsoite +arson +arsonate +arsonation +arsonic +arsonist +arsonists +arsonite +arsonium +arsono +arsonous +arsons +arsonvalization +arsphenamine +art +artaba +artabe +artal +artamidae +artamus +artar +artarin +artarine +artcraft +arte +artefac +artefact +artefacts +artel +artels +artemas +artemia +artemis +artemisia +artemisic +artemisin +artemision +artemisium +artemon +arter +artery +arteria +arteriac +arteriae +arteriagra +arterial +arterialisation +arterialise +arterialised +arterialising +arterialization +arterialize +arterialized +arterializing +arterially +arterials +arteriarctia +arteriasis +arteriectasia +arteriectasis +arteriectomy +arteriectopia +arteried +arteries +arterying +arterin +arterioarctia +arteriocapillary +arteriococcygeal +arteriodialysis +arteriodiastasis +arteriofibrosis +arteriogenesis +arteriogram +arteriograph +arteriography +arteriographic +arteriolar +arteriole +arterioles +arteriolith +arteriology +arterioloscleroses +arteriolosclerosis +arteriomalacia +arteriometer +arteriomotor +arterionecrosis +arteriopalmus +arteriopathy +arteriophlebotomy +arterioplania +arterioplasty +arteriopressor +arteriorenal +arteriorrhagia +arteriorrhaphy +arteriorrhexis +arterioscleroses +arteriosclerosis +arteriosclerotic +arteriosympathectomy +arteriospasm +arteriostenosis +arteriostosis +arteriostrepsis +arteriotome +arteriotomy +arteriotomies +arteriotrepsis +arterious +arteriovenous +arterioversion +arterioverter +arteritis +artesian +artesonado +artesonados +artful +artfully +artfulness +artgum +artha +arthel +arthemis +arthogram +arthra +arthragra +arthral +arthralgia +arthralgic +arthrectomy +arthrectomies +arthredema +arthrempyesis +arthresthesia +arthritic +arthritical +arthritically +arthriticine +arthritics +arthritides +arthritis +arthritism +arthrobacterium +arthrobranch +arthrobranchia +arthrocace +arthrocarcinoma +arthrocele +arthrochondritis +arthroclasia +arthrocleisis +arthroclisis +arthroderm +arthrodesis +arthrodia +arthrodiae +arthrodial +arthrodic +arthrodymic +arthrodynia +arthrodynic +arthrodira +arthrodiran +arthrodire +arthrodirous +arthrodonteae +arthroempyema +arthroempyesis +arthroendoscopy +arthrogastra +arthrogastran +arthrogenous +arthrography +arthrogryposis +arthrolite +arthrolith +arthrolithiasis +arthrology +arthromeningitis +arthromere +arthromeric +arthrometer +arthrometry +arthron +arthroncus +arthroneuralgia +arthropathy +arthropathic +arthropathology +arthrophyma +arthrophlogosis +arthropyosis +arthroplasty +arthroplastic +arthropleura +arthropleure +arthropod +arthropoda +arthropodal +arthropodan +arthropody +arthropodous +arthropods +arthropomata +arthropomatous +arthropterous +arthrorheumatism +arthrorrhagia +arthrosclerosis +arthroses +arthrosia +arthrosynovitis +arthrosyrinx +arthrosis +arthrospore +arthrosporic +arthrosporous +arthrosteitis +arthrosterigma +arthrostome +arthrostomy +arthrostraca +arthrotyphoid +arthrotome +arthrotomy +arthrotomies +arthrotrauma +arthrotropic +arthrous +arthroxerosis +arthrozoa +arthrozoan +arthrozoic +arthur +arthurian +arthuriana +arty +artiad +artic +artichoke +artichokes +article +articled +articles +articling +articulability +articulable +articulacy +articulant +articular +articulare +articulary +articularly +articulars +articulata +articulate +articulated +articulately +articulateness +articulates +articulating +articulation +articulationes +articulationist +articulations +articulative +articulator +articulatory +articulatorily +articulators +articulite +articulus +artie +artier +artiest +artifact +artifactitious +artifacts +artifactual +artifactually +artifex +artifice +artificer +artificers +artificership +artifices +artificial +artificialism +artificiality +artificialities +artificialize +artificially +artificialness +artificious +artily +artilize +artiller +artillery +artilleries +artilleryman +artillerymen +artilleryship +artillerist +artillerists +artiness +artinesses +artinite +artinskian +artiodactyl +artiodactyla +artiodactylous +artiphyllous +artisan +artisanal +artisanry +artisans +artisanship +artist +artistdom +artiste +artistes +artistess +artistic +artistical +artistically +artistry +artistries +artists +artize +artless +artlessly +artlessness +artlet +artly +artlike +artmobile +artocarpaceae +artocarpad +artocarpeous +artocarpous +artocarpus +artolater +artolatry +artophagous +artophophoria +artophoria +artophorion +artotype +artotypy +artotyrite +artou +arts +artsy +artsman +artus +artware +artwork +artworks +aru +aruac +arugola +arugolas +arugula +arugulas +arui +aruke +arulo +arum +arumin +arumlike +arums +aruncus +arundiferous +arundinaceous +arundinaria +arundineous +arundo +arunta +arupa +arusa +arusha +aruspex +aruspice +aruspices +aruspicy +arustle +arval +arvejon +arvel +arverni +arvicola +arvicole +arvicolinae +arvicoline +arvicolous +arviculture +arvo +arvos +arx +arzan +arzava +arzawa +arzrunite +arzun +as +asa +asaddle +asafetida +asafoetida +asahel +asak +asale +asamblea +asana +asap +asaph +asaphia +asaphic +asaphid +asaphidae +asaphus +asaprol +asarabacca +asaraceae +asarh +asarin +asarite +asaron +asarone +asarota +asarotum +asarta +asarum +asarums +asb +asbest +asbestic +asbestiform +asbestine +asbestinize +asbestoid +asbestoidal +asbestos +asbestoses +asbestosis +asbestous +asbestus +asbestuses +asbolan +asbolane +asbolin +asboline +asbolite +ascabart +ascalabota +ascan +ascanian +ascanius +ascape +ascare +ascared +ascariasis +ascaricidal +ascaricide +ascarid +ascaridae +ascarides +ascaridia +ascaridiasis +ascaridol +ascaridole +ascarids +ascaris +ascaron +ascebc +ascella +ascelli +ascellus +ascence +ascend +ascendable +ascendance +ascendancy +ascendant +ascendantly +ascendants +ascended +ascendence +ascendency +ascendent +ascender +ascenders +ascendible +ascending +ascendingly +ascends +ascenseur +ascension +ascensional +ascensionist +ascensions +ascensiontide +ascensive +ascensor +ascent +ascents +ascertain +ascertainability +ascertainable +ascertainableness +ascertainably +ascertained +ascertainer +ascertaining +ascertainment +ascertains +ascescency +ascescent +asceses +ascesis +ascetic +ascetical +ascetically +asceticism +ascetics +ascetta +aschaffite +ascham +ascher +aschistic +asci +ascian +ascians +ascicidia +ascidia +ascidiacea +ascidiae +ascidian +ascidians +ascidiate +ascidicolous +ascidiferous +ascidiform +ascidiia +ascidioid +ascidioida +ascidioidea +ascidiozoa +ascidiozooid +ascidium +asciferous +ascigerous +ascii +ascill +ascyphous +ascyrum +ascitan +ascitb +ascite +ascites +ascitic +ascitical +ascititious +asclent +asclepiad +asclepiadaceae +asclepiadaceous +asclepiadae +asclepiadean +asclepiadeous +asclepiadic +asclepian +asclepias +asclepidin +asclepidoid +asclepieion +asclepin +asclepius +ascocarp +ascocarpous +ascocarps +ascochyta +ascogenous +ascogone +ascogonia +ascogonial +ascogonidia +ascogonidium +ascogonium +ascolichen +ascolichenes +ascoma +ascomata +ascomycetal +ascomycete +ascomycetes +ascomycetous +ascon +ascones +asconia +asconoid +ascophyllum +ascophore +ascophorous +ascorbate +ascorbic +ascospore +ascosporic +ascosporous +ascot +ascothoracica +ascots +ascry +ascribable +ascribe +ascribed +ascribes +ascribing +ascript +ascription +ascriptions +ascriptitii +ascriptitious +ascriptitius +ascriptive +ascrive +ascula +asculae +ascupart +ascus +asdic +asdics +ase +asea +asearch +asecretory +aseethe +aseismatic +aseismic +aseismicity +aseitas +aseity +aselar +aselgeia +asellate +aselli +asellidae +aselline +asellus +asem +asemasia +asemia +asemic +asepalous +asepses +asepsis +aseptate +aseptic +aseptically +asepticism +asepticize +asepticized +asepticizing +aseptify +aseptol +aseptolin +asexual +asexualisation +asexualise +asexualised +asexualising +asexuality +asexualization +asexualize +asexualized +asexualizing +asexually +asexuals +asfast +asfetida +asg +asgard +asgd +asgmt +ash +asha +ashake +ashame +ashamed +ashamedly +ashamedness +ashamnu +ashangos +ashantee +ashanti +asharasi +ashberry +ashcake +ashcan +ashcans +ashed +ashen +asher +asherah +asherahs +ashery +asheries +asherim +asherites +ashes +ashet +ashfall +ashy +ashier +ashiest +ashily +ashimmer +ashine +ashiness +ashing +ashipboard +ashir +ashiver +ashkey +ashkenazi +ashkenazic +ashkenazim +ashkoko +ashlar +ashlared +ashlaring +ashlars +ashler +ashlered +ashlering +ashlers +ashless +ashling +ashluslay +ashman +ashmen +ashmolean +ashochimi +ashore +ashot +ashpan +ashpit +ashplant +ashplants +ashraf +ashrafi +ashram +ashrama +ashrams +ashstone +ashthroat +ashtoreth +ashtray +ashtrays +ashur +ashvamedha +ashweed +ashwort +asia +asialia +asian +asianic +asianism +asians +asiarch +asiarchate +asiatic +asiatical +asiatically +asiatican +asiaticism +asiaticization +asiaticize +asiatize +aside +asidehand +asiden +asideness +asiderite +asides +asideu +asiento +asyla +asylabia +asyle +asilid +asilidae +asyllabia +asyllabic +asyllabical +asylum +asylums +asilus +asymbiotic +asymbolia +asymbolic +asymbolical +asimen +asimina +asimmer +asymmetral +asymmetranthous +asymmetry +asymmetric +asymmetrical +asymmetrically +asymmetries +asymmetrocarpous +asymmetron +asymptomatic +asymptomatically +asymptote +asymptotes +asymptotic +asymptotical +asymptotically +asymtote +asymtotes +asymtotic +asymtotically +asynapsis +asynaptic +asynartete +asynartetic +async +asynchrony +asynchronism +asynchronisms +asynchronous +asynchronously +asyndesis +asyndeta +asyndetic +asyndetically +asyndeton +asyndetons +asinego +asinegoes +asynergy +asynergia +asyngamy +asyngamic +asinine +asininely +asininity +asininities +asyntactic +asyntrophy +asiphonate +asiphonogama +asystematic +asystole +asystolic +asystolism +asitia +asyzygetic +ask +askable +askance +askant +askapart +askar +askarel +askari +askaris +asked +asker +askers +askeses +askesis +askew +askewgee +askewness +askile +asking +askingly +askings +askip +asklent +asklepios +askoi +askoye +askos +askr +asks +aslake +aslant +aslantwise +aslaver +asleep +aslop +aslope +aslumber +asmack +asmalte +asmear +asmile +asmodeus +asmoke +asmolder +asniffle +asnort +asoak +asocial +asok +asoka +asomatophyte +asomatous +asonant +asonia +asop +asor +asouth +asp +aspace +aspalathus +aspalax +asparagic +asparagyl +asparagin +asparagine +asparaginic +asparaginous +asparagus +asparaguses +asparamic +asparkle +aspartame +aspartate +aspartic +aspartyl +aspartokinase +aspasia +aspatia +aspca +aspect +aspectable +aspectant +aspection +aspects +aspectual +aspen +aspens +asper +asperate +asperated +asperates +asperating +asperation +aspergation +asperge +asperger +asperges +asperggilla +asperggilli +aspergil +aspergill +aspergilla +aspergillaceae +aspergillales +aspergilli +aspergilliform +aspergillin +aspergilloses +aspergillosis +aspergillum +aspergillums +aspergillus +asperifoliae +asperifoliate +asperifolious +asperite +asperity +asperities +asperly +aspermatic +aspermatism +aspermatous +aspermia +aspermic +aspermous +aspern +asperness +asperous +asperously +aspers +asperse +aspersed +asperser +aspersers +asperses +aspersing +aspersion +aspersions +aspersive +aspersively +aspersoir +aspersor +aspersory +aspersoria +aspersorium +aspersoriums +aspersors +asperugo +asperula +asperuloside +asperulous +asphalt +asphalted +asphaltene +asphalter +asphaltic +asphalting +asphaltite +asphaltlike +asphalts +asphaltum +asphaltus +aspheric +aspherical +aspheterism +aspheterize +asphyctic +asphyctous +asphyxy +asphyxia +asphyxial +asphyxiant +asphyxias +asphyxiate +asphyxiated +asphyxiates +asphyxiating +asphyxiation +asphyxiative +asphyxiator +asphyxied +asphyxies +asphodel +asphodelaceae +asphodeline +asphodels +asphodelus +aspy +aspic +aspics +aspiculate +aspiculous +aspidate +aspide +aspidiaria +aspidinol +aspidiotus +aspidiske +aspidistra +aspidistras +aspidium +aspidobranchia +aspidobranchiata +aspidobranchiate +aspidocephali +aspidochirota +aspidoganoidei +aspidomancy +aspidosperma +aspidospermine +aspiquee +aspirant +aspirants +aspirata +aspiratae +aspirate +aspirated +aspirates +aspirating +aspiration +aspirations +aspirator +aspiratory +aspirators +aspire +aspired +aspiree +aspirer +aspirers +aspires +aspirin +aspiring +aspiringly +aspiringness +aspirins +aspis +aspises +aspish +asplanchnic +asplenieae +asplenioid +asplenium +asporogenic +asporogenous +asporous +asport +asportation +asporulate +aspout +asprawl +aspread +aspredinidae +aspredo +asprete +aspring +asprout +asps +asquare +asquat +asqueal +asquint +asquirm +asrama +asramas +ass +assacu +assafetida +assafoetida +assagai +assagaied +assagaiing +assagais +assahy +assai +assay +assayable +assayed +assayer +assayers +assaying +assail +assailability +assailable +assailableness +assailant +assailants +assailed +assailer +assailers +assailing +assailment +assails +assais +assays +assalto +assam +assamar +assamese +assamites +assapan +assapanic +assapanick +assary +assarion +assart +assassin +assassinate +assassinated +assassinates +assassinating +assassination +assassinations +assassinative +assassinator +assassinatress +assassinist +assassins +assate +assation +assaugement +assault +assaultable +assaulted +assaulter +assaulters +assaulting +assaultive +assaults +assausive +assaut +assbaa +asse +asseal +assecuration +assecurator +assecure +assecution +assedat +assedation +assegai +assegaied +assegaiing +assegaing +assegais +asseize +asself +assembl +assemblable +assemblage +assemblages +assemblagist +assemblance +assemble +assembled +assemblee +assemblement +assembler +assemblers +assembles +assembly +assemblies +assemblyman +assemblymen +assembling +assemblywoman +assemblywomen +assent +assentaneous +assentation +assentatious +assentator +assentatory +assentatorily +assented +assenter +assenters +assentient +assenting +assentingly +assentive +assentiveness +assentor +assentors +assents +asseour +assert +asserta +assertable +assertative +asserted +assertedly +asserter +asserters +assertible +asserting +assertingly +assertion +assertional +assertions +assertive +assertively +assertiveness +assertor +assertory +assertorial +assertorially +assertoric +assertorical +assertorically +assertorily +assertors +assertress +assertrix +asserts +assertum +asserve +asservilize +asses +assess +assessable +assessably +assessed +assessee +assesses +assessing +assession +assessionary +assessment +assessments +assessor +assessory +assessorial +assessors +assessorship +asset +asseth +assets +assever +asseverate +asseverated +asseverates +asseverating +asseveratingly +asseveration +asseverations +asseverative +asseveratively +asseveratory +assewer +asshead +assheadedness +asshole +assholes +assi +assibilate +assibilated +assibilating +assibilation +assidaean +assidean +assident +assidual +assidually +assiduate +assiduity +assiduities +assiduous +assiduously +assiduousness +assiege +assientist +assiento +assiette +assify +assign +assignability +assignable +assignably +assignat +assignation +assignations +assignats +assigned +assignee +assignees +assigneeship +assigner +assigners +assigning +assignment +assignments +assignor +assignors +assigns +assilag +assimilability +assimilable +assimilate +assimilated +assimilates +assimilating +assimilation +assimilationist +assimilations +assimilative +assimilativeness +assimilator +assimilatory +assimulate +assinego +assiniboin +assyntite +assinuate +assyria +assyrian +assyrianize +assyrians +assyriology +assyriological +assyriologist +assyriologue +assyroid +assis +assisa +assisan +assise +assish +assishly +assishness +assisi +assist +assistance +assistances +assistant +assistanted +assistants +assistantship +assistantships +assisted +assistency +assister +assisters +assistful +assisting +assistive +assistless +assistor +assistors +assists +assith +assyth +assythment +assize +assized +assizement +assizer +assizes +assizing +asslike +assman +assmannshauser +assmanship +assn +assobre +assoc +associability +associable +associableness +associate +associated +associatedness +associates +associateship +associating +association +associational +associationalism +associationalist +associationism +associationist +associationistic +associations +associative +associatively +associativeness +associativity +associator +associatory +associators +associe +assoil +assoiled +assoiling +assoilment +assoils +assoilzie +assoin +assoluto +assonance +assonanced +assonances +assonant +assonantal +assonantic +assonantly +assonants +assonate +assonia +assoria +assort +assortative +assortatively +assorted +assortedness +assorter +assorters +assorting +assortive +assortment +assortments +assorts +assot +asssembler +asst +assuade +assuagable +assuage +assuaged +assuagement +assuagements +assuager +assuages +assuaging +assuasive +assubjugate +assuefaction +assuetude +assumable +assumably +assume +assumed +assumedly +assument +assumer +assumers +assumes +assuming +assumingly +assumingness +assummon +assumpsit +assumpt +assumption +assumptionist +assumptions +assumptious +assumptiousness +assumptive +assumptively +assumptiveness +assurable +assurance +assurances +assurant +assurate +assurd +assure +assured +assuredly +assuredness +assureds +assurer +assurers +assures +assurge +assurgency +assurgent +assuring +assuringly +assuror +assurors +asswage +asswaged +asswages +asswaging +ast +asta +astable +astacian +astacidae +astacus +astay +astakiwi +astalk +astarboard +astare +astart +astarte +astartian +astartidae +astasia +astasias +astate +astatic +astatically +astaticism +astatine +astatines +astatize +astatized +astatizer +astatizing +asteam +asteatosis +asteep +asteer +asteism +astel +astely +astelic +aster +asteraceae +asteraceous +asterales +asterella +astereognosis +asteria +asteriae +asterial +asterias +asteriated +asteriidae +asterikos +asterin +asterina +asterinidae +asterioid +asterion +asterionella +asteriscus +asteriscuses +asterisk +asterisked +asterisking +asteriskless +asteriskos +asterisks +asterism +asterismal +asterisms +asterite +asterixis +astern +asternal +asternata +asternia +asterochiton +asteroid +asteroidal +asteroidea +asteroidean +asteroids +asterolepidae +asterolepis +asterope +asterophyllite +asterophyllites +asterospondyli +asterospondylic +asterospondylous +asteroxylaceae +asteroxylon +asterozoa +asters +astert +asterwort +asthamatic +astheny +asthenia +asthenias +asthenic +asthenical +asthenics +asthenies +asthenobiosis +asthenobiotic +asthenolith +asthenology +asthenope +asthenophobia +asthenopia +asthenopic +asthenosphere +asthma +asthmas +asthmatic +asthmatical +asthmatically +asthmatics +asthmatoid +asthmogenic +asthore +asthorin +astian +astyanax +astichous +astigmat +astigmatic +astigmatical +astigmatically +astigmatism +astigmatizer +astigmatometer +astigmatometry +astigmatoscope +astigmatoscopy +astigmatoscopies +astigmia +astigmias +astigmic +astigmism +astigmometer +astigmometry +astigmoscope +astylar +astilbe +astyllen +astylospongia +astylosternus +astint +astipulate +astipulation +astir +astite +astogeny +astomatal +astomatous +astomia +astomous +astond +astone +astoned +astony +astonied +astonies +astonying +astonish +astonished +astonishedly +astonisher +astonishes +astonishing +astonishingly +astonishingness +astonishment +astonishments +astoop +astor +astore +astound +astoundable +astounded +astounding +astoundingly +astoundment +astounds +astr +astrachan +astracism +astraddle +astraea +astraean +astraeid +astraeidae +astraeiform +astragal +astragalar +astragalectomy +astragali +astragalocalcaneal +astragalocentral +astragalomancy +astragalonavicular +astragaloscaphoid +astragalotibial +astragals +astragalus +astray +astrain +astrakanite +astrakhan +astral +astrally +astrals +astrand +astrantia +astraphobia +astrapophobia +astre +astream +astrean +astrer +astrict +astricted +astricting +astriction +astrictive +astrictively +astrictiveness +astricts +astrid +astride +astrier +astriferous +astrild +astringe +astringed +astringence +astringency +astringent +astringently +astringents +astringer +astringes +astringing +astrion +astrionics +astroalchemist +astrobiology +astrobiological +astrobiologically +astrobiologies +astrobiologist +astrobiologists +astroblast +astrobotany +astrocaryum +astrochemist +astrochemistry +astrochronological +astrocyte +astrocytic +astrocytoma +astrocytomas +astrocytomata +astrocompass +astrodiagnosis +astrodynamic +astrodynamics +astrodome +astrofel +astrofell +astrogate +astrogated +astrogating +astrogation +astrogational +astrogator +astrogeny +astrogeology +astrogeologist +astroglia +astrognosy +astrogony +astrogonic +astrograph +astrographer +astrography +astrographic +astrohatch +astroid +astroite +astrol +astrolabe +astrolabes +astrolabical +astrolater +astrolatry +astrolithology +astrolog +astrologaster +astrologe +astrologer +astrologers +astrology +astrologian +astrologic +astrological +astrologically +astrologist +astrologistic +astrologists +astrologize +astrologous +astromancer +astromancy +astromantic +astromeda +astrometeorology +astrometeorological +astrometeorologist +astrometer +astrometry +astrometric +astrometrical +astron +astronaut +astronautic +astronautical +astronautically +astronautics +astronauts +astronavigation +astronavigator +astronomer +astronomers +astronomy +astronomic +astronomical +astronomically +astronomics +astronomien +astronomize +astropecten +astropectinidae +astrophel +astrophil +astrophyllite +astrophysical +astrophysicist +astrophysicists +astrophysics +astrophyton +astrophobia +astrophotographer +astrophotography +astrophotographic +astrophotometer +astrophotometry +astrophotometrical +astroscope +astroscopy +astroscopus +astrose +astrospectral +astrospectroscopic +astrosphere +astrospherecentrosomic +astrotheology +astructive +astrut +astucious +astuciously +astucity +astur +asturian +astute +astutely +astuteness +astutious +asuang +asudden +asunder +asuri +asway +aswail +aswarm +aswash +asweat +aswell +asweve +aswim +aswing +aswirl +aswithe +aswoon +aswooned +aswough +at +ata +atabal +atabals +atabeg +atabek +atabrine +atacaman +atacamenan +atacamenian +atacameno +atacamite +atactic +atactiform +ataentsic +atafter +ataghan +ataghans +ataigal +ataiyal +atake +atalaya +atalayas +atalan +atalanta +atalantis +ataman +atamans +atamasco +atamascos +atame +atamosco +atangle +atap +atar +ataractic +ataraxy +ataraxia +ataraxias +ataraxic +ataraxics +ataraxies +atatschite +ataunt +ataunto +atavi +atavic +atavism +atavisms +atavist +atavistic +atavistically +atavists +atavus +ataxaphasia +ataxy +ataxia +ataxiagram +ataxiagraph +ataxiameter +ataxiaphasia +ataxias +ataxic +ataxics +ataxies +ataxinomic +ataxite +ataxonomic +ataxophemia +atazir +atbash +atchison +ate +ateba +atebrin +atechny +atechnic +atechnical +ated +atees +ateeter +atef +ateknia +atelectasis +atelectatic +ateleiosis +atelene +ateleological +ateles +atelestite +atelets +ately +atelic +atelier +ateliers +ateliosis +ateliotic +atellan +atelo +atelocardia +atelocephalous +ateloglossia +atelognathia +atelomyelia +atelomitic +atelophobia +atelopodia +ateloprosopia +atelorachidia +atelostomia +atemoya +atemporal +aten +atenism +atenist +aterian +ates +atestine +ateuchi +ateuchus +atfalati +athabasca +athabascan +athalamous +athalline +athamantid +athamantin +athamaunte +athanasy +athanasia +athanasian +athanasianism +athanasianist +athanasies +athanor +athapascan +athapaskan +athar +atharvan +athbash +athecae +athecata +athecate +atheism +atheisms +atheist +atheistic +atheistical +atheistically +atheisticalness +atheisticness +atheists +atheize +atheizer +athel +athelia +atheling +athelings +athematic +athena +athenaea +athenaeum +athenaeums +athenee +atheneum +atheneums +athenian +athenianly +athenians +athenor +athens +atheology +atheological +atheologically +atheous +athericera +athericeran +athericerous +atherine +atherinidae +atheriogaea +atheriogaean +atheris +athermancy +athermanous +athermic +athermous +atherogenesis +atherogenic +atheroma +atheromas +atheromasia +atheromata +atheromatosis +atheromatous +atheroscleroses +atherosclerosis +atherosclerotic +atherosclerotically +atherosperma +atherurus +athetesis +atheticize +athetize +athetized +athetizing +athetoid +athetoids +athetosic +athetosis +athetotic +athymy +athymia +athymic +athing +athink +athyreosis +athyria +athyrid +athyridae +athyris +athyrium +athyroid +athyroidism +athyrosis +athirst +athlete +athletehood +athletes +athletic +athletical +athletically +athleticism +athletics +athletism +athletocracy +athlothete +athlothetes +athodyd +athodyds +athogen +athold +athonite +athort +athrepsia +athreptic +athrill +athrive +athrob +athrocyte +athrocytosis +athrogenic +athrong +athrough +athumia +athwart +athwarthawse +athwartship +athwartships +athwartwise +ati +atik +atikokania +atilt +atimy +atimon +ating +atinga +atingle +atinkle +atip +atypy +atypic +atypical +atypicality +atypically +atiptoe +atis +atka +atlanta +atlantad +atlantal +atlantean +atlantes +atlantic +atlantica +atlantid +atlantides +atlantis +atlantite +atlantoaxial +atlantodidymus +atlantomastoid +atlantoodontoid +atlantosaurus +atlas +atlases +atlaslike +atlatl +atlatls +atle +atlee +atli +atloaxoid +atloid +atloidean +atloidoaxoid +atm +atma +atman +atmans +atmas +atmiatry +atmiatrics +atmid +atmidalbumin +atmidometer +atmidometry +atmo +atmocausis +atmocautery +atmoclastic +atmogenic +atmograph +atmolyses +atmolysis +atmolyzation +atmolyze +atmolyzer +atmology +atmologic +atmological +atmologist +atmometer +atmometry +atmometric +atmophile +atmos +atmosphere +atmosphered +atmosphereful +atmosphereless +atmospheres +atmospheric +atmospherical +atmospherically +atmospherics +atmospherium +atmospherology +atmostea +atmosteal +atmosteon +atnah +atocha +atocia +atokal +atoke +atokous +atole +atoll +atolls +atom +atomatic +atomechanics +atomerg +atomy +atomic +atomical +atomically +atomician +atomicism +atomicity +atomics +atomies +atomiferous +atomisation +atomise +atomised +atomises +atomising +atomism +atomisms +atomist +atomistic +atomistical +atomistically +atomistics +atomists +atomity +atomization +atomize +atomized +atomizer +atomizers +atomizes +atomizing +atomology +atoms +atonable +atonal +atonalism +atonalist +atonalistic +atonality +atonally +atone +atoneable +atoned +atonement +atonements +atoneness +atoner +atoners +atones +atony +atonia +atonic +atonicity +atonics +atonies +atoning +atoningly +atop +atopen +atophan +atopy +atopic +atopies +atopite +atorai +atossa +atour +atoxic +atoxyl +atpoints +atrabilaire +atrabilar +atrabilarian +atrabilarious +atrabile +atrabiliar +atrabiliary +atrabiliarious +atrabilious +atrabiliousness +atracheate +atractaspis +atragene +atrail +atrament +atramental +atramentary +atramentous +atraumatic +atrazine +atrazines +atrebates +atrede +atremata +atremate +atrematous +atremble +atren +atrenne +atrepsy +atreptic +atresy +atresia +atresias +atresic +atretic +atreus +atry +atria +atrial +atrible +atrichia +atrichic +atrichosis +atrichous +atrickle +atridean +atrienses +atriensis +atriocoelomic +atrioporal +atriopore +atrioventricular +atrip +atrypa +atriplex +atrypoid +atrium +atriums +atroce +atroceruleous +atroceruleus +atrocha +atrochal +atrochous +atrocious +atrociously +atrociousness +atrocity +atrocities +atrocoeruleus +atrolactic +atropa +atropaceous +atropal +atropamine +atrophy +atrophia +atrophias +atrophiated +atrophic +atrophied +atrophies +atrophying +atrophoderma +atrophous +atropia +atropic +atropidae +atropin +atropine +atropines +atropinism +atropinization +atropinize +atropins +atropism +atropisms +atropos +atropous +atrorubent +atrosanguineous +atroscine +atrous +atsara +att +atta +attababy +attabal +attaboy +attacapan +attacca +attacco +attach +attachable +attachableness +attache +attached +attachedly +attacher +attachers +attaches +attacheship +attaching +attachment +attachments +attack +attackable +attacked +attacker +attackers +attacking +attackingly +attackman +attacks +attacolite +attacus +attagal +attagen +attaghan +attagirl +attain +attainability +attainable +attainableness +attainably +attainder +attainders +attained +attainer +attainers +attaining +attainment +attainments +attainor +attains +attaint +attainted +attainting +attaintment +attaints +attainture +attal +attalea +attaleh +attalid +attame +attapulgite +attar +attargul +attars +attask +attaste +attatched +attatches +atte +atteal +attemper +attemperament +attemperance +attemperate +attemperately +attemperation +attemperator +attempered +attempering +attempers +attempre +attempt +attemptability +attemptable +attempted +attempter +attempters +attempting +attemptive +attemptless +attempts +attend +attendance +attendances +attendancy +attendant +attendantly +attendants +attended +attendee +attendees +attender +attenders +attending +attendingly +attendment +attendress +attends +attensity +attent +attentat +attentate +attention +attentional +attentionality +attentions +attentive +attentively +attentiveness +attently +attenuable +attenuant +attenuate +attenuated +attenuates +attenuating +attenuation +attenuations +attenuative +attenuator +attenuators +atter +attercop +attercrop +attery +atterminal +attermine +attermined +atterminement +attern +atterr +atterrate +attest +attestable +attestant +attestation +attestations +attestative +attestator +attested +attester +attesters +attesting +attestive +attestor +attestors +attests +atty +attic +attical +attice +atticism +atticisms +atticist +atticists +atticize +atticized +atticizing +atticomastoid +attics +attid +attidae +attila +attinge +attingence +attingency +attingent +attirail +attire +attired +attirement +attirer +attires +attiring +attitude +attitudes +attitudinal +attitudinarian +attitudinarianism +attitudinise +attitudinised +attitudiniser +attitudinising +attitudinize +attitudinized +attitudinizer +attitudinizes +attitudinizing +attitudist +attiwendaronk +attle +attn +attntrp +attollent +attomy +attorn +attornare +attorned +attorney +attorneydom +attorneyism +attorneys +attorneyship +attorning +attornment +attorns +attouchement +attour +attourne +attract +attractability +attractable +attractableness +attractance +attractancy +attractant +attractants +attracted +attracter +attractile +attracting +attractingly +attraction +attractionally +attractions +attractive +attractively +attractiveness +attractivity +attractor +attractors +attracts +attrahent +attrap +attrectation +attry +attrib +attributable +attributal +attribute +attributed +attributer +attributes +attributing +attribution +attributional +attributions +attributive +attributively +attributiveness +attributives +attributor +attrist +attrite +attrited +attriteness +attriting +attrition +attritional +attritive +attritus +attriutively +attroopment +attroupement +attune +attuned +attunely +attunement +attunes +attuning +atturn +atua +atuami +atule +atumble +atune +atveen +atwain +atweel +atween +atwin +atwind +atwirl +atwist +atwitch +atwite +atwitter +atwixt +atwo +auantic +aubade +aubades +aubain +aubaine +aube +aubepine +auberge +auberges +aubergine +aubergiste +aubergistes +aubin +aubrey +aubretia +aubretias +aubrieta +aubrietas +aubrietia +aubrite +auburn +auburns +aubusson +auca +aucan +aucaner +aucanian +auchenia +auchenium +auchlet +aucht +auckland +auctary +auction +auctionary +auctioned +auctioneer +auctioneers +auctioning +auctions +auctor +auctorial +auctorizate +auctors +aucuba +aucubas +aucupate +aud +audace +audacious +audaciously +audaciousness +audacity +audacities +audad +audads +audaean +audian +audibertia +audibility +audible +audibleness +audibles +audibly +audience +audiencer +audiences +audiencia +audiencier +audient +audients +audile +audiles +auding +audings +audio +audioemission +audiogenic +audiogram +audiograms +audiology +audiological +audiologies +audiologist +audiologists +audiometer +audiometers +audiometry +audiometric +audiometrically +audiometries +audiometrist +audion +audiophile +audiophiles +audios +audiotape +audiotapes +audiotypist +audiovisual +audiovisuals +audiphone +audit +auditable +audited +auditing +audition +auditioned +auditioning +auditions +auditive +auditives +auditor +auditory +auditoria +auditorial +auditorially +auditories +auditorily +auditorium +auditoriums +auditors +auditorship +auditotoria +auditress +audits +auditual +audivise +audiviser +audivision +audrey +audubon +audubonistic +aueto +auf +aufait +aufgabe +aufklarung +auftakt +aug +auganite +auge +augean +augelite +augen +augend +augends +auger +augerer +augers +auget +augh +aught +aughtlins +aughts +augite +augites +augitic +augitite +augitophyre +augment +augmentable +augmentation +augmentationer +augmentations +augmentative +augmentatively +augmented +augmentedly +augmenter +augmenters +augmenting +augmentive +augmentor +augments +augrim +augur +augural +augurate +auguration +augure +augured +augurer +augurers +augury +augurial +auguries +auguring +augurous +augurs +augurship +august +augusta +augustal +augustan +auguste +auguster +augustest +augusti +augustin +augustine +augustinian +augustinianism +augustinism +augustly +augustness +augustus +auh +auhuhu +auk +auklet +auklets +auks +auksinai +auksinas +auksinu +aul +aula +aulacocarpous +aulacodus +aulacomniaceae +aulacomnium +aulae +aularian +aulas +auld +aulder +auldest +auldfarrantlike +auletai +aulete +auletes +auletic +auletrides +auletris +aulic +aulical +aulicism +aullay +auloi +aulophyte +aulophobia +aulos +aulostoma +aulostomatidae +aulostomi +aulostomid +aulostomidae +aulostomus +aulu +aum +aumaga +aumail +aumakua +aumbry +aumbries +aumery +aumil +aumildar +aummbulatory +aumoniere +aumous +aumrie +auncel +aune +aunjetitz +aunt +aunter +aunters +aunthood +aunthoods +aunty +auntie +aunties +auntish +auntly +auntlier +auntliest +auntlike +auntre +auntrous +aunts +auntsary +auntship +aupaka +aura +aurae +aural +aurally +auramin +auramine +aurang +aurantia +aurantiaceae +aurantiaceous +aurantium +aurar +auras +aurata +aurate +aurated +aureal +aureate +aureately +aureateness +aureation +aurei +aureity +aurelia +aurelian +aurelius +aurene +aureocasidium +aureola +aureolae +aureolas +aureole +aureoled +aureoles +aureolin +aureoline +aureoling +aureomycin +aureous +aureously +aures +auresca +aureus +auribromide +auric +aurichalcite +aurichalcum +aurichloride +aurichlorohydric +auricyanhydric +auricyanic +auricyanide +auricle +auricled +auricles +auricomous +auricula +auriculae +auricular +auriculare +auriculares +auricularia +auriculariaceae +auriculariae +auriculariales +auricularian +auricularias +auricularis +auricularly +auriculars +auriculas +auriculate +auriculated +auriculately +auriculidae +auriculo +auriculocranial +auriculoid +auriculoparietal +auriculotemporal +auriculoventricular +auriculovertical +auride +auriferous +aurifex +aurify +aurific +aurification +aurified +aurifying +auriflamme +auriform +auriga +aurigal +aurigation +aurigerous +aurigid +aurignacian +aurigo +aurigraphy +auryl +aurilave +aurin +aurinasal +aurine +auriphone +auriphrygia +auriphrygiate +auripigment +auripuncture +aurir +auris +auriscalp +auriscalpia +auriscalpium +auriscope +auriscopy +auriscopic +auriscopically +aurist +aurists +aurite +aurited +aurivorous +auroauric +aurobromide +auroch +aurochloride +aurochs +aurochses +aurocyanide +aurodiamine +auronal +aurophobia +aurophore +aurora +aurorae +auroral +aurorally +auroras +aurore +aurorean +aurorian +aurorium +aurotellurite +aurothiosulphate +aurothiosulphuric +aurous +aurrescu +aurulent +aurum +aurums +aurung +aurure +aus +auscult +auscultascope +auscultate +auscultated +auscultates +auscultating +auscultation +auscultations +auscultative +auscultator +auscultatory +auscultoscope +ausform +ausformed +ausforming +ausforms +ausgespielt +aushar +auslander +auslaut +auslaute +ausones +ausonian +auspex +auspicate +auspicated +auspicating +auspice +auspices +auspicy +auspicial +auspicious +auspiciously +auspiciousness +aussie +aussies +austafrican +austausch +austemper +austenite +austenitic +austenitize +austenitized +austenitizing +auster +austere +austerely +austereness +austerer +austerest +austerity +austerities +austerlitz +austerus +austin +austral +australasian +australene +australia +australian +australianism +australianize +australians +australic +australioid +australis +australite +australoid +australopithecinae +australopithecine +australopithecus +australorp +austrasian +austria +austrian +austrianize +austrians +austric +austrine +austringer +austrium +austroasiatic +austrogaea +austrogaean +austromancy +austronesian +austrophil +austrophile +austrophilism +austroriparian +ausu +ausubo +ausubos +autacoid +autacoidal +autacoids +autaesthesy +autallotriomorphic +autantitypy +autarch +autarchy +autarchic +autarchical +autarchically +autarchies +autarchist +autarchoglossa +autarky +autarkic +autarkical +autarkically +autarkies +autarkik +autarkikal +autarkist +aute +autechoscope +autecy +autecious +auteciously +auteciousness +autecism +autecisms +autecology +autecologic +autecological +autecologically +autecologist +autem +autere +auteur +auteurism +autexousy +auth +authentic +authentical +authentically +authenticalness +authenticatable +authenticate +authenticated +authenticates +authenticating +authentication +authentications +authenticator +authenticators +authenticity +authenticities +authenticly +authenticness +authigene +authigenetic +authigenic +authigenous +author +authorcraft +authored +authoress +authoresses +authorhood +authorial +authorially +authoring +authorisable +authorisation +authorise +authorised +authoriser +authorish +authorising +authorism +authoritarian +authoritarianism +authoritarianisms +authoritarians +authoritative +authoritatively +authoritativeness +authority +authorities +authorizable +authorization +authorizations +authorize +authorized +authorizer +authorizers +authorizes +authorizing +authorless +authorly +authorling +authors +authorship +authotype +autism +autisms +autist +autistic +auto +autoabstract +autoactivation +autoactive +autoaddress +autoagglutinating +autoagglutination +autoagglutinin +autoalarm +autoalkylation +autoallogamy +autoallogamous +autoanalysis +autoanalytic +autoantibody +autoanticomplement +autoantitoxin +autoasphyxiation +autoaspiration +autoassimilation +autobahn +autobahnen +autobahns +autobasidia +autobasidiomycetes +autobasidiomycetous +autobasidium +autobasisii +autobiographal +autobiographer +autobiographers +autobiography +autobiographic +autobiographical +autobiographically +autobiographies +autobiographist +autobiology +autoblast +autoboat +autoboating +autobolide +autobus +autobuses +autobusses +autocab +autocade +autocades +autocall +autocamp +autocamper +autocamping +autocar +autocarist +autocarp +autocarpian +autocarpic +autocarpous +autocatalepsy +autocatalyses +autocatalysis +autocatalytic +autocatalytically +autocatalyze +autocatharsis +autocatheterism +autocephaly +autocephalia +autocephalic +autocephality +autocephalous +autoceptive +autochanger +autochemical +autocholecystectomy +autochrome +autochromy +autochronograph +autochthon +autochthonal +autochthones +autochthony +autochthonic +autochthonism +autochthonous +autochthonously +autochthonousness +autochthons +autochton +autocycle +autocide +autocinesis +autocystoplasty +autocytolysis +autocytolytic +autoclasis +autoclastic +autoclave +autoclaved +autoclaves +autoclaving +autocoder +autocoenobium +autocoherer +autocoid +autocoids +autocollimate +autocollimation +autocollimator +autocollimators +autocolony +autocombustible +autocombustion +autocomplexes +autocondensation +autoconduction +autoconvection +autoconverter +autocopist +autocoprophagous +autocorrelate +autocorrelation +autocorrosion +autocosm +autocracy +autocracies +autocrat +autocratic +autocratical +autocratically +autocraticalness +autocrator +autocratoric +autocratorical +autocratrix +autocrats +autocratship +autocremation +autocriticism +autocross +autocue +autodecomposition +autodecrement +autodecremented +autodecrements +autodepolymerization +autodermic +autodestruction +autodetector +autodiagnosis +autodiagnostic +autodiagrammatic +autodial +autodialed +autodialer +autodialers +autodialing +autodialled +autodialling +autodials +autodidact +autodidactic +autodidactically +autodidacts +autodifferentiation +autodiffusion +autodigestion +autodigestive +autodynamic +autodyne +autodynes +autodrainage +autodrome +autoecholalia +autoecy +autoecic +autoecious +autoeciously +autoeciousness +autoecism +autoecous +autoed +autoeducation +autoeducative +autoelectrolysis +autoelectrolytic +autoelectronic +autoelevation +autoepigraph +autoepilation +autoerotic +autoerotically +autoeroticism +autoerotism +autoette +autoexcitation +autofecundation +autofermentation +autofluorescence +autoformation +autofrettage +autogamy +autogamic +autogamies +autogamous +autogauge +autogeneal +autogeneses +autogenesis +autogenetic +autogenetically +autogeny +autogenic +autogenies +autogenous +autogenously +autogenuous +autogiro +autogyro +autogiros +autogyros +autognosis +autognostic +autograft +autografting +autogram +autograph +autographal +autographed +autographer +autography +autographic +autographical +autographically +autographing +autographism +autographist +autographometer +autographs +autogravure +autoharp +autoheader +autohemic +autohemolysin +autohemolysis +autohemolytic +autohemorrhage +autohemotherapy +autoheterodyne +autoheterosis +autohexaploid +autohybridization +autohypnosis +autohypnotic +autohypnotically +autohypnotism +autohypnotization +autoicous +autoignition +autoimmune +autoimmunity +autoimmunities +autoimmunization +autoimmunize +autoimmunized +autoimmunizing +autoincrement +autoincremented +autoincrements +autoindex +autoindexing +autoinduction +autoinductive +autoinfection +autoinfusion +autoing +autoinhibited +autoinoculable +autoinoculation +autointellectual +autointoxicant +autointoxication +autoionization +autoirrigation +autoist +autojigger +autojuggernaut +autokinesy +autokinesis +autokinetic +autokrator +autolaryngoscope +autolaryngoscopy +autolaryngoscopic +autolater +autolatry +autolavage +autolesion +autolimnetic +autolysate +autolyse +autolysin +autolysis +autolith +autolithograph +autolithographer +autolithography +autolithographic +autolytic +autolytus +autolyzate +autolyze +autolyzed +autolyzes +autolyzing +autoloader +autoloaders +autoloading +autology +autological +autologist +autologous +autoluminescence +autoluminescent +automa +automacy +automaker +automan +automania +automanipulation +automanipulative +automanual +automat +automata +automatable +automate +automated +automates +automatic +automatical +automatically +automaticity +automatics +automatictacessing +automatin +automation +automatism +automatist +automative +automatization +automatize +automatized +automatizes +automatizing +automatograph +automaton +automatonlike +automatons +automatonta +automatontons +automatous +automats +automechanical +automechanism +automelon +automen +autometamorphosis +autometry +autometric +automysophobia +automobile +automobiled +automobiles +automobiling +automobilism +automobilist +automobilistic +automobilists +automobility +automolite +automonstration +automorph +automorphic +automorphically +automorphism +automotive +automotor +automower +autompne +autonavigator +autonavigators +autonegation +autonephrectomy +autonephrotoxin +autonetics +autoneurotoxin +autonym +autonitridation +autonoetic +autonomasy +autonomy +autonomic +autonomical +autonomically +autonomies +autonomist +autonomize +autonomous +autonomously +autonomousness +autooxidation +autoparasitism +autopathy +autopathic +autopathography +autopelagic +autopepsia +autophagi +autophagy +autophagia +autophagous +autophyllogeny +autophyte +autophytic +autophytically +autophytograph +autophytography +autophoby +autophobia +autophon +autophone +autophony +autophonoscope +autophonous +autophotoelectric +autophotograph +autophotometry +autophthalmoscope +autopilot +autopilots +autopyotherapy +autopista +autoplagiarism +autoplasmotherapy +autoplast +autoplasty +autoplastic +autoplastically +autoplasties +autopneumatic +autopoint +autopoisonous +autopolar +autopolyploid +autopolyploidy +autopolo +autopoloist +autopore +autoportrait +autoportraiture +autopositive +autopotamic +autopotent +autoprogressive +autoproteolysis +autoprothesis +autopsy +autopsic +autopsical +autopsychic +autopsychoanalysis +autopsychology +autopsychorhythmia +autopsychosis +autopsied +autopsies +autopsying +autopsist +autoptic +autoptical +autoptically +autopticity +autoput +autor +autoracemization +autoradiogram +autoradiograph +autoradiography +autoradiographic +autorail +autoreduction +autoreflection +autoregenerator +autoregressive +autoregulation +autoregulative +autoregulatory +autoreinfusion +autoretardation +autorhythmic +autorhythmus +autoriser +autorotate +autorotation +autorotational +autoroute +autorrhaphy +autos +autosauri +autosauria +autoschediasm +autoschediastic +autoschediastical +autoschediastically +autoschediaze +autoscience +autoscope +autoscopy +autoscopic +autosender +autosensitization +autosensitized +autosepticemia +autoserotherapy +autoserum +autosexing +autosight +autosign +autosymbiontic +autosymbolic +autosymbolical +autosymbolically +autosymnoia +autosyn +autosyndesis +autosite +autositic +autoskeleton +autosled +autoslip +autosomal +autosomally +autosomatognosis +autosomatognostic +autosome +autosomes +autosoteric +autosoterism +autospore +autosporic +autospray +autostability +autostage +autostandardization +autostarter +autostethoscope +autostyly +autostylic +autostylism +autostoper +autostrada +autostradas +autosuggest +autosuggestibility +autosuggestible +autosuggestion +autosuggestionist +autosuggestions +autosuggestive +autosuppression +autota +autotelegraph +autotelic +autotelism +autotetraploid +autotetraploidy +autothaumaturgist +autotheater +autotheism +autotheist +autotherapeutic +autotherapy +autothermy +autotimer +autotype +autotypes +autotyphization +autotypy +autotypic +autotypies +autotypography +autotomy +autotomic +autotomies +autotomise +autotomised +autotomising +autotomize +autotomized +autotomizing +autotomous +autotoxaemia +autotoxemia +autotoxic +autotoxication +autotoxicity +autotoxicosis +autotoxin +autotoxis +autotractor +autotransformer +autotransfusion +autotransplant +autotransplantation +autotrepanation +autotriploid +autotriploidy +autotroph +autotrophy +autotrophic +autotrophically +autotropic +autotropically +autotropism +autotruck +autotuberculin +autoturning +autourine +autovaccination +autovaccine +autovalet +autovalve +autovivisection +autoxeny +autoxidation +autoxidator +autoxidizability +autoxidizable +autoxidize +autoxidizer +autozooid +autre +autrefois +autumn +autumnal +autumnally +autumnian +autumnity +autumns +autunian +autunite +autunites +auturgy +aux +auxamylase +auxanogram +auxanology +auxanometer +auxeses +auxesis +auxetic +auxetical +auxetically +auxetics +auxil +auxiliar +auxiliary +auxiliaries +auxiliarly +auxiliate +auxiliation +auxiliator +auxiliatory +auxilytic +auxilium +auxillary +auximone +auxin +auxinic +auxinically +auxins +auxoaction +auxoamylase +auxoblast +auxobody +auxocardia +auxochrome +auxochromic +auxochromism +auxochromous +auxocyte +auxoflore +auxofluor +auxograph +auxographic +auxohormone +auxology +auxometer +auxospore +auxosubstance +auxotonic +auxotox +auxotroph +auxotrophy +auxotrophic +av +ava +avadana +avadavat +avadavats +avadhuta +avahi +avail +availabile +availability +availabilities +available +availableness +availably +availed +availer +availers +availing +availingly +availment +avails +aval +avalanche +avalanched +avalanches +avalanching +avale +avalent +avalon +avalvular +avance +avanguardisti +avania +avanious +avanyu +avant +avantage +avanters +avantgarde +avanti +avantlay +avanturine +avar +avaradrano +avaram +avaremotemo +avarian +avarice +avarices +avaricious +avariciously +avariciousness +avarish +avaritia +avars +avascular +avast +avatar +avatara +avatars +avaunt +avdp +ave +avell +avellan +avellane +avellaneous +avellano +avelonge +aveloz +avena +avenaceous +avenage +avenalin +avenant +avenary +avener +avenery +avenge +avenged +avengeful +avengement +avenger +avengeress +avengers +avenges +avenging +avengingly +aveny +avenida +aveniform +avenin +avenine +avenolith +avenous +avens +avenses +aventail +aventayle +aventails +aventine +aventre +aventure +aventurin +aventurine +avenue +avenues +aver +avera +average +averaged +averagely +averageness +averager +averages +averaging +averah +avery +averia +averil +averin +averish +averment +averments +avern +avernal +avernus +averrable +averral +averred +averrer +averrhoa +averring +averroism +averroist +averroistic +averruncate +averruncation +averruncator +avers +aversant +aversation +averse +aversely +averseness +aversion +aversions +aversive +avert +avertable +averted +avertedly +averter +avertible +avertiment +avertin +averting +avertive +averts +aves +avesta +avestan +avestruz +aveugle +avg +avgas +avgases +avgasses +aviador +avyayibhava +avian +avianization +avianize +avianized +avianizes +avianizing +avians +aviararies +aviary +aviaries +aviarist +aviarists +aviate +aviated +aviates +aviatic +aviating +aviation +aviational +aviations +aviator +aviatory +aviatorial +aviatoriality +aviators +aviatress +aviatrice +aviatrices +aviatrix +aviatrixes +avicennia +avicenniaceae +avicennism +avichi +avicide +avick +avicolous +avicula +avicular +avicularia +avicularian +aviculariidae +avicularimorphae +avicularium +aviculidae +aviculture +aviculturist +avid +avidya +avidin +avidins +avidious +avidiously +avidity +avidities +avidly +avidness +avidnesses +avidous +avie +aview +avifauna +avifaunae +avifaunal +avifaunally +avifaunas +avifaunistic +avigate +avigation +avigator +avigators +avignonese +avijja +avikom +avilaria +avile +avilement +avilion +avine +aviolite +avion +avionic +avionics +avions +avirulence +avirulent +avis +avys +avision +aviso +avisos +avital +avitaminoses +avitaminosis +avitaminotic +avitic +avives +avizandum +avn +avo +avocado +avocadoes +avocados +avocat +avocate +avocation +avocational +avocationally +avocations +avocative +avocatory +avocet +avocets +avodire +avodires +avogadrite +avogadro +avogram +avoy +avoid +avoidable +avoidably +avoidance +avoidances +avoidant +avoided +avoider +avoiders +avoiding +avoidless +avoidment +avoids +avoyer +avoyership +avoir +avoirdupois +avoke +avolate +avolation +avolitional +avondbloem +avos +avoset +avosets +avouch +avouchable +avouched +avoucher +avouchers +avouches +avouching +avouchment +avoue +avour +avoure +avourneen +avouter +avoutry +avow +avowable +avowableness +avowably +avowal +avowals +avowance +avowant +avowe +avowed +avowedly +avowedness +avower +avowers +avowing +avowry +avowries +avows +avowter +avshar +avulse +avulsed +avulses +avulsing +avulsion +avulsions +avuncular +avunculate +avunculize +aw +awa +awabakal +awabi +awacs +awadhi +awaft +awag +away +awayness +awaynesses +aways +await +awaited +awaiter +awaiters +awaiting +awaitlala +awaits +awakable +awake +awakeable +awaked +awaken +awakenable +awakened +awakener +awakeners +awakening +awakeningly +awakenings +awakenment +awakens +awakes +awaking +awakings +awald +awalim +awalt +awan +awane +awanyu +awanting +awapuhi +award +awardable +awarded +awardee +awardees +awarder +awarders +awarding +awardment +awards +aware +awaredom +awareness +awarn +awarrant +awaruite +awash +awaste +awat +awatch +awater +awave +awber +awd +awe +aweary +awearied +aweather +aweband +awed +awedly +awedness +awee +aweek +aweel +aweigh +aweing +aweless +awelessness +awellimiden +awes +awesome +awesomely +awesomeness +awest +awestricken +awestrike +awestruck +aweto +awfu +awful +awfuller +awfullest +awfully +awfulness +awhape +awheel +awheft +awhet +awhile +awhir +awhirl +awide +awiggle +awikiwiki +awin +awing +awingly +awink +awiwi +awk +awkly +awkward +awkwarder +awkwardest +awkwardish +awkwardly +awkwardness +awl +awless +awlessness +awls +awlwort +awlworts +awm +awmbrie +awmous +awn +awned +awner +awny +awning +awninged +awnings +awnless +awnlike +awns +awoke +awoken +awol +awols +awonder +awork +aworry +aworth +awreak +awreck +awry +awrist +awrong +awshar +awunctive +ax +axal +axanthopsia +axbreaker +axe +axebreaker +axed +axel +axels +axeman +axemaster +axemen +axenic +axenically +axer +axerophthol +axers +axes +axfetch +axhammer +axhammered +axhead +axial +axiality +axialities +axially +axiate +axiation +axifera +axiferous +axiform +axifugal +axil +axile +axilemma +axilemmas +axilemmata +axilla +axillae +axillant +axillar +axillary +axillaries +axillars +axillas +axils +axin +axine +axing +axiniform +axinite +axinomancy +axiolite +axiolitic +axiology +axiological +axiologically +axiologies +axiologist +axiom +axiomatic +axiomatical +axiomatically +axiomatization +axiomatizations +axiomatize +axiomatized +axiomatizes +axiomatizing +axioms +axion +axiopisty +axis +axised +axises +axisymmetry +axisymmetric +axisymmetrical +axisymmetrically +axite +axites +axle +axled +axles +axlesmith +axletree +axletrees +axlike +axmaker +axmaking +axman +axmanship +axmaster +axmen +axminster +axodendrite +axofugal +axogamy +axoid +axoidean +axolemma +axolysis +axolotl +axolotls +axometer +axometry +axometric +axon +axonal +axone +axonemal +axoneme +axonemes +axones +axoneure +axoneuron +axonia +axonic +axonolipa +axonolipous +axonometry +axonometric +axonophora +axonophorous +axonopus +axonost +axons +axopetal +axophyte +axoplasm +axoplasmic +axoplasms +axopodia +axopodium +axospermous +axostyle +axotomous +axseed +axseeds +axstone +axtree +axumite +axunge +axweed +axwise +axwort +az +azadirachta +azadrachta +azafran +azafrin +azalea +azaleamum +azaleas +azan +azande +azans +azarole +azaserine +azathioprine +azazel +azedarac +azedarach +azelaic +azelate +azelfafage +azeotrope +azeotropy +azeotropic +azeotropism +azerbaijanese +azerbaijani +azerbaijanian +azha +azide +azides +azido +aziethane +azygobranchia +azygobranchiata +azygobranchiate +azygomatous +azygos +azygoses +azygosperm +azygospore +azygote +azygous +azilian +azilut +azyme +azimech +azimene +azimethylene +azimide +azimin +azimine +azimino +aziminobenzene +azymite +azymous +azimuth +azimuthal +azimuthally +azimuths +azine +azines +azinphosmethyl +aziola +azlactone +azlon +azlons +azo +azobacter +azobenzene +azobenzil +azobenzoic +azobenzol +azoblack +azoch +azocyanide +azocyclic +azocochineal +azocoralline +azocorinth +azodicarboxylic +azodiphenyl +azodisulphonic +azoeosin +azoerythrin +azofy +azofication +azofier +azoflavine +azoformamide +azoformic +azogallein +azogreen +azogrenadine +azohumic +azoic +azoimide +azoisobutyronitrile +azole +azoles +azolitmin +azolla +azomethine +azon +azonal +azonaphthalene +azonic +azonium +azons +azoology +azoospermia +azoparaffin +azophen +azophenetole +azophenyl +azophenylene +azophenine +azophenol +azophosphin +azophosphore +azoprotein +azores +azorian +azorite +azorubine +azosulphine +azosulphonic +azotaemia +azotate +azote +azotea +azoted +azotemia +azotemias +azotemic +azotenesis +azotes +azotetrazole +azoth +azothionium +azoths +azotic +azotin +azotine +azotise +azotised +azotises +azotising +azotite +azotize +azotized +azotizes +azotizing +azotobacter +azotobacterieae +azotoluene +azotometer +azotorrhea +azotorrhoea +azotous +azoturia +azoturias +azovernine +azox +azoxazole +azoxy +azoxyanisole +azoxybenzene +azoxybenzoic +azoxime +azoxynaphthalene +azoxine +azoxyphenetole +azoxytoluidine +azoxonium +azrael +aztec +azteca +aztecan +aztecs +azthionium +azulejo +azulejos +azulene +azuline +azulite +azulmic +azumbre +azure +azurean +azured +azureness +azureous +azures +azury +azurine +azurite +azurites +azurmalachite +azurous +b +ba +baa +baaed +baahling +baaing +baal +baalath +baalim +baalish +baalism +baalisms +baalist +baalite +baalitical +baalize +baals +baalshem +baar +baas +baaskaap +baaskaaps +baaskap +bab +baba +babacoote +babai +babaylan +babaylanes +babajaga +babakoto +babas +babasco +babassu +babassus +babasu +babbage +babby +babbie +babbishly +babbit +babbitt +babbitted +babbitter +babbittess +babbittian +babbitting +babbittism +babbittry +babbitts +babblative +babble +babbled +babblement +babbler +babblers +babbles +babblesome +babbly +babbling +babblingly +babblings +babblish +babblishly +babbool +babbools +babcock +babe +babehood +babel +babeldom +babelet +babelic +babelike +babelish +babelism +babelize +babels +babery +babes +babeship +babesia +babesias +babesiasis +babesiosis +babhan +babi +baby +babiana +babiche +babiches +babydom +babied +babies +babyfied +babyhood +babyhoods +babyhouse +babying +babyish +babyishly +babyishness +babiism +babyism +babylike +babillard +babylon +babylonia +babylonian +babylonians +babylonic +babylonish +babylonism +babylonite +babylonize +babine +babingtonite +babyolatry +babion +babirousa +babiroussa +babirusa +babirusas +babirussa +babis +babysat +babish +babished +babyship +babishly +babishness +babysit +babysitter +babysitting +babism +babist +babite +babka +babkas +bablah +bable +babloh +baboen +babongo +baboo +baboodom +babooism +babool +babools +baboon +baboonery +baboonish +baboonroot +baboons +baboos +baboosh +baboot +babouche +babouvism +babouvist +babracot +babroot +babs +babu +babua +babudom +babuina +babuism +babul +babuls +babuma +babungera +baburd +babus +babushka +babushkas +bac +bacaba +bacach +bacalao +bacalaos +bacao +bacauan +bacbakiri +bacca +baccaceous +baccae +baccalaurean +baccalaureat +baccalaureate +baccalaureates +baccalaureus +baccar +baccara +baccaras +baccarat +baccarats +baccare +baccate +baccated +bacchae +bacchanal +bacchanalia +bacchanalian +bacchanalianism +bacchanalianly +bacchanalias +bacchanalism +bacchanalization +bacchanalize +bacchanals +bacchant +bacchante +bacchantes +bacchantic +bacchants +bacchar +baccharis +baccharoid +baccheion +bacchiac +bacchian +bacchic +bacchical +bacchides +bacchii +bacchiuchii +bacchius +bacchus +bacchuslike +baccy +baccies +bacciferous +bacciform +baccilla +baccilli +baccillla +baccillum +baccivorous +bach +bacharach +bache +bached +bachel +bachelor +bachelordom +bachelorette +bachelorhood +bachelorism +bachelorize +bachelorly +bachelorlike +bachelors +bachelorship +bachelorwise +bachelry +baches +bachichi +baching +bacilary +bacile +bacillaceae +bacillar +bacillary +bacillariaceae +bacillariaceous +bacillariales +bacillarieae +bacillariophyta +bacillemia +bacilli +bacillian +bacillicidal +bacillicide +bacillicidic +bacilliculture +bacilliform +bacilligenic +bacilliparous +bacillite +bacillogenic +bacillogenous +bacillophobia +bacillosis +bacilluria +bacillus +bacin +bacis +bacitracin +back +backache +backaches +backachy +backaching +backadation +backage +backare +backarrow +backarrows +backband +backbar +backbear +backbearing +backbeat +backbeats +backbencher +backbenchers +backbend +backbends +backberand +backberend +backbit +backbite +backbiter +backbiters +backbites +backbiting +backbitingly +backbitten +backblocks +backblow +backboard +backboards +backbone +backboned +backboneless +backbonelessness +backbones +backbrand +backbreaker +backbreaking +backcap +backcast +backcasts +backchain +backchat +backchats +backcloth +backcomb +backcountry +backcourt +backcourtman +backcross +backdate +backdated +backdates +backdating +backdoor +backdown +backdrop +backdrops +backed +backen +backened +backening +backer +backers +backet +backfall +backfatter +backfield +backfields +backfill +backfilled +backfiller +backfilling +backfills +backfire +backfired +backfires +backfiring +backflap +backflash +backflip +backflow +backflowing +backfold +backframe +backfriend +backfurrow +backgame +backgammon +backgeared +background +backgrounds +backhand +backhanded +backhandedly +backhandedness +backhander +backhanding +backhands +backhatch +backhaul +backhauled +backhauling +backhauls +backheel +backhoe +backhoes +backhooker +backhouse +backhouses +backy +backyard +backyarder +backyards +backie +backiebird +backing +backings +backjaw +backjoint +backland +backlands +backlash +backlashed +backlasher +backlashes +backlashing +backless +backlet +backliding +backlighting +backlings +backlins +backlist +backlists +backlit +backlog +backlogged +backlogging +backlogs +backlotter +backmost +backoff +backorder +backout +backouts +backpack +backpacked +backpacker +backpackers +backpacking +backpacks +backpedal +backpedaled +backpedaling +backpiece +backplane +backplanes +backplate +backpointer +backpointers +backrest +backrests +backrope +backropes +backrun +backrush +backrushes +backs +backsaw +backsaws +backscatter +backscattered +backscattering +backscatters +backscraper +backscratcher +backscratching +backseat +backseats +backsey +backset +backsets +backsetting +backsettler +backsheesh +backshift +backshish +backside +backsides +backsight +backsite +backslap +backslapped +backslapper +backslappers +backslapping +backslaps +backslash +backslashes +backslid +backslidden +backslide +backslided +backslider +backsliders +backslides +backsliding +backslidingness +backspace +backspaced +backspacefile +backspacer +backspaces +backspacing +backspang +backspear +backspeer +backspeir +backspier +backspierer +backspin +backspins +backsplice +backspliced +backsplicing +backspread +backspringing +backstab +backstabbed +backstabber +backstabbing +backstaff +backstage +backstay +backstair +backstairs +backstays +backstamp +backster +backstick +backstitch +backstitched +backstitches +backstitching +backstone +backstop +backstopped +backstopping +backstops +backstrap +backstrapped +backstreet +backstretch +backstretches +backstring +backstrip +backstroke +backstroked +backstrokes +backstroking +backstromite +backswept +backswimmer +backswing +backsword +backswording +backswordman +backswordmen +backswordsman +backtack +backtalk +backtender +backtenter +backtrace +backtrack +backtracked +backtracker +backtrackers +backtracking +backtracks +backtrail +backtrick +backup +backups +backus +backveld +backvelder +backway +backwall +backward +backwardation +backwardly +backwardness +backwards +backwash +backwashed +backwasher +backwashes +backwashing +backwater +backwatered +backwaters +backwind +backwinded +backwinding +backwood +backwoods +backwoodser +backwoodsy +backwoodsiness +backwoodsman +backwoodsmen +backword +backworm +backwort +backwrap +backwraps +baclava +baclin +bacon +baconer +bacony +baconian +baconianism +baconic +baconism +baconist +baconize +bacons +baconweed +bacopa +bacquet +bact +bacteraemia +bacteremia +bacteremic +bacteria +bacteriaceae +bacteriaceous +bacteriaemia +bacterial +bacterially +bacterian +bacteric +bactericholia +bactericidal +bactericidally +bactericide +bactericides +bactericidin +bacterid +bacteriemia +bacteriform +bacterin +bacterins +bacterioagglutinin +bacterioblast +bacteriochlorophyll +bacteriocidal +bacteriocin +bacteriocyte +bacteriodiagnosis +bacteriofluorescin +bacteriogenic +bacteriogenous +bacteriohemolysin +bacterioid +bacterioidal +bacteriol +bacteriolysin +bacteriolysis +bacteriolytic +bacteriolyze +bacteriology +bacteriologic +bacteriological +bacteriologically +bacteriologies +bacteriologist +bacteriologists +bacteriopathology +bacteriophage +bacteriophages +bacteriophagy +bacteriophagia +bacteriophagic +bacteriophagous +bacteriophobia +bacterioprecipitin +bacterioprotein +bacteriopsonic +bacteriopsonin +bacteriopurpurin +bacteriorhodopsin +bacterioscopy +bacterioscopic +bacterioscopical +bacterioscopically +bacterioscopist +bacteriosis +bacteriosolvent +bacteriostasis +bacteriostat +bacteriostatic +bacteriostatically +bacteriotherapeutic +bacteriotherapy +bacteriotoxic +bacteriotoxin +bacteriotrypsin +bacteriotropic +bacteriotropin +bacterious +bacteririum +bacteritic +bacterium +bacteriuria +bacterization +bacterize +bacterized +bacterizing +bacteroid +bacteroidal +bacteroideae +bacteroides +bactetiophage +bactrian +bactris +bactrites +bactriticone +bactritoid +bacubert +bacula +bacule +baculere +baculi +baculiferous +baculiform +baculine +baculite +baculites +baculitic +baculiticone +baculoid +baculum +baculums +baculus +bacury +bad +badaga +badan +badarian +badarrah +badass +badassed +badasses +badaud +badawi +badaxe +badchan +baddeleyite +badder +badderlocks +baddest +baddy +baddie +baddies +baddish +baddishly +baddishness +baddock +bade +badenite +badge +badged +badgeless +badgeman +badgemen +badger +badgerbrush +badgered +badgerer +badgering +badgeringly +badgerly +badgerlike +badgers +badgerweed +badges +badging +badgir +badhan +badiaga +badian +badigeon +badinage +badinaged +badinages +badinaging +badiner +badinerie +badineur +badious +badju +badland +badlands +badly +badling +badman +badmash +badmen +badminton +badmouth +badmouthed +badmouthing +badmouths +badness +badnesses +badon +badrans +bads +baduhenna +bae +baedeker +baedekerian +baedekers +bael +baeria +baetyl +baetylic +baetylus +baetuli +baetulus +baetzner +bafaro +baff +baffed +baffeta +baffy +baffies +baffing +baffle +baffled +bafflement +bafflements +baffleplate +baffler +bafflers +baffles +baffling +bafflingly +bafflingness +baffs +bafyot +baft +bafta +baftah +bag +baga +baganda +bagani +bagass +bagasse +bagasses +bagataway +bagatelle +bagatelles +bagatine +bagattini +bagattino +bagaudae +bagdad +bagdi +bagel +bagels +bagful +bagfuls +baggage +baggageman +baggagemaster +baggager +baggages +baggala +bagganet +baggara +bagge +bagged +bagger +baggers +baggy +baggie +baggier +baggies +baggiest +baggily +bagginess +bagging +baggings +baggyrinkle +baggit +baggywrinkle +bagh +baghdad +bagheli +baghla +baghouse +bagie +baginda +bagio +bagios +bagirmi +bagle +bagleaves +baglike +bagmaker +bagmaking +bagman +bagmen +bagne +bagnes +bagnet +bagnette +bagnio +bagnios +bagnut +bago +bagobo +bagonet +bagong +bagoong +bagpipe +bagpiped +bagpiper +bagpipers +bagpipes +bagpiping +bagplant +bagpod +bagpudding +bagrationite +bagre +bagreef +bagroom +bags +bagsful +bagtikan +baguet +baguets +baguette +baguettes +baguio +baguios +bagwash +bagwig +bagwigged +bagwigs +bagwyn +bagwoman +bagwomen +bagwork +bagworm +bagworms +bah +bahada +bahadur +bahadurs +bahai +bahay +bahaism +bahaist +baham +bahama +bahamas +bahamian +bahamians +bahan +bahar +bahaullah +bahawder +bahera +bahiaite +bahima +bahisti +bahmani +bahmanid +bahnung +baho +bahoe +bahoo +baht +bahts +bahuma +bahur +bahut +bahuts +bahutu +bahuvrihi +bahuvrihis +bai +bay +baya +bayadeer +bayadeers +bayadere +bayaderes +bayal +bayamo +bayamos +baianism +bayano +bayard +bayardly +bayards +bayberry +bayberries +baybolt +baybush +baycuru +baidak +baidar +baidarka +baidarkas +baidya +bayed +baiera +bayesian +bayeta +bayete +baygall +baiginet +baign +baignet +baigneuse +baigneuses +baignoire +bayhead +baying +bayish +baikalite +baikerinite +baikerite +baikie +bail +bailable +bailage +bayldonite +baile +bailed +bailee +bailees +bailey +baileys +bailer +bailers +baylet +bailiary +bailiaries +bailie +bailiery +bailieries +bailies +bailieship +bailiff +bailiffry +bailiffs +bailiffship +bailiffwick +baylike +bailing +bailiwick +bailiwicks +bailli +bailliage +baillie +baillone +baillonella +bailment +bailments +bailo +bailor +bailors +bailout +bailouts +bailpiece +bails +bailsman +bailsmen +bailwood +bayman +baymen +bain +bayness +bainie +baining +bainite +baioc +baiocchi +baiocco +bayogoula +bayok +bayonet +bayoneted +bayoneteer +bayoneting +bayonets +bayonetted +bayonetting +bayong +bayou +bayous +bairagi +bairam +bairdi +bairn +bairnie +bairnish +bairnishness +bairnly +bairnlier +bairnliest +bairnliness +bairns +bairnteam +bairnteem +bairntime +bairnwort +bais +bays +baisakh +baisemain +baysmelt +baysmelts +baister +bait +baited +baiter +baiters +baitfish +baith +baitylos +baiting +baits +baittle +baywood +baywoods +bayz +baiza +baizas +baize +baized +baizes +baizing +baja +bajada +bajan +bajardo +bajarigar +bajau +bajocco +bajochi +bajocian +bajoire +bajonado +bajra +bajree +bajri +bajulate +bajury +baka +bakairi +bakal +bakalai +bakalei +bakatan +bake +bakeapple +bakeboard +baked +bakehead +bakehouse +bakehouses +bakelite +bakelize +bakemeat +bakemeats +baken +bakeout +bakeoven +bakepan +baker +bakerdom +bakeress +bakery +bakeries +bakerite +bakerless +bakerly +bakerlike +bakers +bakersfield +bakership +bakes +bakeshop +bakeshops +bakestone +bakeware +bakhtiari +bakie +baking +bakingly +bakings +baklava +baklavas +baklawa +baklawas +bakli +bakongo +bakra +bakshaish +baksheesh +baksheeshes +bakshi +bakshis +bakshish +bakshished +bakshishes +bakshishing +baktun +baku +bakuba +bakula +bakunda +bakuninism +bakuninist +bakupari +bakutu +bakwiri +bal +bala +balaam +balaamite +balaamitical +balabos +balachan +balachong +balaclava +balada +baladine +balaena +balaenicipites +balaenid +balaenidae +balaenoid +balaenoidea +balaenoidean +balaenoptera +balaenopteridae +balafo +balagan +balaghat +balaghaut +balai +balaic +balayeuse +balak +balaklava +balalaika +balalaikas +balan +balance +balanceable +balanced +balancedness +balancelle +balanceman +balancement +balancer +balancers +balances +balancewise +balancing +balander +balandra +balandrana +balaneutics +balangay +balanic +balanid +balanidae +balaniferous +balanism +balanite +balanites +balanitis +balanoblennorrhea +balanocele +balanoglossida +balanoglossus +balanoid +balanophora +balanophoraceae +balanophoraceous +balanophore +balanophorin +balanoplasty +balanoposthitis +balanopreputial +balanops +balanopsidaceae +balanopsidales +balanorrhagia +balant +balanta +balante +balantidial +balantidiasis +balantidic +balantidiosis +balantidium +balanus +balao +balaos +balaphon +balarama +balarao +balas +balases +balat +balata +balatas +balate +balatong +balatron +balatronic +balatte +balau +balausta +balaustine +balaustre +balawa +balawu +balboa +balboas +balbriggan +balbusard +balbutiate +balbutient +balbuties +balche +balcon +balcone +balconet +balconette +balcony +balconied +balconies +bald +baldacchini +baldacchino +baldachin +baldachined +baldachini +baldachino +baldachinos +baldachins +baldakin +baldaquin +baldberry +baldcrown +balded +balden +balder +balderdash +baldest +baldfaced +baldhead +baldheaded +baldheads +baldy +baldicoot +baldie +balding +baldish +baldly +baldling +baldmoney +baldmoneys +baldness +baldnesses +baldoquin +baldpate +baldpated +baldpatedness +baldpates +baldrib +baldric +baldrick +baldricked +baldricks +baldrics +baldricwise +balds +balducta +balductum +baldwin +bale +baleare +balearian +balearic +balearica +balebos +baled +baleen +baleens +balefire +balefires +baleful +balefully +balefulness +balei +baleys +baleise +baleless +baler +balers +bales +balestra +balete +balewort +bali +balian +balibago +balibuntal +balibuntl +balija +balilla +balimbing +baline +balinese +baling +balinger +balinghasay +balisaur +balisaurs +balisier +balistarii +balistarius +balister +balistes +balistid +balistidae +balistraria +balita +balitao +baliti +balize +balk +balkan +balkanic +balkanization +balkanize +balkanized +balkanizing +balkans +balkar +balked +balker +balkers +balky +balkier +balkiest +balkily +balkiness +balking +balkingly +balkis +balkish +balkline +balklines +balks +ball +ballad +ballade +balladeer +balladeers +ballader +balladeroyal +ballades +balladic +balladical +balladier +balladise +balladised +balladising +balladism +balladist +balladize +balladized +balladizing +balladlike +balladling +balladmonger +balladmongering +balladry +balladries +balladromic +ballads +balladwise +ballahoo +ballahou +ballam +ballan +ballant +ballarag +ballard +ballas +ballast +ballastage +ballasted +ballaster +ballastic +ballasting +ballasts +ballat +ballata +ballate +ballaton +ballatoon +ballbuster +ballcarrier +balldom +balldress +balled +baller +ballerina +ballerinas +ballerine +ballers +ballet +balletic +balletically +balletomane +balletomanes +balletomania +ballets +ballett +ballfield +ballflower +ballgame +ballgames +ballgown +ballgowns +ballhausplatz +ballhawk +ballhawks +ballhooter +balli +bally +balliage +ballies +ballyhack +ballyhoo +ballyhooed +ballyhooer +ballyhooing +ballyhoos +balling +ballyrag +ballyragged +ballyragging +ballyrags +ballised +ballism +ballismus +ballist +ballista +ballistae +ballistic +ballistically +ballistician +ballisticians +ballistics +ballistite +ballistocardiogram +ballistocardiograph +ballistocardiography +ballistocardiographic +ballistophobia +ballium +ballywack +ballywrack +ballmine +ballo +ballock +ballocks +balloen +ballogan +ballon +ballone +ballones +ballonet +ballonets +ballonette +ballonne +ballonnes +ballons +balloon +balloonation +ballooned +ballooner +balloonery +ballooners +balloonet +balloonfish +balloonfishes +balloonflower +balloonful +ballooning +balloonish +balloonist +balloonlike +balloons +ballot +ballota +ballotade +ballotage +ballote +balloted +balloter +balloters +balloting +ballotist +ballots +ballottable +ballottement +ballottine +ballottines +ballow +ballpark +ballparks +ballplayer +ballplayers +ballplatz +ballpoint +ballpoints +ballproof +ballroom +ballrooms +balls +ballsy +ballsier +ballsiest +ballstock +ballup +ballute +ballutes +ballweed +balm +balmacaan +balmarcodes +balmawhapple +balmy +balmier +balmiest +balmily +balminess +balmlike +balmony +balmonies +balmoral +balmorals +balms +balnea +balneae +balneal +balneary +balneation +balneatory +balneographer +balneography +balneology +balneologic +balneological +balneologist +balneophysiology +balneotechnics +balneotherapeutics +balneotherapy +balneotherapia +balneum +balnibarbi +baloch +baloghia +balolo +balon +balonea +baloney +baloneys +baloo +balopticon +balor +baloskion +baloskionaceae +balotade +balourdise +balow +balr +bals +balsa +balsam +balsamaceous +balsamation +balsamea +balsameaceae +balsameaceous +balsamed +balsamer +balsamy +balsamic +balsamical +balsamically +balsamiferous +balsamina +balsaminaceae +balsaminaceous +balsamine +balsaming +balsamitic +balsamiticness +balsamize +balsamo +balsamodendron +balsamorrhiza +balsamous +balsamroot +balsams +balsamum +balsamweed +balsas +balsawood +balt +baltei +balter +baltetei +balteus +balthasar +baltheus +balti +baltic +baltimore +baltimorean +baltimorite +baltis +balu +baluba +baluch +baluchi +baluchistan +baluchithere +baluchitheria +baluchitherium +baluga +balun +balunda +balushai +baluster +balustered +balusters +balustrade +balustraded +balustrades +balustrading +balut +balwarra +balza +balzacian +balzarine +bam +bamah +bamalip +bamangwato +bambacciata +bamban +bambara +bambini +bambino +bambinos +bambocciade +bambochade +bamboche +bamboo +bamboos +bamboozle +bamboozled +bamboozlement +bamboozler +bamboozlers +bamboozles +bamboozling +bambos +bamboula +bambuba +bambuco +bambuk +bambusa +bambuseae +bambute +bammed +bamming +bamoth +bams +ban +bana +banaba +banago +banagos +banak +banakite +banal +banality +banalities +banalize +banally +banalness +banana +bananaland +bananalander +bananaquit +bananas +banande +bananist +bananivorous +banat +banate +banatite +banausic +banba +banbury +banc +banca +bancal +bancales +bancha +banchi +banco +bancos +bancus +band +banda +bandage +bandaged +bandager +bandagers +bandages +bandaging +bandagist +bandaid +bandaite +bandaka +bandala +bandalore +bandana +bandanaed +bandanas +bandanna +bandannaed +bandannas +bandar +bandarlog +bandbox +bandboxes +bandboxy +bandboxical +bandcase +bandcutter +bande +bandeau +bandeaus +bandeaux +banded +bandel +bandelet +bandelette +bandeng +bander +banderilla +banderillas +banderillero +banderilleros +banderlog +banderma +banderol +banderole +banderoled +banderoles +banderoling +banderols +banders +bandersnatch +bandfile +bandfiled +bandfiling +bandfish +bandgap +bandh +bandhava +bandhook +bandhor +bandhu +bandi +bandy +bandyball +bandicoy +bandicoot +bandicoots +bandido +bandidos +bandie +bandied +bandies +bandying +bandikai +bandylegged +bandyman +bandiness +banding +bandit +banditism +banditry +banditries +bandits +banditti +bandle +bandleader +bandless +bandlessly +bandlessness +bandlet +bandlimit +bandlimited +bandlimiting +bandlimits +bandman +bandmaster +bandmasters +bando +bandobust +bandog +bandogs +bandoleer +bandoleered +bandoleers +bandolerismo +bandolero +bandoleros +bandolier +bandoliered +bandoline +bandon +bandonion +bandor +bandora +bandoras +bandore +bandores +bandos +bandpass +bandrol +bands +bandsaw +bandsawed +bandsawing +bandsawn +bandsman +bandsmen +bandspreading +bandstand +bandstands +bandster +bandstop +bandstring +bandura +bandurria +bandurrias +bandusia +bandusian +bandwagon +bandwagons +bandwidth +bandwidths +bandwork +bandworm +bane +baneberry +baneberries +baned +baneful +banefully +banefulness +banes +banewort +banff +bang +banga +bangala +bangalay +bangalow +bangash +bangboard +bange +banged +banger +bangers +banghy +bangy +bangia +bangiaceae +bangiaceous +bangiales +banging +bangkok +bangkoks +bangladesh +bangle +bangled +bangles +bangling +bangos +bangs +bangster +bangtail +bangtailed +bangtails +bangup +bangwaketsi +bani +bania +banya +banyai +banian +banyan +banians +banyans +banig +baniya +banilad +baning +banyoro +banish +banished +banisher +banishers +banishes +banishing +banishment +banishments +banister +banisterine +banisters +banyuls +baniva +baniwa +banjara +banjo +banjoes +banjoist +banjoists +banjore +banjorine +banjos +banjuke +banjulele +bank +bankable +bankalachi +bankbook +bankbooks +bankcard +bankcards +banked +banker +bankera +bankerdom +bankeress +bankers +banket +bankfull +banky +banking +bankings +bankman +bankmen +banknote +banknotes +bankrider +bankroll +bankrolled +bankroller +bankrolling +bankrolls +bankrupcy +bankrupt +bankruptcy +bankruptcies +bankrupted +bankrupting +bankruptism +bankruptly +bankruptlike +bankrupts +bankruptship +bankrupture +banks +bankshall +banksia +banksian +banksias +bankside +banksides +banksman +banksmen +bankweed +banlieu +banlieue +bannack +bannat +banned +banner +bannered +bannerer +banneret +bannerets +bannerette +bannerfish +bannerless +bannerlike +bannerline +bannerman +bannermen +bannerol +bannerole +bannerols +banners +bannerwise +bannet +bannets +bannimus +banning +bannister +bannisters +bannition +bannock +bannockburn +bannocks +banns +bannut +banovina +banque +banquet +banqueted +banqueteer +banqueteering +banqueter +banqueters +banqueting +banquetings +banquets +banquette +banquettes +banquo +bans +bansalague +bansela +banshee +banshees +banshie +banshies +banstickle +bant +bantay +bantayan +bantam +bantamize +bantams +bantamweight +bantamweights +banteng +banter +bantered +banterer +banterers +bantery +bantering +banteringly +banters +banty +bantin +banting +bantingism +bantingize +bantings +bantling +bantlings +bantoid +bantu +bantus +banuyo +banus +banxring +banzai +banzais +baobab +baobabs +bap +baphia +baphomet +baphometic +bapistery +bapt +baptanodon +baptise +baptised +baptises +baptisia +baptisias +baptisin +baptising +baptism +baptismal +baptismally +baptisms +baptist +baptistery +baptisteries +baptistic +baptistry +baptistries +baptists +baptizable +baptize +baptized +baptizee +baptizement +baptizer +baptizers +baptizes +baptizing +baptornis +bar +bara +barabara +barabbas +barabora +barabra +baraca +barad +baradari +baragnosis +baragouin +baragouinish +baraita +baraithas +barajillo +baraka +baralipton +baramika +baramin +barandos +barangay +barani +bararesque +bararite +barasingha +barat +barathea +baratheas +barathra +barathron +barathrum +barato +baratte +barauna +baraza +barb +barba +barbacan +barbacoa +barbacoan +barbacou +barbadian +barbadoes +barbados +barbal +barbaloin +barbar +barbara +barbaralalia +barbarea +barbaresque +barbary +barbarian +barbarianism +barbarianize +barbarianized +barbarianizing +barbarians +barbaric +barbarical +barbarically +barbarious +barbariousness +barbarisation +barbarise +barbarised +barbarising +barbarism +barbarisms +barbarity +barbarities +barbarization +barbarize +barbarized +barbarizes +barbarizing +barbarous +barbarously +barbarousness +barbas +barbasco +barbascoes +barbascos +barbastel +barbastelle +barbate +barbated +barbatimao +barbe +barbeau +barbecue +barbecued +barbecueing +barbecuer +barbecues +barbecuing +barbed +barbedness +barbeyaceae +barbeiro +barbel +barbeled +barbell +barbellate +barbells +barbellula +barbellulae +barbellulate +barbels +barbeque +barbequed +barbequing +barber +barbera +barbered +barberess +barberfish +barbery +barbering +barberish +barberite +barbermonger +barbero +barberry +barberries +barbers +barbershop +barbershops +barbes +barbet +barbets +barbette +barbettes +barbican +barbicanage +barbicans +barbicel +barbicels +barbierite +barbigerous +barbing +barbion +barbita +barbital +barbitalism +barbitals +barbiton +barbitone +barbitos +barbituism +barbiturate +barbiturates +barbituric +barbiturism +barble +barbless +barblet +barboy +barbola +barbone +barbotine +barbotte +barbouillage +barbra +barbre +barbs +barbu +barbudo +barbudos +barbula +barbulate +barbule +barbules +barbulyie +barbut +barbute +barbuts +barbwire +barbwires +barcan +barcarole +barcaroles +barcarolle +barcas +barcella +barcelona +barcelonas +barchan +barchans +barche +barcolongo +barcone +barcoo +bard +bardane +bardash +bardcraft +barde +barded +bardee +bardel +bardelle +bardes +bardesanism +bardesanist +bardesanite +bardess +bardy +bardic +bardie +bardier +bardiest +bardiglio +bardily +bardiness +barding +bardings +bardish +bardism +bardlet +bardlike +bardling +bardo +bardocucullus +bardolater +bardolatry +bardolph +bardolphian +bards +bardship +bardulph +bare +bareback +barebacked +bareboat +bareboats +barebone +bareboned +barebones +bareca +bared +barefaced +barefacedly +barefacedness +barefisted +barefit +barefoot +barefooted +barege +bareges +barehanded +barehead +bareheaded +bareheadedness +bareka +bareknuckle +bareknuckled +barelegged +barely +barenecked +bareness +barenesses +barer +bares +baresark +baresarks +baresma +barest +baresthesia +baret +baretta +barf +barfed +barff +barfy +barfing +barfish +barfly +barflies +barfs +barful +bargain +bargainable +bargained +bargainee +bargainer +bargainers +bargaining +bargainor +bargains +bargainwise +bargander +barge +bargeboard +barged +bargee +bargeer +bargees +bargeese +bargehouse +bargelike +bargelli +bargello +bargellos +bargeload +bargeman +bargemaster +bargemen +bargepole +barger +barges +bargestone +bargh +bargham +barghest +barghests +barging +bargir +bargoose +barguest +barguests +barhal +barhop +barhopped +barhopping +barhops +bari +baria +bariatrician +bariatrics +baric +barycenter +barycentre +barycentric +barid +barie +barye +baryecoia +baryes +baryglossia +barih +barylalia +barile +barylite +barilla +barillas +baring +bariolage +baryon +baryonic +baryons +baryphony +baryphonia +baryphonic +baris +barish +barysilite +barysphere +barit +baryta +barytas +barite +baryte +baritenor +barites +barytes +barythymia +barytic +barytine +barytocalcite +barytocelestine +barytocelestite +baryton +baritonal +baritone +barytone +baritones +barytones +barytons +barytophyllite +barytostrontianite +barytosulphate +barium +bariums +bark +barkan +barkantine +barkary +barkbound +barkcutter +barked +barkeep +barkeeper +barkeepers +barkeeps +barkey +barken +barkened +barkening +barkentine +barkentines +barker +barkery +barkers +barkevikite +barkevikitic +barkhan +barky +barkier +barkiest +barking +barkingly +barkinji +barkle +barkless +barklyite +barkometer +barkpeel +barkpeeler +barkpeeling +barks +barksome +barkstone +barlafumble +barlafummil +barleduc +barleducs +barley +barleybird +barleybrake +barleybreak +barleycorn +barleyhood +barleymow +barleys +barleysick +barless +barly +barling +barlock +barlow +barlows +barm +barmaid +barmaids +barman +barmaster +barmbrack +barmcloth +barmecidal +barmecide +barmen +barmfel +barmy +barmybrained +barmie +barmier +barmiest +barming +barmkin +barmote +barms +barmskin +barn +barnabas +barnaby +barnabite +barnacle +barnacled +barnacles +barnacling +barnage +barnard +barnbrack +barnburner +barndoor +barney +barneys +barnful +barnhardtite +barny +barnyard +barnyards +barnier +barniest +barnlike +barnman +barnmen +barns +barnstorm +barnstormed +barnstormer +barnstormers +barnstorming +barnstorms +barnumism +barnumize +barocco +barocyclonometer +baroclinicity +baroclinity +baroco +barodynamic +barodynamics +barognosis +barogram +barograms +barograph +barographic +barographs +baroi +baroko +barolo +barology +barolong +baromacrometer +barometer +barometers +barometry +barometric +barometrical +barometrically +barometrograph +barometrography +barometz +baromotor +baron +baronage +baronages +baronduki +baroness +baronesses +baronet +baronetage +baronetcy +baronetcies +baroneted +baronethood +baronetical +baroneting +baronetise +baronetised +baronetising +baronetize +baronetized +baronetizing +baronets +baronetship +barong +baronga +barongs +baroni +barony +baronial +baronies +baronize +baronized +baronizing +baronne +baronnes +baronry +baronries +barons +baronship +barophobia +baroque +baroquely +baroqueness +baroques +baroreceptor +baroscope +baroscopic +baroscopical +barosinusitis +barosinusitus +barosma +barosmin +barostat +baroswitch +barotactic +barotaxy +barotaxis +barothermogram +barothermograph +barothermohygrogram +barothermohygrograph +baroto +barotrauma +barotraumas +barotraumata +barotropy +barotropic +barotse +barouche +barouches +barouchet +barouchette +barouni +baroxyton +barpost +barquantine +barque +barquentine +barques +barquest +barquette +barr +barra +barrabkie +barrable +barrabora +barracan +barrace +barrack +barracked +barracker +barracking +barracks +barraclade +barracoon +barracouta +barracoutas +barracuda +barracudas +barracudina +barrad +barragan +barrage +barraged +barrages +barraging +barragon +barramunda +barramundas +barramundi +barramundies +barramundis +barranca +barrancas +barranco +barrancos +barrandite +barras +barrat +barrater +barraters +barrator +barrators +barratry +barratries +barratrous +barratrously +barre +barred +barrel +barrelage +barreled +barreleye +barreleyes +barreler +barrelet +barrelfish +barrelfishes +barrelful +barrelfuls +barrelhead +barrelhouse +barrelhouses +barreling +barrelled +barrelling +barrelmaker +barrelmaking +barrels +barrelsful +barrelwise +barren +barrener +barrenest +barrenly +barrenness +barrens +barrenwort +barrer +barrera +barres +barret +barretor +barretors +barretry +barretries +barrets +barrett +barrette +barretter +barrettes +barry +barricade +barricaded +barricader +barricaders +barricades +barricading +barricado +barricadoed +barricadoes +barricadoing +barricados +barrico +barricoes +barricos +barrier +barriers +barriguda +barrigudo +barrigudos +barrikin +barriness +barring +barringer +barrington +barringtonia +barrio +barrios +barrister +barristerial +barristers +barristership +barristress +barroom +barrooms +barrow +barrowcoat +barrowful +barrowist +barrowman +barrows +barrulee +barrulet +barrulety +barruly +bars +barsac +barse +barsom +barspoon +barstool +barstools +bart +bartend +bartended +bartender +bartenders +bartending +bartends +barter +bartered +barterer +barterers +bartering +barters +barth +barthian +barthite +bartholinitis +bartholomean +bartholomew +bartholomewtide +bartholomite +bartisan +bartisans +bartizan +bartizaned +bartizans +bartlemy +bartlett +bartletts +barton +bartonella +bartonia +bartram +bartramia +bartramiaceae +bartramian +bartree +bartsia +baru +baruch +barukhzy +barundi +baruria +barvel +barvell +barway +barways +barwal +barware +barwares +barwin +barwing +barwise +barwood +bas +basad +basal +basale +basalia +basally +basalt +basaltes +basaltic +basaltiform +basaltine +basaltoid +basalts +basaltware +basan +basanite +basaree +basat +bascinet +bascology +basculation +bascule +bascules +bascunan +base +baseball +baseballdom +baseballer +baseballs +baseband +baseboard +baseboards +baseborn +basebred +baseburner +basecoat +basecourt +based +basehearted +baseheartedness +baselard +baseless +baselessly +baselessness +baselevel +basely +baselike +baseline +baseliner +baselines +basella +basellaceae +basellaceous +baseman +basemen +basement +basementless +basements +basementward +basename +baseness +basenesses +basenet +basenji +basenjis +baseplate +baseplug +basepoint +baser +baserunning +bases +basest +bash +bashalick +bashara +bashaw +bashawdom +bashawism +bashaws +bashawship +bashed +basher +bashers +bashes +bashful +bashfully +bashfulness +bashibazouk +bashilange +bashyle +bashing +bashkir +bashless +bashlik +bashlyk +bashlyks +bashment +bashmuric +basial +basialveolar +basiarachnitis +basiarachnoiditis +basiate +basiated +basiating +basiation +basibracteolate +basibranchial +basibranchiate +basibregmatic +basic +basically +basicerite +basichromatic +basichromatin +basichromatinic +basichromiole +basicity +basicities +basicytoparaplastin +basicranial +basics +basidia +basidial +basidigital +basidigitale +basidigitalia +basidiocarp +basidiogenetic +basidiolichen +basidiolichenes +basidiomycete +basidiomycetes +basidiomycetous +basidiophore +basidiospore +basidiosporous +basidium +basidorsal +basifacial +basify +basification +basified +basifier +basifiers +basifies +basifying +basifixed +basifugal +basigamy +basigamous +basigenic +basigenous +basigynium +basiglandular +basihyal +basihyoid +basil +basyl +basilar +basilarchia +basilard +basilary +basilateral +basilect +basileis +basilemma +basileus +basilian +basilic +basilica +basilicae +basilical +basilicalike +basilican +basilicas +basilicate +basilicock +basilicon +basilics +basilidan +basilidian +basilidianism +basilinna +basiliscan +basiliscine +basiliscus +basilysis +basilisk +basilisks +basilissa +basilyst +basilosauridae +basilosaurus +basils +basilweed +basimesostasis +basin +basinal +basinasal +basinasial +basined +basinerved +basinet +basinets +basinful +basing +basinlike +basins +basioccipital +basion +basions +basiophitic +basiophthalmite +basiophthalmous +basiotribe +basiotripsy +basiparachromatin +basiparaplastin +basipetal +basipetally +basiphobia +basipodite +basipoditic +basipterygial +basipterygium +basipterygoid +basiradial +basirhinal +basirostral +basis +basiscopic +basisidia +basisolute +basisphenoid +basisphenoidal +basitemporal +basitting +basiventral +basivertebral +bask +baske +basked +basker +baskerville +basket +basketball +basketballer +basketballs +basketful +basketfuls +basketing +basketlike +basketmaker +basketmaking +basketry +basketries +baskets +basketware +basketweaving +basketwoman +basketwood +basketwork +basketworm +basking +baskish +baskonize +basks +basnat +basnet +basoche +basocyte +basoga +basoid +basoko +basommatophora +basommatophorous +bason +basongo +basophil +basophile +basophilia +basophilic +basophilous +basophils +basophobia +basos +basote +basotho +basque +basqued +basques +basquine +bass +bassa +bassalia +bassalian +bassan +bassanello +bassanite +bassara +bassarid +bassaris +bassariscus +bassarisk +basses +basset +basseted +basseting +bassetite +bassets +bassetta +bassette +bassetted +bassetting +bassi +bassy +bassia +bassie +bassine +bassinet +bassinets +bassing +bassirilievi +bassist +bassists +bassly +bassness +bassnesses +basso +basson +bassoon +bassoonist +bassoonists +bassoons +bassorin +bassos +bassus +basswood +basswoods +bast +basta +bastaard +bastant +bastard +bastarda +bastardy +bastardice +bastardies +bastardisation +bastardise +bastardised +bastardising +bastardism +bastardization +bastardizations +bastardize +bastardized +bastardizes +bastardizing +bastardly +bastardliness +bastardry +bastards +baste +basted +basten +baster +basters +bastes +basti +bastian +bastide +bastile +bastiles +bastille +bastilles +bastillion +bastiment +bastinade +bastinaded +bastinades +bastinading +bastinado +bastinadoed +bastinadoes +bastinadoing +basting +bastings +bastion +bastionary +bastioned +bastionet +bastions +bastite +bastnaesite +bastnasite +basto +baston +bastonet +bastonite +basts +basural +basurale +basuto +bat +bataan +batable +batad +batak +batakan +bataleur +batamote +batan +batara +batarde +batardeau +batata +batatas +batatilla +batavi +batavian +batboy +batboys +batch +batched +batcher +batchers +batches +batching +bate +batea +bateau +bateaux +bated +bateful +batekes +batel +bateleur +batell +bateman +batement +bater +bates +batete +batetela +batfish +batfishes +batfowl +batfowled +batfowler +batfowling +batfowls +batful +bath +bathala +bathe +batheable +bathed +bather +bathers +bathes +bathetic +bathetically +bathflower +bathhouse +bathhouses +bathyal +bathyanesthesia +bathybian +bathybic +bathybius +bathic +bathycentesis +bathychrome +bathycolpian +bathycolpic +bathycurrent +bathyesthesia +bathygraphic +bathyhyperesthesia +bathyhypesthesia +bathyl +bathylimnetic +bathylite +bathylith +bathylithic +bathylitic +bathymeter +bathymetry +bathymetric +bathymetrical +bathymetrically +bathinette +bathing +bathyorographical +bathypelagic +bathyplankton +bathyscape +bathyscaph +bathyscaphe +bathyscaphes +bathyseism +bathysmal +bathysophic +bathysophical +bathysphere +bathyspheres +bathythermogram +bathythermograph +bathkol +bathless +bathman +bathmat +bathmats +bathmic +bathmism +bathmotropic +bathmotropism +bathochromatic +bathochromatism +bathochrome +bathochromy +bathochromic +bathoflore +bathofloric +batholite +batholith +batholithic +batholiths +batholitic +bathomania +bathometer +bathometry +bathonian +bathool +bathophobia +bathorse +bathos +bathoses +bathrobe +bathrobes +bathroom +bathroomed +bathrooms +bathroot +baths +bathtub +bathtubful +bathtubs +bathukolpian +bathukolpic +bathvillite +bathwater +bathwort +batidaceae +batidaceous +batik +batiked +batiker +batiking +batiks +batikulin +batikuling +bating +batino +batyphone +batis +batiste +batistes +batitinan +batlan +batler +batlet +batlike +batling +batlon +batman +batmen +batocrinidae +batocrinus +batodendron +batoid +batoidei +batoka +baton +batoneer +batonga +batonist +batonistic +batonne +batonnier +batons +batoon +batophobia +batrachia +batrachian +batrachians +batrachiate +batrachidae +batrachite +batrachium +batrachoid +batrachoididae +batrachophagous +batrachophidia +batrachophobia +batrachoplasty +batrachospermum +batrachotoxin +bats +batsman +batsmanship +batsmen +batster +batswing +batt +batta +battable +battailant +battailous +battak +battakhin +battalia +battalias +battalion +battalions +battarism +battarismus +batteau +batteaux +batted +battel +batteled +batteler +batteling +battels +battement +battements +batten +battened +battener +batteners +battening +battens +batter +batterable +battercake +batterdock +battered +batterer +batterfang +battery +batterie +batteried +batteries +batteryman +battering +batterman +batters +batteuse +batty +battycake +battier +batties +battiest +battik +battiks +battiness +batting +battings +battish +battle +battled +battledore +battledored +battledores +battledoring +battlefield +battlefields +battlefront +battlefronts +battleful +battleground +battlegrounds +battlement +battlemented +battlements +battlepiece +battleplane +battler +battlers +battles +battleship +battleships +battlesome +battlestead +battlewagon +battleward +battlewise +battling +battology +battological +battologise +battologised +battologising +battologist +battologize +battologized +battologizing +batton +batts +battu +battue +battues +batture +battuta +battutas +battute +battuto +battutos +batukite +batule +batuque +batussi +batwa +batwing +batwoman +batwomen +batz +batzen +baubee +baubees +bauble +baublery +baubles +baubling +baubo +bauch +bauchle +bauckie +bauckiebird +baud +baudekin +baudekins +baudery +baudrons +baudronses +bauds +bauera +baufrey +bauge +bauhinia +bauhinias +bauk +baul +bauld +baulea +bauleah +baulk +baulked +baulky +baulkier +baulkiest +baulking +baulks +baume +baumhauerite +baumier +baun +bauno +baure +bauson +bausond +bauta +bautta +bauxite +bauxites +bauxitic +bauxitite +bavardage +bavary +bavarian +bavaroy +bavarois +bavaroise +bavenite +bavette +baviaantje +bavian +baviere +bavin +bavius +bavoso +baw +bawarchi +bawbee +bawbees +bawble +bawcock +bawcocks +bawd +bawdy +bawdier +bawdies +bawdiest +bawdyhouse +bawdyhouses +bawdily +bawdiness +bawdry +bawdric +bawdrick +bawdrics +bawdries +bawds +bawdship +bawdstrot +bawhorse +bawke +bawl +bawled +bawley +bawler +bawlers +bawly +bawling +bawls +bawn +bawneen +bawra +bawrel +bawsint +bawsunt +bawty +bawtie +bawties +baxter +baxterian +baxterianism +baxtone +bazaar +bazaars +bazar +bazars +baze +bazigar +bazoo +bazooka +bazookaman +bazookamen +bazookas +bazoos +bazzite +bb +bbl +bbls +bbs +bcd +bcf +bch +bchs +bd +bde +bdellatomy +bdellid +bdellidae +bdellium +bdelliums +bdelloid +bdelloida +bdellometer +bdellostoma +bdellostomatidae +bdellostomidae +bdellotomy +bdelloura +bdellouridae +bdellovibrio +bdft +bdl +bdle +bdls +bdrm +bds +be +bea +beach +beachboy +beachboys +beachcomb +beachcomber +beachcombers +beachcombing +beachdrops +beached +beacher +beaches +beachfront +beachhead +beachheads +beachy +beachie +beachier +beachiest +beaching +beachlamar +beachless +beachman +beachmaster +beachmen +beachside +beachward +beachwear +beacon +beaconage +beaconed +beaconing +beaconless +beacons +beaconwise +bead +beaded +beadeye +beadeyes +beader +beadflush +beadhouse +beadhouses +beady +beadier +beadiest +beadily +beadiness +beading +beadings +beadle +beadledom +beadlehood +beadleism +beadlery +beadles +beadleship +beadlet +beadlike +beadman +beadmen +beadroll +beadrolls +beadrow +beads +beadsman +beadsmen +beadswoman +beadswomen +beadwork +beadworks +beagle +beagles +beagling +beak +beaked +beaker +beakerful +beakerman +beakermen +beakers +beakful +beakhead +beaky +beakier +beakiest +beakiron +beakless +beaklike +beaks +beal +beala +bealach +bealing +beallach +bealtared +bealtine +bealtuinn +beam +beamage +beambird +beamed +beamer +beamers +beamfilling +beamful +beamhouse +beamy +beamier +beamiest +beamily +beaminess +beaming +beamingly +beamish +beamishly +beamless +beamlet +beamlike +beamman +beamroom +beams +beamsman +beamsmen +beamster +beamwork +bean +beanbag +beanbags +beanball +beanballs +beancod +beaned +beaner +beanery +beaneries +beaners +beanfeast +beanfeaster +beanfest +beanfield +beany +beanie +beanier +beanies +beaniest +beaning +beanlike +beano +beanos +beanpole +beanpoles +beans +beansetter +beanshooter +beanstalk +beanstalks +beant +beanweed +beaproned +bear +bearability +bearable +bearableness +bearably +bearance +bearbaiter +bearbaiting +bearbane +bearberry +bearberries +bearbind +bearbine +bearbush +bearcat +bearcats +bearcoot +beard +bearded +beardedness +bearder +beardfish +beardfishes +beardy +beardie +bearding +beardless +beardlessness +beardlike +beardom +beards +beardtongue +beared +bearer +bearers +bearess +bearfoot +bearfoots +bearherd +bearhide +bearhound +bearhug +bearhugs +bearing +bearings +bearish +bearishly +bearishness +bearleap +bearlet +bearlike +bearm +bearnaise +bearpaw +bears +bearship +bearskin +bearskins +beartongue +bearward +bearwood +bearwoods +bearwort +beast +beastbane +beastdom +beasthood +beastie +beasties +beastily +beastings +beastish +beastishness +beastly +beastlier +beastliest +beastlike +beastlily +beastliness +beastling +beastlings +beastman +beasts +beastship +beat +beata +beatable +beatably +beatae +beatas +beatee +beaten +beater +beaterman +beatermen +beaters +beath +beati +beatify +beatific +beatifical +beatifically +beatificate +beatification +beatified +beatifies +beatifying +beatille +beatinest +beating +beatings +beatitude +beatitudes +beatles +beatless +beatnik +beatnikism +beatniks +beatrice +beatrix +beats +beatster +beatus +beatuti +beau +beauclerc +beauclerk +beaucoup +beaued +beauetry +beaufet +beaufin +beaufort +beaugregory +beaugregories +beauing +beauish +beauism +beaujolais +beaume +beaumont +beaumontia +beaune +beaupere +beaupers +beaus +beauseant +beauship +beausire +beaut +beauteous +beauteously +beauteousness +beauti +beauty +beautician +beauticians +beautydom +beautied +beauties +beautify +beautification +beautifications +beautified +beautifier +beautifiers +beautifies +beautifying +beautiful +beautifully +beautifulness +beautihood +beautiless +beautyship +beauts +beaux +beauxite +beaver +beaverboard +beavered +beaverette +beavery +beaveries +beavering +beaverish +beaverism +beaverite +beaverize +beaverkill +beaverkin +beaverlike +beaverpelt +beaverroot +beavers +beaverskin +beaverteen +beaverwood +beback +bebay +bebait +beballed +bebang +bebannered +bebar +bebaron +bebaste +bebat +bebathe +bebatter +bebeast +bebed +bebeerin +bebeerine +bebeeru +bebeerus +bebelted +bebilya +bebite +bebization +beblain +beblear +bebled +bebleed +bebless +beblister +beblood +beblooded +beblooding +bebloods +bebloom +beblot +beblotch +beblubber +beblubbered +bebog +bebop +bebopper +beboppers +bebops +beboss +bebotch +bebothered +bebouldered +bebrave +bebreech +bebrine +bebrother +bebrush +bebump +bebusy +bebuttoned +bec +becafico +becall +becalm +becalmed +becalming +becalmment +becalms +became +becap +becapped +becapping +becaps +becard +becarpet +becarpeted +becarpeting +becarpets +becarve +becasse +becassine +becassocked +becater +because +beccabunga +beccaccia +beccafico +beccaficoes +beccaficos +becchi +becco +becense +bechained +bechalk +bechalked +bechalking +bechalks +bechamel +bechamels +bechance +bechanced +bechances +bechancing +becharm +becharmed +becharming +becharms +bechase +bechatter +bechauffeur +beche +becheck +becher +bechern +bechic +bechignoned +bechirp +bechtler +bechuana +becircled +becivet +beck +becked +beckelite +becker +becket +beckets +beckett +becky +beckie +becking +beckiron +beckon +beckoned +beckoner +beckoners +beckoning +beckoningly +beckons +becks +beclad +beclamor +beclamored +beclamoring +beclamors +beclamour +beclang +beclap +beclart +beclasp +beclasped +beclasping +beclasps +beclatter +beclaw +beclip +becloak +becloaked +becloaking +becloaks +beclog +beclogged +beclogging +beclogs +beclose +beclothe +beclothed +beclothes +beclothing +becloud +beclouded +beclouding +beclouds +beclout +beclown +beclowned +beclowning +beclowns +becluster +becobweb +becoiffed +becollier +becolme +becolor +becombed +become +becomed +becomes +becometh +becoming +becomingly +becomingness +becomings +becomma +becompass +becompliment +becoom +becoresh +becost +becousined +becovet +becoward +becowarded +becowarding +becowards +becquerelite +becram +becramp +becrampon +becrawl +becrawled +becrawling +becrawls +becreep +becry +becrime +becrimed +becrimes +becriming +becrimson +becrinolined +becripple +becrippled +becrippling +becroak +becross +becrowd +becrowded +becrowding +becrowds +becrown +becrush +becrust +becrusted +becrusting +becrusts +becudgel +becudgeled +becudgeling +becudgelled +becudgelling +becudgels +becuffed +becuiba +becumber +becuna +becurl +becurry +becurse +becursed +becurses +becursing +becurst +becurtained +becushioned +becut +bed +bedabble +bedabbled +bedabbles +bedabbling +bedad +bedaff +bedaggered +bedaggle +beday +bedamn +bedamned +bedamning +bedamns +bedamp +bedangled +bedare +bedark +bedarken +bedarkened +bedarkening +bedarkens +bedash +bedaub +bedaubed +bedaubing +bedaubs +bedawee +bedawn +bedaze +bedazed +bedazement +bedazzle +bedazzled +bedazzlement +bedazzles +bedazzling +bedazzlingly +bedboard +bedbug +bedbugs +bedcap +bedcase +bedchair +bedchairs +bedchamber +bedclothes +bedclothing +bedcord +bedcover +bedcovers +beddable +bedded +bedder +bedders +bedding +beddingroll +beddings +bede +bedead +bedeaf +bedeafen +bedeafened +bedeafening +bedeafens +bedebt +bedeck +bedecked +bedecking +bedecks +bedecorate +bedeen +bedegar +bedeguar +bedehouse +bedehouses +bedel +bedell +bedells +bedels +bedelve +bedeman +bedemen +beden +bedene +bedesman +bedesmen +bedeswoman +bedeswomen +bedevil +bedeviled +bedeviling +bedevilled +bedevilling +bedevilment +bedevils +bedew +bedewed +bedewer +bedewing +bedewoman +bedews +bedfast +bedfellow +bedfellows +bedfellowship +bedflower +bedfoot +bedford +bedfordshire +bedframe +bedframes +bedgery +bedgoer +bedgown +bedgowns +bediademed +bediamonded +bediaper +bediapered +bediapering +bediapers +bedye +bedight +bedighted +bedighting +bedights +bedikah +bedim +bedimmed +bedimming +bedimple +bedimpled +bedimples +bedimplies +bedimpling +bedims +bedin +bedip +bedirt +bedirter +bedirty +bedirtied +bedirties +bedirtying +bedismal +bedivere +bedizen +bedizened +bedizening +bedizenment +bedizens +bedkey +bedlam +bedlamer +bedlamic +bedlamise +bedlamised +bedlamising +bedlamism +bedlamite +bedlamitish +bedlamize +bedlamized +bedlamizing +bedlamp +bedlamps +bedlams +bedlar +bedless +bedlids +bedlight +bedlike +bedmaker +bedmakers +bedmaking +bedman +bedmate +bedmates +bednighted +bednights +bedoctor +bedog +bedoyo +bedolt +bedot +bedote +bedotted +bedouin +bedouinism +bedouins +bedouse +bedown +bedpad +bedpan +bedpans +bedplate +bedplates +bedpost +bedposts +bedquilt +bedquilts +bedrabble +bedrabbled +bedrabbling +bedraggle +bedraggled +bedragglement +bedraggles +bedraggling +bedrail +bedrails +bedral +bedrape +bedraped +bedrapes +bedraping +bedravel +bedread +bedrel +bedrench +bedrenched +bedrenches +bedrenching +bedress +bedribble +bedrid +bedridden +bedriddenness +bedrift +bedright +bedrip +bedrite +bedrivel +bedriveled +bedriveling +bedrivelled +bedrivelling +bedrivels +bedrizzle +bedrock +bedrocks +bedroll +bedrolls +bedroom +bedrooms +bedrop +bedrown +bedrowse +bedrug +bedrugged +bedrugging +bedrugs +beds +bedscrew +bedsheet +bedsheets +bedsick +bedside +bedsides +bedsit +bedsite +bedsitter +bedsock +bedsonia +bedsonias +bedsore +bedsores +bedspread +bedspreads +bedspring +bedsprings +bedstaff +bedstand +bedstands +bedstaves +bedstead +bedsteads +bedstock +bedstraw +bedstraws +bedstring +bedswerver +bedtick +bedticking +bedticks +bedtime +bedtimes +bedub +beduchess +beduck +beduin +beduins +beduke +bedull +bedumb +bedumbed +bedumbing +bedumbs +bedunce +bedunced +bedunces +bedunch +beduncing +bedung +bedur +bedusk +bedust +bedway +bedways +bedward +bedwards +bedwarf +bedwarfed +bedwarfing +bedwarfs +bedwarmer +bedwell +bee +beearn +beeball +beebee +beebees +beebread +beebreads +beech +beechdrops +beechen +beecher +beeches +beechy +beechier +beechiest +beechnut +beechnuts +beechwood +beechwoods +beedged +beedi +beedom +beef +beefalo +beefaloes +beefalos +beefburger +beefburgers +beefcake +beefcakes +beefeater +beefeaters +beefed +beefer +beefers +beefhead +beefheaded +beefy +beefier +beefiest +beefily +beefin +beefiness +beefing +beefish +beefishness +beefless +beeflower +beefs +beefsteak +beefsteaks +beeftongue +beefwood +beefwoods +beegerite +beehead +beeheaded +beeherd +beehive +beehives +beehouse +beeyard +beeish +beeishness +beek +beekeeper +beekeepers +beekeeping +beekite +beekmantown +beelbow +beele +beelike +beeline +beelines +beelol +beelzebub +beelzebubian +beelzebul +beeman +beemaster +beemen +been +beennut +beent +beento +beep +beeped +beeper +beepers +beeping +beeps +beer +beerage +beerbachite +beerbelly +beerbibber +beeregar +beerhouse +beerhouses +beery +beerier +beeriest +beerily +beeriness +beerish +beerishly +beermaker +beermaking +beermonger +beerocracy +beerothite +beerpull +beers +bees +beest +beesting +beestings +beestride +beeswax +beeswaxes +beeswing +beeswinged +beeswings +beet +beetewk +beetfly +beeth +beethoven +beethovenian +beethovenish +beethovian +beety +beetiest +beetle +beetled +beetlehead +beetleheaded +beetleheadedness +beetler +beetlers +beetles +beetlestock +beetlestone +beetleweed +beetlike +beetling +beetmister +beetrave +beetroot +beetrooty +beetroots +beets +beeve +beeves +beevish +beeway +beeware +beeweed +beewinged +beewise +beewort +beezer +beezers +bef +befall +befallen +befalling +befalls +befame +befamilied +befamine +befan +befancy +befanned +befathered +befavor +befavour +befeather +befell +beferned +befetished +befetter +befezzed +beffroy +befiddle +befilch +befile +befilleted +befilmed +befilth +befinger +befingered +befingering +befingers +befire +befist +befit +befits +befitted +befitting +befittingly +befittingness +beflag +beflagged +beflagging +beflags +beflannel +beflap +beflatter +beflea +befleaed +befleaing +befleas +befleck +beflecked +beflecking +beflecks +beflounce +beflour +beflout +beflower +beflowered +beflowering +beflowers +beflum +befluster +befoam +befog +befogged +befogging +befogs +befool +befoolable +befooled +befooling +befoolment +befools +befop +before +beforehand +beforehandedness +beforementioned +beforeness +beforesaid +beforested +beforetime +beforetimes +befortune +befoul +befouled +befouler +befoulers +befoulier +befouling +befoulment +befouls +befountained +befraught +befreckle +befreeze +befreight +befret +befrets +befretted +befretting +befriend +befriended +befriender +befriending +befriendment +befriends +befrill +befrilled +befringe +befringed +befringes +befringing +befriz +befrocked +befrogged +befrounce +befrumple +befuddle +befuddled +befuddlement +befuddlements +befuddler +befuddlers +befuddles +befuddling +befume +befur +befurbelowed +befurred +beg +begabled +begad +begay +begall +begalled +begalling +begalls +began +begani +begar +begari +begary +begarie +begarlanded +begarnish +begartered +begash +begass +begat +begats +begattal +begaud +begaudy +begaze +begazed +begazes +begazing +begeck +begem +begemmed +begemming +beget +begets +begettal +begetter +begetters +begetting +beggable +beggar +beggardom +beggared +beggarer +beggaress +beggarhood +beggary +beggaries +beggaring +beggarism +beggarly +beggarlice +beggarlike +beggarliness +beggarman +beggars +beggarweed +beggarwise +beggarwoman +begged +begger +beggiatoa +beggiatoaceae +beggiatoaceous +begging +beggingly +beggingwise +beghard +begift +begiggle +begild +begin +beginger +beginner +beginners +beginning +beginnings +begins +begird +begirded +begirding +begirdle +begirdled +begirdles +begirdling +begirds +begirt +beglad +begladded +begladding +beglads +beglamour +beglare +beglerbeg +beglerbeglic +beglerbeglik +beglerbegluc +beglerbegship +beglerbey +beglew +beglic +beglide +beglitter +beglobed +begloom +begloomed +beglooming +beglooms +begloze +begluc +beglue +begnaw +begnawed +begnawn +bego +begob +begobs +begod +begoggled +begohm +begone +begonia +begoniaceae +begoniaceous +begoniales +begonias +begorah +begorra +begorrah +begorry +begot +begotten +begottenness +begoud +begowk +begowned +begrace +begray +begrain +begrave +begrease +begreen +begrett +begrim +begrime +begrimed +begrimer +begrimes +begriming +begrimmed +begrimming +begrims +begripe +begroan +begroaned +begroaning +begroans +begrown +begrudge +begrudged +begrudger +begrudges +begrudging +begrudgingly +begruntle +begrutch +begrutten +begs +begster +beguard +beguess +beguile +beguiled +beguileful +beguilement +beguilements +beguiler +beguilers +beguiles +beguiling +beguilingly +beguilingness +beguin +beguine +beguines +begulf +begulfed +begulfing +begulfs +begum +begummed +begumming +begums +begun +begunk +begut +behale +behalf +behallow +behalves +behammer +behang +behap +behatted +behav +behave +behaved +behaver +behavers +behaves +behaving +behavior +behavioral +behaviorally +behaviored +behaviorism +behaviorist +behavioristic +behavioristically +behaviorists +behaviors +behaviour +behavioural +behaviourally +behaviourism +behaviourist +behaviours +behead +beheadal +beheaded +beheader +beheading +beheadlined +beheads +behear +behears +behearse +behedge +beheira +beheld +behelp +behemoth +behemothic +behemoths +behen +behenate +behenic +behest +behests +behew +behight +behymn +behind +behinder +behindhand +behinds +behindsight +behint +behypocrite +behither +behn +behold +beholdable +beholden +beholder +beholders +beholding +beholdingness +beholds +behoney +behoof +behooped +behoot +behoove +behooved +behooveful +behoovefully +behoovefulness +behooves +behooving +behoovingly +behorn +behorror +behove +behoved +behovely +behoves +behoving +behowl +behowled +behowling +behowls +behung +behusband +bey +beice +beid +beydom +beyerite +beige +beigel +beiges +beigy +beignet +beignets +beild +beylic +beylical +beylics +beylik +beyliks +bein +being +beingless +beingness +beings +beinked +beinly +beinness +beyond +beyondness +beyonds +beira +beyrichite +beirut +beys +beisa +beisance +beyship +beja +bejabbers +bejabers +bejade +bejan +bejant +bejape +bejaundice +bejazz +bejel +bejeled +bejeling +bejelled +bejelling +bejesuit +bejesus +bejewel +bejeweled +bejeweling +bejewelled +bejewelling +bejewels +bejezebel +bejig +bejuco +bejuggle +bejumble +bejumbled +bejumbles +bejumbling +bekah +bekerchief +bekick +bekilted +beking +bekinkinite +bekiss +bekissed +bekisses +bekissing +bekko +beknave +beknight +beknighted +beknighting +beknights +beknit +beknived +beknot +beknots +beknotted +beknottedly +beknottedness +beknotting +beknow +beknown +bel +bela +belabor +belabored +belaboring +belabors +belabour +belaboured +belabouring +belabours +belace +belaced +belady +beladied +beladies +beladying +beladle +belage +belah +belay +belayed +belayer +belaying +belays +belait +belaites +belam +belamcanda +belamy +belamour +belanda +belander +belap +belar +belard +belash +belast +belat +belate +belated +belatedly +belatedness +belating +belatticed +belaud +belauded +belauder +belauding +belauds +belavendered +belch +belched +belcher +belchers +belches +belching +beld +beldam +beldame +beldames +beldams +beldamship +belder +belderroot +belduque +beleaf +beleaguer +beleaguered +beleaguerer +beleaguering +beleaguerment +beleaguers +beleap +beleaped +beleaping +beleaps +beleapt +beleave +belection +belecture +beledgered +belee +beleed +beleft +belemnid +belemnite +belemnites +belemnitic +belemnitidae +belemnoid +belemnoidea +beleper +belesprit +beletter +beleve +belfast +belfather +belfry +belfried +belfries +belga +belgae +belgard +belgas +belgian +belgians +belgic +belgium +belgophile +belgrade +belgravia +belgravian +bely +belial +belialic +belialist +belibel +belibeled +belibeling +belick +belicoseness +belie +belied +belief +beliefful +belieffulness +beliefless +beliefs +belier +beliers +belies +believability +believable +believableness +believably +believe +believed +believer +believers +believes +believeth +believing +believingly +belight +beliing +belying +belyingly +belike +beliked +belikely +belili +belime +belimousined +belinda +belinuridae +belinurus +belion +beliquor +beliquored +beliquoring +beliquors +belis +belite +belitter +belittle +belittled +belittlement +belittler +belittlers +belittles +belittling +belive +belk +belknap +bell +bella +bellabella +bellacoola +belladonna +bellarmine +bellatrix +bellbind +bellbinder +bellbine +bellbird +bellbirds +bellboy +bellboys +bellbottle +belle +belled +belledom +belleek +belleeks +bellehood +belleric +bellerophon +bellerophontidae +belles +belleter +belletrist +belletristic +belletrists +bellevue +bellflower +bellhanger +bellhanging +bellhop +bellhops +bellhouse +belli +belly +bellyache +bellyached +bellyacher +bellyaches +bellyaching +bellyband +bellibone +bellybutton +bellybuttons +bellic +bellical +bellicism +bellicist +bellicose +bellicosely +bellicoseness +bellicosity +bellicosities +bellied +bellyer +bellies +belliferous +bellyfish +bellyflaught +bellyful +bellyfull +bellyfulls +bellyfuls +belligerence +belligerency +belligerencies +belligerent +belligerently +belligerents +bellying +bellyland +bellylike +bellyman +belling +bellypiece +bellypinch +bellipotent +bellis +bellite +bellmaker +bellmaking +bellman +bellmanship +bellmaster +bellmen +bellmouth +bellmouthed +bello +bellon +bellona +bellonian +bellonion +belloot +bellota +bellote +bellovaci +bellow +bellowed +bellower +bellowers +bellowing +bellows +bellowsful +bellowslike +bellowsmaker +bellowsmaking +bellowsman +bellpull +bellpulls +bellrags +bells +belltail +belltopper +belltopperdom +belluine +bellum +bellware +bellwaver +bellweather +bellweed +bellwether +bellwethers +bellwind +bellwine +bellwood +bellwort +bellworts +beloam +belock +beloeilite +beloid +belomancy +belone +belonephobia +belonesite +belong +belonged +belonger +belonging +belongings +belongs +belonid +belonidae +belonite +belonoid +belonosphaerite +belook +belord +belorussian +belostoma +belostomatidae +belostomidae +belotte +belouke +belout +belove +beloved +beloveds +below +belowdecks +belowground +belows +belowstairs +belozenged +bels +belshazzar +belshazzaresque +belsire +belswagger +belt +beltane +beltcourse +belted +beltene +belter +beltian +beltie +beltine +belting +beltings +beltir +beltis +beltless +beltline +beltlines +beltmaker +beltmaking +beltman +beltmen +belton +belts +beltway +beltways +beltwise +beluchi +belucki +belue +beluga +belugas +belugite +belute +belve +belvedere +belvedered +belvederes +belverdian +belvidere +belzebub +belzebuth +bema +bemad +bemadam +bemadamed +bemadaming +bemadams +bemadden +bemaddened +bemaddening +bemaddens +bemail +bemaim +bemajesty +beman +bemangle +bemantle +bemar +bemartyr +bemas +bemask +bemaster +bemat +bemata +bemaul +bemazed +bemba +bembecidae +bembex +beme +bemeal +bemean +bemeaned +bemeaning +bemeans +bemedaled +bemedalled +bemeet +bementite +bemercy +bemete +bemingle +bemingled +bemingles +bemingling +beminstrel +bemire +bemired +bemirement +bemires +bemiring +bemirror +bemirrorment +bemist +bemisted +bemisting +bemistress +bemists +bemitered +bemitred +bemix +bemixed +bemixes +bemixing +bemixt +bemoan +bemoanable +bemoaned +bemoaner +bemoaning +bemoaningly +bemoans +bemoat +bemock +bemocked +bemocking +bemocks +bemoil +bemoisten +bemol +bemole +bemolt +bemonster +bemoon +bemotto +bemoult +bemourn +bemouth +bemuck +bemud +bemuddy +bemuddle +bemuddled +bemuddlement +bemuddles +bemuddling +bemuffle +bemurmur +bemurmure +bemurmured +bemurmuring +bemurmurs +bemuse +bemused +bemusedly +bemusement +bemuses +bemusing +bemusk +bemuslined +bemuzzle +bemuzzled +bemuzzles +bemuzzling +ben +bena +benab +benacus +benadryl +bename +benamed +benamee +benames +benami +benamidar +benaming +benasty +benben +bench +benchboard +benched +bencher +benchers +benchership +benches +benchfellow +benchful +benchy +benching +benchland +benchless +benchlet +benchman +benchmar +benchmark +benchmarked +benchmarking +benchmarks +benchmen +benchwarmer +benchwork +bencite +bend +benda +bendability +bendable +benday +bendayed +bendaying +bendays +bended +bendee +bendees +bendel +bendell +bender +benders +bendy +bendies +bending +bendingly +bendys +bendlet +bends +bendsome +bendways +bendwise +bene +beneaped +beneath +beneception +beneceptive +beneceptor +benedicite +benedick +benedicks +benedict +benedicta +benedictine +benedictinism +benediction +benedictional +benedictionale +benedictionary +benedictions +benedictive +benedictively +benedictory +benedicts +benedictus +benedight +benefact +benefaction +benefactions +benefactive +benefactor +benefactory +benefactors +benefactorship +benefactress +benefactresses +benefactrices +benefactrix +benefactrixes +benefic +benefice +beneficed +beneficeless +beneficence +beneficences +beneficency +beneficent +beneficential +beneficently +benefices +beneficiaire +beneficial +beneficially +beneficialness +beneficiary +beneficiaries +beneficiaryship +beneficiate +beneficiated +beneficiating +beneficiation +beneficience +beneficient +beneficing +beneficium +benefit +benefited +benefiter +benefiting +benefits +benefitted +benefitting +benegro +beneighbored +benelux +beneme +benempt +benempted +beneplacit +beneplacity +beneplacito +benes +benet +benetnasch +benetted +benetting +benettle +beneurous +beneventan +beneventana +benevolence +benevolences +benevolency +benevolent +benevolently +benevolentness +benevolist +beng +bengal +bengalese +bengali +bengalic +bengaline +bengals +bengola +beni +benic +benight +benighted +benightedly +benightedness +benighten +benighter +benighting +benightmare +benightment +benign +benignancy +benignancies +benignant +benignantly +benignity +benignities +benignly +benignness +benim +benin +benincasa +beniseed +benison +benisons +benitier +benitoite +benj +benjamin +benjaminite +benjamins +benjamite +benjy +benjoin +benkulen +benmost +benn +benne +bennel +bennes +bennet +bennets +bennettitaceae +bennettitaceous +bennettitales +bennettites +bennetweed +benni +benny +bennies +bennis +benniseed +beno +benomyl +benomyls +benorth +benote +bens +bensail +bensall +bensel +bensell +bensh +benshea +benshee +benshi +bensil +benson +bent +bentang +bentgrass +benthal +benthamic +benthamism +benthamite +benthic +benthon +benthonic +benthopelagic +benthos +benthoscope +benthoses +benty +bentinck +bentincks +bentiness +benting +bentlet +benton +bentonite +bentonitic +bents +bentstar +bentwood +bentwoods +benu +benumb +benumbed +benumbedness +benumbing +benumbingly +benumbment +benumbs +benvenuto +benward +benweed +benzacridine +benzal +benzalacetone +benzalacetophenone +benzalaniline +benzalazine +benzalcyanhydrin +benzalcohol +benzaldehyde +benzaldiphenyl +benzaldoxime +benzalethylamine +benzalhydrazine +benzalphenylhydrazone +benzalphthalide +benzamide +benzamido +benzamine +benzaminic +benzamino +benzanalgen +benzanilide +benzanthracene +benzanthrone +benzantialdoxime +benzazide +benzazimide +benzazine +benzazole +benzbitriazole +benzdiazine +benzdifuran +benzdioxazine +benzdioxdiazine +benzdioxtriazine +benzedrine +benzein +benzene +benzeneazobenzene +benzenediazonium +benzenes +benzenyl +benzenoid +benzhydrol +benzhydroxamic +benzidin +benzidine +benzidino +benzidins +benzil +benzyl +benzylamine +benzilic +benzylic +benzylidene +benzylpenicillin +benzyls +benzimidazole +benziminazole +benzin +benzinduline +benzine +benzines +benzins +benzo +benzoate +benzoated +benzoates +benzoazurine +benzobis +benzocaine +benzocoumaran +benzodiazine +benzodiazole +benzoflavine +benzofluorene +benzofulvene +benzofuran +benzofuryl +benzofuroquinoxaline +benzoglycolic +benzoglyoxaline +benzohydrol +benzoic +benzoid +benzoyl +benzoylate +benzoylated +benzoylating +benzoylation +benzoylformic +benzoylglycine +benzoyls +benzoin +benzoinated +benzoins +benzoiodohydrin +benzol +benzolate +benzole +benzoles +benzoline +benzolize +benzols +benzomorpholine +benzonaphthol +benzonitrile +benzonitrol +benzoperoxide +benzophenanthrazine +benzophenanthroline +benzophenazine +benzophenol +benzophenone +benzophenothiazine +benzophenoxazine +benzophloroglucinol +benzophosphinic +benzophthalazine +benzopinacone +benzopyran +benzopyranyl +benzopyrazolone +benzopyrene +benzopyrylium +benzoquinoline +benzoquinone +benzoquinoxaline +benzosulfimide +benzosulphimide +benzotetrazine +benzotetrazole +benzothiazine +benzothiazole +benzothiazoline +benzothiodiazole +benzothiofuran +benzothiophene +benzothiopyran +benzotoluide +benzotriazine +benzotriazole +benzotrichloride +benzotrifluoride +benzotrifuran +benzoxate +benzoxy +benzoxyacetic +benzoxycamphor +benzoxyphenanthrene +benzpinacone +benzpyrene +benzthiophen +benztrioxazine +beode +beothuk +beothukan +beowulf +bepaid +bepaint +bepainted +bepainting +bepaints +bepale +bepaper +beparch +beparody +beparse +bepart +bepaste +bepastured +bepat +bepatched +bepaw +bepearl +bepelt +bepen +bepepper +beperiwigged +bepester +bepewed +bephilter +bephrase +bepicture +bepiece +bepierce +bepile +bepill +bepillared +bepimple +bepimpled +bepimples +bepimpling +bepinch +bepistoled +bepity +beplague +beplaided +beplaster +beplumed +bepommel +bepowder +bepray +bepraise +bepraisement +bepraiser +beprank +bepranked +bepreach +bepress +bepretty +bepride +beprose +bepuddle +bepuff +bepuffed +bepun +bepurple +bepuzzle +bepuzzlement +bequalm +bequeath +bequeathable +bequeathal +bequeathed +bequeather +bequeathing +bequeathment +bequeaths +bequest +bequests +bequirtle +bequote +beqwete +ber +beray +berain +berairou +berakah +berake +beraked +berakes +beraking +berakot +berakoth +berapt +berascal +berascaled +berascaling +berascals +berat +berate +berated +berates +berating +berattle +beraunite +berbamine +berber +berberi +berbery +berberia +berberian +berberid +berberidaceae +berberidaceous +berberin +berberine +berberins +berberis +berberry +berbers +berceau +berceaunette +bercelet +berceuse +berceuses +berchemia +berchta +berdache +berdaches +berdash +bere +berean +bereareft +bereason +bereave +bereaved +bereavement +bereavements +bereaven +bereaver +bereavers +bereaves +bereaving +berede +bereft +berend +berendo +berengaria +berengarian +berengarianism +berengelite +berengena +berenice +bereshith +beresite +beret +berets +beretta +berettas +berewick +berg +bergalith +bergall +bergama +bergamasca +bergamasche +bergamask +bergamiol +bergamo +bergamot +bergamots +bergander +bergaptene +berger +bergere +bergeres +bergeret +bergerette +bergfall +berggylt +bergh +berghaan +bergy +bergylt +berginization +berginize +berglet +bergman +bergmannite +bergomask +bergs +bergschrund +bergsonian +bergsonism +bergut +berhyme +berhymed +berhymes +berhyming +beri +beribanded +beribbon +beribboned +beriber +beriberi +beriberic +beriberis +beribers +berycid +berycidae +beryciform +berycine +berycoid +berycoidea +berycoidean +berycoidei +berycomorphi +beride +berigora +beryl +berylate +beryline +beryllate +beryllia +berylline +berylliosis +beryllium +berylloid +beryllonate +beryllonite +beryllosis +beryls +berime +berimed +berimes +beriming +bering +beringed +beringite +beringleted +berinse +berith +berytidae +beryx +berk +berkeley +berkeleian +berkeleianism +berkeleyism +berkeleyite +berkelium +berkovets +berkovtsi +berkowitz +berkshire +berley +berlin +berlina +berline +berliner +berliners +berlines +berlinite +berlinize +berlins +berloque +berm +berme +bermensch +bermes +berms +bermuda +bermudas +bermudian +bermudians +bermudite +bern +bernacle +bernard +bernardina +bernardine +berne +bernese +bernice +bernicia +bernicle +bernicles +bernie +berninesque +bernoo +bernoullian +berob +berobed +beroe +berogue +beroida +beroidae +beroll +berossos +berouged +beround +berreave +berreaved +berreaves +berreaving +berrendo +berret +berretta +berrettas +berrettino +berri +berry +berrybush +berrichon +berrichonne +berried +berrier +berries +berrigan +berrying +berryless +berrylike +berryman +berrypicker +berrypicking +berrugate +bersagliere +bersaglieri +berseem +berseems +berserk +berserker +berserks +bersiamite +bersil +bersim +berskin +berstel +bert +bertat +berteroa +berth +bertha +berthage +berthas +berthed +berther +berthierite +berthing +berthold +bertholletia +berths +bertie +bertillonage +bertin +bertolonia +bertram +bertrand +bertrandite +bertrum +beruffed +beruffled +berun +berust +bervie +berwick +berzelianite +berzeliite +bes +besa +besagne +besague +besaiel +besaile +besayle +besaint +besan +besanctify +besand +besant +besauce +bescab +bescarf +bescatter +bescent +bescorch +bescorched +bescorches +bescorching +bescorn +bescoundrel +bescour +bescoured +bescourge +bescouring +bescours +bescramble +bescrape +bescratch +bescrawl +bescreen +bescreened +bescreening +bescreens +bescribble +bescribbled +bescribbling +bescurf +bescurvy +bescutcheon +beseam +besee +beseech +beseeched +beseecher +beseechers +beseeches +beseeching +beseechingly +beseechingness +beseechment +beseek +beseem +beseemed +beseeming +beseemingly +beseemingness +beseemly +beseemliness +beseems +beseen +beseige +beset +besetment +besets +besetter +besetters +besetting +besew +beshackle +beshade +beshadow +beshadowed +beshadowing +beshadows +beshag +beshake +beshame +beshamed +beshames +beshaming +beshawled +beshear +beshell +beshield +beshine +beshiver +beshivered +beshivering +beshivers +beshlik +beshod +beshout +beshouted +beshouting +beshouts +beshow +beshower +beshrew +beshrewed +beshrewing +beshrews +beshriek +beshrivel +beshroud +beshrouded +beshrouding +beshrouds +besiclometer +beside +besides +besiege +besieged +besiegement +besieger +besiegers +besieges +besieging +besiegingly +besigh +besilver +besin +besing +besiren +besit +beslab +beslabber +beslap +beslash +beslave +beslaved +beslaver +besleeve +beslime +beslimed +beslimer +beslimes +besliming +beslings +beslipper +beslobber +beslow +beslubber +besluit +beslur +beslushed +besmear +besmeared +besmearer +besmearing +besmears +besmell +besmile +besmiled +besmiles +besmiling +besmirch +besmirched +besmircher +besmirchers +besmirches +besmirching +besmirchment +besmoke +besmoked +besmokes +besmoking +besmooth +besmoothed +besmoothing +besmooths +besmother +besmottered +besmouch +besmudge +besmudged +besmudges +besmudging +besmut +besmutch +besmuts +besmutted +besmutting +besnare +besneer +besnivel +besnow +besnowed +besnowing +besnows +besnuff +besodden +besogne +besognier +besoil +besoin +besom +besomer +besoms +besonio +besonnet +besoot +besoothe +besoothed +besoothement +besoothes +besoothing +besort +besot +besotment +besots +besotted +besottedly +besottedness +besotter +besotting +besottingly +besought +besoul +besour +besouth +bespake +bespangle +bespangled +bespangles +bespangling +bespate +bespatter +bespattered +bespatterer +bespattering +bespatterment +bespatters +bespawl +bespeak +bespeakable +bespeaker +bespeaking +bespeaks +bespecked +bespeckle +bespeckled +bespecklement +bespectacled +besped +bespeech +bespeed +bespell +bespelled +bespend +bespete +bespew +bespy +bespice +bespill +bespin +bespirit +bespit +besplash +besplatter +besplit +bespoke +bespoken +bespot +bespotted +bespottedness +bespotting +bespouse +bespoused +bespouses +bespousing +bespout +bespray +bespread +bespreading +bespreads +bespreng +besprent +bespring +besprinkle +besprinkled +besprinkler +besprinkles +besprinkling +besprizorni +bespurred +bespurt +besputter +besqueeze +besquib +besquirt +besra +bess +bessarabian +bessel +besselian +bessemer +bessemerize +bessemerized +bessemerizing +bessera +besses +bessi +bessy +bessie +best +bestab +bestad +bestay +bestayed +bestain +bestamp +bestand +bestar +bestare +bestarve +bestatued +bestead +besteaded +besteading +besteads +besteal +bested +besteer +bestench +bester +bestial +bestialise +bestialised +bestialising +bestialism +bestialist +bestiality +bestialities +bestialize +bestialized +bestializes +bestializing +bestially +bestials +bestian +bestiary +bestiarian +bestiarianism +bestiaries +bestiarist +bestick +besticking +bestill +besting +bestink +bestir +bestirred +bestirring +bestirs +bestness +bestock +bestore +bestorm +bestove +bestow +bestowable +bestowage +bestowal +bestowals +bestowed +bestower +bestowing +bestowment +bestows +bestraddle +bestraddled +bestraddling +bestrapped +bestraught +bestraw +bestreak +bestream +bestrew +bestrewed +bestrewing +bestrewment +bestrewn +bestrews +bestrid +bestridden +bestride +bestrided +bestrides +bestriding +bestripe +bestrode +bestrow +bestrowed +bestrowing +bestrown +bestrows +bestrut +bests +bestseller +bestsellerdom +bestsellers +bestselling +bestubble +bestubbled +bestuck +bestud +bestudded +bestudding +bestuds +bestuur +besugar +besugo +besuit +besully +beswarm +beswarmed +beswarming +beswarms +besweatered +besweeten +beswelter +beswim +beswinge +beswink +beswitch +bet +beta +betacaine +betacism +betacismus +betafite +betag +betail +betailor +betain +betaine +betaines +betainogen +betake +betaken +betakes +betaking +betalk +betallow +betanaphthol +betangle +betanglement +betas +betask +betassel +betatron +betatrons +betatter +betattered +betattering +betatters +betaxed +bete +beteach +betear +beteela +beteem +betel +betelgeuse +betell +betelnut +betelnuts +betels +beterschap +betes +beth +bethabara +bethank +bethanked +bethanking +bethankit +bethanks +bethel +bethels +bethesda +bethesdas +bethflower +bethylid +bethylidae +bethink +bethinking +bethinks +bethlehem +bethlehemite +bethorn +bethorned +bethorning +bethorns +bethought +bethrall +bethreaten +bethroot +beths +bethuel +bethumb +bethump +bethumped +bethumping +bethumps +bethunder +bethwack +bethwine +betide +betided +betides +betiding +betimber +betime +betimes +betinge +betipple +betire +betis +betise +betises +betitle +betocsin +betoya +betoyan +betoil +betoken +betokened +betokener +betokening +betokenment +betokens +beton +betone +betongue +betony +betonica +betonies +betons +betook +betorcin +betorcinol +betorn +betoss +betowel +betowered +betrace +betray +betrayal +betrayals +betrayed +betrayer +betrayers +betraying +betrail +betrayment +betrays +betraise +betrample +betrap +betravel +betread +betrend +betrim +betrinket +betroth +betrothal +betrothals +betrothed +betrothing +betrothment +betroths +betrough +betrousered +betrumpet +betrunk +betrust +bets +betsey +betsy +betsileos +betsimisaraka +betso +betta +bettas +betted +better +bettered +betterer +bettergates +bettering +betterly +betterment +betterments +bettermost +betterness +betters +betty +betties +bettina +bettine +betting +bettong +bettonga +bettongia +bettor +bettors +betuckered +betula +betulaceae +betulaceous +betulin +betulinamaric +betulinic +betulinol +betulites +betumbled +beturbaned +betusked +betutor +betutored +betwattled +between +betweenbrain +betweenity +betweenmaid +betweenness +betweens +betweentimes +betweenwhiles +betwine +betwit +betwixen +betwixt +beudanite +beudantite +beulah +beuncled +beuniformed +beurre +bevaring +bevatron +bevatrons +beveil +bevel +beveled +beveler +bevelers +beveling +bevelled +beveller +bevellers +bevelling +bevelment +bevels +bevenom +bever +beverage +beverages +beverly +beverse +bevesseled +bevesselled +beveto +bevy +bevies +bevil +bevillain +bevilled +bevined +bevoiled +bevomit +bevomited +bevomiting +bevomits +bevor +bevors +bevue +bevvy +bewail +bewailable +bewailed +bewailer +bewailers +bewailing +bewailingly +bewailment +bewails +bewaitered +bewake +bewall +beware +bewared +bewares +bewary +bewaring +bewash +bewaste +bewater +beweary +bewearied +bewearies +bewearying +beweep +beweeper +beweeping +beweeps +bewelcome +bewelter +bewend +bewept +bewest +bewet +bewhig +bewhisker +bewhiskered +bewhisper +bewhistle +bewhite +bewhiten +bewhore +bewidow +bewield +bewig +bewigged +bewigging +bewigs +bewilder +bewildered +bewilderedly +bewilderedness +bewildering +bewilderingly +bewilderment +bewilders +bewimple +bewinged +bewinter +bewired +bewit +bewitch +bewitched +bewitchedness +bewitcher +bewitchery +bewitches +bewitchful +bewitching +bewitchingly +bewitchingness +bewitchment +bewitchments +bewith +bewizard +bewonder +bework +beworm +bewormed +beworming +beworms +beworn +beworry +beworried +beworries +beworrying +beworship +bewpers +bewray +bewrayed +bewrayer +bewrayers +bewraying +bewrayingly +bewrayment +bewrays +bewrap +bewrapped +bewrapping +bewraps +bewrapt +bewrathed +bewreak +bewreath +bewreck +bewry +bewrite +bewrought +bewwept +bezaleel +bezaleelian +bezan +bezant +bezante +bezantee +bezanty +bezants +bezazz +bezazzes +bezel +bezels +bezesteen +bezetta +bezette +bezil +bezils +bezique +beziques +bezoar +bezoardic +bezoars +bezonian +bezpopovets +bezzant +bezzants +bezzi +bezzle +bezzled +bezzling +bezzo +bf +bg +bhabar +bhadon +bhaga +bhagat +bhagavat +bhagavata +bhaiachara +bhaiachari +bhaiyachara +bhajan +bhakta +bhaktas +bhakti +bhaktimarga +bhaktis +bhalu +bhandar +bhandari +bhang +bhangi +bhangs +bhar +bhara +bharal +bharata +bharti +bhat +bhava +bhavan +bhavani +bhd +bheesty +bheestie +bheesties +bhikhari +bhikku +bhikshu +bhil +bhili +bhima +bhindi +bhishti +bhisti +bhistie +bhisties +bhoy +bhojpuri +bhokra +bhoosa +bhoot +bhoots +bhotia +bhotiya +bhowani +bhp +bhumidar +bhumij +bhunder +bhungi +bhungini +bhut +bhutan +bhutanese +bhutani +bhutatathata +bhutia +bhuts +bi +by +biabo +biacetyl +biacetylene +biacetyls +biacid +biacromial +biacuminate +biacuru +biajaiba +bialate +biali +bialy +bialis +bialys +bialystoker +biallyl +bialveolar +bianca +bianchi +bianchite +bianco +biangular +biangulate +biangulated +biangulous +bianisidine +biannual +biannually +biannulate +biarchy +biarcuate +biarcuated +byard +biarticular +biarticulate +biarticulated +bias +biased +biasedly +biases +biasing +biasness +biasnesses +biassed +biassedly +biasses +biassing +biasteric +biasways +biaswise +biathlon +biathlons +biatomic +biaural +biauricular +biauriculate +biaxal +biaxial +biaxiality +biaxially +biaxillary +bib +bibacious +bibaciousness +bibacity +bibasic +bibation +bibb +bibbed +bibber +bibbery +bibberies +bibbers +bibby +bibbing +bibble +bibbled +bibbler +bibbling +bibbons +bibbs +bibcock +bibcocks +bibelot +bibelots +bibenzyl +biberon +bibi +bibio +bibionid +bibionidae +bibiri +bibiru +bibitory +bibl +bible +bibles +bibless +biblic +biblical +biblicality +biblically +biblicism +biblicist +biblicistic +biblicolegal +biblicoliterary +biblicopsychological +byblidaceae +biblike +biblioclasm +biblioclast +bibliofilm +bibliog +bibliogenesis +bibliognost +bibliognostic +bibliogony +bibliograph +bibliographer +bibliographers +bibliography +bibliographic +bibliographical +bibliographically +bibliographies +bibliographize +bibliokelpt +biblioklept +bibliokleptomania +bibliokleptomaniac +bibliolater +bibliolatry +bibliolatrist +bibliolatrous +bibliology +bibliological +bibliologies +bibliologist +bibliomancy +bibliomane +bibliomania +bibliomaniac +bibliomaniacal +bibliomanian +bibliomanianism +bibliomanism +bibliomanist +bibliopegy +bibliopegic +bibliopegically +bibliopegist +bibliopegistic +bibliopegistical +bibliophage +bibliophagic +bibliophagist +bibliophagous +bibliophil +bibliophile +bibliophiles +bibliophily +bibliophilic +bibliophilism +bibliophilist +bibliophilistic +bibliophobe +bibliophobia +bibliopolar +bibliopole +bibliopolery +bibliopoly +bibliopolic +bibliopolical +bibliopolically +bibliopolism +bibliopolist +bibliopolistic +bibliosoph +bibliotaph +bibliotaphe +bibliotaphic +bibliothec +bibliotheca +bibliothecae +bibliothecaire +bibliothecal +bibliothecary +bibliothecarial +bibliothecarian +bibliothecas +bibliotheke +bibliotheque +bibliotherapeutic +bibliotherapy +bibliotherapies +bibliotherapist +bibliothetic +bibliothque +bibliotic +bibliotics +bibliotist +byblis +biblism +biblist +biblists +biblos +biblus +biborate +bibracteate +bibracteolate +bibs +bibulosity +bibulosities +bibulous +bibulously +bibulousness +bibulus +bicalcarate +bicalvous +bicameral +bicameralism +bicameralist +bicamerist +bicapitate +bicapsular +bicarb +bicarbide +bicarbonate +bicarbonates +bicarbs +bicarbureted +bicarburetted +bicarinate +bicarpellary +bicarpellate +bicaudal +bicaudate +bicched +bice +bicellular +bicentenary +bicentenaries +bicentenarnaries +bicentennial +bicentennially +bicentennials +bicentral +bicentric +bicentrically +bicentricity +bicep +bicephalic +bicephalous +biceps +bicepses +bices +bicetyl +bichy +bichir +bichloride +bichlorides +bichord +bichos +bichromate +bichromated +bichromatic +bichromatize +bichrome +bichromic +bicyanide +bicycle +bicycled +bicycler +bicyclers +bicycles +bicyclic +bicyclical +bicycling +bicyclism +bicyclist +bicyclists +bicyclo +bicycloheptane +bicycular +biciliate +biciliated +bicylindrical +bicipital +bicipitous +bicircular +bicirrose +bick +bicker +bickered +bickerer +bickerers +bickering +bickern +bickers +bickiron +biclavate +biclinia +biclinium +bycoket +bicollateral +bicollaterality +bicolligate +bicolor +bicolored +bicolorous +bicolors +bicolour +bicoloured +bicolourous +bicolours +bicompact +biconcave +biconcavity +bicondylar +biconditional +bicone +biconic +biconical +biconically +biconjugate +biconnected +biconsonantal +biconvex +biconvexity +bicorn +bicornate +bicorne +bicorned +bicornes +bicornous +bicornuate +bicornuous +bicornute +bicorporal +bicorporate +bicorporeal +bicostate +bicrenate +bicrescentic +bicrofarad +bicron +bicrons +bicrural +bicuculline +bicultural +biculturalism +bicursal +bicuspid +bicuspidal +bicuspidate +bicuspids +bid +bidactyl +bidactyle +bidactylous +bidar +bidarka +bidarkas +bidarkee +bidarkees +bidcock +biddability +biddable +biddableness +biddably +biddance +biddelian +bidden +bidder +biddery +bidders +biddy +biddie +biddies +bidding +biddings +biddulphia +biddulphiaceae +bide +bided +bidene +bidens +bident +bidental +bidentalia +bidentate +bidented +bidential +bidenticulate +bider +bidery +biders +bides +bidet +bidets +bidget +bidi +bidiagonal +bidialectal +bidialectalism +bidigitate +bidimensional +biding +bidirectional +bidirectionally +bidiurnal +bidonville +bidpai +bidree +bidri +bidry +bids +bidstand +biduous +bye +bieberite +biedermeier +byee +bieennia +byegaein +byelaw +byelaws +bielby +bielbrief +bield +bielded +bieldy +bielding +bields +bielectrolysis +bielenite +bielid +bielorouss +byelorussia +byelorussian +byelorussians +byeman +bien +bienly +biennale +biennales +bienne +bienness +biennia +biennial +biennially +biennials +biennium +bienniums +biens +bienseance +bientt +bienvenu +bienvenue +byepath +bier +bierbalk +byerite +bierkeller +byerlite +biers +bierstube +bierstuben +bierstubes +byes +biestings +byestreet +biethnic +bietle +byeworker +byeworkman +biface +bifaces +bifacial +bifanged +bifara +bifarious +bifariously +bifer +biferous +biff +biffed +biffy +biffies +biffin +biffing +biffins +biffs +bifid +bifidate +bifidated +bifidity +bifidities +bifidly +bifilar +bifilarly +bifistular +biflabellate +biflagelate +biflagellate +biflecnode +biflected +biflex +biflorate +biflorous +bifluorid +bifluoride +bifocal +bifocals +bifoil +bifold +bifolia +bifoliate +bifoliolate +bifolium +bifollicular +biforate +biforin +biforine +biforked +biforking +biform +biformed +biformity +biforous +bifront +bifrontal +bifronted +bifrost +bifteck +bifunctional +bifurcal +bifurcate +bifurcated +bifurcately +bifurcates +bifurcating +bifurcation +bifurcations +bifurcous +big +biga +bigae +bigam +bigamy +bigamic +bigamies +bigamist +bigamistic +bigamistically +bigamists +bigamize +bigamized +bigamizing +bigamous +bigamously +bygane +byganging +bigarade +bigarades +bigaroon +bigaroons +bigarreau +bigas +bigate +bigbloom +bigbury +bigeye +bigeyes +bigemina +bigeminal +bigeminate +bigeminated +bigeminy +bigeminies +bigeminum +bigener +bigeneric +bigential +bigfoot +bigg +biggah +bigged +biggen +biggened +biggening +bigger +biggest +biggety +biggy +biggie +biggies +biggin +bigging +biggings +biggins +biggish +biggishness +biggity +biggonet +bigha +bighead +bigheaded +bigheads +bighearted +bigheartedly +bigheartedness +bighorn +bighorns +bight +bighted +bighting +bights +biglandular +biglenoid +bigly +biglot +bigmitt +bigmouth +bigmouthed +bigmouths +bigness +bignesses +bignonia +bignoniaceae +bignoniaceous +bignoniad +bignonias +bignou +bygo +bygoing +bygone +bygones +bigoniac +bigonial +bigot +bigoted +bigotedly +bigotedness +bigothero +bigotish +bigotry +bigotries +bigots +bigotty +bigram +bigroot +bigthatch +biguanide +biguttate +biguttulate +bigwig +bigwigged +bigwiggedness +bigwiggery +bigwiggism +bigwigs +bihai +bihalve +biham +bihamate +byhand +bihari +biharmonic +bihydrazine +bihourly +biyearly +bija +bijasal +bijection +bijections +bijective +bijectively +bijou +bijous +bijouterie +bijoux +bijugate +bijugous +bijugular +bijwoner +bike +biked +biker +bikers +bikes +bikeway +bikeways +bikh +bikhaconitine +bikie +biking +bikini +bikinied +bikinis +bikkurim +bikol +bikram +bikukulla +bilaan +bilabe +bilabial +bilabials +bilabiate +bilaciniate +bilayer +bilalo +bilamellar +bilamellate +bilamellated +bilaminar +bilaminate +bilaminated +biland +byland +bilander +bylander +bilanders +bilateral +bilateralism +bilateralistic +bilaterality +bilateralities +bilaterally +bilateralness +bilati +bylaw +bylawman +bylaws +bilberry +bilberries +bilbi +bilby +bilbie +bilbies +bilbo +bilboa +bilboas +bilboes +bilboquet +bilbos +bilch +bilcock +bildar +bilder +bilders +bile +bilection +bilertinned +biles +bilestone +bileve +bilewhit +bilge +bilged +bilges +bilgeway +bilgewater +bilgy +bilgier +bilgiest +bilging +bilharzia +bilharzial +bilharziasis +bilharzic +bilharziosis +bilianic +biliary +biliate +biliation +bilic +bilicyanin +bilifaction +biliferous +bilify +bilification +bilifuscin +bilihumin +bilimbi +bilimbing +bilimbis +biliment +bilin +bylina +byline +bilinear +bilineate +bilineated +bylined +byliner +byliners +bylines +bilingual +bilingualism +bilinguality +bilingually +bilinguar +bilinguist +byliny +bilinigrin +bylining +bilinite +bilio +bilious +biliously +biliousness +bilipyrrhin +biliprasin +bilipurpurin +bilirubin +bilirubinemia +bilirubinic +bilirubinuria +biliteral +biliteralism +bilith +bilithon +biliverdic +biliverdin +bilixanthin +bilk +bilked +bilker +bilkers +bilking +bilkis +bilks +bill +billa +billable +billabong +billage +billard +billback +billbeetle +billbergia +billboard +billboards +billbroking +billbug +billbugs +billed +biller +billers +billet +billete +billeted +billeter +billeters +billethead +billety +billeting +billets +billette +billetty +billetwood +billfish +billfishes +billfold +billfolds +billhead +billheading +billheads +billholder +billhook +billhooks +billy +billian +billiard +billiardist +billiardly +billiards +billyboy +billycan +billycans +billycock +billie +billyer +billies +billyhood +billiken +billikin +billing +billings +billingsgate +billyo +billion +billionaire +billionaires +billionism +billions +billionth +billionths +billitonite +billywix +billjim +billman +billmen +billon +billons +billot +billow +billowed +billowy +billowier +billowiest +billowiness +billowing +billows +billposter +billposting +bills +billsticker +billsticking +billtong +bilo +bilobate +bilobated +bilobe +bilobed +bilobiate +bilobular +bilocation +bilocellate +bilocular +biloculate +biloculina +biloculine +bilophodont +biloquist +bilos +biloxi +bilsh +bilskirnir +bilsted +bilsteds +biltong +biltongs +biltongue +bim +bima +bimaculate +bimaculated +bimah +bimahs +bimalar +bimana +bimanal +bimane +bimanous +bimanual +bimanually +bimarginate +bimarine +bimas +bimasty +bimastic +bimastism +bimastoid +bimaxillary +bimbashi +bimbil +bimbisara +bimbo +bimboes +bimbos +bimeby +bimedial +bimensal +bimester +bimesters +bimestrial +bimetal +bimetalic +bimetalism +bimetallic +bimetallism +bimetallist +bimetallistic +bimetallists +bimetals +bimethyl +bimethyls +bimillenary +bimillenial +bimillenium +bimillennia +bimillennium +bimillenniums +bimillionaire +bimilllennia +bimini +bimmeler +bimodal +bimodality +bimodule +bimodulus +bimolecular +bimolecularly +bimong +bimonthly +bimonthlies +bimorph +bimorphemic +bimorphs +bimotor +bimotored +bimotors +bimucronate +bimuscular +bin +binal +byname +bynames +binaphthyl +binapthyl +binary +binaries +binarium +binate +binately +bination +binational +binaural +binaurally +binauricular +binbashi +bind +bindable +binder +bindery +binderies +binders +bindheimite +bindi +binding +bindingly +bindingness +bindings +bindis +bindle +bindles +bindlet +bindoree +binds +bindweb +bindweed +bindweeds +bindwith +bindwood +bine +bynedestin +binervate +bines +bineweed +binful +bing +binge +bingee +bingey +bingeys +binges +binghi +bingy +bingies +bingle +bingo +bingos +binh +bini +bynin +biniodide +biniou +binit +binitarian +binitarianism +binits +bink +binman +binmen +binna +binnacle +binnacles +binned +binny +binning +binnite +binnogue +bino +binocle +binocles +binocs +binocular +binocularity +binocularly +binoculars +binoculate +binodal +binode +binodose +binodous +binomen +binomenclature +binomy +binomial +binomialism +binomially +binomials +binominal +binominated +binominous +binormal +binotic +binotonous +binous +binoxalate +binoxide +bins +bint +bintangor +bints +binturong +binuclear +binucleate +binucleated +binucleolate +binukau +binzuru +bio +bioaccumulation +bioacoustics +bioactivity +bioactivities +bioassay +bioassayed +bioassaying +bioassays +bioastronautical +bioastronautics +bioavailability +biobibliographer +biobibliography +biobibliographic +biobibliographical +biobibliographies +bioblast +bioblastic +biocatalyst +biocatalytic +biocellate +biocenology +biocenosis +biocenotic +biocentric +biochemy +biochemic +biochemical +biochemically +biochemics +biochemist +biochemistry +biochemistries +biochemists +biochore +biochron +biocycle +biocycles +biocidal +biocide +biocides +bioclean +bioclimatic +bioclimatician +bioclimatology +bioclimatological +bioclimatologically +bioclimatologies +bioclimatologist +biocoenose +biocoenoses +biocoenosis +biocoenotic +biocontrol +biod +biodegradability +biodegradable +biodegradation +biodegrade +biodegraded +biodegrading +biodynamic +biodynamical +biodynamics +biodyne +bioecology +bioecologic +bioecological +bioecologically +bioecologies +bioecologist +bioelectric +bioelectrical +bioelectricity +bioelectricities +bioelectrogenesis +bioelectrogenetic +bioelectrogenetically +bioelectronics +bioenergetics +bioengineering +bioenvironmental +bioenvironmentaly +bioethic +bioethics +biofeedback +bioflavinoid +bioflavonoid +biofog +biog +biogas +biogases +biogasses +biogen +biogenase +biogenesis +biogenesist +biogenetic +biogenetical +biogenetically +biogenetics +biogeny +biogenic +biogenies +biogenous +biogens +biogeochemical +biogeochemistry +biogeographer +biogeographers +biogeography +biogeographic +biogeographical +biogeographically +biognosis +biograph +biographee +biographer +biographers +biography +biographic +biographical +biographically +biographies +biographist +biographize +biohazard +bioherm +bioherms +bioinstrument +bioinstrumentation +biokinetics +biol +biolinguistics +biolyses +biolysis +biolite +biolith +biolytic +biologese +biology +biologic +biological +biologically +biologicohumanistic +biologics +biologies +biologism +biologist +biologistic +biologists +biologize +bioluminescence +bioluminescent +biomagnetic +biomagnetism +biomass +biomasses +biomaterial +biomathematics +biome +biomechanical +biomechanics +biomedical +biomedicine +biomes +biometeorology +biometer +biometry +biometric +biometrical +biometrically +biometrician +biometricist +biometrics +biometries +biometrist +biomicroscope +biomicroscopy +biomicroscopies +biomorphic +bion +byon +bionditional +bionergy +bionic +bionics +bionomy +bionomic +bionomical +bionomically +bionomics +bionomies +bionomist +biont +biontic +bionts +biophagy +biophagism +biophagous +biophilous +biophysic +biophysical +biophysically +biophysicist +biophysicists +biophysicochemical +biophysics +biophysiography +biophysiology +biophysiological +biophysiologist +biophyte +biophor +biophore +biophotometer +biophotophone +biopic +biopyribole +bioplasm +bioplasmic +bioplasms +bioplast +bioplastic +biopoesis +biopoiesis +biopotential +bioprecipitation +biopsy +biopsic +biopsychic +biopsychical +biopsychology +biopsychological +biopsychologies +biopsychologist +biopsies +bioptic +bioral +biorbital +biordinal +byordinar +byordinary +bioreaction +bioresearch +biorgan +biorhythm +biorhythmic +biorhythmicity +biorhythmicities +biorythmic +bios +biosatellite +biosatellites +bioscience +biosciences +bioscientific +bioscientist +bioscope +bioscopes +bioscopy +bioscopic +bioscopies +biose +biosensor +bioseston +biosyntheses +biosynthesis +biosynthesize +biosynthetic +biosynthetically +biosis +biosystematy +biosystematic +biosystematics +biosystematist +biosocial +biosociology +biosociological +biosome +biospeleology +biosphere +biospheres +biostatic +biostatical +biostatics +biostatistic +biostatistics +biosterin +biosterol +biostratigraphy +biostrome +biota +biotas +biotaxy +biotech +biotechnics +biotechnology +biotechnological +biotechnologicaly +biotechnologically +biotechnologies +biotechs +biotelemetry +biotelemetric +biotelemetries +biotherapy +biotic +biotical +biotically +biotics +biotin +biotins +biotype +biotypes +biotypic +biotypology +biotite +biotites +biotitic +biotome +biotomy +biotope +biotopes +biotoxin +biotoxins +biotransformation +biotron +biotrons +byous +byously +biovular +biovulate +bioxalate +bioxide +biozone +byp +bipack +bipacks +bipaleolate +bipaliidae +bipalium +bipalmate +biparasitic +biparental +biparentally +biparietal +biparous +biparted +biparty +bipartible +bipartient +bipartile +bipartisan +bipartisanism +bipartisanship +bipartite +bipartitely +bipartition +bipartizan +bipaschal +bypass +bypassed +bypasser +bypasses +bypassing +bypast +bypath +bypaths +bipectinate +bipectinated +biped +bipedal +bipedality +bipedism +bipeds +bipeltate +bipennate +bipennated +bipenniform +biperforate +bipersonal +bipetalous +biphase +biphasic +biphenyl +biphenylene +biphenyls +biphenol +bipinnaria +bipinnariae +bipinnarias +bipinnate +bipinnated +bipinnately +bipinnatifid +bipinnatiparted +bipinnatipartite +bipinnatisect +bipinnatisected +bipyramid +bipyramidal +bipyridyl +bipyridine +biplace +byplace +byplay +byplays +biplanal +biplanar +biplane +biplanes +biplicate +biplicity +biplosion +biplosive +bipod +bipods +bipolar +bipolarity +bipolarization +bipolarize +bipont +bipontine +biporose +biporous +bipotentiality +bipotentialities +biprism +byproduct +byproducts +biprong +bipropellant +bipunctal +bipunctate +bipunctual +bipupillate +biquadrantal +biquadrate +biquadratic +biquarterly +biquartz +biquintile +biracial +biracialism +biradial +biradiate +biradiated +biramose +biramous +birational +birch +birchbark +birched +birchen +bircher +birchers +birches +birching +birchism +birchman +birchwood +bird +birdbander +birdbanding +birdbath +birdbaths +birdberry +birdbrain +birdbrained +birdbrains +birdcage +birdcages +birdcall +birdcalls +birdcatcher +birdcatching +birdclapper +birdcraft +birddom +birde +birded +birdeen +birdeye +birder +birders +birdfarm +birdfarms +birdglue +birdhood +birdhouse +birdhouses +birdy +birdyback +birdie +birdieback +birdied +birdieing +birdies +birdikin +birding +birdland +birdless +birdlet +birdlife +birdlike +birdlime +birdlimed +birdlimes +birdliming +birdling +birdlore +birdman +birdmen +birdmouthed +birdnest +birdnester +birds +birdsall +birdseed +birdseeds +birdseye +birdseyes +birdshot +birdshots +birdsnest +birdsong +birdstone +birdwatch +birdweed +birdwise +birdwitted +birdwoman +birdwomen +byre +birectangular +birefracting +birefraction +birefractive +birefringence +birefringent +byreman +bireme +biremes +byres +biretta +birettas +byrewards +byrewoman +birgand +birgus +biri +biriani +biriba +birimose +birk +birken +birkenhead +birkenia +birkeniidae +birky +birkie +birkies +birkremite +birks +birl +byrl +byrlady +byrlakin +byrlaw +byrlawman +byrlawmen +birle +birled +byrled +birler +birlers +birles +birlie +birlieman +birling +byrling +birlings +birlinn +birls +byrls +birma +birmingham +birminghamize +birn +birne +birny +byrnie +byrnies +byroad +byroads +birodo +biron +byron +byronesque +byronian +byroniana +byronic +byronically +byronics +byronish +byronism +byronist +byronite +byronize +birostrate +birostrated +birota +birotation +birotatory +birr +birred +birretta +birrettas +birri +byrri +birring +birrs +birrus +byrrus +birse +birses +birsy +birsit +birsle +byrsonima +birt +birth +birthbed +birthday +birthdays +birthdom +birthed +birthy +birthing +byrthynsak +birthland +birthless +birthmark +birthmarks +birthmate +birthnight +birthplace +birthplaces +birthrate +birthrates +birthright +birthrights +birthroot +births +birthstone +birthstones +birthstool +birthwort +bis +bys +bisabol +bisaccate +bysacki +bisacromial +bisagre +bisayan +bisalt +bisaltae +bisannual +bisantler +bisaxillary +bisbeeite +biscacha +biscayan +biscayanism +biscayen +biscayner +biscanism +bischofite +biscot +biscotin +biscuit +biscuiting +biscuitlike +biscuitmaker +biscuitmaking +biscuitry +biscuitroot +biscuits +biscutate +bisdiapason +bisdimethylamino +bise +bisect +bisected +bisecting +bisection +bisectional +bisectionally +bisections +bisector +bisectors +bisectrices +bisectrix +bisects +bisegment +bisellia +bisellium +bysen +biseptate +biserial +biserially +biseriate +biseriately +biserrate +bises +biset +bisetose +bisetous +bisexed +bisext +bisexual +bisexualism +bisexuality +bisexually +bisexuals +bisexuous +bisglyoxaline +bish +bishareen +bishari +bisharin +bishydroxycoumarin +bishop +bishopbird +bishopdom +bishoped +bishopess +bishopful +bishophood +bishoping +bishopless +bishoplet +bishoplike +bishopling +bishopric +bishoprics +bishops +bishopscap +bishopship +bishopstool +bishopweed +bisie +bisiliac +bisilicate +bisiliquous +bisyllabic +bisyllabism +bisimine +bisymmetry +bisymmetric +bisymmetrical +bisymmetrically +bisync +bisinuate +bisinuation +bisischiadic +bisischiatic +bisk +biskop +bisks +bisley +bislings +bysmalith +bismanol +bismar +bismarck +bismarckian +bismarckianism +bismarine +bismark +bisme +bismer +bismerpund +bismethyl +bismillah +bismite +bismosol +bismuth +bismuthal +bismuthate +bismuthic +bismuthide +bismuthiferous +bismuthyl +bismuthine +bismuthinite +bismuthite +bismuthous +bismuths +bismutite +bismutoplagionite +bismutosmaltite +bismutosphaerite +bisnaga +bisnagas +bisognio +bison +bisonant +bisons +bisontine +byspell +bisphenoid +bispinose +bispinous +bispore +bisporous +bisque +bisques +bisquette +byss +bissabol +byssaceous +byssal +bissellia +bissext +bissextile +bissextus +byssi +byssiferous +byssin +byssine +byssinosis +bisso +byssogenous +byssoid +byssolite +bisson +bissonata +byssus +byssuses +bist +bistable +bystander +bystanders +bistate +bistephanic +bister +bistered +bisters +bistetrazole +bisti +bistipular +bistipulate +bistipuled +bistort +bistorta +bistorts +bistoury +bistouries +bistournage +bistratal +bistratose +bistre +bistred +bystreet +bystreets +bistres +bistriate +bistriazole +bistro +bistroic +bistros +bisubstituted +bisubstitution +bisulc +bisulcate +bisulcated +bisulfate +bisulfid +bisulfide +bisulfite +bisulphate +bisulphide +bisulphite +bit +bitable +bitake +bytalk +bytalks +bitangent +bitangential +bitanhol +bitartrate +bitbrace +bitch +bitched +bitchery +bitcheries +bitches +bitchy +bitchier +bitchiest +bitchily +bitchiness +bitching +bite +byte +biteable +biteche +bited +biteless +bitemporal +bitentaculate +biter +biternate +biternately +biters +bites +bytes +bitesheep +bitewing +bitewings +byth +bitheism +bithynian +biti +bityite +bytime +biting +bitingly +bitingness +bitypic +bitis +bitless +bitmap +bitmapped +bitnet +bito +bitolyl +bitonal +bitonality +bitonalities +bitore +bytownite +bytownitite +bitreadle +bitripartite +bitripinnatifid +bitriseptate +bitrochanteric +bits +bitser +bitsy +bitstalk +bitstock +bitstocks +bitstone +bitt +bittacle +bitte +bitted +bitten +bitter +bitterbark +bitterblain +bitterbloom +bitterbrush +bitterbump +bitterbur +bitterbush +bittered +bitterender +bitterer +bitterest +bitterful +bitterhead +bitterhearted +bitterheartedness +bittering +bitterish +bitterishness +bitterless +bitterly +bitterling +bittern +bitterness +bitterns +bitternut +bitterroot +bitters +bittersweet +bittersweetly +bittersweetness +bittersweets +bitterweed +bitterwood +bitterworm +bitterwort +bitthead +bitty +bittie +bittier +bittiest +bitting +bittings +bittium +bittock +bittocks +bittor +bitts +bitubercular +bituberculate +bituberculated +bitulithic +bitume +bitumed +bitumen +bitumens +bituminate +bituminiferous +bituminisation +bituminise +bituminised +bituminising +bituminization +bituminize +bituminized +bituminizing +bituminoid +bituminosis +bituminous +bitwise +biune +biunial +biunique +biuniquely +biuniqueness +biunity +biunivocal +biurate +biurea +biuret +bivalence +bivalency +bivalencies +bivalent +bivalents +bivalve +bivalved +bivalves +bivalvia +bivalvian +bivalvous +bivalvular +bivane +bivariant +bivariate +bivascular +bivaulted +bivector +biventer +biventral +biverb +biverbal +bivial +bivinyl +bivinyls +bivious +bivittate +bivium +bivocal +bivocalized +bivoltine +bivoluminous +bivouac +bivouaced +bivouacked +bivouacking +bivouacks +bivouacs +bivvy +biwa +byway +byways +bywalk +bywalker +bywalking +byward +biweekly +biweeklies +biwinter +bywoner +byword +bywords +bywork +byworks +bixa +bixaceae +bixaceous +bixbyite +bixin +biz +bizant +byzant +byzantian +byzantine +byzantinesque +byzantinism +byzantinize +byzantium +byzants +bizardite +bizarre +bizarrely +bizarreness +bizarrerie +bizarres +bizcacha +bize +bizel +bizen +bizes +bizet +bizygomatic +biznaga +biznagas +bizonal +bizone +bizones +bizonia +bizz +bizzarro +bjorne +bk +bkbndr +bkcy +bkg +bkgd +bklr +bkpr +bkpt +bks +bkt +bl +blaasop +blab +blabbed +blabber +blabbered +blabberer +blabbering +blabbermouth +blabbermouths +blabbers +blabby +blabbing +blabmouth +blabs +blachong +black +blackacre +blackamoor +blackamoors +blackarm +blackback +blackball +blackballed +blackballer +blackballing +blackballs +blackband +blackbeard +blackbeetle +blackbelly +blackberry +blackberries +blackberrylike +blackbine +blackbird +blackbirder +blackbirding +blackbirds +blackboard +blackboards +blackbody +blackboy +blackboys +blackbreast +blackbrush +blackbuck +blackbush +blackbutt +blackcap +blackcaps +blackcoat +blackcock +blackcod +blackcods +blackcurrant +blackdamp +blacked +blackey +blackeye +blackeyes +blacken +blackened +blackener +blackeners +blackening +blackens +blacker +blackest +blacketeer +blackface +blackfeet +blackfellow +blackfellows +blackfigured +blackfin +blackfins +blackfire +blackfish +blackfisher +blackfishes +blackfishing +blackfly +blackflies +blackfoot +blackfriars +blackguard +blackguardism +blackguardize +blackguardly +blackguardry +blackguards +blackgum +blackgums +blackhander +blackhead +blackheads +blackheart +blackhearted +blackheartedly +blackheartedness +blacky +blackie +blackies +blacking +blackings +blackish +blackishly +blackishness +blackit +blackjack +blackjacked +blackjacking +blackjacks +blackland +blacklead +blackleg +blacklegged +blackleggery +blacklegging +blacklegism +blacklegs +blackly +blacklight +blacklist +blacklisted +blacklister +blacklisting +blacklists +blackmail +blackmailed +blackmailer +blackmailers +blackmailing +blackmails +blackman +blackneb +blackneck +blackness +blacknob +blackout +blackouts +blackpatch +blackplate +blackpoll +blackpot +blackprint +blackrag +blackroot +blacks +blackseed +blackshirt +blackshirted +blacksmith +blacksmithing +blacksmiths +blacksnake +blackstick +blackstrap +blacktail +blackthorn +blackthorns +blacktongue +blacktop +blacktopped +blacktopping +blacktops +blacktree +blackware +blackwash +blackwasher +blackwashing +blackwater +blackweed +blackwood +blackwork +blackwort +blad +bladder +bladderet +bladdery +bladderless +bladderlike +bladdernose +bladdernut +bladderpod +bladders +bladderseed +bladderweed +bladderwort +bladderwrack +blade +bladebone +bladed +bladeless +bladelet +bladelike +blader +blades +bladesmith +bladewise +blady +bladygrass +blading +bladish +blae +blaeberry +blaeberries +blaeness +blaewort +blaff +blaffert +blaflum +blaggard +blague +blagueur +blah +blahlaut +blahs +blay +blayk +blain +blaine +blayne +blains +blair +blairmorite +blake +blakeberyed +blakeite +blam +blamability +blamable +blamableness +blamably +blame +blameable +blameableness +blameably +blamed +blameful +blamefully +blamefulness +blameless +blamelessly +blamelessness +blamer +blamers +blames +blameworthy +blameworthiness +blaming +blamingly +blams +blan +blanc +blanca +blancard +blanch +blanche +blanched +blancher +blanchers +blanches +blanchi +blanchimeter +blanching +blanchingly +blancmange +blancmanger +blancmanges +blanco +blancs +bland +blanda +blandation +blander +blandest +blandfordia +blandiloquence +blandiloquious +blandiloquous +blandish +blandished +blandisher +blandishers +blandishes +blandishing +blandishingly +blandishment +blandishments +blandly +blandness +blank +blankard +blankbook +blanked +blankeel +blanker +blankest +blanket +blanketed +blanketeer +blanketer +blanketers +blanketflower +blankety +blanketing +blanketless +blanketlike +blanketmaker +blanketmaking +blanketry +blankets +blanketweed +blanky +blanking +blankish +blankit +blankite +blankly +blankminded +blankmindedness +blankness +blanks +blanque +blanquette +blanquillo +blanquillos +blaoner +blaoners +blare +blared +blares +blarina +blaring +blarney +blarneyed +blarneyer +blarneying +blarneys +blarny +blarnid +blart +blas +blase +blaseness +blash +blashy +blasia +blason +blaspheme +blasphemed +blasphemer +blasphemers +blasphemes +blasphemy +blasphemies +blaspheming +blasphemous +blasphemously +blasphemousness +blast +blastaea +blasted +blastema +blastemal +blastemas +blastemata +blastematic +blastemic +blaster +blasters +blastful +blasthole +blasty +blastid +blastide +blastie +blastier +blasties +blastiest +blasting +blastings +blastman +blastment +blastocarpous +blastocele +blastocheme +blastochyle +blastocyst +blastocyte +blastocoel +blastocoele +blastocoelic +blastocolla +blastoderm +blastodermatic +blastodermic +blastodisc +blastodisk +blastoff +blastoffs +blastogenesis +blastogenetic +blastogeny +blastogenic +blastogranitic +blastoid +blastoidea +blastoma +blastomas +blastomata +blastomere +blastomeric +blastomyces +blastomycete +blastomycetes +blastomycetic +blastomycetous +blastomycin +blastomycosis +blastomycotic +blastoneuropore +blastophaga +blastophyllum +blastophitic +blastophoral +blastophore +blastophoric +blastophthoria +blastophthoric +blastoporal +blastopore +blastoporic +blastoporphyritic +blastosphere +blastospheric +blastostylar +blastostyle +blastozooid +blastplate +blasts +blastula +blastulae +blastular +blastulas +blastulation +blastule +blat +blatancy +blatancies +blatant +blatantly +blatch +blatchang +blate +blately +blateness +blateration +blateroon +blather +blathered +blatherer +blathery +blathering +blathers +blatherskite +blatherskites +blatiform +blatjang +blats +blatta +blattariae +blatted +blatter +blattered +blatterer +blattering +blatters +blatti +blattid +blattidae +blattiform +blatting +blattodea +blattoid +blattoidea +blaubok +blauboks +blaugas +blaunner +blautok +blauwbok +blaver +blaw +blawed +blawing +blawn +blawort +blaws +blaze +blazed +blazer +blazers +blazes +blazy +blazing +blazingly +blazon +blazoned +blazoner +blazoners +blazoning +blazonment +blazonry +blazonries +blazons +bld +bldg +bldr +blea +bleaberry +bleach +bleachability +bleachable +bleached +bleacher +bleachery +bleacheries +bleacherite +bleacherman +bleachers +bleaches +bleachfield +bleachground +bleachhouse +bleachyard +bleaching +bleachman +bleachs +bleachworks +bleak +bleaker +bleakest +bleaky +bleakish +bleakly +bleakness +bleaks +blear +bleared +blearedness +bleareye +bleareyed +bleary +blearyeyedness +blearier +bleariest +blearily +bleariness +blearing +blearness +blears +bleat +bleated +bleater +bleaters +bleaty +bleating +bleatingly +bleats +bleaunt +bleb +blebby +blebs +blechnoid +blechnum +bleck +bled +blee +bleed +bleeder +bleeders +bleeding +bleedings +bleeds +bleekbok +bleep +bleeped +bleeping +bleeps +bleery +bleeze +bleezy +bleymes +bleinerite +blellum +blellums +blemish +blemished +blemisher +blemishes +blemishing +blemishment +blemmatrope +blemmyes +blench +blenched +blencher +blenchers +blenches +blenching +blenchingly +blencorn +blend +blendcorn +blende +blended +blender +blenders +blendes +blending +blendor +blends +blendure +blendwater +blenheim +blenk +blennadenitis +blennemesis +blennenteria +blennenteritis +blenny +blennies +blenniid +blenniidae +blenniiform +blenniiformes +blennymenitis +blennioid +blennioidea +blennocele +blennocystitis +blennoemesis +blennogenic +blennogenous +blennoid +blennoma +blennometritis +blennophlogisma +blennophlogosis +blennophobia +blennophthalmia +blennoptysis +blennorhea +blennorrhagia +blennorrhagic +blennorrhea +blennorrheal +blennorrhinia +blennorrhoea +blennosis +blennostasis +blennostatic +blennothorax +blennotorrhea +blennuria +blens +blent +bleo +blephara +blepharadenitis +blepharal +blepharanthracosis +blepharedema +blepharelcosis +blepharemphysema +blepharydatis +blephariglottis +blepharism +blepharitic +blepharitis +blepharoadenitis +blepharoadenoma +blepharoatheroma +blepharoblennorrhea +blepharocarcinoma +blepharocera +blepharoceridae +blepharochalasis +blepharochromidrosis +blepharoclonus +blepharocoloboma +blepharoconjunctivitis +blepharodiastasis +blepharodyschroia +blepharohematidrosis +blepharolithiasis +blepharomelasma +blepharoncosis +blepharoncus +blepharophyma +blepharophimosis +blepharophryplasty +blepharophthalmia +blepharopyorrhea +blepharoplast +blepharoplasty +blepharoplastic +blepharoplegia +blepharoptosis +blepharorrhaphy +blepharosymphysis +blepharosyndesmitis +blepharosynechia +blepharospasm +blepharospath +blepharosphincterectomy +blepharostat +blepharostenosis +blepharotomy +blephillia +blere +blesbok +blesboks +blesbuck +blesbucks +blesmol +bless +blesse +blessed +blesseder +blessedest +blessedly +blessedness +blesser +blessers +blesses +blessing +blessingly +blessings +blest +blet +blethe +blether +bletheration +blethered +blethering +blethers +bletherskate +bletia +bletilla +bletonism +blets +bletted +bletting +bleu +blew +blewits +bliaut +blibe +blick +blickey +blickeys +blicky +blickie +blickies +blier +bliest +blighia +blight +blightbird +blighted +blighter +blighters +blighty +blighties +blighting +blightingly +blights +blijver +blimbing +blimey +blimy +blimp +blimpish +blimpishly +blimpishness +blimps +blin +blind +blindage +blindages +blindball +blindcat +blinded +blindedly +blindeyes +blinder +blinders +blindest +blindfast +blindfish +blindfishes +blindfold +blindfolded +blindfoldedly +blindfoldedness +blindfolder +blindfolding +blindfoldly +blindfolds +blinding +blindingly +blindish +blindism +blindless +blindly +blindling +blindman +blindness +blinds +blindstitch +blindstorey +blindstory +blindstories +blindweed +blindworm +blinger +blini +bliny +blinis +blink +blinkard +blinkards +blinked +blinker +blinkered +blinkering +blinkers +blinky +blinking +blinkingly +blinks +blinter +blintz +blintze +blintzes +blip +blype +blypes +blipped +blippers +blipping +blips +blirt +bliss +blisses +blissful +blissfully +blissfulness +blissless +blissom +blist +blister +blistered +blistery +blistering +blisteringly +blisterous +blisters +blisterweed +blisterwort +blit +blite +blites +blithe +blithebread +blitheful +blithefully +blithehearted +blithely +blithelike +blithemeat +blithen +blitheness +blither +blithered +blithering +blithers +blithesome +blithesomely +blithesomeness +blithest +blitter +blitum +blitz +blitzbuggy +blitzed +blitzes +blitzing +blitzkrieg +blitzkrieged +blitzkrieging +blitzkriegs +blizz +blizzard +blizzardy +blizzardly +blizzardous +blizzards +blk +blksize +blo +bloat +bloated +bloatedness +bloater +bloaters +bloating +bloats +blob +blobbed +blobber +blobby +blobbier +blobbiest +blobbiness +blobbing +blobs +bloc +blocage +block +blockade +blockaded +blockader +blockaders +blockaderunning +blockades +blockading +blockage +blockages +blockboard +blockbuster +blockbusters +blockbusting +blocked +blocker +blockers +blockhead +blockheaded +blockheadedly +blockheadedness +blockheadish +blockheadishness +blockheadism +blockheads +blockhole +blockholer +blockhouse +blockhouses +blocky +blockier +blockiest +blockiness +blocking +blockish +blockishly +blockishness +blocklayer +blocklike +blockline +blockmaker +blockmaking +blockman +blockout +blockpate +blocks +blockship +blockwood +blocs +blodite +bloedite +blok +bloke +blokes +blolly +bloman +blomstrandine +blond +blonde +blondeness +blonder +blondes +blondest +blondine +blondish +blondness +blonds +blood +bloodalley +bloodalp +bloodbath +bloodbeat +bloodberry +bloodbird +bloodcurdler +bloodcurdling +bloodcurdlingly +blooddrop +blooddrops +blooded +bloodedness +bloodfin +bloodfins +bloodflower +bloodguilt +bloodguilty +bloodguiltiness +bloodguiltless +bloodhound +bloodhounds +bloody +bloodybones +bloodied +bloodier +bloodies +bloodiest +bloodying +bloodily +bloodiness +blooding +bloodings +bloodleaf +bloodless +bloodlessly +bloodlessness +bloodletter +bloodletting +bloodlettings +bloodlike +bloodline +bloodlines +bloodlust +bloodlusting +bloodmobile +bloodmobiles +bloodmonger +bloodnoun +bloodred +bloodripe +bloodripeness +bloodroot +bloodroots +bloods +bloodshed +bloodshedder +bloodshedding +bloodshot +bloodshotten +bloodspiller +bloodspilling +bloodstain +bloodstained +bloodstainedness +bloodstains +bloodstanch +bloodstock +bloodstone +bloodstones +bloodstream +bloodstreams +bloodstroke +bloodsuck +bloodsucker +bloodsuckers +bloodsucking +bloodtest +bloodthirst +bloodthirster +bloodthirsty +bloodthirstier +bloodthirstiest +bloodthirstily +bloodthirstiness +bloodthirsting +bloodweed +bloodwit +bloodwite +bloodwood +bloodworm +bloodwort +bloodworthy +blooey +blooie +bloom +bloomage +bloomed +bloomer +bloomery +bloomeria +bloomeries +bloomerism +bloomers +bloomfell +bloomy +bloomier +bloomiest +blooming +bloomingly +bloomingness +bloomkin +bloomless +blooms +bloomsbury +bloomsburian +bloop +blooped +blooper +bloopers +blooping +bloops +blooth +blore +blosmy +blossom +blossombill +blossomed +blossomhead +blossomy +blossoming +blossomless +blossomry +blossoms +blossomtime +blot +blotch +blotched +blotches +blotchy +blotchier +blotchiest +blotchily +blotchiness +blotching +blote +blotless +blotlessness +blots +blotted +blotter +blotters +blottesque +blottesquely +blotty +blottier +blottiest +blotting +blottingly +blotto +blottto +bloubiskop +blouse +bloused +blouselike +blouses +blousy +blousier +blousiest +blousily +blousing +blouson +blousons +blout +bloviate +bloviated +bloviates +bloviating +blow +blowback +blowbacks +blowball +blowballs +blowby +blowbys +blowcase +blowcock +blowdown +blowen +blower +blowers +blowess +blowfish +blowfishes +blowfly +blowflies +blowgun +blowguns +blowhard +blowhards +blowhole +blowholes +blowy +blowie +blowier +blowiest +blowiness +blowing +blowings +blowiron +blowjob +blowjobs +blowlamp +blowline +blown +blowoff +blowoffs +blowout +blowouts +blowpipe +blowpipes +blowpit +blowpoint +blowproof +blows +blowse +blowsed +blowsy +blowsier +blowsiest +blowsily +blowspray +blowth +blowtorch +blowtorches +blowtube +blowtubes +blowup +blowups +blowze +blowzed +blowzy +blowzier +blowziest +blowzily +blowziness +blowzing +bls +blub +blubbed +blubber +blubbered +blubberer +blubberers +blubberhead +blubbery +blubbering +blubberingly +blubberman +blubberous +blubbers +blubbing +blucher +bluchers +bludge +bludged +bludgeon +bludgeoned +bludgeoneer +bludgeoner +bludgeoning +bludgeons +bludger +bludging +blue +blueback +blueball +blueballs +bluebead +bluebeard +bluebeardism +bluebell +bluebelled +bluebells +blueberry +blueberries +bluebill +bluebills +bluebird +bluebirds +blueblack +blueblaw +blueblood +blueblossom +bluebonnet +bluebonnets +bluebook +bluebooks +bluebottle +bluebottles +bluebreast +bluebuck +bluebush +bluebutton +bluecap +bluecaps +bluecoat +bluecoated +bluecoats +bluecup +bluecurls +blued +bluefin +bluefins +bluefish +bluefishes +bluegill +bluegills +bluegown +bluegrass +bluegum +bluegums +bluehead +blueheads +bluehearted +bluehearts +bluey +blueing +blueings +blueys +blueish +bluejack +bluejacket +bluejackets +bluejacks +bluejay +bluejays +bluejoint +blueleg +bluelegs +bluely +blueline +bluelines +blueness +bluenesses +bluenose +bluenosed +bluenoser +bluenoses +bluepoint +bluepoints +blueprint +blueprinted +blueprinter +blueprinting +blueprints +bluer +blues +bluesy +bluesides +bluesman +bluesmen +bluest +bluestem +bluestems +bluestocking +bluestockingish +bluestockingism +bluestockings +bluestone +bluestoner +bluet +blueth +bluethroat +bluetick +bluetit +bluetongue +bluetop +bluetops +bluets +blueweed +blueweeds +bluewing +bluewood +bluewoods +bluff +bluffable +bluffed +bluffer +bluffers +bluffest +bluffy +bluffing +bluffly +bluffness +bluffs +blufter +bluggy +bluing +bluings +bluish +bluishness +bluism +bluisness +blume +blumea +blumed +blumes +bluming +blunder +blunderbuss +blunderbusses +blundered +blunderer +blunderers +blunderful +blunderhead +blunderheaded +blunderheadedness +blundering +blunderingly +blunderings +blunders +blundersome +blunge +blunged +blunger +blungers +blunges +blunging +blunk +blunker +blunket +blunks +blunnen +blunt +blunted +blunter +bluntest +blunthead +blunthearted +bluntie +blunting +bluntish +bluntishness +bluntly +bluntness +blunts +blup +blur +blurb +blurbist +blurbs +blurping +blurred +blurredly +blurredness +blurrer +blurry +blurrier +blurriest +blurrily +blurriness +blurring +blurringly +blurs +blurt +blurted +blurter +blurters +blurting +blurts +blush +blushed +blusher +blushers +blushes +blushet +blushful +blushfully +blushfulness +blushy +blushiness +blushing +blushingly +blushless +blusht +blushwort +bluster +blusteration +blustered +blusterer +blusterers +blustery +blustering +blusteringly +blusterous +blusterously +blusters +blutwurst +blvd +bm +bn +bnf +bo +boa +boaedon +boagane +boanbura +boanergean +boanerges +boanergism +boanthropy +boar +boarcite +board +boardable +boardbill +boarded +boarder +boarders +boardy +boarding +boardinghouse +boardinghouses +boardings +boardly +boardlike +boardman +boardmanship +boardmen +boardroom +boards +boardsmanship +boardwalk +boardwalks +boarfish +boarfishes +boarhound +boarish +boarishly +boarishness +boars +boarship +boarskin +boarspear +boarstaff +boart +boarts +boarwood +boas +boast +boasted +boaster +boasters +boastful +boastfully +boastfulness +boasting +boastingly +boastings +boastive +boastless +boasts +boat +boatable +boatage +boatbill +boatbills +boatbuilder +boatbuilding +boated +boatel +boatels +boater +boaters +boatfalls +boatful +boathead +boatheader +boathook +boathouse +boathouses +boatyard +boatyards +boatie +boating +boatings +boation +boatkeeper +boatless +boatly +boatlike +boatlip +boatload +boatloader +boatloading +boatloads +boatman +boatmanship +boatmaster +boatmen +boatowner +boats +boatsetter +boatshop +boatside +boatsman +boatsmanship +boatsmen +boatsteerer +boatswain +boatswains +boattail +boatward +boatwise +boatwoman +boatwright +bob +boba +bobac +bobache +bobachee +bobadil +bobadilian +bobadilish +bobadilism +bobance +bobbed +bobbejaan +bobber +bobbery +bobberies +bobbers +bobby +bobbie +bobbies +bobbin +bobbiner +bobbinet +bobbinets +bobbing +bobbinite +bobbins +bobbinwork +bobbish +bobbishly +bobbysocks +bobbysoxer +bobbysoxers +bobble +bobbled +bobbles +bobbling +bobcat +bobcats +bobcoat +bobeche +bobeches +bobet +bobfly +bobflies +bobfloat +bobierrite +bobization +bobjerom +boblet +bobo +bobol +bobolink +bobolinks +bobooti +bobotee +bobotie +bobowler +bobs +bobsled +bobsledded +bobsledder +bobsledders +bobsledding +bobsleded +bobsleding +bobsleds +bobsleigh +bobstay +bobstays +bobtail +bobtailed +bobtailing +bobtails +bobwhite +bobwhites +bobwood +boc +boca +bocaccio +bocaccios +bocage +bocal +bocardo +bocasin +bocasine +bocca +boccaccio +boccale +boccarella +boccaro +bocce +bocces +bocci +boccia +boccias +boccie +boccies +boccis +bocconia +boce +bocedization +boche +bocher +boches +bochism +bochur +bock +bockey +bockerel +bockeret +bocking +bocklogged +bocks +bocoy +bocstaff +bod +bodach +bodacious +bodaciously +boddagh +boddhisattva +boddle +bode +boded +bodeful +bodefully +bodefulness +bodega +bodegas +bodegon +bodegones +bodement +bodements +boden +bodenbenderite +boder +bodes +bodewash +bodeword +bodge +bodger +bodgery +bodgie +bodhi +bodhisat +bodhisattva +bodhisattwa +body +bodybending +bodybuild +bodybuilder +bodybuilders +bodybuilding +bodice +bodiced +bodicemaker +bodicemaking +bodices +bodycheck +bodied +bodier +bodieron +bodies +bodyguard +bodyguards +bodyhood +bodying +bodikin +bodykins +bodiless +bodyless +bodilessness +bodily +bodiliness +bodilize +bodymaker +bodymaking +bodiment +boding +bodingly +bodings +bodyplate +bodyshirt +bodysuit +bodysuits +bodysurf +bodysurfed +bodysurfer +bodysurfing +bodysurfs +bodywear +bodyweight +bodywise +bodywood +bodywork +bodyworks +bodken +bodkin +bodkins +bodkinwise +bodle +bodleian +bodo +bodock +bodoni +bodonid +bodrag +bodrage +bods +bodstick +bodword +boe +boebera +boedromion +boehmenism +boehmenist +boehmenite +boehmeria +boehmite +boehmites +boeing +boeotarch +boeotia +boeotian +boeotic +boer +boerdom +boerhavia +boers +boethian +boethusian +boettner +boff +boffin +boffins +boffo +boffola +boffolas +boffos +boffs +bog +boga +bogach +bogan +bogans +bogard +bogart +bogatyr +bogbean +bogbeans +bogberry +bogberries +bogey +bogeyed +bogeying +bogeyman +bogeymen +bogeys +boget +bogfern +boggard +boggart +bogged +boggy +boggier +boggiest +boggin +bogginess +bogging +boggish +boggishness +boggle +bogglebo +boggled +boggler +bogglers +boggles +boggling +bogglingly +bogglish +boghole +bogy +bogydom +bogie +bogieman +bogier +bogies +bogyism +bogyisms +bogijiab +bogyland +bogyman +bogymen +bogland +boglander +bogle +bogled +bogledom +bogles +boglet +bogman +bogmire +bogo +bogomil +bogomile +bogomilian +bogong +bogota +bogotana +bogs +bogsucker +bogtrot +bogtrotter +bogtrotting +bogue +bogued +boguing +bogum +bogus +bogusness +bogway +bogwood +bogwoods +bogwort +boh +bohairic +bohawn +bohea +boheas +bohemia +bohemian +bohemianism +bohemians +bohemias +bohemium +bohereen +bohireen +bohmite +boho +bohor +bohora +bohorok +bohunk +bohunks +boy +boyang +boyar +boyard +boyardism +boyardom +boyards +boyarism +boyarisms +boyars +boyau +boyaus +boyaux +boyce +boychick +boychicks +boychik +boychiks +boycott +boycottage +boycotted +boycotter +boycotting +boycottism +boycotts +boid +boyd +boidae +boydekyn +boydom +boyer +boiette +boyfriend +boyfriends +boyg +boigid +boiguacu +boyhood +boyhoods +boii +boyish +boyishly +boyishness +boyism +boiko +boil +boyla +boilable +boylas +boildown +boiled +boiler +boilerful +boilerhouse +boilery +boilerless +boilermaker +boilermakers +boilermaking +boilerman +boilerplate +boilers +boilersmith +boilerworks +boily +boylike +boylikeness +boiling +boilingly +boilinglike +boiloff +boiloffs +boilover +boils +boing +boyo +boyology +boyos +bois +boys +boise +boysenberry +boysenberries +boiserie +boiseries +boyship +boisseau +boisseaux +boist +boisterous +boisterously +boisterousness +boistous +boistously +boistousness +boite +boites +boithrin +boyuna +bojite +bojo +bokadam +bokard +bokark +boke +bokhara +bokharan +bokmakierie +boko +bokom +bokos +bol +bola +bolag +bolar +bolas +bolases +bolbanac +bolbonac +bolboxalis +bold +boldacious +bolded +bolden +bolder +bolderian +boldest +boldface +boldfaced +boldfacedly +boldfacedness +boldfaces +boldfacing +boldhearted +boldheartedly +boldheartedness +boldin +boldine +bolding +boldly +boldness +boldnesses +boldo +boldoine +boldos +boldu +bole +bolection +bolectioned +boled +boleite +bolelia +bolelike +bolero +boleros +boles +boletaceae +boletaceous +bolete +boletes +boleti +boletic +boletus +boletuses +boleweed +bolewort +bolyaian +boliche +bolide +bolides +bolimba +bolis +bolita +bolivar +bolivares +bolivarite +bolivars +bolivia +bolivian +boliviano +bolivianos +bolivians +bolivias +bolk +boll +bollandist +bollard +bollards +bolled +bollen +boller +bolly +bollies +bolling +bollito +bollix +bollixed +bollixes +bollixing +bollock +bollocks +bollox +bolloxed +bolloxes +bolloxing +bolls +bollworm +bollworms +bolo +boloball +boloed +bologna +bolognan +bolognas +bolognese +bolograph +bolography +bolographic +bolographically +boloing +boloism +boloman +bolomen +bolometer +bolometric +bolometrically +boloney +boloneys +boloroot +bolos +bolshevik +bolsheviki +bolshevikian +bolsheviks +bolshevism +bolshevist +bolshevistic +bolshevistically +bolshevists +bolshevize +bolshevized +bolshevizing +bolshy +bolshie +bolshies +bolson +bolsons +bolster +bolstered +bolsterer +bolsterers +bolstering +bolsters +bolsterwork +bolt +boltage +boltant +boltcutter +bolted +boltel +bolter +bolters +bolthead +boltheader +boltheading +boltheads +bolthole +boltholes +bolti +bolty +boltin +bolting +boltings +boltless +boltlike +boltmaker +boltmaking +boltonia +boltonias +boltonite +boltrope +boltropes +bolts +boltsmith +boltspreet +boltstrake +boltuprightness +boltwork +bolus +boluses +bom +boma +bomarea +bomb +bombable +bombacaceae +bombacaceous +bombace +bombay +bombard +bombarde +bombarded +bombardelle +bombarder +bombardier +bombardiers +bombarding +bombardman +bombardmen +bombardment +bombardments +bombardo +bombardon +bombards +bombasine +bombast +bombaster +bombastic +bombastical +bombastically +bombasticness +bombastry +bombasts +bombax +bombazeen +bombazet +bombazette +bombazine +bombe +bombed +bomber +bombernickel +bombers +bombes +bombesin +bombesins +bombic +bombiccite +bombycid +bombycidae +bombycids +bombyciform +bombycilla +bombycillidae +bombycina +bombycine +bombycinous +bombidae +bombilate +bombilation +bombyliidae +bombylious +bombilla +bombillas +bombinae +bombinate +bombinating +bombination +bombing +bombings +bombyx +bombyxes +bomble +bombline +bombload +bombloads +bombo +bombola +bombonne +bombora +bombous +bombproof +bombs +bombshell +bombshells +bombsight +bombsights +bombus +bomi +bomos +bon +bona +bonace +bonaci +bonacis +bonagh +bonaght +bonailie +bonair +bonaire +bonairly +bonairness +bonally +bonamano +bonang +bonanza +bonanzas +bonapartean +bonapartism +bonapartist +bonasa +bonassus +bonasus +bonaught +bonav +bonaventure +bonaveria +bonavist +bonbo +bonbon +bonbonniere +bonbonnieres +bonbons +bonce +bonchief +bond +bondable +bondage +bondager +bondages +bondar +bonded +bondelswarts +bonder +bonderize +bonderman +bonders +bondfolk +bondhold +bondholder +bondholders +bondholding +bondieuserie +bonding +bondland +bondless +bondmaid +bondmaids +bondman +bondmanship +bondmen +bondminder +bondoc +bondon +bonds +bondservant +bondship +bondslave +bondsman +bondsmen +bondstone +bondswoman +bondswomen +bonduc +bonducnut +bonducs +bondwoman +bondwomen +bone +boneache +bonebinder +boneblack +bonebreaker +boned +bonedog +bonedry +boneen +bonefish +bonefishes +boneflower +bonehead +boneheaded +boneheadedness +boneheads +boney +boneyard +boneyards +boneless +bonelessly +bonelessness +bonelet +bonelike +bonellia +boner +boners +bones +boneset +bonesets +bonesetter +bonesetting +boneshaker +boneshave +boneshaw +bonetail +bonete +bonetta +bonewood +bonework +bonewort +bonfire +bonfires +bong +bongar +bonged +bonging +bongo +bongoes +bongoist +bongoists +bongos +bongrace +bongs +bonhomie +bonhomies +bonhomme +bonhommie +bonhomous +bonhomously +boni +bony +boniata +bonier +boniest +boniface +bonifaces +bonify +bonification +bonyfish +boniform +bonilass +boniness +boninesses +boning +boninite +bonism +bonita +bonytail +bonitary +bonitarian +bonitas +bonity +bonito +bonitoes +bonitos +bonjour +bonk +bonked +bonkers +bonking +bonks +bonnaz +bonne +bonnering +bonnes +bonnet +bonneted +bonneter +bonnethead +bonnetiere +bonnetieres +bonneting +bonnetless +bonnetlike +bonnetman +bonnetmen +bonnets +bonny +bonnibel +bonnyclabber +bonnie +bonnier +bonniest +bonnyish +bonnily +bonniness +bonnive +bonnyvis +bonnne +bonnnes +bonnock +bonnocks +bonnwis +bono +bononian +bonorum +bonos +bons +bonsai +bonsela +bonser +bonsoir +bonspell +bonspells +bonspiel +bonspiels +bontebok +bonteboks +bontebuck +bontebucks +bontee +bontequagga +bontok +bonum +bonus +bonuses +bonxie +bonze +bonzer +bonzery +bonzes +bonzian +boo +boob +boobery +booby +boobialla +boobyalla +boobies +boobyish +boobyism +boobily +boobish +boobishness +booboisie +booboo +boobook +booboos +boobs +bood +boodh +boody +boodie +boodle +boodled +boodledom +boodleism +boodleize +boodler +boodlers +boodles +boodling +booed +boof +boogaloo +boogeyman +boogeymen +booger +boogerman +boogers +boogie +boogies +boogiewoogie +boogyman +boogymen +boogum +boohoo +boohooed +boohooing +boohoos +booing +boojum +book +bookable +bookbind +bookbinder +bookbindery +bookbinderies +bookbinders +bookbinding +bookboard +bookcase +bookcases +bookcraft +bookdealer +bookdom +booked +bookend +bookends +booker +bookery +bookers +bookfair +bookfold +bookful +bookholder +bookhood +booky +bookie +bookies +bookiness +booking +bookings +bookish +bookishly +bookishness +bookism +bookit +bookkeep +bookkeeper +bookkeepers +bookkeeping +bookkeeps +bookland +booklear +bookless +booklet +booklets +booklice +booklift +booklike +bookling +booklists +booklore +booklores +booklouse +booklover +bookmaker +bookmakers +bookmaking +bookman +bookmark +bookmarker +bookmarks +bookmate +bookmen +bookmobile +bookmobiles +bookmonger +bookplate +bookplates +bookpress +bookrack +bookracks +bookrest +bookrests +bookroom +books +bookseller +booksellerish +booksellerism +booksellers +bookselling +bookshelf +bookshelves +bookshop +bookshops +booksy +bookstack +bookstall +bookstand +bookstore +bookstores +bookways +bookward +bookwards +bookwise +bookwork +bookworm +bookworms +bookwright +bool +boolean +booleans +booley +booleys +booly +boolya +boolian +boolies +boom +boomable +boomage +boomah +boomboat +boombox +boomboxes +boomdas +boomed +boomer +boomerang +boomeranged +boomeranging +boomerangs +boomers +boomy +boomier +boomiest +boominess +booming +boomingly +boomkin +boomkins +boomless +boomlet +boomlets +boomorah +booms +boomslang +boomslange +boomster +boomtown +boomtowns +boon +boondock +boondocker +boondocks +boondoggle +boondoggled +boondoggler +boondogglers +boondoggles +boondoggling +boone +boonfellow +boong +boongary +boonies +boonk +boonless +boons +boophilus +boopic +boopis +boor +boordly +boorga +boorish +boorishly +boorishness +boors +boort +boos +boose +boosy +boosies +boost +boosted +booster +boosterism +boosters +boosting +boosts +boot +bootable +bootblack +bootblacks +bootboy +booted +bootee +bootees +booter +bootery +booteries +bootes +bootful +booth +boothage +boothale +bootheel +boother +boothes +boothian +boothite +bootholder +boothose +booths +booty +bootid +bootie +bootied +booties +bootikin +bootikins +bootyless +booting +bootjack +bootjacks +bootlace +bootlaces +bootle +bootleg +bootleger +bootlegged +bootlegger +bootleggers +bootlegging +bootlegs +bootless +bootlessly +bootlessness +bootlick +bootlicked +bootlicker +bootlickers +bootlicking +bootlicks +bootloader +bootmaker +bootmaking +bootman +bootprint +boots +bootstrap +bootstrapped +bootstrapping +bootstraps +boottop +boottopping +booze +boozed +boozehound +boozer +boozers +boozes +boozy +boozier +booziest +boozify +boozily +booziness +boozing +bop +bopeep +bopyrid +bopyridae +bopyridian +bopyrus +bopped +bopper +boppers +bopping +boppist +bops +bopster +bor +bora +borable +boraces +borachio +boracic +boraciferous +boracite +boracites +boracium +boracous +borage +borages +boraginaceae +boraginaceous +boragineous +borago +borak +boral +boran +borana +borane +boranes +borani +boras +borasca +borasco +borasque +borasqueborate +borassus +borate +borated +borates +borating +borax +boraxes +borazon +borazons +borboridae +borborygm +borborygmatic +borborygmi +borborygmic +borborygmies +borborygmus +borborus +bord +bordage +bordar +bordarius +bordeaux +bordel +bordelaise +bordello +bordellos +bordels +border +bordereau +bordereaux +bordered +borderer +borderers +borderies +bordering +borderings +borderism +borderland +borderlander +borderlands +borderless +borderlight +borderline +borderlines +bordermark +borders +borderside +bordman +bordrag +bordrage +bordroom +bordun +bordure +bordured +bordures +bore +boreable +boread +boreades +boreal +borealis +borean +boreas +borecole +borecoles +bored +boredness +boredom +boredoms +boree +boreen +boreens +boregat +borehole +boreholes +boreiad +boreism +borel +borele +borer +borers +bores +boresight +boresome +boresomely +boresomeness +boreus +borg +borgh +borghalpenny +borghese +borghi +borh +bori +boric +borickite +borid +boride +borides +boryl +borine +boring +boringly +boringness +borings +borinqueno +boris +borish +borism +borith +bority +borities +borize +borlase +borley +born +bornan +bornane +borne +bornean +borneo +borneol +borneols +bornyl +borning +bornite +bornites +bornitic +boro +borocaine +borocalcite +borocarbide +borocitrate +borofluohydric +borofluoric +borofluoride +borofluorin +boroglycerate +boroglyceride +boroglycerine +borohydride +borolanite +boron +boronatrocalcite +boronia +boronic +borons +borophenylic +borophenol +bororo +bororoan +borosalicylate +borosalicylic +borosilicate +borosilicic +borotungstate +borotungstic +borough +boroughlet +boroughmaster +boroughmonger +boroughmongery +boroughmongering +boroughs +boroughship +boroughwide +borowolframic +borracha +borrachio +borrasca +borrel +borrelia +borrelomycetaceae +borreria +borrichia +borromean +borrovian +borrow +borrowable +borrowed +borrower +borrowers +borrowing +borrows +bors +borsch +borsches +borscht +borschts +borsholder +borsht +borshts +borstal +borstall +borstals +bort +borty +borts +bortsch +bortz +bortzes +boruca +borussian +borwort +borzicactus +borzoi +borzois +bos +bosc +boscage +boscages +bosch +boschbok +boschboks +boschneger +boschvark +boschveld +bose +bosey +boselaphus +boser +bosh +boshas +boshbok +boshboks +bosher +boshes +boshvark +boshvarks +bosjesman +bosk +boskage +boskages +bosker +bosket +boskets +bosky +boskier +boskiest +boskiness +boskopoid +bosks +bosn +bosniac +bosniak +bosnian +bosnisch +bosom +bosomed +bosomer +bosomy +bosominess +bosoming +bosoms +boson +bosonic +bosons +bosporan +bosporanic +bosporian +bosporus +bosque +bosques +bosquet +bosquets +boss +bossa +bossage +bossboy +bossdom +bossdoms +bossed +bosseyed +bosselated +bosselation +bosser +bosses +bosset +bossy +bossier +bossies +bossiest +bossily +bossiness +bossing +bossism +bossisms +bosslet +bossship +bostal +bostangi +bostanji +bosthoon +boston +bostonese +bostonian +bostonians +bostonite +bostons +bostrychid +bostrychidae +bostrychoid +bostrychoidal +bostryx +bosun +bosuns +boswell +boswellia +boswellian +boswelliana +boswellism +boswellize +boswellized +boswellizing +bot +bota +botan +botany +botanic +botanica +botanical +botanically +botanicas +botanics +botanies +botanise +botanised +botaniser +botanises +botanising +botanist +botanists +botanize +botanized +botanizer +botanizes +botanizing +botanomancy +botanophile +botanophilist +botargo +botargos +botas +botaurinae +botaurus +botch +botched +botchedly +botcher +botchery +botcheries +botcherly +botchers +botches +botchy +botchier +botchiest +botchily +botchiness +botching +botchka +botchwork +bote +botein +botel +boteler +botella +botels +boterol +boteroll +botete +botfly +botflies +both +bother +botheration +bothered +botherer +botherheaded +bothering +botherment +bothers +bothersome +bothersomely +bothersomeness +bothy +bothie +bothies +bothlike +bothnian +bothnic +bothrenchyma +bothria +bothridia +bothridium +bothridiums +bothriocephalus +bothriocidaris +bothriolepis +bothrium +bothriums +bothrodendron +bothroi +bothropic +bothrops +bothros +bothsided +bothsidedness +boththridia +bothway +boti +botling +botocudo +botoyan +botone +botonee +botong +botony +botonn +botonnee +botonny +botry +botrychium +botrycymose +botrydium +botrylle +botryllidae +botryllus +botryogen +botryoid +botryoidal +botryoidally +botryolite +botryomyces +botryomycoma +botryomycosis +botryomycotic +botryopteriaceae +botryopterid +botryopteris +botryose +botryotherapy +botrytis +botrytises +bots +botswana +bott +botte +bottega +bottegas +botteghe +bottekin +botticelli +botticellian +bottier +bottine +bottle +bottlebird +bottlebrush +bottled +bottleflower +bottleful +bottlefuls +bottlehead +bottleholder +bottlelike +bottlemaker +bottlemaking +bottleman +bottleneck +bottlenecks +bottlenest +bottlenose +bottler +bottlers +bottles +bottlesful +bottlestone +bottling +bottom +bottomchrome +bottomed +bottomer +bottomers +bottoming +bottomland +bottomless +bottomlessly +bottomlessness +bottommost +bottomry +bottomried +bottomries +bottomrying +bottoms +bottonhook +botts +bottstick +bottu +botuliform +botulin +botulinal +botulins +botulinum +botulinus +botulinuses +botulism +botulisms +botulismus +boubas +boubou +boubous +boucan +bouch +bouchal +bouchaleen +boucharde +bouche +bouchee +bouchees +boucher +boucherism +boucherize +bouchette +bouchon +bouchons +boucl +boucle +boucles +boud +bouderie +boudeuse +boudin +boudoir +boudoiresque +boudoirs +bouet +bouffage +bouffancy +bouffant +bouffante +bouffants +bouffe +bouffes +bouffon +bougainvillaea +bougainvillaeas +bougainvillea +bougainvillia +bougainvilliidae +bougar +bouge +bougee +bougeron +bouget +bough +boughed +boughy +boughless +boughpot +boughpots +boughs +bought +boughten +bougie +bougies +bouillabaisse +bouilli +bouillon +bouillone +bouillons +bouk +boukit +boul +boulanger +boulangerite +boulangism +boulangist +boulder +bouldered +boulderhead +bouldery +bouldering +boulders +boule +boules +bouleuteria +bouleuterion +boulevard +boulevardier +boulevardiers +boulevardize +boulevards +bouleverse +bouleversement +boulework +boulimy +boulimia +boulle +boulles +boullework +boult +boultel +boultell +boulter +boulterer +boun +bounce +bounceable +bounceably +bounceback +bounced +bouncer +bouncers +bounces +bouncy +bouncier +bounciest +bouncily +bounciness +bouncing +bouncingly +bound +boundable +boundary +boundaries +bounded +boundedly +boundedness +bounden +bounder +bounderish +bounderishly +bounders +bounding +boundingly +boundless +boundlessly +boundlessness +boundly +boundness +bounds +boundure +bounteous +bounteously +bounteousness +bounty +bountied +bounties +bountiful +bountifully +bountifulness +bountihead +bountyless +bountiousness +bountith +bountree +bouquet +bouquetiere +bouquetin +bouquets +bouquiniste +bour +bourage +bourasque +bourbon +bourbonesque +bourbonian +bourbonism +bourbonist +bourbonize +bourbons +bourd +bourder +bourdis +bourdon +bourdons +bourette +bourg +bourgade +bourgeois +bourgeoise +bourgeoises +bourgeoisie +bourgeoisify +bourgeoisitic +bourgeon +bourgeoned +bourgeoning +bourgeons +bourgs +bourguignonne +bourignian +bourignianism +bourignianist +bourignonism +bourignonist +bourkha +bourlaw +bourn +bourne +bournes +bournless +bournonite +bournous +bourns +bourock +bourout +bourr +bourran +bourrasque +bourre +bourreau +bourree +bourrees +bourrelet +bourride +bourrides +bourse +bourses +bourtree +bourtrees +bouse +boused +bouser +bouses +bousy +bousing +bousouki +bousoukia +bousoukis +boussingaultia +boussingaultite +boustrophedon +boustrophedonic +bout +boutade +boutefeu +boutel +boutell +bouteloua +bouteria +bouteselle +boutylka +boutique +boutiques +bouto +bouton +boutonniere +boutonnieres +boutons +boutre +bouts +bouvardia +bouvier +bouviers +bouw +bouzouki +bouzoukia +bouzoukis +bovarism +bovarysm +bovarist +bovaristic +bovate +bove +bovey +bovenland +bovicide +boviculture +bovid +bovidae +bovids +boviform +bovine +bovinely +bovines +bovinity +bovinities +bovista +bovld +bovoid +bovovaccination +bovovaccine +bovver +bow +bowable +bowback +bowbells +bowbent +bowboy +bowden +bowdichia +bowditch +bowdlerisation +bowdlerise +bowdlerised +bowdlerising +bowdlerism +bowdlerization +bowdlerizations +bowdlerize +bowdlerized +bowdlerizer +bowdlerizes +bowdlerizing +bowdrill +bowe +bowed +bowedness +bowel +boweled +boweling +bowelled +bowelless +bowellike +bowelling +bowels +bowenite +bower +bowerbird +bowered +bowery +boweries +boweryish +bowering +bowerlet +bowerly +bowerlike +bowermay +bowermaiden +bowers +bowerwoman +bowess +bowet +bowfin +bowfins +bowfront +bowge +bowgrace +bowhead +bowheads +bowyang +bowyangs +bowie +bowieful +bowyer +bowyers +bowing +bowingly +bowings +bowk +bowkail +bowker +bowknot +bowknots +bowl +bowla +bowlder +bowlderhead +bowldery +bowldering +bowlders +bowle +bowled +bowleg +bowlegged +bowleggedness +bowlegs +bowler +bowlers +bowles +bowless +bowlful +bowlfuls +bowly +bowlike +bowlin +bowline +bowlines +bowling +bowlings +bowllike +bowlmaker +bowls +bowmaker +bowmaking +bowman +bowmen +bown +bowne +bowpin +bowpot +bowpots +bowralite +bows +bowsaw +bowse +bowsed +bowser +bowsery +bowses +bowshot +bowshots +bowsie +bowsing +bowsman +bowsprit +bowsprits +bowssen +bowstaff +bowstave +bowstring +bowstringed +bowstringing +bowstrings +bowstrung +bowtel +bowtell +bowtie +bowwoman +bowwood +bowwort +bowwow +bowwows +box +boxball +boxberry +boxberries +boxboard +boxboards +boxbush +boxcar +boxcars +boxed +boxen +boxer +boxerism +boxers +boxes +boxfish +boxfishes +boxful +boxfuls +boxhaul +boxhauled +boxhauling +boxhauls +boxhead +boxholder +boxy +boxiana +boxier +boxiest +boxiness +boxinesses +boxing +boxings +boxkeeper +boxlike +boxmaker +boxmaking +boxman +boxroom +boxthorn +boxthorns +boxty +boxtop +boxtops +boxtree +boxwallah +boxwood +boxwoods +boxwork +boza +bozal +bozine +bozo +bozos +bozze +bozzetto +bp +bpi +bps +bpt +br +bra +braata +brab +brabagious +brabant +brabanter +brabantine +brabble +brabbled +brabblement +brabbler +brabblers +brabbles +brabbling +brabblingly +brabejum +braca +bracae +braccae +braccate +braccia +bracciale +braccianite +braccio +brace +braced +bracelet +braceleted +bracelets +bracer +bracery +bracero +braceros +bracers +braces +brach +brache +brachelytra +brachelytrous +bracherer +brachering +braches +brachet +brachets +brachia +brachial +brachialgia +brachialis +brachials +brachiata +brachiate +brachiated +brachiating +brachiation +brachiator +brachyaxis +brachycardia +brachycatalectic +brachycephal +brachycephales +brachycephali +brachycephaly +brachycephalic +brachycephalies +brachycephalism +brachycephalization +brachycephalize +brachycephalous +brachycera +brachyceral +brachyceric +brachycerous +brachychronic +brachycnemic +brachycome +brachycrany +brachycranial +brachycranic +brachydactyl +brachydactyly +brachydactylia +brachydactylic +brachydactylism +brachydactylous +brachydiagonal +brachydodrome +brachydodromous +brachydomal +brachydomatic +brachydome +brachydont +brachydontism +brachyfacial +brachiferous +brachigerous +brachyglossal +brachygnathia +brachygnathism +brachygnathous +brachygrapher +brachygraphy +brachygraphic +brachygraphical +brachyhieric +brachylogy +brachylogies +brachymetropia +brachymetropic +brachinus +brachiocephalic +brachiocyllosis +brachiocrural +brachiocubital +brachiofacial +brachiofaciolingual +brachioganoid +brachioganoidei +brachiolaria +brachiolarian +brachiopod +brachiopoda +brachiopode +brachiopodist +brachiopodous +brachioradial +brachioradialis +brachiorrhachidian +brachiorrheuma +brachiosaur +brachiosaurus +brachiostrophosis +brachiotomy +brachyoura +brachyphalangia +brachyphyllum +brachypinacoid +brachypinacoidal +brachypyramid +brachypleural +brachypnea +brachypodine +brachypodous +brachyprism +brachyprosopic +brachypterous +brachyrrhinia +brachysclereid +brachyskelic +brachysm +brachystaphylic +brachystegia +brachistocephali +brachistocephaly +brachistocephalic +brachistocephalous +brachistochrone +brachystochrone +brachistochronic +brachistochronous +brachystomata +brachystomatous +brachystomous +brachytic +brachytypous +brachytmema +brachium +brachyura +brachyural +brachyuran +brachyuranic +brachyure +brachyurous +brachyurus +brachman +brachtmema +bracing +bracingly +bracingness +bracings +braciola +braciolas +braciole +bracioles +brack +brackebuschite +bracked +bracken +brackened +brackens +bracker +bracket +bracketed +bracketing +brackets +bracketted +bracketwise +bracky +bracking +brackish +brackishness +brackmard +bracon +braconid +braconidae +braconids +braconniere +bracozzo +bract +bractea +bracteal +bracteate +bracted +bracteiform +bracteolate +bracteole +bracteose +bractless +bractlet +bractlets +bracts +brad +bradawl +bradawls +bradbury +bradburya +bradded +bradding +bradenhead +bradford +bradyacousia +bradyauxesis +bradyauxetic +bradyauxetically +bradycardia +bradycardic +bradycauma +bradycinesia +bradycrotic +bradydactylia +bradyesthesia +bradyglossia +bradykinesia +bradykinesis +bradykinetic +bradykinin +bradylalia +bradylexia +bradylogia +bradynosus +bradypepsy +bradypepsia +bradypeptic +bradyphagia +bradyphasia +bradyphemia +bradyphrasia +bradyphrenia +bradypnea +bradypnoea +bradypod +bradypode +bradypodidae +bradypodoid +bradypus +bradyseism +bradyseismal +bradyseismic +bradyseismical +bradyseismism +bradyspermatism +bradysphygmia +bradystalsis +bradyteleocinesia +bradyteleokinesis +bradytely +bradytelic +bradytocia +bradytrophic +bradyuria +bradley +bradmaker +bradoon +bradoons +brads +bradshaw +bradsot +brae +braeface +braehead +braeman +braes +braeside +brag +bragas +brager +braggadocian +braggadocianism +braggadocio +braggadocios +braggardism +braggart +braggartism +braggartly +braggartry +braggarts +braggat +bragged +bragger +braggery +braggers +braggest +bragget +braggy +braggier +braggiest +bragging +braggingly +braggish +braggishly +braggite +braggle +bragi +bragite +bragless +bragly +bragozzo +brags +braguette +bragwort +brahm +brahma +brahmachari +brahmahood +brahmaic +brahman +brahmana +brahmanaspati +brahmanda +brahmaness +brahmanhood +brahmani +brahmany +brahmanic +brahmanical +brahmanism +brahmanist +brahmanistic +brahmanists +brahmanize +brahmans +brahmapootra +brahmas +brahmi +brahmic +brahmin +brahminee +brahminic +brahminism +brahminist +brahminists +brahmins +brahmism +brahmoism +brahms +brahmsian +brahmsite +brahui +bray +braid +braided +braider +braiders +braiding +braidings +braidism +braidist +braids +braye +brayed +brayer +brayera +brayerin +brayers +braies +brayette +braying +brail +brailed +brailing +braille +brailled +brailler +brailles +braillewriter +brailling +braillist +brails +brain +brainache +braincap +braincase +brainchild +brainchildren +braincraft +brained +brainer +brainfag +brainge +brainy +brainier +brainiest +brainily +braininess +braining +brainish +brainless +brainlessly +brainlessness +brainlike +brainpan +brainpans +brainpower +brains +brainsick +brainsickly +brainsickness +brainstem +brainstems +brainstone +brainstorm +brainstormer +brainstorming +brainstorms +brainteaser +brainteasers +brainward +brainwash +brainwashed +brainwasher +brainwashers +brainwashes +brainwashing +brainwashjng +brainwater +brainwave +brainwood +brainwork +brainworker +braird +brairded +brairding +braireau +brairo +brays +braise +braised +braises +braising +braystone +braize +braizes +brake +brakeage +brakeages +braked +brakehand +brakehead +brakeless +brakeload +brakemaker +brakemaking +brakeman +brakemen +braker +brakeroot +brakes +brakesman +brakesmen +braky +brakie +brakier +brakiest +braking +braless +bram +bramah +bramantesque +bramantip +bramble +brambleberry +brambleberries +bramblebush +brambled +brambles +brambly +bramblier +brambliest +brambling +brambrack +brame +bramia +bran +brancard +brancardier +branch +branchage +branched +branchedness +branchellion +brancher +branchery +branches +branchful +branchi +branchy +branchia +branchiae +branchial +branchiata +branchiate +branchicolous +branchier +branchiest +branchiferous +branchiform +branchihyal +branchiness +branching +branchings +branchiobdella +branchiocardiac +branchiogenous +branchiomere +branchiomeric +branchiomerism +branchiopallial +branchiopneustic +branchiopod +branchiopoda +branchiopodan +branchiopodous +branchiopoo +branchiopulmonata +branchiopulmonate +branchiosaur +branchiosauria +branchiosaurian +branchiosaurus +branchiostegal +branchiostegan +branchiostege +branchiostegidae +branchiostegite +branchiostegous +branchiostoma +branchiostomid +branchiostomidae +branchiostomous +branchipodidae +branchipus +branchireme +branchiura +branchiurous +branchless +branchlet +branchlike +branchling +branchman +branchstand +branchway +brand +brandade +branded +brandenburg +brandenburger +brandenburgh +brandenburgs +brander +brandering +branders +brandi +brandy +brandyball +brandied +brandies +brandify +brandying +brandyman +branding +brandiron +brandise +brandish +brandished +brandisher +brandishers +brandishes +brandishing +brandisite +brandywine +brandle +brandless +brandling +brandon +brandreth +brandrith +brands +brandsolder +brangle +brangled +branglement +brangler +brangling +branial +brank +branky +brankie +brankier +brankiest +branks +brankursine +branle +branles +branned +branner +brannerite +branners +branny +brannier +branniest +brannigan +branniness +branning +brans +bransle +bransles +bransolder +brant +branta +brantail +brantails +brantcorn +brantle +brantness +brants +branular +braquemard +brarow +bras +brasen +brasenia +brasero +braseros +brash +brasher +brashes +brashest +brashy +brashier +brashiest +brashiness +brashly +brashness +brasier +brasiers +brasil +brasilein +brasilete +brasiletto +brasilia +brasilin +brasilins +brasils +brasque +brasqued +brasquing +brass +brassage +brassages +brassard +brassards +brassart +brassarts +brassate +brassavola +brassbound +brassbounder +brasse +brassed +brassey +brasseys +brasser +brasserie +brasseries +brasses +brasset +brassy +brassia +brassic +brassica +brassicaceae +brassicaceous +brassicas +brassidic +brassie +brassier +brassiere +brassieres +brassies +brassiest +brassily +brassylic +brassiness +brassish +brasslike +brassware +brasswork +brassworker +brassworks +brast +brat +bratchet +bratina +bratling +brats +bratstva +bratstvo +brattach +bratty +brattice +bratticed +bratticer +brattices +bratticing +brattie +brattier +brattiest +brattiness +brattish +brattishing +brattle +brattled +brattles +brattling +bratwurst +braula +brauna +brauneberger +brauneria +braunite +braunites +braunschweiger +brauronia +brauronian +brava +bravade +bravado +bravadoed +bravadoes +bravadoing +bravadoism +bravados +bravas +brave +braved +bravehearted +bravely +braveness +braver +bravery +braveries +bravers +braves +bravest +bravi +braving +bravish +bravissimo +bravo +bravoed +bravoes +bravoing +bravoite +bravos +bravura +bravuraish +bravuras +bravure +braw +brawer +brawest +brawl +brawled +brawler +brawlers +brawly +brawlie +brawlier +brawliest +brawling +brawlingly +brawlis +brawlys +brawls +brawlsome +brawn +brawned +brawnedness +brawner +brawny +brawnier +brawniest +brawnily +brawniness +brawns +braws +braxy +braxies +braza +brazas +braze +brazed +brazee +brazen +brazened +brazenface +brazenfaced +brazenfacedly +brazenfacedness +brazening +brazenly +brazenness +brazens +brazer +brazera +brazers +brazes +brazier +braziery +braziers +brazil +brazilein +brazilette +braziletto +brazilian +brazilianite +brazilians +brazilin +brazilins +brazilite +brazils +brazilwood +brazing +breach +breached +breacher +breachers +breaches +breachful +breachy +breaching +bread +breadbasket +breadbaskets +breadberry +breadboard +breadboards +breadbox +breadboxes +breadearner +breadearning +breaded +breaden +breadfruit +breadfruits +breading +breadless +breadlessness +breadline +breadmaker +breadmaking +breadman +breadness +breadnut +breadnuts +breadroot +breads +breadseller +breadstitch +breadstuff +breadstuffs +breadth +breadthen +breadthless +breadthriders +breadths +breadthways +breadthwise +breadwinner +breadwinners +breadwinning +breaghe +break +breakability +breakable +breakableness +breakables +breakably +breakage +breakages +breakaway +breakax +breakaxe +breakback +breakbone +breakbones +breakdown +breakdowns +breaker +breakerman +breakermen +breakers +breakfast +breakfasted +breakfaster +breakfasters +breakfasting +breakfastless +breakfasts +breakfront +breakfronts +breaking +breakings +breakless +breaklist +breakneck +breakoff +breakout +breakouts +breakover +breakpoint +breakpoints +breaks +breakshugh +breakstone +breakthrough +breakthroughes +breakthroughs +breakup +breakups +breakwater +breakwaters +breakweather +breakwind +bream +breamed +breaming +breams +breards +breast +breastband +breastbeam +breastbone +breastbones +breasted +breaster +breastfast +breastfeeding +breastful +breastheight +breasthook +breastie +breasting +breastless +breastmark +breastpiece +breastpin +breastplate +breastplates +breastplough +breastplow +breastrail +breastrope +breasts +breaststroke +breaststroker +breaststrokes +breastsummer +breastweed +breastwise +breastwood +breastwork +breastworks +breath +breathability +breathable +breathableness +breathalyse +breathe +breatheableness +breathed +breather +breathers +breathes +breathful +breathy +breathier +breathiest +breathily +breathiness +breathing +breathingly +breathless +breathlessly +breathlessness +breaths +breathseller +breathtaking +breathtakingly +breba +breccia +breccial +breccias +brecciate +brecciated +brecciating +brecciation +brecham +brechams +brechan +brechans +brechites +brecht +brechtian +brecia +breck +brecken +bred +bredbergite +brede +bredes +bredestitch +bredi +bredstitch +bree +breech +breechblock +breechcloth +breechcloths +breechclout +breeched +breeches +breechesflower +breechesless +breeching +breechless +breechloader +breechloading +breed +breedable +breedbate +breeder +breeders +breedy +breediness +breeding +breedings +breedling +breeds +breek +breekless +breeks +breekums +breenge +breenger +brees +breeze +breezed +breezeful +breezeless +breezelike +breezes +breezeway +breezeways +breezy +breezier +breeziest +breezily +breeziness +breezing +bregma +bregmata +bregmate +bregmatic +brehon +brehonia +brehonship +brei +brey +breird +breislakite +breithauptite +brekky +brekkle +brelan +brelaw +breloque +brember +breme +bremely +bremeness +bremia +bremsstrahlung +bren +brenda +brendan +brended +brender +brendice +brennage +brennschluss +brens +brent +brenthis +brents +brephic +brerd +brere +brescian +bressomer +bressummer +brest +bret +bretelle +bretesse +breth +brethel +brethren +brethrenism +breton +bretonian +bretons +bretschneideraceae +brett +brettice +bretwalda +bretwaldadom +bretwaldaship +breunnerite +brev +breva +breve +breves +brevet +brevetcy +brevetcies +brevete +breveted +breveting +brevets +brevetted +brevetting +brevi +breviary +breviaries +breviate +breviature +brevicauda +brevicaudate +brevicipitid +brevicipitidae +brevicomis +breviconic +brevier +breviers +brevifoliate +breviger +brevilingual +breviloquence +breviloquent +breviped +brevipen +brevipennate +breviradiate +brevirostral +brevirostrate +brevirostrines +brevis +brevit +brevity +brevities +brew +brewage +brewages +brewed +brewer +brewery +breweries +brewers +brewership +brewhouse +brewhouses +brewing +brewings +brewis +brewises +brewmaster +brews +brewst +brewster +brewsterite +brezhnev +bryaceae +bryaceous +bryales +brian +bryan +bryanism +bryanite +bryanthus +briar +briarberry +briard +briards +briarean +briared +briareus +briary +briarroot +briars +briarwood +bribability +bribable +bribe +bribeability +bribeable +bribed +bribee +bribees +bribegiver +bribegiving +bribeless +bribemonger +briber +bribery +briberies +bribers +bribes +bribetaker +bribetaking +bribeworthy +bribing +bribri +bryce +brichen +brichette +brick +brickbat +brickbats +brickbatted +brickbatting +brickcroft +bricked +brickel +bricken +bricker +brickfield +brickfielder +brickhood +bricky +brickyard +brickier +brickiest +bricking +brickish +brickkiln +bricklay +bricklayer +bricklayers +bricklaying +brickle +brickleness +brickly +bricklike +brickliner +bricklining +brickmaker +brickmaking +brickmason +brickred +bricks +brickset +bricksetter +bricktimber +bricktop +brickwall +brickwise +brickwork +bricole +bricoles +brid +bridal +bridale +bridaler +bridally +bridals +bridalty +bride +bridebed +bridebowl +bridecake +bridechamber +bridecup +bridegod +bridegroom +bridegrooms +bridegroomship +bridehead +bridehood +bridehouse +brideknot +bridelace +brideless +bridely +bridelike +bridelope +bridemaid +bridemaiden +bridemaidship +brideman +brides +brideship +bridesmaid +bridesmaiding +bridesmaids +bridesman +bridesmen +bridestake +bridewain +brideweed +bridewell +bridewort +bridge +bridgeable +bridgeboard +bridgebote +bridgebuilder +bridgebuilding +bridged +bridgehead +bridgeheads +bridgekeeper +bridgeless +bridgelike +bridgemaker +bridgemaking +bridgeman +bridgemaster +bridgemen +bridgeport +bridgepot +bridger +bridges +bridget +bridgetin +bridgetree +bridgeway +bridgewall +bridgeward +bridgewards +bridgewater +bridgework +bridging +bridgings +bridie +bridle +bridled +bridleless +bridleman +bridler +bridlers +bridles +bridlewise +bridling +bridoon +bridoons +brie +brief +briefcase +briefcases +briefed +briefer +briefers +briefest +briefing +briefings +briefless +brieflessly +brieflessness +briefly +briefness +briefs +brier +brierberry +briered +briery +brierroot +briers +brierwood +bries +brieve +brig +brigade +brigaded +brigades +brigadier +brigadiers +brigadiership +brigading +brigalow +brigand +brigandage +brigander +brigandine +brigandish +brigandishly +brigandism +brigands +brigantes +brigantia +brigantine +brigantinebrigantines +brigantines +brigatry +brigbote +brigetty +briggs +briggsian +brighella +brighid +bright +brighteyes +brighten +brightened +brightener +brighteners +brightening +brightens +brighter +brightest +brightish +brightly +brightness +brights +brightsmith +brightsome +brightsomeness +brightwork +brigid +brigittine +brigous +brigs +brigsail +brigue +brigued +briguer +briguing +brike +brill +brillante +brilliance +brilliancy +brilliancies +brilliandeer +brilliant +brilliantine +brilliantined +brilliantly +brilliantness +brilliants +brilliantwise +brilliolette +brillolette +brills +brim +brimborion +brimborium +brimful +brimfull +brimfully +brimfullness +brimfulness +briming +brimless +brimly +brimmed +brimmer +brimmered +brimmering +brimmers +brimmimg +brimming +brimmingly +brims +brimse +brimstone +brimstonewort +brimstony +brin +brince +brinded +brindisi +brindle +brindled +brindles +brindlish +bryndza +brine +brined +brinehouse +brineless +brineman +briner +briners +brines +bring +bringal +bringall +bringdown +bringed +bringela +bringer +bringers +bringeth +bringing +brings +bringsel +brynhild +briny +brinie +brinier +brinies +briniest +brininess +brining +brinish +brinishness +brinjal +brinjaree +brinjarry +brinjarries +brinjaul +brink +brinkless +brinkmanship +brinks +brinksmanship +brinny +brins +brinsell +brinston +brynza +brio +brioche +brioches +bryogenin +briolet +briolette +briolettes +bryology +bryological +bryologies +bryologist +bryon +briony +bryony +bryonia +bryonidin +brionies +bryonies +bryonin +brionine +bryophyllum +bryophyta +bryophyte +bryophytes +bryophytic +brios +bryozoa +bryozoan +bryozoans +bryozoon +bryozoum +brique +briquet +briquets +briquette +briquetted +briquettes +briquetting +brisa +brisance +brisances +brisant +brisbane +briscola +brise +briseis +brisement +brises +brisk +brisked +brisken +briskened +briskening +brisker +briskest +brisket +briskets +brisky +brisking +briskish +briskly +briskness +brisks +brisling +brislings +brisque +briss +brisses +brissotin +brissotine +brist +bristle +bristlebird +bristlecone +bristled +bristleless +bristlelike +bristlemouth +bristlemouths +bristler +bristles +bristletail +bristlewort +bristly +bristlier +bristliest +bristliness +bristling +bristol +bristols +brisure +brit +britain +britany +britannia +britannian +britannic +britannica +britannically +britchel +britches +britchka +brite +brith +brither +brython +brythonic +briticism +british +britisher +britishers +britishhood +britishism +britishly +britishness +briton +britoness +britons +brits +britska +britskas +britt +brittany +britten +brittle +brittlebush +brittled +brittlely +brittleness +brittler +brittles +brittlest +brittlestem +brittlewood +brittlewort +brittling +brittonic +britts +britzka +britzkas +britzska +britzskas +bryum +briza +brizz +brl +bro +broach +broached +broacher +broachers +broaches +broaching +broad +broadacre +broadax +broadaxe +broadaxes +broadband +broadbill +broadbrim +broadcast +broadcasted +broadcaster +broadcasters +broadcasting +broadcastings +broadcasts +broadcloth +broaden +broadened +broadener +broadeners +broadening +broadenings +broadens +broader +broadest +broadgage +broadhead +broadhearted +broadhorn +broadish +broadleaf +broadleaves +broadly +broadling +broadlings +broadloom +broadlooms +broadmindedly +broadmouth +broadness +broadpiece +broads +broadshare +broadsheet +broadside +broadsided +broadsider +broadsides +broadsiding +broadspread +broadsword +broadswords +broadtail +broadthroat +broadway +broadwayite +broadways +broadwife +broadwise +broadwives +brob +brobdingnag +brobdingnagian +brocade +brocaded +brocades +brocading +brocage +brocard +brocardic +brocatel +brocatelle +brocatello +brocatels +broccoli +broccolis +broch +brochan +brochant +brochantite +broche +brochette +brochettes +brochidodromous +brocho +brochophony +brocht +brochure +brochures +brock +brockage +brockages +brocked +brocket +brockets +brockish +brockle +brocks +brocoli +brocolis +brod +brodder +broddle +brodee +brodeglass +brodekin +brodequin +broderer +broderie +brodiaea +brodyaga +brodyagi +brodie +broeboe +brog +brogan +brogans +brogger +broggerite +broggle +brogh +brogue +brogued +brogueful +brogueneer +broguer +broguery +brogueries +brogues +broguing +broguish +broid +broiden +broider +broidered +broiderer +broideress +broidery +broideries +broidering +broiders +broigne +broil +broiled +broiler +broilery +broilers +broiling +broilingly +broils +brokage +brokages +broke +broken +brokenhearted +brokenheartedly +brokenheartedness +brokenly +brokenness +broker +brokerage +brokerages +brokeress +brokery +brokerly +brokers +brokership +brokes +broking +broletti +broletto +brolga +broll +brolly +brollies +broma +bromacetanilide +bromacetate +bromacetic +bromacetone +bromal +bromalbumin +bromals +bromamide +bromargyrite +bromate +bromated +bromates +bromating +bromatium +bromatology +bromaurate +bromauric +brombenzamide +brombenzene +brombenzyl +bromcamphor +bromcresol +brome +bromegrass +bromeigon +bromeikon +bromelia +bromeliaceae +bromeliaceous +bromeliad +bromelin +bromelins +bromellite +bromeosin +bromes +bromethyl +bromethylene +bromgelatin +bromhydrate +bromhydric +bromhidrosis +bromian +bromic +bromid +bromide +bromides +bromidic +bromidically +bromidrosiphobia +bromidrosis +bromids +bromin +brominate +brominated +brominating +bromination +bromindigo +bromine +bromines +brominism +brominize +bromins +bromiodide +bromios +bromyrite +bromisation +bromise +bromised +bromising +bromism +bromisms +bromite +bromius +bromization +bromize +bromized +bromizer +bromizes +bromizing +bromlite +bromo +bromoacetone +bromoaurate +bromoaurates +bromoauric +bromobenzene +bromobenzyl +bromocamphor +bromochloromethane +bromochlorophenol +bromocyanid +bromocyanidation +bromocyanide +bromocyanogen +bromocresol +bromodeoxyuridine +bromoethylene +bromoform +bromogelatin +bromohydrate +bromohydrin +bromoil +bromoiodid +bromoiodide +bromoiodism +bromoiodized +bromoketone +bromol +bromomania +bromomenorrhea +bromomethane +bromometry +bromometric +bromometrical +bromometrically +bromonaphthalene +bromophenol +bromopicrin +bromopikrin +bromopnea +bromoprotein +bromos +bromothymol +bromouracil +bromous +bromphenol +brompicrin +bromthymol +bromuret +bromus +bromvoel +bromvogel +bronc +bronchadenitis +bronchi +bronchia +bronchial +bronchially +bronchiarctia +bronchiectasis +bronchiectatic +bronchiloquy +bronchiocele +bronchiocrisis +bronchiogenic +bronchiolar +bronchiole +bronchioles +bronchioli +bronchiolitis +bronchiolus +bronchiospasm +bronchiostenosis +bronchitic +bronchitis +bronchium +broncho +bronchoadenitis +bronchoalveolar +bronchoaspergillosis +bronchoblennorrhea +bronchobuster +bronchocavernous +bronchocele +bronchocephalitis +bronchoconstriction +bronchoconstrictor +bronchodilatation +bronchodilator +bronchoegophony +bronchoesophagoscopy +bronchogenic +bronchography +bronchographic +bronchohemorrhagia +broncholemmitis +broncholith +broncholithiasis +bronchomycosis +bronchomotor +bronchomucormycosis +bronchopathy +bronchophony +bronchophonic +bronchophthisis +bronchoplasty +bronchoplegia +bronchopleurisy +bronchopneumonia +bronchopneumonic +bronchopulmonary +bronchorrhagia +bronchorrhaphy +bronchorrhea +bronchos +bronchoscope +bronchoscopy +bronchoscopic +bronchoscopically +bronchoscopist +bronchospasm +bronchostenosis +bronchostomy +bronchostomies +bronchotetany +bronchotyphoid +bronchotyphus +bronchotome +bronchotomy +bronchotomist +bronchotracheal +bronchovesicular +bronchus +bronco +broncobuster +broncobusters +broncobusting +broncos +broncs +brongniardite +bronk +bronstrops +bronteana +bronteon +brontephobia +brontesque +bronteum +brontide +brontides +brontogram +brontograph +brontolite +brontolith +brontology +brontometer +brontophobia +brontops +brontosaur +brontosauri +brontosaurs +brontosaurus +brontosauruses +brontoscopy +brontothere +brontotherium +brontozoum +bronx +bronze +bronzed +bronzelike +bronzen +bronzer +bronzers +bronzes +bronzesmith +bronzewing +bronzy +bronzier +bronziest +bronzify +bronzine +bronzing +bronzings +bronzite +bronzitite +broo +brooch +brooched +brooches +brooching +brood +brooded +brooder +brooders +broody +broodier +broodiest +broodily +broodiness +brooding +broodingly +broodless +broodlet +broodling +broodmare +broods +broodsac +brook +brookable +brooke +brooked +brookflower +brooky +brookie +brookier +brookiest +brooking +brookite +brookites +brookless +brooklet +brooklets +brooklike +brooklime +brooklyn +brooklynite +brooks +brookside +brookweed +brool +broom +broomball +broomballer +broombush +broomcorn +broomed +broomer +broomy +broomier +broomiest +brooming +broommaker +broommaking +broomrape +broomroot +brooms +broomshank +broomsquire +broomstaff +broomstick +broomsticks +broomstraw +broomtail +broomweed +broomwood +broomwort +broon +broos +broose +broozled +broquery +broquineer +bros +brose +broses +brosy +brosimum +brosot +brosse +brot +brotan +brotany +brotchen +brotel +broth +brothe +brothel +brotheler +brothellike +brothelry +brothels +brother +brothered +brotherhood +brothering +brotherless +brotherly +brotherlike +brotherliness +brotherred +brothers +brothership +brotherton +brotherwort +brothy +brothier +brothiest +broths +brotocrystal +brott +brotula +brotulid +brotulidae +brotuliform +brouette +brough +brougham +broughams +brought +broughta +broughtas +brouhaha +brouhahas +brouille +brouillon +broussonetia +brouze +brow +browache +browallia +browband +browbands +browbeat +browbeaten +browbeater +browbeating +browbeats +browbound +browd +browden +browed +browet +browis +browless +browman +brown +brownback +browned +browner +brownest +browny +brownian +brownie +brownier +brownies +browniest +browniness +browning +browningesque +brownish +brownishness +brownism +brownist +brownistic +brownistical +brownly +brownness +brownnose +brownnoser +brownout +brownouts +brownprint +browns +brownshirt +brownstone +brownstones +browntail +browntop +brownweed +brownwort +browpiece +browpost +brows +browsability +browsage +browse +browsed +browser +browsers +browses +browsick +browsing +browst +browzer +brr +brrr +bruang +brubru +brubu +bruce +brucella +brucellae +brucellas +brucellosis +bruchid +bruchidae +bruchus +brucia +brucin +brucina +brucine +brucines +brucins +brucite +bruckle +bruckled +bruckleness +bructeri +bruet +bruges +brugh +brughs +brugnatellite +bruyere +bruin +bruins +bruise +bruised +bruiser +bruisers +bruises +bruisewort +bruising +bruisingly +bruit +bruited +bruiter +bruiters +bruiting +bruits +bruja +brujas +brujeria +brujo +brujos +bruke +brule +brulee +brules +brulyie +brulyiement +brulyies +brulot +brulots +brulzie +brulzies +brum +brumaire +brumal +brumalia +brumbee +brumby +brumbie +brumbies +brume +brumes +brummagem +brummagen +brummer +brummy +brumous +brumstane +brumstone +brunch +brunched +brunches +brunching +brune +brunel +brunella +brunellia +brunelliaceae +brunelliaceous +brunet +brunetness +brunets +brunette +brunetteness +brunettes +brunfelsia +brunhild +brunion +brunissure +brunistic +brunizem +brunizems +brunneous +brunnichia +bruno +brunonia +brunoniaceae +brunonian +brunonism +brunswick +brunt +brunts +bruscha +bruscus +brush +brushability +brushable +brushback +brushball +brushbird +brushbush +brushcut +brushed +brusher +brushers +brushes +brushet +brushfire +brushfires +brushful +brushy +brushier +brushiest +brushiness +brushing +brushite +brushland +brushless +brushlessness +brushlet +brushlike +brushmaker +brushmaking +brushman +brushmen +brushoff +brushoffs +brushpopper +brushproof +brushup +brushups +brushwood +brushwork +brusk +brusker +bruskest +bruskly +bruskness +brusque +brusquely +brusqueness +brusquer +brusquerie +brusquest +brussel +brussels +brustle +brustled +brustling +brusure +brut +bruta +brutage +brutal +brutalisation +brutalise +brutalised +brutalising +brutalism +brutalist +brutalitarian +brutalitarianism +brutality +brutalities +brutalization +brutalize +brutalized +brutalizes +brutalizing +brutally +brutalness +brute +bruted +brutedom +brutely +brutelike +bruteness +brutes +brutify +brutification +brutified +brutifies +brutifying +bruting +brutish +brutishly +brutishness +brutism +brutisms +brutter +brutus +bruxism +bruxisms +bruzz +bs +bsf +bsh +bskt +bt +btise +btl +btry +btu +bu +bual +buat +buaze +bub +buba +bubal +bubale +bubales +bubaline +bubalis +bubalises +bubals +bubas +bubastid +bubastite +bubba +bubber +bubby +bubbybush +bubbies +bubble +bubblebow +bubbled +bubbleless +bubblelike +bubblement +bubbler +bubblers +bubbles +bubbletop +bubbletops +bubbly +bubblier +bubblies +bubbliest +bubbliness +bubbling +bubblingly +bubblish +bube +bubinga +bubingas +bubo +buboed +buboes +bubonalgia +bubonic +bubonidae +bubonocele +bubonoceze +bubos +bubs +bubukle +bucayo +bucare +bucca +buccal +buccally +buccan +buccaned +buccaneer +buccaneering +buccaneerish +buccaneers +buccaning +buccanned +buccanning +buccaro +buccate +buccellarius +bucchero +buccheros +buccin +buccina +buccinae +buccinal +buccinator +buccinatory +buccinidae +bucciniform +buccinoid +buccinum +bucco +buccobranchial +buccocervical +buccogingival +buccolabial +buccolingual +bucconasal +bucconidae +bucconinae +buccopharyngeal +buccula +bucculae +bucculatrix +bucellas +bucentaur +bucentur +bucephala +bucephalus +buceros +bucerotes +bucerotidae +bucerotinae +buchanan +buchanite +bucharest +buchite +buchloe +buchmanism +buchmanite +buchnera +buchnerite +buchonite +buchu +buck +buckayro +buckayros +buckaroo +buckaroos +buckass +buckbean +buckbeans +buckberry +buckboard +buckboards +buckbrush +buckbush +bucked +buckeen +buckeens +buckeye +buckeyed +buckeyes +bucker +buckeroo +buckeroos +buckers +bucket +bucketed +bucketeer +bucketer +bucketful +bucketfull +bucketfuls +buckety +bucketing +bucketmaker +bucketmaking +bucketman +buckets +bucketsful +bucketshop +buckhorn +buckhound +buckhounds +bucky +buckie +bucking +buckish +buckishly +buckishness +buckism +buckjump +buckjumper +buckland +bucklandite +buckle +buckled +buckleya +buckleless +buckler +bucklered +bucklering +bucklers +buckles +buckling +bucklum +bucko +buckoes +buckone +buckplate +buckpot +buckra +buckram +buckramed +buckraming +buckrams +buckras +bucks +bucksaw +bucksaws +buckshee +buckshees +buckshot +buckshots +buckskin +buckskinned +buckskins +buckstay +buckstall +buckstone +bucktail +bucktails +buckteeth +buckthorn +bucktooth +bucktoothed +bucku +buckwagon +buckwash +buckwasher +buckwashing +buckwheat +buckwheater +buckwheatlike +buckwheats +bucoliast +bucolic +bucolical +bucolically +bucolicism +bucolics +bucorvinae +bucorvus +bucrane +bucrania +bucranium +bucrnia +bud +buda +budapest +budbreak +buddage +buddah +budded +budder +budders +buddh +buddha +buddhahood +buddhaship +buddhi +buddhic +buddhism +buddhist +buddhistic +buddhistical +buddhists +buddhology +buddy +buddie +buddies +budding +buddle +buddled +buddleia +buddleias +buddleman +buddler +buddles +buddling +bude +budge +budged +budger +budgeree +budgereegah +budgerigah +budgerygah +budgerigar +budgerigars +budgero +budgerow +budgers +budges +budget +budgetary +budgeted +budgeteer +budgeter +budgeters +budgetful +budgeting +budgets +budgy +budgie +budgies +budging +budh +budless +budlet +budlike +budling +budmash +budorcas +buds +budtime +budukha +buduma +budwood +budworm +budzart +budzat +buenas +bueno +buenos +buettneria +buettneriaceae +bufagin +buff +buffa +buffability +buffable +buffalo +buffaloback +buffaloed +buffaloes +buffalofish +buffalofishes +buffaloing +buffalos +buffball +buffbar +buffcoat +buffe +buffed +buffer +buffered +buffering +bufferrer +bufferrers +buffers +buffet +buffeted +buffeter +buffeters +buffeting +buffetings +buffets +buffi +buffy +buffier +buffiest +buffin +buffing +buffle +bufflehead +buffleheaded +bufflehorn +buffo +buffone +buffont +buffoon +buffoonery +buffooneries +buffoonesque +buffoonish +buffoonishness +buffoonism +buffoons +buffos +buffs +buffware +bufidin +bufo +bufonid +bufonidae +bufonite +bufotalin +bufotenin +bufotenine +bufotoxin +bug +bugaboo +bugaboos +bugala +bugan +bugara +bugbane +bugbanes +bugbear +bugbeardom +bugbearish +bugbears +bugbite +bugdom +bugeye +bugeyed +bugeyes +bugfish +buggane +bugged +bugger +buggered +buggery +buggeries +buggering +buggers +buggess +buggy +buggier +buggies +buggiest +buggyman +buggymen +bugginess +bugging +bughead +bughouse +bughouses +bught +bugi +buginese +buginvillaea +bugle +bugled +bugler +buglers +bugles +buglet +bugleweed +buglewort +bugling +bugloss +buglosses +bugology +bugologist +bugong +bugout +bugproof +bugre +bugs +bugseed +bugseeds +bugsha +bugshas +bugweed +bugwort +buhl +buhlbuhl +buhls +buhlwork +buhlworks +buhr +buhrmill +buhrs +buhrstone +buy +buyable +buyback +buybacks +buibui +buick +buicks +buyer +buyers +buyides +buying +build +buildable +builded +builder +builders +building +buildingless +buildings +buildress +builds +buildup +buildups +built +builtin +buyout +buyouts +buirdly +buys +buisson +buist +bukat +bukeyef +bukh +bukidnon +bukshee +bukshi +bul +bulak +bulanda +bulb +bulbaceous +bulbar +bulbed +bulbel +bulbels +bulby +bulbier +bulbiest +bulbiferous +bulbiform +bulbil +bulbilis +bulbilla +bulbils +bulbine +bulbless +bulblet +bulblike +bulbocapnin +bulbocapnine +bulbocavernosus +bulbocavernous +bulbochaete +bulbocodium +bulbomedullary +bulbomembranous +bulbonuclear +bulbophyllum +bulborectal +bulbose +bulbospinal +bulbotuber +bulbourethral +bulbous +bulbously +bulbs +bulbul +bulbule +bulbuls +bulbus +bulchin +bulder +bulgar +bulgari +bulgaria +bulgarian +bulgarians +bulgaric +bulgarophil +bulge +bulged +bulger +bulgers +bulges +bulgy +bulgier +bulgiest +bulginess +bulging +bulgingly +bulgur +bulgurs +bulies +bulimy +bulimia +bulimiac +bulimias +bulimic +bulimiform +bulimoid +bulimulidae +bulimus +bulk +bulkage +bulkages +bulked +bulker +bulkhead +bulkheaded +bulkheading +bulkheads +bulky +bulkier +bulkiest +bulkily +bulkin +bulkiness +bulking +bulkish +bulks +bull +bulla +bullace +bullaces +bullae +bullalaria +bullamacow +bullan +bullary +bullaria +bullaries +bullarium +bullate +bullated +bullation +bullback +bullbaiting +bullbat +bullbats +bullbeggar +bullberry +bullbird +bullboat +bullcart +bullcomber +bulldog +bulldogged +bulldoggedness +bulldogger +bulldoggy +bulldogging +bulldoggish +bulldoggishly +bulldoggishness +bulldogism +bulldogs +bulldoze +bulldozed +bulldozer +bulldozers +bulldozes +bulldozing +bulldust +bulled +buller +bullescene +bullet +bulleted +bullethead +bulletheaded +bulletheadedness +bullety +bulletin +bulletined +bulleting +bulletining +bulletins +bulletless +bulletlike +bulletmaker +bulletmaking +bulletproof +bulletproofed +bulletproofing +bulletproofs +bullets +bulletwood +bullfeast +bullfice +bullfight +bullfighter +bullfighters +bullfighting +bullfights +bullfinch +bullfinches +bullfist +bullflower +bullfoot +bullfrog +bullfrogs +bullgine +bullhead +bullheaded +bullheadedly +bullheadedness +bullheads +bullhide +bullhoof +bullhorn +bullhorns +bully +bullyable +bullyboy +bullyboys +bullidae +bullydom +bullied +bullier +bullies +bulliest +bulliform +bullyhuff +bullying +bullyingly +bullyism +bullimong +bulling +bullion +bullionism +bullionist +bullionless +bullions +bullyrag +bullyragged +bullyragger +bullyragging +bullyrags +bullyrock +bullyrook +bullish +bullishly +bullishness +bullism +bullit +bullition +bulllike +bullneck +bullnecked +bullnecks +bullnose +bullnoses +bullnut +bullock +bullocker +bullocky +bullockite +bullockman +bullocks +bullom +bullose +bullous +bullpates +bullpen +bullpens +bullpoll +bullpout +bullpouts +bullpup +bullragged +bullragging +bullring +bullrings +bullroarer +bullrush +bullrushes +bulls +bullseye +bullshit +bullshits +bullshitted +bullshitting +bullshot +bullshots +bullskin +bullsnake +bullsticker +bullsucker +bullswool +bullterrier +bulltoad +bullule +bullweed +bullweeds +bullwhack +bullwhacker +bullwhip +bullwhipped +bullwhipping +bullwhips +bullwork +bullwort +bulnbuln +bulreedy +bulrush +bulrushes +bulrushy +bulrushlike +bulse +bult +bultey +bultell +bulten +bulter +bultong +bultow +bulwand +bulwark +bulwarked +bulwarking +bulwarks +bum +bumaloe +bumaree +bumbailiff +bumbailiffship +bumbard +bumbarge +bumbass +bumbaste +bumbaze +bumbee +bumbelo +bumbershoot +bumble +bumblebee +bumblebeefish +bumblebeefishes +bumblebees +bumbleberry +bumblebomb +bumbled +bumbledom +bumblefoot +bumblekite +bumblepuppy +bumbler +bumblers +bumbles +bumbling +bumblingly +bumblingness +bumblings +bumbo +bumboat +bumboatman +bumboatmen +bumboats +bumboatwoman +bumclock +bumelia +bumf +bumfeg +bumfs +bumfuzzle +bumicky +bumkin +bumkins +bummack +bummalo +bummalos +bummaree +bummed +bummel +bummer +bummery +bummerish +bummers +bummest +bummie +bummil +bumming +bummle +bummler +bummock +bump +bumped +bumpee +bumper +bumpered +bumperette +bumpering +bumpers +bumph +bumpy +bumpier +bumpiest +bumpily +bumpiness +bumping +bumpingly +bumpity +bumpkin +bumpkinet +bumpkinish +bumpkinly +bumpkins +bumpoff +bumpology +bumps +bumpsy +bumptious +bumptiously +bumptiousness +bums +bumsucking +bumtrap +bumwood +bun +buna +buncal +bunce +bunch +bunchbacked +bunchberry +bunchberries +bunched +buncher +bunches +bunchflower +bunchy +bunchier +bunchiest +bunchily +bunchiness +bunching +bunco +buncoed +buncoing +buncombe +buncombes +buncos +bund +bunda +bundahish +bundeli +bunder +bundestag +bundh +bundy +bundies +bundist +bundists +bundle +bundled +bundler +bundlerooted +bundlers +bundles +bundlet +bundling +bundlings +bundobust +bundoc +bundocks +bundook +bunds +bundt +bundts +bundu +bundweed +bunemost +bung +bunga +bungaloid +bungalow +bungalows +bungarum +bungarus +bunged +bungee +bungey +bunger +bungerly +bungfu +bungfull +bunghole +bungholes +bungy +bunging +bungle +bungled +bungler +bunglers +bungles +bunglesome +bungling +bunglingly +bunglings +bungmaker +bungo +bungos +bungs +bungstarter +bungtown +bungwall +bunya +bunyah +bunyan +bunyas +bunyip +buninahua +bunion +bunions +bunyoro +bunjara +bunk +bunked +bunker +bunkerage +bunkered +bunkery +bunkering +bunkerman +bunkermen +bunkers +bunkhouse +bunkhouses +bunkie +bunking +bunkload +bunkmate +bunkmates +bunko +bunkoed +bunkoing +bunkos +bunks +bunkum +bunkums +bunn +bunnell +bunny +bunnia +bunnies +bunnymouth +bunning +bunns +bunodont +bunodonta +bunolophodont +bunomastodontidae +bunoselenodont +bunraku +bunrakus +buns +bunsen +bunsenite +bunt +buntal +bunted +bunter +bunters +bunty +buntine +bunting +buntings +buntline +buntlines +bunton +bunts +bunuelo +buoy +buoyage +buoyages +buoyance +buoyances +buoyancy +buoyancies +buoyant +buoyantly +buoyantness +buoyed +buoying +buoys +buonamani +buonamano +buphaga +buphthalmia +buphthalmic +buphthalmos +buphthalmum +bupleurol +bupleurum +buplever +buprestid +buprestidae +buprestidan +buprestis +buqsha +buqshas +bur +bura +buran +burans +burao +buras +burbank +burbankian +burbankism +burbark +burberry +burble +burbled +burbler +burblers +burbles +burbly +burblier +burbliest +burbling +burbolt +burbot +burbots +burbs +burbush +burd +burdalone +burdash +burden +burdenable +burdened +burdener +burdeners +burdening +burdenless +burdenous +burdens +burdensome +burdensomely +burdensomeness +burdie +burdies +burdigalian +burdock +burdocks +burdon +burds +bure +bureau +bureaucracy +bureaucracies +bureaucrat +bureaucratese +bureaucratic +bureaucratical +bureaucratically +bureaucratism +bureaucratist +bureaucratization +bureaucratize +bureaucratized +bureaucratizes +bureaucratizing +bureaucrats +bureaus +bureaux +burel +burelage +burele +burely +burelle +burelly +buret +burets +burette +burettes +burez +burfish +burg +burga +burgage +burgages +burgality +burgall +burgamot +burganet +burgau +burgaudine +burge +burgee +burgees +burgensic +burgeon +burgeoned +burgeoning +burgeons +burger +burgers +burgess +burgessdom +burgesses +burggrave +burgh +burghal +burghalpenny +burghbote +burghemot +burgher +burgherage +burgherdom +burgheress +burgherhood +burgheristh +burghermaster +burghers +burghership +burghmaster +burghmoot +burghmote +burghs +burglar +burglary +burglaries +burglarious +burglariously +burglarise +burglarised +burglarising +burglarize +burglarized +burglarizes +burglarizing +burglarproof +burglarproofed +burglarproofing +burglarproofs +burglars +burgle +burgled +burgles +burgling +burgoyne +burgomaster +burgomasters +burgomastership +burgonet +burgonets +burgoo +burgoos +burgout +burgouts +burgrave +burgraves +burgraviate +burgs +burgul +burgullian +burgundy +burgundian +burgundies +burgus +burgware +burgwere +burh +burhead +burhel +burhinidae +burhinus +burhmoot +buri +bury +buriable +burial +burials +burian +buriat +buried +buriels +burier +buriers +buries +burying +burin +burinist +burins +burion +burys +buriti +burk +burka +burke +burked +burkei +burker +burkers +burkes +burkha +burking +burkite +burkites +burkundauze +burkundaz +burl +burlace +burladero +burlap +burlaps +burlecue +burled +burley +burleycue +burleys +burler +burlers +burlesk +burlesks +burlesque +burlesqued +burlesquely +burlesquer +burlesques +burlesquing +burlet +burletta +burly +burlier +burlies +burliest +burlily +burliness +burling +burlington +burls +burma +burman +burmannia +burmanniaceae +burmanniaceous +burmese +burmite +burn +burnable +burnbeat +burned +burner +burners +burnet +burnetize +burnets +burnettize +burnettized +burnettizing +burnewin +burnfire +burny +burnie +burniebee +burnies +burning +burningly +burnings +burnish +burnishable +burnished +burnisher +burnishers +burnishes +burnishing +burnishment +burnoose +burnoosed +burnooses +burnous +burnoused +burnouses +burnout +burnouts +burnover +burns +burnsian +burnside +burnsides +burnt +burntly +burntness +burntweed +burnup +burnut +burnweed +burnwood +buro +buroo +burp +burped +burping +burps +burr +burrah +burratine +burrawang +burrbark +burred +burree +burrel +burrer +burrers +burrfish +burrfishes +burrgrailer +burrhead +burrheaded +burrheadedness +burrhel +burry +burrier +burriest +burring +burrio +burrish +burrito +burritos +burrknot +burro +burrobrush +burrock +burros +burroughs +burrow +burrowed +burroweed +burrower +burrowers +burrowing +burrows +burrowstown +burrs +burrstone +burs +bursa +bursae +bursal +bursar +bursary +bursarial +bursaries +bursars +bursarship +bursas +bursate +bursati +bursattee +bursautee +bursch +burse +bursectomy +burseed +burseeds +bursera +burseraceae +burseraceous +burses +bursicle +bursiculate +bursiform +bursitis +bursitises +bursitos +burst +bursted +burster +bursters +bursty +burstiness +bursting +burstone +burstones +bursts +burstwort +bursula +burt +burthen +burthened +burthening +burthenman +burthens +burthensome +burton +burtonization +burtonize +burtons +burtree +burucha +burundi +burundians +burushaski +burut +burweed +burweeds +bus +busaos +busbar +busbars +busby +busbies +busboy +busboys +buscarl +buscarle +bused +busera +buses +bush +bushbaby +bushbashing +bushbeater +bushbeck +bushbody +bushbodies +bushboy +bushbuck +bushbucks +bushcraft +bushed +bushel +bushelage +bushelbasket +busheled +busheler +bushelers +bushelful +bushelfuls +busheling +bushelled +busheller +bushelling +bushelman +bushelmen +bushels +bushelwoman +busher +bushers +bushes +bushet +bushfighter +bushfighting +bushfire +bushfires +bushful +bushgoat +bushgoats +bushgrass +bushhammer +bushi +bushy +bushido +bushidos +bushie +bushier +bushiest +bushily +bushiness +bushing +bushings +bushland +bushlands +bushless +bushlet +bushlike +bushmaker +bushmaking +bushman +bushmanship +bushmaster +bushmasters +bushmen +bushment +bushongo +bushpig +bushranger +bushranging +bushrope +bushtit +bushtits +bushveld +bushwa +bushwack +bushwah +bushwahs +bushwalking +bushwas +bushwhack +bushwhacked +bushwhacker +bushwhackers +bushwhacking +bushwhacks +bushwife +bushwoman +bushwood +busy +busybody +busybodied +busybodies +busybodyish +busybodyism +busybodyness +busycon +busied +busier +busies +busiest +busyhead +busying +busyish +busily +busine +business +busyness +businesses +busynesses +businessese +businesslike +businesslikeness +businessman +businessmen +businesswoman +businesswomen +busing +busings +busywork +busyworks +busk +busked +busker +buskers +busket +busky +buskin +buskined +busking +buskins +buskle +busks +busload +busman +busmen +buss +bussed +busser +busses +bussy +bussing +bussings +bussock +bussu +bust +bustard +bustards +busted +bustee +buster +busters +busthead +busti +busty +bustian +bustic +busticate +bustics +bustier +bustiest +busting +bustle +bustled +bustler +bustlers +bustles +bustling +bustlingly +busto +busts +busulfan +busulfans +busuuti +busway +but +butacaine +butadiene +butadiyne +butanal +butane +butanes +butanoic +butanol +butanolid +butanolide +butanols +butanone +butanones +butat +butch +butcha +butcher +butcherbird +butcherbroom +butcherdom +butchered +butcherer +butcheress +butchery +butcheries +butchering +butcherless +butcherly +butcherliness +butcherous +butchers +butches +bute +butea +butein +butene +butenes +butenyl +buteo +buteonine +buteos +butic +butyl +butylamine +butylate +butylated +butylates +butylating +butylation +butylene +butylenes +butylic +butyls +butin +butyn +butine +butyne +butyr +butyraceous +butyral +butyraldehyde +butyrals +butyrate +butyrates +butyric +butyrically +butyryl +butyryls +butyrin +butyrinase +butyrins +butyrochloral +butyrolactone +butyrometer +butyrometric +butyrone +butyrous +butyrousness +butle +butled +butler +butlerage +butlerdom +butleress +butlery +butleries +butlerism +butlerlike +butlers +butlership +butles +butling +butment +butolism +butomaceae +butomaceous +butomus +butoxy +butoxyl +buts +butsu +butsudan +butt +buttal +buttals +butte +butted +butter +butteraceous +butterback +butterball +butterbill +butterbird +butterbough +butterbox +butterbump +butterbur +butterburr +butterbush +buttercup +buttercups +buttered +butterer +butterers +butterfat +butterfingered +butterfingers +butterfish +butterfishes +butterfly +butterflied +butterflyer +butterflies +butterflyfish +butterflyfishes +butterflying +butterflylike +butterflower +butterhead +buttery +butterier +butteries +butteriest +butteryfingered +butterine +butteriness +buttering +butteris +butterjags +butterless +butterlike +buttermaker +buttermaking +butterman +buttermilk +buttermonger +buttermouth +butternose +butternut +butternuts +butterpaste +butterroot +butters +butterscotch +butterweed +butterwife +butterwoman +butterworker +butterwort +butterwright +buttes +buttgenbachite +butty +butties +buttyman +butting +buttinski +buttinsky +buttinskies +buttle +buttled +buttling +buttock +buttocked +buttocker +buttocks +button +buttonball +buttonbur +buttonbush +buttoned +buttoner +buttoners +buttonhold +buttonholder +buttonhole +buttonholed +buttonholer +buttonholes +buttonholing +buttonhook +buttony +buttoning +buttonless +buttonlike +buttonmold +buttonmould +buttons +buttonweed +buttonwood +buttress +buttressed +buttresses +buttressing +buttressless +buttresslike +butts +buttstock +buttstrap +buttstrapped +buttstrapping +buttwoman +buttwomen +buttwood +butut +bututs +buvette +buxaceae +buxaceous +buxbaumia +buxbaumiaceae +buxeous +buxerry +buxerries +buxine +buxom +buxomer +buxomest +buxomly +buxomness +buxus +buz +buzane +buzylene +buzuki +buzukia +buzukis +buzz +buzzard +buzzardly +buzzardlike +buzzards +buzzbomb +buzzed +buzzer +buzzerphone +buzzers +buzzes +buzzgloak +buzzy +buzzier +buzzies +buzziest +buzzing +buzzingly +buzzle +buzzsaw +buzzwig +buzzwigs +buzzword +buzzwords +bv +bvt +bwana +bwanas +bx +bxs +bz +c +ca +caaba +caam +caama +caaming +caapeba +caatinga +cab +caba +cabaa +cabaan +caback +cabaho +cabal +cabala +cabalas +cabalassou +cabaletta +cabalic +cabalism +cabalisms +cabalist +cabalistic +cabalistical +cabalistically +cabalists +caball +caballed +caballer +caballeria +caballero +caballeros +caballine +caballing +caballo +caballos +cabals +caban +cabana +cabanas +cabane +cabaret +cabaretier +cabarets +cabas +cabasa +cabasset +cabassou +cabbage +cabbaged +cabbagehead +cabbageheaded +cabbageheadedness +cabbagelike +cabbages +cabbagetown +cabbagewood +cabbageworm +cabbagy +cabbaging +cabbala +cabbalah +cabbalahs +cabbalas +cabbalism +cabbalist +cabbalistic +cabbalistical +cabbalistically +cabbalize +cabbed +cabber +cabby +cabbie +cabbies +cabbing +cabble +cabbled +cabbler +cabbling +cabda +cabdriver +cabdriving +cabecera +cabecudo +cabeliau +cabellerote +caber +cabernet +cabernets +cabers +cabestro +cabestros +cabezon +cabezone +cabezones +cabezons +cabful +cabiai +cabildo +cabildos +cabilliau +cabin +cabinda +cabined +cabinet +cabineted +cabineting +cabinetmake +cabinetmaker +cabinetmakers +cabinetmaking +cabinetry +cabinets +cabinetted +cabinetwork +cabinetworker +cabinetworking +cabining +cabinlike +cabins +cabio +cabirean +cabiri +cabiria +cabirian +cabiric +cabiritic +cable +cablecast +cabled +cablegram +cablegrams +cablelaid +cableless +cablelike +cableman +cablemen +cabler +cables +cablese +cablet +cablets +cableway +cableways +cabling +cablish +cabman +cabmen +cabob +cabobs +caboceer +caboche +caboched +cabochon +cabochons +cabocle +caboclo +caboclos +cabomba +cabombaceae +cabombas +caboodle +caboodles +cabook +caboose +cabooses +caboshed +cabossed +cabot +cabotage +cabotages +cabotin +cabotinage +cabots +cabouca +cabre +cabree +cabrerite +cabresta +cabrestas +cabresto +cabrestos +cabret +cabretta +cabrettas +cabreuva +cabrie +cabrilla +cabrillas +cabriole +cabrioles +cabriolet +cabriolets +cabrit +cabrito +cabs +cabstand +cabstands +cabuya +cabuyas +cabuja +cabulla +cabureiba +caburn +caca +cacaesthesia +cacafuego +cacafugo +cacajao +cacalia +cacam +cacan +cacana +cacanapa +cacanthrax +cacao +cacaos +cacara +cacas +cacatua +cacatuidae +cacatuinae +cacaxte +caccabis +caccagogue +caccia +caccias +cacciatora +cacciatore +cace +cacei +cacemphaton +cacesthesia +cacesthesis +cachaca +cachaemia +cachaemic +cachalot +cachalote +cachalots +cachaza +cache +cachectic +cachectical +cached +cachemia +cachemic +cachepot +cachepots +caches +cachespell +cachet +cacheted +cachetic +cacheting +cachets +cachexy +cachexia +cachexias +cachexic +cachexies +cachibou +cachila +cachimailla +cachina +cachinate +caching +cachinnate +cachinnated +cachinnating +cachinnation +cachinnator +cachinnatory +cachoeira +cacholong +cachot +cachou +cachous +cachrys +cachua +cachucha +cachuchas +cachucho +cachunde +caci +cacicus +cacidrosis +cacimbo +cacimbos +caciocavallo +cacique +caciques +caciqueship +caciquism +cack +cacked +cackerel +cacking +cackle +cackled +cackler +cacklers +cackles +cackling +cacks +cacochylia +cacochymy +cacochymia +cacochymic +cacochymical +cacocholia +cacochroia +cacocnemia +cacodaemon +cacodaemoniac +cacodaemonial +cacodaemonic +cacodemon +cacodemonia +cacodemoniac +cacodemonial +cacodemonic +cacodemonize +cacodemonomania +cacodyl +cacodylate +cacodylic +cacodyls +cacodontia +cacodorous +cacodoxy +cacodoxian +cacodoxical +cacoeconomy +cacoenthes +cacoepy +cacoepist +cacoepistic +cacoethes +cacoethic +cacogalactia +cacogastric +cacogenesis +cacogenic +cacogenics +cacogeusia +cacoglossia +cacographer +cacography +cacographic +cacographical +cacolet +cacolike +cacology +cacological +cacomagician +cacomelia +cacomistle +cacomixl +cacomixle +cacomixls +cacomorphia +cacomorphosis +caconychia +caconym +caconymic +cacoon +cacopathy +cacopharyngia +cacophony +cacophonia +cacophonic +cacophonical +cacophonically +cacophonies +cacophonist +cacophonists +cacophonize +cacophonous +cacophonously +cacophthalmia +cacoplasia +cacoplastic +cacoproctia +cacorhythmic +cacorrhachis +cacorrhinia +cacosmia +cacospermia +cacosplanchnia +cacostomia +cacothansia +cacothelin +cacotheline +cacothes +cacothesis +cacothymia +cacotype +cacotopia +cacotrichia +cacotrophy +cacotrophia +cacotrophic +cacoxene +cacoxenite +cacozeal +cacozealous +cacozyme +cacqueteuse +cacqueteuses +cactaceae +cactaceous +cactal +cactales +cacti +cactiform +cactoid +cactus +cactuses +cactuslike +cacumen +cacuminal +cacuminate +cacumination +cacuminous +cacur +cad +cadalene +cadamba +cadaster +cadasters +cadastral +cadastrally +cadastration +cadastre +cadastres +cadaver +cadaveric +cadaverin +cadaverine +cadaverize +cadaverous +cadaverously +cadaverousness +cadavers +cadbait +cadbit +cadbote +cadded +caddesse +caddy +caddice +caddiced +caddicefly +caddices +caddie +caddied +caddies +caddiing +caddying +cadding +caddis +caddised +caddises +caddisfly +caddisflies +caddish +caddishly +caddishness +caddisworm +caddle +caddo +caddoan +caddow +cade +cadeau +cadee +cadelle +cadelles +cadence +cadenced +cadences +cadency +cadencies +cadencing +cadenette +cadent +cadential +cadenza +cadenzas +cader +caderas +cadere +cades +cadesse +cadet +cadetcy +cadets +cadetship +cadette +cadettes +cadew +cadge +cadged +cadger +cadgers +cadges +cadgy +cadgily +cadginess +cadging +cadi +cady +cadie +cadying +cadilesker +cadillac +cadillacs +cadillo +cadinene +cadis +cadish +cadism +cadiueio +cadjan +cadlock +cadmean +cadmia +cadmic +cadmide +cadmiferous +cadmium +cadmiumize +cadmiums +cadmopone +cadmus +cados +cadouk +cadrans +cadre +cadres +cads +cadua +caduac +caduca +caducary +caducean +caducecaducean +caducecei +caducei +caduceus +caduciary +caduciaries +caducibranch +caducibranchiata +caducibranchiate +caducicorn +caducity +caducities +caducous +caduke +cadus +cadwal +cadwallader +cadweed +cadwell +caeca +caecal +caecally +caecectomy +caecias +caeciform +caecilia +caeciliae +caecilian +caeciliidae +caecity +caecitis +caecocolic +caecostomy +caecotomy +caecum +caedmonian +caedmonic +caelian +caelometer +caelum +caelus +caenogaea +caenogaean +caenogenesis +caenogenetic +caenogenetically +caenolestes +caenostyly +caenostylic +caenozoic +caeoma +caeomas +caeremoniarius +caerphilly +caesalpinia +caesalpiniaceae +caesalpiniaceous +caesar +caesardom +caesarean +caesareanize +caesareans +caesarian +caesarism +caesarist +caesarists +caesarize +caesaropapacy +caesaropapism +caesaropapist +caesaropopism +caesarotomy +caesarship +caesious +caesium +caesiums +caespitose +caespitosely +caestus +caestuses +caesura +caesurae +caesural +caesuras +caesuric +caf +cafard +cafardise +cafe +cafeneh +cafenet +cafes +cafetal +cafeteria +cafeterias +cafetiere +cafetorium +caff +caffa +caffeate +caffeic +caffein +caffeina +caffeine +caffeines +caffeinic +caffeinism +caffeins +caffeism +caffeol +caffeone +caffetannic +caffetannin +caffiaceous +caffiso +caffle +caffled +caffling +caffoy +caffoline +caffre +cafh +cafila +cafiz +cafoy +caftan +caftaned +caftans +cafuso +cag +cagayan +cagayans +cage +caged +cageful +cagefuls +cagey +cageyness +cageless +cagelike +cageling +cagelings +cageman +cageot +cager +cagers +cages +cagester +cagework +caggy +cagy +cagier +cagiest +cagily +caginess +caginesses +caging +cagit +cagmag +cagn +cagot +cagoule +cagui +cahenslyism +cahier +cahiers +cahill +cahincic +cahita +cahiz +cahnite +cahokia +cahoot +cahoots +cahot +cahow +cahows +cahuapana +cahuy +cahuilla +cahuita +cai +cay +cayapa +cayapo +caiarara +caic +caickle +caid +caids +cayenne +cayenned +cayennes +cailcedra +cayleyan +caille +cailleach +cailliach +caimacam +caimakam +caiman +cayman +caimans +caymans +caimitillo +caimito +cain +caynard +caingang +caingin +caingua +cainian +cainish +cainism +cainite +cainitic +cainogenesis +cainozoic +cains +cayos +caique +caiquejee +caiques +cair +cairba +caird +cairds +cairene +cairn +cairned +cairngorm +cairngorum +cairny +cairns +cairo +cays +caisse +caisson +caissoned +caissons +caitanyas +caite +caitif +caitiff +caitiffs +caitifty +cayubaba +cayubaban +cayuca +cayuco +cayuga +cayugan +cayugas +cayuse +cayuses +cayuvava +caixinha +cajan +cajang +cajanus +cajaput +cajaputs +cajava +cajeput +cajeputol +cajeputole +cajeputs +cajeta +cajole +cajoled +cajolement +cajolements +cajoler +cajolery +cajoleries +cajolers +cajoles +cajoling +cajolingly +cajon +cajones +cajou +cajuela +cajun +cajuns +cajuput +cajuputene +cajuputol +cajuputs +cakavci +cakchikel +cake +cakebox +cakebread +caked +cakehouse +cakey +cakemaker +cakemaking +caker +cakes +cakette +cakewalk +cakewalked +cakewalker +cakewalking +cakewalks +caky +cakier +cakiest +cakile +caking +cakra +cakravartin +cal +calaba +calabar +calabari +calabash +calabashes +calabaza +calabazilla +calaber +calaboose +calabooses +calabozo +calabrasella +calabrese +calabrian +calabrians +calabur +calade +caladium +caladiums +calahan +calais +calaite +calalu +calamagrostis +calamanco +calamancoes +calamancos +calamander +calamansi +calamar +calamary +calamariaceae +calamariaceous +calamariales +calamarian +calamaries +calamarioid +calamarmar +calamaroid +calamars +calambac +calambour +calami +calamiferious +calamiferous +calamiform +calaminary +calaminaris +calamine +calamined +calamines +calamining +calamint +calamintha +calamints +calamistral +calamistrate +calamistrum +calamite +calamitean +calamites +calamity +calamities +calamitoid +calamitous +calamitously +calamitousness +calamodendron +calamondin +calamopitys +calamospermae +calamostachys +calamumi +calamus +calander +calando +calandra +calandre +calandria +calandridae +calandrinae +calandrinia +calangay +calanid +calanque +calantas +calanthe +calapite +calapitte +calappa +calappidae +calas +calascione +calash +calashes +calastic +calathea +calathi +calathian +calathidia +calathidium +calathiform +calathisci +calathiscus +calathos +calaththi +calathus +calatrava +calavance +calaverite +calbroben +calc +calcaemia +calcaire +calcanea +calcaneal +calcanean +calcanei +calcaneoastragalar +calcaneoastragaloid +calcaneocuboid +calcaneofibular +calcaneonavicular +calcaneoplantar +calcaneoscaphoid +calcaneotibial +calcaneum +calcaneus +calcannea +calcannei +calcar +calcarate +calcarated +calcarea +calcareoargillaceous +calcareobituminous +calcareocorneous +calcareosiliceous +calcareosulphurous +calcareous +calcareously +calcareousness +calcaria +calcariferous +calcariform +calcarine +calcarium +calcars +calcate +calcavella +calceate +calced +calcedon +calcedony +calceiform +calcemia +calceolaria +calceolate +calceolately +calces +calceus +calchaqui +calchaquian +calchas +calche +calci +calcic +calciclase +calcicole +calcicolous +calcicosis +calcydon +calciferol +calciferous +calcify +calcific +calcification +calcified +calcifies +calcifying +calciform +calcifugal +calcifuge +calcifugous +calcigenous +calcigerous +calcimeter +calcimine +calcimined +calciminer +calcimines +calcimining +calcinable +calcinate +calcination +calcinator +calcinatory +calcine +calcined +calciner +calcines +calcining +calcinize +calcino +calcinosis +calciobiotite +calciocarnotite +calcioferrite +calcioscheelite +calciovolborthite +calcipexy +calciphylactic +calciphylactically +calciphylaxis +calciphile +calciphilia +calciphilic +calciphilous +calciphyre +calciphobe +calciphobic +calciphobous +calciprivic +calcisponge +calcispongiae +calcite +calcites +calcitestaceous +calcitic +calcitonin +calcitrant +calcitrate +calcitration +calcitreation +calcium +calciums +calcivorous +calcographer +calcography +calcographic +calcomp +calcrete +calcsinter +calcspar +calcspars +calctufa +calctufas +calctuff +calctuffs +calculability +calculabilities +calculable +calculableness +calculably +calculagraph +calcular +calculary +calculate +calculated +calculatedly +calculatedness +calculates +calculating +calculatingly +calculation +calculational +calculations +calculative +calculator +calculatory +calculators +calculer +calculi +calculiform +calculifrage +calculist +calculous +calculus +calculuses +calcutta +caldadaria +caldaria +caldarium +calden +caldera +calderas +calderium +calderon +caldron +caldrons +calean +caleb +calebite +calebites +caleche +caleches +caledonia +caledonian +caledonite +calef +calefacient +calefaction +calefactive +calefactor +calefactory +calefactories +calefy +calelectric +calelectrical +calelectricity +calembour +calemes +calenda +calendal +calendar +calendared +calendarer +calendarial +calendarian +calendaric +calendaring +calendarist +calendars +calendas +calender +calendered +calenderer +calendering +calenders +calendry +calendric +calendrical +calends +calendula +calendulas +calendulin +calentural +calenture +calentured +calenturing +calenturish +calenturist +calepin +calesa +calesas +calescence +calescent +calesero +calesin +calf +calfbound +calfdozer +calfhood +calfish +calfkill +calfless +calflike +calfling +calfret +calfs +calfskin +calfskins +calgary +calgon +caliban +calibanism +caliber +calibered +calibers +calybite +calibogus +calibrate +calibrated +calibrater +calibrates +calibrating +calibration +calibrations +calibrator +calibrators +calibre +calibred +calibres +caliburn +caliburno +calic +calycanth +calycanthaceae +calycanthaceous +calycanthemy +calycanthemous +calycanthin +calycanthine +calycanthus +calicate +calycate +calyceal +calyceraceae +calyceraceous +calices +calyces +caliche +caliches +calyciferous +calycifloral +calyciflorate +calyciflorous +caliciform +calyciform +calycinal +calycine +calicle +calycle +calycled +calicles +calycles +calycli +calico +calicoback +calycocarpum +calicoed +calicoes +calycoid +calycoideous +calycophora +calycophorae +calycophoran +calicos +calycozoa +calycozoan +calycozoic +calycozoon +calicular +calycular +caliculate +calyculate +calyculated +calycule +caliculi +calyculi +caliculus +calyculus +calicut +calid +calidity +calydon +calydonian +caliduct +calif +califate +califates +california +californian +californiana +californians +californicus +californite +californium +califs +caliga +caligate +caligated +caligation +caliginosity +caliginous +caliginously +caliginousness +caligo +caligrapher +caligraphy +caligulism +calili +calimanco +calimancos +calymene +calimeris +calymma +calin +calina +calinago +calinda +calindas +caline +calinut +caliology +caliological +caliologist +calyon +calipash +calipashes +calipee +calipees +caliper +calipered +caliperer +calipering +calipers +calipeva +caliph +caliphal +caliphate +caliphates +calyphyomy +caliphs +caliphship +calippic +calypsist +calypso +calypsoes +calypsonian +calypsos +calypter +calypterae +calypters +calyptoblastea +calyptoblastic +calyptorhynchus +calyptra +calyptraea +calyptranthes +calyptras +calyptrata +calyptratae +calyptrate +calyptriform +calyptrimorphous +calyptro +calyptrogen +calyptrogyne +calisaya +calisayas +calista +calystegia +calistheneum +calisthenic +calisthenical +calisthenics +calite +caliver +calix +calyx +calyxes +calixtin +calixtus +calk +calkage +calked +calker +calkers +calkin +calking +calkins +calks +call +calla +callable +callaesthetic +callainite +callais +callaloo +callaloos +callan +callans +callant +callants +callas +callat +callate +callback +callbacks +callboy +callboys +called +caller +callers +calles +callet +callets +calli +callianassa +callianassidae +calliandra +callicarpa +callicebus +callid +callidity +callidness +calligram +calligraph +calligrapha +calligrapher +calligraphers +calligraphy +calligraphic +calligraphical +calligraphically +calligraphist +calling +callings +callynteria +callionymidae +callionymus +calliope +calliopean +calliopes +calliophone +calliopsis +callipash +callipee +callipees +calliper +callipered +calliperer +callipering +callipers +calliphora +calliphorid +calliphoridae +calliphorine +callipygian +callipygous +callippic +callirrhoe +callisaurus +callisection +callisteia +callistemon +callistephus +callisthenic +callisthenics +callisto +callithrix +callithump +callithumpian +callitype +callityped +callityping +callitrichaceae +callitrichaceous +callitriche +callitrichidae +callitris +callo +calloo +callop +callorhynchidae +callorhynchus +callosal +callose +calloses +callosity +callosities +callosomarginal +callosum +callot +callous +calloused +callouses +callousing +callously +callousness +callout +callovian +callow +callower +callowest +callowman +callowness +calls +callum +calluna +callus +callused +calluses +callusing +calm +calmant +calmative +calmato +calmecac +calmed +calmer +calmest +calmy +calmier +calmierer +calmiest +calming +calmingly +calmly +calmness +calmnesses +calms +calocarpum +calochortaceae +calochortus +calodaemon +calodemon +calodemonial +calogram +calography +caloyer +caloyers +calomba +calombigas +calombo +calomel +calomels +calomorphic +calonectria +calonyction +calool +calophyllum +calopogon +calor +caloreceptor +calorescence +calorescent +calory +caloric +calorically +caloricity +calorics +caloriduct +calorie +calories +calorifacient +calorify +calorific +calorifical +calorifically +calorification +calorifics +calorifier +calorigenic +calorimeter +calorimeters +calorimetry +calorimetric +calorimetrical +calorimetrically +calorimotor +caloris +calorisator +calorist +calorite +calorize +calorized +calorizer +calorizes +calorizing +calosoma +calotermes +calotermitid +calotermitidae +calothrix +calotin +calotype +calotypic +calotypist +calotte +calottes +calp +calpac +calpack +calpacked +calpacks +calpacs +calpolli +calpul +calpulli +calque +calqued +calques +calquing +cals +calsouns +caltha +calthrop +calthrops +caltrap +caltraps +caltrop +caltrops +calumba +calumet +calumets +calumny +calumnia +calumniate +calumniated +calumniates +calumniating +calumniation +calumniations +calumniative +calumniator +calumniatory +calumniators +calumnies +calumnious +calumniously +calumniousness +caluptra +calusa +calusar +calutron +calutrons +calvados +calvadoses +calvaire +calvary +calvaria +calvarial +calvarias +calvaries +calvarium +calvatia +calve +calved +calver +calves +calvin +calving +calvinian +calvinism +calvinist +calvinistic +calvinistical +calvinistically +calvinists +calvinize +calvish +calvity +calvities +calvous +calvus +calx +calxes +calzada +calzone +calzoneras +calzones +calzoons +cam +camaca +camacan +camacey +camachile +camagon +camay +camaieu +camail +camaile +camailed +camails +camaka +camaldolensian +camaldolese +camaldolesian +camaldolite +camaldule +camaldulian +camalig +camalote +caman +camanay +camanchaca +camansi +camara +camarada +camarade +camaraderie +camarasaurus +camarera +camarilla +camarillas +camarin +camarine +camaron +camas +camases +camass +camasses +camassia +camata +camatina +camauro +camauros +camaxtli +camb +cambaye +camball +cambalo +cambarus +camber +cambered +cambering +cambers +cambeva +cambia +cambial +cambiata +cambibia +cambiform +cambio +cambiogenetic +cambion +cambism +cambisms +cambist +cambistry +cambists +cambium +cambiums +cambyuskan +camblet +cambodia +cambodian +cambodians +camboge +cambogia +cambogias +camboose +cambouis +cambrel +cambresine +cambrian +cambric +cambricleaf +cambrics +cambridge +cambuca +cambuscan +camden +came +cameist +camel +camelback +cameleer +cameleers +cameleon +camelhair +camelia +camelias +camelid +camelidae +camelina +cameline +camelion +camelish +camelishness +camelkeeper +camellia +camelliaceae +camellias +camellike +camellin +camellus +camelman +cameloid +cameloidea +camelopard +camelopardalis +camelopardel +camelopardid +camelopardidae +camelopards +camelopardus +camelot +camelry +camels +camelus +camembert +camenae +camenes +cameo +cameoed +cameograph +cameography +cameoing +cameos +camera +camerae +cameral +cameralism +cameralist +cameralistic +cameralistics +cameraman +cameramen +cameras +camerata +camerate +camerated +cameration +camerawork +camery +camerier +cameriera +camerieri +camerina +camerine +camerinidae +camerist +camerlengo +camerlengos +camerlingo +camerlingos +cameronian +cameronians +cameroon +cameroonian +cameroonians +cames +camestres +camias +camiknickers +camilla +camillus +camino +camion +camions +camis +camisa +camisade +camisades +camisado +camisadoes +camisados +camisard +camisas +camiscia +camise +camises +camisia +camisias +camisole +camisoles +camister +camize +camla +camlet +camleted +camleteen +camletine +camleting +camlets +camletted +camletting +cammarum +cammas +cammed +cammock +cammocky +camoca +camogie +camois +camomile +camomiles +camooch +camoodi +camoodie +camorra +camorras +camorrism +camorrist +camorrista +camorristi +camote +camoudie +camouflage +camouflageable +camouflaged +camouflager +camouflagers +camouflages +camouflagic +camouflaging +camouflet +camoufleur +camoufleurs +camp +campa +campagi +campagna +campagne +campagnol +campagnols +campagus +campaign +campaigned +campaigner +campaigners +campaigning +campaigns +campal +campana +campane +campanella +campanero +campania +campanian +campaniform +campanile +campaniles +campanili +campaniliform +campanilla +campanini +campanist +campanistic +campanologer +campanology +campanological +campanologically +campanologist +campanologists +campanula +campanulaceae +campanulaceous +campanulales +campanular +campanularia +campanulariae +campanularian +campanularidae +campanulatae +campanulate +campanulated +campanulous +campaspe +campbell +campbellism +campbellisms +campbellite +campbellites +campcraft +campe +campeche +camped +campement +campephagidae +campephagine +campephilus +camper +campers +campership +campesino +campesinos +campestral +campestrian +campfight +campfire +campfires +campground +campgrounds +camphane +camphanic +camphanyl +camphanone +camphene +camphenes +camphylene +camphine +camphines +camphire +camphires +campho +camphocarboxylic +camphoid +camphol +campholic +campholide +campholytic +camphols +camphor +camphoraceous +camphorate +camphorated +camphorates +camphorating +camphory +camphoric +camphoryl +camphorize +camphoroyl +camphorone +camphoronic +camphorphorone +camphors +camphorweed +camphorwood +campi +campy +campier +campiest +campignian +campilan +campily +campylite +campylodrome +campylometer +campyloneuron +campylospermous +campylotropal +campylotropous +campimeter +campimetry +campimetrical +campine +campiness +camping +campings +campion +campions +campit +cample +campman +campmaster +campo +campodea +campodean +campodeid +campodeidae +campodeiform +campodeoid +campody +campong +campongs +camponotus +campoo +campoody +camporee +camporees +campos +campout +camps +campshed +campshedding +campsheeting +campshot +campsite +campsites +campstool +campstools +camptodrome +camptonite +camptosorus +campulitropal +campulitropous +campus +campuses +campusses +campward +cams +camshach +camshachle +camshaft +camshafts +camstane +camsteary +camsteery +camstone +camstrary +camuning +camus +camuse +camused +camuses +camwood +can +cana +canaan +canaanite +canaanites +canaanitess +canaanitic +canaanitish +canaba +canabae +canacee +canacuas +canada +canadian +canadianism +canadianisms +canadianization +canadianize +canadians +canadine +canadite +canadol +canafistola +canafistolo +canafistula +canafistulo +canaglia +canaigre +canaille +canailles +canajong +canakin +canakins +canal +canalage +canalatura +canalboat +canale +canaled +canaler +canales +canalete +canali +canalicular +canaliculate +canaliculated +canaliculation +canaliculi +canaliculization +canaliculus +canaliferous +canaliform +canaling +canalis +canalisation +canalise +canalised +canalises +canalising +canalization +canalizations +canalize +canalized +canalizes +canalizing +canalla +canalled +canaller +canallers +canalling +canalman +canals +canalside +canamary +canamo +cananaean +cananga +canangium +canap +canape +canapes +canapina +canard +canards +canari +canary +canarian +canaries +canarin +canarine +canariote +canarium +canarsee +canasta +canastas +canaster +canaut +canavali +canavalia +canavalin +canberra +canc +cancan +cancans +canccelli +cancel +cancelability +cancelable +cancelation +canceled +canceleer +canceler +cancelers +cancelier +canceling +cancellability +cancellable +cancellarian +cancellarius +cancellate +cancellated +cancellation +cancellations +cancelled +canceller +cancelli +cancelling +cancellous +cancellus +cancelment +cancels +cancer +cancerate +cancerated +cancerating +canceration +cancerdrops +cancered +cancerigenic +cancerin +cancerism +cancerite +cancerization +cancerogenic +cancerophobe +cancerophobia +cancerous +cancerously +cancerousness +cancerphobia +cancerroot +cancers +cancerweed +cancerwort +canch +cancha +canchalagua +canchas +canchi +canchito +cancion +cancionero +canciones +cancri +cancrid +cancriform +cancrine +cancrinite +cancrisocial +cancrivorous +cancrizans +cancroid +cancroids +cancrophagous +cancrum +cancrums +cand +candace +candareen +candela +candelabra +candelabras +candelabrum +candelabrums +candelas +candelilla +candency +candent +candescence +candescent +candescently +candy +candid +candida +candidacy +candidacies +candidas +candidate +candidated +candidates +candidateship +candidating +candidature +candidatures +candide +candider +candidest +candidiasis +candidly +candidness +candidnesses +candids +candied +candiel +candier +candies +candify +candyfloss +candyh +candying +candil +candylike +candymaker +candymaking +candiot +candiru +candys +candystick +candite +candytuft +candyweed +candle +candleball +candlebeam +candleberry +candleberries +candlebomb +candlebox +candled +candlefish +candlefishes +candleholder +candlelight +candlelighted +candlelighter +candlelighting +candlelit +candlemaker +candlemaking +candlemas +candlenut +candlepin +candlepins +candlepower +candler +candlerent +candlers +candles +candleshine +candleshrift +candlesnuffer +candlestand +candlestick +candlesticked +candlesticks +candlestickward +candlewaster +candlewasting +candlewick +candlewicking +candlewicks +candlewood +candlewright +candling +candock +candollea +candolleaceae +candolleaceous +candor +candors +candour +candours +candroy +candroys +canduc +cane +canebrake +canebrakes +caned +canel +canela +canelas +canelike +canell +canella +canellaceae +canellaceous +canellas +canelle +canelo +canelos +caneology +canephor +canephora +canephorae +canephore +canephori +canephoroe +canephoroi +canephoros +canephors +canephorus +canephroi +canepin +caner +caners +canes +canescence +canescene +canescent +caneton +canette +caneva +caneware +canewares +canewise +canework +canezou +canfield +canfieldite +canfields +canful +canfuls +cangan +cangenet +cangy +cangia +cangle +cangler +cangue +cangues +canham +canhoop +cany +canichana +canichanan +canicide +canicola +canicula +canicular +canicule +canid +canidae +canidia +canids +canikin +canikins +canille +caninal +canine +canines +caning +caniniform +caninity +caninities +caninus +canion +canyon +canioned +canions +canyons +canyonside +canis +canisiana +canistel +canister +canisters +canities +canjac +cank +canker +cankerberry +cankerbird +cankereat +cankered +cankeredly +cankeredness +cankerflower +cankerfret +cankery +cankering +cankerous +cankerroot +cankers +cankerweed +cankerworm +cankerworms +cankerwort +canli +canmaker +canmaking +canman +cann +canna +cannabic +cannabidiol +cannabin +cannabinaceae +cannabinaceous +cannabine +cannabinol +cannabins +cannabis +cannabises +cannabism +cannaceae +cannaceous +cannach +cannaled +cannalling +cannas +cannat +canned +cannel +cannelated +cannele +cannellate +cannellated +cannelle +cannelloni +cannelon +cannelons +cannels +cannelure +cannelured +cannequin +canner +cannery +canneries +canners +cannet +cannetille +canny +cannibal +cannibalean +cannibalic +cannibalish +cannibalism +cannibalistic +cannibalistically +cannibality +cannibalization +cannibalize +cannibalized +cannibalizes +cannibalizing +cannibally +cannibals +cannie +cannier +canniest +cannikin +cannikins +cannily +canniness +canning +cannings +cannister +cannisters +cannoli +cannon +cannonade +cannonaded +cannonades +cannonading +cannonarchy +cannonball +cannonballed +cannonballing +cannonballs +cannoned +cannoneer +cannoneering +cannoneers +cannonier +cannoning +cannonism +cannonproof +cannonry +cannonries +cannons +cannophori +cannot +cannstatt +cannula +cannulae +cannular +cannulas +cannulate +cannulated +cannulating +cannulation +canoe +canoed +canoeing +canoeiro +canoeist +canoeists +canoeload +canoeman +canoes +canoewood +canoing +canon +canoncito +canones +canoness +canonesses +canonic +canonical +canonicalization +canonicalize +canonicalized +canonicalizes +canonicalizing +canonically +canonicalness +canonicals +canonicate +canonici +canonicity +canonics +canonisation +canonise +canonised +canoniser +canonises +canonising +canonist +canonistic +canonistical +canonists +canonizant +canonization +canonizations +canonize +canonized +canonizer +canonizes +canonizing +canonlike +canonry +canonries +canons +canonship +canoodle +canoodled +canoodler +canoodles +canoodling +canopy +canopic +canopid +canopied +canopies +canopying +canopus +canorous +canorously +canorousness +canos +canossa +canotier +canreply +canroy +canroyer +cans +cansful +canso +cansos +canst +canstick +cant +cantab +cantabank +cantabile +cantabri +cantabrian +cantabrigian +cantabrize +cantador +cantala +cantalas +cantalever +cantalite +cantaliver +cantaloup +cantaloupe +cantaloupes +cantando +cantankerous +cantankerously +cantankerousness +cantar +cantara +cantare +cantaro +cantata +cantatas +cantate +cantation +cantative +cantator +cantatory +cantatrice +cantatrices +cantatrici +cantboard +cantdog +cantdogs +canted +canteen +canteens +cantefable +cantel +canter +canterbury +canterburian +canterburianism +canterburies +cantered +canterelle +canterer +cantering +canters +canthal +cantharellus +canthari +cantharic +cantharidae +cantharidal +cantharidate +cantharidated +cantharidating +cantharidean +cantharides +cantharidian +cantharidin +cantharidism +cantharidize +cantharidized +cantharidizing +cantharis +cantharophilous +cantharus +canthathari +canthectomy +canthi +canthitis +cantholysis +canthoplasty +canthorrhaphy +canthotomy +canthus +canthuthi +canty +cantic +canticle +canticles +cantico +cantiga +cantil +cantilated +cantilating +cantilena +cantilene +cantilenes +cantilever +cantilevered +cantilevering +cantilevers +cantily +cantillate +cantillated +cantillating +cantillation +cantina +cantinas +cantiness +canting +cantingly +cantingness +cantinier +cantino +cantion +cantish +cantle +cantles +cantlet +cantline +cantling +canto +canton +cantonal +cantonalism +cantoned +cantoner +cantonese +cantoning +cantonize +cantonment +cantonments +cantons +cantoon +cantor +cantoral +cantoria +cantorial +cantorian +cantoris +cantorous +cantors +cantorship +cantos +cantraip +cantraips +cantrap +cantraps +cantred +cantref +cantrip +cantrips +cants +cantus +cantut +cantuta +cantwise +canuck +canula +canulae +canular +canulas +canulate +canulated +canulates +canulating +canun +canvas +canvasado +canvasback +canvasbacks +canvased +canvaser +canvasers +canvases +canvasing +canvaslike +canvasman +canvass +canvassed +canvasser +canvassers +canvasses +canvassy +canvassing +canzo +canzon +canzona +canzonas +canzone +canzones +canzonet +canzonets +canzonetta +canzoni +canzos +caoba +caodaism +caodaist +caoine +caon +caoutchin +caoutchouc +caoutchoucin +cap +capa +capability +capabilities +capable +capableness +capabler +capablest +capably +capacify +capacious +capaciously +capaciousness +capacitance +capacitances +capacitate +capacitated +capacitates +capacitating +capacitation +capacitations +capacitative +capacitativly +capacitator +capacity +capacities +capacitive +capacitively +capacitor +capacitors +capanna +capanne +caparison +caparisoned +caparisoning +caparisons +capataces +capataz +capax +capcase +cape +capeador +capeadores +capeadors +caped +capel +capelan +capelans +capelet +capelets +capelin +capeline +capelins +capella +capellane +capellet +capelline +capelocracy +caper +caperbush +capercailye +capercaillie +capercailzie +capercally +capercut +caperdewsie +capered +caperer +caperers +capering +caperingly +capernaism +capernaite +capernaitic +capernaitical +capernaitically +capernaitish +capernoited +capernoity +capernoitie +capernutie +capers +capersome +capersomeness +caperwort +capes +capeskin +capeskins +capetian +capetonian +capetown +capette +capeweed +capewise +capework +capeworks +capful +capfuls +caph +caphar +capharnaism +caphite +caphs +caphtor +caphtorim +capias +capiases +capiatur +capibara +capybara +capybaras +capicha +capilaceous +capillaceous +capillaire +capillament +capillarectasia +capillary +capillaries +capillarily +capillarimeter +capillariness +capillariomotor +capillarity +capillarities +capillaritis +capillation +capillatus +capilli +capilliculture +capilliform +capillitia +capillitial +capillitium +capillose +capillus +capilotade +caping +capistrate +capita +capital +capitaldom +capitaled +capitaling +capitalisable +capitalise +capitalised +capitaliser +capitalising +capitalism +capitalist +capitalistic +capitalistically +capitalists +capitalizable +capitalization +capitalizations +capitalize +capitalized +capitalizer +capitalizers +capitalizes +capitalizing +capitally +capitalness +capitals +capitan +capitana +capitano +capitare +capitasti +capitate +capitated +capitatim +capitation +capitations +capitative +capitatum +capite +capiteaux +capitella +capitellar +capitellate +capitelliform +capitellum +capitle +capito +capitol +capitolian +capitoline +capitolium +capitols +capitonidae +capitoninae +capitoul +capitoulate +capitula +capitulant +capitular +capitulary +capitularies +capitularly +capitulars +capitulate +capitulated +capitulates +capitulating +capitulation +capitulations +capitulator +capitulatory +capituliform +capitulum +capiturlary +capivi +capkin +caplan +capless +caplet +caplets +caplin +capling +caplins +caplock +capmaker +capmakers +capmaking +capman +capmint +capnodium +capnoides +capnomancy +capnomor +capo +capoc +capocchia +capoche +capomo +capon +caponata +caponatas +capone +caponette +caponier +caponiere +caponiers +caponisation +caponise +caponised +caponiser +caponising +caponization +caponize +caponized +caponizer +caponizes +caponizing +caponniere +capons +caporal +caporals +capos +capot +capotasto +capotastos +capote +capotes +capouch +capouches +cappadine +cappadochio +cappadocian +cappae +cappagh +capparid +capparidaceae +capparidaceous +capparis +capped +cappelenite +cappella +cappelletti +capper +cappers +cappy +cappie +cappier +cappiest +capping +cappings +capple +cappuccino +capra +caprate +caprella +caprellidae +caprelline +capreol +capreolar +capreolary +capreolate +capreoline +capreolus +capreomycin +capretto +capri +capric +capriccetto +capriccettos +capricci +capriccio +capriccios +capriccioso +caprice +caprices +capricious +capriciously +capriciousness +capricorn +capricornid +capricorns +capricornus +caprid +caprificate +caprification +caprificator +caprifig +caprifigs +caprifoil +caprifole +caprifoliaceae +caprifoliaceous +caprifolium +capriform +caprigenous +capryl +caprylate +caprylene +caprylic +caprylyl +caprylin +caprylone +caprimulgi +caprimulgidae +caprimulgiformes +caprimulgine +caprimulgus +caprin +caprine +caprinic +capriola +capriole +caprioled +caprioles +caprioling +capriote +capriped +capripede +capris +caprizant +caproate +caprock +caprocks +caproic +caproyl +caproin +capromys +capron +caprone +capronic +capronyl +caps +capsa +capsaicin +capsella +capsheaf +capshore +capsian +capsicin +capsicins +capsicum +capsicums +capsid +capsidae +capsidal +capsids +capsizable +capsizal +capsize +capsized +capsizes +capsizing +capsomer +capsomere +capsomers +capstan +capstans +capstone +capstones +capsula +capsulae +capsular +capsulate +capsulated +capsulation +capsule +capsulectomy +capsuled +capsuler +capsules +capsuliferous +capsuliform +capsuligerous +capsuling +capsulitis +capsulize +capsulized +capsulizing +capsulociliary +capsulogenous +capsulolenticular +capsulopupillary +capsulorrhaphy +capsulotome +capsulotomy +capsumin +captacula +captaculum +captain +captaincy +captaincies +captained +captainess +captaining +captainly +captainry +captainries +captains +captainship +captainships +captan +captance +captandum +captans +captate +captation +caption +captioned +captioning +captionless +captions +captious +captiously +captiousness +captivance +captivate +captivated +captivately +captivates +captivating +captivatingly +captivation +captivative +captivator +captivators +captivatrix +captive +captived +captives +captiving +captivity +captivities +captor +captors +captress +capturable +capture +captured +capturer +capturers +captures +capturing +capuan +capuche +capuched +capuches +capuchin +capuchins +capucine +capulet +capuli +capulin +caput +caputium +caque +caquet +caqueterie +caqueteuse +caqueteuses +caquetio +caquetoire +caquetoires +car +cara +carabao +carabaos +carabeen +carabid +carabidae +carabidan +carabideous +carabidoid +carabids +carabin +carabine +carabineer +carabiner +carabinero +carabineros +carabines +carabini +carabinier +carabiniere +carabinieri +carabins +caraboa +caraboid +carabus +caracal +caracals +caracara +caracaras +caracas +carack +caracks +caraco +caracoa +caracol +caracole +caracoled +caracoler +caracoles +caracoli +caracoling +caracolite +caracolled +caracoller +caracolling +caracols +caracora +caracore +caract +caractacus +caracter +caracul +caraculs +caradoc +carafe +carafes +carafon +caragana +caraganas +carageen +carageens +caragheen +caraguata +caraho +carayan +caraibe +caraipa +caraipe +caraipi +caraja +carajas +carajo +carajura +caramba +carambola +carambole +caramboled +caramboling +caramel +caramelan +caramelen +caramelin +caramelisation +caramelise +caramelised +caramelising +caramelization +caramelize +caramelized +caramelizes +caramelizing +caramels +caramoussal +carancha +carancho +caranda +caranday +carandas +carane +caranga +carangid +carangidae +carangids +carangin +carangoid +carangus +caranna +caranx +carap +carapa +carapace +carapaced +carapaces +carapache +carapacho +carapacial +carapacic +carapato +carapax +carapaxes +carapidae +carapine +carapo +carapus +carara +carassow +carassows +carat +caratacus +caratch +carate +carates +carats +carauna +caraunda +caravan +caravaned +caravaneer +caravaner +caravaning +caravanist +caravanned +caravanner +caravanning +caravans +caravansary +caravansaries +caravanserai +caravanserial +caravel +caravelle +caravels +caraway +caraways +carbachol +carbacidometer +carbamate +carbamic +carbamide +carbamidine +carbamido +carbamyl +carbamyls +carbamine +carbamino +carbamoyl +carbanil +carbanilic +carbanilid +carbanilide +carbanion +carbaryl +carbaryls +carbarn +carbarns +carbasus +carbazic +carbazide +carbazylic +carbazin +carbazine +carbazole +carbeen +carbene +carberry +carbethoxy +carbethoxyl +carby +carbide +carbides +carbyl +carbylamine +carbimide +carbin +carbine +carbineer +carbineers +carbines +carbinyl +carbinol +carbinols +carbo +carboazotine +carbocer +carbocyclic +carbocinchomeronic +carbodiimide +carbodynamite +carbogelatin +carbohemoglobin +carbohydrase +carbohydrate +carbohydrates +carbohydraturia +carbohydrazide +carbohydride +carbohydrogen +carboy +carboyed +carboys +carbolate +carbolated +carbolating +carbolfuchsin +carbolic +carbolics +carboline +carbolineate +carbolineum +carbolise +carbolised +carbolising +carbolize +carbolized +carbolizes +carbolizing +carboloy +carboluria +carbolxylol +carbomethene +carbomethoxy +carbomethoxyl +carbomycin +carbon +carbona +carbonaceous +carbonade +carbonado +carbonadoed +carbonadoes +carbonadoing +carbonados +carbonari +carbonarism +carbonarist +carbonatation +carbonate +carbonated +carbonates +carbonating +carbonation +carbonatization +carbonator +carbonators +carbondale +carbone +carboned +carbonemia +carbonero +carbones +carbonic +carbonide +carboniferous +carbonify +carbonification +carbonigenous +carbonyl +carbonylate +carbonylated +carbonylating +carbonylation +carbonylene +carbonylic +carbonyls +carbonimeter +carbonimide +carbonisable +carbonisation +carbonise +carbonised +carboniser +carbonising +carbonite +carbonitride +carbonium +carbonizable +carbonization +carbonize +carbonized +carbonizer +carbonizers +carbonizes +carbonizing +carbonless +carbonnieux +carbonometer +carbonometry +carbonous +carbons +carbonuria +carbophilous +carbora +carboras +carborundum +carbosilicate +carbostyril +carboxy +carboxide +carboxydomonas +carboxyhemoglobin +carboxyl +carboxylase +carboxylate +carboxylated +carboxylating +carboxylation +carboxylic +carboxyls +carboxypeptidase +carbro +carbromal +carbuilder +carbuncle +carbuncled +carbuncles +carbuncular +carbunculation +carbungi +carburan +carburant +carburate +carburated +carburating +carburation +carburator +carbure +carburet +carburetant +carbureted +carbureter +carburetest +carbureting +carburetion +carburetor +carburetors +carburets +carburetted +carburetter +carburetting +carburettor +carburisation +carburise +carburised +carburiser +carburising +carburization +carburize +carburized +carburizer +carburizes +carburizing +carburometer +carcajou +carcajous +carcake +carcan +carcanet +carcaneted +carcanets +carcanetted +carcase +carcased +carcases +carcasing +carcass +carcassed +carcasses +carcassing +carcassless +carcavelhos +carceag +carcel +carcels +carcer +carceral +carcerate +carcerated +carcerating +carceration +carcerist +carcharhinus +carcharias +carchariid +carchariidae +carcharioid +carcharodon +carcharodont +carcinemia +carcinogen +carcinogeneses +carcinogenesis +carcinogenic +carcinogenicity +carcinogens +carcinoid +carcinolysin +carcinolytic +carcinology +carcinological +carcinologist +carcinoma +carcinomas +carcinomata +carcinomatoid +carcinomatosis +carcinomatous +carcinomorphic +carcinophagous +carcinophobia +carcinopolypus +carcinosarcoma +carcinosarcomas +carcinosarcomata +carcinoscorpius +carcinosis +carcinus +carcoon +card +cardaissin +cardamine +cardamom +cardamoms +cardamon +cardamons +cardamum +cardamums +cardanic +cardanol +cardboard +cardcase +cardcases +cardcastle +cardecu +carded +cardel +carder +carders +cardholder +cardholders +cardhouse +cardia +cardiac +cardiacal +cardiacea +cardiacean +cardiacle +cardiacs +cardiae +cardiagra +cardiagram +cardiagraph +cardiagraphy +cardial +cardialgy +cardialgia +cardialgic +cardiameter +cardiamorphia +cardianesthesia +cardianeuria +cardiant +cardiaplegia +cardiarctia +cardias +cardiasthenia +cardiasthma +cardiataxia +cardiatomy +cardiatrophia +cardiauxe +cardiazol +cardicentesis +cardiectasis +cardiectomy +cardiectomize +cardielcosis +cardiemphraxia +cardiform +cardigan +cardigans +cardiidae +cardin +cardinal +cardinalate +cardinalated +cardinalates +cardinalfish +cardinalfishes +cardinalic +cardinalis +cardinalism +cardinalist +cardinality +cardinalitial +cardinalitian +cardinalities +cardinally +cardinals +cardinalship +cardines +carding +cardings +cardioaccelerator +cardioarterial +cardioblast +cardiocarpum +cardiocele +cardiocentesis +cardiocirrhosis +cardioclasia +cardioclasis +cardiod +cardiodilator +cardiodynamics +cardiodynia +cardiodysesthesia +cardiodysneuria +cardiogenesis +cardiogenic +cardiogram +cardiograms +cardiograph +cardiographer +cardiography +cardiographic +cardiographies +cardiographs +cardiohepatic +cardioid +cardioids +cardiokinetic +cardiolysis +cardiolith +cardiology +cardiologic +cardiological +cardiologies +cardiologist +cardiologists +cardiomalacia +cardiomegaly +cardiomegalia +cardiomelanosis +cardiometer +cardiometry +cardiometric +cardiomyoliposis +cardiomyomalacia +cardiomyopathy +cardiomotility +cardioncus +cardionecrosis +cardionephric +cardioneural +cardioneurosis +cardionosus +cardioparplasis +cardiopath +cardiopathy +cardiopathic +cardiopericarditis +cardiophobe +cardiophobia +cardiophrenia +cardiopyloric +cardioplasty +cardioplegia +cardiopneumatic +cardiopneumograph +cardioptosis +cardiopulmonary +cardiopuncture +cardiorenal +cardiorespiratory +cardiorrhaphy +cardiorrheuma +cardiorrhexis +cardioschisis +cardiosclerosis +cardioscope +cardiosymphysis +cardiospasm +cardiospermum +cardiosphygmogram +cardiosphygmograph +cardiotherapy +cardiotherapies +cardiotomy +cardiotonic +cardiotoxic +cardiotrophia +cardiotrophotherapy +cardiovascular +cardiovisceral +cardipaludism +cardipericarditis +cardisophistical +cardita +carditic +carditis +carditises +cardium +cardlike +cardmaker +cardmaking +cardo +cardol +cardon +cardona +cardoncillo +cardooer +cardoon +cardoons +cardophagus +cardosanto +cardplayer +cardplaying +cardroom +cards +cardshark +cardsharp +cardsharper +cardsharping +cardsharps +cardstock +carduaceae +carduaceous +cardueline +carduelis +carduus +care +carecloth +cared +careen +careenage +careened +careener +careeners +careening +careens +career +careered +careerer +careerers +careering +careeringly +careerism +careerist +careeristic +careers +carefox +carefree +carefreeness +careful +carefull +carefuller +carefullest +carefully +carefulness +carey +careys +careless +carelessly +carelessness +careme +carene +carer +carers +cares +caress +caressable +caressant +caressed +caresser +caressers +caresses +caressing +caressingly +caressive +caressively +carest +caret +caretake +caretaken +caretaker +caretakers +caretakes +caretaking +caretook +carets +caretta +carettochelydidae +careworn +carex +carf +carfare +carfares +carfax +carfloat +carfour +carfuffle +carfuffled +carfuffling +carful +carfuls +carga +cargador +cargadores +cargason +cargo +cargoes +cargoose +cargos +cargued +carhop +carhops +carhouse +cary +carya +cariacine +cariacus +cariama +cariamae +carian +caryatic +caryatid +caryatidal +caryatidean +caryatides +caryatidic +caryatids +carib +caribal +cariban +caribbean +caribbeans +caribbee +caribe +caribed +caribes +caribi +caribing +caribisi +caribou +caribous +carica +caricaceae +caricaceous +caricatura +caricaturable +caricatural +caricature +caricatured +caricatures +caricaturing +caricaturist +caricaturists +carices +caricetum +caricographer +caricography +caricology +caricologist +caricous +carid +carida +caridea +caridean +carideer +caridoid +caridomorpha +caried +carien +caries +cariform +cariyo +carijona +caryl +carillon +carilloneur +carillonned +carillonneur +carillonneurs +carillonning +carillons +carina +carinae +carinal +carinaria +carinas +carinatae +carinate +carinated +carination +caring +cariniana +cariniform +carinthian +carinula +carinulate +carinule +carioca +caryocar +caryocaraceae +caryocaraceous +cariocas +cariogenic +cariole +carioles +carioling +caryophyllaceae +caryophyllaceous +caryophyllene +caryophylleous +caryophyllin +caryophyllous +caryophyllus +caryopilite +caryopses +caryopsides +caryopsis +caryopteris +cariosity +caryota +caryotin +caryotins +carious +cariousness +caripeta +caripuna +cariri +caririan +carisa +carisoprodol +carissa +caritas +caritative +carites +carity +caritive +cark +carked +carking +carkingly +carkled +carks +carl +carlage +carle +carles +carless +carlet +carli +carlie +carlylean +carlyleian +carlylese +carlylesque +carlylian +carlylism +carlin +carlina +carline +carlines +carling +carlings +carlino +carlins +carlish +carlishness +carlisle +carlism +carlist +carlo +carload +carloading +carloadings +carloads +carlock +carlos +carlot +carlovingian +carls +carludovica +carmagnole +carmagnoles +carmaker +carmakers +carmalum +carman +carmanians +carmel +carmela +carmele +carmelite +carmelitess +carmeloite +carmen +carmetta +carminate +carminative +carminatives +carmine +carmines +carminette +carminic +carminite +carminophilous +carmoisin +carmot +carn +carnac +carnacian +carnage +carnaged +carnages +carnal +carnalism +carnalite +carnality +carnalities +carnalize +carnalized +carnalizing +carnally +carnallite +carnalness +carnaptious +carnary +carnaria +carnassial +carnate +carnation +carnationed +carnationist +carnations +carnauba +carnaubas +carnaubic +carnaubyl +carne +carneau +carnegie +carnegiea +carney +carneyed +carneys +carnel +carnelian +carnelians +carneol +carneole +carneous +carnet +carnets +carny +carnic +carnie +carnied +carnies +carniferous +carniferrin +carnifex +carnifexes +carnify +carnification +carnifices +carnificial +carnified +carnifies +carnifying +carniform +carniolan +carnitine +carnival +carnivaler +carnivalesque +carnivaller +carnivallike +carnivals +carnivora +carnivoracity +carnivoral +carnivore +carnivores +carnivorism +carnivority +carnivorous +carnivorously +carnivorousness +carnose +carnosin +carnosine +carnosity +carnosities +carnotite +carnous +carns +caro +caroa +caroach +caroaches +carob +caroba +carobs +caroch +caroche +caroches +caroid +caroigne +carol +carolan +carole +carolean +caroled +caroler +carolers +caroli +carolin +carolyn +carolina +carolinas +caroline +carolines +caroling +carolingian +carolinian +carolinians +carolitic +carolled +caroller +carollers +carolling +carols +carolus +caroluses +carom +carombolette +caromed +caromel +caroming +caroms +carone +caronic +caroome +caroon +carosella +carosse +carot +caroteel +carotene +carotenes +carotenoid +carotic +carotid +carotidal +carotidean +carotids +carotin +carotinaemia +carotinemia +carotinoid +carotins +carotol +carotte +carouba +caroubier +carousal +carousals +carouse +caroused +carousel +carousels +carouser +carousers +carouses +carousing +carousingly +carp +carpaine +carpal +carpale +carpalia +carpals +carpathian +carpe +carped +carpel +carpellary +carpellate +carpellum +carpels +carpent +carpenter +carpentered +carpenteria +carpentering +carpenters +carpentership +carpenterworm +carpentry +carper +carpers +carpet +carpetbag +carpetbagged +carpetbagger +carpetbaggery +carpetbaggers +carpetbagging +carpetbaggism +carpetbagism +carpetbags +carpetbeater +carpeted +carpeting +carpetlayer +carpetless +carpetmaker +carpetmaking +carpetmonger +carpets +carpetweb +carpetweed +carpetwork +carpetwoven +carphiophiops +carpholite +carphology +carphophis +carphosiderite +carpi +carpid +carpidium +carpincho +carping +carpingly +carpings +carpintero +carpinus +carpiodes +carpitis +carpium +carpocace +carpocapsa +carpocarpal +carpocephala +carpocephalum +carpocerite +carpocervical +carpocratian +carpodacus +carpodetus +carpogam +carpogamy +carpogenic +carpogenous +carpognia +carpogone +carpogonia +carpogonial +carpogonium +carpoidea +carpolite +carpolith +carpology +carpological +carpologically +carpologist +carpomania +carpometacarpal +carpometacarpi +carpometacarpus +carpompi +carpool +carpools +carpopedal +carpophaga +carpophagous +carpophalangeal +carpophyl +carpophyll +carpophyte +carpophore +carpopodite +carpopoditic +carpoptosia +carpoptosis +carport +carports +carpos +carposperm +carposporangia +carposporangial +carposporangium +carpospore +carposporic +carposporous +carpostome +carps +carpsucker +carpus +carpuspi +carquaise +carr +carrack +carracks +carrageen +carrageenan +carrageenin +carragheen +carragheenin +carrara +carraran +carrat +carraway +carraways +carreau +carree +carrefour +carrel +carrell +carrells +carrels +carreta +carretela +carretera +carreton +carretta +carri +carry +carriable +carryable +carriage +carriageable +carriageful +carriageless +carriages +carriagesmith +carriageway +carryall +carryalls +carrick +carrycot +carrie +carried +carryed +carrier +carriers +carries +carrigeen +carrying +carryings +carryke +carriole +carrioles +carrion +carryon +carrions +carryons +carryout +carryouts +carryover +carryovers +carrys +carrytale +carritch +carritches +carriwitchet +carrizo +carrocci +carroccio +carroch +carroches +carroll +carrollite +carrom +carromata +carromatas +carromed +carroming +carroms +carronade +carroon +carrosserie +carrot +carrotage +carroter +carroty +carrotier +carrotiest +carrotin +carrotiness +carroting +carrotins +carrots +carrottop +carrotweed +carrotwood +carrousel +carrousels +carrow +carrozza +carrs +carrus +cars +carse +carses +carshop +carshops +carsick +carsickness +carsmith +carson +carsten +carstone +cart +cartable +cartaceous +cartage +cartages +cartboot +cartbote +carte +carted +cartel +cartelism +cartelist +cartelistic +cartelization +cartelize +cartelized +cartelizing +cartellist +cartels +carter +carterly +carters +cartes +cartesian +cartesianism +cartful +carthaginian +carthame +carthamic +carthamin +carthamus +carthorse +carthusian +carty +cartier +cartiest +cartilage +cartilages +cartilaginean +cartilaginei +cartilagineous +cartilagines +cartilaginification +cartilaginoid +cartilaginous +carting +cartisane +cartist +cartload +cartloads +cartmaker +cartmaking +cartman +cartobibliography +cartogram +cartograph +cartographer +cartographers +cartography +cartographic +cartographical +cartographically +cartographies +cartomancy +cartomancies +carton +cartoned +cartoner +cartonful +cartoning +cartonnage +cartonnier +cartonniers +cartons +cartoon +cartooned +cartooning +cartoonist +cartoonists +cartoons +cartop +cartopper +cartouch +cartouche +cartouches +cartridge +cartridges +carts +cartsale +cartulary +cartularies +cartway +cartware +cartwheel +cartwheeler +cartwheels +cartwhip +cartwright +cartwrighting +carua +caruage +carucage +carucal +carucarius +carucate +carucated +carum +caruncle +caruncles +caruncula +carunculae +caruncular +carunculate +carunculated +carunculous +carus +carvacryl +carvacrol +carvage +carval +carve +carved +carvel +carvels +carven +carvene +carver +carvers +carvership +carves +carvestrene +carvy +carvyl +carving +carvings +carvist +carvoeira +carvoepra +carvol +carvomenthene +carvone +carwash +carwashes +carwitchet +carzey +casa +casaba +casabas +casabe +casablanca +casal +casalty +casamarca +casanova +casanovanic +casanovas +casaque +casaques +casaquin +casas +casasia +casate +casaun +casava +casavas +casave +casavi +casbah +casbahs +cascabel +cascabels +cascable +cascables +cascadable +cascade +cascaded +cascades +cascadia +cascadian +cascading +cascadite +cascado +cascalho +cascalote +cascan +cascara +cascaras +cascarilla +cascaron +cascavel +caschielawis +caschrom +casco +cascol +cascrom +cascrome +case +casearia +casease +caseases +caseate +caseated +caseates +caseating +caseation +casebearer +casebook +casebooks +casebound +casebox +caseconv +cased +casefy +casefied +casefies +casefying +caseful +caseharden +casehardened +casehardening +casehardens +casey +caseic +casein +caseinate +caseine +caseinogen +caseins +casekeeper +casel +caseless +caselessly +caseload +caseloads +caselty +casemaker +casemaking +casemate +casemated +casemates +casement +casemented +casements +caseolysis +caseose +caseoses +caseous +caser +caserio +caserios +casern +caserne +casernes +caserns +cases +casette +casettes +caseum +caseweed +casewood +casework +caseworker +caseworkers +caseworks +caseworm +caseworms +cash +casha +cashable +cashableness +cashaw +cashaws +cashboy +cashbook +cashbooks +cashbox +cashboxes +cashcuttee +cashdrawer +cashed +casheen +cashel +casher +cashers +cashes +cashew +cashews +cashgirl +cashibo +cashier +cashiered +cashierer +cashiering +cashierment +cashiers +cashing +cashkeeper +cashless +cashment +cashmere +cashmeres +cashmerette +cashmirian +cashoo +cashoos +cashou +casimere +casimeres +casimir +casimire +casimires +casimiroa +casina +casinet +casing +casings +casino +casinos +casiri +casita +casitas +cask +caskanet +casked +casket +casketed +casketing +casketlike +caskets +casky +casking +casklike +casks +caslon +caspar +casparian +casper +caspian +casque +casqued +casques +casquet +casquetel +casquette +cass +cassaba +cassabanana +cassabas +cassabully +cassada +cassady +cassalty +cassan +cassandra +cassandras +cassapanca +cassare +cassareep +cassata +cassatas +cassate +cassation +cassava +cassavas +casse +cassegrain +cassegrainian +casselty +cassena +casserole +casseroled +casseroles +casseroling +cassette +cassettes +casshe +cassy +cassia +cassiaceae +cassian +cassias +cassican +cassicus +cassida +cassideous +cassidid +cassididae +cassidinae +cassidoine +cassidony +cassidulina +cassiduloid +cassiduloidea +cassie +cassiepeia +cassimere +cassina +cassine +cassinese +cassinette +cassinian +cassino +cassinoid +cassinos +cassioberry +cassiope +cassiopeia +cassiopeian +cassiopeid +cassiopeium +cassique +cassiri +cassis +cassises +cassiterite +cassites +cassytha +cassythaceae +cassius +cassock +cassocked +cassocks +cassolette +casson +cassonade +cassone +cassoni +cassons +cassoon +cassoulet +cassowary +cassowaries +cassumunar +cassumuniar +cast +castable +castagnole +castalia +castalian +castalides +castalio +castana +castane +castanea +castanean +castaneous +castanet +castanets +castanian +castano +castanopsis +castanospermum +castaway +castaways +caste +casted +casteism +casteisms +casteless +castelet +castellan +castellany +castellanies +castellano +castellans +castellanship +castellanus +castellar +castellate +castellated +castellation +castellatus +castellet +castelli +castellum +casten +caster +casterless +casters +castes +casteth +casthouse +castice +castigable +castigate +castigated +castigates +castigating +castigation +castigations +castigative +castigator +castigatory +castigatories +castigators +castile +castilian +castilla +castilleja +castillo +castilloa +casting +castings +castle +castled +castlelike +castlery +castles +castlet +castleward +castlewards +castlewise +castling +castock +castoff +castoffs +castor +castores +castoreum +castory +castorial +castoridae +castorin +castorite +castorized +castoroides +castors +castra +castral +castrametation +castrate +castrated +castrater +castrates +castrati +castrating +castration +castrations +castrato +castrator +castratory +castrators +castrensial +castrensian +castro +castrum +casts +castuli +casual +casualism +casualist +casuality +casually +casualness +casuals +casualty +casualties +casuary +casuariidae +casuariiformes +casuarina +casuarinaceae +casuarinaceous +casuarinales +casuarius +casuist +casuistess +casuistic +casuistical +casuistically +casuistry +casuistries +casuists +casula +casule +casus +casusistry +caswellite +casziel +cat +catabaptist +catabases +catabasion +catabasis +catabatic +catabibazon +catabiotic +catabolic +catabolically +catabolin +catabolism +catabolite +catabolize +catabolized +catabolizing +catacaustic +catachreses +catachresis +catachresti +catachrestic +catachrestical +catachrestically +catachthonian +catachthonic +cataclasis +cataclasm +cataclasmic +cataclastic +cataclinal +cataclysm +cataclysmal +cataclysmatic +cataclysmatist +cataclysmic +cataclysmically +cataclysmist +cataclysms +catacomb +catacombic +catacombs +catacorner +catacorolla +catacoustics +catacromyodian +catacrotic +catacrotism +catacumba +catacumbal +catadicrotic +catadicrotism +catadioptric +catadioptrical +catadioptrics +catadrome +catadromous +catadupe +catafalco +catafalque +catafalques +catagenesis +catagenetic +catagmatic +catagories +cataian +catakinesis +catakinetic +catakinetomer +catakinomeric +catalan +catalanganes +catalanist +catalase +catalases +catalatic +catalaunian +catalecta +catalectic +catalecticant +catalects +catalepsy +catalepsies +catalepsis +cataleptic +cataleptically +cataleptics +cataleptiform +cataleptize +cataleptoid +catalexes +catalexis +catalin +catalina +catalineta +catalinite +catalyse +catalyses +catalysis +catalyst +catalysts +catalyte +catalytic +catalytical +catalytically +catalyzator +catalyze +catalyzed +catalyzer +catalyzers +catalyzes +catalyzing +catallactic +catallactically +catallactics +catallum +catalo +cataloes +catalog +cataloged +cataloger +catalogers +catalogia +catalogic +catalogical +cataloging +catalogist +catalogistic +catalogize +catalogs +catalogue +catalogued +cataloguer +catalogues +cataloguing +cataloguish +cataloguist +cataloguize +catalonian +cataloon +catalos +catalowne +catalpa +catalpas +catalufa +catalufas +catamaran +catamarans +catamarcan +catamarenan +catamenia +catamenial +catamite +catamited +catamites +catamiting +catamneses +catamnesis +catamnestic +catamount +catamountain +catamounts +catan +catanadromous +catananche +catapan +catapasm +catapetalous +cataphasia +cataphatic +cataphyll +cataphylla +cataphyllary +cataphyllum +cataphysic +cataphysical +cataphonic +cataphonics +cataphora +cataphoresis +cataphoretic +cataphoretically +cataphoria +cataphoric +cataphract +cataphracta +cataphracted +cataphracti +cataphractic +cataphrenia +cataphrenic +cataphrygian +cataphrygianism +cataplane +cataplasia +cataplasis +cataplasm +cataplastic +catapleiite +cataplexy +catapuce +catapult +catapulted +catapultic +catapultier +catapulting +catapults +cataract +cataractal +cataracted +cataracteg +cataractine +cataractous +cataracts +cataractwise +cataria +catarinite +catarrh +catarrhal +catarrhally +catarrhed +catarrhina +catarrhine +catarrhinian +catarrhous +catarrhs +catasarka +catasetum +cataspilite +catasta +catastaltic +catastases +catastasis +catastate +catastatic +catasterism +catastrophal +catastrophe +catastrophes +catastrophic +catastrophical +catastrophically +catastrophism +catastrophist +catathymic +catatony +catatonia +catatoniac +catatonias +catatonic +catatonics +catawampous +catawampously +catawamptious +catawamptiously +catawampus +catawba +catawbas +catberry +catbird +catbirds +catboat +catboats +catbrier +catbriers +catcall +catcalled +catcaller +catcalling +catcalls +catch +catchable +catchall +catchalls +catchcry +catched +catcher +catchers +catches +catchfly +catchflies +catchy +catchie +catchier +catchiest +catchiness +catching +catchingly +catchingness +catchland +catchlight +catchline +catchment +catchments +catchpenny +catchpennies +catchphrase +catchplate +catchpole +catchpoled +catchpolery +catchpoleship +catchpoling +catchpoll +catchpolled +catchpollery +catchpolling +catchup +catchups +catchwater +catchweed +catchweight +catchword +catchwords +catchwork +catclaw +catdom +cate +catecheses +catechesis +catechetic +catechetical +catechetically +catechin +catechins +catechisable +catechisation +catechise +catechised +catechiser +catechising +catechism +catechismal +catechisms +catechist +catechistic +catechistical +catechistically +catechists +catechizable +catechization +catechize +catechized +catechizer +catechizes +catechizing +catechol +catecholamine +catecholamines +catechols +catechu +catechumen +catechumenal +catechumenate +catechumenical +catechumenically +catechumenism +catechumens +catechumenship +catechus +catechutannic +categorem +categorematic +categorematical +categorematically +category +categorial +categoric +categorical +categorically +categoricalness +categories +categorisation +categorise +categorised +categorising +categorist +categorization +categorizations +categorize +categorized +categorizer +categorizers +categorizes +categorizing +cateye +catel +catelectrode +catelectrotonic +catelectrotonus +catella +catena +catenae +catenane +catenary +catenarian +catenaries +catenas +catenate +catenated +catenates +catenating +catenation +catenative +catenoid +catenoids +catenulate +catepuce +cater +cateran +caterans +caterbrawl +catercap +catercorner +catercornered +catercornerways +catercousin +catered +caterer +caterers +caterership +cateress +cateresses +catery +catering +cateringly +caterpillar +caterpillared +caterpillarlike +caterpillars +caters +caterva +caterwaul +caterwauled +caterwauler +caterwauling +caterwauls +cates +catesbaea +catesbeiana +catface +catfaced +catfaces +catfacing +catfall +catfalls +catfight +catfish +catfishes +catfoot +catfooted +catgut +catguts +cath +catha +cathay +cathayan +cathar +catharan +cathari +catharina +catharine +catharism +catharist +catharistic +catharization +catharize +catharized +catharizing +catharpin +catharping +cathars +catharses +catharsis +cathartae +cathartes +cathartic +cathartical +cathartically +catharticalness +cathartics +cathartidae +cathartides +cathartin +cathartolinum +cathead +catheads +cathect +cathected +cathectic +cathecting +cathection +cathects +cathedra +cathedrae +cathedral +cathedraled +cathedralesque +cathedralic +cathedrallike +cathedrals +cathedralwise +cathedras +cathedrated +cathedratic +cathedratica +cathedratical +cathedratically +cathedraticum +cathepsin +catheptic +catheretic +catherine +cathern +catheter +catheterisation +catheterise +catheterised +catheterising +catheterism +catheterization +catheterize +catheterized +catheterizes +catheterizing +catheters +catheti +cathetometer +cathetometric +cathetus +cathetusti +cathexes +cathexion +cathexis +cathy +cathidine +cathin +cathine +cathinine +cathion +cathisma +cathismata +cathodal +cathode +cathodegraph +cathodes +cathodic +cathodical +cathodically +cathodofluorescence +cathodograph +cathodography +cathodoluminescence +cathodoluminescent +cathograph +cathography +cathole +catholic +catholical +catholically +catholicalness +catholicate +catholici +catholicisation +catholicise +catholicised +catholiciser +catholicising +catholicism +catholicist +catholicity +catholicization +catholicize +catholicized +catholicizer +catholicizing +catholicly +catholicness +catholicoi +catholicon +catholicos +catholicoses +catholics +catholicus +catholyte +cathood +cathop +cathouse +cathouses +cathrin +cathryn +cathro +cathud +catydid +catilinarian +catiline +cating +cation +cationic +cationically +cations +cativo +catjang +catkin +catkinate +catkins +catlap +catlike +catlin +catline +catling +catlings +catlinite +catlins +catmalison +catmint +catmints +catnache +catnap +catnaper +catnapers +catnapped +catnapper +catnapping +catnaps +catnep +catnip +catnips +catoblepas +catocala +catocalid +catocarthartic +catocathartic +catochus +catoctin +catodon +catodont +catogene +catogenic +catoism +catonian +catonic +catonically +catonism +catoptric +catoptrical +catoptrically +catoptrics +catoptrite +catoptromancy +catoptromantic +catoquina +catostomid +catostomidae +catostomoid +catostomus +catouse +catpiece +catpipe +catproof +catrigged +cats +catskill +catskin +catskinner +catslide +catso +catsos +catspaw +catspaws +catstane +catstep +catstick +catstitch +catstitcher +catstone +catsup +catsups +cattabu +cattail +cattails +cattalo +cattaloes +cattalos +cattan +catted +catter +cattery +catteries +catti +catty +cattycorner +cattycornered +cattie +cattier +catties +cattiest +cattily +cattyman +cattimandoo +cattiness +catting +cattyphoid +cattish +cattishly +cattishness +cattle +cattlebush +cattlefold +cattlegate +cattlehide +cattleya +cattleyak +cattleyas +cattleless +cattleman +cattlemen +cattleship +catullian +catur +catvine +catwalk +catwalks +catwise +catwood +catwort +catzerie +caubeen +cauboge +caucasian +caucasians +caucasic +caucasoid +caucasoids +caucasus +cauch +cauchemar +cauchillo +caucho +caucus +caucused +caucuses +caucusing +caucussed +caucusses +caucussing +cauda +caudad +caudae +caudaite +caudal +caudally +caudalward +caudata +caudate +caudated +caudation +caudatolenticular +caudatory +caudatum +caudebeck +caudex +caudexes +caudices +caudicle +caudiform +caudillism +caudillo +caudillos +caudle +caudles +caudocephalad +caudodorsal +caudofemoral +caudolateral +caudotibial +caudotibialis +cauf +caufle +caughnawaga +caught +cauk +cauked +cauking +caul +cauld +cauldrife +cauldrifeness +cauldron +cauldrons +caulds +caulerpa +caulerpaceae +caulerpaceous +caules +caulescent +cauli +caulicle +caulicles +caulicole +caulicolous +caulicule +cauliculi +cauliculus +cauliferous +cauliflory +cauliflorous +cauliflower +cauliflowers +cauliform +cauligenous +caulinar +caulinary +cauline +caulis +caulite +caulivorous +caulk +caulked +caulker +caulkers +caulking +caulkings +caulks +caulocarpic +caulocarpous +caulome +caulomer +caulomic +caulophylline +caulophyllum +caulopteris +caulosarc +caulotaxy +caulotaxis +caulote +cauls +caum +cauma +caumatic +caunch +caunos +caunter +caunus +caup +caupo +cauponate +cauponation +caupones +cauponize +cauqui +caurale +caurus +caus +causa +causability +causable +causae +causal +causalgia +causality +causalities +causally +causals +causans +causata +causate +causation +causational +causationism +causationist +causations +causative +causatively +causativeness +causativity +causator +causatum +cause +caused +causeful +causey +causeys +causeless +causelessly +causelessness +causer +causerie +causeries +causers +causes +causeur +causeuse +causeuses +causeway +causewayed +causewaying +causewayman +causeways +causidical +causing +causingness +causon +causse +causson +caustic +caustical +caustically +causticiser +causticism +causticity +causticization +causticize +causticized +causticizer +causticizing +causticly +causticness +caustics +caustify +caustification +caustified +caustifying +causus +cautel +cautela +cautelous +cautelously +cautelousness +cauter +cauterant +cautery +cauteries +cauterisation +cauterise +cauterised +cauterising +cauterism +cauterization +cauterize +cauterized +cauterizer +cauterizes +cauterizing +cautio +caution +cautionary +cautionaries +cautioned +cautioner +cautioners +cautiones +cautioning +cautionings +cautionry +cautions +cautious +cautiously +cautiousness +cautivo +cav +cava +cavae +cavaedia +cavaedium +cavayard +caval +cavalcade +cavalcaded +cavalcades +cavalcading +cavalero +cavaleros +cavalier +cavaliere +cavaliered +cavalieres +cavalieri +cavaliering +cavalierish +cavalierishness +cavalierism +cavalierly +cavalierness +cavaliero +cavaliers +cavaliership +cavalla +cavallas +cavally +cavallies +cavalry +cavalries +cavalryman +cavalrymen +cavascope +cavate +cavated +cavatina +cavatinas +cavatine +cavdia +cave +cavea +caveae +caveat +caveated +caveatee +caveating +caveator +caveators +caveats +caved +cavefish +cavefishes +cavey +cavekeeper +cavel +cavelet +cavelike +caveman +cavemen +cavendish +caver +cavern +cavernal +caverned +cavernicolous +caverning +cavernitis +cavernlike +cavernoma +cavernous +cavernously +caverns +cavernulous +cavers +caves +cavesson +cavetti +cavetto +cavettos +cavy +cavia +caviar +caviare +caviares +caviars +cavicorn +cavicornia +cavidae +cavie +cavies +caviya +cavyyard +cavil +caviled +caviler +cavilers +caviling +cavilingly +cavilingness +cavillation +cavillatory +cavilled +caviller +cavillers +cavilling +cavillingly +cavillingness +cavillous +cavils +cavin +cavina +caving +cavings +cavish +cavitary +cavitate +cavitated +cavitates +cavitating +cavitation +cavitations +caviteno +cavity +cavitied +cavities +cavort +cavorted +cavorter +cavorters +cavorting +cavorts +cavu +cavum +cavus +caw +cawed +cawing +cawk +cawker +cawky +cawl +cawney +cawny +cawnie +cawquaw +caws +caxiri +caxon +caxton +caxtonian +caza +cazibi +cazimi +cazique +caziques +cb +cc +ccesser +cchaddoorck +ccid +ccitt +cckw +ccm +ccoya +ccw +ccws +cd +cdf +cdg +cdr +ce +ceanothus +cearin +cease +ceased +ceaseless +ceaselessly +ceaselessness +ceases +ceasing +ceasmic +cebalrai +cebatha +cebell +cebian +cebid +cebidae +cebids +cebil +cebine +ceboid +ceboids +cebollite +cebur +cebus +ceca +cecal +cecally +cecca +cecchine +cecidiology +cecidiologist +cecidium +cecidogenous +cecidology +cecidologist +cecidomyian +cecidomyiid +cecidomyiidae +cecidomyiidous +cecil +cecile +cecily +cecilia +cecilite +cecils +cecity +cecitis +cecograph +cecomorphae +cecomorphic +cecopexy +cecostomy +cecotomy +cecropia +cecrops +cecum +cecums +cecutiency +cedar +cedarbird +cedared +cedary +cedarn +cedars +cedarware +cedarwood +cede +ceded +cedens +cedent +ceder +ceders +cedes +cedi +cedilla +cedillas +ceding +cedis +cedrat +cedrate +cedre +cedrela +cedrene +cedry +cedric +cedrin +cedrine +cedriret +cedrium +cedrol +cedron +cedrus +cedula +cedulas +cedule +ceduous +cee +ceennacuelum +cees +ceiba +ceibas +ceibo +ceibos +ceil +ceylanite +ceile +ceiled +ceiler +ceilers +ceilidh +ceilidhe +ceiling +ceilinged +ceilings +ceilingward +ceilingwards +ceilometer +ceylon +ceylonese +ceylonite +ceils +ceint +ceinte +ceinture +ceintures +ceyssatite +ceyx +ceja +celadon +celadonite +celadons +celaeno +celandine +celandines +celanese +celarent +celastraceae +celastraceous +celastrus +celation +celative +celature +cele +celeb +celebe +celebes +celebesian +celebrant +celebrants +celebrate +celebrated +celebratedly +celebratedness +celebrater +celebrates +celebrating +celebration +celebrationis +celebrations +celebrative +celebrator +celebratory +celebrators +celebre +celebres +celebret +celebrious +celebrity +celebrities +celebs +celemin +celemines +celeomorph +celeomorphae +celeomorphic +celery +celeriac +celeriacs +celeries +celerity +celerities +celesta +celestas +celeste +celestes +celestial +celestiality +celestialize +celestialized +celestially +celestialness +celestify +celestina +celestine +celestinian +celestite +celestitude +celeusma +celia +celiac +celiadelphus +celiagra +celialgia +celibacy +celibacies +celibataire +celibatarian +celibate +celibates +celibatic +celibatist +celibatory +celidographer +celidography +celiectasia +celiectomy +celiemia +celiitis +celiocele +celiocentesis +celiocyesis +celiocolpotomy +celiodynia +celioelytrotomy +celioenterotomy +celiogastrotomy +celiohysterotomy +celiolymph +celiomyalgia +celiomyodynia +celiomyomectomy +celiomyomotomy +celiomyositis +celioncus +celioparacentesis +celiopyosis +celiorrhaphy +celiorrhea +celiosalpingectomy +celiosalpingotomy +celioschisis +celioscope +celioscopy +celiotomy +celiotomies +celite +cell +cella +cellae +cellager +cellar +cellarage +cellared +cellarer +cellarers +cellaress +cellaret +cellarets +cellarette +cellaring +cellarless +cellarman +cellarmen +cellarous +cellars +cellarway +cellarwoman +cellated +cellblock +cellblocks +celled +cellepora +cellepore +cellfalcicula +celli +celliferous +celliform +cellifugal +celling +cellipetal +cellist +cellists +cellite +cellmate +cellmates +cello +cellobiose +cellocut +celloid +celloidin +celloist +cellophane +cellos +cellose +cells +cellucotton +cellular +cellularity +cellularly +cellulase +cellulate +cellulated +cellulating +cellulation +cellule +cellules +cellulicidal +celluliferous +cellulifugal +cellulifugally +cellulin +cellulipetal +cellulipetally +cellulitis +cellulocutaneous +cellulofibrous +celluloid +celluloided +cellulolytic +cellulomonadeae +cellulomonas +cellulose +cellulosed +celluloses +cellulosic +cellulosing +cellulosity +cellulosities +cellulotoxic +cellulous +cellvibrio +celom +celomata +celoms +celoscope +celosia +celosias +celotex +celotomy +celotomies +celsia +celsian +celsitude +celsius +celt +celtdom +celtiberi +celtiberian +celtic +celtically +celticism +celticist +celticize +celtidaceae +celtiform +celtillyrians +celtis +celtish +celtism +celtist +celtium +celtization +celtologist +celtologue +celtomaniac +celtophil +celtophobe +celtophobia +celts +celtuce +celure +cembali +cembalist +cembalo +cembalon +cembalos +cement +cementa +cemental +cementation +cementatory +cemented +cementer +cementers +cementification +cementin +cementing +cementite +cementitious +cementless +cementlike +cementmaker +cementmaking +cementoblast +cementoma +cements +cementum +cementwork +cemetary +cemetaries +cemetery +cemeterial +cemeteries +cen +cenacle +cenacles +cenaculum +cenanthy +cenanthous +cenation +cenatory +cencerro +cencerros +cenchrus +cendre +cene +cenesthesia +cenesthesis +cenesthetic +cenizo +cenobe +cenoby +cenobian +cenobies +cenobite +cenobites +cenobitic +cenobitical +cenobitically +cenobitism +cenobium +cenogamy +cenogenesis +cenogenetic +cenogenetically +cenogonous +cenomanian +cenosite +cenosity +cenospecies +cenospecific +cenospecifically +cenotaph +cenotaphy +cenotaphic +cenotaphies +cenotaphs +cenote +cenotes +cenozoic +cenozoology +cense +censed +censer +censerless +censers +censes +censing +censitaire +censive +censor +censorable +censorate +censored +censorial +censorian +censoring +censorious +censoriously +censoriousness +censors +censorship +censual +censurability +censurable +censurableness +censurably +censure +censured +censureless +censurer +censurers +censures +censureship +censuring +census +censused +censuses +censusing +cent +centage +centai +cental +centals +centare +centares +centas +centaur +centaurdom +centaurea +centauress +centauri +centaury +centaurial +centaurian +centauric +centaurid +centauridium +centauries +centaurium +centauromachy +centauromachia +centaurs +centaurus +centavo +centavos +centena +centenar +centenary +centenarian +centenarianism +centenarians +centenaries +centenier +centenionales +centenionalis +centennia +centennial +centennially +centennials +centennium +center +centerable +centerboard +centerboards +centered +centeredly +centeredness +centerer +centerfold +centerfolds +centering +centerless +centerline +centermost +centerpiece +centerpieces +centerpunch +centers +centervelic +centerward +centerwise +centeses +centesimal +centesimally +centesimate +centesimation +centesimi +centesimo +centesimos +centesis +centesm +centetes +centetid +centetidae +centgener +centgrave +centi +centiar +centiare +centiares +centibar +centiday +centifolious +centigrade +centigrado +centigram +centigramme +centigrams +centile +centiles +centiliter +centiliters +centilitre +centillion +centillions +centillionth +centiloquy +centime +centimes +centimeter +centimeters +centimetre +centimetres +centimo +centimolar +centimos +centinel +centinody +centinormal +centipedal +centipede +centipedes +centiplume +centipoise +centistere +centistoke +centner +centners +cento +centon +centones +centonical +centonism +centonization +centos +centra +centrad +central +centrale +centraler +centrales +centralest +centralia +centralisation +centralise +centralised +centraliser +centralising +centralism +centralist +centralistic +centralists +centrality +centralities +centralization +centralize +centralized +centralizer +centralizers +centralizes +centralizing +centrally +centralness +centrals +centranth +centranthus +centrarchid +centrarchidae +centrarchoid +centration +centraxonia +centraxonial +centre +centreboard +centrechinoida +centred +centref +centrefold +centreless +centremost +centrepiece +centrer +centres +centrev +centrex +centry +centric +centricae +centrical +centricality +centrically +centricalness +centricipital +centriciput +centricity +centriffed +centrifugal +centrifugalisation +centrifugalise +centrifugalization +centrifugalize +centrifugalized +centrifugalizing +centrifugaller +centrifugally +centrifugate +centrifugation +centrifuge +centrifuged +centrifugence +centrifuges +centrifuging +centring +centrings +centriole +centripetal +centripetalism +centripetally +centripetence +centripetency +centriscid +centriscidae +centrisciform +centriscoid +centriscus +centrism +centrisms +centrist +centrists +centro +centroacinar +centrobaric +centrobarical +centroclinal +centrode +centrodesmose +centrodesmus +centrodorsal +centrodorsally +centroid +centroidal +centroids +centrolecithal +centrolepidaceae +centrolepidaceous +centrolinead +centrolineal +centromere +centromeric +centronote +centronucleus +centroplasm +centropomidae +centropomus +centrosema +centrosymmetry +centrosymmetric +centrosymmetrical +centrosoyus +centrosome +centrosomic +centrospermae +centrosphere +centrotus +centrum +centrums +centrutra +cents +centum +centums +centumvir +centumviral +centumvirate +centunculus +centuple +centupled +centuples +centuply +centuplicate +centuplicated +centuplicating +centuplication +centupling +centure +century +centuria +centurial +centuriate +centuriation +centuriator +centuried +centuries +centurion +centurions +centurist +ceonocyte +ceorl +ceorlish +ceorls +cep +cepa +cepaceous +cepe +cepes +cephadia +cephaeline +cephaelis +cephala +cephalacanthidae +cephalacanthus +cephalad +cephalagra +cephalalgy +cephalalgia +cephalalgic +cephalanthium +cephalanthous +cephalanthus +cephalaspis +cephalata +cephalate +cephaldemae +cephalemia +cephaletron +cephaleuros +cephalexin +cephalhematoma +cephalhydrocele +cephalic +cephalically +cephalin +cephalina +cephaline +cephalins +cephalism +cephalitis +cephalization +cephaloauricular +cephalob +cephalobranchiata +cephalobranchiate +cephalocathartic +cephalocaudal +cephalocele +cephalocentesis +cephalocercal +cephalocereus +cephalochord +cephalochorda +cephalochordal +cephalochordata +cephalochordate +cephalocyst +cephaloclasia +cephaloclast +cephalocone +cephaloconic +cephalodia +cephalodymia +cephalodymus +cephalodynia +cephalodiscid +cephalodiscida +cephalodiscus +cephalodium +cephalofacial +cephalogenesis +cephalogram +cephalograph +cephalohumeral +cephalohumeralis +cephaloid +cephalology +cephalom +cephalomancy +cephalomant +cephalomelus +cephalomenia +cephalomeningitis +cephalomere +cephalometer +cephalometry +cephalometric +cephalomyitis +cephalomotor +cephalon +cephalonasal +cephalopagus +cephalopathy +cephalopharyngeal +cephalophyma +cephalophine +cephalophorous +cephalophus +cephaloplegia +cephaloplegic +cephalopod +cephalopoda +cephalopodan +cephalopodic +cephalopodous +cephalopterus +cephalorachidian +cephalorhachidian +cephaloridine +cephalosome +cephalospinal +cephalosporin +cephalosporium +cephalostyle +cephalotaceae +cephalotaceous +cephalotaxus +cephalotheca +cephalothecal +cephalothoraces +cephalothoracic +cephalothoracopagus +cephalothorax +cephalothoraxes +cephalotome +cephalotomy +cephalotractor +cephalotribe +cephalotripsy +cephalotrocha +cephalotus +cephalous +cephas +cepheid +cepheids +cephen +cepheus +cephid +cephidae +cephus +cepolidae +cepous +ceps +cepter +ceptor +cequi +cera +ceraceous +cerago +ceral +ceramal +ceramals +cerambycid +cerambycidae +ceramiaceae +ceramiaceous +ceramic +ceramicist +ceramicists +ceramicite +ceramics +ceramidium +ceramist +ceramists +ceramium +ceramography +ceramographic +cerargyrite +ceras +cerasein +cerasin +cerastes +cerastium +cerasus +cerat +cerata +cerate +ceratectomy +cerated +cerates +ceratiasis +ceratiid +ceratiidae +ceratin +ceratinous +ceratins +ceratioid +ceration +ceratite +ceratites +ceratitic +ceratitidae +ceratitis +ceratitoid +ceratitoidea +ceratium +ceratobatrachinae +ceratoblast +ceratobranchial +ceratocystis +ceratocricoid +ceratodidae +ceratodontidae +ceratodus +ceratoduses +ceratofibrous +ceratoglossal +ceratoglossus +ceratohyal +ceratohyoid +ceratoid +ceratomandibular +ceratomania +ceratonia +ceratophyllaceae +ceratophyllaceous +ceratophyllum +ceratophyta +ceratophyte +ceratophrys +ceratops +ceratopsia +ceratopsian +ceratopsid +ceratopsidae +ceratopteridaceae +ceratopteridaceous +ceratopteris +ceratorhine +ceratosa +ceratosaurus +ceratospongiae +ceratospongian +ceratostomataceae +ceratostomella +ceratotheca +ceratothecae +ceratothecal +ceratozamia +ceraunia +ceraunics +ceraunite +ceraunogram +ceraunograph +ceraunomancy +ceraunophone +ceraunoscope +ceraunoscopy +cerberean +cerberic +cerberus +cercal +cercaria +cercariae +cercarial +cercarian +cercarias +cercariform +cercelee +cerci +cercidiphyllaceae +cercis +cercises +cercle +cercocebus +cercolabes +cercolabidae +cercomonad +cercomonadidae +cercomonas +cercopid +cercopidae +cercopithecid +cercopithecidae +cercopithecoid +cercopithecus +cercopod +cercospora +cercosporella +cercus +cerdonian +cere +cereal +cerealian +cerealin +cerealism +cerealist +cerealose +cereals +cerebbella +cerebella +cerebellar +cerebellifugal +cerebellipetal +cerebellitis +cerebellocortex +cerebellopontile +cerebellopontine +cerebellorubral +cerebellospinal +cerebellum +cerebellums +cerebra +cerebral +cerebralgia +cerebralism +cerebralist +cerebralization +cerebralize +cerebrally +cerebrals +cerebrasthenia +cerebrasthenic +cerebrate +cerebrated +cerebrates +cerebrating +cerebration +cerebrational +cerebrations +cerebratulus +cerebri +cerebric +cerebricity +cerebriform +cerebriformly +cerebrifugal +cerebrin +cerebripetal +cerebritis +cerebrize +cerebrocardiac +cerebrogalactose +cerebroganglion +cerebroganglionic +cerebroid +cerebrology +cerebroma +cerebromalacia +cerebromedullary +cerebromeningeal +cerebromeningitis +cerebrometer +cerebron +cerebronic +cerebroparietal +cerebropathy +cerebropedal +cerebrophysiology +cerebropontile +cerebropsychosis +cerebrorachidian +cerebrosclerosis +cerebroscope +cerebroscopy +cerebrose +cerebrosensorial +cerebroside +cerebrosis +cerebrospinal +cerebrospinant +cerebrosuria +cerebrotomy +cerebrotonia +cerebrotonic +cerebrovascular +cerebrovisceral +cerebrum +cerebrums +cerecloth +cerecloths +cered +cereless +cerement +cerements +ceremony +ceremonial +ceremonialism +ceremonialist +ceremonialists +ceremonialize +ceremonially +ceremonialness +ceremonials +ceremoniary +ceremonies +ceremonious +ceremoniously +ceremoniousness +cerenkov +cereous +cerer +cererite +ceres +ceresin +ceresine +cereus +cereuses +cerevis +cerevisial +cereza +cerfoil +ceria +cerialia +cerianthid +cerianthidae +cerianthoid +cerianthus +cerias +ceric +ceride +ceriferous +cerigerous +ceryl +cerilla +cerillo +ceriman +cerimans +cerin +cerine +cerynean +cering +cerinthe +cerinthian +ceriomyces +cerion +cerionidae +ceriops +ceriornis +ceriph +ceriphs +cerise +cerises +cerite +cerites +cerithiidae +cerithioid +cerithium +cerium +ceriums +cermet +cermets +cern +cerned +cerning +cerniture +cernuous +cero +cerograph +cerographer +cerography +cerographic +cerographical +cerographies +cerographist +ceroid +ceroline +cerolite +ceroma +ceromancy +ceromez +ceroon +cerophilous +ceroplast +ceroplasty +ceroplastic +ceroplastics +ceros +cerosin +cerotate +cerote +cerotene +cerotic +cerotin +cerotype +cerotypes +cerous +ceroxyle +ceroxylon +cerrero +cerrial +cerris +cert +certain +certainer +certainest +certainly +certainness +certainty +certainties +certes +certhia +certhiidae +certy +certie +certif +certify +certifiability +certifiable +certifiableness +certifiably +certificate +certificated +certificates +certificating +certification +certifications +certificative +certificator +certificatory +certified +certifier +certifiers +certifies +certifying +certiorari +certiorate +certiorating +certioration +certis +certitude +certitudes +certosa +certose +certosina +certosino +cerule +cerulean +ceruleans +cerulein +ceruleite +ceruleolactite +ceruleous +cerulescent +ceruleum +cerulific +cerulignol +cerulignone +ceruloplasmin +cerumen +cerumens +ceruminal +ceruminiferous +ceruminous +cerumniparous +ceruse +ceruses +cerusite +cerusites +cerussite +cervalet +cervantes +cervantic +cervantist +cervantite +cervelas +cervelases +cervelat +cervelats +cerveliere +cervelliere +cervical +cervicapra +cervicaprine +cervicectomy +cervices +cervicicardiac +cervicide +cerviciplex +cervicispinal +cervicitis +cervicoauricular +cervicoaxillary +cervicobasilar +cervicobrachial +cervicobregmatic +cervicobuccal +cervicodynia +cervicodorsal +cervicofacial +cervicohumeral +cervicolabial +cervicolingual +cervicolumbar +cervicomuscular +cerviconasal +cervicorn +cervicoscapular +cervicothoracic +cervicovaginal +cervicovesical +cervid +cervidae +cervinae +cervine +cervisia +cervisial +cervix +cervixes +cervoid +cervuline +cervulus +cervus +cesar +cesare +cesarean +cesareans +cesarevitch +cesarian +cesarians +cesarolite +cesious +cesium +cesiums +cespititious +cespititous +cespitose +cespitosely +cespitulose +cess +cessant +cessantly +cessation +cessations +cessative +cessavit +cessed +cesser +cesses +cessible +cessing +cessio +cession +cessionaire +cessionary +cessionaries +cessionee +cessions +cessment +cessor +cesspipe +cesspit +cesspits +cesspool +cesspools +cest +cesta +cestas +ceste +cesti +cestida +cestidae +cestoda +cestodaria +cestode +cestodes +cestoi +cestoid +cestoidea +cestoidean +cestoids +ceston +cestos +cestracion +cestraciont +cestraciontes +cestraciontidae +cestraction +cestrian +cestrum +cestui +cestuy +cestus +cestuses +cesura +cesurae +cesural +cesuras +cesure +cetacea +cetacean +cetaceans +cetaceous +cetaceum +cetane +cetanes +cete +cetene +ceteosaur +cetera +ceterach +cetes +ceti +cetic +ceticide +cetid +cetyl +cetylene +cetylic +cetin +cetiosauria +cetiosaurian +cetiosaurus +cetology +cetological +cetologies +cetologist +cetomorpha +cetomorphic +cetonia +cetonian +cetoniides +cetoniinae +cetorhinid +cetorhinidae +cetorhinoid +cetorhinus +cetotolite +cetraria +cetraric +cetrarin +cetus +cevadilla +cevadilline +cevadine +cevennian +cevenol +cevenole +cevian +ceviche +ceviches +cevine +cevitamic +cezannesque +cf +cfd +cfh +cfi +cfm +cfs +cg +cgm +cgs +ch +cha +chaa +chab +chabasie +chabasite +chabazite +chaber +chablis +chabot +chabouk +chabouks +chabuk +chabuks +chabutra +chac +chacate +chaccon +chace +chachalaca +chachalakas +chachapuya +chack +chackchiuma +chacker +chackle +chackled +chackler +chackling +chacma +chacmas +chaco +chacoli +chacona +chaconne +chaconnes +chacra +chacte +chacun +chad +chadacryst +chadar +chadarim +chadars +chadelle +chadless +chadlock +chador +chadors +chadri +chads +chaenactis +chaenolobus +chaenomeles +chaeta +chaetae +chaetal +chaetangiaceae +chaetangium +chaetetes +chaetetidae +chaetifera +chaetiferous +chaetites +chaetitidae +chaetochloa +chaetodon +chaetodont +chaetodontid +chaetodontidae +chaetognath +chaetognatha +chaetognathan +chaetognathous +chaetophobia +chaetophora +chaetophoraceae +chaetophoraceous +chaetophorales +chaetophorous +chaetopod +chaetopoda +chaetopodan +chaetopodous +chaetopterin +chaetopterus +chaetosema +chaetosoma +chaetosomatidae +chaetosomidae +chaetotactic +chaetotaxy +chaetura +chafe +chafed +chafer +chafery +chaferies +chafers +chafes +chafewax +chafeweed +chaff +chaffcutter +chaffed +chaffer +chaffered +chafferer +chafferers +chaffery +chaffering +chaffers +chaffy +chaffier +chaffiest +chaffinch +chaffinches +chaffiness +chaffing +chaffingly +chaffless +chafflike +chaffman +chaffron +chaffs +chaffseed +chaffwax +chaffweed +chafing +chaft +chafted +chaga +chagal +chagan +chagga +chagigah +chagoma +chagrin +chagrined +chagrining +chagrinned +chagrinning +chagrins +chaguar +chagul +chahar +chahars +chai +chay +chaya +chayaroot +chailletiaceae +chayma +chain +chainage +chainbearer +chainbreak +chaine +chained +chainer +chaines +chainette +chaining +chainless +chainlet +chainlike +chainmaker +chainmaking +chainman +chainmen +chainomatic +chainon +chainplate +chains +chainsman +chainsmen +chainsmith +chainstitch +chainwale +chainwork +chayota +chayote +chayotes +chair +chairborne +chaired +chairer +chairing +chairlady +chairladies +chairless +chairlift +chairmaker +chairmaking +chairman +chairmaned +chairmaning +chairmanned +chairmanning +chairmans +chairmanship +chairmanships +chairmen +chairmender +chairmending +chayroot +chairperson +chairpersons +chairs +chairway +chairwarmer +chairwoman +chairwomen +chais +chays +chaise +chaiseless +chaises +chait +chaitya +chaityas +chaitra +chaja +chaka +chakar +chakari +chakavski +chakazi +chakdar +chakobu +chakra +chakram +chakras +chakravartin +chaksi +chal +chalaco +chalah +chalahs +chalana +chalastic +chalastogastra +chalaza +chalazae +chalazal +chalazas +chalaze +chalazia +chalazian +chalaziferous +chalazion +chalazium +chalazogam +chalazogamy +chalazogamic +chalazoidite +chalazoin +chalcanth +chalcanthite +chalcedony +chalcedonian +chalcedonic +chalcedonies +chalcedonyx +chalcedonous +chalchihuitl +chalchuite +chalcid +chalcidian +chalcidic +chalcidica +chalcidicum +chalcidid +chalcididae +chalcidiform +chalcidoid +chalcidoidea +chalcids +chalcioecus +chalcis +chalcites +chalcocite +chalcogen +chalcogenide +chalcograph +chalcographer +chalcography +chalcographic +chalcographical +chalcographist +chalcolite +chalcolithic +chalcomancy +chalcomenite +chalcon +chalcone +chalcophanite +chalcophile +chalcophyllite +chalcopyrite +chalcosiderite +chalcosine +chalcostibite +chalcotrichite +chalcotript +chalcus +chaldaei +chaldaic +chaldaical +chaldaism +chaldean +chaldee +chalder +chaldese +chaldron +chaldrons +chaleh +chalehs +chalet +chalets +chalybean +chalybeate +chalybeous +chalybes +chalybite +chalice +chaliced +chalices +chalicosis +chalicothere +chalicotheriid +chalicotheriidae +chalicotherioid +chalicotherium +chalina +chalinidae +chalinine +chalinitis +chalk +chalkboard +chalkboards +chalkcutter +chalked +chalker +chalky +chalkier +chalkiest +chalkiness +chalking +chalklike +chalkline +chalkography +chalkone +chalkos +chalkosideric +chalkotheke +chalkpit +chalkrail +chalks +chalkstone +chalkstony +chalkworker +challa +challah +challahs +challas +challengable +challenge +challengeable +challenged +challengee +challengeful +challenger +challengers +challenges +challenging +challengingly +chally +challie +challies +challiho +challihos +challis +challises +challot +challote +challoth +chalmer +chalon +chalone +chalones +chalons +chalot +chaloth +chaloupe +chalque +chalta +chaluka +chalukya +chalukyan +chalumeau +chalumeaux +chalutz +chalutzim +cham +chama +chamacea +chamacoco +chamade +chamades +chamaebatia +chamaecyparis +chamaecistus +chamaecranial +chamaecrista +chamaedaphne +chamaeleo +chamaeleon +chamaeleontidae +chamaelirium +chamaenerion +chamaepericlymenum +chamaephyte +chamaeprosopic +chamaerops +chamaerrhine +chamaesaura +chamaesyce +chamaesiphon +chamaesiphonaceae +chamaesiphonaceous +chamaesiphonales +chamal +chamar +chambellan +chamber +chamberdeacon +chambered +chamberer +chamberfellow +chambering +chamberlain +chamberlainry +chamberlains +chamberlainship +chamberlet +chamberleted +chamberletted +chambermaid +chambermaids +chambers +chambertin +chamberwoman +chambioa +chambray +chambrays +chambranle +chambre +chambrel +chambul +chamecephaly +chamecephalic +chamecephalous +chamecephalus +chameleon +chameleonic +chameleonize +chameleonlike +chameleons +chametz +chamfer +chamfered +chamferer +chamfering +chamfers +chamfrain +chamfron +chamfrons +chamian +chamicuro +chamidae +chamisal +chamise +chamises +chamiso +chamisos +chamite +chamkanni +chamlet +chamm +chamma +chammy +chammied +chammies +chammying +chamois +chamoised +chamoises +chamoisette +chamoising +chamoisite +chamoix +chamoline +chamomile +chamomilla +chamorro +chamos +chamosite +chamotte +champ +champa +champac +champaca +champacol +champacs +champagne +champagned +champagneless +champagnes +champagning +champagnize +champagnized +champagnizing +champaign +champain +champak +champaka +champaks +champart +champe +champed +champer +champerator +champers +champert +champerty +champerties +champertor +champertous +champy +champian +champignon +champignons +champine +champing +champion +championed +championess +championing +championize +championless +championlike +champions +championship +championships +champlain +champlainic +champlev +champleve +champs +chams +chamsin +chan +chanabal +chanca +chance +chanceable +chanceably +chanced +chanceful +chancefully +chancefulness +chancey +chancel +chanceled +chanceless +chancelled +chancellery +chancelleries +chancellor +chancellorate +chancelloress +chancellory +chancellorism +chancellors +chancellorship +chancellorships +chancelor +chancelry +chancels +chanceman +chancemen +chancer +chancered +chancery +chanceries +chancering +chances +chancewise +chanche +chanchito +chancy +chancier +chanciest +chancily +chanciness +chancing +chancito +chanco +chancre +chancres +chancriform +chancroid +chancroidal +chancroids +chancrous +chandala +chandam +chandelier +chandeliers +chandelle +chandelled +chandelles +chandelling +chandi +chandler +chandleress +chandlery +chandleries +chandlering +chandlerly +chandlers +chandoo +chandrakanta +chandrakhi +chandry +chandu +chandui +chanduy +chandul +chane +chaneled +chaneling +chanelled +chanfrin +chanfron +chanfrons +chang +changa +changable +changar +change +changeability +changeable +changeableness +changeably +changeabout +changed +changedale +changedness +changeful +changefully +changefulness +changeless +changelessly +changelessness +changeling +changelings +changemaker +changement +changeover +changeovers +changepocket +changer +changers +changes +changing +changoan +changos +changs +changuina +changuinan +chanidae +chank +chankings +channel +channelbill +channeled +channeler +channeling +channelization +channelize +channelized +channelizes +channelizing +channelled +channeller +channellers +channelly +channelling +channels +channelure +channelwards +channer +chanoyu +chanson +chansonette +chansonnette +chansonnier +chansonniers +chansons +chanst +chant +chantable +chantage +chantages +chantant +chantecler +chanted +chantefable +chantey +chanteyman +chanteys +chantepleure +chanter +chanterelle +chanters +chantership +chanteur +chanteuse +chanteuses +chanty +chanticleer +chanticleers +chantier +chanties +chantilly +chanting +chantingly +chantlate +chantment +chantor +chantors +chantress +chantry +chantries +chants +chanukah +chao +chaogenous +chaology +chaori +chaos +chaoses +chaotic +chaotical +chaotically +chaoticness +chaoua +chaouia +chaoush +chap +chapacura +chapacuran +chapah +chapanec +chapapote +chaparajos +chaparejos +chaparral +chaparrals +chaparraz +chaparro +chapati +chapaties +chapatis +chapatti +chapatty +chapatties +chapattis +chapbook +chapbooks +chape +chapeau +chapeaus +chapeaux +chaped +chapel +chapeled +chapeless +chapelet +chapelgoer +chapelgoing +chapeling +chapelize +chapellage +chapellany +chapelled +chapelling +chapelman +chapelmaster +chapelry +chapelries +chapels +chapelward +chaperno +chaperon +chaperonage +chaperone +chaperoned +chaperoning +chaperonless +chaperons +chapes +chapfallen +chapfallenly +chapin +chapiter +chapiters +chapitle +chapitral +chaplain +chaplaincy +chaplaincies +chaplainry +chaplains +chaplainship +chaplanry +chapless +chaplet +chapleted +chaplets +chaplin +chapman +chapmanship +chapmen +chapon +chapote +chapourn +chapournet +chapournetted +chappal +chappaul +chappe +chapped +chapper +chappy +chappie +chappies +chappin +chapping +chappow +chaprasi +chaprassi +chaps +chapstick +chapt +chaptalization +chaptalize +chaptalized +chaptalizing +chapter +chapteral +chaptered +chapterful +chapterhouse +chaptering +chapters +chaptrel +chapwoman +chaqueta +chaquetas +char +chara +charabanc +charabancer +charabancs +charac +characeae +characeous +characetum +characid +characids +characin +characine +characinid +characinidae +characinoid +characins +charact +character +charactered +characterful +charactery +characterial +characterical +characteries +charactering +characterisable +characterisation +characterise +characterised +characteriser +characterising +characterism +characterist +characteristic +characteristical +characteristically +characteristicalness +characteristicness +characteristics +characterizable +characterization +characterizations +characterize +characterized +characterizer +characterizers +characterizes +characterizing +characterless +characterlessness +characterology +characterological +characterologically +characterologist +characters +characterstring +charactonym +charade +charades +charadrii +charadriidae +charadriiform +charadriiformes +charadrine +charadrioid +charadriomorphae +charadrius +charales +charango +charangos +chararas +charas +charases +charbocle +charbon +charbonnier +charbroil +charbroiled +charbroiling +charbroils +charca +charcia +charco +charcoal +charcoaled +charcoaly +charcoaling +charcoalist +charcoals +charcuterie +charcuteries +charcutier +charcutiers +chard +chardock +chards +chare +chared +charely +charer +chares +charet +chareter +charette +chargable +charge +chargeability +chargeable +chargeableness +chargeably +chargeant +charged +chargedness +chargee +chargeful +chargehouse +chargeless +chargeling +chargeman +charger +chargers +charges +chargeship +chargfaires +charging +chary +charybdian +charybdis +charicleia +charier +chariest +charily +chariness +charing +chariot +charioted +chariotee +charioteer +charioteers +charioteership +charioting +chariotlike +chariotman +chariotry +chariots +chariotway +charism +charisma +charismas +charismata +charismatic +charisms +charissa +charisticary +charitable +charitableness +charitably +charitative +charites +charity +charities +charityless +charivan +charivari +charivaried +charivariing +charivaris +chark +charka +charkas +charked +charkha +charkhana +charkhas +charking +charks +charlady +charladies +charlatan +charlatanic +charlatanical +charlatanically +charlatanish +charlatanism +charlatanistic +charlatanry +charlatanries +charlatans +charlatanship +charleen +charley +charleys +charlemagne +charlene +charles +charleston +charlestons +charlesworth +charlet +charlie +charlies +charlock +charlocks +charlotte +charlottesville +charm +charmed +charmedly +charmel +charmer +charmers +charmeuse +charmful +charmfully +charmfulness +charming +charminger +charmingest +charmingly +charmingness +charmless +charmlessly +charmonium +charms +charmwise +charneco +charnel +charnels +charnockite +charnockites +charnu +charon +charonian +charonic +charontas +charophyta +charoses +charoset +charoseth +charpai +charpais +charpie +charpit +charpoy +charpoys +charque +charqued +charqui +charquid +charquis +charr +charras +charre +charred +charrette +charry +charrier +charriest +charring +charro +charros +charrs +charruan +charruas +chars +charshaf +charsingha +chart +charta +chartable +chartaceous +chartae +charted +charter +charterable +charterage +chartered +charterer +charterers +charterhouse +chartering +charterism +charterist +charterless +chartermaster +charters +charthouse +charting +chartings +chartism +chartist +chartists +chartless +chartlet +chartographer +chartography +chartographic +chartographical +chartographically +chartographist +chartology +chartometer +chartophylacia +chartophylacium +chartophylax +chartophylaxes +chartreuse +chartreux +chartroom +charts +chartula +chartulae +chartulary +chartularies +chartulas +charuk +charvet +charwoman +charwomen +chasable +chase +chaseable +chased +chaser +chasers +chases +chashitsu +chasid +chasidim +chasing +chasings +chasm +chasma +chasmal +chasmed +chasmy +chasmic +chasmogamy +chasmogamic +chasmogamous +chasmophyte +chasms +chass +chasse +chassed +chasseing +chasselas +chassepot +chassepots +chasses +chasseur +chasseurs +chassignite +chassis +chastacosta +chaste +chastelain +chastely +chasten +chastened +chastener +chasteners +chasteness +chastening +chasteningly +chastenment +chastens +chaster +chastest +chasteweed +chasty +chastiment +chastisable +chastise +chastised +chastisement +chastiser +chastisers +chastises +chastising +chastity +chastities +chastize +chastizer +chasuble +chasubled +chasubles +chat +chataka +chatchka +chatchkas +chatchke +chatchkes +chateau +chateaubriand +chateaugray +chateaus +chateaux +chatelain +chatelaine +chatelaines +chatelainry +chatelains +chatelet +chatellany +chateus +chathamite +chathamites +chati +chatillon +chatino +chatoyance +chatoyancy +chatoyant +chaton +chatons +chatot +chats +chatsome +chatta +chattable +chattack +chattah +chattanooga +chattanoogan +chattation +chatted +chattel +chattelhood +chattelism +chattelization +chattelize +chattelized +chattelizing +chattels +chattelship +chatter +chatteration +chatterbag +chatterbox +chatterboxes +chattered +chatterer +chatterers +chattererz +chattery +chattering +chatteringly +chattermag +chattermagging +chatters +chattertonian +chatti +chatty +chattier +chatties +chattiest +chattily +chattiness +chatting +chattingly +chatwood +chaucer +chaucerian +chauceriana +chaucerianism +chaucerism +chauchat +chaudfroid +chaudron +chaufer +chaufers +chauffage +chauffer +chauffers +chauffeur +chauffeured +chauffeuring +chauffeurs +chauffeurship +chauffeuse +chauffeuses +chaui +chauk +chaukidari +chauldron +chaule +chauliodes +chaulmaugra +chaulmoogra +chaulmoograte +chaulmoogric +chaulmugra +chaum +chaumer +chaumiere +chaumontel +chauna +chaunoprockt +chaunt +chaunted +chaunter +chaunters +chaunting +chaunts +chauri +chaus +chausse +chaussee +chausseemeile +chaussees +chausses +chaussure +chaussures +chautauqua +chautauquan +chaute +chauth +chauve +chauvin +chauvinism +chauvinist +chauvinistic +chauvinistically +chauvinists +chavante +chavantean +chave +chavel +chavender +chaver +chavibetol +chavicin +chavicine +chavicol +chavish +chaw +chawan +chawbacon +chawbone +chawbuck +chawdron +chawed +chawer +chawers +chawia +chawing +chawk +chawl +chawle +chawn +chaws +chawstick +chazan +chazanim +chazans +chazanut +chazy +chazzan +chazzanim +chazzans +chazzanut +chazzen +chazzenim +chazzens +che +cheap +cheapen +cheapened +cheapener +cheapening +cheapens +cheaper +cheapery +cheapest +cheapie +cheapies +cheaping +cheapish +cheapishly +cheapjack +cheaply +cheapness +cheapo +cheapos +cheaps +cheapside +cheapskate +cheapskates +cheare +cheat +cheatable +cheatableness +cheated +cheatee +cheater +cheatery +cheateries +cheaters +cheating +cheatingly +cheatry +cheatrie +cheats +chebacco +chebec +chebeck +chebecs +chebel +chebog +chebule +chebulic +chebulinic +chechako +chechakos +chechehet +chechem +chechen +chechia +check +checkable +checkage +checkback +checkbird +checkbit +checkbite +checkbits +checkbook +checkbooks +checke +checked +checker +checkerbelly +checkerbellies +checkerberry +checkerberries +checkerbloom +checkerboard +checkerboarded +checkerboarding +checkerboards +checkerbreast +checkered +checkery +checkering +checkerist +checkers +checkerspot +checkerwise +checkerwork +checkhook +checky +checking +checklaton +checkle +checkless +checkline +checklist +checklists +checkman +checkmark +checkmate +checkmated +checkmates +checkmating +checkoff +checkoffs +checkout +checkouts +checkpoint +checkpointed +checkpointing +checkpoints +checkrack +checkrail +checkrein +checkroll +checkroom +checkrooms +checkrope +checkrow +checkrowed +checkrower +checkrowing +checkrows +checks +checkstone +checkstrap +checkstring +checksum +checksummed +checksumming +checksums +checkup +checkups +checkweigher +checkweighman +checkweighmen +checkwork +checkwriter +chedar +cheddar +cheddaring +cheddars +cheddite +cheddites +cheder +cheders +chedite +chedites +chedlock +chedreux +chee +cheecha +cheechaco +cheechako +cheechakos +cheeful +cheefuller +cheefullest +cheek +cheekbone +cheekbones +cheeked +cheeker +cheekful +cheekfuls +cheeky +cheekier +cheekiest +cheekily +cheekiness +cheeking +cheekish +cheekless +cheekpiece +cheeks +cheeney +cheep +cheeped +cheeper +cheepers +cheepy +cheepier +cheepiest +cheepily +cheepiness +cheeping +cheeps +cheer +cheered +cheerer +cheerers +cheerful +cheerfulize +cheerfuller +cheerfullest +cheerfully +cheerfulness +cheerfulsome +cheery +cheerier +cheeriest +cheerily +cheeriness +cheering +cheeringly +cheerio +cheerios +cheerlead +cheerleader +cheerleaders +cheerleading +cheerled +cheerless +cheerlessly +cheerlessness +cheerly +cheero +cheeros +cheers +cheese +cheeseboard +cheesebox +cheeseburger +cheeseburgers +cheesecake +cheesecakes +cheesecloth +cheesecloths +cheesecurd +cheesecutter +cheesed +cheeseflower +cheeselep +cheeselip +cheesemaker +cheesemaking +cheesemonger +cheesemongery +cheesemongering +cheesemongerly +cheeseparer +cheeseparing +cheeser +cheesery +cheeses +cheesewood +cheesy +cheesier +cheesiest +cheesily +cheesiness +cheesing +cheet +cheetah +cheetahs +cheetal +cheeter +cheetie +cheetul +cheewink +cheezit +chef +chefdom +chefdoms +chefrinia +chefs +chego +chegoe +chegoes +chegre +chehalis +cheiceral +cheyenne +cheyennes +cheilanthes +cheilion +cheilitis +cheilodipteridae +cheilodipterus +cheiloplasty +cheiloplasties +cheilostomata +cheilostomatous +cheilotomy +cheilotomies +cheimaphobia +cheimatophobia +cheyney +cheyneys +cheir +cheiragra +cheiranthus +cheirogaleus +cheiroglossa +cheirognomy +cheirography +cheirolin +cheiroline +cheirology +cheiromancy +cheiromegaly +cheiropatagium +cheiropod +cheiropody +cheiropodist +cheiropompholyx +cheiroptera +cheiropterygium +cheirosophy +cheirospasm +cheirotherium +cheka +chekan +cheke +cheken +chekhov +cheki +chekist +chekker +chekmak +chela +chelae +chelas +chelaship +chelatable +chelate +chelated +chelates +chelating +chelation +chelator +chelators +chelem +chelerythrin +chelerythrine +chelicer +chelicera +chelicerae +cheliceral +chelicerate +chelicere +chelide +chelydidae +chelidon +chelidonate +chelidonian +chelidonic +chelidonin +chelidonine +chelidonium +chelidosaurus +chelydra +chelydre +chelydridae +chelydroid +chelifer +cheliferidea +cheliferous +cheliform +chelinga +chelingas +chelingo +chelingos +cheliped +chelys +chellean +chello +chelodina +chelodine +cheloid +cheloids +chelone +chelonia +chelonian +chelonid +chelonidae +cheloniid +cheloniidae +chelonin +chelophore +chelp +cheltenham +chelura +chem +chemakuan +chemasthenia +chemawinite +chemehuevi +chemesthesis +chemiatry +chemiatric +chemiatrist +chemic +chemical +chemicalization +chemicalize +chemically +chemicals +chemick +chemicked +chemicker +chemicking +chemicoastrological +chemicobiology +chemicobiologic +chemicobiological +chemicocautery +chemicodynamic +chemicoengineering +chemicoluminescence +chemicoluminescent +chemicomechanical +chemicomineralogical +chemicopharmaceutical +chemicophysical +chemicophysics +chemicophysiological +chemicovital +chemics +chemiculture +chemigraph +chemigrapher +chemigraphy +chemigraphic +chemigraphically +chemiloon +chemiluminescence +chemiluminescent +chemin +cheminee +chemins +chemiotactic +chemiotaxic +chemiotaxis +chemiotropic +chemiotropism +chemiphotic +chemis +chemise +chemises +chemisette +chemism +chemisms +chemisorb +chemisorption +chemisorptive +chemist +chemistry +chemistries +chemists +chemitype +chemitypy +chemitypies +chemizo +chemmy +chemoautotrophy +chemoautotrophic +chemoautotrophically +chemoceptor +chemokinesis +chemokinetic +chemolysis +chemolytic +chemolyze +chemonite +chemopallidectomy +chemopallidectomies +chemopause +chemophysiology +chemophysiological +chemoprophyalctic +chemoprophylactic +chemoprophylaxis +chemoreception +chemoreceptive +chemoreceptivity +chemoreceptivities +chemoreceptor +chemoreflex +chemoresistance +chemosensitive +chemosensitivity +chemosensitivities +chemoserotherapy +chemoses +chemosynthesis +chemosynthetic +chemosynthetically +chemosis +chemosmoic +chemosmoses +chemosmosis +chemosmotic +chemosorb +chemosorption +chemosorptive +chemosphere +chemospheric +chemostat +chemosterilant +chemosterilants +chemosurgery +chemosurgical +chemotactic +chemotactically +chemotaxy +chemotaxis +chemotaxonomy +chemotaxonomic +chemotaxonomically +chemotaxonomist +chemotherapeutic +chemotherapeutical +chemotherapeutically +chemotherapeuticness +chemotherapeutics +chemotherapy +chemotherapies +chemotherapist +chemotherapists +chemotic +chemotroph +chemotrophic +chemotropic +chemotropically +chemotropism +chempaduk +chemung +chemurgy +chemurgic +chemurgical +chemurgically +chemurgies +chen +chena +chenar +chende +cheneau +cheneaus +cheneaux +cheney +chenet +chenevixite +chenfish +cheng +chengal +chenica +chenier +chenille +cheniller +chenilles +chenopod +chenopodiaceae +chenopodiaceous +chenopodiales +chenopodium +chenopods +cheongsam +cheoplastic +chepster +cheque +chequebook +chequeen +chequer +chequerboard +chequered +chequering +chequers +chequerwise +chequerwork +cheques +chequy +chequin +chequinn +cher +chera +cherchez +chercock +chere +cherely +cherem +cheremiss +cheremissian +cherenkov +chergui +cherie +cheries +cherimoya +cherimoyer +cherimolla +cherish +cherishable +cherished +cherisher +cherishers +cherishes +cherishing +cherishingly +cherishment +cherkess +cherkesser +chermes +chermidae +chermish +cherna +chernites +chernomorish +chernozem +chernozemic +cherogril +cherokee +cherokees +cheroot +cheroots +cherry +cherryblossom +cherried +cherries +cherrying +cherrylike +cherrystone +cherrystones +chersydridae +chersonese +chert +cherte +cherty +chertier +chertiest +cherts +cherub +cherubfish +cherubfishes +cherubic +cherubical +cherubically +cherubim +cherubimic +cherubimical +cherubin +cherublike +cherubs +cherup +cherusci +chervante +chervil +chervils +chervonei +chervonets +chervonetz +chervontsi +chesapeake +chesboil +chesboll +chese +cheselip +cheshire +chesil +cheskey +cheskeys +cheslep +cheson +chesoun +chess +chessart +chessboard +chessboards +chessdom +chessel +chesser +chesses +chesset +chessylite +chessist +chessman +chessmen +chessner +chessom +chesstree +chest +chested +chesteine +chester +chesterbed +chesterfield +chesterfieldian +chesterfields +chesterlite +chestful +chestfuls +chesty +chestier +chestiest +chestily +chestiness +chestnut +chestnuts +chestnutty +chests +chet +chetah +chetahs +cheth +cheths +chetif +chetive +chetopod +chetrum +chetrums +chetty +chettik +chetverik +chetvert +cheung +chevachee +chevachie +chevage +cheval +chevalet +chevalets +chevalier +chevaliers +chevaline +chevance +chevaux +cheve +chevee +cheveys +chevelure +cheven +chevener +cheventayn +cheverel +cheveret +cheveril +cheveron +cheverons +chevesaile +chevesne +chevet +chevetaine +chevy +chevied +chevies +chevying +cheville +chevin +cheviot +cheviots +chevisance +chevise +chevon +chevre +chevres +chevret +chevrette +chevreuil +chevrolet +chevrolets +chevron +chevrone +chevroned +chevronel +chevronelly +chevrony +chevronny +chevrons +chevronwise +chevrotain +chevvy +chew +chewable +chewbark +chewed +cheweler +chewer +chewers +chewet +chewy +chewie +chewier +chewiest +chewing +chewink +chewinks +chews +chewstick +chez +chg +chhatri +chi +chia +chiack +chyack +chyak +chiam +chian +chianti +chiao +chiapanec +chiapanecan +chiarooscurist +chiarooscuro +chiarooscuros +chiaroscurist +chiaroscuro +chiaroscuros +chias +chiasm +chiasma +chiasmal +chiasmas +chiasmata +chiasmatic +chiasmatype +chiasmatypy +chiasmi +chiasmic +chiasmodon +chiasmodontid +chiasmodontidae +chiasms +chiasmus +chiastic +chiastolite +chiastoneural +chiastoneury +chiastoneurous +chiaus +chiauses +chiave +chiavetta +chyazic +chiba +chibcha +chibchan +chibinite +chibol +chibouk +chibouks +chibouque +chibrit +chic +chica +chicadee +chicago +chicagoan +chicagoans +chicayote +chicalote +chicane +chicaned +chicaner +chicanery +chicaneries +chicaners +chicanes +chicaning +chicano +chicanos +chicaric +chiccory +chiccories +chicer +chicest +chich +chicha +chicharra +chichevache +chichi +chichicaste +chichili +chichimec +chichimecan +chichipate +chichipe +chichis +chichituna +chichling +chick +chickabiddy +chickadee +chickadees +chickahominy +chickamauga +chickaree +chickasaw +chickasaws +chickee +chickees +chickell +chicken +chickenberry +chickenbill +chickenbreasted +chickened +chickenhearted +chickenheartedly +chickenheartedness +chickenhood +chickening +chickenpox +chickens +chickenshit +chickenweed +chickenwort +chicker +chickery +chickhood +chicky +chickies +chickling +chickory +chickories +chickpea +chickpeas +chicks +chickstone +chickweed +chickweeds +chickwit +chicle +chiclero +chicles +chicly +chicness +chicnesses +chico +chicomecoatl +chicory +chicories +chicos +chicot +chicote +chicqued +chicquer +chicquest +chicquing +chics +chid +chidden +chide +chided +chider +chiders +chides +chiding +chidingly +chidingness +chidra +chief +chiefage +chiefdom +chiefdoms +chiefer +chiefery +chiefess +chiefest +chiefish +chiefless +chiefly +chiefling +chiefry +chiefs +chiefship +chieftain +chieftaincy +chieftaincies +chieftainess +chieftainry +chieftainries +chieftains +chieftainship +chieftainships +chieftess +chiefty +chiel +chield +chields +chiels +chien +chierete +chievance +chieve +chiffchaff +chiffer +chifferobe +chiffon +chiffonade +chiffony +chiffonier +chiffoniers +chiffonnier +chiffonnieres +chiffonniers +chiffons +chifforobe +chifforobes +chiffre +chiffrobe +chigetai +chigetais +chigga +chiggak +chigger +chiggers +chiggerweed +chignon +chignoned +chignons +chigoe +chigoes +chih +chihfu +chihuahua +chihuahuas +chikara +chikee +chil +chilacayote +chilacavote +chylaceous +chilalgia +chylangioma +chylaqueous +chilaria +chilarium +chilblain +chilblained +chilblains +chilcat +child +childage +childbear +childbearing +childbed +childbeds +childbirth +childbirths +childcrowing +childe +childed +childermas +childes +childhood +childhoods +childing +childish +childishly +childishness +childkind +childless +childlessness +childly +childlier +childliest +childlike +childlikeness +childminder +childness +childproof +childre +children +childrenite +childridden +childship +childward +childwife +childwite +chile +chyle +chilean +chileanization +chileanize +chileans +chilectropion +chylemia +chilenite +chiles +chyles +chili +chiliad +chiliadal +chiliadic +chiliadron +chiliads +chiliaedron +chiliagon +chiliahedron +chiliarch +chiliarchy +chiliarchia +chiliasm +chiliasms +chiliast +chiliastic +chiliasts +chilicote +chilicothe +chilidium +chilidog +chilidogs +chylidrosis +chilies +chylifaction +chylifactive +chylifactory +chyliferous +chylify +chylific +chylification +chylificatory +chylified +chylifying +chyliform +chilina +chilindre +chilinidae +chiliomb +chilion +chilipepper +chilitis +chilkat +chill +chilla +chillagite +chilled +chiller +chillers +chillest +chilli +chilly +chillier +chillies +chilliest +chillily +chilliness +chilling +chillingly +chillis +chillish +chilliwack +chillness +chillo +chilloes +chillroom +chills +chillsome +chillum +chillumchee +chillums +chylocauly +chylocaulous +chylocaulously +chylocele +chylocyst +chilodon +chilognath +chilognatha +chilognathan +chilognathous +chilogrammo +chyloid +chiloma +chilomastix +chilomata +chylomicron +chiloncus +chylopericardium +chylophylly +chylophyllous +chylophyllously +chiloplasty +chilopod +chilopoda +chilopodan +chilopodous +chilopods +chylopoetic +chylopoiesis +chylopoietic +chilopsis +chylosis +chilostoma +chilostomata +chilostomatous +chilostome +chylothorax +chilotomy +chilotomies +chylous +chilte +chiltern +chyluria +chilver +chimachima +chimaera +chimaeras +chimaerid +chimaeridae +chimaeroid +chimaeroidei +chimakuan +chimakum +chimalakwe +chimalapa +chimane +chimango +chimaphila +chymaqueous +chimar +chimarikan +chimariko +chimars +chymase +chimb +chimbe +chimble +chimbley +chimbleys +chimbly +chimblies +chimbs +chime +chyme +chimed +chimer +chimera +chimeral +chimeras +chimere +chimeres +chimeric +chimerical +chimerically +chimericalness +chimerism +chimers +chimes +chymes +chimesmaster +chymia +chymic +chymics +chymiferous +chymify +chymification +chymified +chymifying +chimin +chiminage +chiming +chymist +chymistry +chymists +chimla +chimlas +chimley +chimleys +chimmesyan +chimney +chimneyed +chimneyhead +chimneying +chimneyless +chimneylike +chimneyman +chimneypiece +chimneypot +chimneys +chimonanthus +chimopeelagic +chimopelagic +chymosin +chymosinogen +chymosins +chymotrypsin +chymotrypsinogen +chymous +chimp +chimpanzee +chimpanzees +chimps +chimu +chin +china +chinaberry +chinaberries +chinafy +chinafish +chinalike +chinaman +chinamania +chinamaniac +chinamen +chinampa +chinanta +chinantecan +chinantecs +chinaphthol +chinar +chinaroot +chinas +chinatown +chinaware +chinawoman +chinband +chinbeak +chinbone +chinbones +chincapin +chinch +chincha +chinchayote +chinchasuyu +chinche +chincher +chincherinchee +chincherinchees +chinches +chinchy +chinchier +chinchiest +chinchilla +chinchillas +chinchillette +chinchiness +chinching +chinchona +chincloth +chincof +chincona +chincough +chindee +chindi +chine +chined +chinee +chinela +chinenses +chines +chinese +chinesery +chinfest +ching +chingma +chingpaw +chinhwan +chinik +chiniks +chinin +chining +chiniofon +chink +chinkapin +chinkara +chinked +chinker +chinkerinchee +chinkers +chinky +chinkier +chinkiest +chinking +chinkle +chinks +chinles +chinless +chinnam +chinned +chinner +chinners +chinny +chinnier +chinniest +chinning +chino +chinoa +chinoidin +chinoidine +chinois +chinoiserie +chinol +chinoleine +chinoline +chinologist +chinone +chinones +chinook +chinookan +chinooks +chinos +chinotoxine +chinotti +chinotto +chinovnik +chinpiece +chinquapin +chins +chinse +chinsed +chinsing +chint +chints +chintses +chintz +chintze +chintzes +chintzy +chintzier +chintziest +chintziness +chinwag +chinwood +chiococca +chiococcine +chiogenes +chiolite +chyometer +chionablepsia +chionanthus +chionaspis +chionididae +chionis +chionodoxa +chionophobia +chiopin +chiot +chiotilla +chip +chipboard +chipchap +chipchop +chipewyan +chipyard +chiplet +chipling +chipmuck +chipmucks +chipmunk +chipmunks +chipolata +chippable +chippage +chipped +chippendale +chipper +chippered +chippering +chippers +chippewa +chippewas +chippy +chippie +chippier +chippies +chippiest +chipping +chippings +chipproof +chypre +chips +chipwood +chiquero +chiquest +chiquitan +chiquito +chiragra +chiragrical +chirayta +chiral +chiralgia +chirality +chirapsia +chirarthritis +chirata +chiriana +chiricahua +chiriguano +chirimen +chirimia +chirimoya +chirimoyer +chirino +chirinola +chiripa +chirivita +chirk +chirked +chirker +chirkest +chirking +chirks +chirl +chirm +chirmed +chirming +chirms +chiro +chirocosmetics +chirogale +chirogymnast +chirognomy +chirognomic +chirognomically +chirognomist +chirognostic +chirograph +chirographary +chirographer +chirographers +chirography +chirographic +chirographical +chirolas +chirology +chirological +chirologically +chirologies +chirologist +chiromance +chiromancer +chiromancy +chiromancist +chiromant +chiromantic +chiromantical +chiromantis +chiromegaly +chirometer +chiromyidae +chiromys +chiron +chironym +chironomy +chironomic +chironomid +chironomidae +chironomus +chiropatagium +chiroplasty +chiropod +chiropody +chiropodial +chiropodic +chiropodical +chiropodist +chiropodistry +chiropodists +chiropodous +chiropompholyx +chiropractic +chiropractor +chiropractors +chiropraxis +chiropter +chiroptera +chiropteran +chiropterygian +chiropterygious +chiropterygium +chiropterite +chiropterophilous +chiropterous +chiros +chirosophist +chirospasm +chirotes +chirotherian +chirotherium +chirothesia +chirotype +chirotony +chirotonsor +chirotonsory +chirp +chirped +chirper +chirpers +chirpy +chirpier +chirpiest +chirpily +chirpiness +chirping +chirpingly +chirpling +chirps +chirr +chirre +chirred +chirres +chirring +chirrs +chirrup +chirruped +chirruper +chirrupy +chirruping +chirrupper +chirrups +chirt +chiru +chirurgeon +chirurgeonly +chirurgery +chirurgy +chirurgic +chirurgical +chis +chisedec +chisel +chiseled +chiseler +chiselers +chiseling +chiselled +chiseller +chisellers +chiselly +chisellike +chiselling +chiselmouth +chisels +chisled +chistera +chistka +chit +chita +chitak +chital +chitarra +chitarrino +chitarrone +chitarroni +chitchat +chitchats +chitchatted +chitchatty +chitchatting +chithe +chitimacha +chitimachan +chitin +chitinization +chitinized +chitinocalcareous +chitinogenous +chitinoid +chitinous +chitins +chitlin +chitling +chitlings +chitlins +chiton +chitons +chitosamine +chitosan +chitosans +chitose +chitra +chytra +chitrali +chytrid +chytridiaceae +chytridiaceous +chytridial +chytridiales +chytridiose +chytridiosis +chytridium +chytroi +chits +chittack +chittak +chittamwood +chitted +chitter +chittered +chittering +chitterling +chitterlings +chitters +chitty +chitties +chitting +chiule +chiurm +chiv +chivachee +chivage +chivalresque +chivalry +chivalric +chivalries +chivalrous +chivalrously +chivalrousness +chivaree +chivareed +chivareeing +chivarees +chivareing +chivari +chivaried +chivariing +chivaring +chivaris +chivarra +chivarras +chivarro +chive +chivey +chiver +chiveret +chives +chivy +chiviatite +chivied +chivies +chivying +chivvy +chivvied +chivvies +chivvying +chivw +chiwere +chizz +chizzel +chkalik +chkfil +chkfile +chladnite +chlamyd +chlamydate +chlamydeous +chlamydes +chlamydobacteriaceae +chlamydobacteriaceous +chlamydobacteriales +chlamydomonadaceae +chlamydomonadidae +chlamydomonas +chlamydophore +chlamydosaurus +chlamydoselachidae +chlamydoselachus +chlamydospore +chlamydosporic +chlamydozoa +chlamydozoan +chlamyphore +chlamyphorus +chlamys +chlamyses +chleuh +chloanthite +chloasma +chloasmata +chloe +chlor +chloracetate +chloracne +chloraemia +chloragen +chloragogen +chloragogue +chloral +chloralformamide +chloralide +chloralism +chloralization +chloralize +chloralized +chloralizing +chloralose +chloralosed +chlorals +chloralum +chlorambucil +chloramide +chloramin +chloramine +chloramphenicol +chloranaemia +chloranemia +chloranemic +chloranhydride +chloranil +chloranthaceae +chloranthaceous +chloranthy +chloranthus +chlorapatite +chlorargyrite +chlorastrolite +chlorate +chlorates +chlorazide +chlorcosane +chlordan +chlordane +chlordans +chlordiazepoxide +chlore +chlored +chlorella +chlorellaceae +chlorellaceous +chloremia +chloremic +chlorenchyma +chlorguanide +chlorhexidine +chlorhydrate +chlorhydric +chloriamb +chloriambus +chloric +chlorid +chloridate +chloridated +chloridation +chloride +chloridella +chloridellidae +chlorider +chlorides +chloridic +chloridize +chloridized +chloridizing +chlorids +chloryl +chlorimeter +chlorimetry +chlorimetric +chlorin +chlorinate +chlorinated +chlorinates +chlorinating +chlorination +chlorinator +chlorinators +chlorine +chlorines +chlorinity +chlorinize +chlorinous +chlorins +chloriodide +chlorion +chlorioninae +chlorite +chlorites +chloritic +chloritization +chloritize +chloritoid +chlorize +chlormethane +chlormethylic +chlornal +chloro +chloroacetate +chloroacetic +chloroacetone +chloroacetophenone +chloroamide +chloroamine +chloroanaemia +chloroanemia +chloroaurate +chloroauric +chloroaurite +chlorobenzene +chlorobromide +chlorobromomethane +chlorocalcite +chlorocarbon +chlorocarbonate +chlorochromates +chlorochromic +chlorochrous +chlorococcaceae +chlorococcales +chlorococcum +chlorococcus +chlorocresol +chlorocruorin +chlorodyne +chlorodize +chlorodized +chlorodizing +chloroethene +chloroethylene +chlorofluorocarbon +chlorofluoromethane +chloroform +chloroformate +chloroformed +chloroformic +chloroforming +chloroformism +chloroformist +chloroformization +chloroformize +chloroforms +chlorogenic +chlorogenine +chloroguanide +chlorohydrin +chlorohydrocarbon +chlorohydroquinone +chloroid +chloroiodide +chloroleucite +chloroma +chloromata +chloromelanite +chlorometer +chloromethane +chlorometry +chlorometric +chloromycetin +chloronaphthalene +chloronitrate +chloropal +chloropalladates +chloropalladic +chlorophaeite +chlorophane +chlorophenol +chlorophenothane +chlorophyceae +chlorophyceous +chlorophyl +chlorophyll +chlorophyllaceous +chlorophyllan +chlorophyllase +chlorophyllian +chlorophyllide +chlorophylliferous +chlorophylligenous +chlorophylligerous +chlorophyllin +chlorophyllite +chlorophylloid +chlorophyllose +chlorophyllous +chlorophoenicite +chlorophora +chloropia +chloropicrin +chloroplast +chloroplastic +chloroplastid +chloroplasts +chloroplatinate +chloroplatinic +chloroplatinite +chloroplatinous +chloroprene +chloropsia +chloroquine +chlorosilicate +chlorosis +chlorospinel +chlorosulphonic +chlorothiazide +chlorotic +chlorotically +chlorotrifluoroethylene +chlorotrifluoromethane +chlorous +chlorozincate +chlorpheniramine +chlorphenol +chlorpicrin +chlorpikrin +chlorpromazine +chlorpropamide +chlorprophenpyridamine +chlorsalol +chlortetracycline +chm +chmn +chn +chnuphis +cho +choachyte +choak +choana +choanate +choanephora +choanite +choanocytal +choanocyte +choanoflagellata +choanoflagellate +choanoflagellida +choanoflagellidae +choanoid +choanophorous +choanosomal +choanosome +choate +choaty +chob +chobdar +chobie +choca +chocalho +chocard +chocho +chochos +chock +chockablock +chocked +chocker +chockful +chocking +chockler +chockman +chocks +chockstone +choco +chocoan +chocolate +chocolatey +chocolates +chocolaty +chocolatier +chocolatiere +choctaw +choctaws +choel +choenix +choeropsis +choes +choffer +choga +chogak +chogset +choy +choya +choiak +choyaroot +choice +choiceful +choiceless +choicelessness +choicely +choiceness +choicer +choices +choicest +choicy +choicier +choiciest +choil +choile +choiler +choir +choirboy +choirboys +choired +choirgirl +choiring +choirlike +choirman +choirmaster +choirmasters +choyroot +choirs +choirwise +choise +choisya +chok +chokage +choke +chokeable +chokeberry +chokeberries +chokebore +chokecherry +chokecherries +choked +chokedamp +chokey +chokeys +choker +chokered +chokerman +chokers +chokes +chokestrap +chokeweed +choky +chokidar +chokier +chokies +chokiest +choking +chokingly +choko +chokra +chol +chola +cholaemia +cholagogic +cholagogue +cholalic +cholam +cholane +cholangiography +cholangiographic +cholangioitis +cholangitis +cholanic +cholanthrene +cholate +cholates +chold +choleate +cholecalciferol +cholecyanin +cholecyanine +cholecyst +cholecystalgia +cholecystectasia +cholecystectomy +cholecystectomies +cholecystectomized +cholecystenterorrhaphy +cholecystenterostomy +cholecystgastrostomy +cholecystic +cholecystis +cholecystitis +cholecystnephrostomy +cholecystocolostomy +cholecystocolotomy +cholecystoduodenostomy +cholecystogastrostomy +cholecystogram +cholecystography +cholecystoileostomy +cholecystojejunostomy +cholecystokinin +cholecystolithiasis +cholecystolithotripsy +cholecystonephrostomy +cholecystopexy +cholecystorrhaphy +cholecystostomy +cholecystostomies +cholecystotomy +cholecystotomies +choledoch +choledochal +choledochectomy +choledochitis +choledochoduodenostomy +choledochoenterostomy +choledocholithiasis +choledocholithotomy +choledocholithotripsy +choledochoplasty +choledochorrhaphy +choledochostomy +choledochostomies +choledochotomy +choledochotomies +choledography +cholee +cholehematin +choleic +choleine +choleinic +cholelith +cholelithiasis +cholelithic +cholelithotomy +cholelithotripsy +cholelithotrity +cholemia +cholent +cholents +choleokinase +cholepoietic +choler +cholera +choleraic +choleras +choleric +cholerically +cholericly +cholericness +choleriform +cholerigenous +cholerine +choleroid +choleromania +cholerophobia +cholerrhagia +cholers +cholestane +cholestanol +cholesteatoma +cholesteatomatous +cholestene +cholesterate +cholesteremia +cholesteric +cholesteryl +cholesterin +cholesterinemia +cholesterinic +cholesterinuria +cholesterol +cholesterolemia +cholesteroluria +cholesterosis +choletelin +choletherapy +choleuria +choli +choliamb +choliambic +choliambist +cholic +cholick +choline +cholinergic +cholines +cholinesterase +cholinic +cholinolytic +cholla +chollas +choller +chollers +cholo +cholochrome +cholocyanine +choloepus +chologenetic +choloid +choloidic +choloidinic +chololith +chololithic +cholonan +cholones +cholophaein +cholophein +cholorrhea +cholos +choloscopy +cholralosed +cholterheaded +choltry +cholum +choluria +choluteca +chomage +chomer +chomp +chomped +chomper +chompers +chomping +chomps +chon +chonchina +chondral +chondralgia +chondrarsenite +chondre +chondrectomy +chondrenchyma +chondri +chondria +chondric +chondrify +chondrification +chondrified +chondrigen +chondrigenous +chondrilla +chondrin +chondrinous +chondriocont +chondrioma +chondriome +chondriomere +chondriomite +chondriosomal +chondriosome +chondriosomes +chondriosphere +chondrite +chondrites +chondritic +chondritis +chondroadenoma +chondroalbuminoid +chondroangioma +chondroarthritis +chondroblast +chondroblastoma +chondrocarcinoma +chondrocele +chondrocyte +chondroclasis +chondroclast +chondrocoracoid +chondrocostal +chondrocranial +chondrocranium +chondrodynia +chondrodystrophy +chondrodystrophia +chondrodite +chondroditic +chondroendothelioma +chondroepiphysis +chondrofetal +chondrofibroma +chondrofibromatous +chondroganoidei +chondrogen +chondrogenesis +chondrogenetic +chondrogeny +chondrogenous +chondroglossal +chondroglossus +chondrography +chondroid +chondroitic +chondroitin +chondrolipoma +chondrology +chondroma +chondromalacia +chondromas +chondromata +chondromatous +chondromyces +chondromyoma +chondromyxoma +chondromyxosarcoma +chondromucoid +chondropharyngeal +chondropharyngeus +chondrophyte +chondrophore +chondroplast +chondroplasty +chondroplastic +chondroprotein +chondropterygian +chondropterygii +chondropterygious +chondrosamine +chondrosarcoma +chondrosarcomas +chondrosarcomata +chondrosarcomatous +chondroseptum +chondrosin +chondrosis +chondroskeleton +chondrostean +chondrostei +chondrosteoma +chondrosteous +chondrosternal +chondrotome +chondrotomy +chondroxiphoid +chondrule +chondrules +chondrus +chonicrite +chonk +chonolith +chonta +chontal +chontalan +chontaquiro +chontawood +choochoo +chook +chooky +chookie +chookies +choom +choop +choora +choosable +choosableness +choose +chooseable +choosey +chooser +choosers +chooses +choosy +choosier +choosiest +choosiness +choosing +choosingly +chop +chopa +chopas +chopboat +chopdar +chopfallen +chophouse +chophouses +chopin +chopine +chopines +chopins +choplogic +choplogical +chopped +chopper +choppered +choppers +choppy +choppier +choppiest +choppily +choppin +choppiness +chopping +chops +chopstick +chopsticks +chopunnish +chora +choragi +choragy +choragic +choragion +choragium +choragus +choraguses +chorai +choral +choralcelo +chorale +choraleon +chorales +choralist +chorally +chorals +chorasmian +chord +chorda +chordaceae +chordacentrous +chordacentrum +chordaceous +chordal +chordally +chordamesoderm +chordamesodermal +chordamesodermic +chordata +chordate +chordates +chorded +chordee +chordeiles +chording +chorditis +chordoid +chordomesoderm +chordophone +chordotomy +chordotonal +chords +chore +chorea +choreal +choreas +choreatic +chored +choree +choregi +choregy +choregic +choregrapher +choregraphy +choregraphic +choregraphically +choregus +choreguses +chorei +choreic +choreiform +choreman +choremen +choreodrama +choreograph +choreographed +choreographer +choreographers +choreography +choreographic +choreographical +choreographically +choreographing +choreographs +choreoid +choreomania +chorepiscopal +chorepiscope +chorepiscopus +chores +choreus +choreutic +chorgi +chorial +choriamb +choriambi +choriambic +choriambize +choriambs +choriambus +choriambuses +choribi +choric +chorically +chorine +chorines +choring +chorio +chorioadenoma +chorioallantoic +chorioallantoid +chorioallantois +choriocapillary +choriocapillaris +choriocarcinoma +choriocarcinomas +choriocarcinomata +choriocele +chorioepithelioma +chorioepitheliomas +chorioepitheliomata +chorioid +chorioidal +chorioiditis +chorioidocyclitis +chorioidoiritis +chorioidoretinitis +chorioids +chorioma +choriomas +choriomata +chorion +chorionepithelioma +chorionic +chorions +chorioptes +chorioptic +chorioretinal +chorioretinitis +choryos +choripetalae +choripetalous +choriphyllous +chorisepalous +chorisis +chorism +choriso +chorisos +chorist +choristate +chorister +choristers +choristership +choristic +choristoblastoma +choristoma +choristoneura +choristry +chorization +chorizo +chorizont +chorizontal +chorizontes +chorizontic +chorizontist +chorizos +chorobates +chorogi +chorograph +chorographer +chorography +chorographic +chorographical +chorographically +chorographies +choroid +choroidal +choroidea +choroiditis +choroidocyclitis +choroidoiritis +choroidoretinitis +choroids +chorology +chorological +chorologist +choromania +choromanic +chorometry +chorook +chorotega +choroti +chorous +chort +chorten +chorti +chortle +chortled +chortler +chortlers +chortles +chortling +chortosterol +chorus +chorused +choruser +choruses +chorusing +choruslike +chorusmaster +chorussed +chorusses +chorussing +chorwat +chose +chosen +choses +chosing +chott +chotts +chou +chouan +chouanize +choucroute +chouette +choufleur +chough +choughs +chouka +choule +choultry +choultries +chounce +choup +choupic +chouquette +chous +chouse +choused +chouser +chousers +chouses +choush +choushes +chousing +chousingha +chout +choux +chow +chowanoc +chowchow +chowchows +chowder +chowdered +chowderhead +chowderheaded +chowderheadedness +chowdering +chowders +chowed +chowhound +chowing +chowk +chowry +chowries +chows +chowse +chowsed +chowses +chowsing +chowtime +chowtimes +chozar +chrematheism +chrematist +chrematistic +chrematistics +chremsel +chremzel +chremzlach +chreotechnics +chresard +chresards +chresmology +chrestomathy +chrestomathic +chrestomathics +chrestomathies +chry +chria +chrimsel +chris +chrysal +chrysalid +chrysalida +chrysalidal +chrysalides +chrysalidian +chrysaline +chrysalis +chrysalises +chrysaloid +chrysamine +chrysammic +chrysamminic +chrysamphora +chrysanilin +chrysaniline +chrysanisic +chrysanthemin +chrysanthemum +chrysanthemums +chrysanthous +chrysaor +chrysarobin +chrysatropic +chrysazin +chrysazol +chryseis +chryselectrum +chryselephantine +chrysemys +chrysene +chrysenic +chrysid +chrysidella +chrysidid +chrysididae +chrysin +chrysippus +chrysis +chrysler +chryslers +chrism +chrisma +chrismal +chrismale +chrismary +chrismatine +chrismation +chrismatite +chrismatize +chrismatory +chrismatories +chrismon +chrismons +chrisms +chrysoaristocracy +chrysobalanaceae +chrysobalanus +chrysoberyl +chrysobull +chrysocale +chrysocarpous +chrysochlore +chrysochloridae +chrysochloris +chrysochlorous +chrysochrous +chrysocolla +chrysocracy +chrysoeriol +chrysogen +chrysograph +chrysographer +chrysography +chrysohermidin +chrysoidine +chrysolite +chrysolitic +chrysology +chrysolophus +chrisom +chrysome +chrysomelid +chrysomelidae +chrysomyia +chrisomloosing +chrysomonad +chrysomonadales +chrysomonadina +chrysomonadine +chrisoms +chrysopa +chrysopal +chrysopee +chrysophan +chrysophane +chrysophanic +chrysophanus +chrysophenin +chrysophenine +chrysophilist +chrysophilite +chrysophyll +chrysophyllum +chrysophyte +chrysophlyctis +chrysopid +chrysopidae +chrysopoeia +chrysopoetic +chrysopoetics +chrysoprase +chrysoprasus +chrysops +chrysopsis +chrysorin +chrysosperm +chrysosplenium +chrysostomic +chrysothamnus +chrysotherapy +chrysothrix +chrysotile +chrysotis +chrisroot +chrissie +christ +christabel +christadelphian +christadelphianism +christcross +christdom +christed +christen +christendie +christendom +christened +christener +christeners +christenhead +christening +christenmas +christens +christhood +christy +christiad +christian +christiana +christiania +christianiadeal +christianism +christianite +christianity +christianization +christianize +christianized +christianizer +christianizes +christianizing +christianly +christianlike +christianness +christianogentilism +christianography +christianomastix +christianopaganism +christians +christicide +christie +christies +christiform +christina +christine +christless +christlessness +christly +christlike +christlikeness +christliness +christmas +christmasberry +christmases +christmasy +christmasing +christmastide +christocentric +chrystocrene +christofer +christogram +christolatry +christology +christological +christologist +christophany +christophe +christopher +christos +christs +christward +chroatol +chrobat +chroma +chromaffin +chromaffinic +chromamamin +chromammine +chromaphil +chromaphore +chromas +chromascope +chromate +chromates +chromatic +chromatical +chromatically +chromatician +chromaticism +chromaticity +chromaticness +chromatics +chromatid +chromatin +chromatinic +chromatioideae +chromatype +chromatism +chromatist +chromatium +chromatize +chromatocyte +chromatodysopia +chromatogenous +chromatogram +chromatograph +chromatography +chromatographic +chromatographically +chromatoid +chromatolysis +chromatolytic +chromatology +chromatologies +chromatometer +chromatone +chromatopathy +chromatopathia +chromatopathic +chromatophil +chromatophile +chromatophilia +chromatophilic +chromatophilous +chromatophobia +chromatophore +chromatophoric +chromatophorous +chromatoplasm +chromatopsia +chromatoptometer +chromatoptometry +chromatoscope +chromatoscopy +chromatosis +chromatosphere +chromatospheric +chromatrope +chromaturia +chromazurine +chromdiagnosis +chrome +chromed +chromene +chromeplate +chromeplated +chromeplating +chromes +chromesthesia +chrometophobia +chromhidrosis +chromy +chromic +chromicize +chromicizing +chromid +chromidae +chromide +chromides +chromidial +chromididae +chromidiogamy +chromidiosome +chromidium +chromidrosis +chromiferous +chromyl +chrominance +chroming +chromiole +chromism +chromite +chromites +chromitite +chromium +chromiums +chromize +chromized +chromizes +chromizing +chromo +chromobacterieae +chromobacterium +chromoblast +chromocenter +chromocentral +chromochalcography +chromochalcographic +chromocyte +chromocytometer +chromocollograph +chromocollography +chromocollographic +chromocollotype +chromocollotypy +chromocratic +chromoctye +chromodermatosis +chromodiascope +chromogen +chromogene +chromogenesis +chromogenetic +chromogenic +chromogenous +chromogram +chromograph +chromoisomer +chromoisomeric +chromoisomerism +chromoleucite +chromolipoid +chromolysis +chromolith +chromolithic +chromolithograph +chromolithographer +chromolithography +chromolithographic +chromomere +chromomeric +chromometer +chromone +chromonema +chromonemal +chromonemata +chromonematal +chromonematic +chromonemic +chromoparous +chromophage +chromophane +chromophil +chromophyl +chromophile +chromophilia +chromophilic +chromophyll +chromophilous +chromophobe +chromophobia +chromophobic +chromophor +chromophore +chromophoric +chromophorous +chromophotograph +chromophotography +chromophotographic +chromophotolithograph +chromoplasm +chromoplasmic +chromoplast +chromoplastid +chromoprotein +chromopsia +chromoptometer +chromoptometrical +chromos +chromosantonin +chromoscope +chromoscopy +chromoscopic +chromosomal +chromosomally +chromosome +chromosomes +chromosomic +chromosphere +chromospheres +chromospheric +chromotherapy +chromotherapist +chromotype +chromotypy +chromotypic +chromotypography +chromotypographic +chromotrope +chromotropy +chromotropic +chromotropism +chromous +chromoxylograph +chromoxylography +chromule +chron +chronal +chronanagram +chronaxy +chronaxia +chronaxie +chronaxies +chroncmeter +chronic +chronica +chronical +chronically +chronicity +chronicle +chronicled +chronicler +chroniclers +chronicles +chronicling +chronicon +chronics +chronique +chronisotherm +chronist +chronobarometer +chronobiology +chronocarator +chronocyclegraph +chronocinematography +chronocrator +chronodeik +chronogeneous +chronogenesis +chronogenetic +chronogram +chronogrammatic +chronogrammatical +chronogrammatically +chronogrammatist +chronogrammic +chronograph +chronographer +chronography +chronographic +chronographical +chronographically +chronographs +chronoisothermal +chronol +chronologer +chronology +chronologic +chronological +chronologically +chronologies +chronologist +chronologists +chronologize +chronologizing +chronomancy +chronomantic +chronomastix +chronometer +chronometers +chronometry +chronometric +chronometrical +chronometrically +chronon +chrononomy +chronons +chronopher +chronophotograph +chronophotography +chronophotographic +chronos +chronoscope +chronoscopy +chronoscopic +chronoscopically +chronoscopv +chronosemic +chronostichon +chronothermal +chronothermometer +chronotropic +chronotropism +chroococcaceae +chroococcaceous +chroococcales +chroococcoid +chroococcus +chrosperma +chrotta +chs +chteau +chthonian +chthonic +chthonophagy +chthonophagia +chuana +chub +chubasco +chubascos +chubb +chubbed +chubbedness +chubby +chubbier +chubbiest +chubbily +chubbiness +chubs +chubsucker +chuchona +chuck +chuckawalla +chucked +chucker +chuckfarthing +chuckfull +chuckhole +chuckholes +chucky +chuckie +chuckies +chucking +chuckingly +chuckle +chuckled +chucklehead +chuckleheaded +chuckleheadedness +chuckler +chucklers +chuckles +chucklesome +chuckling +chucklingly +chuckram +chuckrum +chucks +chuckstone +chuckwalla +chud +chuddah +chuddahs +chuddar +chuddars +chudder +chudders +chude +chudic +chuet +chueta +chufa +chufas +chuff +chuffed +chuffer +chuffest +chuffy +chuffier +chuffiest +chuffily +chuffiness +chuffing +chuffs +chug +chugalug +chugalugged +chugalugging +chugalugs +chugged +chugger +chuggers +chugging +chughole +chugs +chuhra +chuje +chukar +chukars +chukchi +chukka +chukkar +chukkars +chukkas +chukker +chukkers +chukor +chulan +chulha +chullo +chullpa +chulpa +chultun +chum +chumar +chumashan +chumawi +chumble +chummage +chummed +chummer +chummery +chummy +chummier +chummies +chummiest +chummily +chumminess +chumming +chump +chumpa +chumpaka +chumped +chumpy +chumpiness +chumping +chumpish +chumpishness +chumpivilca +chumps +chums +chumship +chumships +chumulu +chun +chunam +chunari +chuncho +chundari +chunder +chunderous +chung +chunga +chungking +chunk +chunked +chunkhead +chunky +chunkier +chunkiest +chunkily +chunkiness +chunking +chunks +chunner +chunnia +chunter +chuntered +chuntering +chunters +chupak +chupatti +chupatty +chupon +chuppah +chuppahs +chuppoth +chuprassi +chuprassy +chuprassie +churada +church +churchanity +churchcraft +churchdom +churched +churches +churchful +churchgo +churchgoer +churchgoers +churchgoing +churchgrith +churchy +churchianity +churchyard +churchyards +churchier +churchiest +churchified +churchill +churchiness +churching +churchish +churchism +churchite +churchless +churchlet +churchly +churchlier +churchliest +churchlike +churchliness +churchman +churchmanly +churchmanship +churchmaster +churchmen +churchreeve +churchscot +churchshot +churchway +churchward +churchwarden +churchwardenism +churchwardenize +churchwardens +churchwardenship +churchwards +churchwise +churchwoman +churchwomen +churel +churidars +churinga +churingas +churl +churled +churlhood +churly +churlier +churliest +churlish +churlishly +churlishness +churls +churm +churn +churnability +churnable +churned +churner +churners +churnful +churning +churnings +churnmilk +churns +churnstaff +churoya +churoyan +churr +churrasco +churred +churrigueresco +churrigueresque +churring +churrip +churro +churrs +churruck +churrus +churrworm +chuse +chuser +chusite +chut +chute +chuted +chuter +chutes +chuting +chutist +chutists +chutnee +chutnees +chutney +chutneys +chuttie +chutzpa +chutzpadik +chutzpah +chutzpahs +chutzpanik +chutzpas +chuumnapm +chuvash +chuvashes +chuzwi +chwana +chwas +cy +cia +cyaathia +cyamelid +cyamelide +cyamid +cyamoid +cyamus +cyan +cyanacetic +cyanamid +cyanamide +cyanamids +cyananthrol +cyanastraceae +cyanastrum +cyanate +cyanates +cyanaurate +cyanauric +cyanbenzyl +cyancarbonic +cyanea +cyanean +cyanemia +cyaneous +cyanephidrosis +cyanformate +cyanformic +cyanhydrate +cyanhydric +cyanhydrin +cyanhidrosis +cyanic +cyanicide +cyanid +cyanidation +cyanide +cyanided +cyanides +cyanidin +cyanidine +cyaniding +cyanidrosis +cyanids +cyanimide +cyanin +cyanine +cyanines +cyanins +cyanite +cyanites +cyanitic +cyanize +cyanized +cyanizing +cyanmethemoglobin +cyano +cyanoacetate +cyanoacetic +cyanoacrylate +cyanoaurate +cyanoauric +cyanobenzene +cyanocarbonic +cyanochlorous +cyanochroia +cyanochroic +cyanocitta +cyanocobalamin +cyanocobalamine +cyanocrystallin +cyanoderma +cyanoethylate +cyanoethylation +cyanogen +cyanogenamide +cyanogenesis +cyanogenetic +cyanogenic +cyanogens +cyanoguanidine +cyanohermidin +cyanohydrin +cyanol +cyanole +cyanomaclurin +cyanometer +cyanomethaemoglobin +cyanomethemoglobin +cyanometry +cyanometric +cyanometries +cyanopathy +cyanopathic +cyanophyceae +cyanophycean +cyanophyceous +cyanophycin +cyanophil +cyanophile +cyanophilous +cyanophoric +cyanophose +cyanopia +cyanoplastid +cyanoplatinite +cyanoplatinous +cyanopsia +cyanose +cyanosed +cyanoses +cyanosis +cyanosite +cyanospiza +cyanotic +cyanotype +cyanotrichite +cyans +cyanuramide +cyanurate +cyanuret +cyanuric +cyanurin +cyanurine +cyanus +ciao +cyaphenine +cyath +cyathaspis +cyathea +cyatheaceae +cyatheaceous +cyathi +cyathia +cyathiform +cyathium +cyathoid +cyatholith +cyathophyllidae +cyathophylline +cyathophylloid +cyathophyllum +cyathos +cyathozooid +cyathus +cibaria +cibarial +cibarian +cibaries +cibarious +cibarium +cibation +cibbaria +cibboria +cybele +cybercultural +cyberculture +cybernate +cybernated +cybernating +cybernation +cybernetic +cybernetical +cybernetically +cybernetician +cyberneticist +cyberneticists +cybernetics +cybernion +cybister +cibol +cibola +cibolan +cibolero +cibols +ciboney +cibophobia +cibophobiafood +cyborg +cyborgs +cibory +ciboria +ciborium +ciboule +ciboules +cyc +cicad +cycad +cicada +cycadaceae +cycadaceous +cicadae +cycadales +cicadas +cycadean +cicadellidae +cycadeoid +cycadeoidea +cycadeous +cicadid +cicadidae +cycadiform +cycadite +cycadlike +cycadofilicale +cycadofilicales +cycadofilices +cycadofilicinean +cycadophyta +cycadophyte +cycads +cicala +cicalas +cicale +cycas +cycases +cycasin +cycasins +cicatrice +cicatrices +cicatricial +cicatricle +cicatricose +cicatricula +cicatriculae +cicatricule +cicatrisant +cicatrisate +cicatrisation +cicatrise +cicatrised +cicatriser +cicatrising +cicatrisive +cicatrix +cicatrixes +cicatrizant +cicatrizate +cicatrization +cicatrize +cicatrized +cicatrizer +cicatrizing +cicatrose +cicely +cicelies +cicer +cicero +ciceronage +cicerone +cicerones +ciceroni +ciceronian +ciceronianism +ciceronianisms +ciceronianist +ciceronianists +ciceronianize +ciceronians +ciceronic +ciceronically +ciceroning +ciceronism +ciceronize +ciceros +cichar +cichlid +cichlidae +cichlids +cichloid +cichoraceous +cichoriaceae +cichoriaceous +cichorium +cicindela +cicindelid +cicindelidae +cicisbei +cicisbeism +cicisbeo +cycl +cyclades +cycladic +cyclamate +cyclamates +cyclamen +cyclamens +cyclamin +cyclamine +cyclammonium +cyclane +cyclanthaceae +cyclanthaceous +cyclanthales +cyclanthus +cyclar +cyclarthrodial +cyclarthrosis +cyclarthrsis +cyclas +cyclase +cyclases +ciclatoun +cyclazocine +cycle +cyclecar +cyclecars +cycled +cycledom +cyclene +cycler +cyclers +cycles +cyclesmith +cycliae +cyclian +cyclic +cyclical +cyclicality +cyclically +cyclicalness +cyclicism +cyclicity +cyclicly +cyclide +cyclindroid +cycling +cyclings +cyclism +cyclist +cyclistic +cyclists +cyclitic +cyclitis +cyclitol +cyclitols +cyclization +cyclize +cyclized +cyclizes +cyclizing +cyclo +cycloacetylene +cycloaddition +cycloaliphatic +cycloalkane +cyclobothra +cyclobutane +cyclocephaly +cyclocoelic +cyclocoelous +cycloconium +cyclode +cyclodiene +cyclodiolefin +cyclodiolefine +cycloganoid +cycloganoidei +cyclogenesis +cyclogram +cyclograph +cyclographer +cycloheptane +cycloheptanone +cyclohexadienyl +cyclohexane +cyclohexanol +cyclohexanone +cyclohexatriene +cyclohexene +cyclohexyl +cyclohexylamine +cycloheximide +cycloid +cycloidal +cycloidally +cycloidean +cycloidei +cycloidian +cycloidotrope +cycloids +cyclolysis +cyclolith +cycloloma +cyclomania +cyclometer +cyclometers +cyclometry +cyclometric +cyclometrical +cyclometries +cyclomyaria +cyclomyarian +cyclonal +cyclone +cyclones +cyclonic +cyclonical +cyclonically +cyclonist +cyclonite +cyclonology +cyclonologist +cyclonometer +cyclonoscope +cycloolefin +cycloolefine +cycloolefinic +cyclop +cyclopaedia +cyclopaedias +cyclopaedic +cyclopaedically +cyclopaedist +cycloparaffin +cyclope +cyclopean +cyclopedia +cyclopedias +cyclopedic +cyclopedical +cyclopedically +cyclopedist +cyclopentadiene +cyclopentane +cyclopentanone +cyclopentene +cyclopes +cyclophoria +cyclophoric +cyclophorus +cyclophosphamide +cyclophrenia +cyclopy +cyclopia +cyclopic +cyclopism +cyclopite +cycloplegia +cycloplegic +cyclopoid +cyclopropane +cyclops +cyclopteridae +cyclopteroid +cyclopterous +cyclorama +cycloramas +cycloramic +cyclorrhapha +cyclorrhaphous +cyclos +cycloscope +cyclose +cycloserine +cycloses +cyclosilicate +cyclosis +cyclospermous +cyclospondyli +cyclospondylic +cyclospondylous +cyclosporales +cyclosporeae +cyclosporinae +cyclosporous +cyclostylar +cyclostyle +cyclostoma +cyclostomata +cyclostomate +cyclostomatidae +cyclostomatous +cyclostome +cyclostomes +cyclostomi +cyclostomidae +cyclostomous +cyclostrophic +cyclotella +cyclothem +cyclothyme +cyclothymia +cyclothymiac +cyclothymic +cyclothure +cyclothurine +cyclothurus +cyclotome +cyclotomy +cyclotomic +cyclotomies +cyclotosaurus +cyclotrimethylenetrinitramine +cyclotron +cyclotrons +cyclovertebral +cyclus +cicone +ciconia +ciconiae +ciconian +ciconiform +ciconiid +ciconiidae +ciconiiform +ciconiiformes +ciconine +ciconioid +cicoree +cicorees +cicrumspections +cicurate +cicuta +cicutoxin +cid +cidarid +cidaridae +cidaris +cidaroida +cider +cyder +ciderish +ciderist +ciderkin +ciderlike +ciders +cyders +cydippe +cydippian +cydippid +cydippida +cydon +cydonia +cydonian +cydonium +cie +cienaga +cienega +cierge +cierzo +cierzos +cyeses +cyesiology +cyesis +cyetic +cif +cig +cigala +cigale +cigar +cigaresque +cigaret +cigarets +cigarette +cigarettes +cigarfish +cigarillo +cigarillos +cigarito +cigaritos +cigarless +cigars +cygneous +cygnet +cygnets +cygnid +cygninae +cygnine +cygnus +cigua +ciguatera +cyke +cyl +cilantro +cilantros +cilectomy +cilery +cilia +ciliary +ciliata +ciliate +ciliated +ciliately +ciliates +ciliation +cilice +cilices +cylices +cilician +cilicious +cilicism +ciliectomy +ciliella +ciliferous +ciliform +ciliiferous +ciliiform +ciliium +cylinder +cylindered +cylinderer +cylindering +cylinderlike +cylinders +cylindraceous +cylindrarthrosis +cylindrella +cylindrelloid +cylindrenchema +cylindrenchyma +cylindric +cylindrical +cylindricality +cylindrically +cylindricalness +cylindricity +cylindricule +cylindriform +cylindrite +cylindrocellular +cylindrocephalic +cylindrocylindric +cylindroconical +cylindroconoidal +cylindrodendrite +cylindrograph +cylindroid +cylindroidal +cylindroma +cylindromata +cylindromatous +cylindrometric +cylindroogival +cylindrophis +cylindrosporium +cylindruria +cilioflagellata +cilioflagellate +ciliograde +ciliola +ciliolate +ciliolum +ciliophora +cilioretinal +cilioscleral +ciliospinal +ciliotomy +cilium +cylix +cill +cyllenian +cyllenius +cylloses +cillosis +cyllosis +cima +cyma +cymae +cymagraph +cimaise +cymaise +cymaphen +cymaphyte +cymaphytic +cymaphytism +cymar +cymarin +cimaroon +cymarose +cymars +cymas +cymatia +cymation +cymatium +cymba +cymbaeform +cimbal +cymbal +cymbalaria +cymbaled +cymbaleer +cymbaler +cymbalers +cymbaline +cymbalist +cymbalists +cymballed +cymballike +cymballing +cymbalo +cimbalom +cymbalom +cimbaloms +cymbalon +cymbals +cymbate +cymbel +cymbella +cimbia +cymbid +cymbidium +cymbiform +cymbium +cymblin +cymbling +cymblings +cymbocephaly +cymbocephalic +cymbocephalous +cymbopogon +cimborio +cimbri +cimbrian +cimbric +cimcumvention +cyme +cymelet +cimelia +cimeliarch +cimelium +cymene +cymenes +cymes +cimeter +cimex +cimices +cimicid +cimicidae +cimicide +cimiciform +cimicifuga +cimicifugin +cimicoid +cimier +cymiferous +ciminite +cymlin +cimline +cymling +cymlings +cymlins +cimmaron +cimmeria +cimmerian +cimmerianism +cimnel +cymobotryose +cymodoceaceae +cymogene +cymogenes +cymograph +cymographic +cymoid +cymoidium +cymol +cimolite +cymols +cymometer +cymophane +cymophanous +cymophenol +cymophobia +cymoscope +cymose +cymosely +cymotrichy +cymotrichous +cymous +cymraeg +cymry +cymric +cymrite +cymtia +cymule +cymulose +cynanche +cynanchum +cynanthropy +cynara +cynaraceous +cynarctomachy +cynareous +cynaroid +cinch +cincha +cinched +cincher +cinches +cinching +cincholoipon +cincholoiponic +cinchomeronic +cinchona +cinchonaceae +cinchonaceous +cinchonamin +cinchonamine +cinchonas +cinchonate +cinchonia +cinchonic +cinchonicin +cinchonicine +cinchonidia +cinchonidine +cinchonin +cinchonine +cinchoninic +cinchonisation +cinchonise +cinchonised +cinchonising +cinchonism +cinchonization +cinchonize +cinchonized +cinchonizing +cinchonology +cinchophen +cinchotine +cinchotoxine +cincinatti +cincinnal +cincinnati +cincinnatia +cincinnatian +cincinni +cincinnus +cinclidae +cinclides +cinclidotus +cinclis +cinclus +cinct +cincture +cinctured +cinctures +cincturing +cinder +cindered +cinderella +cindery +cindering +cinderlike +cinderman +cinderous +cinders +cindy +cindie +cine +cineangiocardiography +cineangiocardiographic +cineangiography +cineangiographic +cineast +cineaste +cineastes +cineasts +cynebot +cinecamera +cinefaction +cinefilm +cynegetic +cynegetics +cynegild +cinel +cinema +cinemactic +cinemagoer +cinemagoers +cinemas +cinemascope +cinematheque +cinematheques +cinematic +cinematical +cinematically +cinematics +cinematize +cinematized +cinematizing +cinematograph +cinematographer +cinematographers +cinematography +cinematographic +cinematographical +cinematographically +cinematographies +cinematographist +cinemelodrama +cinemese +cinemize +cinemograph +cinenchym +cinenchyma +cinenchymatous +cinene +cinenegative +cineol +cineole +cineoles +cineolic +cineols +cinephone +cinephotomicrography +cineplasty +cineplastics +cineraceous +cineradiography +cinerama +cinerararia +cinerary +cineraria +cinerarias +cinerarium +cineration +cinerator +cinerea +cinereal +cinereous +cinerin +cinerins +cineritious +cinerous +cines +cinevariety +cingalese +cynghanedd +cingle +cingula +cingular +cingulate +cingulated +cingulectomy +cingulectomies +cingulum +cynhyena +cynias +cyniatria +cyniatrics +cynic +cynical +cynically +cynicalness +cynicism +cynicisms +cynicist +cynics +ciniphes +cynipid +cynipidae +cynipidous +cynipoid +cynipoidea +cynips +cynism +cinnabar +cinnabaric +cinnabarine +cinnabars +cinnamal +cinnamaldehyde +cinnamate +cinnamein +cinnamene +cinnamenyl +cinnamic +cinnamyl +cinnamylidene +cinnamyls +cinnamodendron +cinnamoyl +cinnamol +cinnamomic +cinnamomum +cinnamon +cinnamoned +cinnamonic +cinnamonlike +cinnamonroot +cinnamons +cinnamonwood +cinnyl +cinnolin +cinnoline +cynocephalic +cynocephalous +cynocephalus +cynoclept +cynocrambaceae +cynocrambaceous +cynocrambe +cynodictis +cynodon +cynodont +cynodontia +cinofoil +cynogale +cynogenealogy +cynogenealogist +cynoglossum +cynognathus +cynography +cynoid +cynoidea +cynology +cynomys +cynomolgus +cynomoriaceae +cynomoriaceous +cynomorium +cynomorpha +cynomorphic +cynomorphous +cynophile +cynophilic +cynophilist +cynophobe +cynophobia +cynopithecidae +cynopithecoid +cynopodous +cynorrhoda +cynorrhodon +cynosarges +cynoscion +cynosura +cynosural +cynosure +cynosures +cynosurus +cynotherapy +cynoxylon +cinquain +cinquains +cinquanter +cinque +cinquecentism +cinquecentist +cinquecento +cinquedea +cinquefoil +cinquefoiled +cinquefoils +cinquepace +cinques +cinter +cynthia +cynthian +cynthiidae +cynthius +cintre +cinura +cinuran +cinurous +cion +cionectomy +cionitis +cionocranial +cionocranian +cionoptosis +cionorrhaphia +cionotome +cionotomy +cions +cioppino +cioppinos +cyp +cipaye +cipango +cyperaceae +cyperaceous +cyperus +cyphella +cyphellae +cyphellate +cipher +cypher +cipherable +cipherdom +ciphered +cyphered +cipherer +cipherhood +ciphering +cyphering +ciphers +cyphers +ciphertext +ciphertexts +cyphomandra +cyphonautes +ciphony +ciphonies +cyphonism +cyphosis +cipo +cipolin +cipolins +cipollino +cippi +cippus +cypraea +cypraeid +cypraeidae +cypraeiform +cypraeoid +cypre +cypres +cypreses +cypress +cypressed +cypresses +cypressroot +cypria +cyprian +cyprians +cyprid +cyprididae +cypridina +cypridinidae +cypridinoid +cyprina +cyprine +cyprinid +cyprinidae +cyprinids +cypriniform +cyprinin +cyprinine +cyprinodont +cyprinodontes +cyprinodontidae +cyprinodontoid +cyprinoid +cyprinoidea +cyprinoidean +cyprinus +cypriot +cypriote +cypriotes +cypriots +cypripedin +cypripedium +cypris +cyproheptadine +cyproterone +cyprus +cypruses +cypsela +cypselae +cypseli +cypselid +cypselidae +cypseliform +cypseliformes +cypseline +cypseloid +cypselomorph +cypselomorphae +cypselomorphic +cypselous +cypselus +cyptozoic +cir +cyrano +circ +circa +circadian +circaea +circaeaceae +circaetus +circar +circassian +circassic +circe +circean +circensian +circinal +circinate +circinately +circination +circinus +circiter +circle +circled +circler +circlers +circles +circlet +circleting +circlets +circlewise +circline +circling +circocele +circovarian +circs +circue +circuit +circuitable +circuital +circuited +circuiteer +circuiter +circuity +circuities +circuiting +circuition +circuitman +circuitmen +circuitor +circuitous +circuitously +circuitousness +circuitry +circuits +circuituously +circulable +circulant +circular +circularisation +circularise +circularised +circulariser +circularising +circularism +circularity +circularities +circularization +circularizations +circularize +circularized +circularizer +circularizers +circularizes +circularizing +circularly +circularness +circulars +circularwise +circulatable +circulate +circulated +circulates +circulating +circulation +circulations +circulative +circulator +circulatory +circulatories +circulators +circule +circulet +circuli +circulin +circulus +circum +circumaction +circumadjacent +circumagitate +circumagitation +circumambages +circumambagious +circumambience +circumambiency +circumambiencies +circumambient +circumambiently +circumambulate +circumambulated +circumambulates +circumambulating +circumambulation +circumambulations +circumambulator +circumambulatory +circumanal +circumantarctic +circumarctic +circumarticular +circumaviate +circumaviation +circumaviator +circumaxial +circumaxile +circumaxillary +circumbasal +circumbendibus +circumbendibuses +circumboreal +circumbuccal +circumbulbar +circumcallosal +circumcellion +circumcenter +circumcentral +circumcinct +circumcincture +circumcircle +circumcise +circumcised +circumciser +circumcises +circumcising +circumcision +circumcisions +circumcission +circumclude +circumclusion +circumcolumnar +circumcone +circumconic +circumcorneal +circumcrescence +circumcrescent +circumdate +circumdenudation +circumdiction +circumduce +circumducing +circumduct +circumducted +circumduction +circumesophagal +circumesophageal +circumfer +circumference +circumferences +circumferent +circumferential +circumferentially +circumferentor +circumflant +circumflect +circumflex +circumflexes +circumflexion +circumfluence +circumfluent +circumfluous +circumforaneous +circumfulgent +circumfuse +circumfused +circumfusile +circumfusing +circumfusion +circumgenital +circumgestation +circumgyrate +circumgyration +circumgyratory +circumhorizontal +circumincession +circuminsession +circuminsular +circumintestinal +circumitineration +circumjacence +circumjacency +circumjacencies +circumjacent +circumjovial +circumlental +circumlitio +circumlittoral +circumlocute +circumlocution +circumlocutional +circumlocutionary +circumlocutionist +circumlocutions +circumlocutory +circumlunar +circummeridian +circummeridional +circummigrate +circummigration +circummundane +circummure +circummured +circummuring +circumnatant +circumnavigable +circumnavigate +circumnavigated +circumnavigates +circumnavigating +circumnavigation +circumnavigations +circumnavigator +circumnavigatory +circumneutral +circumnuclear +circumnutate +circumnutated +circumnutating +circumnutation +circumnutatory +circumocular +circumoesophagal +circumoral +circumorbital +circumpacific +circumpallial +circumparallelogram +circumpentagon +circumplanetary +circumplect +circumplicate +circumplication +circumpolar +circumpolygon +circumpose +circumposition +circumquaque +circumradii +circumradius +circumradiuses +circumrenal +circumrotate +circumrotated +circumrotating +circumrotation +circumrotatory +circumsail +circumsaturnian +circumsciss +circumscissile +circumscribable +circumscribe +circumscribed +circumscriber +circumscribes +circumscribing +circumscript +circumscription +circumscriptions +circumscriptive +circumscriptively +circumscriptly +circumscrive +circumsession +circumsinous +circumsolar +circumspangle +circumspatial +circumspect +circumspection +circumspective +circumspectively +circumspectly +circumspectness +circumspheral +circumsphere +circumstance +circumstanced +circumstances +circumstancing +circumstant +circumstantiability +circumstantiable +circumstantial +circumstantiality +circumstantialities +circumstantially +circumstantialness +circumstantiate +circumstantiated +circumstantiates +circumstantiating +circumstantiation +circumstantiations +circumstellar +circumtabular +circumterraneous +circumterrestrial +circumtonsillar +circumtropical +circumumbilical +circumundulate +circumundulation +circumvallate +circumvallated +circumvallating +circumvallation +circumvascular +circumvent +circumventable +circumvented +circumventer +circumventing +circumvention +circumventions +circumventive +circumventor +circumvents +circumvest +circumviate +circumvoisin +circumvolant +circumvolute +circumvolution +circumvolutory +circumvolve +circumvolved +circumvolving +circumzenithal +circus +circuses +circusy +circut +circuted +circuting +circuts +cire +cyrenaic +cyrenaicism +cyrenian +cires +cyril +cyrilla +cyrillaceae +cyrillaceous +cyrillian +cyrillianism +cyrillic +cyriologic +cyriological +cirl +cirmcumferential +cirque +cirques +cirrate +cirrated +cirratulidae +cirratulus +cirrhopetalum +cirrhopod +cirrhose +cirrhosed +cirrhosis +cirrhotic +cirrhous +cirrhus +cirri +cirribranch +cirriferous +cirriform +cirrigerous +cirrigrade +cirriped +cirripede +cirripedia +cirripedial +cirripeds +cirrocumular +cirrocumulative +cirrocumulous +cirrocumulus +cirrolite +cirropodous +cirrose +cirrosely +cirrostome +cirrostomi +cirrostrative +cirrostratus +cirrous +cirrus +cirsectomy +cirsectomies +cirsium +cirsocele +cirsoid +cirsomphalos +cirsophthalmia +cirsotome +cirsotomy +cirsotomies +cyrtandraceae +cirterion +cyrtidae +cyrtoceracone +cyrtoceras +cyrtoceratite +cyrtoceratitic +cyrtograph +cyrtolite +cyrtometer +cyrtomium +cyrtopia +cyrtosis +cyrtostyle +ciruela +cirurgian +cyrus +ciruses +cis +cisalpine +cisalpinism +cisandine +cisatlantic +cisco +ciscoes +ciscos +cise +ciseaux +cisele +ciseleur +ciseleurs +ciselure +ciselures +cisgangetic +cising +cisium +cisjurane +cisleithan +cislunar +cismarine +cismontane +cismontanism +cisoceanic +cispadane +cisplatine +cispontine +cisrhenane +cissampelos +cissy +cissies +cissing +cissoid +cissoidal +cissoids +cissus +cist +cyst +cista +cistaceae +cistaceous +cystadenoma +cystadenosarcoma +cistae +cystal +cystalgia +cystamine +cystaster +cystathionine +cystatrophy +cystatrophia +cysteamine +cystectasy +cystectasia +cystectomy +cystectomies +cisted +cysted +cystein +cysteine +cysteines +cysteinic +cysteins +cystelcosis +cystenchyma +cystenchymatous +cystenchyme +cystencyte +cistercian +cistercianism +cysterethism +cistern +cisterna +cisternae +cisternal +cisterns +cistic +cystic +cysticarpic +cysticarpium +cysticercerci +cysticerci +cysticercoid +cysticercoidal +cysticercosis +cysticercus +cysticerus +cysticle +cysticolous +cystid +cystidea +cystidean +cystidia +cystidicolous +cystidium +cystidiums +cystiferous +cystiform +cystigerous +cystignathidae +cystignathine +cystin +cystine +cystines +cystinosis +cystinuria +cystirrhea +cystis +cystitides +cystitis +cystitome +cystoadenoma +cystocarcinoma +cystocarp +cystocarpic +cystocele +cystocyte +cystocolostomy +cystodynia +cystoelytroplasty +cystoenterocele +cystoepiplocele +cystoepithelioma +cystofibroma +cystoflagellata +cystoflagellate +cystogenesis +cystogenous +cystogram +cystoid +cystoidea +cystoidean +cystoids +cystolith +cystolithectomy +cystolithiasis +cystolithic +cystoma +cystomas +cystomata +cystomatous +cystometer +cystomyoma +cystomyxoma +cystomorphous +cystonectae +cystonectous +cystonephrosis +cystoneuralgia +cystoparalysis +cystophora +cystophore +cistophori +cistophoric +cistophorus +cystophotography +cystophthisis +cystopyelitis +cystopyelography +cystopyelonephritis +cystoplasty +cystoplegia +cystoproctostomy +cystopteris +cystoptosis +cystopus +cystoradiography +cistori +cystorrhagia +cystorrhaphy +cystorrhea +cystosarcoma +cystoschisis +cystoscope +cystoscopy +cystoscopic +cystoscopies +cystose +cystosyrinx +cystospasm +cystospastic +cystospore +cystostomy +cystostomies +cystotome +cystotomy +cystotomies +cystotrachelotomy +cystoureteritis +cystourethritis +cystourethrography +cystous +cistron +cistronic +cistrons +cists +cysts +cistudo +cistus +cistuses +cistvaen +cit +citable +citadel +citadels +cital +cytase +cytasic +cytaster +cytasters +citation +citational +citations +citator +citatory +citators +citatum +cite +citeable +cited +citee +citellus +citer +citers +cites +citess +cithara +citharas +citharexylum +citharist +citharista +citharoedi +citharoedic +citharoedus +cither +cythera +cytherea +cytherean +cytherella +cytherellidae +cithern +citherns +cithers +cithren +cithrens +city +citybuster +citicism +citycism +citicorp +cytidine +cytidines +citydom +citied +cities +citify +citification +citified +cityfied +citifies +citifying +cityfolk +cityful +citigradae +citigrade +cityish +cityless +citylike +cytinaceae +cytinaceous +cityness +citynesses +citing +cytinus +cytioderm +cytioderma +cityscape +cityscapes +cytisine +cytisus +cytitis +cityward +citywards +citywide +citizen +citizendom +citizeness +citizenhood +citizenish +citizenism +citizenize +citizenized +citizenizing +citizenly +citizenry +citizenries +citizens +citizenship +cytoanalyzer +cytoarchitectural +cytoarchitecturally +cytoarchitecture +cytoblast +cytoblastema +cytoblastemal +cytoblastematous +cytoblastemic +cytoblastemous +cytocentrum +cytochalasin +cytochemical +cytochemistry +cytochylema +cytochrome +cytocide +cytocyst +cytoclasis +cytoclastic +cytococci +cytococcus +cytode +cytodendrite +cytoderm +cytodiagnosis +cytodieresis +cytodieretic +cytodifferentiation +cytoecology +cytogamy +cytogene +cytogenesis +cytogenetic +cytogenetical +cytogenetically +cytogeneticist +cytogenetics +cytogeny +cytogenic +cytogenies +cytogenous +cytoglobin +cytoglobulin +cytohyaloplasm +cytoid +citoyen +citoyenne +citoyens +cytokinesis +cytokinetic +cytokinin +cytol +citola +citolas +citole +citoler +citolers +citoles +cytolymph +cytolysin +cytolysis +cytolist +cytolytic +cytology +cytologic +cytological +cytologically +cytologies +cytologist +cytologists +cytoma +cytome +cytomegalic +cytomegalovirus +cytomere +cytometer +cytomicrosome +cytomitome +cytomorphology +cytomorphological +cytomorphosis +cyton +cytone +cytons +cytopahgous +cytoparaplastin +cytopathic +cytopathogenic +cytopathogenicity +cytopathology +cytopathologic +cytopathological +cytopathologically +cytopenia +cytophaga +cytophagy +cytophagic +cytophagous +cytopharynges +cytopharynx +cytopharynxes +cytophil +cytophilic +cytophysics +cytophysiology +cytopyge +cytoplasm +cytoplasmic +cytoplasmically +cytoplast +cytoplastic +cytoproct +cytoreticulum +cytoryctes +cytosin +cytosine +cytosines +cytosome +cytospectrophotometry +cytospora +cytosporina +cytost +cytostatic +cytostatically +cytostomal +cytostome +cytostroma +cytostromatic +cytotactic +cytotaxis +cytotaxonomy +cytotaxonomic +cytotaxonomically +cytotechnology +cytotechnologist +cytotoxic +cytotoxicity +cytotoxin +cytotrophy +cytotrophoblast +cytotrophoblastic +cytotropic +cytotropism +cytovirin +cytozymase +cytozyme +cytozoa +cytozoic +cytozoon +cytozzoa +citraconate +citraconic +citral +citrals +citramide +citramontane +citrange +citrangeade +citrate +citrated +citrates +citrean +citrene +citreous +citric +citriculture +citriculturist +citril +citrylidene +citrin +citrination +citrine +citrines +citrinin +citrinins +citrinous +citrins +citrocola +citrometer +citromyces +citron +citronade +citronalis +citronella +citronellal +citronelle +citronellic +citronellol +citronin +citronize +citrons +citronwood +citropsis +citropten +citrous +citrul +citrullin +citrulline +citrullus +citrus +citruses +cittern +citternhead +citterns +citua +cytula +cytulae +ciudad +cyul +civ +cive +civet +civetlike +civetone +civets +civy +civic +civical +civically +civicism +civicisms +civics +civie +civies +civil +civile +civiler +civilest +civilian +civilianization +civilianize +civilians +civilisable +civilisation +civilisational +civilisations +civilisatory +civilise +civilised +civilisedness +civiliser +civilises +civilising +civilist +civilite +civility +civilities +civilizable +civilizade +civilization +civilizational +civilizationally +civilizations +civilizatory +civilize +civilized +civilizedness +civilizee +civilizer +civilizers +civilizes +civilizing +civilly +civilness +civism +civisms +civitan +civitas +civite +civory +civvy +civvies +cywydd +ciwies +cixiid +cixiidae +cixo +cizar +cize +cyzicene +ck +ckw +cl +clabber +clabbered +clabbery +clabbering +clabbers +clablaria +clabularia +clabularium +clach +clachan +clachans +clachs +clack +clackama +clackdish +clacked +clacker +clackers +clacket +clackety +clacking +clacks +clactonian +clad +cladanthous +cladautoicous +cladding +claddings +clade +cladine +cladistic +cladocarpous +cladocera +cladoceran +cladocerans +cladocerous +cladode +cladodes +cladodial +cladodium +cladodont +cladodontid +cladodontidae +cladodus +cladogenesis +cladogenetic +cladogenetically +cladogenous +cladonia +cladoniaceae +cladoniaceous +cladonioid +cladophyll +cladophyllum +cladophora +cladophoraceae +cladophoraceous +cladophorales +cladoptosis +cladose +cladoselache +cladoselachea +cladoselachian +cladoselachidae +cladosiphonic +cladosporium +cladothrix +cladrastis +clads +cladus +claes +clag +clagged +claggy +clagging +claggum +clags +clay +claybank +claybanks +claiborne +claibornian +claybrained +claye +clayed +clayey +clayen +clayer +clayier +clayiest +clayiness +claying +clayish +claik +claylike +claim +claimable +clayman +claimant +claimants +claimed +claimer +claimers +claiming +claimless +claymore +claymores +claims +claimsman +claimsmen +clayoquot +claypan +claypans +clair +clairaudience +clairaudient +clairaudiently +clairce +claire +clairecole +clairecolle +claires +clairschach +clairschacher +clairseach +clairseacher +clairsentience +clairsentient +clairvoyance +clairvoyances +clairvoyancy +clairvoyancies +clairvoyant +clairvoyantly +clairvoyants +clays +claystone +claith +claithes +clayton +claytonia +claiver +clayware +claywares +clayweed +clake +clallam +clam +clamant +clamantly +clamaroo +clamation +clamative +clamatores +clamatory +clamatorial +clamb +clambake +clambakes +clamber +clambered +clamberer +clambering +clambers +clamcracker +clame +clamehewit +clamer +clamflat +clamjamfery +clamjamfry +clamjamphrie +clamlike +clammed +clammer +clammersome +clammy +clammier +clammiest +clammily +clamminess +clamming +clammish +clammyweed +clamor +clamored +clamorer +clamorers +clamoring +clamorist +clamorous +clamorously +clamorousness +clamors +clamorsome +clamour +clamoured +clamourer +clamouring +clamourist +clamourous +clamours +clamoursome +clamp +clampdown +clamped +clamper +clampers +clamping +clamps +clams +clamshell +clamshells +clamworm +clamworms +clan +clancular +clancularly +clandestine +clandestinely +clandestineness +clandestinity +clanfellow +clang +clanged +clanger +clangful +clanging +clangingly +clangor +clangored +clangoring +clangorous +clangorously +clangorousness +clangors +clangour +clangoured +clangouring +clangours +clangs +clangula +clanjamfray +clanjamfrey +clanjamfrie +clanjamphrey +clank +clanked +clankety +clanking +clankingly +clankingness +clankless +clanks +clankum +clanless +clanned +clanning +clannish +clannishly +clannishness +clans +clansfolk +clanship +clansman +clansmanship +clansmen +clanswoman +clanswomen +claosaurus +clap +clapboard +clapboarding +clapboards +clapbread +clapcake +clapdish +clape +clapholt +clapmatch +clapnest +clapnet +clapotis +clappe +clapped +clapper +clapperboard +clapperclaw +clapperclawer +clapperdudgeon +clappered +clappering +clappermaclaw +clappers +clapping +claps +clapstick +clapt +claptrap +claptraps +clapwort +claque +claquer +claquers +claques +claqueur +claqueurs +clar +clara +clarabella +clarain +clare +clarence +clarences +clarenceux +clarenceuxship +clarencieux +clarendon +clares +claret +claretian +clarets +clary +claribel +claribella +clarice +clarichord +claries +clarify +clarifiable +clarifiant +clarificant +clarification +clarifications +clarified +clarifier +clarifiers +clarifies +clarifying +clarigate +clarigation +clarigold +clarin +clarina +clarinda +clarine +clarinet +clarinetist +clarinetists +clarinets +clarinettist +clarinettists +clarini +clarino +clarinos +clarion +clarioned +clarionet +clarioning +clarions +clarissa +clarisse +clarissimo +clarist +clarity +clarities +claritude +clark +clarke +clarkeite +clarkeites +clarkia +clarkias +clarksville +claro +claroes +claromontane +claros +clarre +clarsach +clarseach +clarsech +clarseth +clarshech +clart +clarty +clartier +clartiest +clarts +clash +clashed +clashee +clasher +clashers +clashes +clashy +clashing +clashingly +clasmatocyte +clasmatocytic +clasmatosis +clasp +clasped +clasper +claspers +clasping +clasps +claspt +class +classable +classbook +classed +classer +classers +classes +classfellow +classy +classic +classical +classicalism +classicalist +classicality +classicalities +classicalize +classically +classicalness +classicise +classicised +classicising +classicism +classicist +classicistic +classicists +classicize +classicized +classicizing +classico +classicolatry +classics +classier +classiest +classify +classifiable +classific +classifically +classification +classificational +classifications +classificator +classificatory +classified +classifier +classifiers +classifies +classifying +classily +classiness +classing +classis +classism +classisms +classist +classists +classless +classlessness +classman +classmanship +classmate +classmates +classmen +classroom +classrooms +classwise +classwork +clast +clastic +clastics +clasts +clat +clatch +clatchy +clathraceae +clathraceous +clathraria +clathrarian +clathrate +clathrina +clathrinidae +clathroid +clathrose +clathrulate +clathrus +clatsop +clatter +clattered +clatterer +clattery +clattering +clatteringly +clatters +clattertrap +clattertraps +clatty +clauber +claucht +claude +claudent +claudetite +claudetites +claudia +claudian +claudicant +claudicate +claudication +claudio +claudius +claught +claughted +claughting +claughts +claus +clausal +clause +clauses +clausilia +clausiliidae +clauster +clausthalite +claustra +claustral +claustration +claustrophilia +claustrophobe +claustrophobia +claustrophobiac +claustrophobic +claustrum +clausula +clausulae +clausular +clausule +clausum +clausure +claut +clava +clavacin +clavae +claval +clavaria +clavariaceae +clavariaceous +clavate +clavated +clavately +clavatin +clavation +clave +clavecin +clavecinist +clavel +clavelization +clavelize +clavellate +clavellated +claver +clavered +clavering +clavers +claves +clavi +clavy +clavial +claviature +clavicembali +clavicembalist +clavicembalo +claviceps +clavichord +clavichordist +clavichordists +clavichords +clavicylinder +clavicymbal +clavicytheria +clavicytherium +clavicithern +clavicythetheria +clavicittern +clavicle +clavicles +clavicor +clavicorn +clavicornate +clavicornes +clavicornia +clavicotomy +clavicular +clavicularium +claviculate +claviculus +clavier +clavierist +clavieristic +clavierists +claviers +claviform +claviger +clavigerous +claviharp +clavilux +claviol +claviole +clavipectoral +clavis +clavises +clavodeltoid +clavodeltoideus +clavola +clavolae +clavolet +clavus +clavuvi +claw +clawback +clawed +clawer +clawers +clawhammer +clawing +clawk +clawker +clawless +clawlike +claws +clawsick +claxon +claxons +cleach +clead +cleaded +cleading +cleam +cleamer +clean +cleanable +cleaned +cleaner +cleaners +cleanest +cleanhanded +cleanhandedness +cleanhearted +cleaning +cleanings +cleanish +cleanly +cleanlier +cleanliest +cleanlily +cleanliness +cleanness +cleanout +cleans +cleansable +cleanse +cleansed +cleanser +cleansers +cleanses +cleansing +cleanskin +cleanskins +cleanup +cleanups +clear +clearable +clearage +clearance +clearances +clearcole +cleared +clearedness +clearer +clearers +clearest +clearheaded +clearheadedly +clearheadedness +clearhearted +clearing +clearinghouse +clearinghouses +clearings +clearish +clearly +clearminded +clearness +clears +clearsighted +clearsightedness +clearskins +clearstarch +clearstarcher +clearstory +clearstoried +clearstories +clearway +clearwater +clearweed +clearwing +cleat +cleated +cleating +cleats +cleavability +cleavable +cleavage +cleavages +cleave +cleaved +cleaveful +cleavelandite +cleaver +cleavers +cleaverwort +cleaves +cleaving +cleavingly +cleche +clechee +clechy +cleck +cled +cledde +cledge +cledgy +cledonism +clee +cleech +cleek +cleeked +cleeky +cleeking +cleeks +clef +clefs +cleft +clefted +clefts +cleg +cleidagra +cleidarthritis +cleidocostal +cleidocranial +cleidohyoid +cleidoic +cleidomancy +cleidomastoid +cleidorrhexis +cleidoscapular +cleidosternal +cleidotomy +cleidotripsy +cleistocarp +cleistocarpous +cleistogamy +cleistogamic +cleistogamically +cleistogamous +cleistogamously +cleistogene +cleistogeny +cleistogenous +cleistotcia +cleistothecia +cleistothecium +cleistothecopsis +cleithral +cleithrum +clem +clematis +clematises +clematite +clemclemalats +clemence +clemency +clemencies +clement +clementina +clementine +clemently +clementness +clements +clemmed +clemming +clench +clenched +clencher +clenchers +clenches +clenching +cleoid +cleome +cleomes +cleopatra +clep +clepe +cleped +clepes +cleping +clepsydra +clepsydrae +clepsydras +clepsine +clept +cleptobioses +cleptobiosis +cleptobiotic +cleptomania +cleptomaniac +clerestory +clerestoried +clerestories +clerete +clergess +clergy +clergyable +clergies +clergylike +clergyman +clergymen +clergion +clergywoman +clergywomen +cleric +clerical +clericalism +clericalist +clericalists +clericality +clericalize +clerically +clericals +clericate +clericature +clericism +clericity +clerics +clericum +clerid +cleridae +clerids +clerihew +clerihews +clerisy +clerisies +clerk +clerkage +clerkdom +clerkdoms +clerked +clerkery +clerkess +clerkhood +clerking +clerkish +clerkless +clerkly +clerklier +clerkliest +clerklike +clerkliness +clerks +clerkship +clerkships +clernly +clerodendron +cleromancy +cleronomy +clerstory +cleruch +cleruchy +cleruchial +cleruchic +cleruchies +clerum +clerus +cletch +clethra +clethraceae +clethraceous +clethrionomys +cleuch +cleuk +cleuks +cleve +cleveite +cleveites +cleveland +clever +cleverality +cleverer +cleverest +cleverish +cleverishly +cleverly +cleverness +clevis +clevises +clew +clewed +clewgarnet +clewing +clews +cli +cly +cliack +clianthus +clich +cliche +cliched +cliches +click +clicked +clicker +clickers +clicket +clicky +clicking +clickless +clicks +clidastes +clyde +clydesdale +clydeside +clydesider +cliency +client +clientage +cliental +cliented +clientelage +clientele +clienteles +clientless +clientry +clients +clientship +clyer +clyers +clyfaker +clyfaking +cliff +cliffed +cliffhang +cliffhanger +cliffhangers +cliffhanging +cliffy +cliffier +cliffiest +cliffing +cliffless +clifflet +clifflike +clifford +cliffs +cliffside +cliffsman +cliffweed +clift +clifty +cliftonia +cliftonite +clifts +clima +climaciaceae +climaciaceous +climacium +climacter +climactery +climacterial +climacteric +climacterical +climacterically +climacterics +climactic +climactical +climactically +climacus +climant +climata +climatal +climatarchic +climate +climates +climath +climatic +climatical +climatically +climatius +climatize +climatography +climatographical +climatology +climatologic +climatological +climatologically +climatologist +climatologists +climatometer +climatotherapeutics +climatotherapy +climatotherapies +climature +climax +climaxed +climaxes +climaxing +climb +climbable +climbed +climber +climbers +climbing +climbingfish +climbingfishes +climbs +clime +clymenia +climes +climograph +clin +clinah +clinal +clinally +clinamen +clinamina +clinandrdria +clinandria +clinandrium +clinanthia +clinanthium +clinch +clinched +clincher +clinchers +clinches +clinching +clinchingly +clinchingness +clinchpoop +cline +clines +cling +clinged +clinger +clingers +clingfish +clingfishes +clingy +clingier +clingiest +clinginess +clinging +clingingly +clingingness +clings +clingstone +clingstones +clinia +clinic +clinical +clinically +clinician +clinicians +clinicist +clinicopathologic +clinicopathological +clinicopathologically +clinics +clinid +clinium +clink +clinkant +clinked +clinker +clinkered +clinkerer +clinkery +clinkering +clinkers +clinking +clinks +clinkstone +clinkum +clinoaxis +clinocephaly +clinocephalic +clinocephalism +clinocephalous +clinocephalus +clinochlore +clinoclase +clinoclasite +clinodiagonal +clinodomatic +clinodome +clinograph +clinographic +clinohedral +clinohedrite +clinohumite +clinoid +clinology +clinologic +clinometer +clinometry +clinometria +clinometric +clinometrical +clinophobia +clinopinacoid +clinopinacoidal +clinopyramid +clinopyroxene +clinopodium +clinoprism +clinorhombic +clinospore +clinostat +clinquant +clint +clinty +clinting +clinton +clintonia +clintonite +clints +clio +cliona +clione +clip +clipboard +clipboards +clype +clypeal +clypeaster +clypeastridea +clypeastrina +clypeastroid +clypeastroida +clypeastroidea +clypeate +clypeated +clipei +clypei +clypeiform +clypeola +clypeolar +clypeolate +clypeole +clipeus +clypeus +clippable +clipped +clipper +clipperman +clippers +clippie +clipping +clippingly +clippings +clips +clipse +clipsheet +clipsheets +clipsome +clipt +clique +cliqued +cliquedom +cliquey +cliqueier +cliqueiest +cliqueyness +cliqueless +cliques +cliquy +cliquier +cliquiest +cliquing +cliquish +cliquishly +cliquishness +cliquism +cliseometer +clisere +clyses +clishmaclaver +clisiocampa +clysis +clysma +clysmian +clysmic +clyssus +clyster +clysterize +clysters +clistocarp +clistocarpous +clistogastra +clistothcia +clistothecia +clistothecium +clit +clitch +clite +clitella +clitellar +clitelliferous +clitelline +clitellum +clitellus +clytemnestra +clites +clithe +clithral +clithridiate +clitia +clitic +clition +clitocybe +clitoral +clitoria +clitoric +clitoridauxe +clitoridean +clitoridectomy +clitoridectomies +clitoriditis +clitoridotomy +clitoris +clitorises +clitorism +clitoritis +clitoromania +clitoromaniac +clitoromaniacal +clitter +clitterclatter +cliv +clival +clive +cliver +clivers +clivia +clivias +clivis +clivises +clivus +clk +clo +cloaca +cloacae +cloacal +cloacaline +cloacas +cloacean +cloacinal +cloacinean +cloacitis +cloak +cloakage +cloaked +cloakedly +cloaking +cloakless +cloaklet +cloakmaker +cloakmaking +cloakroom +cloakrooms +cloaks +cloakwise +cloam +cloamen +cloamer +clobber +clobbered +clobberer +clobbering +clobbers +clochan +clochard +clochards +cloche +clocher +cloches +clochette +clock +clockbird +clockcase +clocked +clocker +clockers +clockface +clockhouse +clocking +clockings +clockkeeper +clockless +clocklike +clockmaker +clockmaking +clockmutch +clockroom +clocks +clocksmith +clockwatcher +clockwise +clockwork +clockworked +clockworks +clod +clodbreaker +clodded +clodder +cloddy +cloddier +cloddiest +cloddily +cloddiness +clodding +cloddish +cloddishly +cloddishness +clodhead +clodhopper +clodhopperish +clodhoppers +clodhopping +clodknocker +clodlet +clodlike +clodpate +clodpated +clodpates +clodpole +clodpoles +clodpoll +clodpolls +clods +cloes +clof +cloff +clofibrate +clog +clogdogdo +clogged +clogger +cloggy +cloggier +cloggiest +cloggily +clogginess +clogging +cloghad +cloghaun +cloghead +cloglike +clogmaker +clogmaking +clogs +clogwheel +clogwyn +clogwood +cloy +cloyed +cloyedness +cloyer +cloying +cloyingly +cloyingness +cloyless +cloyment +cloine +cloyne +cloiochoanitic +cloys +cloysome +cloison +cloisonless +cloisonn +cloisonne +cloisonnism +cloister +cloisteral +cloistered +cloisterer +cloistering +cloisterless +cloisterly +cloisterlike +cloisterliness +cloisters +cloisterwise +cloistral +cloistress +cloit +cloke +cloky +clokies +clomb +clomben +clomiphene +clomp +clomped +clomping +clomps +clon +clonal +clonally +clone +cloned +cloner +cloners +clones +clong +clonic +clonicity +clonicotonic +cloning +clonism +clonisms +clonk +clonked +clonking +clonks +clonorchiasis +clonorchis +clonos +clonothrix +clons +clonus +clonuses +cloof +cloop +cloot +clootie +cloots +clop +clopped +clopping +clops +cloque +cloques +cloragen +clorargyrite +clorinator +cloriodid +clos +closable +close +closeable +closecross +closed +closedown +closefisted +closefistedly +closefistedness +closefitting +closehanded +closehauled +closehearted +closely +closelipped +closemouth +closemouthed +closen +closeness +closenesses +closeout +closeouts +closer +closers +closes +closest +closestool +closet +closeted +closetful +closeting +closets +closeup +closeups +closewing +closh +closing +closings +closish +closkey +closky +closter +closterium +clostridia +clostridial +clostridian +clostridium +closure +closured +closures +closuring +clot +clotbur +clote +cloth +clothbound +clothe +clothed +clothes +clothesbag +clothesbasket +clothesbrush +clotheshorse +clotheshorses +clothesyard +clothesless +clothesline +clotheslines +clothesman +clothesmen +clothesmonger +clothespin +clothespins +clothespress +clothespresses +clothy +clothier +clothiers +clothify +clothilda +clothing +clothings +clothlike +clothmaker +clothmaking +clotho +cloths +clothworker +clots +clottage +clotted +clottedness +clotter +clotty +clotting +cloture +clotured +clotures +cloturing +clotweed +clou +cloud +cloudage +cloudberry +cloudberries +cloudburst +cloudbursts +cloudcap +clouded +cloudful +cloudy +cloudier +cloudiest +cloudily +cloudiness +clouding +cloudland +cloudless +cloudlessly +cloudlessness +cloudlet +cloudlets +cloudlike +cloudling +cloudology +clouds +cloudscape +cloudship +cloudward +cloudwards +clouee +clough +cloughs +clour +cloured +clouring +clours +clout +clouted +clouter +clouterly +clouters +clouty +clouting +clouts +clove +cloven +clovene +clover +clovered +clovery +cloverlay +cloverleaf +cloverleafs +cloverleaves +cloverley +cloveroot +cloverroot +clovers +cloves +clovewort +clow +clowder +clowders +clower +clown +clownade +clownage +clowned +clownery +clowneries +clownheal +clowning +clownish +clownishly +clownishness +clowns +clownship +clowre +clowring +cloxacillin +cloze +clr +club +clubability +clubable +clubbability +clubbable +clubbed +clubber +clubbers +clubby +clubbier +clubbiest +clubbily +clubbiness +clubbing +clubbish +clubbishness +clubbism +clubbist +clubdom +clubfeet +clubfellow +clubfist +clubfisted +clubfoot +clubfooted +clubhand +clubhands +clubhaul +clubhauled +clubhauling +clubhauls +clubhouse +clubhouses +clubionid +clubionidae +clubland +clubman +clubmate +clubmen +clubmobile +clubmonger +clubridden +clubroom +clubrooms +clubroot +clubroots +clubs +clubstart +clubster +clubweed +clubwoman +clubwomen +clubwood +cluck +clucked +clucky +clucking +clucks +cludder +clue +clued +clueing +clueless +clues +cluff +cluing +clum +clumber +clumbers +clump +clumped +clumper +clumpy +clumpier +clumpiest +clumping +clumpish +clumpishness +clumplike +clumproot +clumps +clumpst +clumse +clumsy +clumsier +clumsiest +clumsily +clumsiness +clunch +clung +cluniac +cluniacensian +clunisian +clunist +clunk +clunked +clunker +clunkers +clunking +clunks +clunter +clupanodonic +clupea +clupeid +clupeidae +clupeids +clupeiform +clupein +clupeine +clupeiod +clupeodei +clupeoid +clupeoids +clupien +cluppe +cluricaune +clusia +clusiaceae +clusiaceous +cluster +clusterberry +clustered +clusterfist +clustery +clustering +clusteringly +clusterings +clusters +clutch +clutched +clutcher +clutches +clutchy +clutching +clutchingly +clutchman +cluther +clutter +cluttered +clutterer +cluttery +cluttering +clutterment +clutters +cm +cmd +cmdg +cmdr +cml +cnemapophysis +cnemial +cnemic +cnemides +cnemidium +cnemidophorus +cnemis +cneoraceae +cneoraceous +cneorum +cnibophore +cnicin +cnicus +cnida +cnidae +cnidaria +cnidarian +cnidian +cnidoblast +cnidocell +cnidocil +cnidocyst +cnidogenous +cnidophobia +cnidophore +cnidophorous +cnidopod +cnidosac +cnidoscolus +cnidosis +co +coabode +coabound +coabsume +coacceptor +coacervate +coacervated +coacervating +coacervation +coach +coachability +coachable +coachbuilder +coachbuilding +coached +coachee +coacher +coachers +coaches +coachfellow +coachful +coachy +coaching +coachlet +coachmaker +coachmaking +coachman +coachmanship +coachmaster +coachmen +coachs +coachsmith +coachsmithing +coachway +coachwhip +coachwise +coachwoman +coachwood +coachwork +coachwright +coact +coacted +coacting +coaction +coactions +coactive +coactively +coactivity +coactor +coacts +coadamite +coadapt +coadaptation +coadaptations +coadapted +coadapting +coadequate +coadjacence +coadjacency +coadjacent +coadjacently +coadjudicator +coadjument +coadjust +coadjustment +coadjutant +coadjutator +coadjute +coadjutement +coadjutive +coadjutor +coadjutors +coadjutorship +coadjutress +coadjutrice +coadjutrices +coadjutrix +coadjuvancy +coadjuvant +coadjuvate +coadminister +coadministration +coadministrator +coadministratrix +coadmiration +coadmire +coadmired +coadmires +coadmiring +coadmit +coadmits +coadmitted +coadmitting +coadnate +coadore +coadsorbent +coadunate +coadunated +coadunating +coadunation +coadunative +coadunatively +coadunite +coadventure +coadventured +coadventurer +coadventuress +coadventuring +coadvice +coaeval +coaevals +coaffirmation +coafforest +coaged +coagel +coagency +coagencies +coagent +coagents +coaggregate +coaggregated +coaggregation +coagitate +coagitator +coagment +coagmentation +coagonize +coagriculturist +coagula +coagulability +coagulable +coagulant +coagulants +coagulase +coagulate +coagulated +coagulates +coagulating +coagulation +coagulations +coagulative +coagulator +coagulatory +coagulators +coagule +coagulin +coaguline +coagulometer +coagulose +coagulum +coagulums +coahuiltecan +coaid +coaita +coak +coakum +coal +coala +coalas +coalbag +coalbagger +coalbin +coalbins +coalbox +coalboxes +coaldealer +coaled +coaler +coalers +coalesce +coalesced +coalescence +coalescency +coalescent +coalesces +coalescing +coalface +coalfield +coalfish +coalfishes +coalfitter +coalheugh +coalhole +coalholes +coaly +coalyard +coalyards +coalier +coaliest +coalify +coalification +coalified +coalifies +coalifying +coaling +coalite +coalition +coalitional +coalitioner +coalitionist +coalitions +coalize +coalized +coalizer +coalizing +coalless +coalmonger +coalmouse +coalpit +coalpits +coalrake +coals +coalsack +coalsacks +coalshed +coalsheds +coalternate +coalternation +coalternative +coaltitude +coambassador +coambulant +coamiable +coaming +coamings +coan +coanimate +coannex +coannexed +coannexes +coannexing +coannihilate +coapostate +coapparition +coappear +coappearance +coappeared +coappearing +coappears +coappellee +coapprehend +coapprentice +coappriser +coapprover +coapt +coaptate +coaptation +coapted +coapting +coapts +coaration +coarb +coarbiter +coarbitrator +coarct +coarctate +coarctation +coarcted +coarcting +coardent +coarrange +coarrangement +coarse +coarsely +coarsen +coarsened +coarseness +coarsening +coarsens +coarser +coarsest +coarsish +coart +coarticulate +coarticulation +coascend +coassert +coasserter +coassession +coassessor +coassignee +coassist +coassistance +coassistant +coassisted +coassisting +coassists +coassume +coassumed +coassumes +coassuming +coast +coastal +coastally +coasted +coaster +coasters +coastguard +coastguardman +coastguardsman +coastguardsmen +coasting +coastings +coastland +coastline +coastlines +coastman +coastmen +coasts +coastside +coastways +coastwaiter +coastward +coastwards +coastwise +coat +coatdress +coated +coatee +coatees +coater +coaters +coathangers +coati +coatie +coatimondie +coatimundi +coating +coatings +coation +coatis +coatless +coatrack +coatracks +coatroom +coatrooms +coats +coattail +coattailed +coattails +coattend +coattended +coattending +coattends +coattest +coattestation +coattestator +coattested +coattesting +coattests +coaudience +coauditor +coaugment +coauthered +coauthor +coauthored +coauthoring +coauthority +coauthors +coauthorship +coawareness +coax +coaxal +coaxation +coaxed +coaxer +coaxers +coaxes +coaxy +coaxial +coaxially +coaxing +coaxingly +coazervate +coazervation +cob +cobaea +cobalamin +cobalamine +cobalt +cobaltamine +cobaltammine +cobaltic +cobalticyanic +cobalticyanides +cobaltiferous +cobaltine +cobaltinitrite +cobaltite +cobaltocyanic +cobaltocyanide +cobaltous +cobalts +cobang +cobb +cobbed +cobber +cobberer +cobbers +cobby +cobbier +cobbiest +cobbin +cobbing +cobble +cobbled +cobbler +cobblerfish +cobblery +cobblerism +cobblerless +cobblers +cobblership +cobbles +cobblestone +cobblestoned +cobblestones +cobbly +cobbling +cobbra +cobbs +cobcab +cobdenism +cobdenite +cobego +cobelief +cobeliever +cobelligerent +cobenignity +coberger +cobewail +cobhead +cobhouse +cobia +cobias +cobiron +cobishop +cobitidae +cobitis +coble +cobleman +coblentzian +cobles +cobleskill +cobless +cobloaf +cobnut +cobnuts +cobol +cobola +coboss +coboundless +cobourg +cobra +cobras +cobreathe +cobridgehead +cobriform +cobrother +cobs +cobstone +coburg +coburgess +coburgher +coburghership +cobus +cobweb +cobwebbed +cobwebbery +cobwebby +cobwebbier +cobwebbiest +cobwebbing +cobwebs +cobwork +coca +cocaceous +cocaigne +cocain +cocaine +cocaines +cocainisation +cocainise +cocainised +cocainising +cocainism +cocainist +cocainization +cocainize +cocainized +cocainizing +cocainomania +cocainomaniac +cocains +cocama +cocamama +cocamine +cocanucos +cocao +cocarboxylase +cocarde +cocas +cocash +cocashweed +cocause +cocautioner +coccaceae +coccaceous +coccagee +coccal +cocceian +cocceianism +coccerin +cocci +coccic +coccid +coccidae +coccidia +coccidial +coccidian +coccidiidea +coccydynia +coccidioidal +coccidioides +coccidioidomycosis +coccidiomorpha +coccidiosis +coccidium +coccidology +coccids +cocciferous +cocciform +coccygalgia +coccygeal +coccygean +coccygectomy +coccigenic +coccygerector +coccyges +coccygeus +coccygine +coccygodynia +coccygomorph +coccygomorphae +coccygomorphic +coccygotomy +coccin +coccinella +coccinellid +coccinellidae +coccineous +coccyodynia +coccionella +coccyx +coccyxes +coccyzus +cocco +coccobaccilli +coccobacilli +coccobacillus +coccochromatic +coccogonales +coccogone +coccogoneae +coccogonium +coccoid +coccoidal +coccoids +coccolite +coccolith +coccolithophorid +coccolithophoridae +coccoloba +coccolobis +coccomyces +coccosphere +coccostean +coccosteid +coccosteidae +coccosteus +coccothraustes +coccothraustine +coccothrinax +coccous +coccule +cocculiferous +cocculus +coccus +cocentric +coch +cochair +cochaired +cochairing +cochairman +cochairmanship +cochairmen +cochairs +cochal +cocher +cochero +cochief +cochylis +cochin +cochineal +cochins +cochlea +cochleae +cochlear +cochleare +cochleary +cochlearia +cochlearifoliate +cochleariform +cochleas +cochleate +cochleated +cochleiform +cochleitis +cochleleae +cochleleas +cochleous +cochlidiid +cochlidiidae +cochliodont +cochliodontidae +cochliodus +cochlite +cochlitis +cochlospermaceae +cochlospermaceous +cochlospermum +cochon +cochranea +cochromatography +cochurchwarden +cocillana +cocin +cocinera +cocineras +cocinero +cocircular +cocircularity +cocytean +cocitizen +cocitizenship +cocytus +cock +cockabondy +cockade +cockaded +cockades +cockadoodledoo +cockaigne +cockal +cockalan +cockaleekie +cockalorum +cockamamy +cockamamie +cockamaroo +cockandy +cockapoo +cockapoos +cockard +cockarouse +cockateel +cockatiel +cockatoo +cockatoos +cockatrice +cockatrices +cockawee +cockbell +cockbill +cockbilled +cockbilling +cockbills +cockbird +cockboat +cockboats +cockbrain +cockchafer +cockcrow +cockcrower +cockcrowing +cockcrows +cocked +cockeye +cockeyed +cockeyedly +cockeyedness +cockeyes +cocker +cockered +cockerel +cockerels +cockerie +cockering +cockermeg +cockernony +cockernonnie +cockerouse +cockers +cocket +cocketed +cocketing +cockfight +cockfighter +cockfighting +cockfights +cockhead +cockhorse +cockhorses +cocky +cockie +cockieleekie +cockier +cockies +cockiest +cockily +cockiness +cocking +cockyolly +cockish +cockishly +cockishness +cockle +cockleboat +cocklebur +cockled +cockler +cockles +cockleshell +cockleshells +cocklet +cocklewife +cockly +cocklight +cocklike +cockling +cockloche +cockloft +cocklofts +cockmaster +cockmatch +cockmate +cockney +cockneian +cockneybred +cockneydom +cockneyese +cockneyess +cockneyfy +cockneyfication +cockneyfied +cockneyfying +cockneyish +cockneyishly +cockneyism +cockneyize +cockneyland +cockneylike +cockneys +cockneyship +cockneity +cockpaddle +cockpit +cockpits +cockroach +cockroaches +cocks +cockscomb +cockscombed +cockscombs +cocksfoot +cockshead +cockshy +cockshies +cockshying +cockshoot +cockshot +cockshut +cockshuts +cocksy +cocksparrow +cockspur +cockspurs +cockstone +cocksure +cocksuredom +cocksureism +cocksurely +cocksureness +cocksurety +cockswain +cocktail +cocktailed +cocktailing +cocktails +cockthrowing +cockup +cockups +cockweed +cocle +coclea +coco +cocoa +cocoach +cocoanut +cocoanuts +cocoas +cocoawood +cocobola +cocobolas +cocobolo +cocobolos +cocodette +cocoyam +cocomat +cocomats +cocona +coconino +coconnection +coconqueror +coconscious +coconsciously +coconsciousness +coconsecrator +coconspirator +coconstituent +cocontractor +coconucan +coconuco +coconut +coconuts +cocoon +cocooned +cocoonery +cocooneries +cocooning +cocoons +cocopan +cocopans +cocorico +cocoroot +cocos +cocotte +cocottes +cocovenantor +cocowood +cocowort +cocozelle +cocreate +cocreated +cocreates +cocreating +cocreator +cocreatorship +cocreditor +cocrucify +coct +coctile +coction +coctoantigen +coctoprecipitin +cocuyo +cocuisa +cocuiza +cocullo +cocurator +cocurrent +cocurricular +cocus +cocuswood +cod +coda +codable +codal +codamin +codamine +codas +codbank +codded +codder +codders +coddy +codding +coddle +coddled +coddler +coddlers +coddles +coddling +code +codebook +codebooks +codebreak +codebreaker +codebtor +codebtors +codec +codeclination +codecree +codecs +coded +codefendant +codefendants +codeia +codeias +codein +codeina +codeinas +codeine +codeines +codeins +codeless +codelight +codelinquency +codelinquent +coden +codenization +codens +codeposit +coder +coderive +coderived +coderives +coderiving +coders +codes +codescendant +codesign +codesigned +codesigning +codesigns +codespairer +codetermination +codetermine +codetta +codettas +codette +codeword +codewords +codex +codfish +codfisher +codfishery +codfisheries +codfishes +codfishing +codger +codgers +codhead +codheaded +codiaceae +codiaceous +codiaeum +codiales +codical +codices +codicil +codicilic +codicillary +codicils +codicology +codictatorship +codify +codifiability +codification +codifications +codified +codifier +codifiers +codifies +codifying +codilla +codille +coding +codings +codiniac +codirect +codirected +codirecting +codirectional +codirector +codirectorship +codirects +codiscoverer +codisjunct +codist +codium +codivine +codlin +codline +codling +codlings +codlins +codman +codo +codol +codomain +codomestication +codominant +codon +codons +codpiece +codpieces +codpitchings +codrus +cods +codshead +codswallop +codworm +coe +coecal +coecum +coed +coedit +coedited +coediting +coeditor +coeditors +coeditorship +coedits +coeds +coeducate +coeducation +coeducational +coeducationalism +coeducationalize +coeducationally +coef +coeff +coeffect +coeffects +coefficacy +coefficient +coefficiently +coefficients +coeffluent +coeffluential +coehorn +coelacanth +coelacanthid +coelacanthidae +coelacanthine +coelacanthini +coelacanthoid +coelacanthous +coelanaglyphic +coelar +coelarium +coelastraceae +coelastraceous +coelastrum +coelata +coelder +coeldership +coelebogyne +coelect +coelection +coelector +coelectron +coelelminth +coelelminthes +coelelminthic +coelentera +coelenterata +coelenterate +coelenterates +coelenteric +coelenteron +coelestial +coelestine +coelevate +coelho +coelia +coeliac +coelialgia +coelian +coelicolae +coelicolist +coeligenous +coelin +coeline +coeliomyalgia +coeliorrhea +coeliorrhoea +coelioscopy +coeliotomy +coeloblastic +coeloblastula +coelococcus +coelodont +coelogastrula +coelogyne +coeloglossum +coelom +coeloma +coelomata +coelomate +coelomatic +coelomatous +coelome +coelomes +coelomesoblast +coelomic +coelomocoela +coelomopore +coeloms +coelonavigation +coelongated +coeloplanula +coeloscope +coelosperm +coelospermous +coelostat +coelozoic +coeltera +coemanate +coembedded +coembody +coembodied +coembodies +coembodying +coembrace +coeminency +coemperor +coemploy +coemployed +coemployee +coemploying +coemployment +coemploys +coempt +coempted +coempting +coemptio +coemption +coemptional +coemptionator +coemptive +coemptor +coempts +coenacle +coenact +coenacted +coenacting +coenactor +coenacts +coenacula +coenaculous +coenaculum +coenaesthesis +coenamor +coenamored +coenamoring +coenamorment +coenamors +coenamourment +coenanthium +coendear +coendidae +coendou +coendure +coendured +coendures +coenduring +coenenchym +coenenchyma +coenenchymal +coenenchymata +coenenchymatous +coenenchyme +coenesthesia +coenesthesis +coenflame +coengage +coengager +coenjoy +coenla +coeno +coenobe +coenoby +coenobiar +coenobic +coenobiod +coenobioid +coenobite +coenobitic +coenobitical +coenobitism +coenobium +coenoblast +coenoblastic +coenocentrum +coenocyte +coenocytic +coenodioecism +coenoecial +coenoecic +coenoecium +coenogamete +coenogenesis +coenogenetic +coenomonoecism +coenosarc +coenosarcal +coenosarcous +coenosite +coenospecies +coenospecific +coenospecifically +coenosteal +coenosteum +coenotype +coenotypic +coenotrope +coenthrone +coenunuri +coenure +coenures +coenuri +coenurus +coenzymatic +coenzymatically +coenzyme +coenzymes +coequal +coequality +coequalize +coequally +coequalness +coequals +coequate +coequated +coequates +coequating +coequation +coerce +coerceable +coerced +coercement +coercend +coercends +coercer +coercers +coerces +coercibility +coercible +coercibleness +coercibly +coercing +coercion +coercionary +coercionist +coercions +coercitive +coercive +coercively +coerciveness +coercivity +coerebidae +coerect +coerected +coerecting +coerects +coeruleolactite +coes +coesite +coesites +coessential +coessentiality +coessentially +coessentialness +coestablishment +coestate +coetanean +coetaneity +coetaneous +coetaneously +coetaneousness +coeternal +coeternally +coeternity +coetus +coeval +coevality +coevally +coevalneity +coevalness +coevals +coevolution +coevolutionary +coevolve +coevolvedcoevolves +coevolving +coexchangeable +coexclusive +coexecutant +coexecutor +coexecutrices +coexecutrix +coexert +coexerted +coexerting +coexertion +coexerts +coexist +coexisted +coexistence +coexistency +coexistent +coexisting +coexists +coexpand +coexpanded +coexperiencer +coexpire +coexplosion +coextend +coextended +coextending +coextends +coextension +coextensive +coextensively +coextensiveness +coextent +cofactor +cofactors +cofane +cofaster +cofather +cofathership +cofeature +cofeatures +cofeoffee +coferment +cofermentation +coff +coffea +coffee +coffeeberry +coffeeberries +coffeebush +coffeecake +coffeecakes +coffeecup +coffeegrower +coffeegrowing +coffeehouse +coffeehoused +coffeehouses +coffeehousing +coffeeleaf +coffeeman +coffeepot +coffeepots +coffeeroom +coffees +coffeetime +coffeeweed +coffeewood +coffer +cofferdam +cofferdams +coffered +cofferer +cofferfish +coffering +cofferlike +coffers +cofferwork +coffin +coffined +coffing +coffining +coffinite +coffinless +coffinmaker +coffinmaking +coffins +coffle +coffled +coffles +coffling +coffret +coffrets +coffs +cofighter +cofinal +coforeknown +coformulator +cofound +cofounded +cofounder +cofounding +cofoundress +cofounds +cofreighter +coft +cofunction +cog +cogboat +cogence +cogences +cogency +cogencies +cogener +cogeneration +cogeneric +cogenial +cogent +cogently +cogged +cogger +coggers +coggie +cogging +coggle +coggledy +cogglety +coggly +coghle +cogida +cogie +cogit +cogitability +cogitable +cogitabund +cogitabundity +cogitabundly +cogitabundous +cogitant +cogitantly +cogitate +cogitated +cogitates +cogitating +cogitatingly +cogitation +cogitations +cogitative +cogitatively +cogitativeness +cogitativity +cogitator +cogitators +cogito +cogitos +coglorify +coglorious +cogman +cogmen +cognac +cognacs +cognate +cognately +cognateness +cognates +cognati +cognatic +cognatical +cognation +cognatus +cognisability +cognisable +cognisableness +cognisably +cognisance +cognisant +cognise +cognised +cogniser +cognises +cognising +cognition +cognitional +cognitive +cognitively +cognitives +cognitivity +cognitum +cognizability +cognizable +cognizableness +cognizably +cognizance +cognizant +cognize +cognized +cognizee +cognizer +cognizers +cognizes +cognizing +cognizor +cognomen +cognomens +cognomina +cognominal +cognominally +cognominate +cognominated +cognomination +cognosce +cognoscent +cognoscente +cognoscenti +cognoscibility +cognoscible +cognoscing +cognoscitive +cognoscitively +cognovit +cognovits +cogon +cogonal +cogons +cogovernment +cogovernor +cogracious +cograil +cogrediency +cogredient +cogroad +cogs +cogswellia +coguarantor +coguardian +cogue +cogway +cogways +cogware +cogweel +cogweels +cogwheel +cogwheels +cogwood +cohabit +cohabitancy +cohabitant +cohabitate +cohabitation +cohabitations +cohabited +cohabiter +cohabiting +cohabits +cohanim +cohanims +coharmonious +coharmoniously +coharmonize +cohead +coheaded +coheading +coheads +coheartedness +coheir +coheiress +coheirs +coheirship +cohelper +cohelpership +cohen +cohenite +cohens +coherald +cohere +cohered +coherence +coherency +coherent +coherently +coherer +coherers +coheres +coheretic +cohering +coheritage +coheritor +cohert +cohesibility +cohesible +cohesion +cohesionless +cohesions +cohesive +cohesively +cohesiveness +cohibit +cohibition +cohibitive +cohibitor +cohitre +coho +cohob +cohoba +cohobate +cohobated +cohobates +cohobating +cohobation +cohobator +cohog +cohogs +cohol +coholder +coholders +cohomology +cohorn +cohort +cohortation +cohortative +cohorts +cohos +cohosh +cohoshes +cohost +cohosted +cohosting +cohosts +cohow +cohue +cohune +cohunes +cohusband +coy +coyan +coidentity +coydog +coyed +coyer +coyest +coif +coifed +coiffe +coiffed +coiffes +coiffeur +coiffeurs +coiffeuse +coiffeuses +coiffing +coiffure +coiffured +coiffures +coiffuring +coifing +coifs +coign +coigne +coigned +coignes +coigny +coigning +coigns +coigue +coying +coyish +coyishness +coil +coilability +coiled +coiler +coilers +coyly +coilyear +coiling +coillen +coils +coilsmith +coimmense +coimplicant +coimplicate +coimplore +coin +coyn +coinable +coinage +coinages +coincide +coincided +coincidence +coincidences +coincidency +coincident +coincidental +coincidentally +coincidently +coincidents +coincider +coincides +coinciding +coinclination +coincline +coinclude +coincorporate +coindicant +coindicate +coindication +coindwelling +coined +coiner +coiners +coyness +coynesses +coinfeftment +coinfer +coinferred +coinferring +coinfers +coinfinite +coinfinity +coing +coinhabit +coinhabitant +coinhabitor +coinhere +coinhered +coinherence +coinherent +coinheres +coinhering +coinheritance +coinheritor +coiny +coynye +coining +coinitial +coinmaker +coinmaking +coinmate +coinmates +coinquinate +coins +coinspire +coinstantaneity +coinstantaneous +coinstantaneously +coinstantaneousness +coinsurable +coinsurance +coinsure +coinsured +coinsurer +coinsures +coinsuring +cointense +cointension +cointensity +cointer +cointerest +cointerred +cointerring +cointers +cointersecting +cointise +cointreau +coinventor +coinvolve +coyo +coyol +coyos +coyote +coyotero +coyotes +coyotillo +coyotillos +coyoting +coypou +coypous +coypu +coypus +coir +coirs +coys +coislander +coisns +coistrel +coystrel +coistrels +coistril +coistrils +coit +coital +coitally +coition +coitional +coitions +coitophobia +coiture +coitus +coituses +coyure +coix +cojoin +cojones +cojudge +cojudices +cojuror +cojusticiar +coke +coked +cokey +cokelike +cokeman +cokeney +coker +cokery +cokernut +cokers +cokes +cokewold +coky +cokie +coking +cokneyfy +cokuloris +col +cola +colaborer +colacobioses +colacobiosis +colacobiotic +colada +colage +colalgia +colament +colan +colander +colanders +colane +colaphize +colarin +colas +colascione +colasciones +colascioni +colat +colate +colation +colatitude +colatorium +colature +colauxe +colazione +colback +colberter +colbertine +colbertism +colcannon +colchian +colchicaceae +colchicia +colchicin +colchicine +colchicum +colchis +colchyte +colcine +colcothar +cold +coldblood +coldblooded +coldbloodedness +coldcock +colder +coldest +coldfinch +coldhearted +coldheartedly +coldheartedness +coldish +coldly +coldness +coldnesses +coldong +coldproof +colds +coldslaw +coldturkey +cole +coleader +colecannon +colectomy +colectomies +coleen +colegatee +colegislator +coley +colemanite +colemouse +colen +colent +coleochaetaceae +coleochaetaceous +coleochaete +coleophora +coleophoridae +coleopter +coleoptera +coleopteral +coleopteran +coleopterist +coleopteroid +coleopterology +coleopterological +coleopteron +coleopterous +coleoptile +coleoptilum +coleopttera +coleorhiza +coleorhizae +coleosporiaceae +coleosporium +coleplant +colera +coles +coleseed +coleseeds +coleslaw +coleslaws +colessee +colessees +colessor +colessors +colet +coletit +coleur +coleus +coleuses +colewort +coleworts +colfox +coli +coly +coliander +colias +colyba +colibacillosis +colibacterin +colibert +colibertus +colibri +colic +colical +colichemarde +colicin +colicine +colicines +colicins +colicystitis +colicystopyelitis +colicker +colicky +colicolitis +colicroot +colics +colicweed +colicwort +colies +coliform +coliforms +coliidae +coliiformes +colilysin +colima +colymbidae +colymbiform +colymbion +colymbriformes +colymbus +colin +colinear +colinearity +colinephritis +coling +colins +colinus +colyone +colyonic +coliphage +colipyelitis +colipyuria +coliplication +colipuncture +colisepsis +coliseum +coliseums +colistin +colistins +colitic +colytic +colitis +colitises +colitoxemia +colyum +colyumist +coliuria +colius +colk +coll +colla +collab +collabent +collaborate +collaborated +collaborates +collaborateur +collaborating +collaboration +collaborationism +collaborationist +collaborationists +collaborations +collaborative +collaboratively +collaborativeness +collaborator +collaborators +collada +colladas +collage +collagen +collagenase +collagenic +collagenous +collagens +collages +collagist +collapsability +collapsable +collapsar +collapse +collapsed +collapses +collapsibility +collapsible +collapsing +collar +collarband +collarbird +collarbone +collarbones +collard +collards +collare +collared +collaret +collarets +collarette +collaring +collarino +collarinos +collarless +collarman +collars +collat +collatable +collate +collated +collatee +collateral +collaterality +collateralize +collateralized +collateralizing +collaterally +collateralness +collaterals +collates +collating +collation +collational +collationer +collations +collatitious +collative +collator +collators +collatress +collaud +collaudation +colleague +colleagued +colleagues +colleagueship +colleaguesmanship +colleaguing +collect +collectability +collectable +collectables +collectanea +collectarium +collected +collectedly +collectedness +collectibility +collectible +collectibles +collecting +collection +collectional +collectioner +collections +collective +collectively +collectiveness +collectives +collectivise +collectivism +collectivist +collectivistic +collectivistically +collectivists +collectivity +collectivities +collectivization +collectivize +collectivized +collectivizes +collectivizing +collectivum +collector +collectorate +collectors +collectorship +collectress +collects +colleen +colleens +collegatary +college +colleger +collegers +colleges +collegese +collegia +collegial +collegialism +collegiality +collegially +collegian +collegianer +collegians +collegiant +collegiate +collegiately +collegiateness +collegiation +collegiugia +collegium +collegiums +colley +collembola +collembolan +collembole +collembolic +collembolous +collen +collenchyma +collenchymatic +collenchymatous +collenchyme +collencytal +collencyte +colleri +collery +colleries +collet +colletarium +colleted +colleter +colleterial +colleterium +colletes +colletia +colletic +colletidae +colletin +colleting +colletotrichum +collets +colletside +colly +collyba +collibert +collybia +collybist +collicle +colliculate +colliculus +collide +collided +collides +collidin +collidine +colliding +collie +collied +collielike +collier +colliery +collieries +colliers +collies +collieshangie +colliflower +colliform +colligance +colligate +colligated +colligating +colligation +colligative +colligible +collying +collylyria +collimate +collimated +collimates +collimating +collimation +collimator +collimators +collin +collinal +colline +collinear +collinearity +collinearly +collineate +collineation +colling +collingly +collingual +collins +collinses +collinsia +collinsite +collinsonia +colliquable +colliquament +colliquate +colliquation +colliquative +colliquativeness +colliquefaction +collyr +collyria +collyridian +collyrie +collyrite +collyrium +collyriums +collis +collision +collisional +collisions +collisive +collywest +collyweston +collywobbles +colloblast +collobrierite +collocal +collocalia +collocate +collocated +collocates +collocating +collocation +collocationable +collocational +collocations +collocative +collocatory +collochemistry +collochromate +collock +collocution +collocutor +collocutory +collodiochloride +collodion +collodionization +collodionize +collodiotype +collodium +collogen +collogue +collogued +collogues +colloguing +colloid +colloidal +colloidality +colloidally +colloider +colloidize +colloidochemical +colloids +collomia +collop +colloped +collophane +collophanite +collophore +collops +colloq +colloque +colloquy +colloquia +colloquial +colloquialism +colloquialisms +colloquialist +colloquiality +colloquialize +colloquializer +colloquially +colloquialness +colloquies +colloquiquia +colloquiquiums +colloquist +colloquium +colloquiums +colloquize +colloquized +colloquizing +colloququia +collossians +collothun +collotype +collotyped +collotypy +collotypic +collotyping +collow +colloxylin +colluctation +collude +colluded +colluder +colluders +colludes +colluding +collum +collumelliaceous +collun +collunaria +collunarium +collusion +collusive +collusively +collusiveness +collusory +collut +collution +collutory +collutoria +collutories +collutorium +colluvia +colluvial +colluvies +colluvium +colluviums +colmar +colmars +colmose +colnaria +colob +colobin +colobium +coloboma +colobus +colocasia +colocate +colocated +colocates +colocating +colocentesis +colocephali +colocephalous +colocynth +colocynthin +coloclysis +colocola +colocolic +colocolo +colodyspepsia +coloenteritis +colog +cologarithm +cologne +cologned +colognes +cologs +colola +cololite +colomb +colombia +colombian +colombians +colombier +colombin +colombina +colombo +colometry +colometric +colometrically +colon +colonaded +colonalgia +colonate +colonel +colonelcy +colonelcies +colonels +colonelship +colonelships +coloner +colones +colonette +colongitude +coloni +colony +colonial +colonialise +colonialised +colonialising +colonialism +colonialist +colonialistic +colonialists +colonialization +colonialize +colonialized +colonializing +colonially +colonialness +colonials +colonic +colonical +colonies +colonisability +colonisable +colonisation +colonisationist +colonise +colonised +coloniser +colonises +colonising +colonist +colonists +colonitis +colonizability +colonizable +colonization +colonizationist +colonizations +colonize +colonized +colonizer +colonizers +colonizes +colonizing +colonnade +colonnaded +colonnades +colonnette +colonopathy +colonopexy +colonoscope +colonoscopy +colons +colonus +colopexy +colopexia +colopexotomy +colophan +colophane +colophany +colophene +colophenic +colophon +colophonate +colophony +colophonian +colophonic +colophonist +colophonite +colophonium +colophons +coloplication +coloppe +coloproctitis +coloptosis +colopuncture +coloquies +coloquintid +coloquintida +color +colorability +colorable +colorableness +colorably +coloradan +coloradans +colorado +coloradoite +colorant +colorants +colorate +coloration +colorational +colorationally +colorations +colorative +coloratura +coloraturas +colorature +colorbearer +colorblind +colorblindness +colorbreed +colorcast +colorcasted +colorcaster +colorcasting +colorcasts +colorectitis +colorectostomy +colored +coloreds +colorer +colorers +colorfast +colorfastness +colorful +colorfully +colorfulness +colory +colorific +colorifics +colorimeter +colorimetry +colorimetric +colorimetrical +colorimetrically +colorimetrics +colorimetrist +colorin +coloring +colorings +colorism +colorisms +colorist +coloristic +coloristically +colorists +colorization +colorize +colorless +colorlessly +colorlessness +colormaker +colormaking +colorman +coloroto +colorrhaphy +colors +colortype +colorum +coloslossi +coloslossuses +coloss +colossal +colossality +colossally +colossean +colosseum +colossi +colossian +colossians +colosso +colossochelys +colossus +colossuses +colossuswise +colostomy +colostomies +colostral +colostration +colostric +colostrous +colostrum +colotyphoid +colotomy +colotomies +colour +colourability +colourable +colourableness +colourably +colouration +colourational +colourationally +colourative +coloured +colourer +colourers +colourfast +colourful +colourfully +colourfulness +coloury +colourific +colourifics +colouring +colourist +colouristic +colourize +colourless +colourlessly +colourlessness +colourman +colours +colourtype +colove +colp +colpenchyma +colpeo +colpeurynter +colpeurysis +colpheg +colpindach +colpitis +colpitises +colpocele +colpocystocele +colpohyperplasia +colpohysterotomy +colpoperineoplasty +colpoperineorrhaphy +colpoplasty +colpoplastic +colpoptosis +colporrhagia +colporrhaphy +colporrhea +colporrhexis +colport +colportage +colporter +colporteur +colporteurs +colposcope +colposcopy +colpostat +colpotomy +colpotomies +colpus +cols +colstaff +colt +colter +colters +colthood +coltish +coltishly +coltishness +coltlike +coltoria +coltpixy +coltpixie +colts +coltsfoot +coltsfoots +coltskin +colubaria +coluber +colubrid +colubridae +colubrids +colubriform +colubriformes +colubriformia +colubrina +colubrinae +colubrine +colubroid +colugo +colugos +columba +columbaceous +columbae +columban +columbanian +columbary +columbaria +columbaries +columbarium +columbate +columbeia +columbeion +columbella +columbia +columbiad +columbian +columbic +columbid +columbidae +columbier +columbiferous +columbiformes +columbin +columbine +columbines +columbite +columbium +columbo +columboid +columbotantalate +columbotitanate +columbous +columbus +columel +columella +columellae +columellar +columellate +columellia +columelliaceae +columelliform +columels +column +columna +columnal +columnar +columnarian +columnarity +columnarized +columnate +columnated +columnates +columnating +columnation +columnea +columned +columner +columniation +columniferous +columniform +columning +columnist +columnistic +columnists +columnization +columnize +columnized +columnizes +columnizing +columns +columnwise +colunar +colure +colures +colusite +colutea +colville +colza +colzas +com +coma +comacine +comade +comae +comagistracy +comagmatic +comake +comaker +comakers +comaking +comal +comales +comals +comamie +coman +comanche +comanchean +comanches +comandante +comandantes +comandanti +comandra +comanic +comarca +comart +comarum +comas +comate +comates +comatic +comatik +comatiks +comatose +comatosely +comatoseness +comatosity +comatous +comatula +comatulae +comatulid +comb +combaron +combasou +combat +combatable +combatant +combatants +combated +combater +combaters +combating +combative +combatively +combativeness +combativity +combats +combattant +combattants +combatted +combatter +combatting +combe +combed +comber +combers +combes +combfish +combfishes +combflower +comby +combinability +combinable +combinableness +combinably +combinant +combinantive +combinate +combination +combinational +combinations +combinative +combinator +combinatory +combinatorial +combinatorially +combinatoric +combinatorics +combinators +combind +combine +combined +combinedly +combinedness +combinement +combiner +combiners +combines +combing +combings +combining +combite +comble +combless +comblessness +comblike +combmaker +combmaking +combo +comboy +comboloio +combos +combre +combretaceae +combretaceous +combretum +combs +combure +comburendo +comburent +comburgess +comburimeter +comburimetry +comburivorous +combust +combusted +combustibility +combustibilities +combustible +combustibleness +combustibles +combustibly +combusting +combustion +combustious +combustive +combustively +combustor +combusts +combwise +combwright +comd +comdg +comdia +comdr +comdt +come +comeatable +comeback +comebacker +comebacks +comecrudo +comeddle +comedy +comedia +comedial +comedian +comedians +comediant +comedic +comedical +comedically +comedienne +comediennes +comedies +comedietta +comediettas +comediette +comedist +comedo +comedones +comedos +comedown +comedowns +comely +comelier +comeliest +comelily +comeliness +comeling +comendite +comenic +comephorous +comer +comers +comes +comessation +comestible +comestibles +comestion +comet +cometary +cometaria +cometarium +cometh +comether +comethers +cometic +cometical +cometlike +cometographer +cometography +cometographical +cometoid +cometology +comets +cometwise +comeupance +comeuppance +comeuppances +comfy +comfier +comfiest +comfily +comfiness +comfit +comfits +comfiture +comfort +comfortability +comfortabilities +comfortable +comfortableness +comfortably +comfortation +comfortative +comforted +comforter +comforters +comfortful +comforting +comfortingly +comfortless +comfortlessly +comfortlessness +comfortress +comfortroot +comforts +comfrey +comfreys +comiakin +comic +comical +comicality +comically +comicalness +comices +comicocynical +comicocratic +comicodidactic +comicography +comicoprosaic +comicotragedy +comicotragic +comicotragical +comicry +comics +comid +comida +comiferous +cominform +cominformist +cominformists +coming +comingle +comings +comino +comintern +comique +comism +comitadji +comital +comitant +comitatensian +comitative +comitatus +comite +comites +comity +comitia +comitial +comities +comitium +comitiva +comitje +comitragedy +coml +comm +comma +commaes +commaing +command +commandable +commandant +commandants +commandatory +commanded +commandedness +commandeer +commandeered +commandeering +commandeers +commander +commandery +commanderies +commanders +commandership +commanding +commandingly +commandingness +commandite +commandless +commandment +commandments +commando +commandoes +commandoman +commandos +commandress +commandry +commandrie +commandries +commands +commark +commas +commassation +commassee +commata +commaterial +commatic +commation +commatism +comme +commeasurable +commeasure +commeasured +commeasuring +commeddle +commelina +commelinaceae +commelinaceous +commem +commemorable +commemorate +commemorated +commemorates +commemorating +commemoration +commemorational +commemorations +commemorative +commemoratively +commemorativeness +commemorator +commemoratory +commemorators +commemorize +commemorized +commemorizing +commence +commenceable +commenced +commencement +commencements +commencer +commences +commencing +commend +commenda +commendable +commendableness +commendably +commendador +commendam +commendatary +commendation +commendations +commendator +commendatory +commendatories +commendatorily +commended +commender +commending +commendingly +commendment +commends +commensal +commensalism +commensalist +commensalistic +commensality +commensally +commensals +commensurability +commensurable +commensurableness +commensurably +commensurate +commensurated +commensurately +commensurateness +commensurating +commensuration +commensurations +comment +commentable +commentary +commentarial +commentarialism +commentaries +commentate +commentated +commentating +commentation +commentative +commentator +commentatorial +commentatorially +commentators +commentatorship +commented +commenter +commenting +commentitious +comments +commerce +commerced +commerceless +commercer +commerces +commercia +commerciable +commercial +commercialisation +commercialise +commercialised +commercialising +commercialism +commercialist +commercialistic +commercialists +commerciality +commercialization +commercializations +commercialize +commercialized +commercializes +commercializing +commercially +commercialness +commercials +commercing +commercium +commerge +commers +commesso +commy +commie +commies +commigration +commilitant +comminate +comminated +comminating +commination +comminative +comminator +comminatory +commingle +commingled +comminglement +commingler +commingles +commingling +comminister +comminuate +comminute +comminuted +comminuting +comminution +comminutor +commiphora +commis +commisce +commise +commiserable +commiserate +commiserated +commiserates +commiserating +commiseratingly +commiseration +commiserations +commiserative +commiseratively +commiserator +commissar +commissary +commissarial +commissariat +commissariats +commissaries +commissaryship +commissars +commission +commissionaire +commissional +commissionary +commissionate +commissionated +commissionating +commissioned +commissioner +commissioners +commissionership +commissionerships +commissioning +commissions +commissionship +commissive +commissively +commissoria +commissural +commissure +commissurotomy +commissurotomies +commistion +commit +commitment +commitments +commits +committable +committal +committals +committed +committedly +committedness +committee +committeeism +committeeman +committeemen +committees +committeeship +committeewoman +committeewomen +committent +committer +committible +committing +committitur +committment +committor +commix +commixed +commixes +commixing +commixt +commixtion +commixture +commo +commodata +commodatary +commodate +commodation +commodatum +commode +commoderate +commodes +commodious +commodiously +commodiousness +commoditable +commodity +commodities +commodore +commodores +commoigne +commolition +common +commonable +commonage +commonality +commonalities +commonalty +commonalties +commonance +commoned +commonefaction +commoney +commoner +commoners +commonership +commonest +commoning +commonish +commonition +commonize +commonly +commonness +commonplace +commonplaceism +commonplacely +commonplaceness +commonplacer +commonplaces +commons +commonsense +commonsensible +commonsensibly +commonsensical +commonsensically +commonty +commonweal +commonweals +commonwealth +commonwealthism +commonwealths +commorancy +commorancies +commorant +commorient +commorse +commorth +commos +commot +commote +commotion +commotional +commotions +commotive +commove +commoved +commoves +commoving +commulation +commulative +communa +communal +communalisation +communalise +communalised +communaliser +communalising +communalism +communalist +communalistic +communality +communalization +communalize +communalized +communalizer +communalizing +communally +communard +communbus +commune +communed +communer +communes +communicability +communicable +communicableness +communicably +communicant +communicants +communicate +communicated +communicatee +communicates +communicating +communication +communicational +communications +communicative +communicatively +communicativeness +communicator +communicatory +communicators +communing +communion +communionable +communional +communionist +communions +communiqu +communique +communiques +communis +communisation +communise +communised +communising +communism +communist +communistery +communisteries +communistic +communistical +communistically +communists +communital +communitary +communitarian +communitarianism +community +communities +communitive +communitywide +communitorium +communization +communize +communized +communizing +commutability +commutable +commutableness +commutant +commutate +commutated +commutating +commutation +commutations +commutative +commutatively +commutativity +commutator +commutators +commute +commuted +commuter +commuters +commutes +commuting +commutual +commutuality +comnenian +comodato +comodo +comoedia +comoedus +comoid +comolecule +comonomer +comonte +comoquer +comorado +comortgagee +comose +comourn +comourner +comournful +comous +comox +comp +compaa +compact +compactability +compactable +compacted +compactedly +compactedness +compacter +compactest +compactible +compactify +compactification +compactile +compacting +compaction +compactions +compactly +compactness +compactor +compactors +compacts +compacture +compadre +compadres +compage +compages +compaginate +compagination +compagnie +compagnies +companable +companage +companator +compander +companero +companeros +company +compania +companiable +companias +companied +companies +companying +companyless +companion +companionability +companionable +companionableness +companionably +companionage +companionate +companioned +companioning +companionize +companionized +companionizing +companionless +companions +companionship +companionway +companionways +compar +comparability +comparable +comparableness +comparably +comparascope +comparate +comparatist +comparatival +comparative +comparatively +comparativeness +comparatives +comparativist +comparator +comparators +comparcioner +compare +compared +comparer +comparers +compares +comparing +comparison +comparisons +comparition +comparograph +comparsa +compart +comparted +compartimenti +compartimento +comparting +compartition +compartment +compartmental +compartmentalization +compartmentalize +compartmentalized +compartmentalizes +compartmentalizing +compartmentally +compartmentation +compartmented +compartmentize +compartments +compartner +comparts +compass +compassability +compassable +compassed +compasser +compasses +compassing +compassion +compassionable +compassionate +compassionated +compassionately +compassionateness +compassionating +compassionless +compassive +compassivity +compassless +compassment +compaternity +compathy +compatibility +compatibilities +compatible +compatibleness +compatibles +compatibly +compatience +compatient +compatriot +compatriotic +compatriotism +compatriots +compd +compear +compearance +compearant +comped +compeer +compeered +compeering +compeers +compel +compellability +compellable +compellably +compellation +compellative +compelled +compellent +compeller +compellers +compelling +compellingly +compels +compend +compendency +compendent +compendia +compendiary +compendiate +compendious +compendiously +compendiousness +compendium +compendiums +compends +compenetrate +compenetration +compensability +compensable +compensate +compensated +compensates +compensating +compensatingly +compensation +compensational +compensations +compensative +compensatively +compensativeness +compensator +compensatory +compensators +compense +compenser +compere +compered +comperes +compering +compert +compesce +compester +compete +competed +competence +competency +competencies +competent +competently +competentness +competer +competes +competible +competing +competingly +competition +competitioner +competitions +competitive +competitively +competitiveness +competitor +competitory +competitors +competitorship +competitress +competitrix +compilable +compilation +compilations +compilator +compilatory +compile +compileable +compiled +compilement +compiler +compilers +compiles +compiling +comping +compinge +compital +compitalia +compitum +complacence +complacency +complacencies +complacent +complacential +complacentially +complacently +complain +complainable +complainant +complainants +complained +complainer +complainers +complaining +complainingly +complainingness +complains +complaint +complaintful +complaintive +complaintiveness +complaints +complaisance +complaisant +complaisantly +complaisantness +complanar +complanate +complanation +complant +compleat +compleated +complect +complected +complecting +complection +complects +complement +complemental +complementally +complementalness +complementary +complementaries +complementarily +complementariness +complementarism +complementarity +complementation +complementative +complemented +complementer +complementers +complementing +complementizer +complementoid +complements +completable +complete +completed +completedness +completely +completement +completeness +completer +completers +completes +completest +completing +completion +completions +completive +completively +completory +completories +complex +complexation +complexed +complexedness +complexer +complexes +complexest +complexify +complexification +complexing +complexion +complexionably +complexional +complexionally +complexionary +complexioned +complexionist +complexionless +complexions +complexity +complexities +complexive +complexively +complexly +complexness +complexometry +complexometric +complexus +comply +compliable +compliableness +compliably +compliance +compliances +compliancy +compliancies +compliant +compliantly +complicacy +complicacies +complicant +complicate +complicated +complicatedly +complicatedness +complicates +complicating +complication +complications +complicative +complicator +complicators +complice +complices +complicity +complicities +complicitous +complied +complier +compliers +complies +complying +compliment +complimentable +complimental +complimentally +complimentalness +complimentary +complimentarily +complimentariness +complimentarity +complimentation +complimentative +complimented +complimenter +complimenters +complimenting +complimentingly +compliments +complin +compline +complines +complins +complish +complot +complotment +complots +complotted +complotter +complotting +complutensian +compluvia +compluvium +compo +compoed +compoer +compoing +compole +compone +componed +componency +componendo +component +componental +componented +componential +componentry +components +componentwise +compony +comport +comportable +comportance +comported +comporting +comportment +comports +compos +composable +composal +composant +compose +composed +composedly +composedness +composer +composers +composes +composing +composit +composita +compositae +composite +composited +compositely +compositeness +composites +compositing +composition +compositional +compositionally +compositions +compositive +compositively +compositor +compositorial +compositors +compositous +compositure +composograph +compossibility +compossible +compost +composted +composting +composts +composture +composure +compot +compotation +compotationship +compotator +compotatory +compote +compotes +compotier +compotiers +compotor +compound +compoundable +compounded +compoundedness +compounder +compounders +compounding +compoundness +compounds +comprachico +comprachicos +comprador +compradore +comprecation +compreg +compregnate +comprehend +comprehended +comprehender +comprehendible +comprehending +comprehendingly +comprehends +comprehense +comprehensibility +comprehensible +comprehensibleness +comprehensibly +comprehension +comprehensive +comprehensively +comprehensiveness +comprehensives +comprehensor +comprend +compresbyter +compresbyterial +compresence +compresent +compress +compressed +compressedly +compresses +compressibility +compressibilities +compressible +compressibleness +compressibly +compressing +compressingly +compression +compressional +compressions +compressive +compressively +compressometer +compressor +compressors +compressure +comprest +compriest +comprint +comprisable +comprisal +comprise +comprised +comprises +comprising +comprizable +comprizal +comprize +comprized +comprizes +comprizing +comprobate +comprobation +comproduce +compromis +compromisable +compromise +compromised +compromiser +compromisers +compromises +compromising +compromisingly +compromissary +compromission +compromissorial +compromit +compromitment +compromitted +compromitting +comprovincial +comps +compsilura +compsoa +compsognathus +compsothlypidae +compt +compte +compted +compter +comptible +comptie +compting +comptly +comptness +comptoir +comptometer +comptonia +comptonite +comptrol +comptroller +comptrollers +comptrollership +compts +compulsative +compulsatively +compulsatory +compulsatorily +compulse +compulsed +compulsion +compulsions +compulsitor +compulsive +compulsively +compulsiveness +compulsives +compulsivity +compulsory +compulsorily +compulsoriness +compunct +compunction +compunctionary +compunctionless +compunctions +compunctious +compunctiously +compunctive +compupil +compurgation +compurgator +compurgatory +compurgatorial +compursion +computability +computable +computably +computate +computation +computational +computationally +computations +computative +computatively +computativeness +compute +computed +computer +computerese +computerise +computerite +computerizable +computerization +computerize +computerized +computerizes +computerizing +computerlike +computernik +computers +computes +computing +computist +computus +comr +comrade +comradely +comradeliness +comradery +comrades +comradeship +comrado +comrogue +coms +comsat +comsomol +comstock +comstockery +comstockeries +comte +comtes +comtesse +comtesses +comtian +comtism +comtist +comunidad +comurmurer +comus +comvia +con +conable +conacaste +conacre +conal +conalbumin +conamarin +conamed +conand +conant +conarial +conarium +conation +conational +conationalistic +conations +conative +conatural +conatus +conaxial +conbinas +conc +concactenated +concamerate +concamerated +concameration +concanavalin +concaptive +concarnation +concassation +concatenary +concatenate +concatenated +concatenates +concatenating +concatenation +concatenations +concatenator +concatervate +concaulescence +concausal +concause +concavation +concave +concaved +concavely +concaveness +concaver +concaves +concaving +concavity +concavities +concavo +conceal +concealable +concealed +concealedly +concealedness +concealer +concealers +concealing +concealingly +concealment +conceals +concede +conceded +concededly +conceder +conceders +concedes +conceding +conceit +conceited +conceitedly +conceitedness +conceity +conceiting +conceitless +conceits +conceivability +conceivable +conceivableness +conceivably +conceive +conceived +conceiver +conceivers +conceives +conceiving +concelebrate +concelebrated +concelebrates +concelebrating +concelebration +concelebrations +concent +concenter +concentered +concentering +concentive +concento +concentralization +concentralize +concentrate +concentrated +concentrates +concentrating +concentration +concentrations +concentrative +concentrativeness +concentrator +concentrators +concentre +concentred +concentric +concentrical +concentrically +concentricate +concentricity +concentring +concents +concentual +concentus +concept +conceptacle +conceptacular +conceptaculum +conceptible +conception +conceptional +conceptionist +conceptions +conceptism +conceptive +conceptiveness +concepts +conceptual +conceptualisation +conceptualise +conceptualised +conceptualising +conceptualism +conceptualist +conceptualistic +conceptualistically +conceptualists +conceptuality +conceptualization +conceptualizations +conceptualize +conceptualized +conceptualizer +conceptualizes +conceptualizing +conceptually +conceptus +concern +concernancy +concerned +concernedly +concernedness +concerning +concerningly +concerningness +concernment +concerns +concert +concertante +concertantes +concertanti +concertanto +concertati +concertation +concertato +concertatos +concerted +concertedly +concertedness +concertgoer +concerti +concertina +concertinas +concerting +concertini +concertinist +concertino +concertinos +concertion +concertise +concertised +concertiser +concertising +concertist +concertize +concertized +concertizer +concertizes +concertizing +concertmaster +concertmasters +concertmeister +concertment +concerto +concertos +concerts +concertstck +concertstuck +concessible +concession +concessionaire +concessionaires +concessional +concessionary +concessionaries +concessioner +concessionist +concessions +concessit +concessive +concessively +concessiveness +concessor +concessory +concetti +concettism +concettist +concetto +conch +concha +conchae +conchal +conchate +conche +conched +concher +conches +conchfish +conchfishes +conchy +conchie +conchies +conchifera +conchiferous +conchiform +conchyle +conchylia +conchyliated +conchyliferous +conchylium +conchinin +conchinine +conchiolin +conchite +conchitic +conchitis +concho +conchobor +conchoid +conchoidal +conchoidally +conchoids +conchol +conchology +conchological +conchologically +conchologist +conchologize +conchometer +conchometry +conchospiral +conchostraca +conchotome +conchs +conchubar +conchucu +conchuela +conciator +concyclic +concyclically +concierge +concierges +concile +conciliable +conciliabule +conciliabulum +conciliar +conciliarism +conciliarly +conciliate +conciliated +conciliates +conciliating +conciliatingly +conciliation +conciliationist +conciliations +conciliative +conciliator +conciliatory +conciliatorily +conciliatoriness +conciliators +concilium +concinnate +concinnated +concinnating +concinnity +concinnities +concinnous +concinnously +concio +concion +concional +concionary +concionate +concionator +concionatory +conciousness +concipiency +concipient +concise +concisely +conciseness +conciser +concisest +concision +concitation +concite +concitizen +conclamant +conclamation +conclave +conclaves +conclavist +concludable +conclude +concluded +concludence +concludency +concludendi +concludent +concludently +concluder +concluders +concludes +concludible +concluding +concludingly +conclusible +conclusion +conclusional +conclusionally +conclusions +conclusive +conclusively +conclusiveness +conclusory +conclusum +concn +concoagulate +concoagulation +concoct +concocted +concocter +concocting +concoction +concoctions +concoctive +concoctor +concocts +concolor +concolorous +concolour +concomitance +concomitancy +concomitant +concomitantly +concomitate +concommitant +concommitantly +conconscious +concord +concordable +concordably +concordal +concordance +concordancer +concordances +concordancy +concordant +concordantial +concordantly +concordat +concordatory +concordats +concordatum +concorder +concordial +concordist +concordity +concordly +concords +concorporate +concorporated +concorporating +concorporation +concorrezanes +concours +concourse +concourses +concreate +concredit +concremation +concrement +concresce +concrescence +concrescences +concrescent +concrescible +concrescive +concrete +concreted +concretely +concreteness +concreter +concretes +concreting +concretion +concretional +concretionary +concretions +concretism +concretist +concretive +concretively +concretization +concretize +concretized +concretizing +concretor +concrew +concrfsce +concubinage +concubinal +concubinary +concubinarian +concubinaries +concubinate +concubine +concubinehood +concubines +concubitancy +concubitant +concubitous +concubitus +conculcate +conculcation +concumbency +concupy +concupiscence +concupiscent +concupiscible +concupiscibleness +concur +concurbit +concurred +concurrence +concurrences +concurrency +concurrencies +concurrent +concurrently +concurrentness +concurring +concurringly +concurs +concursion +concurso +concursus +concuss +concussant +concussation +concussed +concusses +concussing +concussion +concussional +concussions +concussive +concussively +concutient +cond +condalia +condecent +condemn +condemnable +condemnably +condemnate +condemnation +condemnations +condemnatory +condemned +condemner +condemners +condemning +condemningly +condemnor +condemns +condensability +condensable +condensance +condensary +condensaries +condensate +condensates +condensation +condensational +condensations +condensative +condensator +condense +condensed +condensedly +condensedness +condenser +condensery +condenseries +condensers +condenses +condensible +condensing +condensity +conder +condescend +condescended +condescendence +condescendent +condescender +condescending +condescendingly +condescendingness +condescends +condescension +condescensions +condescensive +condescensively +condescensiveness +condescent +condiction +condictious +condiddle +condiddled +condiddlement +condiddling +condign +condigness +condignity +condignly +condignness +condylar +condylarth +condylarthra +condylarthrosis +condylarthrous +condyle +condylectomy +condyles +condylion +condyloid +condyloma +condylomas +condylomata +condylomatous +condylome +condylopod +condylopoda +condylopodous +condylos +condylotomy +condylura +condylure +condiment +condimental +condimentary +condiments +condisciple +condistillation +condite +condition +conditionable +conditional +conditionalism +conditionalist +conditionality +conditionalities +conditionalize +conditionally +conditionals +conditionate +conditione +conditioned +conditioner +conditioners +conditioning +conditions +condititivia +conditivia +conditivium +conditory +conditoria +conditorium +conditotoria +condivision +condo +condog +condolatory +condole +condoled +condolement +condolence +condolences +condolent +condoler +condolers +condoles +condoling +condolingly +condom +condominate +condominial +condominiia +condominiiums +condominium +condominiums +condoms +condonable +condonance +condonation +condonations +condonative +condone +condoned +condonement +condoner +condoners +condones +condoning +condor +condores +condors +condos +condottiere +condottieri +conduce +conduceability +conduced +conducement +conducent +conducer +conducers +conduces +conducible +conducibleness +conducibly +conducing +conducingly +conducive +conduciveness +conduct +conducta +conductance +conductances +conducted +conductibility +conductible +conductility +conductimeter +conductimetric +conducting +conductio +conduction +conductional +conductitious +conductive +conductively +conductivity +conductivities +conductometer +conductometric +conductor +conductory +conductorial +conductorless +conductors +conductorship +conductress +conducts +conductus +condue +conduit +conduits +conduplicate +conduplicated +conduplication +condurangin +condurango +condurrite +cone +coned +coneen +coneflower +conehead +coney +coneighboring +coneine +coneys +conelet +conelike +conelrad +conelrads +conemaker +conemaking +conemaugh +conenchyma +conenose +conenoses +conepate +conepates +conepatl +conepatls +coner +cones +conessine +conestoga +conf +confab +confabbed +confabbing +confabs +confabular +confabulate +confabulated +confabulates +confabulating +confabulation +confabulations +confabulator +confabulatory +confact +confarreate +confarreated +confarreation +confated +confect +confected +confecting +confection +confectionary +confectionaries +confectioner +confectionery +confectioneries +confectioners +confectiones +confections +confectory +confects +confecture +confed +confeder +confederacy +confederacies +confederal +confederalist +confederate +confederated +confederater +confederates +confederating +confederatio +confederation +confederationism +confederationist +confederations +confederatism +confederative +confederatize +confederator +confelicity +confer +conferee +conferees +conference +conferences +conferencing +conferential +conferment +conferrable +conferral +conferred +conferree +conferrence +conferrer +conferrers +conferring +conferruminate +confers +conferted +conferva +confervaceae +confervaceous +confervae +conferval +confervales +confervalike +confervas +confervoid +confervoideae +confervous +confess +confessable +confessant +confessary +confessarius +confessed +confessedly +confesser +confesses +confessing +confessingly +confession +confessional +confessionalian +confessionalism +confessionalist +confessionally +confessionals +confessionary +confessionaries +confessionist +confessions +confessor +confessory +confessors +confessorship +confest +confetti +confetto +conficient +confidant +confidante +confidantes +confidants +confide +confided +confidence +confidences +confidency +confident +confidente +confidential +confidentiality +confidentially +confidentialness +confidentiary +confidently +confidentness +confider +confiders +confides +confiding +confidingly +confidingness +configurable +configural +configurate +configurated +configurating +configuration +configurational +configurationally +configurationism +configurationist +configurations +configurative +configure +configured +configures +configuring +confinable +confine +confineable +confined +confinedly +confinedness +confineless +confinement +confinements +confiner +confiners +confines +confining +confinity +confirm +confirmability +confirmable +confirmand +confirmation +confirmational +confirmations +confirmative +confirmatively +confirmatory +confirmatorily +confirmed +confirmedly +confirmedness +confirmee +confirmer +confirming +confirmingly +confirmity +confirmment +confirmor +confirms +confiscable +confiscatable +confiscate +confiscated +confiscates +confiscating +confiscation +confiscations +confiscator +confiscatory +confiscators +confiserie +confisk +confisticating +confit +confitent +confiteor +confiture +confix +confixed +confixing +conflab +conflagrant +conflagrate +conflagrated +conflagrating +conflagration +conflagrations +conflagrative +conflagrator +conflagratory +conflate +conflated +conflates +conflating +conflation +conflexure +conflict +conflicted +conflictful +conflicting +conflictingly +confliction +conflictive +conflictless +conflictory +conflicts +conflictual +conflow +confluence +confluences +confluent +confluently +conflux +confluxes +confluxibility +confluxible +confluxibleness +confocal +confocally +conforbably +conform +conformability +conformable +conformableness +conformably +conformal +conformance +conformant +conformate +conformation +conformational +conformationally +conformations +conformator +conformed +conformer +conformers +conforming +conformingly +conformism +conformist +conformists +conformity +conformities +conforms +confort +confound +confoundable +confounded +confoundedly +confoundedness +confounder +confounders +confounding +confoundingly +confoundment +confounds +confr +confract +confraction +confragose +confrater +confraternal +confraternity +confraternities +confraternization +confrere +confreres +confrerie +confriar +confricamenta +confricamentum +confrication +confront +confrontal +confrontation +confrontational +confrontationism +confrontationist +confrontations +confronte +confronted +confronter +confronters +confronting +confrontment +confronts +confucian +confucianism +confucianist +confucians +confucius +confusability +confusable +confusably +confuse +confused +confusedly +confusedness +confuser +confusers +confuses +confusing +confusingly +confusion +confusional +confusions +confusive +confusticate +confustication +confutability +confutable +confutation +confutations +confutative +confutator +confute +confuted +confuter +confuters +confutes +confuting +cong +conga +congaed +congaing +congas +conge +congeable +congeal +congealability +congealable +congealableness +congealed +congealedness +congealer +congealing +congealment +congeals +conged +congee +congeed +congeeing +congees +congeing +congelation +congelative +congelifract +congelifraction +congeliturbate +congeliturbation +congenator +congener +congeneracy +congeneric +congenerical +congenerous +congenerousness +congeners +congenetic +congenial +congeniality +congenialize +congenially +congenialness +congenital +congenitally +congenitalness +congenite +congeon +conger +congeree +congery +congerie +congeries +congers +conges +congession +congest +congested +congestedness +congestible +congesting +congestion +congestions +congestive +congests +congestus +congiary +congiaries +congii +congius +conglaciate +conglobate +conglobated +conglobately +conglobating +conglobation +conglobe +conglobed +conglobes +conglobing +conglobulate +conglomerate +conglomerated +conglomerates +conglomeratic +conglomerating +conglomeration +conglomerations +conglomerative +conglomerator +conglomeritic +conglutin +conglutinant +conglutinate +conglutinated +conglutinating +conglutination +conglutinative +conglution +congo +congoes +congoese +congolese +congoleum +congoni +congos +congou +congous +congrats +congratulable +congratulant +congratulate +congratulated +congratulates +congratulating +congratulation +congratulational +congratulations +congratulator +congratulatory +congredient +congree +congreet +congregable +congreganist +congregant +congregants +congregate +congregated +congregates +congregating +congregation +congregational +congregationalism +congregationalist +congregationalists +congregationalize +congregationally +congregationer +congregationist +congregations +congregative +congregativeness +congregator +congreso +congress +congressed +congresser +congresses +congressing +congressional +congressionalist +congressionally +congressionist +congressist +congressive +congressman +congressmen +congresso +congresswoman +congresswomen +congreve +congrid +congridae +congrio +congroid +congrue +congruence +congruences +congruency +congruencies +congruent +congruential +congruently +congruism +congruist +congruistic +congruity +congruities +congruous +congruously +congruousness +congustable +conhydrin +conhydrine +coni +cony +conia +coniacian +conic +conical +conicality +conically +conicalness +conycatcher +conicein +coniceine +conichalcite +conicine +conicity +conicities +conicle +conicoid +conicopoly +conics +conidae +conidia +conidial +conidian +conidiiferous +conidioid +conidiophore +conidiophorous +conidiospore +conidium +conies +conifer +coniferae +coniferin +coniferophyte +coniferous +conifers +conification +coniform +conyger +coniine +coniines +conylene +conilurus +conima +conimene +conin +conine +conines +coning +conynge +coninidia +conins +coniogramme +coniology +coniomycetes +coniophora +coniopterygidae +conioselinum +coniosis +coniospermous +coniothyrium +conyrin +conyrine +coniroster +conirostral +conirostres +conisance +conite +conium +coniums +conyza +conj +conject +conjective +conjecturable +conjecturableness +conjecturably +conjectural +conjecturalist +conjecturality +conjecturally +conjecture +conjectured +conjecturer +conjectures +conjecturing +conjee +conjegates +conjobble +conjoin +conjoined +conjoinedly +conjoiner +conjoining +conjoins +conjoint +conjointly +conjointment +conjointness +conjoints +conjon +conjubilant +conjuctiva +conjugable +conjugably +conjugacy +conjugal +conjugales +conjugality +conjugally +conjugant +conjugata +conjugatae +conjugate +conjugated +conjugately +conjugateness +conjugates +conjugating +conjugation +conjugational +conjugationally +conjugations +conjugative +conjugator +conjugators +conjugial +conjugium +conjunct +conjuncted +conjunction +conjunctional +conjunctionally +conjunctions +conjunctiva +conjunctivae +conjunctival +conjunctivas +conjunctive +conjunctively +conjunctiveness +conjunctives +conjunctivitis +conjunctly +conjuncts +conjunctur +conjunctural +conjuncture +conjunctures +conjuration +conjurations +conjurator +conjure +conjured +conjurement +conjurer +conjurers +conjurership +conjures +conjury +conjuring +conjurison +conjuror +conjurors +conk +conkanee +conked +conker +conkers +conky +conking +conks +conli +conn +connach +connaisseur +connaraceae +connaraceous +connarite +connarus +connascency +connascent +connatal +connate +connately +connateness +connation +connatural +connaturality +connaturalize +connaturally +connaturalness +connature +connaught +connect +connectable +connectant +connected +connectedly +connectedness +connecter +connecters +connectibility +connectible +connectibly +connecticut +connecting +connection +connectional +connectionism +connectionless +connections +connectival +connective +connectively +connectives +connectivity +connector +connectors +connects +conned +connellite +conner +conners +connex +connexes +connexion +connexional +connexionalism +connexity +connexities +connexiva +connexive +connexivum +connexure +connexus +conny +connie +connies +conning +conniption +conniptions +connivance +connivances +connivancy +connivant +connivantly +connive +connived +connivence +connivent +connivently +conniver +connivery +connivers +connives +conniving +connivingly +connixation +connochaetes +connoissance +connoisseur +connoisseurs +connoisseurship +connotate +connotation +connotational +connotations +connotative +connotatively +connote +connoted +connotes +connoting +connotive +connotively +conns +connu +connubial +connubialism +connubiality +connubially +connubiate +connubium +connumerate +connumeration +connusable +conocarp +conocarpus +conocephalum +conocephalus +conoclinium +conocuneus +conodont +conodonts +conoy +conoid +conoidal +conoidally +conoidic +conoidical +conoidically +conoids +conolophus +conominee +cononintelligent +conopholis +conopid +conopidae +conoplain +conopodium +conopophaga +conopophagidae +conor +conorhinus +conormal +conoscente +conoscenti +conoscope +conoscopic +conourish +conphaseolin +conplane +conquassate +conquedle +conquer +conquerable +conquerableness +conquered +conquerer +conquerers +conqueress +conquering +conqueringly +conquerment +conqueror +conquerors +conquers +conquest +conquests +conquian +conquians +conquinamine +conquinine +conquisition +conquistador +conquistadores +conquistadors +conrad +conrail +conrector +conrectorship +conred +conrey +conringia +cons +consacre +consanguine +consanguineal +consanguinean +consanguineous +consanguineously +consanguinity +consanguinities +consarcinate +consarn +consarned +conscience +conscienceless +consciencelessly +consciencelessness +consciences +consciencewise +conscient +conscientious +conscientiously +conscientiousness +conscionable +conscionableness +conscionably +conscious +consciously +consciousness +conscive +conscribe +conscribed +conscribing +conscript +conscripted +conscripting +conscription +conscriptional +conscriptionist +conscriptions +conscriptive +conscripts +conscripttion +consderations +consecrate +consecrated +consecratedness +consecrater +consecrates +consecrating +consecration +consecrations +consecrative +consecrator +consecratory +consectary +consecute +consecution +consecutive +consecutively +consecutiveness +consecutives +consence +consenescence +consenescency +consension +consensual +consensually +consensus +consensuses +consent +consentable +consentaneity +consentaneous +consentaneously +consentaneousness +consentant +consented +consenter +consenters +consentful +consentfully +consentience +consentient +consentiently +consenting +consentingly +consentingness +consentive +consentively +consentment +consents +consequence +consequences +consequency +consequent +consequential +consequentiality +consequentialities +consequentially +consequentialness +consequently +consequents +consertal +consertion +conservable +conservacy +conservancy +conservancies +conservant +conservate +conservation +conservational +conservationism +conservationist +conservationists +conservations +conservatism +conservatist +conservative +conservatively +conservativeness +conservatives +conservatize +conservatoire +conservatoires +conservator +conservatory +conservatorial +conservatories +conservatorio +conservatorium +conservators +conservatorship +conservatrix +conserve +conserved +conserver +conservers +conserves +conserving +consy +consider +considerability +considerable +considerableness +considerably +considerance +considerate +considerately +considerateness +consideration +considerations +considerative +consideratively +considerativeness +considerator +considered +considerer +considering +consideringly +considers +consign +consignable +consignatary +consignataries +consignation +consignatory +consigne +consigned +consignee +consignees +consigneeship +consigner +consignify +consignificant +consignificate +consignification +consignificative +consignificator +consignified +consignifying +consigning +consignment +consignments +consignor +consignors +consigns +consiliary +consilience +consilient +consimilar +consimilarity +consimilate +consimilated +consimilating +consimile +consisently +consist +consisted +consistence +consistences +consistency +consistencies +consistent +consistently +consistible +consisting +consistory +consistorial +consistorian +consistories +consists +consition +consitutional +consociate +consociated +consociating +consociation +consociational +consociationism +consociative +consocies +consol +consolable +consolableness +consolably +consolamentum +consolan +consolate +consolation +consolations +consolato +consolator +consolatory +consolatorily +consolatoriness +consolatrix +console +consoled +consolement +consoler +consolers +consoles +consolette +consolidant +consolidate +consolidated +consolidates +consolidating +consolidation +consolidationist +consolidations +consolidative +consolidator +consolidators +consoling +consolingly +consolitorily +consolitoriness +consols +consolute +consomm +consomme +consommes +consonance +consonances +consonancy +consonant +consonantal +consonantalize +consonantalized +consonantalizing +consonantally +consonantic +consonantise +consonantised +consonantising +consonantism +consonantize +consonantized +consonantizing +consonantly +consonantness +consonants +consonate +consonous +consopite +consort +consortable +consorted +consorter +consortia +consortial +consorting +consortion +consortism +consortitia +consortium +consortiums +consorts +consortship +consoude +consound +conspecies +conspecific +conspecifics +conspect +conspection +conspectuity +conspectus +conspectuses +consperg +consperse +conspersion +conspicuity +conspicuous +conspicuously +conspicuousness +conspiracy +conspiracies +conspirant +conspiration +conspirational +conspirative +conspirator +conspiratory +conspiratorial +conspiratorially +conspirators +conspiratress +conspire +conspired +conspirer +conspirers +conspires +conspiring +conspiringly +conspissate +conspue +conspurcate +const +constable +constablery +constables +constableship +constabless +constablewick +constabular +constabulary +constabularies +constance +constances +constancy +constant +constantan +constantine +constantinian +constantinople +constantinopolitan +constantly +constantness +constants +constat +constatation +constatations +constate +constative +constatory +constellate +constellated +constellating +constellation +constellations +constellatory +conster +consternate +consternated +consternating +consternation +constipate +constipated +constipates +constipating +constipation +constituency +constituencies +constituent +constituently +constituents +constitute +constituted +constituter +constitutes +constituting +constitution +constitutional +constitutionalism +constitutionalist +constitutionality +constitutionalization +constitutionalize +constitutionally +constitutionals +constitutionary +constitutioner +constitutionist +constitutionless +constitutions +constitutive +constitutively +constitutiveness +constitutor +constr +constrain +constrainable +constrained +constrainedly +constrainedness +constrainer +constrainers +constraining +constrainingly +constrainment +constrains +constraint +constraints +constrict +constricted +constricting +constriction +constrictions +constrictive +constrictor +constrictors +constricts +constringe +constringed +constringency +constringent +constringing +construability +construable +construal +construct +constructable +constructed +constructer +constructibility +constructible +constructing +construction +constructional +constructionally +constructionism +constructionist +constructionists +constructions +constructive +constructively +constructiveness +constructivism +constructivist +constructor +constructors +constructorship +constructs +constructure +construe +construed +construer +construers +construes +construing +constuctor +constuprate +constupration +consubsist +consubsistency +consubstantial +consubstantialism +consubstantialist +consubstantiality +consubstantially +consubstantiate +consubstantiated +consubstantiating +consubstantiation +consubstantiationist +consubstantive +consuete +consuetitude +consuetude +consuetudinal +consuetudinary +consul +consulage +consular +consulary +consularity +consulate +consulated +consulates +consulating +consuls +consulship +consulships +consult +consulta +consultable +consultancy +consultant +consultants +consultantship +consultary +consultation +consultations +consultative +consultatively +consultatory +consulted +consultee +consulter +consulting +consultive +consultively +consulto +consultor +consultory +consults +consumable +consumables +consumate +consumated +consumating +consumation +consume +consumed +consumedly +consumeless +consumer +consumerism +consumerist +consumers +consumership +consumes +consuming +consumingly +consumingness +consummate +consummated +consummately +consummates +consummating +consummation +consummations +consummative +consummatively +consummativeness +consummator +consummatory +consumo +consumpt +consumpted +consumptible +consumption +consumptional +consumptions +consumptive +consumptively +consumptiveness +consumptives +consumptivity +consute +cont +contabescence +contabescent +contact +contactant +contacted +contactile +contacting +contaction +contactor +contacts +contactual +contactually +contadino +contaggia +contagia +contagion +contagioned +contagionist +contagions +contagiosity +contagious +contagiously +contagiousness +contagium +contain +containable +contained +containedly +container +containerboard +containerization +containerize +containerized +containerizes +containerizing +containerport +containers +containership +containerships +containing +containment +containments +contains +contakia +contakion +contakionkia +contam +contaminable +contaminant +contaminants +contaminate +contaminated +contaminates +contaminating +contamination +contaminations +contaminative +contaminator +contaminous +contangential +contango +contangoes +contangos +contchar +contd +conte +conteck +contect +contection +contek +conteke +contemn +contemned +contemner +contemnible +contemnibly +contemning +contemningly +contemnor +contemns +contemp +contemper +contemperate +contemperature +contemplable +contemplamen +contemplance +contemplant +contemplate +contemplated +contemplatedly +contemplates +contemplating +contemplatingly +contemplation +contemplations +contemplatist +contemplative +contemplatively +contemplativeness +contemplator +contemplators +contemplature +contemple +contemporanean +contemporaneity +contemporaneous +contemporaneously +contemporaneousness +contemporary +contemporaries +contemporarily +contemporariness +contemporise +contemporised +contemporising +contemporize +contemporized +contemporizing +contempt +contemptful +contemptibility +contemptible +contemptibleness +contemptibly +contempts +contemptuous +contemptuously +contemptuousness +contend +contended +contendent +contender +contendere +contenders +contending +contendingly +contendress +contends +contenement +content +contentable +contentation +contented +contentedly +contentedness +contentful +contenting +contention +contentional +contentions +contentious +contentiously +contentiousness +contentless +contently +contentment +contentness +contents +contenu +conter +conterminable +conterminal +conterminant +conterminate +contermine +conterminous +conterminously +conterminousness +conterraneous +contes +contessa +contesseration +contest +contestability +contestable +contestableness +contestably +contestant +contestants +contestate +contestation +contested +contestee +contester +contesters +contesting +contestingly +contestless +contests +conteur +contex +context +contextive +contexts +contextual +contextualize +contextually +contextural +contexture +contextured +contg +conticent +contignate +contignation +contiguate +contiguity +contiguities +contiguous +contiguously +contiguousness +contin +continence +continency +continent +continental +continentaler +continentalism +continentalist +continentality +continentalize +continentally +continentals +continently +continents +contineu +contingence +contingency +contingencies +contingent +contingential +contingentialness +contingentiam +contingently +contingentness +contingents +continua +continuable +continual +continuality +continually +continualness +continuance +continuances +continuancy +continuando +continuant +continuantly +continuate +continuately +continuateness +continuation +continuations +continuative +continuatively +continuativeness +continuator +continue +continued +continuedly +continuedness +continuer +continuers +continues +continuing +continuingly +continuist +continuity +continuities +continuo +continuos +continuous +continuously +continuousness +continuua +continuum +continuums +contise +contline +conto +contoid +contoise +contorniate +contorniates +contorno +contorsion +contorsive +contort +contorta +contortae +contorted +contortedly +contortedness +contorting +contortion +contortional +contortionate +contortioned +contortionist +contortionistic +contortionists +contortions +contortive +contortively +contorts +contortuplicate +contos +contour +contoured +contouring +contourne +contours +contr +contra +contraband +contrabandage +contrabandery +contrabandism +contrabandist +contrabandista +contrabass +contrabassist +contrabasso +contrabassoon +contrabassoonist +contracapitalist +contraception +contraceptionist +contraceptive +contraceptives +contracyclical +contracivil +contraclockwise +contract +contractable +contractant +contractation +contracted +contractedly +contractedness +contractee +contracter +contractibility +contractible +contractibleness +contractibly +contractile +contractility +contracting +contraction +contractional +contractionist +contractions +contractive +contractively +contractiveness +contractly +contractor +contractors +contracts +contractu +contractual +contractually +contracture +contractured +contractus +contrada +contradance +contrade +contradebt +contradict +contradictable +contradicted +contradictedness +contradicter +contradicting +contradiction +contradictional +contradictions +contradictious +contradictiously +contradictiousness +contradictive +contradictively +contradictiveness +contradictor +contradictory +contradictories +contradictorily +contradictoriness +contradicts +contradiscriminate +contradistinct +contradistinction +contradistinctions +contradistinctive +contradistinctively +contradistinctly +contradistinguish +contradivide +contrafacture +contrafagotto +contrafissura +contrafissure +contraflexure +contraflow +contrafocal +contragredience +contragredient +contrahent +contrayerva +contrail +contrails +contraindicant +contraindicate +contraindicated +contraindicates +contraindicating +contraindication +contraindications +contraindicative +contrair +contraire +contralateral +contralti +contralto +contraltos +contramarque +contramure +contranatural +contrantiscion +contraoctave +contraorbital +contraorbitally +contraparallelogram +contrapletal +contraplete +contraplex +contrapolarization +contrapone +contraponend +contraposaune +contrapose +contraposed +contraposing +contraposit +contraposita +contraposition +contrapositive +contrapositives +contrapposto +contrappostos +contraprogressist +contraprop +contraproposal +contraprops +contraprovectant +contraption +contraptions +contraptious +contrapuntal +contrapuntalist +contrapuntally +contrapuntist +contrapunto +contrarational +contraregular +contraregularity +contraremonstrance +contraremonstrant +contrarevolutionary +contrary +contrariant +contrariantly +contraries +contrariety +contrarieties +contrarily +contrariness +contrarious +contrariously +contrariousness +contrariwise +contrarotation +contrascriptural +contrast +contrastable +contrastably +contraste +contrasted +contrastedly +contraster +contrasters +contrasty +contrastimulant +contrastimulation +contrastimulus +contrasting +contrastingly +contrastive +contrastively +contrastiveness +contrastment +contrasts +contrasuggestible +contratabular +contrate +contratempo +contratenor +contratulations +contravalence +contravallation +contravariant +contravene +contravened +contravener +contravenes +contravening +contravention +contraversion +contravindicate +contravindication +contrawise +contrecoup +contrectation +contredanse +contredanses +contreface +contrefort +contrepartie +contretemps +contrib +contributable +contributary +contribute +contributed +contributes +contributing +contribution +contributional +contributions +contributive +contributively +contributiveness +contributor +contributory +contributorial +contributories +contributorily +contributors +contributorship +contrist +contrite +contritely +contriteness +contrition +contriturate +contrivable +contrivance +contrivances +contrivancy +contrive +contrived +contrivedly +contrivement +contriver +contrivers +contrives +contriving +control +controled +controling +controllability +controllable +controllableness +controllably +controlled +controller +controllers +controllership +controlless +controlling +controllingly +controlment +controls +controversal +controverse +controversed +controversy +controversial +controversialism +controversialist +controversialists +controversialize +controversially +controversies +controversion +controversional +controversionalism +controversionalist +controvert +controverted +controverter +controvertibility +controvertible +controvertibly +controverting +controvertist +controverts +contrude +conttinua +contubernal +contubernial +contubernium +contumacy +contumacies +contumacious +contumaciously +contumaciousness +contumacity +contumacities +contumax +contumely +contumelies +contumelious +contumeliously +contumeliousness +contund +contune +conturb +conturbation +contuse +contused +contuses +contusing +contusion +contusioned +contusions +contusive +conubium +conularia +conule +conumerary +conumerous +conundrum +conundrumize +conundrums +conurbation +conurbations +conure +conuropsis +conurus +conus +conusable +conusance +conusant +conusee +conuses +conusor +conutrition +conuzee +conuzor +conv +convalesce +convalesced +convalescence +convalescency +convalescent +convalescently +convalescents +convalesces +convalescing +convallamarin +convallaria +convallariaceae +convallariaceous +convallarin +convally +convect +convected +convecting +convection +convectional +convective +convectively +convector +convects +convey +conveyability +conveyable +conveyal +conveyance +conveyancer +conveyances +conveyancing +conveyed +conveyer +conveyers +conveying +conveyor +conveyorization +conveyorize +conveyorized +conveyorizer +conveyorizing +conveyors +conveys +convell +convenable +convenably +convenance +convenances +convene +convened +convenee +convener +convenery +conveneries +conveners +convenership +convenes +convenience +convenienced +conveniences +conveniency +conveniencies +conveniens +convenient +conveniently +convenientness +convening +convent +convented +conventical +conventically +conventicle +conventicler +conventicles +conventicular +conventing +convention +conventional +conventionalisation +conventionalise +conventionalised +conventionalising +conventionalism +conventionalist +conventionality +conventionalities +conventionalization +conventionalize +conventionalized +conventionalizes +conventionalizing +conventionally +conventionary +conventioneer +conventioneers +conventioner +conventionism +conventionist +conventionize +conventions +convento +convents +conventual +conventually +converge +converged +convergement +convergence +convergences +convergency +convergent +convergently +converges +convergescence +converginerved +converging +conversable +conversableness +conversably +conversance +conversancy +conversant +conversantly +conversation +conversationable +conversational +conversationalism +conversationalist +conversationalists +conversationally +conversationism +conversationist +conversationize +conversations +conversative +conversazione +conversaziones +conversazioni +converse +conversed +conversely +converser +converses +conversi +conversibility +conversible +conversing +conversion +conversional +conversionary +conversionism +conversionist +conversions +conversive +converso +conversus +conversusi +convert +convertable +convertaplane +converted +convertend +converter +converters +convertibility +convertible +convertibleness +convertibles +convertibly +converting +convertingness +convertiplane +convertise +convertism +convertite +convertive +convertoplane +convertor +convertors +converts +conveth +convex +convexed +convexedly +convexedness +convexes +convexity +convexities +convexly +convexness +convexo +convexoconcave +conviciate +convicinity +convict +convictable +convicted +convictfish +convictfishes +convictible +convicting +conviction +convictional +convictions +convictism +convictive +convictively +convictiveness +convictment +convictor +convicts +convince +convinced +convincedly +convincedness +convincement +convincer +convincers +convinces +convincibility +convincible +convincing +convincingly +convincingness +convite +convito +convival +convive +convives +convivial +convivialist +conviviality +convivialize +convivially +convivio +convocant +convocate +convocated +convocating +convocation +convocational +convocationally +convocationist +convocations +convocative +convocator +convoy +convoyed +convoying +convoys +convoke +convoked +convoker +convokers +convokes +convoking +convoluta +convolute +convoluted +convolutedly +convolutedness +convolutely +convoluting +convolution +convolutional +convolutionary +convolutions +convolutive +convolve +convolved +convolvement +convolves +convolving +convolvulaceae +convolvulaceous +convolvulad +convolvuli +convolvulic +convolvulin +convolvulinic +convolvulinolic +convolvulus +convolvuluses +convulsant +convulse +convulsed +convulsedly +convulses +convulsibility +convulsible +convulsing +convulsion +convulsional +convulsionary +convulsionaries +convulsionism +convulsionist +convulsions +convulsive +convulsively +convulsiveness +coo +cooba +coobah +cooboo +cooboos +cooch +cooches +coodle +cooed +cooee +cooeed +cooeeing +cooees +cooey +cooeyed +cooeying +cooeys +cooer +cooers +coof +coofs +cooghneiorvlt +coohee +cooing +cooingly +cooja +cook +cookable +cookbook +cookbooks +cookdom +cooked +cookee +cookey +cookeys +cookeite +cooker +cookery +cookeries +cookers +cookhouse +cookhouses +cooky +cookie +cookies +cooking +cookings +cookish +cookishly +cookless +cookmaid +cookout +cookouts +cookroom +cooks +cookshack +cookshop +cookshops +cookstove +cookware +cookwares +cool +coolabah +coolaman +coolamon +coolant +coolants +cooled +cooley +coolen +cooler +coolerman +coolers +coolest +coolheaded +coolheadedly +coolheadedness +coolhouse +cooly +coolibah +coolidge +coolie +coolies +cooliman +cooling +coolingly +coolingness +coolish +coolly +coolness +coolnesses +cools +coolth +coolung +coolweed +coolwort +coom +coomb +coombe +coombes +coombs +coomy +coon +cooncan +cooncans +cooner +coonhound +coonhounds +coony +coonier +cooniest +coonily +cooniness +coonjine +coonroot +coons +coonskin +coonskins +coontah +coontail +coontie +coonties +coop +cooped +coopee +cooper +cooperage +cooperancy +cooperant +cooperate +cooperated +cooperates +cooperating +cooperatingly +cooperation +cooperationist +cooperations +cooperative +cooperatively +cooperativeness +cooperatives +cooperator +cooperators +coopered +coopery +cooperia +cooperies +coopering +cooperite +coopers +cooping +coops +coopt +cooptate +cooptation +cooptative +coopted +coopting +cooption +cooptions +cooptive +coopts +coordain +coordinal +coordinate +coordinated +coordinately +coordinateness +coordinates +coordinating +coordination +coordinations +coordinative +coordinator +coordinatory +coordinators +cooree +coorg +coorie +cooried +coorieing +coories +cooruptibly +coos +cooser +coosers +coosify +coost +coosuc +coot +cootch +cooter +cootfoot +cooth +coothay +cooty +cootie +cooties +coots +cop +copa +copable +copacetic +copaene +copaiba +copaibas +copaibic +copaifera +copaiye +copain +copaiva +copaivic +copal +copalche +copalchi +copalcocote +copaliferous +copaline +copalite +copaljocote +copalm +copalms +copals +coparallel +coparcenar +coparcenary +coparcener +coparceny +coparenary +coparent +coparents +copart +copartaker +coparty +copartiment +copartner +copartnery +copartners +copartnership +copasetic +copassionate +copastor +copastorate +copastors +copatain +copataine +copatentee +copatriot +copatron +copatroness +copatrons +cope +copeck +copecks +coped +copehan +copei +copeia +copelata +copelatae +copelate +copelidine +copellidine +copeman +copemate +copemates +copen +copending +copenetrate +copenhagen +copens +copeognatha +copepod +copepoda +copepodan +copepodous +copepods +coper +coperception +coperiodic +copernican +copernicanism +copernicans +copernicia +copernicus +coperose +copers +coperta +copes +copesetic +copesettic +copesman +copesmate +copestone +copetitioner +cophasal +cophetua +cophosis +cophouse +copy +copia +copiability +copiable +copiapite +copyboy +copyboys +copybook +copybooks +copycat +copycats +copycatted +copycatting +copycutter +copydesk +copydesks +copied +copier +copiers +copies +copyfitter +copyfitting +copygraph +copygraphed +copyhold +copyholder +copyholders +copyholding +copyholds +copihue +copihues +copying +copyism +copyist +copyists +copilot +copilots +copyman +coping +copings +copingstone +copintank +copiopia +copiopsia +copiosity +copious +copiously +copiousness +copyread +copyreader +copyreaders +copyreading +copyright +copyrightable +copyrighted +copyrighter +copyrighting +copyrights +copis +copist +copita +copywise +copywriter +copywriters +copywriting +coplaintiff +coplanar +coplanarity +coplanarities +coplanation +copleased +coplot +coplots +coplotted +coplotter +coplotting +coploughing +coplowing +copolar +copolymer +copolymeric +copolymerism +copolymerization +copolymerizations +copolymerize +copolymerized +copolymerizing +copolymerous +copolymers +copopoda +copopsia +coportion +copout +copouts +coppa +coppaelite +coppas +copped +copper +copperah +copperahs +copperas +copperases +copperbottom +coppered +copperer +copperhead +copperheadism +copperheads +coppery +coppering +copperish +copperytailed +copperization +copperize +copperleaf +coppernose +coppernosed +copperplate +copperplated +copperproof +coppers +coppersidesman +copperskin +coppersmith +coppersmithing +copperware +copperwing +copperworks +coppet +coppy +coppice +coppiced +coppices +coppicing +coppin +copping +copple +copplecrown +coppled +coppling +coppra +coppras +copps +copr +copra +copraemia +copraemic +coprah +coprahs +copras +coprecipitate +coprecipitated +coprecipitating +coprecipitation +copremia +copremias +copremic +copresbyter +copresence +copresent +coprides +coprinae +coprincipal +coprincipate +coprinus +coprisoner +coprocessing +coprocessor +coprocessors +coprodaeum +coproduce +coproducer +coproduct +coproduction +coproite +coprojector +coprolagnia +coprolagnist +coprolalia +coprolaliac +coprolite +coprolith +coprolitic +coprology +copromisor +copromoter +coprophagan +coprophagy +coprophagia +coprophagist +coprophagous +coprophilia +coprophiliac +coprophilic +coprophilism +coprophilous +coprophyte +coprophobia +coprophobic +coproprietor +coproprietorship +coprose +coprosma +coprostanol +coprostasia +coprostasis +coprostasophobia +coprosterol +coprozoic +cops +copse +copses +copsewood +copsewooded +copsy +copsing +copsole +copt +copter +copters +coptic +coptine +coptis +copula +copulable +copulae +copular +copularium +copulas +copulate +copulated +copulates +copulating +copulation +copulations +copulative +copulatively +copulatory +copunctal +copurchaser +copus +coque +coquecigrue +coquelicot +coqueluche +coquet +coquetoon +coquetry +coquetries +coquets +coquette +coquetted +coquettes +coquetting +coquettish +coquettishly +coquettishness +coquicken +coquilla +coquillage +coquille +coquilles +coquimbite +coquin +coquina +coquinas +coquita +coquitlam +coquito +coquitos +cor +cora +corabeca +corabecan +corach +coraciae +coracial +coracias +coracii +coraciidae +coraciiform +coraciiformes +coracine +coracle +coracler +coracles +coracoacromial +coracobrachial +coracobrachialis +coracoclavicular +coracocostal +coracohyoid +coracohumeral +coracoid +coracoidal +coracoids +coracomandibular +coracomorph +coracomorphae +coracomorphic +coracopectoral +coracoprocoracoid +coracoradialis +coracoscapular +coracosteon +coracovertebral +coradical +coradicate +corage +coraggio +coragio +corah +coraise +coraji +coral +coralbells +coralberry +coralberries +coralbush +coraled +coralene +coralflower +coralist +coralita +coralla +corallet +corallian +corallic +corallidae +corallidomous +coralliferous +coralliform +coralligena +coralligenous +coralligerous +corallike +corallin +corallina +corallinaceae +corallinaceous +coralline +corallita +corallite +corallium +coralloid +coralloidal +corallorhiza +corallum +corallus +coralroot +corals +coralwort +coram +corambis +coran +corance +coranoch +coranto +corantoes +corantos +coraveca +corban +corbans +corbe +corbeau +corbed +corbeil +corbeille +corbeilles +corbeils +corbel +corbeled +corbeling +corbelled +corbelling +corbels +corbet +corby +corbicula +corbiculae +corbiculate +corbiculum +corbie +corbies +corbiestep +corbina +corbinas +corbleu +corblimey +corblimy +corbovinum +corbula +corcass +corchat +corchorus +corcir +corcyraean +corcle +corcopali +cord +cordage +cordages +cordaitaceae +cordaitaceous +cordaitalean +cordaitales +cordaitean +cordaites +cordal +cordant +cordate +cordately +cordax +cordeau +corded +cordel +cordelia +cordelier +cordeliere +cordelle +cordelled +cordelling +corder +cordery +corders +cordewane +cordy +cordia +cordial +cordiality +cordialities +cordialize +cordially +cordialness +cordials +cordycepin +cordiceps +cordyceps +cordicole +cordierite +cordies +cordiform +cordigeri +cordyl +cordylanthus +cordyline +cordillera +cordilleran +cordilleras +cordinar +cordiner +cording +cordis +cordite +cordites +corditis +cordleaf +cordless +cordlessly +cordlike +cordmaker +cordoba +cordoban +cordobas +cordon +cordonazo +cordonazos +cordoned +cordoning +cordonnet +cordons +cordovan +cordovans +cords +cordula +corduroy +corduroyed +corduroying +corduroys +cordwain +cordwainer +cordwainery +cordwains +cordwood +cordwoods +core +corebel +corebox +coreceiver +corecipient +coreciprocal +corectome +corectomy +corector +cored +coredeem +coredeemed +coredeemer +coredeeming +coredeems +coredemptress +coreductase +coree +coreflexed +coregence +coregency +coregent +coregnancy +coregnant +coregonid +coregonidae +coregonine +coregonoid +coregonus +corey +coreid +coreidae +coreign +coreigner +coreigns +corejoice +corelate +corelated +corelates +corelating +corelation +corelational +corelative +corelatively +coreless +coreligionist +corelysis +corella +corema +coremaker +coremaking +coremia +coremium +coremiumia +coremorphosis +corenounce +coreometer +coreopsis +coreplasty +coreplastic +corepressor +corequisite +corer +corers +cores +coresidence +coresidual +coresign +coresonant +coresort +corespect +corespondency +corespondent +corespondents +coretomy +coreveler +coreveller +corevolve +corf +corfiote +corflambo +corge +corgi +corgis +cory +coria +coriaceous +corial +coriamyrtin +coriander +corianders +coriandrol +coriandrum +coriaria +coriariaceae +coriariaceous +coriaus +corybant +corybantian +corybantiasm +corybantic +corybantine +corybantish +corybulbin +corybulbine +corycavamine +corycavidin +corycavidine +corycavine +corycia +corycian +corydalin +corydaline +corydalis +corydine +corydon +corydora +coriin +coryl +corylaceae +corylaceous +corylet +corylin +corylopsis +corylus +corymb +corymbed +corymbiate +corymbiated +corymbiferous +corymbiform +corymblike +corymbose +corymbosely +corymbous +corymbs +corimelaena +corimelaenidae +corin +corindon +corynebacteria +corynebacterial +corynebacterium +coryneform +coryneum +corineus +coring +corynid +corynine +corynite +corinna +corinne +corynocarpaceae +corynocarpaceous +corynocarpus +corynteria +corinth +corinthes +corinthiac +corinthian +corinthianesque +corinthianism +corinthianize +corinthians +coriolanus +coriparian +coryph +corypha +coryphaei +coryphaena +coryphaenid +coryphaenidae +coryphaenoid +coryphaenoididae +coryphaeus +coryphee +coryphees +coryphene +coryphylly +coryphodon +coryphodont +corypphaei +corystoid +corita +corytuberine +corium +corixa +corixidae +coryza +coryzal +coryzas +cork +corkage +corkages +corkboard +corke +corked +corker +corkers +corky +corkier +corkiest +corkiness +corking +corkir +corkish +corkite +corklike +corkline +corkmaker +corkmaking +corks +corkscrew +corkscrewed +corkscrewy +corkscrewing +corkscrews +corkwing +corkwood +corkwoods +corm +cormac +cormel +cormels +cormidium +cormlike +cormogen +cormoid +cormophyta +cormophyte +cormophytic +cormorant +cormorants +cormous +corms +cormus +corn +cornaceae +cornaceous +cornada +cornage +cornamute +cornball +cornballs +cornbell +cornberry +cornbin +cornbind +cornbinks +cornbird +cornbole +cornbottle +cornbrash +cornbread +corncake +corncakes +corncob +corncobs +corncockle +corncracker +corncrake +corncrib +corncribs +corncrusher +corncutter +corncutting +corndodger +cornea +corneagen +corneal +corneas +corned +cornein +corneine +corneitis +cornel +cornelia +cornelian +cornelius +cornell +cornels +cornemuse +corneocalcareous +corneosclerotic +corneosiliceous +corneous +corner +cornerback +cornerbind +cornercap +cornered +cornerer +cornering +cornerman +cornerpiece +corners +cornerstone +cornerstones +cornerways +cornerwise +cornet +cornetcy +cornetcies +corneter +cornetfish +cornetfishes +cornetist +cornetists +cornets +cornett +cornette +cornetter +cornetti +cornettino +cornettist +cornetto +corneule +corneum +cornfactor +cornfed +cornfield +cornfields +cornflag +cornflakes +cornfloor +cornflour +cornflower +cornflowers +corngrower +cornhole +cornhouse +cornhusk +cornhusker +cornhusking +cornhusks +corny +cornic +cornice +corniced +cornices +corniche +corniches +cornichon +cornicing +cornicle +cornicles +cornicular +corniculate +corniculer +corniculum +cornier +corniest +corniferous +cornify +cornific +cornification +cornified +corniform +cornigeous +cornigerous +cornily +cornin +corniness +corning +corniplume +cornish +cornishman +cornix +cornland +cornless +cornloft +cornmaster +cornmeal +cornmeals +cornmonger +cornmuse +corno +cornopean +cornpipe +cornrick +cornroot +cornrow +cornrows +corns +cornsack +cornstalk +cornstalks +cornstarch +cornstone +cornstook +cornu +cornua +cornual +cornuate +cornuated +cornubianite +cornucopia +cornucopiae +cornucopian +cornucopias +cornucopiate +cornule +cornulite +cornulites +cornupete +cornus +cornuses +cornute +cornuted +cornutin +cornutine +cornuting +cornuto +cornutos +cornutus +cornwall +cornwallis +cornwallises +cornwallite +coroa +coroado +corocleisis +corody +corodiary +corodiastasis +corodiastole +corodies +corojo +corol +corolitic +coroll +corolla +corollaceous +corollary +corollarial +corollarially +corollaries +corollas +corollate +corollated +corollet +corolliferous +corollifloral +corolliform +corollike +corolline +corollitic +coromandel +coromell +corometer +corona +coronach +coronachs +coronad +coronadite +coronado +coronados +coronae +coronagraph +coronagraphic +coronal +coronale +coronaled +coronalled +coronally +coronals +coronamen +coronary +coronaries +coronas +coronate +coronated +coronation +coronations +coronatorial +coronavirus +corone +coronel +coronels +coronene +coroner +coroners +coronership +coronet +coroneted +coronetlike +coronets +coronetted +coronettee +coronetty +coroniform +coronilla +coronillin +coronillo +coronion +coronis +coronitis +coronium +coronize +coronobasilar +coronofacial +coronofrontal +coronograph +coronographic +coronoid +coronopus +coronule +coroparelcysis +coroplast +coroplasta +coroplastae +coroplasty +coroplastic +coropo +coroscopy +corosif +corotate +corotated +corotates +corotating +corotation +corotomy +coroun +coroutine +coroutines +corozo +corozos +corp +corpl +corpn +corpora +corporacy +corporacies +corporal +corporalcy +corporale +corporales +corporalism +corporality +corporalities +corporally +corporals +corporalship +corporas +corporate +corporately +corporateness +corporation +corporational +corporationer +corporationism +corporations +corporatism +corporatist +corporative +corporatively +corporativism +corporator +corporature +corpore +corporeal +corporealist +corporeality +corporealization +corporealize +corporeally +corporealness +corporeals +corporeity +corporeous +corporify +corporification +corporosity +corposant +corps +corpsbruder +corpse +corpselike +corpselikeness +corpses +corpsy +corpsman +corpsmen +corpulence +corpulences +corpulency +corpulencies +corpulent +corpulently +corpulentness +corpus +corpuscle +corpuscles +corpuscular +corpuscularian +corpuscularity +corpusculated +corpuscule +corpusculous +corpusculum +corr +corrade +corraded +corrades +corradial +corradiate +corradiated +corradiating +corradiation +corrading +corral +corralled +corralling +corrals +corrasion +corrasive +correa +correal +correality +correct +correctable +correctant +corrected +correctedness +correcter +correctest +correctible +correctify +correcting +correctingly +correction +correctional +correctionalist +correctioner +corrections +correctitude +corrective +correctively +correctiveness +correctives +correctly +correctness +corrector +correctory +correctorship +correctress +correctrice +corrects +corregidor +corregidores +corregidors +corregimiento +corregimientos +correl +correlatable +correlate +correlated +correlates +correlating +correlation +correlational +correlations +correlative +correlatively +correlativeness +correlatives +correlativism +correlativity +correligionist +correllated +correllation +correllations +corrente +correo +correption +corresol +corresp +correspond +corresponded +correspondence +correspondences +correspondency +correspondencies +correspondent +correspondential +correspondentially +correspondently +correspondents +correspondentship +corresponder +corresponding +correspondingly +corresponds +corresponsion +corresponsive +corresponsively +corrida +corridas +corrido +corridor +corridored +corridors +corrie +corriedale +corries +corrige +corrigenda +corrigendum +corrigent +corrigibility +corrigible +corrigibleness +corrigibly +corrigiola +corrigiolaceae +corrival +corrivality +corrivalry +corrivals +corrivalship +corrivate +corrivation +corrive +corrobboree +corrober +corroborant +corroborate +corroborated +corroborates +corroborating +corroboration +corroborations +corroborative +corroboratively +corroborator +corroboratory +corroboratorily +corroborators +corroboree +corroboreed +corroboreeing +corroborees +corrobori +corrodant +corrode +corroded +corrodent +corrodentia +corroder +corroders +corrodes +corrody +corrodiary +corrodibility +corrodible +corrodier +corrodies +corroding +corrodingly +corrosibility +corrosible +corrosibleness +corrosion +corrosional +corrosionproof +corrosive +corrosived +corrosively +corrosiveness +corrosives +corrosiving +corrosivity +corrugant +corrugate +corrugated +corrugates +corrugating +corrugation +corrugations +corrugator +corrugators +corrugent +corrump +corrumpable +corrup +corrupable +corrupt +corrupted +corruptedly +corruptedness +corrupter +corruptest +corruptful +corruptibility +corruptibilities +corruptible +corruptibleness +corruptibly +corrupting +corruptingly +corruption +corruptionist +corruptions +corruptious +corruptive +corruptively +corruptless +corruptly +corruptness +corruptor +corruptress +corrupts +corsac +corsacs +corsage +corsages +corsaint +corsair +corsairs +corsak +corse +corselet +corseleted +corseleting +corselets +corselette +corsepresent +corseque +corser +corses +corsesque +corset +corseted +corsetier +corsetiere +corseting +corsetless +corsetry +corsets +corsy +corsican +corsie +corsite +corslet +corslets +corsned +corso +corsos +cort +corta +cortaderia +cortaro +cortege +corteges +corteise +cortes +cortex +cortexes +cortez +cortian +cortical +cortically +corticate +corticated +corticating +cortication +cortices +corticiferous +corticiform +corticifugal +corticifugally +corticin +corticine +corticipetal +corticipetally +corticium +corticoafferent +corticoefferent +corticoid +corticole +corticoline +corticolous +corticopeduncular +corticose +corticospinal +corticosteroid +corticosteroids +corticosterone +corticostriate +corticotrophin +corticotropin +corticous +cortile +cortin +cortina +cortinae +cortinarious +cortinarius +cortinate +cortine +cortins +cortisol +cortisols +cortisone +cortlandtite +corton +coruco +coruler +coruminacan +corundophilite +corundum +corundums +corupay +coruscant +coruscate +coruscated +coruscates +coruscating +coruscation +coruscations +coruscative +corv +corve +corved +corvee +corvees +corven +corver +corves +corvet +corvets +corvette +corvettes +corvetto +corvidae +corviform +corvillosum +corvina +corvinae +corvinas +corvine +corviser +corvisor +corvktte +corvo +corvoid +corvorant +corvus +cos +cosalite +cosaque +cosavior +coscet +coscinodiscaceae +coscinodiscus +coscinomancy +coscoroba +cose +coseasonal +coseat +cosec +cosecant +cosecants +cosech +cosecs +cosectarian +cosectional +cosed +cosegment +cosey +coseier +coseiest +coseys +coseism +coseismal +coseismic +cosen +cosenator +cosentiency +cosentient +coservant +coses +cosession +coset +cosets +cosettler +cosh +cosharer +cosheath +coshed +cosher +coshered +cosherer +coshery +cosheries +coshering +coshers +coshes +coshing +cosy +cosie +cosier +cosies +cosiest +cosign +cosignatory +cosignatories +cosigned +cosigner +cosigners +cosignificative +cosigning +cosignitary +cosigns +cosily +cosymmedian +cosin +cosinage +cosine +cosines +cosiness +cosinesses +cosing +cosingular +cosins +cosinusoid +cosmati +cosmecology +cosmesis +cosmete +cosmetic +cosmetical +cosmetically +cosmetician +cosmeticize +cosmetics +cosmetiste +cosmetology +cosmetological +cosmetologist +cosmetologists +cosmic +cosmical +cosmicality +cosmically +cosmine +cosmism +cosmisms +cosmist +cosmists +cosmo +cosmochemical +cosmochemistry +cosmocracy +cosmocrat +cosmocratic +cosmodrome +cosmogenesis +cosmogenetic +cosmogeny +cosmogenic +cosmognosis +cosmogonal +cosmogoner +cosmogony +cosmogonic +cosmogonical +cosmogonies +cosmogonist +cosmogonists +cosmogonize +cosmographer +cosmography +cosmographic +cosmographical +cosmographically +cosmographies +cosmographist +cosmoid +cosmolabe +cosmolatry +cosmoline +cosmolined +cosmolining +cosmology +cosmologic +cosmological +cosmologically +cosmologies +cosmologygy +cosmologist +cosmologists +cosmometry +cosmonaut +cosmonautic +cosmonautical +cosmonautically +cosmonautics +cosmonauts +cosmopathic +cosmoplastic +cosmopoietic +cosmopolicy +cosmopolis +cosmopolises +cosmopolitan +cosmopolitanisation +cosmopolitanise +cosmopolitanised +cosmopolitanising +cosmopolitanism +cosmopolitanization +cosmopolitanize +cosmopolitanized +cosmopolitanizing +cosmopolitanly +cosmopolitans +cosmopolite +cosmopolitic +cosmopolitical +cosmopolitics +cosmopolitism +cosmorama +cosmoramic +cosmorganic +cosmos +cosmoscope +cosmoses +cosmosophy +cosmosphere +cosmotellurian +cosmotheism +cosmotheist +cosmotheistic +cosmothetic +cosmotron +cosmozoan +cosmozoans +cosmozoic +cosmozoism +cosonant +cosounding +cosovereign +cosovereignty +cospecies +cospecific +cosphered +cosplendor +cosplendour +cosponsor +cosponsored +cosponsoring +cosponsors +cosponsorship +cosponsorships +coss +cossack +cossacks +cossaean +cossas +cosse +cosset +cosseted +cosseting +cossets +cossette +cossetted +cossetting +cosshen +cossic +cossid +cossidae +cossie +cossyrite +cossnent +cost +costa +costae +costaea +costage +costal +costalgia +costally +costander +costanoan +costar +costard +costards +costarred +costarring +costars +costata +costate +costated +costean +costeaning +costectomy +costectomies +costed +costeen +costellate +coster +costerdom +costermonger +costers +costful +costicartilage +costicartilaginous +costicervical +costiferous +costiform +costing +costious +costipulator +costispinal +costive +costively +costiveness +costless +costlessly +costlessness +costlew +costly +costlier +costliest +costliness +costmary +costmaries +costoabdominal +costoapical +costocentral +costochondral +costoclavicular +costocolic +costocoracoid +costodiaphragmatic +costogenic +costoinferior +costophrenic +costopleural +costopneumopexy +costopulmonary +costoscapular +costosternal +costosuperior +costothoracic +costotome +costotomy +costotomies +costotrachelian +costotransversal +costotransverse +costovertebral +costoxiphoid +costraight +costrel +costrels +costs +costula +costulation +costume +costumed +costumey +costumer +costumery +costumers +costumes +costumic +costumier +costumiere +costumiers +costuming +costumire +costumist +costusroot +cosubject +cosubordinate +cosuffer +cosufferer +cosuggestion +cosuitor +cosurety +cosuretyship +cosustain +coswearer +cot +cotabulate +cotan +cotangent +cotangential +cotangents +cotans +cotarius +cotarnin +cotarnine +cotbetty +cotch +cote +coteau +coteaux +coted +coteen +coteful +cotehardie +cotele +coteline +coteller +cotemporane +cotemporanean +cotemporaneous +cotemporaneously +cotemporary +cotemporaries +cotemporarily +cotenancy +cotenant +cotenants +cotenure +coterell +cotery +coterie +coteries +coterminal +coterminous +coterminously +coterminousness +cotes +cotesian +coth +cotham +cothamore +cothe +cotheorist +cothy +cothish +cothon +cothouse +cothurn +cothurnal +cothurnate +cothurned +cothurni +cothurnian +cothurnni +cothurns +cothurnus +cotice +coticed +coticing +coticular +cotidal +cotyla +cotylar +cotyle +cotyledon +cotyledonal +cotyledonar +cotyledonary +cotyledonoid +cotyledonous +cotyledons +cotyliform +cotyligerous +cotyliscus +cotillage +cotillion +cotillions +cotillon +cotillons +cotyloid +cotyloidal +cotylophora +cotylophorous +cotylopubic +cotylosacral +cotylosaur +cotylosauria +cotylosaurian +coting +cotinga +cotingid +cotingidae +cotingoid +cotinus +cotype +cotypes +cotys +cotise +cotised +cotising +cotyttia +cotitular +cotland +cotman +coto +cotoin +cotonam +cotoneaster +cotonia +cotonier +cotorment +cotoro +cotoros +cotorture +cotoxo +cotquean +cotqueans +cotraitor +cotransduction +cotransfuse +cotranslator +cotranspire +cotransubstantiate +cotrespasser +cotrine +cotripper +cotrustee +cots +cotset +cotsetla +cotsetland +cotsetle +cotswold +cott +cotta +cottabus +cottae +cottage +cottaged +cottagey +cottager +cottagers +cottages +cottar +cottars +cottas +cotte +cotted +cotter +cottered +cotterel +cottering +cotterite +cotters +cotterway +cotty +cottid +cottidae +cottier +cottierism +cottiers +cottiest +cottiform +cottise +cottoid +cotton +cottonade +cottonbush +cottoned +cottonee +cottoneer +cottoner +cottony +cottonian +cottoning +cottonization +cottonize +cottonless +cottonmouth +cottonmouths +cottonocracy +cottonopolis +cottonpicking +cottons +cottonseed +cottonseeds +cottontail +cottontails +cottontop +cottonweed +cottonwick +cottonwood +cottonwoods +cottrel +cottus +cotuit +cotula +cotunnite +coturnix +cotutor +cotwal +cotwin +cotwinned +cotwist +couac +coucal +couch +couchancy +couchant +couchantly +couche +couched +couchee +coucher +couchers +couches +couchette +couchy +couching +couchings +couchmaker +couchmaking +couchmate +coud +coude +coudee +coue +coueism +cougar +cougars +cough +coughed +cougher +coughers +coughing +coughroot +coughs +coughweed +coughwort +cougnar +couhage +coul +coulage +could +couldest +couldn +couldna +couldnt +couldron +couldst +coulee +coulees +couleur +coulibiaca +coulie +coulier +coulis +coulisse +coulisses +couloir +couloirs +coulomb +coulombic +coulombmeter +coulombs +coulometer +coulometry +coulometric +coulometrically +coulter +coulterneb +coulters +coulthard +coulure +couma +coumalic +coumalin +coumaphos +coumara +coumaran +coumarane +coumarate +coumaric +coumarilic +coumarin +coumarinic +coumarins +coumarone +coumarou +coumarouna +coumarous +coumbite +council +councilist +councillary +councillor +councillors +councillorship +councilman +councilmanic +councilmen +councilor +councilors +councilorship +councils +councilwoman +councilwomen +counderstand +counite +couniversal +counsel +counselable +counseled +counselee +counselful +counseling +counsellable +counselled +counselling +counsellor +counsellors +counsellorship +counselor +counselors +counselorship +counsels +counsinhood +count +countability +countable +countableness +countably +countdom +countdown +countdowns +counted +countenance +countenanced +countenancer +countenances +countenancing +counter +counterabut +counteraccusation +counteracquittance +counteract +counteractant +counteracted +counteracter +counteracting +counteractingly +counteraction +counteractions +counteractive +counteractively +counteractivity +counteractor +counteracts +counteraddress +counteradvance +counteradvantage +counteradvice +counteradvise +counteraffirm +counteraffirmation +counteragency +counteragent +counteragitate +counteragitation +counteralliance +counterambush +counterannouncement +counteranswer +counterappeal +counterappellant +counterapproach +counterapse +counterarch +counterargue +counterargument +counterartillery +counterassertion +counterassociation +counterassurance +counterattack +counterattacked +counterattacker +counterattacking +counterattacks +counterattestation +counterattired +counterattraction +counterattractive +counterattractively +counteraverment +counteravouch +counteravouchment +counterbalance +counterbalanced +counterbalances +counterbalancing +counterband +counterbarrage +counterbase +counterbattery +counterbeating +counterbend +counterbewitch +counterbid +counterblast +counterblow +counterboycott +counterbond +counterborder +counterbore +counterbored +counterborer +counterboring +counterboulle +counterbrace +counterbracing +counterbranch +counterbrand +counterbreastwork +counterbuff +counterbuilding +countercampaign +countercarte +countercathexis +countercause +counterchange +counterchanged +counterchanging +countercharge +countercharged +countercharging +countercharm +countercheck +countercheer +counterclaim +counterclaimant +counterclaimed +counterclaiming +counterclaims +counterclassification +counterclassifications +counterclockwise +countercolored +countercommand +countercompany +countercompetition +countercomplaint +countercompony +countercondemnation +counterconditioning +counterconquest +counterconversion +countercouchant +countercoup +countercoupe +countercourant +countercraft +countercry +countercriticism +countercross +countercultural +counterculture +countercultures +counterculturist +countercurrent +countercurrently +countercurrentwise +counterdance +counterdash +counterdecision +counterdeclaration +counterdecree +counterdefender +counterdemand +counterdemonstrate +counterdemonstration +counterdemonstrator +counterdeputation +counterdesire +counterdevelopment +counterdifficulty +counterdigged +counterdike +counterdiscipline +counterdisengage +counterdisengagement +counterdistinct +counterdistinction +counterdistinguish +counterdoctrine +counterdogmatism +counterdraft +counterdrain +counterdrive +counterearth +countered +counterefficiency +countereffort +counterembattled +counterembowed +counterenamel +counterend +counterenergy +counterengagement +counterengine +counterenthusiasm +counterentry +counterequivalent +counterermine +counterespionage +counterestablishment +counterevidence +counterexaggeration +counterexample +counterexamples +counterexcitement +counterexcommunication +counterexercise +counterexplanation +counterexposition +counterexpostulation +counterextend +counterextension +counterfact +counterfactual +counterfactually +counterfallacy +counterfaller +counterfeisance +counterfeit +counterfeited +counterfeiter +counterfeiters +counterfeiting +counterfeitly +counterfeitment +counterfeitness +counterfeits +counterferment +counterfessed +counterfire +counterfix +counterflange +counterflashing +counterfleury +counterflight +counterflory +counterflow +counterflux +counterfoil +counterforce +counterformula +counterfort +counterfugue +countergabble +countergabion +countergage +countergager +countergambit +countergarrison +countergauge +countergauger +countergift +countergirded +counterglow +counterguard +counterguerilla +counterguerrilla +counterhaft +counterhammering +counterhypothesis +counteridea +counterideal +counterimagination +counterimitate +counterimitation +counterimpulse +counterindentation +counterindented +counterindicate +counterindication +counterindoctrinate +counterindoctrination +counterinfluence +countering +counterinsult +counterinsurgency +counterinsurgencies +counterinsurgent +counterinsurgents +counterintelligence +counterinterest +counterinterpretation +counterintrigue +counterintuitive +counterinvective +counterinvestment +counterion +counterirritant +counterirritate +counterirritation +counterjudging +counterjumper +counterlath +counterlathed +counterlathing +counterlatration +counterlaw +counterleague +counterlegislation +counterly +counterlife +counterlight +counterlighted +counterlighting +counterlilit +counterlit +counterlocking +counterlode +counterlove +countermachination +countermaid +counterman +countermand +countermandable +countermanded +countermanding +countermands +countermaneuver +countermanifesto +countermanifestoes +countermarch +countermarching +countermark +countermarriage +countermeasure +countermeasures +countermeet +countermen +countermessage +countermigration +countermine +countermined +countermining +countermissile +countermission +countermotion +countermount +countermove +countermoved +countermovement +countermoving +countermure +countermutiny +counternaiant +counternarrative +counternatural +counternecromancy +counternoise +counternotice +counterobjection +counterobligation +counteroffensive +counteroffensives +counteroffer +counteropening +counteropponent +counteropposite +counterorator +counterorder +counterorganization +counterpace +counterpaled +counterpaly +counterpane +counterpaned +counterpanes +counterparadox +counterparallel +counterparole +counterparry +counterpart +counterparts +counterpassant +counterpassion +counterpenalty +counterpendent +counterpetition +counterphobic +counterpicture +counterpillar +counterplay +counterplayer +counterplan +counterplea +counterplead +counterpleading +counterplease +counterplot +counterplotted +counterplotter +counterplotting +counterpoint +counterpointe +counterpointed +counterpointing +counterpoints +counterpoise +counterpoised +counterpoises +counterpoising +counterpoison +counterpole +counterpoles +counterponderate +counterpose +counterposition +counterposting +counterpotence +counterpotency +counterpotent +counterpractice +counterpray +counterpreach +counterpreparation +counterpressure +counterprick +counterprinciple +counterprocess +counterproductive +counterproductively +counterproductiveness +counterproductivity +counterprogramming +counterproject +counterpronunciamento +counterproof +counterpropaganda +counterpropagandize +counterprophet +counterproposal +counterproposition +counterprotection +counterprotest +counterprove +counterpull +counterpunch +counterpuncher +counterpuncture +counterpush +counterquartered +counterquarterly +counterquery +counterquestion +counterquip +counterradiation +counterraid +counterraising +counterrampant +counterrate +counterreaction +counterreason +counterreckoning +counterrecoil +counterreconnaissance +counterrefer +counterreflected +counterreform +counterreformation +counterreligion +counterremonstrant +counterreply +counterreplied +counterreplies +counterreplying +counterreprisal +counterresolution +counterrestoration +counterretreat +counterrevolution +counterrevolutionary +counterrevolutionaries +counterrevolutionist +counterrevolutionize +counterrevolutions +counterriposte +counterroll +counterrotating +counterround +counterruin +counters +countersale +countersalient +countersank +counterscale +counterscalloped +counterscarp +counterscoff +countersconce +counterscrutiny +countersea +counterseal +countersecure +countersecurity +counterselection +countersense +counterservice +countershade +countershading +countershaft +countershafting +countershear +countershine +countershock +countershout +counterside +countersiege +countersign +countersignal +countersignature +countersignatures +countersigned +countersigning +countersigns +countersympathy +countersink +countersinking +countersinks +countersynod +countersleight +counterslope +countersmile +countersnarl +counterspy +counterspies +counterspying +counterstain +counterstamp +counterstand +counterstatant +counterstatement +counterstatute +counterstep +counterstimulate +counterstimulation +counterstimulus +counterstock +counterstratagem +counterstream +counterstrike +counterstroke +counterstruggle +countersubject +countersuggestion +countersuit +countersun +countersunk +countersunken +countersurprise +countersway +counterswing +countersworn +countertack +countertail +countertally +countertaste +countertechnicality +countertendency +countertendencies +countertenor +countertenors +counterterm +counterterror +counterterrorism +counterterrorist +countertheme +countertheory +counterthought +counterthreat +counterthrust +counterthwarting +countertierce +countertime +countertype +countertouch +countertraction +countertrades +countertransference +countertranslation +countertraverse +countertreason +countertree +countertrench +countertrend +countertrespass +countertrippant +countertripping +countertruth +countertug +counterturn +counterturned +countervail +countervailed +countervailing +countervails +countervair +countervairy +countervallation +countervalue +countervaunt +countervene +countervengeance +countervenom +countervibration +counterview +countervindication +countervolition +countervolley +countervote +counterwager +counterwall +counterwarmth +counterwave +counterweigh +counterweighed +counterweighing +counterweight +counterweighted +counterweights +counterwheel +counterwill +counterwilling +counterwind +counterwitness +counterword +counterwork +counterworker +counterworking +counterwrite +countess +countesses +countfish +county +countian +countians +counties +counting +countinghouse +countys +countywide +countless +countlessly +countlessness +countor +countour +countree +countreeman +country +countrie +countrieman +countries +countrify +countrification +countrified +countryfied +countrifiedness +countryfiedness +countryfolk +countryish +countryman +countrymen +countrypeople +countryseat +countryside +countryward +countrywide +countrywoman +countrywomen +counts +countship +coup +coupage +coupe +couped +coupee +coupelet +couper +coupes +couping +couple +coupled +couplement +coupler +coupleress +couplers +couples +couplet +coupleteer +couplets +coupling +couplings +coupon +couponed +couponless +coupons +coups +coupstick +coupure +courage +courageous +courageously +courageousness +courager +courages +courant +courante +courantes +couranto +courantoes +courantos +courants +courap +couratari +courb +courbache +courbaril +courbash +courbe +courbette +courbettes +courche +courge +courgette +courida +courie +courier +couriers +couril +courlan +courlans +couronne +cours +course +coursed +coursey +courser +coursers +courses +coursy +coursing +coursings +court +courtage +courtal +courtby +courtbred +courtcraft +courted +courteous +courteously +courteousness +courtepy +courter +courters +courtesan +courtesanry +courtesans +courtesanship +courtesy +courtesied +courtesies +courtesying +courtezan +courtezanry +courtezanship +courthouse +courthouses +courty +courtyard +courtyards +courtier +courtiery +courtierism +courtierly +courtiers +courtiership +courtin +courting +courtless +courtlet +courtly +courtlier +courtliest +courtlike +courtliness +courtling +courtman +courtney +courtnoll +courtroll +courtroom +courtrooms +courts +courtship +courtships +courtside +courtzilite +couscous +couscouses +couscousou +couseranite +cousin +cousinage +cousiness +cousinhood +cousiny +cousinly +cousinry +cousinries +cousins +cousinship +coussinet +coustumier +couteau +couteaux +coutel +coutelle +couter +couters +coutet +couth +couthe +couther +couthest +couthy +couthie +couthier +couthiest +couthily +couthiness +couthless +couthly +couths +coutil +coutille +coutumier +couture +coutures +couturier +couturiere +couturieres +couturiers +couturire +couvade +couvades +couve +couvert +couverte +couveuse +couxia +couxio +covado +covalence +covalences +covalency +covalent +covalently +covarecan +covarecas +covary +covariable +covariables +covariance +covariant +covariate +covariates +covariation +covassal +cove +coved +covey +coveys +covelline +covellite +coven +covenable +covenably +covenance +covenant +covenantal +covenantally +covenanted +covenantee +covenanter +covenanting +covenantor +covenants +covens +covent +coventrate +coventry +coventries +coventrize +cover +coverable +coverage +coverages +coverall +coveralled +coveralls +coverchief +covercle +covered +coverer +coverers +covering +coverings +coverless +coverlet +coverlets +coverlid +coverlids +covers +coversed +coverside +coversine +coverslip +coverslut +covert +covertical +covertly +covertness +coverts +coverture +coverup +coverups +coves +covet +covetable +coveted +coveter +coveters +coveting +covetingly +covetise +covetiveness +covetous +covetously +covetousness +covets +covibrate +covibration +covid +covido +coviello +covillager +covillea +covin +covine +coving +covings +covinous +covinously +covisit +covisitor +covite +covolume +covotary +cow +cowage +cowages +cowal +cowan +coward +cowardy +cowardice +cowardish +cowardly +cowardliness +cowardness +cowards +cowbane +cowbanes +cowbarn +cowbell +cowbells +cowberry +cowberries +cowbind +cowbinds +cowbird +cowbirds +cowbyre +cowboy +cowboys +cowbrute +cowcatcher +cowcatchers +cowdie +cowed +cowedly +coween +cower +cowered +cowerer +cowerers +cowering +coweringly +cowers +cowfish +cowfishes +cowgate +cowgirl +cowgirls +cowgram +cowgrass +cowhage +cowhages +cowhand +cowhands +cowheart +cowhearted +cowheel +cowherb +cowherbs +cowherd +cowherds +cowhide +cowhided +cowhides +cowhiding +cowhorn +cowhouse +cowy +cowyard +cowichan +cowier +cowiest +cowing +cowinner +cowinners +cowish +cowishness +cowitch +cowk +cowkeeper +cowkine +cowl +cowle +cowled +cowleech +cowleeching +cowlick +cowlicks +cowlike +cowling +cowlings +cowlitz +cowls +cowlstaff +cowman +cowmen +coworker +coworkers +coworking +cowpat +cowpath +cowpats +cowpea +cowpeas +cowpen +cowper +cowperian +cowperitis +cowpock +cowpoke +cowpokes +cowpony +cowpox +cowpoxes +cowpunch +cowpuncher +cowpunchers +cowquake +cowry +cowrie +cowries +cowroid +cows +cowshard +cowsharn +cowshed +cowsheds +cowshot +cowshut +cowskin +cowskins +cowslip +cowslipped +cowslips +cowson +cowsucker +cowtail +cowthwort +cowtongue +cowtown +cowweed +cowwheat +cox +coxa +coxae +coxal +coxalgy +coxalgia +coxalgias +coxalgic +coxalgies +coxankylometer +coxarthritis +coxarthrocace +coxarthropathy +coxbones +coxcomb +coxcombess +coxcombhood +coxcomby +coxcombic +coxcombical +coxcombicality +coxcombically +coxcombity +coxcombry +coxcombries +coxcombs +coxcomical +coxcomically +coxed +coxendix +coxes +coxy +coxier +coxiest +coxing +coxite +coxitis +coxocerite +coxoceritic +coxodynia +coxofemoral +coxopodite +coxswain +coxswained +coxswaining +coxswains +coxwain +coxwaining +coxwains +coz +coze +cozed +cozey +cozeier +cozeiest +cozeys +cozen +cozenage +cozenages +cozened +cozener +cozeners +cozening +cozeningly +cozens +cozes +cozy +cozie +cozier +cozies +coziest +cozily +coziness +cozinesses +cozing +cozzes +cp +cpd +cpi +cpl +cpm +cpo +cps +cpt +cpu +cpus +cputime +cq +cr +craal +craaled +craaling +craals +crab +crabapple +crabbed +crabbedly +crabbedness +crabber +crabbery +crabbers +crabby +crabbier +crabbiest +crabbily +crabbiness +crabbing +crabbish +crabbit +crabcatcher +crabeater +crabeating +craber +crabfish +crabgrass +crabhole +crabier +crabit +crablet +crablike +crabman +crabmeat +crabmill +crabs +crabsidle +crabstick +crabut +crabweed +crabwise +crabwood +cracca +craccus +crachoir +cracidae +cracinae +crack +crackability +crackable +crackableness +crackajack +crackback +crackbrain +crackbrained +crackbrainedness +crackdown +crackdowns +cracked +crackedness +cracker +crackerberry +crackerberries +crackerjack +crackerjacks +crackers +cracket +crackhemp +cracky +crackiness +cracking +crackings +crackjaw +crackle +crackled +crackles +crackless +crackleware +crackly +cracklier +crackliest +crackling +cracklings +crackmans +cracknel +cracknels +crackpot +crackpotism +crackpots +crackpottedness +crackrope +cracks +crackskull +cracksman +cracksmen +crackup +crackups +cracovienne +cracowe +craddy +cradge +cradle +cradleboard +cradlechild +cradled +cradlefellow +cradleland +cradlelike +cradlemaker +cradlemaking +cradleman +cradlemate +cradlemen +cradler +cradlers +cradles +cradleside +cradlesong +cradlesongs +cradletime +cradling +cradock +craft +crafted +crafter +crafty +craftier +craftiest +craftily +craftiness +crafting +craftless +craftly +craftmanship +crafts +craftsman +craftsmanly +craftsmanlike +craftsmanship +craftsmaster +craftsmen +craftspeople +craftsperson +craftswoman +craftwork +craftworker +crag +craggan +cragged +craggedly +craggedness +craggy +craggier +craggiest +craggily +cragginess +craglike +crags +cragsman +cragsmen +cragwork +cray +craichy +craie +craye +crayer +crayfish +crayfishes +crayfishing +craig +craighle +craigmontite +craik +craylet +crain +crayon +crayoned +crayoning +crayonist +crayonists +crayons +crayonstone +craisey +craythur +craizey +crajuru +crake +craked +crakefeet +craker +crakes +craking +crakow +cram +cramasie +crambambulee +crambambuli +crambe +cramberry +crambes +crambid +crambidae +crambinae +cramble +crambly +crambo +cramboes +crambos +crambus +cramel +crammed +crammel +crammer +crammers +cramming +crammingly +cramoisy +cramoisie +cramoisies +cramp +crampbit +cramped +crampedness +cramper +crampet +crampette +crampfish +crampfishes +crampy +cramping +crampingly +crampish +crampit +crampits +crampon +cramponnee +crampons +crampoon +crampoons +cramps +crams +cran +cranage +cranberry +cranberries +crance +crancelin +cranch +cranched +cranches +cranching +crandall +crandallite +crane +cranebill +craned +craney +cranely +cranelike +craneman +cranemanship +cranemen +craner +cranes +cranesbill +cranesman +cranet +craneway +crang +crany +crania +craniacromial +craniad +cranial +cranially +cranian +craniata +craniate +craniates +cranic +craniectomy +craning +craninia +craniniums +craniocele +craniocerebral +cranioclasis +cranioclasm +cranioclast +cranioclasty +craniodidymus +craniofacial +craniognomy +craniognomic +craniognosy +craniograph +craniographer +craniography +cranioid +craniol +craniology +craniological +craniologically +craniologist +craniom +craniomalacia +craniomaxillary +craniometer +craniometry +craniometric +craniometrical +craniometrically +craniometrist +craniopagus +craniopathy +craniopathic +craniopharyngeal +craniopharyngioma +craniophore +cranioplasty +craniopuncture +craniorhachischisis +craniosacral +cranioschisis +cranioscopy +cranioscopical +cranioscopist +craniospinal +craniostenosis +craniostosis +craniota +craniotabes +craniotympanic +craniotome +craniotomy +craniotomies +craniotopography +craniovertebral +cranium +craniums +crank +crankbird +crankcase +crankcases +crankdisk +cranked +cranker +crankery +crankest +cranky +crankier +crankiest +crankily +crankiness +cranking +crankish +crankism +crankle +crankled +crankles +crankless +crankly +crankling +crankman +crankness +crankous +crankpin +crankpins +crankplate +cranks +crankshaft +crankshafts +crankum +crannage +crannel +crannequin +cranny +crannia +crannied +crannies +crannying +crannock +crannog +crannoge +crannoger +crannoges +crannogs +cranreuch +cransier +crantara +crants +crap +crapaud +crapaudine +crape +craped +crapefish +crapehanger +crapelike +crapes +crapette +crapy +craping +crapon +crapped +crapper +crappers +crappy +crappie +crappier +crappies +crappiest +crappin +crappiness +crapping +crapple +crappo +craps +crapshooter +crapshooters +crapshooting +crapula +crapulate +crapulence +crapulency +crapulent +crapulous +crapulously +crapulousness +crapwa +craquelure +craquelures +crare +crases +crash +crashed +crasher +crashers +crashes +crashing +crashingly +crashproof +crashworthy +crashworthiness +crasis +craspedal +craspedodromous +craspedon +craspedota +craspedotal +craspedote +craspedum +crass +crassament +crassamentum +crasser +crassest +crassier +crassilingual +crassina +crassis +crassities +crassitude +crassly +crassness +crassula +crassulaceae +crassulaceous +crataegus +crataeva +cratch +cratchens +cratches +cratchins +crate +crated +crateful +cratemaker +cratemaking +crateman +cratemen +crater +crateral +cratered +craterellus +craterid +crateriform +cratering +crateris +craterkin +craterless +craterlet +craterlike +craterous +craters +crates +craticular +cratinean +crating +cratometer +cratometry +cratometric +craton +cratonic +cratons +cratsmanship +craunch +craunched +craunches +craunching +craunchingly +cravat +cravats +cravatted +cravatting +crave +craved +craven +cravened +cravenette +cravenhearted +cravening +cravenly +cravenness +cravens +craver +cravers +craves +craving +cravingly +cravingness +cravings +cravo +craw +crawberry +crawdad +crawdads +crawfish +crawfished +crawfishes +crawfishing +crawfoot +crawfoots +crawful +crawl +crawled +crawley +crawleyroot +crawler +crawlerize +crawlers +crawly +crawlie +crawlier +crawliest +crawling +crawlingly +crawls +crawlsome +crawlspace +crawlway +crawlways +crawm +craws +crawtae +crawthumper +crax +craze +crazed +crazedly +crazedness +crazes +crazy +crazycat +crazier +crazies +craziest +crazily +craziness +crazing +crazingmill +crazyweed +crc +crcao +crche +cre +crea +creach +creachy +cread +creagh +creaght +creak +creaked +creaker +creaky +creakier +creakiest +creakily +creakiness +creaking +creakingly +creaks +cream +creambush +creamcake +creamcup +creamcups +creamed +creamer +creamery +creameries +creameryman +creamerymen +creamers +creamfruit +creamy +creamier +creamiest +creamily +creaminess +creaming +creamlaid +creamless +creamlike +creammaker +creammaking +creamometer +creams +creamsacs +creamware +creance +creancer +creant +crease +creased +creaseless +creaser +creasers +creases +creashaks +creasy +creasier +creasiest +creasing +creasol +creasot +creat +creatable +create +created +createdness +creates +creatic +creatin +creatine +creatinephosphoric +creatines +creating +creatinin +creatinine +creatininemia +creatins +creatinuria +creation +creational +creationary +creationism +creationist +creationistic +creations +creative +creatively +creativeness +creativity +creatophagous +creator +creatorhood +creatorrhea +creators +creatorship +creatotoxism +creatress +creatrix +creatural +creature +creaturehood +creatureless +creaturely +creatureliness +creatureling +creatures +creatureship +creaturize +creaze +crebricostate +crebrisulcate +crebrity +crebrous +creche +creches +creda +credal +creddock +credence +credences +credencive +credenciveness +credenda +credendum +credens +credensive +credensiveness +credent +credential +credentialed +credentialism +credentials +credently +credenza +credenzas +credere +credibility +credibilities +credible +credibleness +credibly +credit +creditability +creditabilities +creditable +creditableness +creditably +credited +crediting +creditive +creditless +creditor +creditors +creditorship +creditress +creditrix +credits +crednerite +credo +credos +credulity +credulities +credulous +credulously +credulousness +cree +creed +creedal +creedalism +creedalist +creedbound +creeded +creedist +creedite +creedless +creedlessness +creedmore +creeds +creedsman +creek +creeker +creekfish +creekfishes +creeky +creeks +creekside +creekstuff +creel +creeled +creeler +creeling +creels +creem +creen +creep +creepage +creepages +creeper +creepered +creeperless +creepers +creephole +creepy +creepie +creepier +creepies +creepiest +creepily +creepiness +creeping +creepingly +creepmouse +creepmousy +creeps +crees +creese +creeses +creesh +creeshed +creeshes +creeshy +creeshie +creeshing +creirgist +cremaillere +cremains +cremant +cremaster +cremasterial +cremasteric +cremate +cremated +cremates +cremating +cremation +cremationism +cremationist +cremations +cremator +crematory +crematoria +crematorial +crematories +crematoriria +crematoririums +crematorium +crematoriums +cremators +crembalum +creme +cremerie +cremes +cremnophobia +cremocarp +cremometer +cremona +cremone +cremor +cremorne +cremosin +cremule +crena +crenae +crenallation +crenate +crenated +crenately +crenation +crenature +crenel +crenelate +crenelated +crenelates +crenelating +crenelation +crenelations +crenele +creneled +crenelee +crenelet +creneling +crenellate +crenellated +crenellating +crenellation +crenelle +crenelled +crenelles +crenelling +crenels +crengle +crenic +crenitic +crenology +crenotherapy +crenothrix +crenula +crenulate +crenulated +crenulation +creodont +creodonta +creodonts +creole +creoleize +creoles +creolian +creolin +creolism +creolite +creolization +creolize +creolized +creolizing +creophagy +creophagia +creophagism +creophagist +creophagous +creosol +creosols +creosote +creosoted +creosoter +creosotes +creosotic +creosoting +crepance +crepe +creped +crepehanger +crepey +crepeier +crepeiest +crepes +crepy +crepidoma +crepidomata +crepidula +crepier +crepiest +crepine +crepiness +creping +crepis +crepitacula +crepitaculum +crepitant +crepitate +crepitated +crepitating +crepitation +crepitous +crepitus +creply +crepon +crept +crepuscle +crepuscular +crepuscule +crepusculine +crepusculum +cres +cresamine +cresc +crescence +crescendi +crescendo +crescendoed +crescendoing +crescendos +crescent +crescentade +crescentader +crescented +crescentia +crescentic +crescentiform +crescenting +crescentlike +crescentoid +crescents +crescentwise +crescive +crescively +crescograph +crescographic +cresegol +cresyl +cresylate +cresylene +cresylic +cresylite +cresyls +cresive +cresol +cresolin +cresoline +cresols +cresorcin +cresorcinol +cresotate +cresotic +cresotinate +cresotinic +cresoxy +cresoxid +cresoxide +cresphontes +cress +cressed +cresselle +cresses +cresset +cressets +cressy +cressida +cressier +cressiest +cresson +cressweed +cresswort +crest +crestal +crested +crestfallen +crestfallenly +crestfallenness +crestfish +cresting +crestings +crestless +crestline +crestmoreite +crests +creta +cretaceous +cretaceously +cretacic +cretan +crete +cretefaction +cretic +creticism +cretics +cretify +cretification +cretin +cretinic +cretinism +cretinistic +cretinization +cretinize +cretinized +cretinizing +cretinoid +cretinous +cretins +cretion +cretionary +cretism +cretize +cretonne +cretonnes +cretoria +creutzer +crevalle +crevalles +crevass +crevasse +crevassed +crevasses +crevassing +crevet +crevette +crevice +creviced +crevices +crevis +crew +crewcut +crewe +crewed +crewel +crewelist +crewellery +crewels +crewelwork +crewer +crewet +crewing +crewless +crewman +crewmanship +crewmen +crewneck +crews +crex +cry +cryable +cryaesthesia +cryal +cryalgesia +criance +cryanesthesia +criant +crib +crybaby +crybabies +cribbage +cribbages +cribbed +cribber +cribbers +cribbing +cribbings +cribbiter +cribbiting +cribble +cribbled +cribbling +cribella +cribellum +crible +cribo +cribose +cribral +cribrate +cribrately +cribration +cribriform +cribriformity +cribrose +cribrosity +cribrous +cribs +cribwork +cribworks +cric +cricetid +cricetidae +cricetids +cricetine +cricetus +crick +cricke +cricked +crickey +cricket +cricketed +cricketer +cricketers +crickety +cricketing +cricketings +cricketlike +crickets +cricking +crickle +cricks +cricoarytenoid +cricoid +cricoidectomy +cricoids +cricopharyngeal +cricothyreoid +cricothyreotomy +cricothyroid +cricothyroidean +cricotomy +cricotracheotomy +cricotus +criddle +cried +criey +crier +criers +cries +cryesthesia +crig +crying +cryingly +crikey +crile +crim +crimble +crime +crimea +crimean +crimeful +crimeless +crimelessness +crimeproof +crimes +criminal +criminaldom +criminalese +criminalism +criminalist +criminalistic +criminalistician +criminalistics +criminality +criminalities +criminally +criminalness +criminaloid +criminals +criminate +criminated +criminating +crimination +criminative +criminator +criminatory +crimine +crimini +criminis +criminogenesis +criminogenic +criminol +criminology +criminologic +criminological +criminologically +criminologies +criminologist +criminologists +criminosis +criminous +criminously +criminousness +crimison +crimmer +crimmers +crimmy +crymoanesthesia +crymodynia +crimogenic +crymotherapy +crimp +crimpage +crimped +crimper +crimpers +crimpy +crimpier +crimpiest +crimpiness +crimping +crimple +crimpled +crimples +crimpling +crimpness +crimps +crimson +crimsoned +crimsony +crimsoning +crimsonly +crimsonness +crimsons +crin +crinal +crinanite +crinate +crinated +crinatory +crinch +crine +crined +crinel +crinet +cringe +cringed +cringeling +cringer +cringers +cringes +cringing +cringingly +cringingness +cringle +cringles +crinicultural +criniculture +crinid +criniere +criniferous +criniger +crinigerous +crinion +criniparous +crinital +crinite +crinites +crinitory +crinivorous +crink +crinkle +crinkled +crinkleroot +crinkles +crinkly +crinklier +crinkliest +crinkliness +crinkling +crinkum +crinogenic +crinoid +crinoidal +crinoidea +crinoidean +crinoids +crinolette +crinoline +crinolines +crinose +crinosity +crinula +crinum +crinums +cryobiology +cryobiological +cryobiologically +cryobiologist +crioboly +criobolium +cryocautery +criocephalus +crioceras +crioceratite +crioceratitic +crioceris +cryochore +cryochoric +cryoconite +cryogen +cryogeny +cryogenic +cryogenically +cryogenics +cryogenies +cryogens +cryohydrate +cryohydric +cryolite +cryolites +criolla +criollas +criollo +criollos +cryology +cryological +cryometer +cryometry +cryonic +cryonics +cryopathy +cryophile +cryophilic +cryophyllite +cryophyte +criophore +cryophoric +criophoros +cryophorus +cryoplankton +cryoprobe +cryoprotective +cryoscope +cryoscopy +cryoscopic +cryoscopies +cryosel +cryosphere +cryospheric +criosphinges +criosphinx +criosphinxes +cryostase +cryostat +cryostats +cryosurgeon +cryosurgery +cryosurgical +cryotherapy +cryotherapies +cryotron +cryotrons +crip +cripes +crippied +crippingly +cripple +crippled +crippledom +crippleness +crippler +cripplers +cripples +cripply +crippling +cripplingly +crips +crypt +crypta +cryptaesthesia +cryptal +cryptamnesia +cryptamnesic +cryptanalysis +cryptanalyst +cryptanalytic +cryptanalytical +cryptanalytically +cryptanalytics +cryptanalyze +cryptanalyzed +cryptanalyzing +cryptarch +cryptarchy +crypted +crypteronia +crypteroniaceae +cryptesthesia +cryptesthetic +cryptic +cryptical +cryptically +crypticness +crypto +cryptoagnostic +cryptoanalysis +cryptoanalyst +cryptoanalytic +cryptoanalytically +cryptoanalytics +cryptobatholithic +cryptobranch +cryptobranchia +cryptobranchiata +cryptobranchiate +cryptobranchidae +cryptobranchus +cryptocarya +cryptocarp +cryptocarpic +cryptocarpous +cryptocephala +cryptocephalous +cryptocerata +cryptocerous +cryptoclastic +cryptocleidus +cryptoclimate +cryptoclimatology +cryptococcal +cryptococci +cryptococcic +cryptococcosis +cryptococcus +cryptocommercial +cryptocrystalline +cryptocrystallization +cryptocurrency +cryptodeist +cryptodynamic +cryptodira +cryptodiran +cryptodire +cryptodirous +cryptodouble +cryptogam +cryptogame +cryptogamy +cryptogamia +cryptogamian +cryptogamic +cryptogamical +cryptogamist +cryptogamous +cryptogenetic +cryptogenic +cryptogenous +cryptoglaux +cryptoglioma +cryptogram +cryptogramma +cryptogrammatic +cryptogrammatical +cryptogrammatist +cryptogrammic +cryptograms +cryptograph +cryptographal +cryptographer +cryptographers +cryptography +cryptographic +cryptographical +cryptographically +cryptographist +cryptoheresy +cryptoheretic +cryptoinflationist +cryptolite +cryptolith +cryptology +cryptologic +cryptological +cryptologist +cryptolunatic +cryptomere +cryptomeria +cryptomerous +cryptometer +cryptomnesia +cryptomnesic +cryptomonad +cryptomonadales +cryptomonadina +cryptonema +cryptonemiales +cryptoneurous +cryptonym +cryptonymic +cryptonymous +cryptopapist +cryptoperthite +cryptophagidae +cryptophyceae +cryptophyte +cryptophytic +cryptophthalmos +cryptopyic +cryptopin +cryptopine +cryptopyrrole +cryptoporticus +cryptoprocta +cryptoproselyte +cryptoproselytism +cryptorchid +cryptorchidism +cryptorchis +cryptorchism +cryptorhynchus +cryptorrhesis +cryptorrhetic +cryptos +cryptoscope +cryptoscopy +cryptosplenetic +cryptostegia +cryptostoma +cryptostomata +cryptostomate +cryptostome +cryptotaenia +cryptous +cryptovalence +cryptovalency +cryptovolcanic +cryptovolcanism +cryptoxanthin +cryptozygy +cryptozygosity +cryptozygous +cryptozoic +cryptozoite +cryptozonate +cryptozonia +crypts +crypturi +crypturidae +cris +crises +crisic +crisis +crisle +crisp +crispate +crispated +crispation +crispature +crispbread +crisped +crispen +crispened +crispening +crispens +crisper +crispers +crispest +crispy +crispier +crispiest +crispily +crispin +crispine +crispiness +crisping +crispins +crisply +crispness +crisps +criss +crissa +crissal +crisscross +crisscrossed +crisscrosses +crisscrossing +crisset +crissum +cryst +crista +cristae +crystal +crystaled +crystaling +crystalitic +crystalize +crystall +crystalled +crystallic +crystalliferous +crystalliform +crystalligerous +crystallike +crystallin +crystalline +crystalling +crystallinity +crystallisability +crystallisable +crystallisation +crystallise +crystallised +crystallising +crystallite +crystallites +crystallitic +crystallitis +crystallizability +crystallizable +crystallization +crystallize +crystallized +crystallizer +crystallizes +crystallizing +crystalloblastic +crystallochemical +crystallochemistry +crystallod +crystallogenesis +crystallogenetic +crystallogeny +crystallogenic +crystallogenical +crystallogy +crystallogram +crystallograph +crystallographer +crystallographers +crystallography +crystallographic +crystallographical +crystallographically +crystalloid +crystalloidal +crystallology +crystalloluminescence +crystallomagnetic +crystallomancy +crystallometry +crystallometric +crystallophyllian +crystallophobia +crystallose +crystallurgy +crystals +crystalwort +cristate +cristated +cristatella +cryste +cristi +cristy +crystic +cristiform +cristina +cristineaux +cristino +cristispira +cristivomer +cristobalite +crystograph +crystoleum +crystolon +cristopher +crystosphene +crit +critch +critchfield +criteria +criteriia +criteriions +criteriology +criterion +criterional +criterions +criterium +crith +crithidia +crithmene +crithomancy +critic +critical +criticality +critically +criticalness +criticaster +criticasterism +criticastry +criticisable +criticise +criticised +criticiser +criticises +criticising +criticisingly +criticism +criticisms +criticist +criticizable +criticize +criticized +criticizer +criticizers +criticizes +criticizing +criticizingly +critickin +critics +criticship +criticsm +criticule +critique +critiqued +critiques +critiquing +critism +critize +critling +critter +critteria +critters +crittur +critturs +crivetz +crizzel +crizzle +crizzled +crizzling +crl +cro +croak +croaked +croaker +croakers +croaky +croakier +croakiest +croakily +croakiness +croaking +croaks +croape +croat +croatan +croatian +croc +crocanthemum +crocard +croceic +crocein +croceine +croceines +croceins +croceous +crocetin +croceus +croche +crochet +crocheted +crocheter +crocheters +crocheteur +crocheting +crochets +croci +crociary +crociate +crocidolite +crocidura +crocin +crocine +crock +crockard +crocked +crocker +crockery +crockeries +crockeryware +crocket +crocketed +crocketing +crockets +crocky +crocking +crocko +crocks +crocodile +crocodilean +crocodiles +crocodilia +crocodilian +crocodilidae +crocodylidae +crocodiline +crocodilite +crocodility +crocodiloid +crocodilus +crocodylus +crocoisite +crocoite +crocoites +croconate +croconic +crocosmia +crocus +crocused +crocuses +crocuta +croft +crofter +crofterization +crofterize +crofters +crofting +croftland +crofts +croh +croy +croyden +croydon +croighle +croiik +croyl +crois +croisad +croisade +croisard +croise +croisee +croises +croisette +croissant +croissante +croissants +crojack +crojik +crojiks +croker +crokinole +crom +cromaltite +crombec +crome +cromer +cromerian +cromfordite +cromlech +cromlechs +cromme +crommel +cromorna +cromorne +cromster +cromwell +cromwellian +cronartium +crone +croneberry +cronel +crones +cronet +crony +cronian +cronie +cronied +cronies +cronying +cronyism +cronyisms +cronish +cronk +cronkness +cronstedtite +cronus +crooch +crood +croodle +crooisite +crook +crookback +crookbacked +crookbill +crookbilled +crooked +crookedbacked +crookeder +crookedest +crookedly +crookedness +crooken +crookery +crookeries +crookesite +crookfingered +crookheaded +crooking +crookkneed +crookle +crooklegged +crookneck +crooknecked +crooknecks +crooknosed +crooks +crookshouldered +crooksided +crooksterned +crooktoothed +crool +croomia +croon +crooned +crooner +crooners +crooning +crooningly +croons +croose +crop +crophead +cropland +croplands +cropless +cropman +croppa +cropped +cropper +croppers +croppy +croppie +croppies +cropping +cropplecrown +crops +cropshin +cropsick +cropsickness +cropweed +croquet +croqueted +croqueting +croquets +croquette +croquettes +croquignole +croquis +crore +crores +crosa +crosby +crose +croset +crosette +croshabell +crosier +crosiered +crosiers +croslet +crosne +crosnes +cross +crossability +crossable +crossarm +crossarms +crossband +crossbanded +crossbanding +crossbar +crossbarred +crossbarring +crossbars +crossbbred +crossbeak +crossbeam +crossbeams +crossbearer +crossbelt +crossbench +crossbencher +crossbill +crossbirth +crossbite +crossbolt +crossbolted +crossbones +crossbow +crossbowman +crossbowmen +crossbows +crossbred +crossbreds +crossbreed +crossbreeding +crossbreeds +crosscheck +crosscourt +crosscrosslet +crosscurrent +crosscurrented +crosscurrents +crosscut +crosscuts +crosscutter +crosscutting +crosse +crossed +crosser +crossers +crosses +crossest +crossette +crossfall +crossfertilizable +crossfire +crossfired +crossfiring +crossfish +crossflow +crossflower +crossfoot +crossgrainedness +crosshackle +crosshair +crosshairs +crosshand +crosshatch +crosshatched +crosshatcher +crosshatches +crosshatching +crosshaul +crosshauling +crosshead +crossing +crossings +crossite +crossjack +crosslap +crosslegs +crossley +crosslet +crossleted +crosslets +crossly +crosslight +crosslighted +crosslike +crossline +crosslink +crossness +crossopodia +crossopt +crossopterygian +crossopterygii +crossosoma +crossosomataceae +crossosomataceous +crossover +crossovers +crosspatch +crosspatches +crosspath +crosspiece +crosspieces +crosspoint +crosspoints +crosspost +crossrail +crossroad +crossroading +crossroads +crossrow +crossruff +crosstail +crosstalk +crosstie +crosstied +crossties +crosstoes +crosstown +crosstrack +crosstree +crosstrees +crossway +crossways +crosswalk +crosswalks +crossweb +crossweed +crosswind +crosswise +crosswiseness +crossword +crossworder +crosswords +crosswort +crost +crostarie +crotal +crotalaria +crotalic +crotalid +crotalidae +crotaliform +crotalin +crotalinae +crotaline +crotalism +crotalo +crotaloid +crotalum +crotalus +crotaphic +crotaphion +crotaphite +crotaphitic +crotaphytus +crotch +crotched +crotches +crotchet +crotcheted +crotcheteer +crotchety +crotchetiness +crotcheting +crotchets +crotchy +crotching +crotchwood +crotesco +crotyl +crotin +croton +crotonaldehyde +crotonate +crotonbug +crotonic +crotonyl +crotonylene +crotonization +crotons +crotophaga +crottal +crottels +crottle +crouch +crouchant +crouchback +crouche +crouched +croucher +crouches +crouchie +crouching +crouchingly +crouchmas +crouke +crounotherapy +croup +croupade +croupal +croupe +crouperbush +croupes +croupy +croupier +croupiers +croupiest +croupily +croupiness +croupon +croupous +croups +crouse +crousely +croustade +crout +croute +crouth +crouton +croutons +crow +crowbait +crowbar +crowbars +crowbell +crowberry +crowberries +crowbill +crowboot +crowd +crowded +crowdedly +crowdedness +crowder +crowders +crowdy +crowdie +crowdies +crowding +crowdle +crowds +crowdweed +crowed +crower +crowers +crowfeet +crowflower +crowfoot +crowfooted +crowfoots +crowhop +crowhopper +crowing +crowingly +crowkeeper +crowl +crown +crownal +crownation +crownband +crownbeard +crowncapping +crowned +crowner +crowners +crownet +crownets +crowning +crownland +crownless +crownlet +crownlike +crownling +crownmaker +crownment +crownpiece +crowns +crownwork +crownwort +crows +crowshay +crowstep +crowstepped +crowsteps +crowstick +crowstone +crowtoe +croze +crozed +crozer +crozers +crozes +crozier +croziers +crozing +crozle +crozzle +crozzly +crpe +crs +crts +cru +crub +crubeen +cruce +cruces +crucethouse +cruche +crucial +cruciality +crucially +crucialness +crucian +crucianella +crucians +cruciate +cruciated +cruciately +cruciating +cruciation +crucible +crucibles +crucibulum +crucifer +cruciferae +cruciferous +crucifers +crucify +crucificial +crucified +crucifier +crucifies +crucifyfied +crucifyfying +crucifige +crucifying +crucifix +crucifixes +crucifixion +crucifixions +cruciform +cruciformity +cruciformly +crucigerous +crucily +crucilly +crucis +cruck +crud +crudded +cruddy +crudding +cruddle +crude +crudely +crudelity +crudeness +cruder +crudes +crudest +crudy +crudites +crudity +crudities +crudle +cruds +crudwort +cruel +crueler +cruelest +cruelhearted +cruelize +crueller +cruellest +cruelly +cruelness +cruels +cruelty +cruelties +cruent +cruentate +cruentation +cruentous +cruet +cruety +cruets +cruise +cruised +cruiser +cruisers +cruiserweight +cruises +cruiseway +cruising +cruisingly +cruiskeen +cruisken +cruive +crull +cruller +crullers +crum +crumb +crumbable +crumbcloth +crumbed +crumber +crumbers +crumby +crumbier +crumbiest +crumbing +crumble +crumbled +crumblement +crumbles +crumblet +crumbly +crumblier +crumbliest +crumbliness +crumbling +crumblingness +crumblings +crumbs +crumbum +crumen +crumena +crumenal +crumhorn +crumlet +crummable +crummed +crummer +crummy +crummie +crummier +crummies +crummiest +crumminess +crumming +crummock +crump +crumped +crumper +crumpet +crumpets +crumpy +crumping +crumple +crumpled +crumpler +crumples +crumply +crumpling +crumps +crumster +crunch +crunchable +crunched +cruncher +crunchers +crunches +crunchy +crunchier +crunchiest +crunchily +crunchiness +crunching +crunchingly +crunchingness +crunchweed +crunk +crunkle +crunodal +crunode +crunodes +crunt +cruor +cruorin +cruors +crup +cruppen +crupper +cruppered +cruppering +cruppers +crura +crural +crureus +crurogenital +cruroinguinal +crurotarsal +crus +crusade +crusaded +crusader +crusaders +crusades +crusading +crusado +crusadoes +crusados +crusca +cruse +cruses +cruset +crusets +crush +crushability +crushable +crushableness +crushed +crusher +crushers +crushes +crushing +crushingly +crushproof +crusie +crusile +crusilee +crusily +crust +crusta +crustacea +crustaceal +crustacean +crustaceans +crustaceology +crustaceological +crustaceologist +crustaceorubrin +crustaceous +crustade +crustal +crustalogy +crustalogical +crustalogist +crustate +crustated +crustation +crusted +crustedly +cruster +crusty +crustier +crustiest +crustific +crustification +crustily +crustiness +crusting +crustless +crustose +crustosis +crusts +crut +crutch +crutched +crutcher +crutches +crutching +crutchlike +cruth +crutter +crux +cruxes +cruzado +cruzadoes +cruzados +cruzeiro +cruzeiros +cruziero +cruzieros +crwd +crwth +crwths +crzette +cs +csardas +csc +csch +csect +csects +csi +csk +csmp +csnet +csp +cst +csw +ct +cte +ctelette +ctenacanthus +ctene +ctenidia +ctenidial +ctenidium +cteniform +ctenii +cteninidia +ctenizid +ctenocephalus +ctenocyst +ctenodactyl +ctenodipterini +ctenodont +ctenodontidae +ctenodus +ctenoid +ctenoidean +ctenoidei +ctenoidian +ctenolium +ctenophora +ctenophoral +ctenophoran +ctenophore +ctenophoric +ctenophorous +ctenoplana +ctenostomata +ctenostomatous +ctenostome +ctetology +ctf +ctg +ctge +ctimo +ctn +cto +ctr +ctrl +cts +cu +cuadra +cuadrilla +cuadrillas +cuadrillero +cuailnge +cuamuchil +cuapinole +cuarenta +cuarta +cuartel +cuarteron +cuartilla +cuartillo +cuartino +cuarto +cub +cuba +cubage +cubages +cubalaya +cuban +cubane +cubangle +cubanite +cubanize +cubans +cubas +cubation +cubatory +cubature +cubatures +cubby +cubbies +cubbyhole +cubbyholes +cubbyhouse +cubbyyew +cubbing +cubbish +cubbishly +cubbishness +cubbyu +cubdom +cube +cubeb +cubebs +cubed +cubehead +cubelet +cubelium +cuber +cubera +cubers +cubes +cubhood +cubi +cubic +cubica +cubical +cubically +cubicalness +cubicity +cubicities +cubicle +cubicles +cubicly +cubicone +cubicontravariant +cubicovariant +cubics +cubicula +cubicular +cubiculary +cubiculo +cubiculum +cubiform +cubing +cubism +cubisms +cubist +cubistic +cubistically +cubists +cubit +cubital +cubitale +cubitalia +cubited +cubiti +cubitiere +cubito +cubitocarpal +cubitocutaneous +cubitodigital +cubitometacarpal +cubitopalmar +cubitoplantar +cubitoradial +cubits +cubitus +cubla +cubmaster +cubocalcaneal +cuboctahedron +cubocube +cubocuneiform +cubododecahedral +cuboid +cuboidal +cuboides +cuboids +cubomancy +cubomedusae +cubomedusan +cubometatarsal +cubonavicular +cubs +cubti +cuca +cucaracha +cuchan +cuchia +cuchulainn +cuck +cuckhold +cucking +cuckold +cuckolded +cuckoldy +cuckolding +cuckoldize +cuckoldly +cuckoldom +cuckoldry +cuckolds +cuckoo +cuckooed +cuckooflower +cuckooing +cuckoomaid +cuckoomaiden +cuckoomate +cuckoopint +cuckoopintle +cuckoos +cuckquean +cuckstool +cucoline +cucuy +cucuyo +cucujid +cucujidae +cucujus +cucularis +cucule +cuculi +cuculidae +cuculiform +cuculiformes +cuculine +cuculla +cucullaris +cucullate +cucullated +cucullately +cuculle +cuculliform +cucullus +cuculoid +cuculus +cucumaria +cucumariidae +cucumber +cucumbers +cucumiform +cucumis +cucupha +cucurb +cucurbit +cucurbita +cucurbitaceae +cucurbitaceous +cucurbital +cucurbite +cucurbitine +cucurbits +cud +cuda +cudava +cudbear +cudbears +cudden +cuddy +cuddie +cuddies +cuddyhole +cuddle +cuddleable +cuddled +cuddles +cuddlesome +cuddly +cuddlier +cuddliest +cuddling +cudeigh +cudgel +cudgeled +cudgeler +cudgelers +cudgeling +cudgelled +cudgeller +cudgelling +cudgels +cudgerie +cuds +cudweed +cudweeds +cudwort +cue +cueball +cueca +cuecas +cued +cueing +cueist +cueman +cuemanship +cuemen +cuerda +cuerpo +cues +cuesta +cuestas +cueva +cuff +cuffed +cuffer +cuffy +cuffyism +cuffin +cuffing +cuffle +cuffless +cufflink +cufflinks +cuffs +cufic +cuggermugger +cuya +cuyas +cuichunchulli +cuidado +cuiejo +cuiejos +cuif +cuifs +cuinage +cuinfo +cuing +cuir +cuirass +cuirassed +cuirasses +cuirassier +cuirassing +cuirie +cuish +cuishes +cuisinary +cuisine +cuisines +cuisinier +cuissard +cuissart +cuisse +cuissen +cuisses +cuisten +cuit +cuitlateco +cuitle +cuitled +cuitling +cuittikin +cuittle +cuittled +cuittles +cuittling +cuj +cujam +cuke +cukes +cul +culation +culavamsa +culbert +culbut +culbute +culbuter +culch +culches +culdee +culebra +culerage +culet +culets +culett +culeus +culex +culgee +culices +culicid +culicidae +culicidal +culicide +culicids +culiciform +culicifugal +culicifuge +culicinae +culicine +culicines +culicoides +culilawan +culinary +culinarian +culinarily +cull +culla +cullage +cullay +cullays +cullas +culled +cullen +cullender +culler +cullers +cullet +cullets +cully +cullibility +cullible +cullied +cullies +cullying +culling +cullion +cullionly +cullionry +cullions +cullis +cullisance +cullises +culls +culm +culmed +culmen +culmy +culmicolous +culmiferous +culmigenous +culminal +culminant +culminate +culminated +culminates +culminating +culmination +culminations +culminative +culming +culms +culot +culotte +culottes +culottic +culottism +culp +culpa +culpabilis +culpability +culpable +culpableness +culpably +culpae +culpas +culpate +culpatory +culpeo +culpon +culpose +culprit +culprits +culrage +culsdesac +cult +cultch +cultches +cultellation +cultelli +cultellus +culter +culteranismo +culti +cultic +cultigen +cultigens +cultirostral +cultirostres +cultish +cultism +cultismo +cultisms +cultist +cultistic +cultists +cultivability +cultivable +cultivably +cultivar +cultivars +cultivatability +cultivatable +cultivate +cultivated +cultivates +cultivating +cultivation +cultivations +cultivative +cultivator +cultivators +cultive +cultrate +cultrated +cultriform +cultrirostral +cultrirostres +cults +culttelli +cultual +culturable +cultural +culturalist +culturally +culture +cultured +cultureless +cultures +culturine +culturing +culturist +culturization +culturize +culturology +culturological +culturologically +culturologist +cultus +cultuses +culver +culverfoot +culverhouse +culverin +culverineer +culveriner +culverins +culverkey +culverkeys +culvers +culvert +culvertage +culverts +culverwort +cum +cumacea +cumacean +cumaceous +cumaean +cumay +cumal +cumaldehyde +cumanagoto +cumaphyte +cumaphytic +cumaphytism +cumar +cumara +cumarin +cumarins +cumarone +cumaru +cumbent +cumber +cumbered +cumberer +cumberers +cumbering +cumberland +cumberlandite +cumberless +cumberment +cumbers +cumbersome +cumbersomely +cumbersomeness +cumberworld +cumbha +cumble +cumbly +cumbraite +cumbrance +cumbre +cumbrian +cumbrous +cumbrously +cumbrousness +cumbu +cumene +cumengite +cumenyl +cumflutter +cumhal +cumic +cumidin +cumidine +cumyl +cumin +cuminal +cuminic +cuminyl +cuminoin +cuminol +cuminole +cumins +cuminseed +cumly +cummer +cummerbund +cummerbunds +cummers +cummin +cummingtonite +cummins +cummock +cumol +cump +cumquat +cumquats +cumsha +cumshaw +cumshaws +cumulant +cumular +cumulate +cumulated +cumulately +cumulates +cumulating +cumulation +cumulatist +cumulative +cumulatively +cumulativeness +cumulene +cumulet +cumuli +cumuliform +cumulite +cumulocirrus +cumulonimbus +cumulophyric +cumulose +cumulostratus +cumulous +cumulus +cun +cuna +cunabula +cunabular +cunan +cunarder +cunas +cunctation +cunctatious +cunctative +cunctator +cunctatory +cunctatorship +cunctatury +cunctipotent +cund +cundeamor +cundy +cundite +cundum +cundums +cundurango +cunea +cuneal +cuneate +cuneated +cuneately +cuneatic +cuneator +cunei +cuneiform +cuneiformist +cunenei +cuneocuboid +cuneonavicular +cuneoscaphoid +cunette +cuneus +cungeboi +cungevoi +cunicular +cuniculi +cuniculus +cunye +cuniform +cuniforms +cunyie +cunila +cunili +cunit +cunjah +cunjer +cunjevoi +cunner +cunners +cunni +cunny +cunnilinctus +cunnilinguism +cunnilingus +cunning +cunningaire +cunninger +cunningest +cunninghamia +cunningly +cunningness +cunnings +cunonia +cunoniaceae +cunoniaceous +cunt +cunts +cunza +cunzie +cuon +cuorin +cup +cupay +cupania +cupbearer +cupbearers +cupboard +cupboards +cupcake +cupcakes +cupel +cupeled +cupeler +cupelers +cupeling +cupellation +cupelled +cupeller +cupellers +cupelling +cupels +cupflower +cupful +cupfulfuls +cupfuls +cuphea +cuphead +cupholder +cupid +cupidinous +cupidity +cupidities +cupidon +cupidone +cupids +cupiuba +cupless +cuplike +cupmaker +cupmaking +cupman +cupmate +cupola +cupolaed +cupolaing +cupolaman +cupolar +cupolas +cupolated +cuppa +cuppas +cupped +cuppen +cupper +cuppers +cuppy +cuppier +cuppiest +cuppin +cupping +cuppings +cuprammonia +cuprammonium +cuprate +cuprein +cupreine +cuprene +cupreous +cupressaceae +cupressineous +cupressinoxylon +cupressus +cupric +cupride +cupriferous +cuprite +cuprites +cuproammonium +cuprobismutite +cuprocyanide +cuprodescloizite +cuproid +cuproiodargyrite +cupromanganese +cupronickel +cuproplumbite +cuproscheelite +cuprose +cuprosilicon +cuprotungstite +cuprous +cuprum +cuprums +cups +cupseed +cupsful +cupstone +cupula +cupulae +cupular +cupulate +cupule +cupules +cupuliferae +cupuliferous +cupuliform +cur +cura +curability +curable +curableness +curably +curacao +curacaos +curace +curacy +curacies +curacoa +curacoas +curage +curagh +curaghs +curara +curaras +curare +curares +curari +curarine +curarines +curaris +curarization +curarize +curarized +curarizes +curarizing +curassow +curassows +curat +curatage +curate +curatel +curates +curateship +curatess +curatial +curatic +curatical +curation +curative +curatively +curativeness +curatives +curatize +curatolatry +curator +curatory +curatorial +curatorium +curators +curatorship +curatrices +curatrix +curavecan +curb +curbable +curbash +curbed +curber +curbers +curby +curbing +curbings +curbless +curblike +curbline +curbs +curbside +curbstone +curbstoner +curbstones +curcas +curch +curchef +curches +curchy +curcuddoch +curculio +curculionid +curculionidae +curculionist +curculios +curcuma +curcumas +curcumin +curd +curded +curdy +curdier +curdiest +curdiness +curding +curdle +curdled +curdler +curdlers +curdles +curdly +curdling +curdoo +curds +curdwort +cure +cured +cureless +curelessly +curelessness +curemaster +curer +curers +cures +curet +curets +curettage +curette +curetted +curettement +curettes +curetting +curf +curfew +curfewed +curfewing +curfews +curfs +cury +curia +curiae +curiage +curial +curialism +curialist +curialistic +curiality +curialities +curiam +curiara +curiate +curiatii +curiboca +curie +curiegram +curies +curiescopy +curiet +curietherapy +curying +curin +curine +curing +curio +curiolofic +curiology +curiologic +curiological +curiologically +curiologics +curiomaniac +curios +curiosa +curiosi +curiosity +curiosities +curioso +curiosos +curious +curiouser +curiousest +curiously +curiousness +curiousnesses +curite +curites +curitis +curium +curiums +curl +curled +curledly +curledness +curler +curlers +curlew +curlewberry +curlews +curly +curlicue +curlycue +curlicued +curlicues +curlycues +curlicuing +curlier +curliest +curliewurly +curliewurlie +curlyhead +curlyheads +curlike +curlily +curlylocks +curliness +curling +curlingly +curlings +curlpaper +curls +curmudgeon +curmudgeonery +curmudgeonish +curmudgeonly +curmudgeons +curmurging +curmurring +curn +curney +curneys +curnie +curnies +curnock +curns +curpel +curpin +curple +curr +currach +currachs +currack +curragh +curraghs +currajong +curran +currance +currane +currans +currant +currants +currantworm +curratow +currawang +currawong +curred +currency +currencies +current +currently +currentness +currents +currentwise +curry +curricla +curricle +curricled +curricles +curricling +currycomb +currycombed +currycombing +currycombs +curricula +curricular +curricularization +curricularize +curriculum +curriculums +currie +curried +currier +curriery +currieries +curriers +curries +curryfavel +curryfavour +curriing +currying +currijong +curring +currish +currishly +currishness +currock +currs +curs +cursa +cursal +cursaro +curse +cursed +curseder +cursedest +cursedly +cursedness +cursement +cursen +curser +cursers +curses +curship +cursillo +cursing +cursitate +cursitor +cursive +cursively +cursiveness +cursives +cursor +cursorary +cursores +cursory +cursoria +cursorial +cursoriidae +cursorily +cursoriness +cursorious +cursorius +cursors +curst +curstful +curstfully +curstly +curstness +cursus +curt +curtail +curtailed +curtailedly +curtailer +curtailing +curtailment +curtailments +curtails +curtain +curtained +curtaining +curtainless +curtains +curtainwise +curtays +curtal +curtalax +curtalaxes +curtals +curtana +curtate +curtation +curtaxe +curted +curtein +curtelace +curteous +curter +curtesy +curtesies +curtest +curtilage +curtis +curtise +curtlax +curtly +curtness +curtnesses +curtsey +curtseyed +curtseying +curtseys +curtsy +curtsied +curtsies +curtsying +curua +curuba +curucaneca +curucanecan +curucucu +curucui +curule +curuminaca +curuminacan +curupay +curupays +curupey +curupira +cururo +cururos +curvaceous +curvaceously +curvaceousness +curvacious +curval +curvant +curvate +curvated +curvation +curvative +curvature +curvatures +curve +curveball +curved +curvedly +curvedness +curvey +curver +curves +curvesome +curvesomeness +curvet +curveted +curveting +curvets +curvette +curvetted +curvetting +curvy +curvicaudate +curvicostate +curvidentate +curvier +curviest +curvifoliate +curviform +curvilinead +curvilineal +curvilinear +curvilinearity +curvilinearly +curvimeter +curvinervate +curvinerved +curviness +curving +curvirostral +curvirostres +curviserial +curvital +curvity +curvities +curvle +curvograph +curvometer +curvous +curvulate +curwhibble +curwillet +cuscohygrin +cuscohygrine +cusconin +cusconine +cuscus +cuscuses +cuscuta +cuscutaceae +cuscutaceous +cusec +cusecs +cuselite +cush +cushag +cushat +cushats +cushaw +cushaws +cushewbird +cushy +cushie +cushier +cushiest +cushily +cushiness +cushing +cushion +cushioncraft +cushioned +cushionet +cushionflower +cushiony +cushioniness +cushioning +cushionless +cushionlike +cushions +cushite +cushitic +cushlamochree +cusie +cusinero +cusk +cusks +cusp +cuspal +cusparia +cusparidine +cusparine +cuspate +cuspated +cusped +cuspid +cuspidal +cuspidate +cuspidated +cuspidation +cuspides +cuspidine +cuspidor +cuspidors +cuspids +cusping +cuspis +cusps +cuspule +cuss +cussed +cussedly +cussedness +cusser +cussers +cusses +cussing +cusso +cussos +cussword +cusswords +cust +custard +custards +custerite +custode +custodee +custodes +custody +custodia +custodial +custodiam +custodian +custodians +custodianship +custodier +custodies +custom +customable +customableness +customably +customance +customary +customaries +customarily +customariness +customed +customer +customers +customhouse +customhouses +customing +customizable +customization +customizations +customize +customized +customizer +customizers +customizes +customizing +customly +customs +customshouse +custos +custrel +custron +custroun +custumal +custumals +cut +cutability +cutaneal +cutaneous +cutaneously +cutaway +cutaways +cutback +cutbacks +cutbank +cutch +cutcha +cutcher +cutchery +cutcheries +cutcherry +cutcherries +cutches +cutdown +cutdowns +cute +cutey +cuteys +cutely +cuteness +cutenesses +cuter +cuterebra +cutes +cutesy +cutesier +cutesiest +cutest +cutgrass +cutgrasses +cuthbert +cutheal +cuticle +cuticles +cuticolor +cuticula +cuticulae +cuticular +cuticularization +cuticularize +cuticulate +cutidure +cutiduris +cutie +cuties +cutify +cutification +cutigeral +cutikin +cutin +cutinisation +cutinise +cutinised +cutinises +cutinising +cutinization +cutinize +cutinized +cutinizes +cutinizing +cutins +cutireaction +cutis +cutisector +cutises +cutiterebra +cutitis +cutization +cutlas +cutlases +cutlash +cutlass +cutlasses +cutlassfish +cutlassfishes +cutler +cutleress +cutlery +cutleria +cutleriaceae +cutleriaceous +cutleriales +cutleries +cutlers +cutlet +cutlets +cutline +cutlines +cutling +cutlings +cutlips +cutocellulose +cutoff +cutoffs +cutose +cutout +cutouts +cutover +cutpurse +cutpurses +cuts +cutset +cuttable +cuttage +cuttages +cuttail +cuttanee +cutted +cutter +cutterhead +cutterman +cutters +cutthroat +cutthroats +cutty +cutties +cuttyhunk +cuttikin +cutting +cuttingly +cuttingness +cuttings +cuttle +cuttlebone +cuttlebones +cuttled +cuttlefish +cuttlefishes +cuttler +cuttles +cuttling +cuttoe +cuttoo +cuttoos +cutup +cutups +cutwal +cutwater +cutwaters +cutweed +cutwork +cutworks +cutworm +cutworms +cuvage +cuve +cuvee +cuvette +cuvettes +cuvy +cuvierian +cuvies +cuzceno +cv +cwierc +cwm +cwms +cwo +cwrite +cwt +czar +czardas +czardases +czardom +czardoms +czarevitch +czarevna +czarevnas +czarian +czaric +czarina +czarinas +czarinian +czarish +czarism +czarisms +czarist +czaristic +czarists +czaritza +czaritzas +czarowitch +czarowitz +czars +czarship +czech +czechic +czechish +czechization +czechoslovak +czechoslovakia +czechoslovakian +czechoslovakians +czechoslovaks +czechs +czigany +d +da +daalder +dab +dabb +dabba +dabbed +dabber +dabbers +dabby +dabbing +dabble +dabbled +dabbler +dabblers +dabbles +dabbling +dabblingly +dabblingness +dabblings +dabchick +dabchicks +dabih +dabitis +dablet +daboia +daboya +dabs +dabster +dabsters +dabuh +dace +dacelo +daceloninae +dacelonine +daces +dacha +dachas +dachs +dachshound +dachshund +dachshunde +dachshunds +dacian +dacyorrhea +dacite +dacitic +dacker +dackered +dackering +dackers +dacoit +dacoitage +dacoited +dacoity +dacoities +dacoiting +dacoits +dacrya +dacryadenalgia +dacryadenitis +dacryagogue +dacrycystalgia +dacryd +dacrydium +dacryelcosis +dacryoadenalgia +dacryoadenitis +dacryoblenorrhea +dacryocele +dacryocyst +dacryocystalgia +dacryocystitis +dacryocystoblennorrhea +dacryocystocele +dacryocystoptosis +dacryocystorhinostomy +dacryocystosyringotomy +dacryocystotome +dacryocystotomy +dacryohelcosis +dacryohemorrhea +dacryolin +dacryolite +dacryolith +dacryolithiasis +dacryoma +dacryon +dacryopyorrhea +dacryopyosis +dacryops +dacryorrhea +dacryosyrinx +dacryosolenitis +dacryostenosis +dacryuria +dacron +dactyl +dactylar +dactylate +dactyli +dactylic +dactylically +dactylics +dactylioglyph +dactylioglyphy +dactylioglyphic +dactylioglyphist +dactylioglyphtic +dactyliographer +dactyliography +dactyliographic +dactyliology +dactyliomancy +dactylion +dactyliotheca +dactylis +dactylist +dactylitic +dactylitis +dactylogram +dactylograph +dactylographer +dactylography +dactylographic +dactyloid +dactylology +dactylologies +dactylomegaly +dactylonomy +dactylopatagium +dactylopius +dactylopodite +dactylopore +dactylopteridae +dactylopterus +dactylorhiza +dactyloscopy +dactyloscopic +dactylose +dactylosymphysis +dactylosternal +dactylotheca +dactylous +dactylozooid +dactyls +dactylus +dacus +dad +dada +dadayag +dadaism +dadaisms +dadaist +dadaistic +dadaistically +dadaists +dadap +dadas +dadburned +dadder +daddy +daddies +dadding +daddynut +daddle +daddled +daddles +daddling +daddock +daddocky +daddums +dade +dadenhudd +dading +dado +dadoed +dadoes +dadoing +dados +dadouchos +dadoxylon +dads +dadu +daduchus +dadupanthi +dae +daedal +daedalea +daedalean +daedaleous +daedalian +daedalic +daedalidae +daedalist +daedaloid +daedalous +daedalus +daekon +daemon +daemonelix +daemones +daemony +daemonian +daemonic +daemonies +daemonistic +daemonology +daemons +daemonurgy +daemonurgist +daer +daeva +daff +daffadilly +daffadillies +daffadowndilly +daffadowndillies +daffed +daffery +daffy +daffydowndilly +daffier +daffiest +daffiness +daffing +daffish +daffle +daffled +daffling +daffodil +daffodilly +daffodillies +daffodils +daffodowndilly +daffodowndillies +daffs +dafla +daft +daftar +daftardar +daftberry +dafter +daftest +daftly +daftlike +daftness +daftnesses +dag +dagaba +dagame +dagassa +dagbamba +dagbane +dagesh +dagestan +dagga +daggar +dagged +dagger +daggerboard +daggerbush +daggered +daggering +daggerlike +daggerproof +daggers +daggy +dagging +daggle +daggled +daggles +daggletail +daggletailed +daggly +daggling +daghesh +daglock +daglocks +dagmar +dago +dagoba +dagobas +dagoes +dagomba +dagon +dagos +dags +dagswain +daguerrean +daguerreotype +daguerreotyped +daguerreotyper +daguerreotypes +daguerreotypy +daguerreotypic +daguerreotyping +daguerreotypist +daguilla +dah +dahabeah +dahabeahs +dahabeeyah +dahabiah +dahabiahs +dahabieh +dahabiehs +dahabiya +dahabiyas +dahabiyeh +dahlia +dahlias +dahlin +dahlsten +dahms +dahoman +dahomey +dahomeyan +dahoon +dahoons +dahs +day +dayabhaga +dayak +dayakker +dayal +dayan +dayanim +daybeacon +daybeam +daybed +daybeds +dayberry +daybill +dayblush +dayboy +daybook +daybooks +daybreak +daybreaks +daibutsu +daydawn +daidle +daidled +daidly +daidlie +daidling +daydream +daydreamed +daydreamer +daydreamers +daydreamy +daydreaming +daydreamlike +daydreams +daydreamt +daydrudge +dayfly +dayflies +dayflower +dayflowers +dayglow +dayglows +daygoing +daying +daijo +daiker +daikered +daikering +daikers +daikon +dail +dailamite +dayless +daily +dailies +daylight +daylighted +daylighting +daylights +daylily +daylilies +dailiness +daylit +daylong +dayman +daymare +daymares +daymark +daimen +daymen +dayment +daimiate +daimiel +daimio +daimyo +daimioate +daimios +daimyos +daimiote +daimon +daimones +daimonic +daimonion +daimonistic +daimonology +daimons +dain +daincha +dainchas +daynet +dainful +daint +dainteous +dainteth +dainty +daintier +dainties +daintiest +daintify +daintified +daintifying +daintihood +daintily +daintiness +daintith +daintrel +daypeep +daiquiri +daiquiris +daira +dairi +dairy +dairies +dairying +dairyings +dairymaid +dairymaids +dairyman +dairymen +dairywoman +dairywomen +dayroom +dayrooms +dairous +dairt +dais +days +daised +daisee +daises +daishiki +daishikis +dayshine +daisy +daisybush +daisycutter +dayside +daysides +daisied +daisies +daising +daysman +daysmen +dayspring +daystar +daystars +daystreak +daytale +daitya +daytide +daytime +daytimes +dayton +daiva +dayward +daywork +dayworker +daywrit +dak +daker +dakerhen +dakerhens +dakhini +dakhma +dakir +dakoit +dakoity +dakoities +dakoits +dakota +dakotan +dakotans +dakotas +daks +daktylon +daktylos +dal +dalaga +dalai +dalan +dalapon +dalapons +dalar +dalarnian +dalasi +dalasis +dalbergia +dalcassian +dale +dalea +dalecarlian +daledh +daleman +daler +dales +dalesfolk +dalesman +dalesmen +dalespeople +daleswoman +daleth +daleths +dalf +dali +daliance +dalibarda +dalis +dalk +dallack +dallan +dallas +dalle +dalles +dally +dalliance +dalliances +dallied +dallier +dalliers +dallies +dallying +dallyingly +dallyman +dallis +dallop +dalmania +dalmanites +dalmatian +dalmatians +dalmatic +dalmatics +dalradian +dalt +dalteen +dalton +daltonian +daltonic +daltonism +daltonist +dam +dama +damage +damageability +damageable +damageableness +damageably +damaged +damagement +damageous +damager +damagers +damages +damaging +damagingly +damayanti +damalic +daman +damans +damar +damara +damars +damas +damascene +damascened +damascener +damascenes +damascenine +damascening +damascus +damask +damasked +damaskeen +damaskeening +damaskin +damaskine +damasking +damasks +damasse +damassin +damboard +dambonite +dambonitol +dambose +dambrod +dame +damenization +dames +damewort +dameworts +damfool +damfoolish +damgalnunna +damia +damiana +damianist +damyankee +damie +damier +damine +damkjernite +damlike +dammar +dammara +dammaret +dammars +damme +dammed +dammer +dammers +damming +dammish +dammit +damn +damnability +damnabilities +damnable +damnableness +damnably +damnation +damnatory +damndest +damndests +damned +damneder +damnedest +damner +damners +damnyankee +damnify +damnification +damnificatus +damnified +damnifies +damnifying +damnii +damning +damningly +damningness +damnit +damnonians +damnonii +damnosa +damnous +damnously +damns +damnum +damoclean +damocles +damoetas +damoiseau +damoisel +damoiselle +damolic +damon +damone +damonico +damosel +damosels +damourite +damozel +damozels +damp +dampang +dampcourse +damped +dampen +dampened +dampener +dampeners +dampening +dampens +damper +dampers +dampest +dampy +damping +dampish +dampishly +dampishness +damply +dampne +dampness +dampnesses +dampproof +dampproofer +dampproofing +damps +dams +damsel +damselfish +damselfishes +damselfly +damselflies +damselhood +damsels +damsite +damson +damsons +dan +dana +danaan +danae +danagla +danai +danaid +danaidae +danaide +danaidean +danainae +danaine +danais +danaite +danakil +danalite +danaro +danburite +dancalite +dance +danceability +danceable +danced +dancer +danceress +dancery +dancers +dances +dancette +dancettee +dancetty +dancy +dancing +dancingly +dand +danda +dandelion +dandelions +dander +dandered +dandering +danders +dandy +dandiacal +dandiacally +dandically +dandydom +dandie +dandier +dandies +dandiest +dandify +dandification +dandified +dandifies +dandifying +dandyish +dandyishy +dandyishly +dandyism +dandyisms +dandyize +dandily +dandyling +dandilly +dandiprat +dandyprat +dandis +dandisette +dandizette +dandle +dandled +dandler +dandlers +dandles +dandling +dandlingly +dandriff +dandriffy +dandriffs +dandruff +dandruffy +dandruffs +dane +daneball +danebrog +daneflower +danegeld +danegelds +danegelt +danelaw +danes +daneweed +daneweeds +danewort +daneworts +dang +danged +danger +dangered +dangerful +dangerfully +dangering +dangerless +dangerous +dangerously +dangerousness +dangers +dangersome +danging +dangle +dangleberry +dangleberries +dangled +danglement +dangler +danglers +dangles +danglin +dangling +danglingly +dangs +dani +danian +danic +danicism +daniel +daniele +danielic +danielle +daniglacial +danio +danios +danish +danism +danite +danization +danize +dank +dankali +danke +danker +dankest +dankish +dankishness +dankly +dankness +danknesses +danli +dannebrog +dannemorite +danner +danny +dannie +dannock +danoranja +dansant +dansants +danseur +danseurs +danseuse +danseuses +danseusse +dansy +dansk +dansker +danta +dante +dantean +dantesque +danthonia +dantist +dantology +dantomania +danton +dantonesque +dantonist +dantophily +dantophilist +danube +danubian +danuri +danzig +danziger +danzon +dao +daoine +dap +dapedium +dapedius +daphnaceae +daphnad +daphne +daphnean +daphnephoria +daphnes +daphnetin +daphni +daphnia +daphnias +daphnid +daphnin +daphnioid +daphnis +daphnite +daphnoid +dapicho +dapico +dapifer +dapped +dapper +dapperer +dapperest +dapperly +dapperling +dapperness +dapping +dapple +dappled +dappledness +dappleness +dapples +dappling +daps +dapson +dar +darabukka +darac +daraf +darapti +darat +darb +darbha +darby +darbies +darbyism +darbyite +darbs +darbukka +darci +darcy +dard +dardan +dardanarius +dardani +dardanium +dardaol +dardic +dardistan +dare +dareall +dared +daredevil +daredevilism +daredevilry +daredevils +daredeviltry +dareful +daren +darer +darers +dares +daresay +darg +dargah +darger +darghin +dargo +dargsman +dargue +dari +darya +daribah +daric +darics +darien +darii +daryl +darin +daring +daringly +daringness +darings +dariole +darioles +darius +darjeeling +dark +darked +darkey +darkeys +darken +darkened +darkener +darkeners +darkening +darkens +darker +darkest +darkful +darkhaired +darkhearted +darkheartedness +darky +darkie +darkies +darking +darkish +darkishness +darkle +darkled +darkles +darkly +darklier +darkliest +darkling +darklings +darkmans +darkness +darknesses +darkroom +darkrooms +darks +darkskin +darksome +darksomeness +darksum +darktown +darling +darlingly +darlingness +darlings +darlingtonia +darn +darnation +darndest +darndests +darned +darneder +darnedest +darnel +darnels +darner +darners +darnex +darning +darnings +darnix +darns +daroga +darogah +darogha +daroo +darr +darraign +darrein +darrell +darren +darryl +darshan +darshana +darsonval +darsonvalism +darst +dart +dartagnan +dartars +dartboard +darted +darter +darters +darting +dartingly +dartingness +dartle +dartled +dartles +dartlike +dartling +dartman +dartmoor +dartoic +dartoid +dartos +dartre +dartrose +dartrous +darts +dartsman +darvon +darwan +darwesh +darwin +darwinian +darwinians +darwinical +darwinically +darwinism +darwinist +darwinistic +darwinists +darwinite +darwinize +darzee +das +daschagga +dase +dasein +dasewe +dash +dashboard +dashboards +dashed +dashedly +dashee +dasheen +dasheens +dashel +dasher +dashers +dashes +dashy +dashier +dashiest +dashiki +dashikis +dashing +dashingly +dashmaker +dashnak +dashnakist +dashnaktzutiun +dashplate +dashpot +dashpots +dasht +dashwheel +dasi +dasya +dasyatidae +dasyatis +dasycladaceae +dasycladaceous +dasylirion +dasymeter +dasypaedal +dasypaedes +dasypaedic +dasypeltis +dasyphyllous +dasiphora +dasypygal +dasypod +dasypodidae +dasypodoid +dasyprocta +dasyproctidae +dasyproctine +dasypus +dasystephana +dasyure +dasyures +dasyurid +dasyuridae +dasyurine +dasyuroid +dasyurus +dasyus +dasnt +dassent +dassy +dassie +dassies +dastard +dastardy +dastardize +dastardly +dastardliness +dastards +dastur +dasturi +daswen +dat +data +database +databases +datable +datableness +datably +datacell +datafile +dataflow +datagram +datagrams +datakit +datamation +datana +datapac +datapunch +datary +dataria +dataries +dataset +datasetname +datasets +datatype +datatypes +datch +datcha +datchas +date +dateable +dateableness +datebook +dated +datedly +datedness +dateless +datelessness +dateline +datelined +datelines +datelining +datemark +dater +daterman +daters +dates +datil +dating +dation +datisca +datiscaceae +datiscaceous +datiscetin +datiscin +datiscosid +datiscoside +datisi +datism +datival +dative +datively +datives +dativogerundial +dato +datolite +datolitic +datos +datsun +datsuns +datsw +datto +dattock +dattos +datum +datums +datura +daturas +daturic +daturism +dau +daub +daube +daubed +daubentonia +daubentoniidae +dauber +daubery +dauberies +daubers +daubes +dauby +daubier +daubiest +daubing +daubingly +daubreeite +daubreelite +daubreite +daubry +daubries +daubs +daubster +daucus +daud +dauded +dauding +daudit +dauerlauf +dauerschlaf +daughter +daughterhood +daughterkin +daughterless +daughterly +daughterlike +daughterliness +daughterling +daughters +daughtership +dauk +dauke +daukin +daulias +dault +daun +daunch +dauncy +daunder +daundered +daundering +daunders +dauner +daunii +daunomycin +daunt +daunted +daunter +daunters +daunting +dauntingly +dauntingness +dauntless +dauntlessly +dauntlessness +daunton +daunts +dauphin +dauphine +dauphines +dauphiness +dauphins +daur +dauri +daurna +daut +dauted +dautie +dauties +dauting +dauts +dauw +davach +davainea +davallia +dave +daven +davened +davening +davenport +davenports +davens +daver +daverdy +davy +david +davidian +davidic +davidical +davidist +davidsonite +daviely +davies +daviesia +daviesite +davyne +davis +davit +davits +davyum +davoch +daw +dawcock +dawdy +dawdle +dawdled +dawdler +dawdlers +dawdles +dawdling +dawdlingly +dawe +dawed +dawen +dawing +dawish +dawk +dawkin +dawks +dawn +dawned +dawny +dawning +dawnlight +dawnlike +dawns +dawnstreak +dawnward +dawpate +daws +dawson +dawsonia +dawsoniaceae +dawsoniaceous +dawsonite +dawt +dawted +dawtet +dawtie +dawties +dawting +dawtit +dawts +dawut +daza +daze +dazed +dazedly +dazedness +dazement +dazes +dazy +dazing +dazingly +dazzle +dazzled +dazzlement +dazzler +dazzlers +dazzles +dazzling +dazzlingly +dazzlingness +db +dbl +dbms +dbridement +dbrn +dc +dca +dcb +dcbname +dclass +dcollet +dcolletage +dcor +dd +ddname +ddt +de +dea +deaccession +deaccessioned +deaccessioning +deaccessions +deacetylate +deacetylated +deacetylating +deacetylation +deacidify +deacidification +deacidified +deacidifying +deacon +deaconal +deaconate +deaconed +deaconess +deaconesses +deaconhood +deaconing +deaconize +deaconry +deaconries +deacons +deaconship +deactivate +deactivated +deactivates +deactivating +deactivation +deactivations +deactivator +deactivators +dead +deadbeat +deadbeats +deadborn +deadcenter +deadeye +deadeyes +deaden +deadened +deadener +deadeners +deadening +deadeningly +deadens +deader +deadest +deadfall +deadfalls +deadflat +deadhand +deadhead +deadheaded +deadheading +deadheadism +deadheads +deadhearted +deadheartedly +deadheartedness +deadhouse +deady +deading +deadish +deadishly +deadishness +deadlatch +deadly +deadlier +deadliest +deadlight +deadlihead +deadlily +deadline +deadlines +deadliness +deadlock +deadlocked +deadlocking +deadlocks +deadman +deadmelt +deadmen +deadness +deadnesses +deadpay +deadpan +deadpanned +deadpanner +deadpanning +deadpans +deadrise +deadrize +deads +deadtongue +deadweight +deadwood +deadwoods +deadwork +deadworks +deadwort +deaerate +deaerated +deaerates +deaerating +deaeration +deaerator +deaf +deafen +deafened +deafening +deafeningly +deafens +deafer +deafest +deafforest +deafforestation +deafish +deafly +deafmuteness +deafness +deafnesses +deair +deaired +deairing +deairs +deal +dealable +dealate +dealated +dealates +dealation +dealbate +dealbation +dealbuminize +dealcoholist +dealcoholization +dealcoholize +dealer +dealerdom +dealers +dealership +dealerships +dealfish +dealfishes +dealing +dealings +dealkalize +dealkylate +dealkylation +deallocate +deallocated +deallocates +deallocating +deallocation +deallocations +deals +dealt +deambulate +deambulation +deambulatory +deambulatories +deamidase +deamidate +deamidation +deamidization +deamidize +deaminase +deaminate +deaminated +deaminating +deamination +deaminization +deaminize +deaminized +deaminizing +deammonation +dean +deanathematize +deaned +deaner +deanery +deaneries +deaness +deanimalize +deaning +deans +deanship +deanships +deanthropomorphic +deanthropomorphism +deanthropomorphization +deanthropomorphize +deappetizing +deaquation +dear +dearborn +deare +dearer +dearest +deary +dearie +dearies +dearly +dearling +dearn +dearness +dearnesses +dearomatize +dears +dearsenicate +dearsenicator +dearsenicize +dearth +dearthfu +dearths +dearticulation +dearworth +dearworthily +dearworthiness +deas +deash +deashed +deashes +deashing +deasil +deaspirate +deaspiration +deassimilation +death +deathbed +deathbeds +deathblow +deathblows +deathcup +deathcups +deathday +deathful +deathfully +deathfulness +deathy +deathify +deathin +deathiness +deathless +deathlessly +deathlessness +deathly +deathlike +deathlikeness +deathliness +deathling +deathrate +deathrates +deathroot +deaths +deathshot +deathsman +deathsmen +deathtime +deathtrap +deathtraps +deathward +deathwards +deathwatch +deathwatches +deathweed +deathworm +deaurate +deave +deaved +deavely +deaves +deaving +deb +debacchate +debacle +debacles +debadge +debag +debagged +debagging +debamboozle +debar +debarbarization +debarbarize +debark +debarkation +debarkations +debarked +debarking +debarkment +debarks +debarment +debarrance +debarrass +debarration +debarred +debarring +debars +debase +debased +debasedness +debasement +debaser +debasers +debases +debasing +debasingly +debat +debatable +debatably +debate +debateable +debated +debateful +debatefully +debatement +debater +debaters +debates +debating +debatingly +debatter +debauch +debauched +debauchedly +debauchedness +debauchee +debauchees +debaucher +debauchery +debaucheries +debauches +debauching +debauchment +debby +debbie +debbies +debcle +debe +debeak +debeaker +debeige +debel +debell +debellate +debellation +debellator +deben +debenture +debentured +debentureholder +debentures +debenzolize +debi +debye +debyes +debile +debilissima +debilitant +debilitate +debilitated +debilitates +debilitating +debilitation +debilitations +debilitative +debility +debilities +debind +debit +debitable +debite +debited +debiteuse +debiting +debitor +debitrix +debits +debitum +debitumenize +debituminization +debituminize +deblai +deblaterate +deblateration +deblock +deblocked +deblocking +deboise +deboist +deboistly +deboistness +deboite +deboites +debonair +debonaire +debonairity +debonairly +debonairness +debonairty +debone +deboned +deboner +deboners +debones +deboning +debonnaire +deborah +debord +debordment +debosh +deboshed +deboshment +deboss +debouch +debouche +debouched +debouches +debouching +debouchment +debouchure +debout +debowel +debride +debrided +debridement +debriding +debrief +debriefed +debriefing +debriefings +debriefs +debris +debrominate +debromination +debruise +debruised +debruises +debruising +debs +debt +debted +debtee +debtful +debtless +debtor +debtors +debtorship +debts +debug +debugged +debugger +debuggers +debugging +debugs +debullition +debunk +debunked +debunker +debunkers +debunking +debunkment +debunks +deburr +deburse +debus +debused +debusing +debussed +debussy +debussyan +debussyanize +debussing +debut +debutant +debutante +debutantes +debutants +debuted +debuting +debuts +dec +decachord +decad +decadactylous +decadal +decadally +decadarch +decadarchy +decadary +decadation +decade +decadence +decadency +decadent +decadentism +decadently +decadents +decadenza +decades +decadescent +decadi +decadianome +decadic +decadist +decadrachm +decadrachma +decadrachmae +decaedron +decaesarize +decaffeinate +decaffeinated +decaffeinates +decaffeinating +decaffeinize +decafid +decagynous +decagon +decagonal +decagonally +decagons +decagram +decagramme +decagrams +decahedra +decahedral +decahedrodra +decahedron +decahedrons +decahydrate +decahydrated +decahydronaphthalene +decay +decayable +decayed +decayedness +decayer +decayers +decaying +decayless +decays +decaisnea +decal +decalage +decalcify +decalcification +decalcified +decalcifier +decalcifies +decalcifying +decalcomania +decalcomaniac +decalcomanias +decalescence +decalescent +decalin +decaliter +decaliters +decalitre +decalobate +decalog +decalogist +decalogue +decalomania +decals +decalvant +decalvation +decameral +decameron +decameronic +decamerous +decameter +decameters +decamethonium +decametre +decametric +decamp +decamped +decamping +decampment +decamps +decan +decanal +decanally +decanate +decancellate +decancellated +decancellating +decancellation +decandently +decandria +decandrous +decane +decanery +decanes +decangular +decani +decanically +decannulation +decanoyl +decanol +decanonization +decanonize +decanormal +decant +decantate +decantation +decanted +decanter +decanters +decantherous +decanting +decantist +decants +decap +decapetalous +decaphyllous +decapitable +decapitalization +decapitalize +decapitate +decapitated +decapitates +decapitating +decapitation +decapitations +decapitator +decapod +decapoda +decapodal +decapodan +decapodiform +decapodous +decapods +decapper +decapsulate +decapsulation +decarbonate +decarbonated +decarbonating +decarbonation +decarbonator +decarbonylate +decarbonylated +decarbonylating +decarbonylation +decarbonisation +decarbonise +decarbonised +decarboniser +decarbonising +decarbonization +decarbonize +decarbonized +decarbonizer +decarbonizing +decarboxylase +decarboxylate +decarboxylated +decarboxylating +decarboxylation +decarboxylization +decarboxylize +decarburation +decarburisation +decarburise +decarburised +decarburising +decarburization +decarburize +decarburized +decarburizing +decarch +decarchy +decarchies +decard +decardinalize +decare +decares +decarhinus +decarnate +decarnated +decart +decartelization +decartelize +decartelized +decartelizing +decasemic +decasepalous +decasyllabic +decasyllable +decasyllables +decasyllabon +decaspermal +decaspermous +decast +decastellate +decastere +decastich +decastylar +decastyle +decastylos +decasualisation +decasualise +decasualised +decasualising +decasualization +decasualize +decasualized +decasualizing +decate +decathlon +decathlons +decatholicize +decatyl +decating +decatize +decatizer +decatizing +decatoic +decator +decaudate +decaudation +deccennia +decciare +decciares +decd +decease +deceased +deceases +deceasing +decede +decedent +decedents +deceit +deceitful +deceitfully +deceitfulness +deceits +deceivability +deceivable +deceivableness +deceivably +deceivance +deceive +deceived +deceiver +deceivers +deceives +deceiving +deceivingly +decelerate +decelerated +decelerates +decelerating +deceleration +decelerations +decelerator +decelerators +decelerometer +deceleron +decem +december +decemberish +decemberly +decembrist +decemcostate +decemdentate +decemfid +decemflorous +decemfoliate +decemfoliolate +decemjugate +decemlocular +decempartite +decempeda +decempedal +decempedate +decempennate +decemplex +decemplicate +decempunctate +decemstriate +decemuiri +decemvii +decemvir +decemviral +decemvirate +decemviri +decemvirs +decemvirship +decenary +decenaries +decence +decency +decencies +decene +decener +decenyl +decennal +decennary +decennaries +decennia +decenniad +decennial +decennially +decennials +decennium +decenniums +decennoval +decent +decenter +decentered +decentering +decenters +decentest +decently +decentness +decentralisation +decentralise +decentralised +decentralising +decentralism +decentralist +decentralization +decentralizationist +decentralizations +decentralize +decentralized +decentralizes +decentralizing +decentration +decentre +decentred +decentres +decentring +decephalization +decephalize +deceptibility +deceptible +deception +deceptional +deceptions +deceptious +deceptiously +deceptitious +deceptive +deceptively +deceptiveness +deceptivity +deceptory +decerebrate +decerebrated +decerebrating +decerebration +decerebrize +decern +decerned +decerning +decerniture +decernment +decerns +decerp +decertation +decertify +decertification +decertificaton +decertified +decertifying +decess +decession +decessit +decessor +decharm +dechemicalization +dechemicalize +dechenite +dechlog +dechlore +dechloridation +dechloridize +dechloridized +dechloridizing +dechlorinate +dechlorinated +dechlorinating +dechlorination +dechoralize +dechristianization +dechristianize +decian +deciare +deciares +deciatine +decibar +decibel +decibels +deciceronize +decidability +decidable +decide +decided +decidedly +decidedness +decidement +decidence +decidendi +decident +decider +deciders +decides +deciding +decidingly +decidua +deciduae +decidual +deciduary +deciduas +deciduata +deciduate +deciduity +deciduitis +deciduoma +deciduous +deciduously +deciduousness +decigram +decigramme +decigrams +decil +decyl +decile +decylene +decylenic +deciles +decylic +deciliter +deciliters +decilitre +decillion +decillionth +decima +decimal +decimalisation +decimalise +decimalised +decimalising +decimalism +decimalist +decimalization +decimalize +decimalized +decimalizes +decimalizing +decimally +decimals +decimate +decimated +decimates +decimating +decimation +decimator +decime +decimestrial +decimeter +decimeters +decimetre +decimetres +decimolar +decimole +decimosexto +decimus +decine +decyne +decinormal +decipher +decipherability +decipherable +decipherably +deciphered +decipherer +deciphering +decipherment +deciphers +decipium +decipolar +decise +decision +decisional +decisionmake +decisions +decisis +decisive +decisively +decisiveness +decistere +decisteres +decitizenize +decius +decivilization +decivilize +deck +decke +decked +deckedout +deckel +deckels +decken +decker +deckers +deckhand +deckhands +deckhead +deckhouse +deckhouses +deckie +decking +deckings +deckle +deckles +deckload +deckman +deckpipe +decks +deckswabber +decl +declaim +declaimant +declaimed +declaimer +declaimers +declaiming +declaims +declamando +declamation +declamations +declamator +declamatory +declamatoriness +declarable +declarant +declaration +declarations +declarative +declaratively +declaratives +declarator +declaratory +declaratorily +declarators +declare +declared +declaredly +declaredness +declarer +declarers +declares +declaring +declass +declasse +declassed +declassee +declasses +declassicize +declassify +declassification +declassifications +declassified +declassifies +declassifying +declassing +declension +declensional +declensionally +declensions +declericalize +declimatize +declinable +declinal +declinate +declination +declinational +declinations +declinator +declinatory +declinature +decline +declined +declinedness +decliner +decliners +declines +declining +declinograph +declinometer +declivate +declive +declivent +declivity +declivities +declivitous +declivitously +declivous +declutch +decnet +deco +decoagulate +decoagulated +decoagulation +decoat +decocainize +decoct +decocted +decoctible +decocting +decoction +decoctive +decocts +decoctum +decodable +decode +decoded +decoder +decoders +decodes +decoding +decodings +decodon +decohere +decoherence +decoherer +decohesion +decoy +decoic +decoyed +decoyer +decoyers +decoying +decoyman +decoymen +decoys +decoke +decoll +decollate +decollated +decollating +decollation +decollator +decolletage +decollete +decollimate +decolonisation +decolonise +decolonised +decolonising +decolonization +decolonize +decolonized +decolonizes +decolonizing +decolor +decolorant +decolorate +decoloration +decolored +decolorimeter +decoloring +decolorisation +decolorise +decolorised +decoloriser +decolorising +decolorization +decolorize +decolorized +decolorizer +decolorizing +decolors +decolour +decolouration +decoloured +decolouring +decolourisation +decolourise +decolourised +decolouriser +decolourising +decolourization +decolourize +decolourized +decolourizer +decolourizing +decolours +decommission +decommissioned +decommissioning +decommissions +decompensate +decompensated +decompensates +decompensating +decompensation +decompensations +decompensatory +decompile +decompiler +decomplex +decomponent +decomponible +decomposability +decomposable +decompose +decomposed +decomposer +decomposers +decomposes +decomposing +decomposite +decomposition +decompositional +decompositions +decomposure +decompound +decompoundable +decompoundly +decompress +decompressed +decompresses +decompressing +decompression +decompressions +decompressive +deconcatenate +deconcentrate +deconcentrated +deconcentrating +deconcentration +deconcentrator +decondition +decongest +decongestant +decongestants +decongested +decongesting +decongestion +decongestive +decongests +deconsecrate +deconsecrated +deconsecrating +deconsecration +deconsider +deconsideration +decontaminate +decontaminated +decontaminates +decontaminating +decontamination +decontaminations +decontaminative +decontaminator +decontaminators +decontrol +decontrolled +decontrolling +decontrols +deconventionalize +deconvolution +deconvolve +decopperization +decopperize +decor +decorability +decorable +decorably +decorament +decorate +decorated +decorates +decorating +decoration +decorationist +decorations +decorative +decoratively +decorativeness +decorator +decoratory +decorators +decore +decorement +decorist +decorous +decorously +decorousness +decorrugative +decors +decorticate +decorticated +decorticating +decortication +decorticator +decorticosis +decortization +decorum +decorums +decostate +decoupage +decouple +decoupled +decouples +decoupling +decourse +decourt +decousu +decrassify +decrassified +decream +decrease +decreased +decreaseless +decreases +decreasing +decreasingly +decreation +decreative +decree +decreeable +decreed +decreeing +decreement +decreer +decreers +decrees +decreet +decreing +decrement +decremental +decremented +decrementing +decrementless +decrements +decremeter +decrepid +decrepit +decrepitate +decrepitated +decrepitating +decrepitation +decrepity +decrepitly +decrepitness +decrepitude +decreptitude +decresc +decrescence +decrescendo +decrescendos +decrescent +decretal +decretalist +decretals +decrete +decretion +decretist +decretive +decretively +decretory +decretorial +decretorian +decretorily +decretum +decrew +decry +decrial +decrials +decried +decrier +decriers +decries +decrying +decriminalization +decriminalize +decriminalized +decriminalizes +decriminalizing +decrypt +decrypted +decrypting +decryption +decryptions +decryptograph +decrypts +decrystallization +decrown +decrowned +decrowning +decrowns +decrudescence +decrustation +decubation +decubital +decubiti +decubitus +decultivate +deculturate +decuman +decumana +decumani +decumanus +decumary +decumaria +decumbence +decumbency +decumbent +decumbently +decumbiture +decuple +decupled +decuples +decuplet +decupling +decury +decuria +decuries +decurion +decurionate +decurions +decurrence +decurrences +decurrency +decurrencies +decurrent +decurrently +decurring +decursion +decursive +decursively +decurt +decurtate +decurvation +decurvature +decurve +decurved +decurves +decurving +decus +decuss +decussate +decussated +decussately +decussating +decussation +decussatively +decussion +decussis +decussoria +decussorium +decwriter +deda +dedal +dedan +dedanim +dedanite +dedans +dedd +deddy +dedecorate +dedecoration +dedecorous +dedenda +dedendum +dedentition +dedicant +dedicate +dedicated +dedicatedly +dedicatee +dedicates +dedicating +dedication +dedicational +dedications +dedicative +dedicator +dedicatory +dedicatorial +dedicatorily +dedicators +dedicature +dedifferentiate +dedifferentiated +dedifferentiating +dedifferentiation +dedignation +dedimus +dedit +deditician +dediticiancy +dedition +dedo +dedoggerelize +dedogmatize +dedolation +dedolence +dedolency +dedolent +dedolomitization +dedolomitize +dedolomitized +dedolomitizing +deduce +deduced +deducement +deducer +deduces +deducibility +deducible +deducibleness +deducibly +deducing +deducive +deduct +deducted +deductibility +deductible +deductibles +deductile +deducting +deductio +deduction +deductions +deductive +deductively +deductory +deducts +deduit +deduplication +dee +deecodder +deed +deedbote +deedbox +deeded +deedeed +deedful +deedfully +deedholder +deedy +deedier +deediest +deedily +deediness +deeding +deedless +deeds +deejay +deejays +deek +deem +deemed +deemer +deemie +deeming +deemphasis +deemphasize +deemphasized +deemphasizes +deemphasizing +deems +deemster +deemsters +deemstership +deener +deeny +deep +deepen +deepened +deepener +deepeners +deepening +deepeningly +deepens +deeper +deepest +deepfreeze +deepfreezed +deepfreezing +deepfroze +deepfrozen +deepgoing +deeping +deepish +deeply +deeplier +deepmost +deepmouthed +deepness +deepnesses +deeps +deepsome +deepwater +deepwaterman +deepwatermen +deer +deerberry +deerdog +deerdrive +deerfly +deerflies +deerflys +deerfood +deergrass +deerhair +deerherd +deerhorn +deerhound +deeryard +deeryards +deerkill +deerlet +deerlike +deermeat +deers +deerskin +deerskins +deerstalker +deerstalkers +deerstalking +deerstand +deerstealer +deertongue +deervetch +deerweed +deerweeds +deerwood +dees +deescalate +deescalated +deescalates +deescalating +deescalation +deescalations +deeses +deesis +deess +deevey +deevilick +deewan +deewans +def +deface +defaceable +defaced +defacement +defacements +defacer +defacers +defaces +defacing +defacingly +defacto +defade +defaecate +defail +defailance +defaillance +defailment +defaisance +defaitisme +defaitiste +defalcate +defalcated +defalcates +defalcating +defalcation +defalcations +defalcator +defalk +defamation +defamations +defamatory +defame +defamed +defamer +defamers +defames +defamy +defaming +defamingly +defamous +defang +defassa +defat +defatigable +defatigate +defatigated +defatigation +defats +defatted +defatting +default +defaultant +defaulted +defaulter +defaulters +defaulting +defaultless +defaults +defaulture +defeasance +defeasanced +defease +defeasibility +defeasible +defeasibleness +defeasive +defeat +defeated +defeatee +defeater +defeaters +defeating +defeatism +defeatist +defeatists +defeatment +defeats +defeature +defecant +defecate +defecated +defecates +defecating +defecation +defecator +defect +defected +defecter +defecters +defectibility +defectible +defecting +defection +defectionist +defections +defectious +defective +defectively +defectiveness +defectless +defectlessness +defectology +defector +defectors +defectoscope +defects +defectum +defectuous +defedation +defeise +defeit +defeminisation +defeminise +defeminised +defeminising +defeminization +defeminize +defeminized +defeminizing +defence +defenceable +defenceless +defencelessly +defencelessness +defences +defencive +defend +defendable +defendant +defendants +defended +defender +defenders +defending +defendress +defends +defenestrate +defenestrated +defenestrates +defenestrating +defenestration +defensative +defense +defensed +defenseless +defenselessly +defenselessness +defenseman +defensemen +defenser +defenses +defensibility +defensible +defensibleness +defensibly +defensing +defension +defensive +defensively +defensiveness +defensor +defensory +defensorship +defer +deferable +deference +deferens +deferent +deferentectomy +deferential +deferentiality +deferentially +deferentitis +deferents +deferment +deferments +deferrable +deferral +deferrals +deferred +deferrer +deferrers +deferring +deferrization +deferrize +deferrized +deferrizing +defers +defervesce +defervesced +defervescence +defervescent +defervescing +defet +defeudalize +defi +defy +defiable +defial +defiance +defiances +defiant +defiantly +defiantness +defiatory +defiber +defibrillate +defibrillated +defibrillating +defibrillation +defibrillative +defibrillator +defibrillatory +defibrinate +defibrination +defibrinize +deficience +deficiency +deficiencies +deficient +deficiently +deficit +deficits +defied +defier +defiers +defies +defiguration +defigure +defying +defyingly +defilable +defilade +defiladed +defilades +defilading +defile +defiled +defiledness +defilement +defilements +defiler +defilers +defiles +defiliation +defiling +defilingly +definability +definable +definably +define +defined +definedly +definement +definer +definers +defines +definienda +definiendum +definiens +definientia +defining +definish +definite +definitely +definiteness +definition +definitional +definitiones +definitions +definitise +definitised +definitising +definitive +definitively +definitiveness +definitization +definitize +definitized +definitizing +definitor +definitude +defis +defix +deflagrability +deflagrable +deflagrate +deflagrated +deflagrates +deflagrating +deflagration +deflagrations +deflagrator +deflate +deflated +deflater +deflates +deflating +deflation +deflationary +deflationist +deflations +deflator +deflators +deflea +defleaed +defleaing +defleas +deflect +deflectable +deflected +deflecting +deflection +deflectional +deflectionization +deflectionize +deflections +deflective +deflectometer +deflector +deflectors +deflects +deflesh +deflex +deflexed +deflexibility +deflexible +deflexing +deflexion +deflexionize +deflexure +deflocculant +deflocculate +deflocculated +deflocculating +deflocculation +deflocculator +deflocculent +deflorate +defloration +deflorations +deflore +deflorescence +deflourish +deflow +deflower +deflowered +deflowerer +deflowering +deflowerment +deflowers +defluent +defluous +defluvium +deflux +defluxion +defoam +defoamed +defoamer +defoamers +defoaming +defoams +defocus +defocusses +defoedation +defog +defogged +defogger +defoggers +defogging +defogs +defoil +defoliage +defoliant +defoliants +defoliate +defoliated +defoliates +defoliating +defoliation +defoliations +defoliator +defoliators +deforce +deforced +deforcement +deforceor +deforcer +deforces +deforciant +deforcing +deforest +deforestation +deforested +deforester +deforesting +deforests +deform +deformability +deformable +deformalize +deformation +deformational +deformations +deformative +deformed +deformedly +deformedness +deformer +deformers +deformeter +deforming +deformism +deformity +deformities +deforms +deforse +defortify +defossion +defoul +defray +defrayable +defrayal +defrayals +defrayed +defrayer +defrayers +defraying +defrayment +defrays +defraud +defraudation +defrauded +defrauder +defrauders +defrauding +defraudment +defrauds +defreeze +defrication +defrock +defrocked +defrocking +defrocks +defrost +defrosted +defroster +defrosters +defrosting +defrosts +defs +deft +defter +defterdar +deftest +deftly +deftness +deftnesses +defunct +defunction +defunctionalization +defunctionalize +defunctive +defunctness +defuse +defused +defuses +defusing +defusion +defuze +defuzed +defuzes +defuzing +deg +degage +degame +degames +degami +degamis +deganglionate +degarnish +degas +degases +degasify +degasification +degasifier +degass +degassed +degasser +degassers +degasses +degassing +degauss +degaussed +degausser +degausses +degaussing +degelatinize +degelation +degender +degener +degeneracy +degeneracies +degeneralize +degenerate +degenerated +degenerately +degenerateness +degenerates +degenerating +degeneration +degenerationist +degenerations +degenerative +degeneratively +degenerescence +degenerescent +degeneroos +degentilize +degerm +degermed +degerminate +degerminator +degerming +degerms +degged +degger +degging +deglaciation +deglamorization +deglamorize +deglamorized +deglamorizing +deglaze +deglazed +deglazes +deglazing +deglycerin +deglycerine +deglory +deglut +deglute +deglutinate +deglutinated +deglutinating +deglutination +deglutition +deglutitious +deglutitive +deglutitory +degold +degomme +degorder +degorge +degradability +degradable +degradand +degradation +degradational +degradations +degradative +degrade +degraded +degradedly +degradedness +degradement +degrader +degraders +degrades +degrading +degradingly +degradingness +degraduate +degraduation +degrain +degranulation +degras +degratia +degravate +degrease +degreased +degreaser +degreases +degreasing +degree +degreed +degreeing +degreeless +degrees +degreewise +degression +degressive +degressively +degringolade +degu +deguelia +deguelin +degum +degummed +degummer +degumming +degums +degust +degustate +degustation +degusted +degusting +degusts +dehache +dehair +dehairer +dehaites +deheathenize +dehematize +dehepatize +dehgan +dehydrant +dehydrase +dehydratase +dehydrate +dehydrated +dehydrates +dehydrating +dehydration +dehydrator +dehydrators +dehydroascorbic +dehydrochlorinase +dehydrochlorinate +dehydrochlorination +dehydrocorydaline +dehydrocorticosterone +dehydroffroze +dehydroffrozen +dehydrofreeze +dehydrofreezing +dehydrofroze +dehydrofrozen +dehydrogenase +dehydrogenate +dehydrogenated +dehydrogenates +dehydrogenating +dehydrogenation +dehydrogenisation +dehydrogenise +dehydrogenised +dehydrogeniser +dehydrogenising +dehydrogenization +dehydrogenize +dehydrogenized +dehydrogenizer +dehydromucic +dehydroretinol +dehydrosparteine +dehydrotestosterone +dehypnotize +dehypnotized +dehypnotizing +dehisce +dehisced +dehiscence +dehiscent +dehisces +dehiscing +dehistoricize +dehkan +dehnstufe +dehonestate +dehonestation +dehorn +dehorned +dehorner +dehorners +dehorning +dehorns +dehors +dehort +dehortation +dehortative +dehortatory +dehorted +dehorter +dehorting +dehorts +dehull +dehumanisation +dehumanise +dehumanised +dehumanising +dehumanization +dehumanize +dehumanized +dehumanizes +dehumanizing +dehumidify +dehumidification +dehumidified +dehumidifier +dehumidifiers +dehumidifies +dehumidifying +dehusk +dehwar +dei +dey +deia +deicate +deice +deiced +deicer +deicers +deices +deicidal +deicide +deicides +deicing +deictic +deictical +deictically +deidealize +deidesheimer +deify +deific +deifical +deification +deifications +deificatory +deified +deifier +deifiers +deifies +deifying +deiform +deiformity +deign +deigned +deigning +deignous +deigns +deyhouse +deil +deils +deimos +deincrustant +deindividualization +deindividualize +deindividuate +deindustrialization +deindustrialize +deink +deino +deinocephalia +deinoceras +deinodon +deinodontidae +deinos +deinosaur +deinosauria +deinotherium +deinstitutionalization +deinsularize +deynt +deintellectualization +deintellectualize +deionization +deionizations +deionize +deionized +deionizer +deionizes +deionizing +deipara +deiparous +deiphobus +deipnodiplomatic +deipnophobia +deipnosophism +deipnosophist +deipnosophistic +deipotent +deirdre +deirid +deis +deys +deiseal +deyship +deisidaimonia +deisin +deism +deisms +deist +deistic +deistical +deistically +deisticalness +deists +deitate +deity +deities +deityship +deywoman +deixis +deja +deject +dejecta +dejected +dejectedly +dejectedness +dejectile +dejecting +dejection +dejections +dejectly +dejectory +dejects +dejecture +dejerate +dejeration +dejerator +dejeune +dejeuner +dejeuners +dejunkerize +dekabrist +dekadarchy +dekadrachm +dekagram +dekagramme +dekagrams +dekaliter +dekaliters +dekalitre +dekameter +dekameters +dekametre +dekaparsec +dekapode +dekarch +dekare +dekares +dekastere +deke +deked +dekes +deking +dekko +dekkos +dekle +deknight +del +delabialization +delabialize +delabialized +delabializing +delace +delacerate +delacrimation +delactation +delay +delayable +delayage +delayed +delayer +delayers +delayful +delaying +delayingly +delaine +delaines +delays +delaminate +delaminated +delaminating +delamination +delapse +delapsion +delassation +delassement +delate +delated +delater +delates +delating +delatinization +delatinize +delation +delations +delative +delator +delatorian +delators +delaw +delaware +delawarean +delawn +delbert +dele +delead +deleaded +deleading +deleads +deleatur +deleble +delectability +delectable +delectableness +delectably +delectate +delectated +delectating +delectation +delectations +delectible +delectus +deled +deleerit +delegable +delegacy +delegacies +delegalize +delegalized +delegalizing +delegant +delegare +delegate +delegated +delegatee +delegates +delegateship +delegati +delegating +delegation +delegations +delegative +delegator +delegatory +delegatus +deleing +delenda +deleniate +deles +delesseria +delesseriaceae +delesseriaceous +delete +deleted +deleter +deletery +deleterious +deleteriously +deleteriousness +deletes +deleting +deletion +deletions +deletive +deletory +delf +delfs +delft +delfts +delftware +delhi +deli +dely +delia +delian +delibate +deliber +deliberalization +deliberalize +deliberandum +deliberant +deliberate +deliberated +deliberately +deliberateness +deliberates +deliberating +deliberation +deliberations +deliberative +deliberatively +deliberativeness +deliberator +deliberators +delible +delicacy +delicacies +delicat +delicate +delicately +delicateness +delicates +delicatesse +delicatessen +delicatessens +delice +delicense +delichon +deliciae +deliciate +delicioso +delicious +deliciouses +deliciously +deliciousness +delict +delicti +delicto +delicts +delictual +delictum +delictus +delieret +delies +deligated +deligation +delight +delightable +delighted +delightedly +delightedness +delighter +delightful +delightfully +delightfulness +delighting +delightingly +delightless +delights +delightsome +delightsomely +delightsomeness +delignate +delignated +delignification +delilah +deliliria +delim +delime +delimed +delimer +delimes +deliming +delimit +delimitate +delimitated +delimitating +delimitation +delimitations +delimitative +delimited +delimiter +delimiters +delimiting +delimitize +delimitized +delimitizing +delimits +deline +delineable +delineament +delineate +delineated +delineates +delineating +delineation +delineations +delineative +delineator +delineatory +delineature +delineavit +delinition +delinquence +delinquency +delinquencies +delinquent +delinquently +delinquents +delint +delinter +deliquate +deliquesce +deliquesced +deliquescence +deliquescent +deliquesces +deliquescing +deliquiate +deliquiesce +deliquium +deliracy +delirament +delirant +delirate +deliration +delire +deliria +deliriant +deliriate +delirifacient +delirious +deliriously +deliriousness +delirium +deliriums +delirous +delis +delisk +delist +delisted +delisting +delists +delit +delitescence +delitescency +delitescent +delitous +deliver +deliverability +deliverable +deliverables +deliverance +delivered +deliverer +deliverers +deliveress +delivery +deliveries +deliveryman +deliverymen +delivering +deliverly +deliveror +delivers +dell +della +dellaring +dellenite +delly +dellies +dells +delobranchiata +delocalisation +delocalise +delocalised +delocalising +delocalization +delocalize +delocalized +delocalizing +delomorphic +delomorphous +deloo +deloul +delouse +deloused +delouses +delousing +delph +delphacid +delphacidae +delphian +delphically +delphin +delphinapterus +delphine +delphinia +delphinic +delphinid +delphinidae +delphinin +delphinine +delphinite +delphinium +delphiniums +delphinius +delphinoid +delphinoidea +delphinoidine +delphinus +delphocurarine +dels +delsarte +delsartean +delsartian +delta +deltafication +deltahedra +deltahedron +deltaic +deltaite +deltal +deltalike +deltarium +deltas +deltation +delthyria +delthyrial +delthyrium +deltic +deltidia +deltidial +deltidium +deltiology +deltohedra +deltohedron +deltoid +deltoidal +deltoidei +deltoideus +deltoids +delubra +delubrubra +delubrum +deluce +deludable +delude +deluded +deluder +deluders +deludes +deludher +deluding +deludingly +deluge +deluged +deluges +deluging +delumbate +deluminize +delundung +delusion +delusional +delusionary +delusionist +delusions +delusive +delusively +delusiveness +delusory +deluster +delusterant +delustered +delustering +delusters +delustrant +deluxe +delve +delved +delver +delvers +delves +delving +dem +demagnetisable +demagnetisation +demagnetise +demagnetised +demagnetiser +demagnetising +demagnetizable +demagnetization +demagnetize +demagnetized +demagnetizer +demagnetizes +demagnetizing +demagnify +demagnification +demagog +demagogy +demagogic +demagogical +demagogically +demagogies +demagogism +demagogs +demagogue +demagoguery +demagogues +demagoguism +demain +demal +demand +demandable +demandant +demandative +demanded +demander +demanders +demanding +demandingly +demandingness +demands +demanganization +demanganize +demantoid +demarcate +demarcated +demarcates +demarcating +demarcation +demarcations +demarcator +demarcatordemarcators +demarcators +demarcature +demarch +demarche +demarches +demarchy +demaree +demargarinate +demark +demarkation +demarked +demarking +demarks +demasculinisation +demasculinise +demasculinised +demasculinising +demasculinization +demasculinize +demasculinized +demasculinizing +demast +demasted +demasting +demasts +dematerialisation +dematerialise +dematerialised +dematerialising +dematerialization +dematerialize +dematerialized +dematerializing +dematiaceae +dematiaceous +deme +demean +demeaned +demeaning +demeanor +demeanored +demeanors +demeanour +demeans +demegoric +demele +demembration +demembre +demency +dement +dementate +dementation +demented +dementedly +dementedness +dementholize +dementi +dementia +demential +dementias +dementie +dementing +dementis +dements +demeore +demephitize +demerara +demerge +demerit +demerited +demeriting +demeritorious +demeritoriously +demerits +demerol +demersal +demerse +demersed +demersion +demes +demesgne +demesgnes +demesman +demesmerize +demesne +demesnes +demesnial +demetallize +demeter +demethylate +demethylation +demethylchlortetracycline +demetrian +demetricize +demi +demy +demiadult +demiangel +demiassignation +demiatheism +demiatheist +demibarrel +demibastion +demibastioned +demibath +demibeast +demibelt +demibob +demibombard +demibrassart +demibrigade +demibrute +demibuckram +demicadence +demicannon +demicanon +demicanton +demicaponier +demichamfron +demicylinder +demicylindrical +demicircle +demicircular +demicivilized +demicolumn +demicoronal +demicritic +demicuirass +demiculverin +demidandiprat +demideify +demideity +demidevil +demidigested +demidistance +demiditone +demidoctor +demidog +demidolmen +demidome +demieagle +demyelinate +demyelination +demies +demifarthing +demifigure +demiflouncing +demifusion +demigardebras +demigauntlet +demigentleman +demiglace +demiglobe +demigod +demigoddess +demigoddessship +demigods +demigorge +demigrate +demigriffin +demigroat +demihag +demihagbut +demihague +demihake +demihaque +demihearse +demiheavenly +demihigh +demihogshead +demihorse +demihuman +demijambe +demijohn +demijohns +demikindred +demiking +demilance +demilancer +demilawyer +demilegato +demilion +demilitarisation +demilitarise +demilitarised +demilitarising +demilitarization +demilitarize +demilitarized +demilitarizes +demilitarizing +demiliterate +demilune +demilunes +demiluster +demilustre +demiman +demimark +demimentoniere +demimetope +demimillionaire +demimondain +demimondaine +demimondaines +demimonde +demimonk +deminatured +demineralization +demineralize +demineralized +demineralizer +demineralizes +demineralizing +deminude +deminudity +demioctagonal +demioctangular +demiofficial +demiorbit +demiourgoi +demiowl +demiox +demipagan +demiparadise +demiparallel +demipauldron +demipectinate +demipesade +demipike +demipillar +demipique +demiplacate +demiplate +demipomada +demipremise +demipremiss +demipriest +demipronation +demipuppet +demiquaver +demiracle +demiram +demirelief +demirep +demireps +demirevetment +demirhumb +demirilievo +demirobe +demisability +demisable +demisacrilege +demisang +demisangue +demisavage +demiscible +demise +demiseason +demisecond +demised +demisemiquaver +demisemitone +demises +demisheath +demyship +demishirt +demising +demisolde +demisovereign +demisphere +demiss +demission +demissionary +demissive +demissly +demissness +demissory +demist +demystify +demystification +demisuit +demit +demitasse +demitasses +demythify +demythologisation +demythologise +demythologised +demythologising +demythologization +demythologizations +demythologize +demythologized +demythologizer +demythologizes +demythologizing +demitint +demitoilet +demitone +demitrain +demitranslucence +demits +demitted +demitting +demitube +demiturned +demiurge +demiurgeous +demiurges +demiurgic +demiurgical +demiurgically +demiurgism +demiurgos +demiurgus +demivambrace +demivierge +demivirgin +demivoice +demivol +demivolt +demivolte +demivolts +demivotary +demiwivern +demiwolf +demiworld +demnition +demo +demob +demobbed +demobbing +demobilisation +demobilise +demobilised +demobilising +demobilization +demobilizations +demobilize +demobilized +demobilizes +demobilizing +demobs +democracy +democracies +democrat +democratian +democratic +democratical +democratically +democratifiable +democratisation +democratise +democratised +democratising +democratism +democratist +democratization +democratize +democratized +democratizer +democratizes +democratizing +democrats +democraw +democritean +demode +demodectic +demoded +demodex +demodicidae +demodocus +demodulate +demodulated +demodulates +demodulating +demodulation +demodulations +demodulator +demogenic +demogorgon +demographer +demographers +demography +demographic +demographical +demographically +demographics +demographies +demographist +demoid +demoiselle +demoiselles +demolish +demolished +demolisher +demolishes +demolishing +demolishment +demolition +demolitionary +demolitionist +demolitions +demology +demological +demon +demonastery +demoness +demonesses +demonetisation +demonetise +demonetised +demonetising +demonetization +demonetize +demonetized +demonetizes +demonetizing +demoniac +demoniacal +demoniacally +demoniacism +demoniacs +demonial +demonian +demonianism +demoniast +demonic +demonical +demonically +demonifuge +demonio +demonise +demonised +demonises +demonish +demonishness +demonising +demonism +demonisms +demonist +demonists +demonization +demonize +demonized +demonizes +demonizing +demonkind +demonland +demonlike +demonocracy +demonograph +demonographer +demonography +demonographies +demonolater +demonolatry +demonolatrous +demonolatrously +demonologer +demonology +demonologic +demonological +demonologically +demonologies +demonologist +demonomancy +demonomanie +demonomy +demonomist +demonophobia +demonopolize +demonry +demons +demonship +demonstrability +demonstrable +demonstrableness +demonstrably +demonstrance +demonstrandum +demonstrant +demonstratability +demonstratable +demonstrate +demonstrated +demonstratedly +demonstrater +demonstrates +demonstrating +demonstration +demonstrational +demonstrationist +demonstrationists +demonstrations +demonstrative +demonstratively +demonstrativeness +demonstrator +demonstratory +demonstrators +demonstratorship +demophil +demophile +demophilism +demophobe +demophobia +demophon +demophoon +demorage +demoralisation +demoralise +demoralised +demoraliser +demoralising +demoralization +demoralize +demoralized +demoralizer +demoralizers +demoralizes +demoralizing +demoralizingly +demorphinization +demorphism +demos +demoses +demospongiae +demosthenean +demosthenic +demot +demote +demoted +demotes +demothball +demotic +demotics +demoting +demotion +demotions +demotist +demotists +demount +demountability +demountable +demounted +demounting +demounts +demove +dempne +dempster +dempsters +demulce +demulceate +demulcent +demulcents +demulsibility +demulsify +demulsification +demulsified +demulsifier +demulsifying +demulsion +demultiplex +demultiplexed +demultiplexer +demultiplexers +demultiplexes +demultiplexing +demur +demure +demurely +demureness +demurer +demurest +demurity +demurrable +demurrage +demurrages +demurral +demurrals +demurrant +demurred +demurrer +demurrers +demurring +demurringly +demurs +demutization +den +denay +dename +denar +denarcotization +denarcotize +denari +denary +denaries +denarii +denarinarii +denarius +denaro +denasalize +denasalized +denasalizing +denat +denationalisation +denationalise +denationalised +denationalising +denationalization +denationalize +denationalized +denationalizing +denaturalisation +denaturalise +denaturalised +denaturalising +denaturalization +denaturalize +denaturalized +denaturalizing +denaturant +denaturants +denaturate +denaturation +denaturational +denature +denatured +denatures +denaturing +denaturisation +denaturise +denaturised +denaturiser +denaturising +denaturization +denaturize +denaturized +denaturizer +denaturizing +denazify +denazification +denazified +denazifies +denazifying +denda +dendra +dendrachate +dendral +dendraspis +dendraxon +dendric +dendriform +dendrite +dendrites +dendritic +dendritical +dendritically +dendritiform +dendrium +dendrobates +dendrobatinae +dendrobe +dendrobium +dendrocalamus +dendroceratina +dendroceratine +dendrochirota +dendrochronology +dendrochronological +dendrochronologically +dendrochronologist +dendrocygna +dendroclastic +dendrocoela +dendrocoelan +dendrocoele +dendrocoelous +dendrocolaptidae +dendrocolaptine +dendroctonus +dendrodic +dendrodont +dendrodra +dendrodus +dendroeca +dendrogaea +dendrogaean +dendrograph +dendrography +dendrohyrax +dendroica +dendroid +dendroidal +dendroidea +dendrolagus +dendrolater +dendrolatry +dendrolene +dendrolite +dendrology +dendrologic +dendrological +dendrologist +dendrologists +dendrologous +dendromecon +dendrometer +dendron +dendrons +dendrophagous +dendrophil +dendrophile +dendrophilous +dendropogon +dene +deneb +denebola +denegate +denegation +denehole +denervate +denervation +denes +deneutralization +dengue +dengues +deny +deniability +deniable +deniably +denial +denials +denicotine +denicotinize +denicotinized +denicotinizes +denicotinizing +denied +denier +denyer +denierage +denierer +deniers +denies +denigrate +denigrated +denigrates +denigrating +denigration +denigrations +denigrative +denigrator +denigratory +denigrators +denying +denyingly +denim +denims +denis +denitrate +denitrated +denitrating +denitration +denitrator +denitrify +denitrificant +denitrification +denitrificator +denitrified +denitrifier +denitrifying +denitrize +denizate +denization +denize +denizen +denizenation +denizened +denizening +denizenize +denizens +denizenship +denmark +denned +dennet +denning +dennis +dennstaedtia +denom +denominable +denominant +denominate +denominated +denominates +denominating +denomination +denominational +denominationalism +denominationalist +denominationalize +denominationally +denominations +denominative +denominatively +denominator +denominators +denormalized +denotable +denotate +denotation +denotational +denotationally +denotations +denotative +denotatively +denotativeness +denotatum +denote +denoted +denotement +denotes +denoting +denotive +denouement +denouements +denounce +denounced +denouncement +denouncements +denouncer +denouncers +denounces +denouncing +dens +densate +densation +dense +densely +densen +denseness +denser +densest +denshare +densher +denshire +densify +densification +densified +densifier +densifies +densifying +densimeter +densimetry +densimetric +densimetrically +density +densities +densitometer +densitometers +densitometry +densitometric +densus +dent +dentagra +dental +dentale +dentalgia +dentalia +dentaliidae +dentalisation +dentalise +dentalised +dentalising +dentalism +dentality +dentalium +dentaliums +dentalization +dentalize +dentalized +dentalizing +dentally +dentallia +dentalman +dentalmen +dentals +dentaphone +dentary +dentaria +dentaries +dentata +dentate +dentated +dentately +dentation +dentatoangulate +dentatocillitate +dentatocostate +dentatocrenate +dentatoserrate +dentatosetaceous +dentatosinuate +dented +dentel +dentelated +dentellated +dentelle +dentelliere +dentello +dentelure +denter +dentes +dentex +denty +dentical +denticate +denticete +denticeti +denticle +denticles +denticular +denticulate +denticulated +denticulately +denticulation +denticule +dentiferous +dentification +dentiform +dentifrice +dentifrices +dentigerous +dentil +dentilabial +dentilated +dentilation +dentile +dentiled +dentilingual +dentiloguy +dentiloquy +dentiloquist +dentils +dentimeter +dentin +dentinal +dentinalgia +dentinasal +dentine +dentines +denting +dentinitis +dentinoblast +dentinocemental +dentinoid +dentinoma +dentins +dentiparous +dentiphone +dentiroster +dentirostral +dentirostrate +dentirostres +dentiscalp +dentist +dentistic +dentistical +dentistry +dentistries +dentists +dentition +dentoid +dentolabial +dentolingual +dentololabial +dentonasal +dentosurgical +dents +dentulous +dentural +denture +dentures +denuclearization +denuclearize +denuclearized +denuclearizes +denuclearizing +denucleate +denudant +denudate +denudated +denudates +denudating +denudation +denudational +denudations +denudative +denudatory +denude +denuded +denudement +denuder +denuders +denudes +denuding +denumberment +denumerability +denumerable +denumerably +denumeral +denumerant +denumerantive +denumeration +denumerative +denunciable +denunciant +denunciate +denunciated +denunciating +denunciation +denunciations +denunciative +denunciatively +denunciator +denunciatory +denutrition +denver +deobstruct +deobstruent +deoccidentalize +deoculate +deodand +deodands +deodar +deodara +deodaras +deodars +deodate +deodorant +deodorants +deodorisation +deodorise +deodorised +deodoriser +deodorising +deodorization +deodorize +deodorized +deodorizer +deodorizers +deodorizes +deodorizing +deonerate +deontic +deontology +deontological +deontologist +deoperculate +deoppilant +deoppilate +deoppilation +deoppilative +deordination +deorganization +deorganize +deorientalize +deorsum +deorsumvergence +deorsumversion +deorusumduction +deosculate +deossify +deossification +deota +deoxycorticosterone +deoxidant +deoxidate +deoxidation +deoxidative +deoxidator +deoxidisation +deoxidise +deoxidised +deoxidiser +deoxidising +deoxidization +deoxidize +deoxidized +deoxidizer +deoxidizers +deoxidizes +deoxidizing +deoxygenate +deoxygenated +deoxygenating +deoxygenation +deoxygenization +deoxygenize +deoxygenized +deoxygenizing +deoxyribonuclease +deoxyribonucleic +deoxyribonucleoprotein +deoxyribonucleotide +deoxyribose +deozonization +deozonize +deozonizer +dep +depa +depaganize +depaint +depainted +depainting +depaints +depair +depayse +depaysee +depancreatization +depancreatize +depardieu +depark +deparliament +depart +departed +departement +departements +departer +departing +departisanize +departition +department +departmental +departmentalisation +departmentalise +departmentalised +departmentalising +departmentalism +departmentalization +departmentalize +departmentalized +departmentalizes +departmentalizing +departmentally +departmentization +departmentize +departments +departs +departure +departures +depas +depascent +depass +depasturable +depasturage +depasturation +depasture +depastured +depasturing +depatriate +depauperate +depauperation +depauperization +depauperize +depauperized +depe +depeach +depeche +depectible +depeculate +depeinct +depel +depencil +depend +dependability +dependabilities +dependable +dependableness +dependably +dependance +dependancy +dependant +dependantly +dependants +depended +dependence +dependency +dependencies +dependent +dependently +dependents +depender +depending +dependingly +depends +depeople +depeopled +depeopling +deperdit +deperdite +deperditely +deperdition +deperition +deperm +depermed +deperming +deperms +depersonalise +depersonalised +depersonalising +depersonalization +depersonalize +depersonalized +depersonalizes +depersonalizing +depersonize +depertible +depetalize +depeter +depetticoat +dephase +dephased +dephasing +dephycercal +dephilosophize +dephysicalization +dephysicalize +dephlegm +dephlegmate +dephlegmated +dephlegmation +dephlegmatize +dephlegmator +dephlegmatory +dephlegmedness +dephlogisticate +dephlogisticated +dephlogistication +dephosphorization +dephosphorize +depickle +depict +depicted +depicter +depicters +depicting +depiction +depictions +depictive +depictment +depictor +depictors +depicts +depicture +depictured +depicturing +depiedmontize +depigment +depigmentate +depigmentation +depigmentize +depilate +depilated +depilates +depilating +depilation +depilator +depilatory +depilatories +depilitant +depilous +depit +deplace +deplaceable +deplane +deplaned +deplanes +deplaning +deplant +deplantation +deplasmolysis +deplaster +deplenish +depletable +deplete +depleteable +depleted +depletes +deplethoric +depleting +depletion +depletions +depletive +depletory +deploy +deployable +deployed +deploying +deployment +deployments +deploys +deploitation +deplorabilia +deplorability +deplorable +deplorableness +deplorably +deplorate +deploration +deplore +deplored +deploredly +deploredness +deplorer +deplorers +deplores +deploring +deploringly +deplumate +deplumated +deplumation +deplume +deplumed +deplumes +depluming +deplump +depoetize +depoh +depolarisation +depolarise +depolarised +depolariser +depolarising +depolarization +depolarize +depolarized +depolarizer +depolarizers +depolarizes +depolarizing +depolymerization +depolymerize +depolymerized +depolymerizing +depolish +depolished +depolishes +depolishing +depoliticize +depoliticized +depoliticizes +depoliticizing +depone +deponed +deponent +deponents +deponer +depones +deponing +depopularize +depopulate +depopulated +depopulates +depopulating +depopulation +depopulations +depopulative +depopulator +depopulators +deport +deportability +deportable +deportation +deportations +deporte +deported +deportee +deportees +deporter +deporting +deportment +deports +deporture +deposable +deposal +deposals +depose +deposed +deposer +deposers +deposes +deposing +deposit +deposita +depositary +depositaries +depositation +deposited +depositee +depositing +deposition +depositional +depositions +depositive +deposito +depositor +depository +depositories +depositors +deposits +depositum +depositure +deposure +depot +depotentiate +depotentiation +depots +depr +depravate +depravation +deprave +depraved +depravedly +depravedness +depravement +depraver +depravers +depraves +depraving +depravingly +depravity +depravities +deprecable +deprecate +deprecated +deprecates +deprecating +deprecatingly +deprecation +deprecations +deprecative +deprecatively +deprecator +deprecatory +deprecatorily +deprecatoriness +deprecators +depreciable +depreciant +depreciate +depreciated +depreciates +depreciating +depreciatingly +depreciation +depreciations +depreciative +depreciatively +depreciator +depreciatory +depreciatoriness +depreciators +depredable +depredate +depredated +depredating +depredation +depredationist +depredations +depredator +depredatory +depredicate +deprehend +deprehensible +deprehension +depress +depressant +depressanth +depressants +depressed +depresses +depressibility +depressibilities +depressible +depressing +depressingly +depressingness +depression +depressional +depressionary +depressions +depressive +depressively +depressiveness +depressives +depressomotor +depressor +depressors +depressure +depressurize +deprest +depreter +deprevation +depriment +deprint +depriorize +deprisure +deprivable +deprival +deprivals +deprivate +deprivation +deprivations +deprivative +deprive +deprived +deprivement +depriver +deprivers +deprives +depriving +deprocedured +deproceduring +deprogram +deprogrammed +deprogrammer +deprogrammers +deprogramming +deprogrammings +deprograms +deprome +deprostrate +deprotestantize +deprovincialize +depsid +depside +depsides +dept +depth +depthen +depthing +depthless +depthlessness +depthometer +depths +depthways +depthwise +depucel +depudorate +depullulation +depulse +depurant +depurate +depurated +depurates +depurating +depuration +depurative +depurator +depuratory +depure +depurge +depurged +depurging +depurition +depursement +deputable +deputation +deputational +deputationist +deputationize +deputations +deputative +deputatively +deputator +depute +deputed +deputes +deputy +deputies +deputing +deputise +deputised +deputyship +deputising +deputization +deputize +deputized +deputizes +deputizing +dequantitate +dequeen +dequeue +dequeued +dequeues +dequeuing +der +derabbinize +deracialize +deracinate +deracinated +deracinating +deracination +deracine +deradelphus +deradenitis +deradenoncus +derah +deray +deraign +deraigned +deraigning +deraignment +deraigns +derail +derailed +derailer +derailing +derailleur +derailleurs +derailment +derailments +derails +derays +derange +derangeable +deranged +derangement +derangements +deranger +deranges +deranging +derat +derate +derated +derater +derating +deration +derationalization +derationalize +deratization +deratize +deratized +deratizing +derats +deratted +deratting +derbend +derby +derbies +derbylite +derbyshire +derbukka +dere +derealization +derecho +dereference +dereferenced +dereferences +dereferencing +deregister +deregulate +deregulated +deregulates +deregulating +deregulation +deregulationize +deregulations +deregulatory +dereign +dereism +dereistic +dereistically +derek +derelict +derelicta +dereliction +derelictions +derelictly +derelictness +derelicts +dereligion +dereligionize +dereling +derelinquendi +derelinquish +derencephalocele +derencephalus +derepress +derepression +derequisition +derere +deresinate +deresinize +derestrict +derf +derfly +derfness +derham +deric +deride +derided +derider +deriders +derides +deriding +deridingly +deringa +deringer +deringers +deripia +derisible +derision +derisions +derisive +derisively +derisiveness +derisory +deriv +derivability +derivable +derivably +derival +derivant +derivate +derivately +derivates +derivation +derivational +derivationally +derivationist +derivations +derivatist +derivative +derivatively +derivativeness +derivatives +derive +derived +derivedly +derivedness +deriver +derivers +derives +deriving +derk +derm +derma +dermabrasion +dermacentor +dermad +dermahemia +dermal +dermalgia +dermalith +dermamycosis +dermamyiasis +dermanaplasty +dermapostasis +dermaptera +dermapteran +dermapterous +dermas +dermaskeleton +dermasurgery +dermatagra +dermatalgia +dermataneuria +dermatatrophia +dermatauxe +dermathemia +dermatherm +dermatic +dermatine +dermatitis +dermatitises +dermatobia +dermatocele +dermatocellulitis +dermatocyst +dermatoconiosis +dermatocoptes +dermatocoptic +dermatodynia +dermatogen +dermatoglyphic +dermatoglyphics +dermatograph +dermatography +dermatographia +dermatographic +dermatographism +dermatoheteroplasty +dermatoid +dermatolysis +dermatology +dermatologic +dermatological +dermatologies +dermatologist +dermatologists +dermatoma +dermatome +dermatomere +dermatomic +dermatomyces +dermatomycosis +dermatomyoma +dermatomuscular +dermatoneural +dermatoneurology +dermatoneurosis +dermatonosus +dermatopathia +dermatopathic +dermatopathology +dermatopathophobia +dermatophagus +dermatophyte +dermatophytic +dermatophytosis +dermatophobia +dermatophone +dermatophony +dermatoplasm +dermatoplast +dermatoplasty +dermatoplastic +dermatopnagic +dermatopsy +dermatoptera +dermatoptic +dermatorrhagia +dermatorrhea +dermatorrhoea +dermatosclerosis +dermatoscopy +dermatoses +dermatosiophobia +dermatosis +dermatoskeleton +dermatotherapy +dermatotome +dermatotomy +dermatotropic +dermatoxerasia +dermatozoon +dermatozoonosis +dermatozzoa +dermatrophy +dermatrophia +dermatropic +dermenchysis +dermestes +dermestid +dermestidae +dermestoid +dermic +dermis +dermises +dermitis +dermititis +dermoblast +dermobranchia +dermobranchiata +dermobranchiate +dermochelys +dermochrome +dermococcus +dermogastric +dermography +dermographia +dermographic +dermographism +dermohemal +dermohemia +dermohumeral +dermoid +dermoidal +dermoidectomy +dermol +dermolysis +dermomycosis +dermomuscular +dermonecrotic +dermoneural +dermoneurosis +dermonosology +dermoosseous +dermoossification +dermopathy +dermopathic +dermophyte +dermophytic +dermophlebitis +dermophobe +dermoplasty +dermoptera +dermopteran +dermopterous +dermoreaction +dermorhynchi +dermorhynchous +dermosclerite +dermosynovitis +dermoskeletal +dermoskeleton +dermostenosis +dermostosis +dermotherm +dermotropic +dermovaccine +derms +dermutation +dern +derned +derner +dernful +dernier +derning +dernly +dero +derobe +derodidymus +derog +derogate +derogated +derogately +derogates +derogating +derogation +derogations +derogative +derogatively +derogator +derogatory +derogatorily +derogatoriness +deromanticize +derotrema +derotremata +derotremate +derotrematous +derotreme +derout +derri +derry +derrick +derricking +derrickman +derrickmen +derricks +derrid +derride +derriere +derrieres +derries +derringer +derringers +derrire +derris +derrises +derth +dertra +dertrotheca +dertrum +deruinate +deruralize +derust +derv +derve +dervish +dervishes +dervishhood +dervishism +dervishlike +des +desaccharification +desacralization +desacralize +desagrement +desalinate +desalinated +desalinates +desalinating +desalination +desalinator +desalinization +desalinize +desalinized +desalinizes +desalinizing +desalt +desalted +desalter +desalters +desalting +desalts +desamidase +desamidization +desaminase +desand +desanded +desanding +desands +desaturate +desaturation +desaurin +desaurine +desc +descale +descaled +descaling +descamisado +descamisados +descant +descanted +descanter +descanting +descantist +descants +descartes +descend +descendability +descendable +descendance +descendant +descendants +descended +descendence +descendent +descendental +descendentalism +descendentalist +descendentalistic +descendents +descender +descenders +descendibility +descendible +descending +descendingly +descends +descension +descensional +descensionist +descensive +descensory +descensories +descent +descents +deschampsia +deschool +descloizite +descort +descry +descrial +describability +describable +describably +describe +described +describent +describer +describers +describes +describing +descried +descrier +descriers +descries +descrying +descript +description +descriptionist +descriptionless +descriptions +descriptive +descriptively +descriptiveness +descriptives +descriptivism +descriptor +descriptory +descriptors +descrive +descure +desdemona +deseam +deseasonalize +desecate +desecrate +desecrated +desecrater +desecrates +desecrating +desecration +desecrations +desecrator +desectionalize +deseed +desegmentation +desegmented +desegregate +desegregated +desegregates +desegregating +desegregation +deselect +deselected +deselecting +deselects +desemer +desensitization +desensitizations +desensitize +desensitized +desensitizer +desensitizers +desensitizes +desensitizing +desentimentalize +deseret +desert +deserted +desertedly +desertedness +deserter +deserters +desertful +desertfully +desertic +deserticolous +desertification +deserting +desertion +desertions +desertism +desertless +desertlessly +desertlike +desertness +desertress +desertrice +deserts +desertward +deserve +deserved +deservedly +deservedness +deserveless +deserver +deservers +deserves +deserving +deservingly +deservingness +deservings +desesperance +desex +desexed +desexes +desexing +desexualization +desexualize +desexualized +desexualizing +deshabille +desi +desiatin +desyatin +desicate +desiccant +desiccants +desiccate +desiccated +desiccates +desiccating +desiccation +desiccations +desiccative +desiccator +desiccatory +desiccators +desiderable +desiderant +desiderata +desiderate +desiderated +desiderating +desideration +desiderative +desideratum +desiderium +desiderta +desidiose +desidious +desight +desightment +design +designable +designado +designate +designated +designates +designating +designation +designations +designative +designator +designatory +designators +designatum +designed +designedly +designedness +designee +designees +designer +designers +designful +designfully +designfulness +designing +designingly +designless +designlessly +designlessness +designment +designs +desyl +desilicate +desilicated +desilicating +desilicify +desilicification +desilicified +desiliconization +desiliconize +desilt +desilver +desilvered +desilvering +desilverization +desilverize +desilverized +desilverizer +desilverizing +desilvers +desynapsis +desynaptic +desynchronize +desynchronizing +desinence +desinent +desinential +desynonymization +desynonymize +desiodothyroxine +desipience +desipiency +desipient +desipramine +desirability +desirable +desirableness +desirably +desire +desireable +desired +desiredly +desiredness +desireful +desirefulness +desireless +desirelessness +desirer +desirers +desires +desiring +desiringly +desirous +desirously +desirousness +desist +desistance +desisted +desistence +desisting +desistive +desists +desition +desitive +desize +desk +deskbound +deskill +desklike +deskman +deskmen +desks +desktop +deslime +desma +desmachymatous +desmachyme +desmacyte +desman +desmans +desmanthus +desmarestia +desmarestiaceae +desmarestiaceous +desmatippus +desmectasia +desmepithelium +desmic +desmid +desmidiaceae +desmidiaceous +desmidiales +desmidian +desmidiology +desmidiologist +desmids +desmine +desmitis +desmocyte +desmocytoma +desmodactyli +desmodynia +desmodium +desmodont +desmodontidae +desmodus +desmogen +desmogenous +desmognathae +desmognathism +desmognathous +desmography +desmohemoblast +desmoid +desmoids +desmolase +desmology +desmoma +desmomyaria +desmon +desmoncus +desmoneme +desmoneoplasm +desmonosology +desmopathy +desmopathology +desmopathologist +desmopelmous +desmopexia +desmopyknosis +desmorrhexis +desmoscolecidae +desmoscolex +desmose +desmosis +desmosite +desmosome +desmothoraca +desmotomy +desmotrope +desmotropy +desmotropic +desmotropism +desobligeant +desocialization +desocialize +desoeuvre +desolate +desolated +desolately +desolateness +desolater +desolates +desolating +desolatingly +desolation +desolations +desolative +desolator +desole +desonation +desophisticate +desophistication +desorb +desorbed +desorbing +desorbs +desorption +desoxalate +desoxalic +desoxyanisoin +desoxybenzoin +desoxycinchonine +desoxycorticosterone +desoxyephedrine +desoxymorphine +desoxyribonuclease +desoxyribonucleic +desoxyribonucleoprotein +desoxyribose +despair +despaired +despairer +despairful +despairfully +despairfulness +despairing +despairingly +despairingness +despairs +desparple +despatch +despatched +despatcher +despatchers +despatches +despatching +despeche +despecialization +despecialize +despecificate +despecification +despect +despectant +despeed +despend +desperacy +desperado +desperadoes +desperadoism +desperados +desperance +desperate +desperately +desperateness +desperation +despert +despicability +despicable +despicableness +despicably +despiciency +despin +despiritualization +despiritualize +despisable +despisableness +despisal +despise +despised +despisedness +despisement +despiser +despisers +despises +despising +despisingly +despite +despited +despiteful +despitefully +despitefulness +despiteous +despiteously +despites +despiting +despitous +despoil +despoiled +despoiler +despoilers +despoiling +despoilment +despoilments +despoils +despoliation +despoliations +despond +desponded +despondence +despondency +despondencies +despondent +despondently +despondentness +desponder +desponding +despondingly +desponds +desponsage +desponsate +desponsories +despose +despot +despotat +despotes +despotic +despotical +despotically +despoticalness +despoticly +despotism +despotisms +despotist +despotize +despots +despouse +despraise +despumate +despumated +despumating +despumation +despume +desquamate +desquamated +desquamating +desquamation +desquamative +desquamatory +desray +dess +dessa +dessert +desserts +dessertspoon +dessertspoonful +dessertspoonfuls +dessiatine +dessicate +dessil +dessous +dessus +destabilization +destabilize +destabilized +destabilizing +destain +destained +destaining +destains +destalinization +destalinize +destandardize +destemper +desterilization +desterilize +desterilized +desterilizing +destigmatization +destigmatize +destigmatizing +destin +destinal +destinate +destination +destinations +destine +destined +destines +destinezite +destiny +destinies +destining +destinism +destinist +destituent +destitute +destituted +destitutely +destituteness +destituting +destitution +desto +destool +destoolment +destour +destrer +destress +destressed +destry +destrier +destriers +destroy +destroyable +destroyed +destroyer +destroyers +destroying +destroyingly +destroys +destruct +destructed +destructibility +destructible +destructibleness +destructing +destruction +destructional +destructionism +destructionist +destructions +destructive +destructively +destructiveness +destructivism +destructivity +destructor +destructory +destructors +destructs +destructuralize +destrudo +destuff +destuffing +destuffs +desubstantialize +desubstantiate +desucration +desudation +desuete +desuetude +desuetudes +desugar +desugared +desugaring +desugarize +desugars +desulfovibrio +desulfur +desulfurate +desulfurated +desulfurating +desulfuration +desulfured +desulfuring +desulfurisation +desulfurise +desulfurised +desulfuriser +desulfurising +desulfurization +desulfurize +desulfurized +desulfurizer +desulfurizing +desulfurs +desulphur +desulphurate +desulphurated +desulphurating +desulphuration +desulphuret +desulphurise +desulphurised +desulphurising +desulphurization +desulphurize +desulphurized +desulphurizer +desulphurizing +desultor +desultory +desultorily +desultoriness +desultorious +desume +desuperheater +desuvre +det +detach +detachability +detachable +detachableness +detachably +detache +detached +detachedly +detachedness +detacher +detachers +detaches +detaching +detachment +detachments +detachs +detacwable +detail +detailed +detailedly +detailedness +detailer +detailers +detailing +detailism +detailist +details +detain +detainable +detainal +detained +detainee +detainees +detainer +detainers +detaining +detainingly +detainment +detains +detant +detar +detassel +detat +detax +detd +detect +detectability +detectable +detectably +detectaphone +detected +detecter +detecters +detectible +detecting +detection +detections +detective +detectives +detectivism +detector +detectors +detects +detenant +detenebrate +detent +detente +detentes +detention +detentive +detents +detenu +detenue +detenues +detenus +deter +deterge +deterged +detergence +detergency +detergent +detergents +deterger +detergers +deterges +detergible +deterging +detering +deteriorate +deteriorated +deteriorates +deteriorating +deterioration +deteriorationist +deteriorations +deteriorative +deteriorator +deteriorism +deteriority +determ +determa +determent +determents +determinability +determinable +determinableness +determinably +determinacy +determinant +determinantal +determinants +determinate +determinated +determinately +determinateness +determinating +determination +determinations +determinative +determinatively +determinativeness +determinator +determine +determined +determinedly +determinedness +determiner +determiners +determines +determining +determinism +determinist +deterministic +deterministically +determinists +determinoid +deterrability +deterrable +deterration +deterred +deterrence +deterrent +deterrently +deterrents +deterrer +deterrers +deterring +deters +detersion +detersive +detersively +detersiveness +detest +detestability +detestable +detestableness +detestably +detestation +detestations +detested +detester +detesters +detesting +detests +dethyroidism +dethronable +dethrone +dethroned +dethronement +dethronements +dethroner +dethrones +dethroning +deti +detick +deticked +deticker +detickers +deticking +deticks +detin +detinet +detinue +detinues +detinuit +detn +detonability +detonable +detonatability +detonatable +detonate +detonated +detonates +detonating +detonation +detonational +detonations +detonative +detonator +detonators +detonize +detorsion +detort +detour +detoured +detouring +detournement +detours +detoxicant +detoxicate +detoxicated +detoxicating +detoxication +detoxicator +detoxify +detoxification +detoxified +detoxifier +detoxifies +detoxifying +detract +detracted +detracter +detracting +detractingly +detraction +detractions +detractive +detractively +detractiveness +detractor +detractory +detractors +detractress +detracts +detray +detrain +detrained +detraining +detrainment +detrains +detraque +detrect +detrench +detribalization +detribalize +detribalized +detribalizing +detriment +detrimental +detrimentality +detrimentally +detrimentalness +detriments +detrital +detrited +detrition +detritivorous +detritus +detrivorous +detroit +detroiter +detruck +detrude +detruded +detrudes +detruding +detruncate +detruncated +detruncating +detruncation +detrusion +detrusive +detrusor +detruss +dette +detubation +detumescence +detumescent +detune +detuned +detuning +detur +deturb +deturn +deturpate +deucalion +deuce +deuced +deucedly +deuces +deucing +deul +deunam +deuniting +deurbanize +deurwaarder +deus +deusan +deutencephalic +deutencephalon +deuteragonist +deuteranomal +deuteranomaly +deuteranomalous +deuteranope +deuteranopia +deuteranopic +deuterate +deuteration +deuteric +deuteride +deuterium +deuteroalbumose +deuterocanonical +deuterocasease +deuterocone +deuteroconid +deuterodome +deuteroelastose +deuterofibrinose +deuterogamy +deuterogamist +deuterogelatose +deuterogenesis +deuterogenic +deuteroglobulose +deuteromycetes +deuteromyosinose +deuteromorphic +deuteron +deuteronomy +deuteronomic +deuteronomical +deuteronomist +deuteronomistic +deuterons +deuteropathy +deuteropathic +deuteroplasm +deuteroprism +deuteroproteose +deuteroscopy +deuteroscopic +deuterosy +deuterostoma +deuterostomata +deuterostomatous +deuterostome +deuterotype +deuterotoky +deuterotokous +deuterovitellose +deuterozooid +deutobromide +deutocarbonate +deutochloride +deutomala +deutomalal +deutomalar +deutomerite +deuton +deutonephron +deutonymph +deutonymphal +deutoplasm +deutoplasmic +deutoplastic +deutoscolex +deutovum +deutoxide +deutsche +deutschemark +deutschland +deutzia +deutzias +deux +deuzan +dev +deva +devachan +devadasi +deval +devall +devaloka +devalorize +devaluate +devaluated +devaluates +devaluating +devaluation +devaluations +devalue +devalued +devalues +devaluing +devanagari +devance +devant +devaporate +devaporation +devaraja +devarshi +devas +devast +devastate +devastated +devastates +devastating +devastatingly +devastation +devastations +devastative +devastator +devastators +devastavit +devaster +devata +devaul +devaunt +devchar +deve +devein +deveined +deveining +deveins +devel +develed +develin +develing +develop +developability +developable +develope +developed +developedness +developement +developer +developers +developes +developing +developist +development +developmental +developmentalist +developmentally +developmentary +developmentarian +developmentist +developments +developoid +developpe +developpes +develops +devels +devenustate +deverbative +devertebrated +devest +devested +devesting +devests +devex +devexity +devi +deviability +deviable +deviance +deviances +deviancy +deviancies +deviant +deviants +deviascope +deviate +deviated +deviately +deviates +deviating +deviation +deviational +deviationism +deviationist +deviations +deviative +deviator +deviatory +deviators +device +deviceful +devicefully +devicefulness +devices +devide +devil +devilbird +devildom +deviled +deviler +deviless +devilet +devilfish +devilfishes +devilhood +devily +deviling +devilish +devilishly +devilishness +devilism +devility +devilize +devilized +devilizing +devilkin +devilkins +devilled +devillike +devilling +devilman +devilment +devilments +devilmonger +devilry +devilries +devils +devilship +deviltry +deviltries +devilward +devilwise +devilwood +devinct +devious +deviously +deviousness +devirginate +devirgination +devirginator +devirilize +devisability +devisable +devisal +devisals +deviscerate +devisceration +devise +devised +devisee +devisees +deviser +devisers +devises +devising +devisings +devisor +devisors +devitalisation +devitalise +devitalised +devitalising +devitalization +devitalize +devitalized +devitalizes +devitalizing +devitaminize +devitation +devitrify +devitrifiable +devitrification +devitrified +devitrifying +devocalisation +devocalise +devocalised +devocalising +devocalization +devocalize +devocalized +devocalizing +devocate +devocation +devoice +devoiced +devoices +devoicing +devoid +devoir +devoirs +devolatilisation +devolatilise +devolatilised +devolatilising +devolatilization +devolatilize +devolatilized +devolatilizing +devolute +devolution +devolutionary +devolutionist +devolutive +devolve +devolved +devolvement +devolvements +devolves +devolving +devon +devonian +devonic +devonite +devonport +devons +devonshire +devoration +devorative +devot +devota +devotary +devote +devoted +devotedly +devotedness +devotee +devoteeism +devotees +devotement +devoter +devotes +devoting +devotion +devotional +devotionalism +devotionalist +devotionality +devotionally +devotionalness +devotionary +devotionate +devotionist +devotions +devoto +devour +devourable +devoured +devourer +devourers +devouress +devouring +devouringly +devouringness +devourment +devours +devout +devoutful +devoutless +devoutlessly +devoutlessness +devoutly +devoutness +devove +devow +devs +devulcanization +devulcanize +devulgarize +devvel +devwsor +dew +dewal +dewan +dewanee +dewani +dewanny +dewans +dewanship +dewar +dewata +dewater +dewatered +dewaterer +dewatering +dewaters +dewax +dewaxed +dewaxes +dewaxing +dewbeam +dewberry +dewberries +dewcap +dewclaw +dewclawed +dewclaws +dewcup +dewdamp +dewdrop +dewdropper +dewdrops +dewed +dewey +deweylite +dewer +dewfall +dewfalls +dewflower +dewy +dewier +dewiest +dewily +dewiness +dewinesses +dewing +dewitt +dewlap +dewlapped +dewlaps +dewless +dewlight +dewlike +dewool +dewooled +dewooling +dewools +deworm +dewormed +deworming +deworms +dewret +dewrot +dews +dewtry +dewworm +dex +dexamethasone +dexes +dexies +dexiocardia +dexiotrope +dexiotropic +dexiotropism +dexiotropous +dexter +dexterical +dexterity +dexterous +dexterously +dexterousness +dextorsal +dextrad +dextral +dextrality +dextrally +dextran +dextranase +dextrane +dextrans +dextraural +dextrer +dextrin +dextrinase +dextrinate +dextrine +dextrines +dextrinize +dextrinous +dextrins +dextro +dextroamphetamine +dextroaural +dextrocardia +dextrocardial +dextrocerebral +dextrocular +dextrocularity +dextroduction +dextrogyrate +dextrogyration +dextrogyratory +dextrogyre +dextrogyrous +dextroglucose +dextrolactic +dextrolimonene +dextromanual +dextropedal +dextropinene +dextrorotary +dextrorotatary +dextrorotation +dextrorotatory +dextrorsal +dextrorse +dextrorsely +dextrosazone +dextrose +dextroses +dextrosinistral +dextrosinistrally +dextrosuria +dextrotartaric +dextrotropic +dextrotropous +dextrous +dextrously +dextrousness +dextroversion +dezaley +dezymotize +dezinc +dezincation +dezinced +dezincify +dezincification +dezincified +dezincifying +dezincing +dezincked +dezincking +dezincs +dezinkify +dfault +dft +dg +dgag +dghaisa +dha +dhabb +dhai +dhak +dhaks +dhal +dhaman +dhamma +dhamnoo +dhan +dhangar +dhanuk +dhanush +dhanvantari +dharana +dharani +dharma +dharmakaya +dharmas +dharmashastra +dharmasmriti +dharmasutra +dharmic +dharmsala +dharna +dharnas +dhaura +dhauri +dhava +dhaw +dheneb +dheri +dhyal +dhyana +dhikr +dhikrs +dhobee +dhobey +dhobi +dhoby +dhobie +dhobies +dhobis +dhole +dholes +dhoney +dhoni +dhooley +dhooly +dhoolies +dhoon +dhoora +dhooras +dhooti +dhootie +dhooties +dhootis +dhotee +dhoti +dhoty +dhotis +dhoul +dhourra +dhourras +dhow +dhows +dhritarashtra +dhu +dhunchee +dhunchi +dhundia +dhurna +dhurnas +dhurra +dhurry +dhurrie +dhuti +dhutis +di +dy +dia +diabantite +diabase +diabases +diabasic +diabaterial +diabetes +diabetic +diabetical +diabetics +diabetogenic +diabetogenous +diabetometer +diabetophobia +diable +dyable +diablene +diablery +diablerie +diableries +diablo +diablotin +diabolarch +diabolarchy +diabolatry +diabolepsy +diaboleptic +diabolic +diabolical +diabolically +diabolicalness +diabolify +diabolification +diabolifuge +diabolisation +diabolise +diabolised +diabolising +diabolism +diabolist +diabolization +diabolize +diabolized +diabolizing +diabolo +diabology +diabological +diabolology +diabolonian +diabolos +diabolus +diabrosis +diabrotic +diabrotica +diacanthous +diacatholicon +diacaustic +diacetamide +diacetate +diacetic +diacetyl +diacetylene +diacetylmorphine +diacetyls +diacetin +diacetine +diacetonuria +diaceturia +diachaenium +diachylon +diachylum +diachyma +diachoresis +diachoretic +diachrony +diachronic +diachronically +diachronicness +diacid +diacidic +diacids +diacipiperazine +diaclase +diaclasis +diaclasite +diaclastic +diacle +diaclinal +diacoca +diacodion +diacodium +diacoele +diacoelia +diacoelosis +diaconal +diaconate +diaconia +diaconica +diaconicon +diaconicum +diaconus +diacope +diacoustics +diacranterian +diacranteric +diacrisis +diacritic +diacritical +diacritically +diacritics +diacromyodi +diacromyodian +diact +diactin +diactinal +diactine +diactinic +diactinism +diaculum +dyad +diadelphia +diadelphian +diadelphic +diadelphous +diadem +diadema +diadematoida +diademed +diademing +diadems +diaderm +diadermic +diadic +dyadic +dyadically +dyadics +diadkokinesia +diadoche +diadochi +diadochy +diadochian +diadochic +diadochite +diadochokinesia +diadochokinesis +diadochokinetic +diadokokinesis +diadoumenos +diadrom +diadrome +diadromous +dyads +diadumenus +diaene +diaereses +diaeresis +diaeretic +diaetetae +diag +diagenesis +diagenetic +diagenetically +diageotropy +diageotropic +diageotropism +diaglyph +diaglyphic +diaglyptic +diagnosable +diagnose +diagnoseable +diagnosed +diagnoses +diagnosing +diagnosis +diagnostic +diagnostical +diagnostically +diagnosticate +diagnosticated +diagnosticating +diagnostication +diagnostician +diagnosticians +diagnostics +diagometer +diagonal +diagonality +diagonalizable +diagonalization +diagonalize +diagonally +diagonals +diagonalwise +diagonial +diagonic +diagram +diagramed +diagraming +diagrammable +diagrammatic +diagrammatical +diagrammatically +diagrammatician +diagrammatize +diagrammed +diagrammer +diagrammers +diagrammeter +diagramming +diagrammitically +diagrams +diagraph +diagraphic +diagraphical +diagraphics +diagraphs +diagredium +diagrydium +diaguitas +diaguite +diaheliotropic +diaheliotropically +diaheliotropism +dyak +diaka +diakineses +diakinesis +diakinetic +dyakisdodecahedron +dyakish +diakonika +diakonikon +dial +dialcohol +dialdehyde +dialect +dialectal +dialectalize +dialectally +dialectic +dialectical +dialectically +dialectician +dialecticism +dialecticize +dialectics +dialectologer +dialectology +dialectologic +dialectological +dialectologically +dialectologies +dialectologist +dialector +dialects +dialed +dialer +dialers +dialycarpous +dialin +dialiness +dialing +dialings +dialypetalae +dialypetalous +dialyphyllous +dialysability +dialysable +dialysate +dialysation +dialyse +dialysed +dialysepalous +dialyser +dialysers +dialyses +dialysing +dialysis +dialist +dialystaminous +dialystely +dialystelic +dialister +dialists +dialytic +dialytically +dialyzability +dialyzable +dialyzate +dialyzation +dialyzator +dialyze +dialyzed +dialyzer +dialyzers +dialyzes +dialyzing +dialkyl +dialkylamine +dialkylic +diallage +diallages +diallagic +diallagite +diallagoid +dialled +diallel +diallela +dialleli +diallelon +diallelus +dialler +diallers +diallyl +dialling +diallings +diallist +diallists +dialog +dialoger +dialogers +dialogged +dialogging +dialogic +dialogical +dialogically +dialogised +dialogising +dialogism +dialogist +dialogistic +dialogistical +dialogistically +dialogite +dialogize +dialogized +dialogizing +dialogs +dialogue +dialogued +dialoguer +dialogues +dialoguing +dialonian +dials +dialup +dialuric +diam +diamagnet +diamagnetic +diamagnetically +diamagnetism +diamagnetize +diamagnetometer +diamant +diamante +diamantiferous +diamantine +diamantoid +diamat +diamb +diamber +diambic +diamegnetism +diamesogamous +diameter +diameters +diametral +diametrally +diametric +diametrical +diametrically +diamicton +diamide +diamides +diamido +diamidogen +diamyl +diamylene +diamylose +diamin +diamine +diamines +diaminogen +diaminogene +diamins +diammine +diamminobromide +diamminonitrate +diammonium +diamond +diamondback +diamondbacked +diamondbacks +diamonded +diamondiferous +diamonding +diamondize +diamondized +diamondizing +diamondlike +diamonds +diamondwise +diamondwork +diamorphine +diamorphosis +dian +diana +diancecht +diander +diandria +diandrian +diandrous +diane +dianetics +dianil +dianilid +dianilide +dianisidin +dianisidine +dianite +dianodal +dianoetic +dianoetical +dianoetically +dianoia +dianoialogy +dianthaceae +dianthera +dianthus +dianthuses +diantre +diapalma +diapase +diapasm +diapason +diapasonal +diapasons +diapause +diapaused +diapauses +diapausing +diapedeses +diapedesis +diapedetic +diapensia +diapensiaceae +diapensiaceous +diapente +diaper +diapered +diapery +diapering +diapers +diaphane +diaphaneity +diaphany +diaphanie +diaphanometer +diaphanometry +diaphanometric +diaphanoscope +diaphanoscopy +diaphanotype +diaphanous +diaphanously +diaphanousness +diaphemetric +diaphyseal +diaphyses +diaphysial +diaphysis +diaphone +diaphones +diaphony +diaphonia +diaphonic +diaphonical +diaphonies +diaphorase +diaphoreses +diaphoresis +diaphoretic +diaphoretical +diaphoretics +diaphorite +diaphote +diaphototropic +diaphototropism +diaphragm +diaphragmal +diaphragmatic +diaphragmatically +diaphragmed +diaphragming +diaphragms +diaphtherin +diapyesis +diapyetic +diapir +diapiric +diapirs +diaplases +diaplasis +diaplasma +diaplex +diaplexal +diaplexus +diapnoe +diapnoic +diapnotic +diapophyses +diapophysial +diapophysis +diaporesis +diaporthe +diapositive +diapsid +diapsida +diapsidan +diarch +diarchy +dyarchy +diarchial +diarchic +dyarchic +dyarchical +diarchies +dyarchies +diarhemia +diary +diarial +diarian +diaries +diarist +diaristic +diarists +diarize +diarrhea +diarrheal +diarrheas +diarrheic +diarrhetic +diarrhoea +diarrhoeal +diarrhoeic +diarrhoetic +diarsenide +diarthric +diarthrodial +diarthroses +diarthrosis +diarticular +dias +dyas +diaschisis +diaschisma +diaschistic +diascia +diascope +diascopy +diascord +diascordium +diasene +diasynthesis +diasyrm +diasystem +diaskeuasis +diaskeuast +diasper +diaspidinae +diaspidine +diaspinae +diaspine +diaspirin +diaspora +diasporas +diaspore +diaspores +dyassic +diastalses +diastalsis +diastaltic +diastase +diastases +diastasic +diastasimetry +diastasis +diastataxy +diastataxic +diastatic +diastatically +diastem +diastema +diastemata +diastematic +diastematomyelia +diaster +dyaster +diastereoisomer +diastereoisomeric +diastereoisomerism +diastereomer +diasters +diastyle +diastimeter +diastole +diastoles +diastolic +diastomatic +diastral +diastrophe +diastrophy +diastrophic +diastrophically +diastrophism +diatessaron +diatesseron +diathermacy +diathermal +diathermance +diathermancy +diathermaneity +diathermanous +diathermy +diathermia +diathermic +diathermies +diathermize +diathermometer +diathermotherapy +diathermous +diatheses +diathesic +diathesis +diathetic +diatom +diatoma +diatomaceae +diatomacean +diatomaceoid +diatomaceous +diatomales +diatomeae +diatomean +diatomic +diatomicity +diatomiferous +diatomin +diatomine +diatomist +diatomite +diatomous +diatoms +diatonic +diatonical +diatonically +diatonicism +diatonous +diatoric +diatreme +diatribe +diatribes +diatribist +diatryma +diatrymiformes +diatropic +diatropism +diau +diauli +diaulic +diaulos +dyaus +diavolo +diaxial +diaxon +diaxone +diaxonic +diazenithal +diazepam +diazepams +diazeuctic +diazeutic +diazeuxis +diazid +diazide +diazin +diazine +diazines +diazins +diazo +diazoalkane +diazoamin +diazoamine +diazoamino +diazoaminobenzene +diazoanhydride +diazoate +diazobenzene +diazohydroxide +diazoic +diazoimide +diazoimido +diazole +diazoles +diazoma +diazomethane +diazonium +diazotate +diazotic +diazotype +diazotizability +diazotizable +diazotization +diazotize +diazotized +diazotizing +dib +dibase +dibasic +dibasicity +dibatag +dibatis +dibbed +dibber +dibbers +dibbing +dibble +dibbled +dibbler +dibblers +dibbles +dibbling +dibbuk +dybbuk +dibbukim +dybbukim +dibbuks +dybbuks +dibenzyl +dibenzoyl +dibenzophenazine +dibenzopyrrole +dibhole +diblastula +diborate +dibothriocephalus +dibrach +dibranch +dibranchia +dibranchiata +dibranchiate +dibranchious +dibrom +dibromid +dibromide +dibromoacetaldehyde +dibromobenzene +dibs +dibstone +dibstones +dibucaine +dibutyl +dibutyrate +dibutyrin +dicacity +dicacodyl +dicaeidae +dicaeology +dicalcic +dicalcium +dicarbonate +dicarbonic +dicarboxylate +dicarboxylic +dicaryon +dicaryophase +dicaryophyte +dicaryotic +dicarpellary +dicast +dicastery +dicasteries +dicastic +dicasts +dicatalectic +dicatalexis +diccon +dice +dyce +diceboard +dicebox +dicecup +diced +dicey +dicellate +diceman +dicentra +dicentras +dicentrin +dicentrine +dicephalism +dicephalous +dicephalus +diceplay +dicer +diceras +diceratidae +dicerion +dicerous +dicers +dices +dicetyl +dich +dichapetalaceae +dichapetalum +dichas +dichasia +dichasial +dichasium +dichastasis +dichastic +dichelyma +dichlamydeous +dichlone +dichloramin +dichloramine +dichlorhydrin +dichloride +dichloroacetic +dichlorobenzene +dichlorodifluoromethane +dichlorodiphenyltrichloroethane +dichlorohydrin +dichloromethane +dichlorvos +dichocarpism +dichocarpous +dichogamy +dichogamic +dichogamous +dichondra +dichondraceae +dichopodial +dichoptic +dichord +dichoree +dichorisandra +dichotic +dichotically +dichotomal +dichotomy +dichotomic +dichotomically +dichotomies +dichotomisation +dichotomise +dichotomised +dichotomising +dichotomist +dichotomistic +dichotomization +dichotomize +dichotomized +dichotomizing +dichotomous +dichotomously +dichotomousness +dichotriaene +dichroic +dichroiscope +dichroiscopic +dichroism +dichroite +dichroitic +dichromasy +dichromasia +dichromat +dichromate +dichromatic +dichromaticism +dichromatism +dichromatopsia +dichromic +dichromism +dichronous +dichrooscope +dichrooscopic +dichroous +dichroscope +dichroscopic +dicht +dichter +dicyan +dicyandiamide +dicyanid +dicyanide +dicyanin +dicyanine +dicyanodiamide +dicyanogen +dicycle +dicycly +dicyclic +dicyclica +dicyclies +dicyclist +dicyclopentadienyliron +dicyema +dicyemata +dicyemid +dicyemida +dicyemidae +dicier +diciest +dicing +dicynodon +dicynodont +dicynodontia +dicynodontidae +dick +dickcissel +dickey +dickeybird +dickeys +dickens +dickenses +dickensian +dickensiana +dicker +dickered +dickering +dickers +dicky +dickybird +dickie +dickies +dickinsonite +dickite +dicks +dicksonia +dickty +diclesium +diclidantheraceae +dicliny +diclinic +diclinies +diclinism +diclinous +diclytra +dicoccous +dicodeine +dicoelious +dicoelous +dicolic +dicolon +dicondylian +dicophane +dicot +dicotyl +dicotyledon +dicotyledonary +dicotyledones +dicotyledonous +dicotyledons +dicotyles +dicotylidae +dicotylous +dicotyls +dicots +dicoumarin +dicoumarol +dicranaceae +dicranaceous +dicranoid +dicranterian +dicranum +dicrostonyx +dicrotal +dicrotic +dicrotism +dicrotous +dicruridae +dict +dicta +dictaen +dictagraph +dictamen +dictamina +dictamnus +dictaphone +dictaphones +dictate +dictated +dictates +dictating +dictatingly +dictation +dictational +dictations +dictative +dictator +dictatory +dictatorial +dictatorialism +dictatorially +dictatorialness +dictators +dictatorship +dictatorships +dictatress +dictatrix +dictature +dictery +dicty +dictic +dictynid +dictynidae +dictyoceratina +dictyoceratine +dictyodromous +dictyogen +dictyogenous +dictyograptus +dictyoid +diction +dictional +dictionally +dictionary +dictionarian +dictionaries +dictyonema +dictyonina +dictyonine +dictions +dictyophora +dictyopteran +dictyopteris +dictyosiphon +dictyosiphonaceae +dictyosiphonaceous +dictyosome +dictyostele +dictyostelic +dictyota +dictyotaceae +dictyotaceous +dictyotales +dictyotic +dictyoxylon +dictograph +dictronics +dictum +dictums +did +didache +didachist +didact +didactic +didactical +didacticality +didactically +didactician +didacticism +didacticity +didactics +didactyl +didactylism +didactylous +didactive +didacts +didal +didapper +didappers +didascalar +didascaly +didascaliae +didascalic +didascalos +didder +diddered +diddering +diddest +diddy +diddies +diddikai +diddle +diddled +diddler +diddlers +diddles +diddling +didelph +didelphia +didelphian +didelphic +didelphid +didelphidae +didelphyidae +didelphine +didelphis +didelphoid +didelphous +didepsid +didepside +didest +didgeridoo +didy +didicoy +dididae +didie +didies +didym +didymate +didymia +didymis +didymitis +didymium +didymiums +didymoid +didymolite +didymous +didymus +didynamy +didynamia +didynamian +didynamic +didynamies +didynamous +didine +didinium +didle +didler +didn +didna +didnt +dido +didodecahedral +didodecahedron +didoes +didonia +didos +didrachm +didrachma +didrachmal +didrachmas +didric +didromy +didromies +didst +diduce +diduced +diducing +diduction +diductively +diductor +didunculidae +didunculinae +didunculus +didus +die +dye +dyeability +dyeable +dieb +dieback +diebacks +dyebeck +diecase +diecious +dieciously +diectasis +died +dyed +diedral +diedric +dieffenbachia +diegesis +diego +diegueno +diehard +diehards +dyehouse +dieyerie +dieing +dyeing +dyeings +diel +dieldrin +dieldrins +dyeleaves +dielec +dielectric +dielectrical +dielectrically +dielectrics +dielike +dyeline +dielytra +diem +diemaker +dyemaker +diemakers +diemaking +dyemaking +diencephala +diencephalic +diencephalon +diencephalons +diene +diener +dienes +dier +dyer +diereses +dieresis +dieretic +dieri +dyers +diervilla +dies +dyes +diesel +dieselization +dieselize +dieselized +dieselizing +diesels +dieses +diesinker +diesinking +diesis +diester +dyester +diesters +diestock +diestocks +diestrous +diestrual +diestrum +diestrums +diestrus +diestruses +dyestuff +dyestuffs +diet +dietal +dietary +dietarian +dietaries +dietarily +dieted +dieter +dieters +dietetic +dietetical +dietetically +dietetics +dietetist +diethanolamine +diether +diethyl +diethylacetal +diethylamide +diethylamine +diethylaminoethanol +diethylenediamine +diethylethanolamine +diethylmalonylurea +diethylstilbestrol +diethylstilboestrol +diethyltryptamine +diety +dietic +dietical +dietician +dieticians +dietics +dieties +dietine +dieting +dietist +dietitian +dietitians +dietotherapeutics +dietotherapy +dietotoxic +dietotoxicity +dietrichite +diets +dietted +dietzeite +dieugard +dyeware +dyeweed +dyeweeds +diewise +dyewood +dyewoods +diezeugmenon +dif +difda +diferrion +diff +diffame +diffareation +diffarreation +diffeomorphic +diffeomorphism +differ +differed +differen +difference +differenced +differences +differency +differencing +differencingly +different +differentia +differentiability +differentiable +differentiae +differential +differentialize +differentially +differentials +differentiant +differentiate +differentiated +differentiates +differentiating +differentiation +differentiations +differentiative +differentiator +differentiators +differently +differentness +differer +differers +differing +differingly +differs +difficile +difficileness +difficilitate +difficult +difficulty +difficulties +difficultly +difficultness +diffidation +diffide +diffided +diffidence +diffident +diffidently +diffidentness +diffiding +diffinity +difflation +diffluence +diffluent +difflugia +difform +difforme +difformed +difformity +diffract +diffracted +diffracting +diffraction +diffractional +diffractions +diffractive +diffractively +diffractiveness +diffractometer +diffracts +diffranchise +diffrangibility +diffrangible +diffugient +diffund +diffusate +diffuse +diffused +diffusedly +diffusedness +diffusely +diffuseness +diffuser +diffusers +diffuses +diffusibility +diffusible +diffusibleness +diffusibly +diffusimeter +diffusing +diffusiometer +diffusion +diffusional +diffusionism +diffusionist +diffusions +diffusive +diffusively +diffusiveness +diffusivity +diffusor +diffusors +difluence +difluoride +diformin +difunctional +dig +digallate +digallic +digametic +digamy +digamies +digamist +digamists +digamma +digammas +digammate +digammated +digammic +digamous +digastric +digenea +digeneous +digenesis +digenetic +digenetica +digeny +digenic +digenite +digenous +digerent +digest +digestant +digested +digestedly +digestedness +digester +digesters +digestibility +digestible +digestibleness +digestibly +digestif +digesting +digestion +digestional +digestive +digestively +digestiveness +digestment +digestor +digestory +digestors +digests +digesture +diggable +digged +digger +diggers +digging +diggings +dight +dighted +dighter +dighting +dights +digynia +digynian +digynous +digit +digital +digitalein +digitalic +digitaliform +digitalin +digitalis +digitalism +digitalization +digitalize +digitalized +digitalizing +digitally +digitals +digitaria +digitate +digitated +digitately +digitation +digitiform +digitigrada +digitigrade +digitigradism +digitinervate +digitinerved +digitipinnate +digitisation +digitise +digitised +digitising +digitization +digitize +digitized +digitizer +digitizes +digitizing +digitogenin +digitonin +digitoplantar +digitorium +digitoxigenin +digitoxin +digitoxose +digitron +digits +digitule +digitus +digladiate +digladiated +digladiating +digladiation +digladiator +diglyceride +diglyph +diglyphic +diglossia +diglot +diglots +diglottic +diglottism +diglottist +diglucoside +digmeat +dignation +digne +dignify +dignification +dignified +dignifiedly +dignifiedness +dignifies +dignifying +dignitary +dignitarial +dignitarian +dignitaries +dignitas +dignity +dignities +dignosce +dignosle +dignotion +dygogram +digonal +digoneutic +digoneutism +digonoporous +digonous +digor +digoxin +digoxins +digram +digraph +digraphic +digraphically +digraphs +digredience +digrediency +digredient +digress +digressed +digresser +digresses +digressing +digressingly +digression +digressional +digressionary +digressions +digressive +digressively +digressiveness +digressory +digs +diguanide +digue +dihalid +dihalide +dihalo +dihalogen +dihdroxycholecalciferol +dihedral +dihedrals +dihedron +dihedrons +dihely +dihelios +dihelium +dihexagonal +dihexahedral +dihexahedron +dihybrid +dihybridism +dihybrids +dihydrate +dihydrated +dihydrazone +dihydric +dihydride +dihydrite +dihydrochloride +dihydrocupreine +dihydrocuprin +dihydroergotamine +dihydrogen +dihydrol +dihydromorphinone +dihydronaphthalene +dihydronicotine +dihydrosphingosine +dihydrostreptomycin +dihydrotachysterol +dihydroxy +dihydroxyacetone +dihydroxysuccinic +dihydroxytoluene +dihysteria +diiamb +diiambus +dying +dyingly +dyingness +dyings +diiodid +diiodide +diiodo +diiodoform +diiodotyrosine +diipenates +diipolia +diisatogen +dijudicant +dijudicate +dijudicated +dijudicating +dijudication +dika +dikage +dykage +dikamali +dikamalli +dikaryon +dikaryophase +dikaryophasic +dikaryophyte +dikaryophytic +dikaryotic +dikast +dikdik +dikdiks +dike +dyke +diked +dyked +dikegrave +dykehopper +dikelet +dikelocephalid +dikelocephalus +dikephobia +diker +dyker +dikereeve +dykereeve +dikeria +dikerion +dikers +dikes +dykes +dikeside +diketene +diketo +diketone +diking +dyking +dikkop +diksha +diktat +diktats +diktyonite +dil +dilacerate +dilacerated +dilacerating +dilaceration +dilactic +dilactone +dilambdodont +dilamination +dylan +dilaniate +dilantin +dilapidate +dilapidated +dilapidating +dilapidation +dilapidator +dilatability +dilatable +dilatableness +dilatably +dilatancy +dilatant +dilatants +dilatate +dilatation +dilatational +dilatations +dilatative +dilatator +dilatatory +dilate +dilated +dilatedly +dilatedness +dilatement +dilater +dilaters +dilates +dilating +dilatingly +dilation +dilations +dilative +dilatometer +dilatometry +dilatometric +dilatometrically +dilator +dilatory +dilatorily +dilatoriness +dilators +dildo +dildoe +dildoes +dildos +dilection +dilemi +dilemite +dilemma +dilemmas +dilemmatic +dilemmatical +dilemmatically +dilemmic +diletant +dilettanist +dilettant +dilettante +dilettanteish +dilettanteism +dilettantes +dilettanteship +dilettanti +dilettantish +dilettantism +dilettantist +dilettantship +diligence +diligences +diligency +diligent +diligentia +diligently +diligentness +dilis +dilker +dill +dillenia +dilleniaceae +dilleniaceous +dilleniad +dillesk +dilli +dilly +dillydally +dillydallied +dillydallier +dillydallies +dillydallying +dillier +dillies +dilligrout +dillyman +dillymen +dilling +dillis +dillisk +dills +dillseed +dillue +dilluer +dillweed +dilo +dilogarithm +dilogy +dilogical +dilos +dilucid +dilucidate +diluendo +diluent +diluents +dilutant +dilute +diluted +dilutedly +dilutedness +dilutee +dilutely +diluteness +dilutent +diluter +diluters +dilutes +diluting +dilution +dilutions +dilutive +dilutor +dilutors +diluvy +diluvia +diluvial +diluvialist +diluvian +diluvianism +diluviate +diluvion +diluvions +diluvium +diluviums +dim +dimagnesic +dimane +dimanganion +dimanganous +dimaris +dimastigate +dimatis +dimber +dimberdamber +dimble +dime +dimedon +dimedone +dimenhydrinate +dimensible +dimension +dimensional +dimensionality +dimensionally +dimensioned +dimensioning +dimensionless +dimensions +dimensive +dimensum +dimensuration +dimer +dimera +dimeran +dimercaprol +dimercury +dimercuric +dimercurion +dimeric +dimeride +dimerism +dimerisms +dimerization +dimerize +dimerized +dimerizes +dimerizing +dimerlie +dimerous +dimers +dimes +dimetallic +dimeter +dimeters +dimethyl +dimethylamine +dimethylamino +dimethylaniline +dimethylanthranilate +dimethylbenzene +dimethylcarbinol +dimethyldiketone +dimethylhydrazine +dimethylketol +dimethylketone +dimethylmethane +dimethylnitrosamine +dimethyls +dimethylsulfoxide +dimethylsulphoxide +dimethyltryptamine +dimethoate +dimethoxy +dimethoxymethane +dimetient +dimetry +dimetria +dimetric +dimetrodon +dimyary +dimyaria +dimyarian +dimyaric +dimication +dimidiate +dimidiated +dimidiating +dimidiation +dimin +diminish +diminishable +diminishableness +diminished +diminisher +diminishes +diminishing +diminishingly +diminishingturns +diminishment +diminishments +diminue +diminuendo +diminuendoed +diminuendoes +diminuendos +diminuent +diminutal +diminute +diminuted +diminutely +diminuting +diminution +diminutional +diminutions +diminutival +diminutive +diminutively +diminutiveness +diminutivize +dimiss +dimissaries +dimission +dimissory +dimissorial +dimit +dimity +dimities +dimitry +dimitted +dimitting +dimittis +dimly +dimmable +dimmed +dimmedness +dimmer +dimmers +dimmest +dimmet +dimmy +dimming +dimmish +dimmit +dimmock +dimna +dimness +dimnesses +dimolecular +dimoric +dimorph +dimorphic +dimorphism +dimorphisms +dimorphite +dimorphotheca +dimorphous +dimorphs +dimout +dimouts +dimple +dimpled +dimplement +dimples +dimply +dimplier +dimpliest +dimpling +dimps +dimpsy +dims +dimuence +dimwit +dimwits +dimwitted +dimwittedly +dimwittedness +din +dyn +dynactinometer +dynagraph +dinah +dynam +dynameter +dynametric +dynametrical +dynamic +dynamical +dynamically +dynamicity +dynamics +dynamis +dynamism +dynamisms +dynamist +dynamistic +dynamists +dynamitard +dynamite +dynamited +dynamiter +dynamiters +dynamites +dynamitic +dynamitical +dynamitically +dynamiting +dynamitish +dynamitism +dynamitist +dynamization +dynamize +dynamo +dinamode +dynamoelectric +dynamoelectrical +dynamogeneses +dynamogenesis +dynamogeny +dynamogenic +dynamogenous +dynamogenously +dynamograph +dynamometamorphic +dynamometamorphism +dynamometamorphosed +dynamometer +dynamometers +dynamometry +dynamometric +dynamometrical +dynamomorphic +dynamoneure +dynamophone +dynamos +dynamoscope +dynamostatic +dynamotor +dinanderie +dinantian +dinaphthyl +dynapolis +dinar +dinarchy +dinarchies +dinaric +dinars +dinarzade +dynast +dynastes +dynasty +dynastic +dynastical +dynastically +dynasticism +dynastid +dynastidan +dynastides +dynasties +dynastinae +dynasts +dynatron +dynatrons +dinder +dindymene +dindymus +dindle +dindled +dindles +dindling +dindon +dine +dyne +dined +dynel +diner +dinergate +dineric +dinero +dineros +diners +dines +dynes +dinetic +dinette +dinettes +dineuric +dineutron +ding +dingar +dingbat +dingbats +dingdong +dingdonged +dingdonging +dingdongs +dinge +dinged +dingee +dingey +dingeing +dingeys +dinger +dinghee +dinghy +dinghies +dingy +dingier +dingies +dingiest +dingily +dinginess +dinging +dingle +dingleberry +dinglebird +dingled +dingledangle +dingles +dingly +dingling +dingman +dingmaul +dingo +dingoes +dings +dingthrift +dingus +dinguses +dingwall +dinheiro +dinic +dinical +dinichthyid +dinichthys +dining +dinitrate +dinitril +dinitrile +dinitro +dinitrobenzene +dinitrocellulose +dinitrophenylhydrazine +dinitrophenol +dinitrotoluene +dink +dinka +dinked +dinkey +dinkeys +dinky +dinkier +dinkies +dinkiest +dinking +dinkly +dinks +dinkum +dinman +dinmont +dinned +dinner +dinnery +dinnerless +dinnerly +dinners +dinnertime +dinnerware +dinning +dinobryon +dinoceras +dinocerata +dinoceratan +dinoceratid +dinoceratidae +dynode +dynodes +dinoflagellata +dinoflagellatae +dinoflagellate +dinoflagellida +dinomic +dinomys +dinophyceae +dinophilea +dinophilus +dinornis +dinornithes +dinornithic +dinornithid +dinornithidae +dinornithiformes +dinornithine +dinornithoid +dino +dinos +dinosaur +dinosauria +dinosaurian +dinosauric +dinosaurs +dinothere +dinotheres +dinotherian +dinotheriidae +dinotherium +dins +dinsome +dint +dinted +dinting +dintless +dints +dinucleotide +dinumeration +dinus +diobely +diobol +diobolon +diobolons +diobols +dioc +diocesan +diocesans +diocese +dioceses +diocesian +diocletian +diocoel +dioctahedral +dioctophyme +diode +diodes +diodia +diodon +diodont +diodontidae +dioecy +dioecia +dioecian +dioeciodimorphous +dioeciopolygamous +dioecious +dioeciously +dioeciousness +dioecism +dioecisms +dioestrous +dioestrum +dioestrus +diogenean +diogenes +diogenic +diogenite +dioicous +dioicously +dioicousness +diol +diolefin +diolefine +diolefinic +diolefins +diols +diomate +diomedea +diomedeidae +diomedes +dion +dionaea +dionaeaceae +dione +dionym +dionymal +dionise +dionysia +dionysiac +dionysiacal +dionysiacally +dionysian +dionysus +dionize +dioon +diophantine +diophysite +dyophysite +dyophysitic +dyophysitical +dyophysitism +dyophone +diopsidae +diopside +diopsides +diopsidic +diopsimeter +diopsis +dioptase +dioptases +diopter +diopters +dioptidae +dioptograph +dioptometer +dioptometry +dioptomiter +dioptoscopy +dioptra +dioptral +dioptrate +dioptre +dioptres +dioptry +dioptric +dioptrical +dioptrically +dioptrics +dioptrometer +dioptrometry +dioptroscopy +diorama +dioramas +dioramic +diordinal +diorism +diorite +diorites +dioritic +diorthoses +diorthosis +diorthotic +dioscorea +dioscoreaceae +dioscoreaceous +dioscorein +dioscorine +dioscuri +dioscurian +diose +diosgenin +diosma +diosmin +diosmose +diosmosed +diosmosing +diosmosis +diosmotic +diosphenol +diospyraceae +diospyraceous +diospyros +dyostyle +diota +dyotheism +dyothelete +dyotheletian +dyotheletic +dyotheletical +dyotheletism +diothelism +dyothelism +dioti +diotic +diotocardia +diotrephes +diovular +dioxan +dioxane +dioxanes +dioxy +dioxid +dioxide +dioxides +dioxids +dioxime +dioxin +dioxindole +dip +dipala +diparentum +dipartite +dipartition +dipaschal +dipchick +dipcoat +dipentene +dipentine +dipeptid +dipeptidase +dipeptide +dipetalous +dipetto +diphase +diphaser +diphasic +diphead +diphenan +diphenhydramine +diphenyl +diphenylacetylene +diphenylamine +diphenylaminechlorarsine +diphenylchloroarsine +diphenylene +diphenylenimide +diphenylenimine +diphenylguanidine +diphenylhydantoin +diphenylmethane +diphenylquinomethane +diphenyls +diphenylthiourea +diphenol +diphenoxylate +diphycercal +diphycercy +diphyes +diphyesis +diphygenic +diphyletic +diphylla +diphylleia +diphyllobothrium +diphyllous +diphyodont +diphyozooid +diphysite +diphysitism +diphyzooid +dyphone +diphonia +diphosgene +diphosphate +diphosphid +diphosphide +diphosphoric +diphosphothiamine +diphrelatic +diphtheria +diphtherial +diphtherian +diphtheriaphor +diphtheric +diphtheritic +diphtheritically +diphtheritis +diphtheroid +diphtheroidal +diphtherotoxin +diphthong +diphthongal +diphthongalize +diphthongally +diphthongation +diphthonged +diphthongia +diphthongic +diphthonging +diphthongisation +diphthongise +diphthongised +diphthongising +diphthongization +diphthongize +diphthongized +diphthongizing +diphthongous +diphthongs +dipicrate +dipicrylamin +dipicrylamine +dipygi +dipygus +dipylon +dipyramid +dipyramidal +dipyre +dipyrenous +dipyridyl +dipl +diplacanthidae +diplacanthus +diplacuses +diplacusis +dipladenia +diplanar +diplanetic +diplanetism +diplantidian +diplarthrism +diplarthrous +diplasiasmus +diplasic +diplasion +diple +diplegia +diplegias +diplegic +dipleidoscope +dipleiodoscope +dipleura +dipleural +dipleuric +dipleurobranchiate +dipleurogenesis +dipleurogenetic +dipleurula +dipleurulas +dipleurule +diplex +diplexer +diplobacillus +diplobacterium +diploblastic +diplocardia +diplocardiac +diplocarpon +diplocaulescent +diplocephaly +diplocephalous +diplocephalus +diplochlamydeous +diplococcal +diplococcemia +diplococci +diplococcic +diplococcocci +diplococcoid +diplococcus +diploconical +diplocoria +diplodia +diplodocus +diplodocuses +diplodus +diploe +diploes +diploetic +diplogangliate +diplogenesis +diplogenetic +diplogenic +diploglossata +diploglossate +diplograph +diplography +diplographic +diplographical +diplohedral +diplohedron +diploic +diploid +diploidy +diploidic +diploidies +diploidion +diploidize +diploids +diplois +diplokaryon +diploma +diplomacy +diplomacies +diplomaed +diplomaing +diplomas +diplomat +diplomata +diplomate +diplomates +diplomatic +diplomatical +diplomatically +diplomatics +diplomatique +diplomatism +diplomatist +diplomatists +diplomatize +diplomatized +diplomatology +diplomats +diplomyelia +diplonema +diplonephridia +diploneural +diplont +diplontic +diplonts +diploperistomic +diplophase +diplophyte +diplophonia +diplophonic +diplopy +diplopia +diplopiaphobia +diplopias +diplopic +diploplacula +diploplacular +diploplaculate +diplopod +diplopoda +diplopodic +diplopodous +diplopods +diploptera +diplopteryga +diplopterous +diploses +diplosis +diplosome +diplosphenal +diplosphene +diplospondyli +diplospondylic +diplospondylism +diplostemony +diplostemonous +diplostichous +diplotaxis +diplotegia +diplotene +diplozoon +diplumbic +dipmeter +dipneedle +dipneumona +dipneumones +dipneumonous +dipneust +dipneustal +dipneusti +dipnoan +dipnoans +dipnoi +dipnoid +dypnone +dipnoous +dipode +dipody +dipodic +dipodid +dipodidae +dipodies +dipodomyinae +dipodomys +dipolar +dipolarization +dipolarize +dipole +dipoles +dipolsphene +diporpa +dipotassic +dipotassium +dippable +dipped +dipper +dipperful +dippers +dippy +dippier +dippiest +dipping +dippings +dipppy +dipppier +dipppiest +diprimary +diprismatic +dipropargyl +dipropellant +dipropyl +diprotic +diprotodan +diprotodon +diprotodont +diprotodontia +dips +dipsacaceae +dipsacaceous +dipsaceae +dipsaceous +dipsacus +dipsades +dipsadinae +dipsadine +dipsas +dipsey +dipsetic +dipsy +dipsie +dipso +dipsomania +dipsomaniac +dipsomaniacal +dipsomaniacs +dipsopathy +dipsos +dipsosaurus +dipsosis +dipstick +dipsticks +dipt +dipter +diptera +dipteraceae +dipteraceous +dipterad +dipteral +dipteran +dipterans +dipterygian +dipterist +dipteryx +dipterocarp +dipterocarpaceae +dipterocarpaceous +dipterocarpous +dipterocarpus +dipterocecidium +dipteroi +dipterology +dipterological +dipterologist +dipteron +dipteros +dipterous +dipterus +diptyca +diptycas +diptych +diptychon +diptychs +diptote +dipus +dipware +diquat +diquats +dir +diradiation +dirca +dircaean +dird +dirdum +dirdums +dire +direcly +direct +directable +directcarving +directdiscourse +directed +directer +directest +directeur +directexamination +directing +direction +directional +directionality +directionalize +directionally +directionize +directionless +directions +directitude +directive +directively +directiveness +directives +directivity +directly +directness +directoire +director +directoral +directorate +directorates +directory +directorial +directorially +directories +directors +directorship +directorships +directress +directrices +directrix +directrixes +directs +direful +direfully +direfulness +direly +dirempt +diremption +direness +direnesses +direption +direr +direst +direx +direxit +dirge +dirged +dirgeful +dirgelike +dirgeman +dirges +dirgy +dirgie +dirging +dirgler +dirham +dirhams +dirhem +dirhinous +dirian +dirichletian +dirige +dirigent +dirigibility +dirigible +dirigibles +dirigo +dirigomotor +diriment +dirity +dirk +dirked +dirking +dirks +dirl +dirled +dirling +dirls +dirndl +dirndls +dirt +dirtbird +dirtboard +dirten +dirtfarmer +dirty +dirtied +dirtier +dirties +dirtiest +dirtying +dirtily +dirtiness +dirtplate +dirts +diruption +dis +dys +disa +disability +disabilities +disable +disabled +disablement +disableness +disabler +disablers +disables +disabling +disabusal +disabuse +disabused +disabuses +disabusing +disacceptance +disaccharid +disaccharidase +disaccharide +disaccharides +disaccharose +disaccommodate +disaccommodation +disaccomodate +disaccord +disaccordance +disaccordant +disaccredit +disaccustom +disaccustomed +disaccustomedness +disacidify +disacidified +disacknowledge +disacknowledgement +disacknowledgements +dysacousia +dysacousis +dysacousma +disacquaint +disacquaintance +disacryl +dysacusia +dysadaptation +disadjust +disadorn +disadvance +disadvanced +disadvancing +disadvantage +disadvantaged +disadvantagedness +disadvantageous +disadvantageously +disadvantageousness +disadvantages +disadvantaging +disadventure +disadventurous +disadvise +disadvised +disadvising +dysaesthesia +dysaesthetic +disaffect +disaffectation +disaffected +disaffectedly +disaffectedness +disaffecting +disaffection +disaffectionate +disaffections +disaffects +disaffiliate +disaffiliated +disaffiliates +disaffiliating +disaffiliation +disaffiliations +disaffinity +disaffirm +disaffirmance +disaffirmation +disaffirmative +disaffirming +disafforest +disafforestation +disafforestment +disagglomeration +disaggregate +disaggregated +disaggregation +disaggregative +disagio +disagree +disagreeability +disagreeable +disagreeableness +disagreeables +disagreeably +disagreeance +disagreed +disagreeing +disagreement +disagreements +disagreer +disagrees +disagreing +disalicylide +disalign +disaligned +disaligning +disalignment +disalike +disally +disalliege +disallow +disallowable +disallowableness +disallowance +disallowances +disallowed +disallowing +disallows +disaltern +disambiguate +disambiguated +disambiguates +disambiguating +disambiguation +disambiguations +disamenity +disamis +dysanagnosia +disanagrammatize +dysanalyte +disanalogy +disanalogous +disanchor +disangelical +disangularize +disanimal +disanimate +disanimated +disanimating +disanimation +disanney +disannex +disannexation +disannul +disannulled +disannuller +disannulling +disannulment +disannuls +disanoint +disanswerable +dysaphia +disapostle +disapparel +disappear +disappearance +disappearances +disappeared +disappearer +disappearing +disappears +disappendancy +disappendant +disappoint +disappointed +disappointedly +disappointer +disappointing +disappointingly +disappointingness +disappointment +disappointments +disappoints +disappreciate +disappreciation +disapprobation +disapprobations +disapprobative +disapprobatory +disappropriate +disappropriation +disapprovable +disapproval +disapprovals +disapprove +disapproved +disapprover +disapproves +disapproving +disapprovingly +disaproned +dysaptation +disarchbishop +disard +disarm +disarmament +disarmature +disarmed +disarmer +disarmers +disarming +disarmingly +disarms +disarray +disarrayed +disarraying +disarrays +disarrange +disarranged +disarrangement +disarrangements +disarranger +disarranges +disarranging +disarrest +dysarthria +dysarthric +dysarthrosis +disarticulate +disarticulated +disarticulating +disarticulation +disarticulator +disasinate +disasinize +disassemble +disassembled +disassembler +disassembles +disassembly +disassembling +disassent +disassiduity +disassimilate +disassimilated +disassimilating +disassimilation +disassimilative +disassociable +disassociate +disassociated +disassociates +disassociating +disassociation +disaster +disasterly +disasters +disastimeter +disastrous +disastrously +disastrousness +disattaint +disattire +disattune +disaugment +disauthentic +disauthenticate +disauthorize +dysautonomia +disavail +disavaunce +disavouch +disavow +disavowable +disavowal +disavowals +disavowance +disavowed +disavowedly +disavower +disavowing +disavowment +disavows +disawa +disazo +disbalance +disbalancement +disband +disbanded +disbanding +disbandment +disbandments +disbands +disbar +dysbarism +disbark +disbarment +disbarments +disbarred +disbarring +disbars +disbase +disbecome +disbelief +disbeliefs +disbelieve +disbelieved +disbeliever +disbelievers +disbelieves +disbelieving +disbelievingly +disbench +disbenched +disbenching +disbenchment +disbend +disbind +disblame +disbloom +disboard +disbody +disbodied +disbogue +disboscation +disbosom +disbosomed +disbosoming +disbosoms +disbound +disbowel +disboweled +disboweling +disbowelled +disbowelling +disbowels +disbrain +disbranch +disbranched +disbranching +disbud +disbudded +disbudder +disbudding +disbuds +dysbulia +dysbulic +disburden +disburdened +disburdening +disburdenment +disburdens +disburgeon +disbury +disbursable +disbursal +disbursals +disburse +disbursed +disbursement +disbursements +disburser +disburses +disbursing +disburthen +disbutton +disc +discabinet +discage +discal +discalceate +discalced +discamp +discandy +discanonization +discanonize +discanonized +discant +discanted +discanter +discanting +discants +discantus +discapacitate +discard +discardable +discarded +discarder +discarding +discardment +discards +discarnate +discarnation +discase +discased +discases +discasing +discastle +discatter +disced +discede +discept +disceptation +disceptator +discepted +discepting +discepts +discern +discernable +discernableness +discernably +discerned +discerner +discerners +discernibility +discernible +discernibleness +discernibly +discerning +discerningly +discernment +discerns +discerp +discerped +discerpibility +discerpible +discerpibleness +discerping +discerptibility +discerptible +discerptibleness +discerption +discerptive +discession +discharacter +discharge +dischargeable +discharged +dischargee +discharger +dischargers +discharges +discharging +discharity +discharm +dischase +dischevel +dyschiria +dyschroa +dyschroia +dyschromatopsia +dyschromatoptic +dyschronous +dischurch +disci +discide +disciferous +disciflorae +discifloral +disciflorous +disciform +discigerous +discina +discinct +discind +discing +discinoid +disciple +discipled +disciplelike +disciples +discipleship +disciplinability +disciplinable +disciplinableness +disciplinal +disciplinant +disciplinary +disciplinarian +disciplinarianism +disciplinarians +disciplinarily +disciplinarity +disciplinate +disciplinative +disciplinatory +discipline +disciplined +discipliner +discipliners +disciplines +discipling +disciplining +discipular +discircumspection +discission +discitis +disclaim +disclaimant +disclaimed +disclaimer +disclaimers +disclaiming +disclaims +disclamation +disclamatory +disclander +disclass +disclassify +disclike +disclimax +discloak +discloister +disclosable +disclose +disclosed +discloser +discloses +disclosing +disclosive +disclosure +disclosures +discloud +disclout +disclusion +disco +discoach +discoactine +discoast +discoblastic +discoblastula +discoboli +discobolos +discobolus +discocarp +discocarpium +discocarpous +discocephalous +discodactyl +discodactylous +discogastrula +discoglossid +discoglossidae +discoglossoid +discographer +discography +discographic +discographical +discographically +discographies +discoherent +discohexaster +discoid +discoidal +discoidea +discoideae +discoids +discolichen +discolith +discolor +discolorate +discolorated +discoloration +discolorations +discolored +discoloredness +discoloring +discolorization +discolorment +discolors +discolour +discoloured +discolouring +discolourization +discombobulate +discombobulated +discombobulates +discombobulating +discombobulation +discomedusae +discomedusan +discomedusoid +discomfit +discomfited +discomfiter +discomfiting +discomfits +discomfiture +discomfort +discomfortable +discomfortableness +discomfortably +discomforted +discomforter +discomforting +discomfortingly +discomforts +discomycete +discomycetes +discomycetous +discommend +discommendable +discommendableness +discommendably +discommendation +discommender +discommission +discommodate +discommode +discommoded +discommodes +discommoding +discommodious +discommodiously +discommodiousness +discommodity +discommodities +discommon +discommoned +discommoning +discommons +discommune +discommunity +discomorula +discompanied +discomplexion +discompliance +discompose +discomposed +discomposedly +discomposedness +discomposes +discomposing +discomposingly +discomposure +discompt +disconanthae +disconanthous +disconcert +disconcerted +disconcertedly +disconcertedness +disconcerting +disconcertingly +disconcertingness +disconcertion +disconcertment +disconcerts +disconcord +disconduce +disconducive +disconectae +disconfirm +disconfirmation +disconfirmed +disconform +disconformable +disconformably +disconformity +disconformities +discongruity +disconjure +disconnect +disconnected +disconnectedly +disconnectedness +disconnecter +disconnecting +disconnection +disconnections +disconnective +disconnectiveness +disconnector +disconnects +disconsent +disconsider +disconsideration +disconsolacy +disconsolance +disconsolate +disconsolately +disconsolateness +disconsolation +disconsonancy +disconsonant +discontent +discontented +discontentedly +discontentedness +discontentful +discontenting +discontentive +discontentment +discontentments +discontents +discontiguity +discontiguous +discontiguousness +discontinuable +discontinual +discontinuance +discontinuances +discontinuation +discontinuations +discontinue +discontinued +discontinuee +discontinuer +discontinues +discontinuing +discontinuity +discontinuities +discontinuor +discontinuous +discontinuously +discontinuousness +disconula +disconvenience +disconvenient +disconventicle +discophile +discophora +discophoran +discophore +discophorous +discoplacenta +discoplacental +discoplacentalia +discoplacentalian +discoplasm +discopodous +discord +discordable +discordance +discordancy +discordancies +discordant +discordantly +discordantness +discorded +discorder +discordful +discordia +discording +discordous +discords +discorporate +discorrespondency +discorrespondent +discos +discost +discostate +discostomatous +discotheque +discotheques +discothque +discounsel +discount +discountable +discounted +discountenance +discountenanced +discountenancer +discountenances +discountenancing +discounter +discounters +discounting +discountinuous +discounts +discouple +discour +discourage +discourageable +discouraged +discouragedly +discouragement +discouragements +discourager +discourages +discouraging +discouragingly +discouragingness +discourse +discoursed +discourseless +discourser +discoursers +discourses +discoursing +discoursive +discoursively +discoursiveness +discourt +discourteous +discourteously +discourteousness +discourtesy +discourtesies +discourtship +discous +discovenant +discover +discoverability +discoverable +discoverably +discovered +discoverer +discoverers +discovery +discoveries +discovering +discovers +discovert +discoverture +discradle +dyscrase +dyscrased +dyscrasy +dyscrasia +dyscrasial +dyscrasic +dyscrasing +dyscrasite +dyscratic +discreate +discreated +discreating +discreation +discredence +discredit +discreditability +discreditable +discreditableness +discreditably +discredited +discrediting +discredits +discreet +discreeter +discreetest +discreetly +discreetness +discrepance +discrepancy +discrepancies +discrepancries +discrepant +discrepantly +discrepate +discrepated +discrepating +discrepation +discrepencies +discrested +discrete +discretely +discreteness +discretion +discretional +discretionally +discretionary +discretionarily +discretive +discretively +discretiveness +discriminability +discriminable +discriminably +discriminal +discriminant +discriminantal +discriminate +discriminated +discriminately +discriminateness +discriminates +discriminating +discriminatingly +discriminatingness +discrimination +discriminational +discriminations +discriminative +discriminatively +discriminativeness +discriminator +discriminatory +discriminatorily +discriminators +discriminoid +discriminous +dyscrinism +dyscrystalline +discrive +discrown +discrowned +discrowning +discrownment +discrowns +discruciate +discs +discubation +discubitory +disculpate +disculpation +disculpatory +discumb +discumber +discure +discuren +discurre +discurrent +discursative +discursativeness +discursify +discursion +discursive +discursively +discursiveness +discursory +discursus +discurtain +discus +discuses +discuss +discussable +discussant +discussants +discussed +discusser +discusses +discussible +discussing +discussion +discussional +discussionis +discussionism +discussionist +discussions +discussive +discussment +discustom +discutable +discute +discutient +disdain +disdainable +disdained +disdainer +disdainful +disdainfully +disdainfulness +disdaining +disdainly +disdainous +disdains +disdar +disdeceive +disdeify +disdein +disdenominationalize +disdiaclasis +disdiaclast +disdiaclastic +disdiapason +disdiazo +disdiplomatize +disdodecahedroid +disdub +disease +diseased +diseasedly +diseasedness +diseaseful +diseasefulness +diseases +diseasy +diseasing +disecondary +diseconomy +disedge +disedify +disedification +diseducate +disegno +diselder +diselectrify +diselectrification +diselenid +diselenide +disematism +disembay +disembalm +disembargo +disembargoed +disembargoing +disembark +disembarkation +disembarkations +disembarked +disembarking +disembarkment +disembarks +disembarrass +disembarrassed +disembarrassment +disembattle +disembed +disembellish +disembitter +disembocation +disembody +disembodied +disembodies +disembodying +disembodiment +disembodiments +disembogue +disembogued +disemboguement +disemboguing +disembosom +disembowel +disemboweled +disemboweling +disembowelled +disembowelling +disembowelment +disembowelments +disembowels +disembower +disembrace +disembrangle +disembroil +disembroilment +disemburden +diseme +disemic +disemplane +disemplaned +disemploy +disemployed +disemploying +disemployment +disemploys +disempower +disemprison +disenable +disenabled +disenablement +disenabling +disenact +disenactment +disenamor +disenamour +disenchain +disenchant +disenchanted +disenchanter +disenchanting +disenchantingly +disenchantment +disenchantments +disenchantress +disenchants +disencharm +disenclose +disencourage +disencrease +disencumber +disencumbered +disencumbering +disencumberment +disencumbers +disencumbrance +disendow +disendowed +disendower +disendowing +disendowment +disendows +disenfranchise +disenfranchised +disenfranchisement +disenfranchisements +disenfranchises +disenfranchising +disengage +disengaged +disengagedness +disengagement +disengagements +disengages +disengaging +disengirdle +disenjoy +disenjoyment +disenmesh +disennoble +disennui +disenorm +disenrol +disenroll +disensanity +disenshroud +disenslave +disensoul +disensure +disentail +disentailment +disentangle +disentangled +disentanglement +disentanglements +disentangler +disentangles +disentangling +disenter +dysentery +dysenteric +dysenterical +dysenteries +disenthral +disenthrall +disenthralled +disenthralling +disenthrallment +disenthralls +disenthralment +disenthrone +disenthroned +disenthronement +disenthroning +disentitle +disentitled +disentitlement +disentitling +disentomb +disentombment +disentraced +disentrail +disentrain +disentrainment +disentrammel +disentrance +disentranced +disentrancement +disentrancing +disentwine +disentwined +disentwining +disenvelop +disepalous +dysepulotic +dysepulotical +disequality +disequalization +disequalize +disequalizer +disequilibrate +disequilibration +disequilibria +disequilibrium +disequilibriums +dyserethisia +dysergasia +dysergia +disert +disespouse +disestablish +disestablished +disestablisher +disestablishes +disestablishing +disestablishment +disestablishmentarian +disestablishmentarianism +disestablismentarian +disestablismentarianism +disesteem +disesteemed +disesteemer +disesteeming +dysesthesia +dysesthetic +disestimation +diseur +diseurs +diseuse +diseuses +disexcommunicate +disexercise +disfaith +disfame +disfashion +disfavor +disfavored +disfavorer +disfavoring +disfavors +disfavour +disfavourable +disfavoured +disfavourer +disfavouring +disfeature +disfeatured +disfeaturement +disfeaturing +disfellowship +disfen +disfiguration +disfigurative +disfigure +disfigured +disfigurement +disfigurements +disfigurer +disfigures +disfiguring +disfiguringly +disflesh +disfoliage +disfoliaged +disforest +disforestation +disform +disformity +disfortune +disframe +disfranchise +disfranchised +disfranchisement +disfranchisements +disfranchiser +disfranchisers +disfranchises +disfranchising +disfrancnise +disfrequent +disfriar +disfrock +disfrocked +disfrocking +disfrocks +disfunction +dysfunction +dysfunctional +dysfunctioning +disfunctions +dysfunctions +disfurnish +disfurnished +disfurnishment +disfurniture +disgage +disgallant +disgarland +disgarnish +disgarrison +disgavel +disgaveled +disgaveling +disgavelled +disgavelling +disgeneric +dysgenesic +dysgenesis +dysgenetic +disgenic +dysgenic +dysgenical +dysgenics +disgenius +dysgeogenous +disgig +disglory +disglorify +disglut +dysgnosia +dysgonic +disgood +disgorge +disgorged +disgorgement +disgorger +disgorges +disgorging +disgospel +disgospelize +disgout +disgown +disgrace +disgraced +disgraceful +disgracefully +disgracefulness +disgracement +disgracer +disgracers +disgraces +disgracia +disgracing +disgracious +disgracive +disgradation +disgrade +disgraded +disgrading +disgradulate +dysgraphia +disgregate +disgregated +disgregating +disgregation +disgress +disgross +disgruntle +disgruntled +disgruntlement +disgruntles +disgruntling +disguisable +disguisay +disguisal +disguise +disguised +disguisedly +disguisedness +disguiseless +disguisement +disguisements +disguiser +disguises +disguising +disgulf +disgust +disgusted +disgustedly +disgustedness +disguster +disgustful +disgustfully +disgustfulness +disgusting +disgustingly +disgustingness +disgusts +dish +dishabilitate +dishabilitation +dishabille +dishabit +dishabited +dishabituate +dishabituated +dishabituating +dishable +dishallow +dishallucination +disharmony +disharmonic +disharmonical +disharmonies +disharmonious +disharmonise +disharmonised +disharmonising +disharmonism +disharmonize +disharmonized +disharmonizing +dishaunt +dishboard +dishcloth +dishcloths +dishclout +dishcross +disheart +dishearten +disheartened +disheartenedly +disheartener +disheartening +dishearteningly +disheartenment +disheartens +disheathing +disheaven +dished +disheir +dishellenize +dishelm +dishelmed +dishelming +dishelms +disher +disherent +disherison +disherit +disherited +disheriting +disheritment +disheritor +disherits +dishes +dishevel +disheveled +dishevely +disheveling +dishevelled +dishevelling +dishevelment +dishevelments +dishevels +dishexecontahedroid +dishful +dishfuls +dishy +dishier +dishiest +dishing +dishley +dishlike +dishling +dishmaker +dishmaking +dishmonger +dishmop +dishome +dishonest +dishonesty +dishonesties +dishonestly +dishonor +dishonorable +dishonorableness +dishonorably +dishonorary +dishonored +dishonorer +dishonoring +dishonors +dishonour +dishonourable +dishonourableness +dishonourably +dishonourary +dishonoured +dishonourer +dishonouring +dishorn +dishorner +dishorse +dishouse +dishpan +dishpanful +dishpans +dishrag +dishrags +dishtowel +dishtowels +dishumanize +dishumor +dishumour +dishware +dishwares +dishwash +dishwasher +dishwashers +dishwashing +dishwashings +dishwater +dishwatery +dishwiper +dishwiping +disidentify +dysidrosis +disilane +disilicane +disilicate +disilicic +disilicid +disilicide +disyllabic +disyllabism +disyllabize +disyllabized +disyllabizing +disyllable +disillude +disilluded +disilluminate +disillusion +disillusionary +disillusioned +disillusioning +disillusionise +disillusionised +disillusioniser +disillusionising +disillusionist +disillusionize +disillusionized +disillusionizer +disillusionizing +disillusionment +disillusionments +disillusions +disillusive +disimagine +disimbitter +disimitate +disimitation +disimmure +disimpark +disimpassioned +disimprison +disimprisonment +disimprove +disimprovement +disincarcerate +disincarceration +disincarnate +disincarnation +disincentive +disinclination +disinclinations +disincline +disinclined +disinclines +disinclining +disinclose +disincorporate +disincorporated +disincorporating +disincorporation +disincrease +disincrust +disincrustant +disincrustion +disindividualize +disinfect +disinfectant +disinfectants +disinfected +disinfecter +disinfecting +disinfection +disinfections +disinfective +disinfector +disinfects +disinfest +disinfestant +disinfestation +disinfeudation +disinflame +disinflate +disinflated +disinflating +disinflation +disinflationary +disinformation +disingenious +disingenuity +disingenuous +disingenuously +disingenuousness +disinhabit +disinherison +disinherit +disinheritable +disinheritance +disinheritances +disinherited +disinheriting +disinherits +disinhibition +disinhume +disinhumed +disinhuming +disinsection +disinsectization +disinsulation +disinsure +disintegrable +disintegrant +disintegrate +disintegrated +disintegrates +disintegrating +disintegration +disintegrationist +disintegrations +disintegrative +disintegrator +disintegratory +disintegrators +disintegrity +disintegrous +disintensify +disinter +disinteress +disinterest +disinterested +disinterestedly +disinterestedness +disinteresting +disintermediation +disinterment +disinterred +disinterring +disinters +disintertwine +disyntheme +disinthrall +disintoxicate +disintoxication +disintrench +dysyntribite +disintricate +disinure +disinvagination +disinvest +disinvestiture +disinvestment +disinvigorate +disinvite +disinvolve +disinvolvement +disyoke +disyoked +disyokes +disyoking +disjasked +disjasket +disjaskit +disject +disjected +disjecting +disjection +disjects +disjeune +disjoin +disjoinable +disjoined +disjoining +disjoins +disjoint +disjointed +disjointedly +disjointedness +disjointing +disjointly +disjointness +disjoints +disjointure +disjudication +disjunct +disjunction +disjunctions +disjunctive +disjunctively +disjunctor +disjuncts +disjuncture +disjune +disk +disked +diskelion +disker +dyskeratosis +diskery +diskette +diskettes +diskindness +dyskinesia +dyskinetic +disking +diskless +disklike +disknow +diskography +diskophile +diskos +disks +dislade +dislady +dyslalia +dislaurel +disleaf +disleafed +disleafing +disleal +disleave +disleaved +disleaving +dyslectic +dislegitimate +dislevelment +dyslexia +dyslexias +dyslexic +dyslexics +disli +dislicense +dislikable +dislike +dislikeable +disliked +dislikeful +dislikelihood +disliken +dislikeness +disliker +dislikers +dislikes +disliking +dislimb +dislimn +dislimned +dislimning +dislimns +dislink +dislip +dyslysin +dislive +dislluminate +disload +dislocability +dislocable +dislocate +dislocated +dislocatedly +dislocatedness +dislocates +dislocating +dislocation +dislocations +dislocator +dislocatory +dislock +dislodge +dislodgeable +dislodged +dislodgement +dislodges +dislodging +dislodgment +dyslogy +dyslogia +dyslogistic +dyslogistically +disloyal +disloyalist +disloyally +disloyalty +disloyalties +disloign +dislove +dysluite +disluster +dislustered +dislustering +dislustre +dislustred +dislustring +dismay +dismayable +dismayed +dismayedness +dismayful +dismayfully +dismaying +dismayingly +dismayingness +dismail +dismain +dismays +dismal +dismaler +dismalest +dismality +dismalities +dismalize +dismally +dismalness +dismals +disman +dismantle +dismantled +dismantlement +dismantler +dismantles +dismantling +dismarble +dismarch +dismark +dismarket +dismarketed +dismarketing +dismarry +dismarshall +dismask +dismast +dismasted +dismasting +dismastment +dismasts +dismaw +disme +dismeasurable +dismeasured +dismember +dismembered +dismemberer +dismembering +dismemberment +dismemberments +dismembers +dismembrate +dismembrated +dismembrator +dysmenorrhagia +dysmenorrhea +dysmenorrheal +dysmenorrheic +dysmenorrhoea +dysmenorrhoeal +dysmerism +dysmeristic +dismerit +dysmerogenesis +dysmerogenetic +dysmeromorph +dysmeromorphic +dismes +dysmetria +dismettled +disminion +disminister +dismiss +dismissable +dismissal +dismissals +dismissed +dismisser +dismissers +dismisses +dismissible +dismissing +dismissingly +dismission +dismissive +dismissory +dismit +dysmnesia +dismoded +dysmorphism +dysmorphophobia +dismortgage +dismortgaged +dismortgaging +dismount +dismountable +dismounted +dismounting +dismounts +dismutation +disna +disnatural +disnaturalization +disnaturalize +disnature +disnatured +disnaturing +disney +disneyland +disnest +dysneuria +disnew +disniche +dysnomy +disnosed +disnumber +disobedience +disobedient +disobediently +disobey +disobeyal +disobeyed +disobeyer +disobeyers +disobeying +disobeys +disobligation +disobligatory +disoblige +disobliged +disobliger +disobliges +disobliging +disobligingly +disobligingness +disobstruct +disoccident +disocclude +disoccluded +disoccluding +disoccupation +disoccupy +disoccupied +disoccupying +disodic +dysodile +dysodyle +disodium +dysodontiasis +disomaty +disomatic +disomatous +disomic +disomus +disoperation +disoperculate +disopinion +disoppilate +disorb +disorchard +disordain +disordained +disordeine +disorder +disordered +disorderedly +disorderedness +disorderer +disordering +disorderly +disorderliness +disorders +disordinance +disordinate +disordinated +disordination +dysorexy +dysorexia +disorganic +disorganise +disorganised +disorganiser +disorganising +disorganization +disorganize +disorganized +disorganizer +disorganizers +disorganizes +disorganizing +disorient +disorientate +disorientated +disorientates +disorientating +disorientation +disoriented +disorienting +disorients +disour +disown +disownable +disowned +disowning +disownment +disowns +disoxidate +dysoxidation +dysoxidizable +dysoxidize +disoxygenate +disoxygenation +disozonize +disp +dispace +dispaint +dispair +dispand +dispansive +dispapalize +dispar +disparadise +disparage +disparageable +disparaged +disparagement +disparagements +disparager +disparages +disparaging +disparagingly +disparate +disparately +disparateness +disparation +disparatum +dyspareunia +disparish +disparison +disparity +disparities +disparition +dispark +disparkle +disparple +disparpled +disparpling +dispart +disparted +disparting +dispartment +disparts +dispassion +dispassionate +dispassionately +dispassionateness +dispassioned +dispatch +dispatched +dispatcher +dispatchers +dispatches +dispatchful +dispatching +dyspathetic +dispathy +dyspathy +dispatriated +dispauper +dispauperize +dispeace +dispeaceful +dispeed +dispel +dispell +dispellable +dispelled +dispeller +dispelling +dispells +dispels +dispence +dispend +dispended +dispender +dispending +dispendious +dispendiously +dispenditure +dispends +dispensability +dispensable +dispensableness +dispensary +dispensaries +dispensate +dispensated +dispensating +dispensation +dispensational +dispensationalism +dispensations +dispensative +dispensatively +dispensator +dispensatory +dispensatories +dispensatorily +dispensatress +dispensatrix +dispense +dispensed +dispenser +dispensers +dispenses +dispensible +dispensing +dispensingly +dispensive +dispeople +dispeopled +dispeoplement +dispeopler +dispeopling +dyspepsy +dyspepsia +dyspepsies +dyspeptic +dyspeptical +dyspeptically +dyspeptics +disperato +dispergate +dispergated +dispergating +dispergation +dispergator +disperge +dispericraniate +disperiwig +dispermy +dispermic +dispermous +disperple +dispersal +dispersals +dispersant +disperse +dispersed +dispersedelement +dispersedye +dispersedly +dispersedness +dispersement +disperser +dispersers +disperses +dispersibility +dispersible +dispersing +dispersion +dispersions +dispersity +dispersive +dispersively +dispersiveness +dispersoid +dispersoidology +dispersoidological +dispersonalize +dispersonate +dispersonify +dispersonification +dispetal +dysphagia +dysphagic +dysphasia +dysphasic +dysphemia +dysphemism +dysphemistic +dysphemize +dysphemized +disphenoid +dysphonia +dysphonic +dysphoria +dysphoric +dysphotic +dysphrasia +dysphrenia +dispicion +dispiece +dispirem +dispireme +dispirit +dispirited +dispiritedly +dispiritedness +dispiriting +dispiritingly +dispiritment +dispirits +dispiteous +dispiteously +dispiteousness +dyspituitarism +displace +displaceability +displaceable +displaced +displacement +displacements +displacency +displacer +displaces +displacing +display +displayable +displayed +displayer +displaying +displays +displant +displanted +displanting +displants +dysplasia +dysplastic +displat +disple +displeasance +displeasant +displease +displeased +displeasedly +displeaser +displeases +displeasing +displeasingly +displeasingness +displeasurable +displeasurably +displeasure +displeasureable +displeasureably +displeasured +displeasurement +displeasures +displeasuring +displenish +displicence +displicency +displode +disploded +displodes +disploding +displosion +displume +displumed +displumes +displuming +displuviate +dyspnea +dyspneal +dyspneas +dyspneic +dyspnoea +dyspnoeal +dyspnoeas +dyspnoeic +dyspnoi +dyspnoic +dispoint +dispond +dispondaic +dispondee +dispone +disponed +disponee +disponent +disponer +disponge +disponing +dispope +dispopularize +dysporomorph +disporous +disport +disported +disporting +disportive +disportment +disports +disporum +disposability +disposable +disposableness +disposal +disposals +dispose +disposed +disposedly +disposedness +disposement +disposer +disposers +disposes +disposing +disposingly +disposit +disposition +dispositional +dispositionally +dispositioned +dispositions +dispositive +dispositively +dispositor +dispossed +dispossess +dispossessed +dispossesses +dispossessing +dispossession +dispossessor +dispossessory +dispost +disposure +dispowder +dispractice +dispraise +dispraised +dispraiser +dispraising +dispraisingly +dyspraxia +dispread +dispreader +dispreading +dispreads +disprejudice +disprepare +dispress +disprince +disprison +disprivacied +disprivilege +disprize +disprized +disprizes +disprizing +disprobabilization +disprobabilize +disprobative +disprofess +disprofit +disprofitable +dispromise +disproof +disproofs +disproperty +disproportion +disproportionable +disproportionableness +disproportionably +disproportional +disproportionality +disproportionally +disproportionalness +disproportionate +disproportionately +disproportionateness +disproportionates +disproportionation +disproportions +dispropriate +dysprosia +dysprosium +disprovable +disproval +disprove +disproved +disprovement +disproven +disprover +disproves +disprovide +disproving +dispulp +dispunct +dispunge +dispunishable +dispunitive +dispurpose +dispurse +dispurvey +disputability +disputable +disputableness +disputably +disputacity +disputant +disputants +disputation +disputations +disputatious +disputatiously +disputatiousness +disputative +disputatively +disputativeness +disputator +dispute +disputed +disputeful +disputeless +disputer +disputers +disputes +disputing +disputisoun +disqualify +disqualifiable +disqualification +disqualifications +disqualified +disqualifies +disqualifying +disquantity +disquarter +disquiet +disquieted +disquietedly +disquietedness +disquieten +disquieter +disquieting +disquietingly +disquietingness +disquietly +disquietness +disquiets +disquietude +disquietudes +disquiparancy +disquiparant +disquiparation +disquisit +disquisite +disquisited +disquisiting +disquisition +disquisitional +disquisitionary +disquisitions +disquisitive +disquisitively +disquisitor +disquisitory +disquisitorial +disquixote +disraeli +disray +disrange +disrank +dysraphia +disrate +disrated +disrates +disrating +disrealize +disreason +disrecommendation +disregard +disregardable +disregardance +disregardant +disregarded +disregarder +disregardful +disregardfully +disregardfulness +disregarding +disregards +disregular +disrelate +disrelated +disrelation +disrelish +disrelishable +disremember +disrepair +disreport +disreputability +disreputable +disreputableness +disreputably +disreputation +disrepute +disreputed +disrespect +disrespectability +disrespectable +disrespecter +disrespectful +disrespectfully +disrespectfulness +disrespective +disrespondency +disrest +disrestore +disreverence +dysrhythmia +disring +disrobe +disrobed +disrobement +disrober +disrobers +disrobes +disrobing +disroof +disroost +disroot +disrooted +disrooting +disroots +disrout +disrudder +disruddered +disruly +disrump +disrupt +disruptability +disruptable +disrupted +disrupter +disrupting +disruption +disruptionist +disruptions +disruptive +disruptively +disruptiveness +disruptment +disruptor +disrupts +disrupture +diss +dissait +dissatisfaction +dissatisfactions +dissatisfactory +dissatisfactorily +dissatisfactoriness +dissatisfy +dissatisfied +dissatisfiedly +dissatisfiedness +dissatisfies +dissatisfying +dissatisfyingly +dissaturate +dissava +dissavage +dissave +dissaved +dissaves +dissaving +dissavs +disscepter +dissceptered +dissceptre +dissceptred +dissceptring +disscussive +disseason +disseat +disseated +disseating +disseats +dissect +dissected +dissectible +dissecting +dissection +dissectional +dissections +dissective +dissector +dissectors +dissects +disseise +disseised +disseisee +disseises +disseisor +disseisoress +disseize +disseized +disseizee +disseizes +disseizin +disseizor +disseizoress +disseizure +disselboom +dissemblance +dissemble +dissembled +dissembler +dissemblers +dissembles +dissembly +dissemblies +dissembling +dissemblingly +dissemilative +disseminate +disseminated +disseminates +disseminating +dissemination +disseminations +disseminative +disseminator +disseminule +dissension +dissensions +dissensious +dissensualize +dissent +dissentaneous +dissentaneousness +dissentation +dissented +dissenter +dissenterism +dissenters +dissentiate +dissentience +dissentiency +dissentient +dissentiently +dissentients +dissenting +dissentingly +dissention +dissentious +dissentiously +dissentism +dissentive +dissentment +dissents +dissepiment +dissepimental +dissert +dissertate +dissertated +dissertating +dissertation +dissertational +dissertationist +dissertations +dissertative +dissertator +disserted +disserting +disserts +disserve +disserved +disserves +disservice +disserviceable +disserviceableness +disserviceably +disservices +disserving +dissettle +dissettlement +dissever +disseverance +disseveration +dissevered +dissevering +disseverment +dissevers +disshadow +dissheathe +dissheathed +disship +disshiver +disshroud +dissidence +dissident +dissidently +dissidents +dissight +dissightly +dissilience +dissiliency +dissilient +dissilition +dissyllabic +dissyllabify +dissyllabification +dissyllabise +dissyllabised +dissyllabising +dissyllabism +dissyllabize +dissyllabized +dissyllabizing +dissyllable +dissimilar +dissimilarity +dissimilarities +dissimilarly +dissimilars +dissimilate +dissimilated +dissimilating +dissimilation +dissimilative +dissimilatory +dissimile +dissimilitude +dissymmetry +dissymmetric +dissymmetrical +dissymmetrically +dissymmettric +dissympathy +dissympathize +dissimulate +dissimulated +dissimulates +dissimulating +dissimulation +dissimulations +dissimulative +dissimulator +dissimulators +dissimule +dissimuler +dyssynergy +dyssynergia +dissinew +dissipable +dissipate +dissipated +dissipatedly +dissipatedness +dissipater +dissipaters +dissipates +dissipating +dissipation +dissipations +dissipative +dissipativity +dissipator +dissipators +dyssystole +dissite +disslander +dyssnite +dissociability +dissociable +dissociableness +dissociably +dissocial +dissociality +dissocialize +dissociant +dissociate +dissociated +dissociates +dissociating +dissociation +dissociations +dissociative +dissoconch +dyssodia +dissogeny +dissogony +dissolubility +dissoluble +dissolubleness +dissolute +dissolutely +dissoluteness +dissolution +dissolutional +dissolutionism +dissolutionist +dissolutions +dissolutive +dissolvability +dissolvable +dissolvableness +dissolvative +dissolve +dissolveability +dissolved +dissolvent +dissolver +dissolves +dissolving +dissolvingly +dissonance +dissonances +dissonancy +dissonancies +dissonant +dissonantly +dissonate +dissonous +dissoul +dissour +dysspermatism +disspirit +disspread +disspreading +disstate +dissuadable +dissuade +dissuaded +dissuader +dissuades +dissuading +dissuasion +dissuasions +dissuasive +dissuasively +dissuasiveness +dissuasory +dissue +dissuit +dissuitable +dissuited +dissunder +dissweeten +dist +distad +distaff +distaffs +distain +distained +distaining +distains +distal +distale +distalia +distally +distalwards +distance +distanced +distanceless +distances +distancy +distancing +distannic +distant +distantly +distantness +distaste +distasted +distasteful +distastefully +distastefulness +distastes +distasting +distater +distaves +dystaxia +dystaxias +dystectic +dysteleology +dysteleological +dysteleologically +dysteleologist +distelfink +distemonous +distemper +distemperance +distemperate +distemperature +distempered +distemperedly +distemperedness +distemperer +distempering +distemperment +distemperoid +distemperure +distenant +distend +distended +distendedly +distendedness +distender +distending +distends +distensibility +distensibilities +distensible +distensile +distension +distensions +distensive +distent +distention +distentions +dister +disterminate +disterr +disthene +dysthymia +dysthymic +dysthyroidism +disthrall +disthrone +disthroned +disthroning +disty +distich +distichal +distichiasis +distichlis +distichous +distichously +distichs +distil +distylar +distyle +distilery +distileries +distill +distillable +distillage +distilland +distillate +distillates +distillation +distillations +distillator +distillatory +distilled +distiller +distillery +distilleries +distillers +distilling +distillment +distillmint +distills +distilment +distils +distinct +distincter +distinctest +distinctify +distinctio +distinction +distinctional +distinctionless +distinctions +distinctity +distinctive +distinctively +distinctiveness +distinctly +distinctness +distinctor +distingu +distingue +distinguee +distinguish +distinguishability +distinguishable +distinguishableness +distinguishably +distinguished +distinguishedly +distinguisher +distinguishes +distinguishing +distinguishingly +distinguishment +distintion +distitle +distn +dystocia +dystocial +dystocias +distoclusion +distoma +distomatidae +distomatosis +distomatous +distome +dystome +distomes +distomian +distomiasis +dystomic +distomidae +dystomous +distomum +dystonia +dystonias +dystonic +dystopia +dystopian +dystopias +distort +distortable +distorted +distortedly +distortedness +distorter +distorters +distorting +distortion +distortional +distortionist +distortionless +distortions +distortive +distorts +distr +distract +distracted +distractedly +distractedness +distracter +distractibility +distractible +distractile +distracting +distractingly +distraction +distractions +distractive +distractively +distracts +distrail +distrain +distrainable +distrained +distrainee +distrainer +distraining +distrainment +distrainor +distrains +distraint +distrait +distraite +distraught +distraughted +distraughtly +distream +distress +distressed +distressedly +distressedness +distresses +distressful +distressfully +distressfulness +distressing +distressingly +distrest +distributable +distributary +distributaries +distribute +distributed +distributedly +distributee +distributer +distributes +distributing +distribution +distributional +distributionist +distributions +distributival +distributive +distributively +distributiveness +distributivity +distributor +distributors +distributorship +distributress +distributution +district +districted +districting +distriction +districtly +districts +distringas +distritbute +distritbuted +distritbutes +distritbuting +distrito +distritos +distrix +dystrophy +dystrophia +dystrophic +dystrophies +distrouble +distrouser +distruss +distrust +distrusted +distruster +distrustful +distrustfully +distrustfulness +distrusting +distrustingly +distrusts +distune +disturb +disturbance +disturbances +disturbant +disturbation +disturbative +disturbed +disturbedly +disturber +disturbers +disturbing +disturbingly +disturbor +disturbs +disturn +disturnpike +disubstituted +disubstitution +disulfate +disulfid +disulfide +disulfids +disulfiram +disulfonic +disulfoton +disulfoxid +disulfoxide +disulfuret +disulfuric +disulphate +disulphid +disulphide +disulphonate +disulphone +disulphonic +disulphoxid +disulphoxide +disulphuret +disulphuric +disunify +disunified +disunifying +disuniform +disuniformity +disunion +disunionism +disunionist +disunions +disunite +disunited +disuniter +disuniters +disunites +disunity +disunities +disuniting +dysury +dysuria +dysurias +dysuric +disusage +disusance +disuse +disused +disuses +disusing +disutility +disutilize +disvaluation +disvalue +disvalued +disvalues +disvaluing +disvantage +disvelop +disventure +disvertebrate +disvisage +disvisor +disvoice +disvouch +disvulnerability +diswarn +diswarren +diswarrened +diswarrening +diswashing +disweapon +diswench +diswere +diswit +diswont +diswood +disworkmanship +disworship +disworth +dit +dita +dital +ditali +ditalini +ditas +ditation +ditch +ditchbank +ditchbur +ditchdigger +ditchdigging +ditchdown +ditched +ditcher +ditchers +ditches +ditching +ditchless +ditchside +ditchwater +dite +diter +diterpene +ditertiary +dites +ditetragonal +ditetrahedral +dithalous +dithecal +dithecous +ditheism +ditheisms +ditheist +ditheistic +ditheistical +ditheists +dithematic +dither +dithered +ditherer +dithery +dithering +dithers +dithymol +dithiobenzoic +dithioglycol +dithioic +dithiol +dithion +dithionate +dithionic +dithionite +dithionous +dithyramb +dithyrambic +dithyrambically +dithyrambos +dithyrambs +dithyrambus +diting +dition +dytiscid +dytiscidae +dytiscus +ditokous +ditolyl +ditone +ditrematous +ditremid +ditremidae +ditrichotomous +ditriglyph +ditriglyphic +ditrigonal +ditrigonally +ditrocha +ditrochean +ditrochee +ditrochous +ditroite +dits +ditt +dittay +dittamy +dittander +dittany +dittanies +ditted +ditty +dittied +ditties +dittying +ditting +ditto +dittoed +dittoes +dittogram +dittograph +dittography +dittographic +dittoing +dittology +dittologies +ditton +dittos +diumvirate +diuranate +diureide +diureses +diuresis +diuretic +diuretical +diuretically +diureticalness +diuretics +diurn +diurna +diurnal +diurnally +diurnalness +diurnals +diurnation +diurne +diurnule +diuron +diurons +diuturnal +diuturnity +div +diva +divagate +divagated +divagates +divagating +divagation +divagational +divagationally +divagations +divagatory +divalence +divalent +divan +divans +divaporation +divariant +divaricate +divaricated +divaricately +divaricating +divaricatingly +divarication +divaricator +divas +divast +divata +dive +divebomb +dived +divekeeper +divel +divell +divelled +divellent +divellicate +divelling +diver +diverb +diverberate +diverge +diverged +divergement +divergence +divergences +divergency +divergencies +divergenge +divergent +divergently +diverges +diverging +divergingly +divers +diverse +diversely +diverseness +diversicolored +diversify +diversifiability +diversifiable +diversification +diversifications +diversified +diversifier +diversifies +diversifying +diversiflorate +diversiflorous +diversifoliate +diversifolious +diversiform +diversion +diversional +diversionary +diversionist +diversions +diversipedate +diversisporous +diversity +diversities +diversly +diversory +divert +diverted +divertedly +diverter +diverters +divertibility +divertible +diverticle +diverticula +diverticular +diverticulate +diverticulitis +diverticulosis +diverticulum +divertila +divertimenti +divertimento +divertimentos +diverting +divertingly +divertingness +divertise +divertisement +divertissant +divertissement +divertissements +divertive +divertor +diverts +dives +divest +divested +divestible +divesting +divestitive +divestiture +divestitures +divestment +divests +divesture +divet +divi +divia +divid +dividable +dividableness +dividant +divide +divided +dividedly +dividedness +dividend +dividends +dividendus +divident +divider +dividers +divides +dividing +dividingly +dividivis +dividual +dividualism +dividually +dividuity +dividuous +divinability +divinable +divinail +divination +divinations +divinator +divinatory +divine +divined +divinely +divineness +diviner +divineress +diviners +divines +divinesse +divinest +diving +divinify +divinified +divinifying +divinyl +divining +diviningly +divinisation +divinise +divinised +divinises +divinising +divinister +divinistre +divinity +divinities +divinityship +divinization +divinize +divinized +divinizes +divinizing +divisa +divise +divisi +divisibility +divisibilities +divisible +divisibleness +divisibly +division +divisional +divisionally +divisionary +divisionism +divisionist +divisionistic +divisions +divisive +divisively +divisiveness +divisor +divisory +divisorial +divisors +divisural +divorce +divorceable +divorced +divorcee +divorcees +divorcement +divorcements +divorcer +divorcers +divorces +divorceuse +divorcible +divorcing +divorcive +divort +divot +divoto +divots +dyvour +dyvours +divulgate +divulgated +divulgater +divulgating +divulgation +divulgator +divulgatory +divulge +divulged +divulgement +divulgence +divulgences +divulger +divulgers +divulges +divulging +divulse +divulsed +divulsing +divulsion +divulsive +divulsor +divus +divvers +divvy +divvied +divvies +divvying +diwan +diwani +diwans +diwata +dix +dixain +dixenite +dixy +dixie +dixiecrat +dixieland +dixies +dixit +dixits +dizain +dizaine +dizdar +dizen +dizened +dizening +dizenment +dizens +dizygotic +dizygous +dizoic +dizz +dizzard +dizzardly +dizzen +dizzy +dizzied +dizzier +dizzies +dizziest +dizzying +dizzyingly +dizzily +dizziness +dj +djagatay +djagoong +djakarta +djalmaite +djasakid +djave +djebel +djebels +djehad +djelab +djelfa +djellab +djellaba +djellabah +djellabas +djerib +djersa +djibbah +djibouti +djin +djinn +djinni +djinny +djinns +djins +djuka +dk +dkg +dkl +dkm +dks +dl +dlr +dlvy +dm +dmarche +dmod +dn +dnieper +do +doa +doab +doability +doable +doand +doarium +doat +doated +doater +doaty +doating +doatish +doats +dob +dobbed +dobber +dobbers +dobby +dobbie +dobbies +dobbin +dobbing +dobbins +dobchick +dobe +doberman +dobermans +doby +dobie +dobies +dobl +dobla +doblas +doblon +doblones +doblons +dobos +dobra +dobrao +dobras +dobroes +dobson +dobsonfly +dobsonflies +dobsons +dobule +dobzhansky +doc +docent +docents +docentship +docetae +docetic +docetically +docetism +docetist +docetistic +docetize +dochmiac +dochmiacal +dochmiasis +dochmii +dochmius +dochter +docibility +docible +docibleness +docile +docilely +docility +docilities +docimasy +docimasia +docimasies +docimastic +docimastical +docimology +docious +docity +dock +dockage +dockages +docked +docken +docker +dockers +docket +docketed +docketing +dockets +dockhand +dockhands +dockhead +dockhouse +dockyard +dockyardman +dockyards +docking +dockization +dockize +dockland +docklands +dockmackie +dockman +dockmaster +docks +dockside +docksides +dockworker +docmac +docoglossa +docoglossan +docoglossate +docosane +docosanoic +docquet +docs +doctor +doctoral +doctorally +doctorate +doctorates +doctorbird +doctordom +doctored +doctoress +doctorfish +doctorfishes +doctorhood +doctorial +doctorially +doctoring +doctorization +doctorize +doctorless +doctorly +doctorlike +doctors +doctorship +doctress +doctrinable +doctrinaire +doctrinairism +doctrinal +doctrinalism +doctrinalist +doctrinality +doctrinally +doctrinary +doctrinarian +doctrinarianism +doctrinarily +doctrinarity +doctrinate +doctrine +doctrines +doctrinism +doctrinist +doctrinization +doctrinize +doctrinized +doctrinizing +doctrix +doctus +docudrama +docudramas +document +documentable +documental +documentalist +documentary +documentarian +documentaries +documentarily +documentarist +documentation +documentational +documentations +documented +documenter +documenters +documenting +documentize +documentor +documents +dod +dodd +doddard +doddart +dodded +dodder +doddered +dodderer +dodderers +doddery +doddering +dodders +doddy +doddie +doddies +dodding +doddypoll +doddle +dode +dodecade +dodecadrachm +dodecafid +dodecagon +dodecagonal +dodecaheddra +dodecahedra +dodecahedral +dodecahedric +dodecahedron +dodecahedrons +dodecahydrate +dodecahydrated +dodecamerous +dodecanal +dodecane +dodecanesian +dodecanoic +dodecant +dodecapartite +dodecapetalous +dodecaphony +dodecaphonic +dodecaphonically +dodecaphonism +dodecaphonist +dodecarch +dodecarchy +dodecasemic +dodecasyllabic +dodecasyllable +dodecastylar +dodecastyle +dodecastylos +dodecatemory +dodecatheon +dodecatyl +dodecatylic +dodecatoic +dodecyl +dodecylene +dodecylic +dodecylphenol +dodecuplet +dodgasted +dodge +dodged +dodgeful +dodger +dodgery +dodgeries +dodgers +dodges +dodgy +dodgier +dodgiest +dodgily +dodginess +dodging +dodipole +dodkin +dodlet +dodman +dodo +dodoes +dodoism +dodoisms +dodoma +dodona +dodonaea +dodonaeaceae +dodonaean +dodonaena +dodonean +dodonian +dodos +dodrans +dodrantal +dods +dodunk +doe +doebird +doedicurus +doeg +doeglic +doegling +doek +doeling +doer +doers +does +doeskin +doeskins +doesn +doesnt +doest +doeth +doeuvre +doff +doffed +doffer +doffers +doffing +doffs +doftberry +dofunny +dog +dogal +dogana +dogaressa +dogate +dogbane +dogbanes +dogberry +dogberrydom +dogberries +dogberryism +dogbite +dogblow +dogboat +dogbody +dogbodies +dogbolt +dogbush +dogcart +dogcarts +dogcatcher +dogcatchers +dogdom +dogdoms +doge +dogear +dogeared +dogears +dogedom +dogedoms +dogey +dogeys +dogeless +doges +dogeship +dogeships +dogface +dogfaces +dogfall +dogfennel +dogfight +dogfighting +dogfights +dogfish +dogfishes +dogfoot +dogfought +dogged +doggedly +doggedness +dogger +doggerel +doggereled +doggereler +doggerelism +doggerelist +doggerelize +doggerelizer +doggerelizing +doggerelled +doggerelling +doggerels +doggery +doggeries +doggers +doggess +dogget +doggy +doggie +doggier +doggies +doggiest +dogging +doggish +doggishly +doggishness +doggle +doggo +doggone +doggoned +doggoneder +doggonedest +doggoner +doggones +doggonest +doggoning +doggrel +doggrelize +doggrels +doghead +doghearted +doghole +doghood +doghouse +doghouses +dogy +dogie +dogies +dogleg +doglegged +doglegging +doglegs +dogless +dogly +doglike +dogma +dogman +dogmas +dogmata +dogmatic +dogmatical +dogmatically +dogmaticalness +dogmatician +dogmatics +dogmatisation +dogmatise +dogmatised +dogmatiser +dogmatising +dogmatism +dogmatist +dogmatists +dogmatization +dogmatize +dogmatized +dogmatizer +dogmatizing +dogmeat +dogmen +dogmouth +dognap +dognaped +dognaper +dognapers +dognaping +dognapped +dognapper +dognapping +dognaps +dogplate +dogproof +dogra +dogrib +dogs +dogsbody +dogsbodies +dogship +dogshore +dogskin +dogsled +dogsleds +dogsleep +dogstail +dogstone +dogstones +dogtail +dogteeth +dogtie +dogtooth +dogtoothing +dogtrick +dogtrot +dogtrots +dogtrotted +dogtrotting +dogvane +dogvanes +dogwatch +dogwatches +dogwinkle +dogwood +dogwoods +doh +dohickey +dohter +doyen +doyenne +doyennes +doyens +doigt +doigte +doyle +doiled +doyley +doyleys +doily +doyly +doilies +doylies +doylt +doina +doing +doings +doyst +doit +doited +doitkin +doitrified +doits +dojigger +dojiggy +dojo +dojos +doke +doketic +doketism +dokhma +dokimastic +dokmarok +doko +dol +dola +dolabra +dolabrate +dolabre +dolabriform +dolcan +dolce +dolcemente +dolci +dolcian +dolciano +dolcinist +dolcino +dolcissimo +doldrum +doldrums +dole +doleance +doled +dolefish +doleful +dolefuller +dolefullest +dolefully +dolefulness +dolefuls +doley +dolent +dolente +dolentissimo +dolently +dolerin +dolerite +dolerites +doleritic +dolerophanite +doles +dolesman +dolesome +dolesomely +dolesomeness +doless +dolf +doli +dolia +dolichoblond +dolichocephal +dolichocephali +dolichocephaly +dolichocephalic +dolichocephalism +dolichocephalize +dolichocephalous +dolichocercic +dolichocnemic +dolichocrany +dolichocranial +dolichocranic +dolichofacial +dolichoglossus +dolichohieric +dolicholus +dolichopellic +dolichopodous +dolichoprosopic +dolichopsyllidae +dolichos +dolichosaur +dolichosauri +dolichosauria +dolichosaurus +dolichosoma +dolichostylous +dolichotmema +dolichuric +dolichurus +doliidae +dolina +doline +doling +dolioform +doliolidae +doliolum +dolisie +dolite +dolittle +dolium +doll +dollar +dollarbird +dollardee +dollardom +dollarfish +dollarfishes +dollarleaf +dollars +dollarwise +dollbeer +dolldom +dolled +dolley +dollface +dollfaced +dollfish +dollhood +dollhouse +dollhouses +dolly +dollia +dollie +dollied +dollier +dollies +dollying +dollyman +dollymen +dollin +dolliness +dolling +dollish +dollishly +dollishness +dollyway +dollmaker +dollmaking +dollop +dollops +dolls +dollship +dolman +dolmans +dolmas +dolmen +dolmenic +dolmens +dolomedes +dolomite +dolomites +dolomitic +dolomitise +dolomitised +dolomitising +dolomitization +dolomitize +dolomitized +dolomitizing +dolomization +dolomize +dolor +dolores +doloriferous +dolorific +dolorifuge +dolorimeter +dolorimetry +dolorimetric +dolorimetrically +dolorogenic +doloroso +dolorous +dolorously +dolorousness +dolors +dolos +dolose +dolour +dolours +dolous +dolph +dolphin +dolphinfish +dolphinfishes +dolphinlike +dolphins +dolphus +dols +dolt +dolthead +doltish +doltishly +doltishness +dolts +dolus +dolven +dom +domable +domage +domain +domainal +domains +domajig +domajigger +domal +domanial +domatium +domatophobia +domba +dombeya +domboc +domdaniel +dome +domed +domeykite +domelike +doment +domer +domes +domesday +domesdays +domestic +domesticability +domesticable +domesticality +domestically +domesticate +domesticated +domesticates +domesticating +domestication +domestications +domesticative +domesticator +domesticity +domesticities +domesticize +domesticized +domestics +domett +domy +domic +domical +domically +domicella +domicil +domicile +domiciled +domicilement +domiciles +domiciliar +domiciliary +domiciliate +domiciliated +domiciliating +domiciliation +domicilii +domiciling +domicils +domiculture +domify +domification +domina +dominae +dominance +dominancy +dominant +dominantly +dominants +dominate +dominated +dominates +dominating +dominatingly +domination +dominations +dominative +dominator +dominators +domine +dominee +domineer +domineered +domineerer +domineering +domineeringly +domineeringness +domineers +domines +doming +domini +dominial +dominic +dominica +dominical +dominicale +dominican +dominicans +dominick +dominicker +dominicks +dominie +dominies +dominion +dominionism +dominionist +dominions +dominique +dominium +dominiums +domino +dominoes +dominos +dominule +dominus +domitable +domite +domitian +domitic +domn +domnei +domoid +dompt +dompteuse +doms +domus +don +dona +donable +donacidae +donaciform +donack +donal +donald +donar +donary +donaries +donas +donat +donatary +donataries +donate +donated +donatee +donates +donatiaceae +donating +donatio +donation +donationes +donations +donatism +donatist +donatistic +donatistical +donative +donatively +donatives +donator +donatory +donatories +donators +donatress +donax +doncella +doncy +dondaine +dondia +dondine +done +donec +donee +donees +doney +doneness +donenesses +donet +dong +donga +donging +dongola +dongolas +dongolese +dongon +dongs +doni +donia +donicker +donis +donjon +donjons +donk +donkey +donkeyback +donkeyish +donkeyism +donkeyman +donkeymen +donkeys +donkeywork +donmeh +donn +donna +donnard +donnas +donne +donned +donnee +donnees +donnerd +donnered +donnert +donny +donnybrook +donnybrooks +donnick +donnie +donning +donnish +donnishly +donnishness +donnism +donnock +donnot +donor +donors +donorship +donought +donovan +dons +donship +donsy +donsie +donsky +dont +donum +donut +donuts +donzel +donzella +donzels +doo +doob +doocot +doodab +doodad +doodads +doodah +doodia +doodle +doodlebug +doodled +doodler +doodlers +doodles +doodlesack +doodling +doodskop +doohickey +doohickeys +doohickus +doohinkey +doohinkus +dooja +dook +dooket +dookit +dool +doolee +doolees +dooley +doolfu +dooli +dooly +doolie +doolies +doom +doomage +doombook +doomed +doomer +doomful +doomfully +doomfulness +dooming +doomlike +dooms +doomsayer +doomsday +doomsdays +doomsman +doomstead +doomster +doomsters +doomwatcher +doon +dooputty +door +doorba +doorbell +doorbells +doorboy +doorbrand +doorcase +doorcheek +doored +doorframe +doorhawk +doorhead +dooryard +dooryards +dooring +doorjamb +doorjambs +doorkeep +doorkeeper +doorknob +doorknobs +doorless +doorlike +doormaid +doormaker +doormaking +doorman +doormat +doormats +doormen +doornail +doornails +doornboom +doorpiece +doorplate +doorplates +doorpost +doorposts +doors +doorsill +doorsills +doorstead +doorstep +doorsteps +doorstone +doorstop +doorstops +doorway +doorways +doorward +doorweed +doorwise +doover +dooxidize +doozer +doozers +doozy +doozies +dop +dopa +dopamelanin +dopamine +dopaminergic +dopamines +dopant +dopants +dopaoxidase +dopas +dopatta +dopchick +dope +dopebook +doped +dopehead +dopey +doper +dopers +dopes +dopesheet +dopester +dopesters +dopy +dopier +dopiest +dopiness +dopinesses +doping +dopped +doppelganger +doppelkummel +dopper +dopperbird +doppia +dopping +doppio +doppler +dopplerite +dopster +dor +dora +dorab +dorad +doradidae +doradilla +dorado +dorados +doray +doralium +doraphobia +dorask +doraskean +dorbeetle +dorbel +dorbie +dorbug +dorbugs +dorcas +dorcastry +dorcatherium +dorcopsis +doree +dorey +dorestane +dorhawk +dorhawks +dori +dory +doria +dorian +doryanthes +doric +dorical +doricism +doricize +dorididae +dories +dorylinae +doryline +doryman +dorymen +dorine +doryphoros +doryphorus +dorippid +doris +dorism +dorize +dorje +dorking +dorlach +dorlot +dorm +dormancy +dormancies +dormant +dormantly +dormer +dormered +dormers +dormette +dormeuse +dormy +dormice +dormie +dormient +dormilona +dormin +dormins +dormitary +dormition +dormitive +dormitory +dormitories +dormmice +dormouse +dorms +dorn +dorneck +dornecks +dornic +dornick +dornicks +dornock +dornocks +dorobo +doronicum +dorosacral +doroscentral +dorosoma +dorosternal +dorothea +dorothy +dorp +dorper +dorpers +dorps +dorr +dorrbeetle +dorrs +dors +dorsa +dorsabdominal +dorsabdominally +dorsad +dorsal +dorsale +dorsales +dorsalgia +dorsalis +dorsally +dorsalmost +dorsals +dorsalward +dorsalwards +dorse +dorsel +dorser +dorsers +dorsi +dorsibranch +dorsibranchiata +dorsibranchiate +dorsicollar +dorsicolumn +dorsicommissure +dorsicornu +dorsiduct +dorsiferous +dorsifixed +dorsiflex +dorsiflexion +dorsiflexor +dorsigerous +dorsigrade +dorsilateral +dorsilumbar +dorsimedian +dorsimesal +dorsimeson +dorsiparous +dorsipinal +dorsispinal +dorsiventral +dorsiventrality +dorsiventrally +dorsoabdominal +dorsoanterior +dorsoapical +dorsobranchiata +dorsocaudad +dorsocaudal +dorsocentral +dorsocephalad +dorsocephalic +dorsocervical +dorsocervically +dorsodynia +dorsoepitrochlear +dorsointercostal +dorsointestinal +dorsolateral +dorsolum +dorsolumbar +dorsomedial +dorsomedian +dorsomesal +dorsonasal +dorsonuchal +dorsopleural +dorsoposteriad +dorsoposterior +dorsoradial +dorsosacral +dorsoscapular +dorsosternal +dorsothoracic +dorsoventrad +dorsoventral +dorsoventrality +dorsoventrally +dorstenia +dorsula +dorsulum +dorsum +dorsumbonal +dort +dorter +dorty +dortiness +dortiship +dortour +dorts +doruck +dos +dosa +dosadh +dosage +dosages +dosain +dose +dosed +doser +dosers +doses +dosimeter +dosimeters +dosimetry +dosimetric +dosimetrician +dosimetries +dosimetrist +dosing +dosinia +dosiology +dosis +dositheans +dosology +doss +dossal +dossals +dossed +dossel +dossels +dossennus +dosser +dosseret +dosserets +dossers +dosses +dossety +dosshouse +dossy +dossier +dossiere +dossiers +dossil +dossils +dossing +dossman +dossmen +dost +dostoevsky +dot +dotage +dotages +dotal +dotant +dotard +dotardy +dotardism +dotardly +dotards +dotarie +dotate +dotation +dotations +dotchin +dote +doted +doter +doters +dotes +doth +dother +dothideacea +dothideaceous +dothideales +dothidella +dothienenteritis +dothiorella +doty +dotier +dotiest +dotiness +doting +dotingly +dotingness +dotish +dotishness +dotkin +dotless +dotlet +dotlike +doto +dotonidae +dotriacontane +dots +dottard +dotted +dottedness +dottel +dottels +dotter +dotterel +dotterels +dotters +dotty +dottier +dottiest +dottily +dottiness +dotting +dottle +dottled +dottler +dottles +dottling +dottore +dottrel +dottrels +douane +douanes +douanier +douar +doub +double +doubled +doubledamn +doubleganger +doublegear +doublehanded +doublehandedly +doublehandedness +doublehatching +doubleheader +doubleheaders +doublehearted +doubleheartedness +doublehorned +doublehung +doubleyou +doubleleaf +doublelunged +doubleness +doubleprecision +doubler +doublers +doubles +doublespeak +doublet +doubleted +doublethink +doublethinking +doublethought +doubleton +doubletone +doubletree +doublets +doublette +doublewidth +doubleword +doublewords +doubly +doubling +doubloon +doubloons +doublure +doublures +doubt +doubtable +doubtably +doubtance +doubted +doubtedly +doubter +doubters +doubtful +doubtfully +doubtfulness +doubty +doubting +doubtingly +doubtingness +doubtless +doubtlessly +doubtlessness +doubtmonger +doubtous +doubts +doubtsome +douc +douce +doucely +douceness +doucepere +doucet +douceur +douceurs +douche +douched +douches +douching +doucin +doucine +doucker +doudle +doug +dough +doughbelly +doughbellies +doughbird +doughboy +doughboys +doughface +doughfaceism +doughfeet +doughfoot +doughfoots +doughhead +doughy +doughier +doughiest +doughiness +doughlike +doughmaker +doughmaking +doughman +doughmen +doughnut +doughnuts +doughs +dought +doughty +doughtier +doughtiest +doughtily +doughtiness +dougl +douglas +doukhobor +doulce +doulocracy +doum +douma +doumaist +doumas +doundake +doup +douper +douping +doupion +doupioni +douppioni +dour +doura +dourade +dourah +dourahs +douras +dourer +dourest +douricouli +dourine +dourines +dourly +dourness +dournesses +douroucouli +douse +doused +douser +dousers +douses +dousing +dout +douter +doutous +douvecot +doux +douzaine +douzaines +douzainier +douzeper +douzepers +douzieme +douziemes +dove +dovecot +dovecote +dovecotes +dovecots +doveflower +dovefoot +dovehouse +dovey +dovekey +dovekeys +dovekie +dovekies +dovelet +dovelike +dovelikeness +doveling +doven +dovened +dovening +dovens +dover +doves +dovetail +dovetailed +dovetailer +dovetailing +dovetails +dovetailwise +doveweed +dovewood +dovyalis +dovish +dovishness +dow +dowable +dowage +dowager +dowagerism +dowagers +dowcet +dowcote +dowd +dowdy +dowdier +dowdies +dowdiest +dowdyish +dowdyism +dowdily +dowdiness +dowed +dowel +doweled +doweling +dowelled +dowelling +dowels +dower +doweral +dowered +doweress +dowery +doweries +dowering +dowerless +dowers +dowf +dowfart +dowhacky +dowy +dowie +dowieism +dowieite +dowily +dowiness +dowing +dowitch +dowitcher +dowitchers +dowl +dowlas +dowless +dowly +dowment +down +downbear +downbeard +downbeat +downbeats +downbend +downbent +downby +downbye +downcast +downcastly +downcastness +downcasts +downcome +downcomer +downcomes +downcoming +downcourt +downcry +downcried +downcrying +downcurve +downcurved +downcut +downdale +downdraft +downdraught +downed +downer +downers +downface +downfall +downfallen +downfalling +downfalls +downfeed +downfield +downflow +downfold +downfolded +downgate +downgyved +downgoing +downgone +downgrade +downgraded +downgrades +downgrading +downgrowth +downhanging +downhaul +downhauls +downheaded +downhearted +downheartedly +downheartedness +downhill +downhills +downy +downier +downiest +downily +downiness +downing +downingia +downland +downless +downlie +downlier +downligging +downlying +downlike +downline +downlink +downlinked +downlinking +downlinks +download +downloadable +downloaded +downloading +downloads +downlooked +downlooker +downmost +downness +downpipe +downplay +downplayed +downplaying +downplays +downpour +downpouring +downpours +downrange +downright +downrightly +downrightness +downriver +downrush +downrushing +downs +downset +downshare +downshift +downshifted +downshifting +downshifts +downshore +downside +downsinking +downsitting +downsize +downsized +downsizes +downsizing +downslide +downsliding +downslip +downslope +downsman +downsome +downspout +downstage +downstair +downstairs +downstate +downstater +downsteepy +downstream +downstreet +downstroke +downstrokes +downswing +downswings +downtake +downthrow +downthrown +downthrust +downtime +downtimes +downton +downtown +downtowner +downtowns +downtrampling +downtreading +downtrend +downtrends +downtrod +downtrodden +downtroddenness +downturn +downturned +downturns +downway +downward +downwardly +downwardness +downwards +downwarp +downwash +downweed +downweigh +downweight +downweighted +downwind +downwith +dowp +dowress +dowry +dowries +dows +dowsabel +dowsabels +dowse +dowsed +dowser +dowsers +dowses +dowset +dowsets +dowsing +dowve +doxa +doxantha +doxastic +doxasticon +doxy +doxycycline +doxie +doxies +doxographer +doxography +doxographical +doxology +doxological +doxologically +doxologies +doxologize +doxologized +doxologizing +doz +doze +dozed +dozen +dozened +dozener +dozening +dozens +dozent +dozenth +dozenths +dozer +dozers +dozes +dozy +dozier +doziest +dozily +doziness +dozinesses +dozing +dozzle +dozzled +dp +dpt +dr +drab +draba +drabant +drabbed +drabber +drabbest +drabbet +drabbets +drabby +drabbing +drabbish +drabble +drabbled +drabbler +drabbles +drabbletail +drabbletailed +drabbling +drabler +drably +drabness +drabnesses +drabs +dracaena +dracaenaceae +dracaenas +drachen +drachm +drachma +drachmae +drachmai +drachmal +drachmas +drachms +dracin +dracma +draco +dracocephalum +dracone +draconian +draconianism +draconic +draconically +draconid +draconin +draconis +draconism +draconites +draconitic +dracontian +dracontiasis +dracontic +dracontine +dracontites +dracontium +dracunculus +drad +dradge +draegerman +draegermen +draff +draffy +draffier +draffiest +draffish +draffman +draffs +draffsack +draft +draftable +draftage +drafted +draftee +draftees +drafter +drafters +drafty +draftier +draftiest +draftily +draftiness +drafting +draftings +draftman +draftmanship +draftproof +drafts +draftsman +draftsmanship +draftsmen +draftsperson +draftswoman +draftswomanship +draftwoman +drag +dragade +dragaded +dragading +dragbar +dragboat +dragbolt +dragee +dragees +drageoir +dragged +dragger +draggers +draggy +draggier +draggiest +draggily +dragginess +dragging +draggingly +draggle +draggled +draggles +draggletail +draggletailed +draggletailedly +draggletailedness +draggly +draggling +draghound +dragline +draglines +dragman +dragnet +dragnets +drago +dragoman +dragomanate +dragomanic +dragomanish +dragomans +dragomen +dragon +dragonade +dragonesque +dragoness +dragonet +dragonets +dragonfish +dragonfishes +dragonfly +dragonflies +dragonhead +dragonhood +dragonish +dragonism +dragonize +dragonkind +dragonlike +dragonnade +dragonne +dragonroot +dragons +dragontail +dragonwort +dragoon +dragoonable +dragoonade +dragoonage +dragooned +dragooner +dragooning +dragoons +dragrope +dragropes +drags +dragsaw +dragsawing +dragshoe +dragsman +dragsmen +dragstaff +dragster +dragsters +drahthaar +dray +drayage +drayages +drayed +drayhorse +draying +drail +drailed +drailing +drails +drayman +draymen +drain +drainable +drainage +drainages +drainageway +drainboard +draine +drained +drainer +drainerman +drainermen +drainers +drainfield +draining +drainless +drainman +drainpipe +drainpipes +drains +drainspout +draintile +drainway +drays +draisene +draisine +drake +drakefly +drakelet +drakes +drakestone +drakonite +dram +drama +dramalogue +dramamine +dramas +dramatic +dramatical +dramatically +dramaticism +dramaticle +dramatics +dramaticule +dramatis +dramatisable +dramatise +dramatised +dramatiser +dramatising +dramatism +dramatist +dramatists +dramatizable +dramatization +dramatizations +dramatize +dramatized +dramatizer +dramatizes +dramatizing +dramaturge +dramaturgy +dramaturgic +dramaturgical +dramaturgically +dramaturgist +drame +dramm +drammach +drammage +dramme +drammed +drammer +dramming +drammock +drammocks +drams +dramseller +dramshop +dramshops +drang +drank +drant +drapability +drapable +draparnaldia +drape +drapeability +drapeable +draped +draper +draperess +drapery +draperied +draperies +drapers +drapes +drapet +drapetomania +draping +drapping +drassid +drassidae +drastic +drastically +drat +dratchell +drate +drats +dratted +dratting +draught +draughtboard +draughted +draughter +draughthouse +draughty +draughtier +draughtiest +draughtily +draughtiness +draughting +draughtman +draughtmanship +draughts +draughtsboard +draughtsman +draughtsmanship +draughtsmen +draughtswoman +draughtswomanship +drave +dravya +dravida +dravidian +dravidic +dravite +draw +drawability +drawable +drawarm +drawback +drawbacks +drawbar +drawbars +drawbeam +drawbench +drawboard +drawboy +drawbolt +drawbore +drawbored +drawbores +drawboring +drawbridge +drawbridges +drawcansir +drawcard +drawcut +drawdown +drawdowns +drawee +drawees +drawer +drawerful +drawers +drawfile +drawfiling +drawgate +drawgear +drawglove +drawhead +drawhorse +drawing +drawings +drawk +drawknife +drawknives +drawknot +drawl +drawlatch +drawled +drawler +drawlers +drawly +drawlier +drawliest +drawling +drawlingly +drawlingness +drawlink +drawloom +drawls +drawn +drawnet +drawnly +drawnness +drawnwork +drawoff +drawout +drawplate +drawpoint +drawrod +draws +drawshave +drawsheet +drawspan +drawspring +drawstop +drawstring +drawstrings +drawtongs +drawtube +drawtubes +drazel +drch +dread +dreadable +dreaded +dreader +dreadful +dreadfully +dreadfulness +dreadfuls +dreading +dreadingly +dreadless +dreadlessly +dreadlessness +dreadly +dreadlocks +dreadnaught +dreadness +dreadnought +dreadnoughts +dreads +dream +dreamage +dreamboat +dreamed +dreamer +dreamery +dreamers +dreamful +dreamfully +dreamfulness +dreamhole +dreamy +dreamier +dreamiest +dreamily +dreaminess +dreaming +dreamingful +dreamingly +dreamish +dreamland +dreamless +dreamlessly +dreamlessness +dreamlet +dreamlike +dreamlikeness +dreamlit +dreamlore +dreams +dreamscape +dreamsy +dreamsily +dreamsiness +dreamt +dreamtide +dreamtime +dreamwhile +dreamwise +dreamworld +drear +drearfully +dreary +drearier +drearies +dreariest +drearihead +drearily +dreariment +dreariness +drearing +drearisome +drearisomely +drearisomeness +drearly +drearness +dreche +dreck +drecks +dredge +dredged +dredgeful +dredger +dredgers +dredges +dredging +dredgings +dree +dreed +dreegh +dreeing +dreep +dreepy +dreepiness +drees +dreg +dreggy +dreggier +dreggiest +dreggily +dregginess +dreggish +dregless +dregs +drey +dreich +dreidel +dreidels +dreidl +dreidls +dreyfusism +dreyfusist +dreigh +dreikanter +dreikanters +dreiling +dreint +dreynt +dreissensia +dreissiger +drek +dreks +drench +drenched +drencher +drenchers +drenches +drenching +drenchingly +dreng +drengage +drengh +drent +drepanaspis +drepane +drepania +drepanid +drepanidae +drepanididae +drepaniform +drepanis +drepanium +drepanoid +dreparnaudia +dresden +dress +dressage +dressages +dressed +dresser +dressers +dressership +dresses +dressy +dressier +dressiest +dressily +dressiness +dressing +dressings +dressline +dressmake +dressmaker +dressmakery +dressmakers +dressmakership +dressmaking +dressoir +dressoirs +drest +dretch +drevel +drew +drewite +dry +dryable +dryad +dryades +dryadetum +dryadic +dryads +drias +dryas +dryasdust +drib +dribbed +dribber +dribbet +dribbing +dribble +dribbled +dribblement +dribbler +dribblers +dribbles +dribblet +dribblets +dribbling +drybeard +driblet +driblets +drybrained +drybrush +dribs +drycoal +dridder +driddle +drydenian +drydenism +drie +driech +dried +driegh +drier +dryer +drierman +dryerman +dryermen +driers +dryers +dries +driest +dryest +dryfarm +dryfarmer +dryfat +dryfist +dryfoot +drift +driftage +driftages +driftbolt +drifted +drifter +drifters +driftfish +driftfishes +drifty +driftier +driftiest +drifting +driftingly +driftland +driftless +driftlessness +driftlet +driftman +driftpiece +driftpin +driftpins +drifts +driftway +driftweed +driftwind +driftwood +drighten +drightin +drygoodsman +dryhouse +drying +dryinid +dryish +drily +dryly +drill +drillability +drillable +drillbit +drilled +driller +drillers +drillet +drilling +drillings +drillman +drillmaster +drillmasters +drills +drillstock +drylot +drylots +drilvis +drimys +drynaria +dryness +drynesses +dringle +drink +drinkability +drinkable +drinkableness +drinkables +drinkably +drinker +drinkery +drinkers +drinky +drinking +drinkless +drinkproof +drinks +drinn +dryobalanops +dryope +dryopes +dryophyllum +dryopians +dryopithecid +dryopithecinae +dryopithecine +dryopithecus +dryops +dryopteris +dryopteroid +drip +dripless +drypoint +drypoints +dripolator +drippage +dripped +dripper +drippers +drippy +drippier +drippiest +dripping +drippings +dripple +dripproof +drips +dripstick +dripstone +dript +dryrot +drys +drysalter +drysaltery +drysalteries +drisheen +drisk +drysne +drissel +dryster +dryth +drivable +drivage +drive +driveable +driveaway +driveboat +drivebolt +drivecap +drivehead +drivel +driveled +driveler +drivelers +driveline +driveling +drivelingly +drivelled +driveller +drivellers +drivelling +drivellingly +drivels +driven +drivenness +drivepipe +driver +driverless +drivers +drivership +drives +drivescrew +driveway +driveways +drivewell +driving +drivingly +drywall +drywalls +dryworker +drizzle +drizzled +drizzles +drizzly +drizzlier +drizzliest +drizzling +drizzlingly +drochuil +droddum +drof +drofland +droger +drogerman +drogermen +drogh +drogher +drogherman +droghlin +drogoman +drogue +drogues +droguet +droh +droich +droil +droyl +droit +droits +droitsman +droitural +droiture +droiturel +drokpa +drolerie +droll +drolled +droller +drollery +drolleries +drollest +drolly +drolling +drollingly +drollish +drollishness +drollist +drollness +drolls +drolushness +dromaeognathae +dromaeognathism +dromaeognathous +dromaeus +drome +dromed +dromedary +dromedarian +dromedaries +dromedarist +drometer +dromiacea +dromic +dromical +dromiceiidae +dromiceius +dromicia +dromioid +dromograph +dromoi +dromomania +dromometer +dromon +dromond +dromonds +dromons +dromophobia +dromornis +dromos +dromotropic +drona +dronage +drone +droned +dronel +dronepipe +droner +droners +drones +dronet +drongo +drongos +drony +droning +droningly +dronish +dronishly +dronishness +dronkelew +dronkgrass +dronte +droob +drool +drooled +drooly +droolier +drooliest +drooling +drools +droop +drooped +drooper +droopy +droopier +droopiest +droopily +droopiness +drooping +droopingly +droopingness +droops +droopt +drop +dropax +dropberry +dropcloth +dropflower +dropforge +dropforged +dropforger +dropforging +drophead +dropheads +dropkick +dropkicker +dropkicks +droplet +droplets +droplight +droplike +dropline +dropling +dropman +dropmeal +dropout +dropouts +droppage +dropped +dropper +dropperful +droppers +droppy +dropping +droppingly +droppings +drops +dropseed +dropshot +dropshots +dropsy +dropsical +dropsically +dropsicalness +dropsied +dropsies +dropsywort +dropsonde +dropt +dropvie +dropwise +dropworm +dropwort +dropworts +droschken +drosera +droseraceae +droseraceous +droseras +droshky +droshkies +drosky +droskies +drosograph +drosometer +drosophila +drosophilae +drosophilas +drosophilidae +drosophyllum +dross +drossed +drossel +drosser +drosses +drossy +drossier +drossiest +drossiness +drossing +drossless +drostden +drostdy +drou +droud +droughermen +drought +droughty +droughtier +droughtiest +droughtiness +droughts +drouk +droukan +drouked +drouket +drouking +droukit +drouks +droumy +drouth +drouthy +drouthier +drouthiest +drouthiness +drouths +drove +droved +drover +drovers +droves +drovy +droving +drow +drown +drownd +drownded +drownding +drownds +drowned +drowner +drowners +drowning +drowningly +drownings +drownproofing +drowns +drowse +drowsed +drowses +drowsy +drowsier +drowsiest +drowsihead +drowsihood +drowsily +drowsiness +drowsing +drowte +drub +drubbed +drubber +drubbers +drubbing +drubbings +drubble +drubbly +drubly +drubs +drucken +drudge +drudged +drudger +drudgery +drudgeries +drudgers +drudges +drudging +drudgingly +drudgism +druery +druffen +drug +drugeteria +drugge +drugged +drugger +druggery +druggeries +drugget +druggeting +druggets +druggy +druggier +druggiest +drugging +druggist +druggister +druggists +drugless +drugmaker +drugman +drugs +drugshop +drugstore +drugstores +druid +druidess +druidesses +druidic +druidical +druidism +druidisms +druidology +druidry +druids +druith +drukpa +drum +drumbeat +drumbeater +drumbeating +drumbeats +drumble +drumbled +drumbledore +drumbler +drumbles +drumbling +drumfire +drumfires +drumfish +drumfishes +drumhead +drumheads +drumler +drumly +drumlier +drumliest +drumlike +drumlin +drumline +drumlinoid +drumlins +drumloid +drumloidal +drummed +drummer +drummers +drummy +drumming +drummock +drumread +drumreads +drumroll +drumrolls +drums +drumskin +drumslade +drumsler +drumstick +drumsticks +drumwood +drung +drungar +drunk +drunkard +drunkards +drunkelew +drunken +drunkeness +drunkenly +drunkenness +drunkensome +drunkenwise +drunker +drunkery +drunkeries +drunkest +drunkly +drunkometer +drunks +drunt +drupa +drupaceae +drupaceous +drupal +drupe +drupel +drupelet +drupelets +drupeole +drupes +drupetum +drupiferous +drupose +drury +druse +drusean +drused +drusedom +druses +drusy +druther +druthers +druttle +druxey +druxy +druxiness +druze +ds +dschubba +dsect +dsects +dsname +dsnames +dsp +dsr +dsri +dt +dtd +dtente +dtset +du +duad +duadic +duads +dual +duala +duali +dualin +dualism +dualisms +dualist +dualistic +dualistically +dualists +duality +dualities +dualization +dualize +dualized +dualizes +dualizing +dually +dualmutef +dualogue +duals +duan +duane +duant +duarch +duarchy +duarchies +dub +dubash +dubb +dubba +dubbah +dubbed +dubbeh +dubbeltje +dubber +dubbers +dubby +dubbin +dubbing +dubbings +dubbins +dubhe +dubhgall +dubiety +dubieties +dubio +dubiocrystalline +dubiosity +dubiosities +dubious +dubiously +dubiousness +dubitable +dubitably +dubitancy +dubitant +dubitante +dubitate +dubitatingly +dubitation +dubitative +dubitatively +dublin +duboisia +duboisin +duboisine +dubonnet +dubonnets +dubs +duc +ducal +ducally +ducamara +ducape +ducat +ducato +ducaton +ducatoon +ducats +ducatus +ducdame +duce +duces +duchan +duchery +duchesnea +duchess +duchesse +duchesses +duchesslike +duchy +duchies +duci +duck +duckbill +duckbills +duckblind +duckboard +duckboards +duckboat +ducked +ducker +duckery +duckeries +duckers +duckfoot +duckfooted +duckhearted +duckhood +duckhouse +duckhunting +ducky +duckie +duckier +duckies +duckiest +ducking +duckish +ducklar +ducklet +duckling +ducklings +ducklingship +duckmeat +duckmole +duckpin +duckpins +duckpond +ducks +duckstone +ducktail +ducktails +duckweed +duckweeds +duckwheat +duckwife +duckwing +duco +ducs +duct +ductal +ducted +ductibility +ductible +ductile +ductilely +ductileness +ductilimeter +ductility +ductilize +ductilized +ductilizing +ducting +ductings +duction +ductless +ductor +ducts +ductule +ductules +ducture +ductus +ductwork +ducula +duculinae +dud +dudaim +dudder +duddery +duddy +duddie +duddies +duddle +dude +dudeen +dudeens +dudelsack +dudes +dudgen +dudgeon +dudgeons +dudine +dudish +dudishly +dudishness +dudism +dudley +dudleya +dudleyite +dudler +dudman +duds +due +duecentist +duecento +duecentos +dueful +duel +dueled +dueler +duelers +dueling +duelist +duelistic +duelists +duelled +dueller +duellers +duelli +duelling +duellist +duellistic +duellists +duellize +duello +duellos +duels +duenas +duende +duendes +dueness +duenesses +duenna +duennadom +duennas +duennaship +duer +dues +duessa +duet +duets +duetted +duetting +duettino +duettist +duettists +duetto +duff +duffadar +duffed +duffel +duffels +duffer +dufferdom +duffers +duffy +duffies +duffing +duffle +duffles +duffs +dufoil +dufrenite +dufrenoysite +dufter +dufterdar +duftery +duftite +duftry +dug +dugal +dugdug +dugento +duggler +dugong +dugongidae +dugongs +dugout +dugouts +dugs +dugway +duhat +duhr +dui +duiker +duyker +duikerbok +duikerboks +duikerbuck +duikers +duim +duinhewassel +duit +duits +dujan +duka +duke +dukedom +dukedoms +dukely +dukeling +dukery +dukes +dukeship +dukhn +dukhobor +dukker +dukkeripen +dukkha +dukuma +dulanganes +dulat +dulbert +dulc +dulcamara +dulcarnon +dulce +dulcely +dulceness +dulcet +dulcetly +dulcetness +dulcets +dulcian +dulciana +dulcianas +dulcid +dulcify +dulcification +dulcified +dulcifies +dulcifying +dulcifluous +dulcigenic +dulciloquent +dulciloquy +dulcimer +dulcimers +dulcimore +dulcin +dulcinea +dulcineas +dulcinist +dulcite +dulcity +dulcitol +dulcitude +dulcor +dulcorate +dulcose +duledge +duler +duly +dulia +dulias +dull +dullard +dullardism +dullardness +dullards +dullbrained +dulled +duller +dullery +dullest +dullhead +dullhearted +dully +dullify +dullification +dulling +dullish +dullishly +dullity +dullness +dullnesses +dullpate +dulls +dullsome +dullsville +dulness +dulnesses +dulocracy +dulosis +dulotic +dulse +dulseman +dulses +dult +dultie +duluth +dulwilly +dum +duma +dumaist +dumas +dumb +dumba +dumbbell +dumbbeller +dumbbells +dumbcow +dumbed +dumber +dumbest +dumbfish +dumbfound +dumbfounded +dumbfounder +dumbfounderment +dumbfounding +dumbfoundment +dumbhead +dumbheaded +dumby +dumbing +dumble +dumbledore +dumbly +dumbness +dumbnesses +dumbs +dumbstricken +dumbstruck +dumbwaiter +dumbwaiters +dumdum +dumdums +dumetose +dumfound +dumfounded +dumfounder +dumfounderment +dumfounding +dumfounds +dumka +dumky +dummel +dummered +dummerer +dummy +dummied +dummies +dummying +dummyism +dumminess +dummyweed +dummkopf +dummkopfs +dumontia +dumontiaceae +dumontite +dumortierite +dumose +dumosity +dumous +dump +dumpage +dumpcart +dumpcarts +dumped +dumper +dumpers +dumpfile +dumpy +dumpier +dumpies +dumpiest +dumpily +dumpiness +dumping +dumpings +dumpish +dumpishly +dumpishness +dumple +dumpled +dumpler +dumpling +dumplings +dumpoke +dumps +dumpty +dumsola +dun +dunair +dunal +dunamis +dunbird +duncan +dunce +duncedom +duncehood +duncery +dunces +dunch +dunches +dunciad +duncical +duncify +duncifying +duncish +duncishly +duncishness +dundasite +dundavoe +dundee +dundees +dunder +dunderbolt +dunderfunk +dunderhead +dunderheaded +dunderheadedness +dunderheads +dunderpate +dunderpates +dundreary +dundrearies +dune +duneland +dunelands +dunelike +dunes +dunfish +dung +dungan +dungannonite +dungaree +dungarees +dungari +dungas +dungbeck +dungbird +dungbred +dunged +dungeon +dungeoner +dungeonlike +dungeons +dunger +dunghill +dunghilly +dunghills +dungy +dungyard +dungier +dungiest +dunging +dungol +dungon +dungs +duny +duniewassal +dunite +dunites +dunitic +duniwassal +dunk +dunkadoo +dunkard +dunked +dunker +dunkers +dunking +dunkirk +dunkirker +dunkle +dunkled +dunkling +dunks +dunlap +dunlin +dunlins +dunlop +dunnage +dunnaged +dunnages +dunnaging +dunnakin +dunne +dunned +dunner +dunness +dunnesses +dunnest +dunny +dunniewassel +dunning +dunnish +dunnite +dunnites +dunno +dunnock +dunpickle +duns +dunst +dunstable +dunster +dunstone +dunt +dunted +dunter +dunting +duntle +dunts +dunziekte +duo +duocosane +duodecagon +duodecahedral +duodecahedron +duodecane +duodecastyle +duodecennial +duodecillion +duodecillions +duodecillionth +duodecimal +duodecimality +duodecimally +duodecimals +duodecimfid +duodecimo +duodecimole +duodecimomos +duodecimos +duodecuple +duodedena +duodedenums +duodena +duodenal +duodenary +duodenas +duodenate +duodenation +duodene +duodenectomy +duodenitis +duodenocholangitis +duodenocholecystostomy +duodenocholedochotomy +duodenocystostomy +duodenoenterostomy +duodenogram +duodenojejunal +duodenojejunostomy +duodenojejunostomies +duodenopancreatectomy +duodenoscopy +duodenostomy +duodenotomy +duodenum +duodenums +duodial +duodynatron +duodiode +duodiodepentode +duodrama +duograph +duogravure +duole +duoliteral +duolog +duologs +duologue +duologues +duomachy +duomi +duomo +duomos +duopod +duopoly +duopolies +duopolist +duopolistic +duopsony +duopsonies +duopsonistic +duos +duosecant +duotype +duotone +duotoned +duotones +duotriacontane +duotriode +duoviri +dup +dupability +dupable +dupatta +dupe +duped +dupedom +duper +dupery +duperies +dupers +dupes +duping +dupion +dupioni +dupla +duplation +duple +duplet +duplex +duplexed +duplexer +duplexers +duplexes +duplexing +duplexity +duplexs +duply +duplicability +duplicable +duplicand +duplicando +duplicate +duplicated +duplicately +duplicates +duplicating +duplication +duplications +duplicative +duplicator +duplicators +duplicature +duplicatus +duplicia +duplicident +duplicidentata +duplicidentate +duplicious +duplicipennate +duplicitas +duplicity +duplicities +duplicitous +duplicitously +duplify +duplification +duplified +duplifying +duplon +duplone +dupondidii +dupondii +dupondius +duppa +dupped +dupper +duppy +duppies +dupping +dups +dur +dura +durability +durabilities +durable +durableness +durables +durably +duracine +durain +dural +duralumin +duramater +duramatral +duramen +duramens +durance +durances +durandarte +durangite +durango +durani +durant +duranta +durante +duraplasty +duraquara +duras +duraspinalis +duration +durational +durationless +durations +durative +duratives +durax +durbachite +durban +durbar +durbars +durdenite +durdum +dure +dured +duree +dureful +durene +durenol +dureresque +dures +duress +duresses +duressor +duret +duretto +durezza +durgah +durgan +durgen +durham +durian +durians +duricrust +duridine +duryl +durindana +during +duringly +durio +duryodhana +durion +durions +durity +durmast +durmasts +durn +durndest +durned +durneder +durnedest +durning +durns +duro +duroc +durocs +duroy +durometer +duroquinone +duros +durous +durr +durra +durras +durry +durrie +durries +durrin +durrs +durst +durukuli +durum +durums +durwan +durwaun +durzada +durzee +durzi +dusack +duscle +dusenwind +dush +dusio +dusk +dusked +dusken +dusky +duskier +duskiest +duskily +duskiness +dusking +duskingtide +duskish +duskishly +duskishness +duskly +duskness +dusks +dusserah +dust +dustband +dustbin +dustbins +dustblu +dustbox +dustcart +dustcloth +dustcloths +dustcoat +dustcover +dusted +dustee +duster +dusterman +dustermen +dusters +dustfall +dustheap +dustheaps +dusty +dustier +dustiest +dustyfoot +dustily +dustin +dustiness +dusting +dustless +dustlessness +dustlike +dustman +dustmen +dustoor +dustoori +dustour +dustpan +dustpans +dustpoint +dustproof +dustrag +dustrags +dusts +dustsheet +duststorm +dusttight +dustuck +dustuk +dustup +dustups +dustwoman +dusun +dutch +dutched +dutcher +dutchess +dutchy +dutchify +dutching +dutchman +dutchmen +duteous +duteously +duteousness +duty +dutiability +dutiable +dutied +duties +dutiful +dutifully +dutifulness +dutymonger +dutra +dutuburi +duumvir +duumviral +duumvirate +duumviri +duumvirs +duvet +duvetyn +duvetine +duvetyne +duvetines +duvetynes +duvetyns +dux +duxelles +duxes +dvaita +dvandva +dvigu +dvorak +dvornik +dwayberry +dwaible +dwaibly +dwayne +dwale +dwalm +dwamish +dwang +dwarf +dwarfed +dwarfer +dwarfest +dwarfy +dwarfing +dwarfish +dwarfishly +dwarfishness +dwarfism +dwarfisms +dwarflike +dwarfling +dwarfness +dwarfs +dwarves +dweeble +dwell +dwelled +dweller +dwellers +dwelling +dwellings +dwells +dwelt +dwight +dwyka +dwindle +dwindled +dwindlement +dwindles +dwindling +dwine +dwined +dwines +dwining +dwt +dx +dz +dzeren +dzerin +dzeron +dziggetai +dzo +dzungar +e +ea +eably +eaceworm +each +eachwhere +ead +eadi +eadios +eadish +eager +eagerer +eagerest +eagerly +eagerness +eagers +eagle +eagled +eaglehawk +eaglelike +eagles +eagless +eaglestone +eaglet +eaglets +eaglewood +eagling +eagrass +eagre +eagres +ealderman +ealdorman +ealdormen +eam +ean +eaning +eanling +eanlings +ear +earable +earache +earaches +earbash +earbob +earcap +earclip +earcockle +eardrop +eardropper +eardrops +eardrum +eardrums +eared +earflap +earflaps +earflower +earful +earfuls +earhead +earhole +earing +earings +earjewel +earl +earlap +earlaps +earldom +earldoms +earlduck +earle +earless +earlesss +earlet +early +earlier +earliest +earlyish +earlike +earliness +earlish +earlywood +earlobe +earlobes +earlock +earlocks +earls +earlship +earlships +earmark +earmarked +earmarking +earmarkings +earmarks +earmindedness +earmuff +earmuffs +earn +earnable +earned +earner +earners +earnest +earnestful +earnestly +earnestness +earnests +earnful +earnie +earning +earnings +earns +earock +earphone +earphones +earpick +earpiece +earpieces +earplug +earplugs +earreach +earring +earringed +earrings +ears +earscrew +earsh +earshell +earshot +earshots +earsore +earsplitting +earspool +earstone +earstones +eartab +eartag +eartagged +earth +earthboard +earthborn +earthbound +earthbred +earthdrake +earthed +earthen +earthenhearted +earthenware +earthfall +earthfast +earthgall +earthgrubber +earthy +earthian +earthier +earthiest +earthily +earthiness +earthing +earthkin +earthless +earthly +earthlier +earthliest +earthlight +earthlike +earthliness +earthling +earthlings +earthmaker +earthmaking +earthman +earthmen +earthmove +earthmover +earthmoving +earthnut +earthnuts +earthpea +earthpeas +earthquake +earthquaked +earthquaken +earthquakes +earthquaking +earthquave +earthrise +earths +earthset +earthsets +earthshaker +earthshaking +earthshakingly +earthshattering +earthshine +earthshock +earthslide +earthsmoke +earthstar +earthtongue +earthwall +earthward +earthwards +earthwork +earthworks +earthworm +earthworms +earwax +earwaxes +earwig +earwigged +earwiggy +earwigginess +earwigging +earwigs +earwitness +earworm +earworms +earwort +ease +eased +easeful +easefully +easefulness +easel +easeled +easeless +easels +easement +easements +easer +easers +eases +easy +easier +easies +easiest +easygoing +easygoingly +easygoingness +easily +easylike +easiness +easinesses +easing +eassel +east +eastabout +eastbound +easted +easter +eastering +easterly +easterlies +easterliness +easterling +eastermost +eastern +easterner +easterners +easternism +easternize +easternized +easternizing +easternly +easternmost +easters +eastertide +easting +eastings +eastlake +eastland +eastlander +eastlin +eastling +eastlings +eastlins +eastman +eastmost +eastness +eastre +easts +eastward +eastwardly +eastwards +eat +eatability +eatable +eatableness +eatables +eatage +eatanswill +eatberry +eatche +eaten +eater +eatery +eateries +eaters +eath +eathly +eating +eatings +eats +eau +eaux +eave +eaved +eavedrop +eavedropper +eavedropping +eaver +eaves +eavesdrip +eavesdrop +eavesdropped +eavesdropper +eavesdroppers +eavesdropping +eavesdrops +eavesing +ebauche +ebauchoir +ebb +ebbed +ebbet +ebbets +ebbing +ebbman +ebbs +ebcasc +ebcd +ebcdic +ebdomade +eben +ebenaceae +ebenaceous +ebenales +ebeneous +ebenezer +eberthella +ebionism +ebionite +ebionitic +ebionitism +ebionize +eblis +eboe +ebon +ebony +ebonies +ebonige +ebonise +ebonised +ebonises +ebonising +ebonist +ebonite +ebonites +ebonize +ebonized +ebonizes +ebonizing +ebons +eboulement +ebracteate +ebracteolate +ebraick +ebriate +ebriated +ebricty +ebriety +ebrillade +ebriose +ebriosity +ebrious +ebriously +ebullate +ebulliate +ebullience +ebulliency +ebullient +ebulliently +ebulliometer +ebulliometry +ebullioscope +ebullioscopy +ebullioscopic +ebullition +ebullitions +ebullitive +ebulus +eburated +eburin +eburine +eburna +eburnated +eburnation +eburnean +eburneoid +eburneous +eburnian +eburnification +ec +ecad +ecalcarate +ecalcavate +ecanda +ecardinal +ecardine +ecardines +ecarinate +ecart +ecarte +ecartes +ecaudata +ecaudate +ecb +ecballium +ecbasis +ecbatic +ecblastesis +ecblastpsis +ecbole +ecbolic +ecbolics +ecca +eccaleobion +ecce +eccentrate +eccentric +eccentrical +eccentrically +eccentricity +eccentricities +eccentrics +eccentring +eccentrometer +ecch +ecchymoma +ecchymose +ecchymosed +ecchymoses +ecchymosis +ecchymotic +ecchondroma +ecchondrosis +ecchondrotome +eccyclema +eccyesis +eccl +eccles +ecclesia +ecclesiae +ecclesial +ecclesiarch +ecclesiarchy +ecclesiast +ecclesiastes +ecclesiastic +ecclesiastical +ecclesiasticalism +ecclesiastically +ecclesiasticalness +ecclesiasticism +ecclesiasticize +ecclesiastics +ecclesiasticus +ecclesiastry +ecclesioclastic +ecclesiography +ecclesiolater +ecclesiolatry +ecclesiology +ecclesiologic +ecclesiological +ecclesiologically +ecclesiologist +ecclesiophobia +eccoprotic +eccoproticophoric +eccrine +eccrinology +eccrisis +eccritic +ecdemic +ecdemite +ecderon +ecderonic +ecdyses +ecdysial +ecdysiast +ecdysis +ecdyson +ecdysone +ecdysones +ecdysons +ecesic +ecesis +ecesises +ecgonin +ecgonine +echafaudage +echappe +echappee +echar +echard +echards +eche +echea +eched +echelette +echelle +echelon +echeloned +echeloning +echelonment +echelons +echeloot +echeneid +echeneidae +echeneidid +echeneididae +echeneidoid +echeneis +eches +echevaria +echeveria +echevin +echidna +echidnae +echidnas +echidnidae +echimys +echinacea +echinal +echinate +echinated +eching +echini +echinid +echinidan +echinidea +echiniform +echinital +echinite +echinocactus +echinocaris +echinocereus +echinochloa +echinochrome +echinococcosis +echinococcus +echinoderes +echinoderidae +echinoderm +echinoderma +echinodermal +echinodermata +echinodermatous +echinodermic +echinodorus +echinoid +echinoidea +echinoids +echinology +echinologist +echinomys +echinopanax +echinops +echinopsine +echinorhynchus +echinorhinidae +echinorhinus +echinospermum +echinosphaerites +echinosphaeritidae +echinostoma +echinostomatidae +echinostome +echinostomiasis +echinozoa +echinulate +echinulated +echinulation +echinuliform +echinus +echis +echitamine +echites +echium +echiurid +echiurida +echiuroid +echiuroidea +echiurus +echnida +echo +echocardiogram +echoed +echoey +echoencephalography +echoer +echoers +echoes +echogram +echograph +echoic +echoing +echoingly +echoism +echoisms +echoist +echoize +echoized +echoizing +echolalia +echolalic +echoless +echolocate +echolocation +echometer +echopractic +echopraxia +echos +echovirus +echowise +echt +echuca +eciliate +ecyphellate +eciton +ecize +eckehart +ecklein +eclair +eclaircise +eclaircissement +eclairissement +eclairs +eclampsia +eclamptic +eclat +eclated +eclating +eclats +eclectic +eclectical +eclectically +eclecticism +eclecticist +eclecticize +eclectics +eclectism +eclectist +eclegm +eclegma +eclegme +eclipsable +eclipsareon +eclipsation +eclipse +eclipsed +eclipser +eclipses +eclipsing +eclipsis +eclipsises +ecliptic +ecliptical +ecliptically +ecliptics +eclogic +eclogite +eclogites +eclogue +eclogues +eclosion +eclosions +ecmnesia +eco +ecocidal +ecocide +ecoclimate +ecod +ecodeme +ecoid +ecol +ecole +ecoles +ecology +ecologic +ecological +ecologically +ecologies +ecologist +ecologists +ecomomist +econ +economese +econometer +econometric +econometrical +econometrically +econometrician +econometrics +econometrist +economy +economic +economical +economically +economicalness +economics +economies +economise +economised +economiser +economising +economism +economist +economists +economite +economization +economize +economized +economizer +economizers +economizes +economizing +ecophene +ecophysiology +ecophysiological +ecophobia +ecorch +ecorche +ecorticate +ecosystem +ecosystems +ecospecies +ecospecific +ecospecifically +ecosphere +ecossaise +ecostate +ecotype +ecotypes +ecotypic +ecotipically +ecotypically +ecotonal +ecotone +ecotones +ecotopic +ecoute +ecphasis +ecphonema +ecphonesis +ecphorable +ecphore +ecphory +ecphoria +ecphoriae +ecphorias +ecphorization +ecphorize +ecphova +ecphractic +ecphrasis +ecrase +ecraseur +ecraseurs +ecrasite +ecrevisse +ecroulement +ecru +ecrus +ecrustaceous +ecstasy +ecstasies +ecstasis +ecstasize +ecstatic +ecstatica +ecstatical +ecstatically +ecstaticize +ecstatics +ecstrophy +ectad +ectadenia +ectal +ectally +ectases +ectasia +ectasis +ectatic +ectene +ectental +ectepicondylar +ecteron +ectethmoid +ectethmoidal +ecthesis +ecthetically +ecthyma +ecthymata +ecthymatous +ecthlipses +ecthlipsis +ectypal +ectype +ectypes +ectypography +ectiris +ectobatic +ectoblast +ectoblastic +ectobronchium +ectocardia +ectocarpaceae +ectocarpaceous +ectocarpales +ectocarpic +ectocarpous +ectocarpus +ectocelic +ectochondral +ectocinerea +ectocinereal +ectocyst +ectocoelic +ectocommensal +ectocondylar +ectocondyle +ectocondyloid +ectocornea +ectocranial +ectocrine +ectocuneiform +ectocuniform +ectodactylism +ectoderm +ectodermal +ectodermic +ectodermoidal +ectodermosis +ectoderms +ectodynamomorphic +ectoentad +ectoenzym +ectoenzyme +ectoethmoid +ectogeneous +ectogenesis +ectogenetic +ectogenic +ectogenous +ectoglia +ectognatha +ectolecithal +ectoloph +ectomere +ectomeres +ectomeric +ectomesoblast +ectomorph +ectomorphy +ectomorphic +ectomorphism +ectonephridium +ectoparasite +ectoparasitic +ectoparasitica +ectopatagia +ectopatagium +ectophyte +ectophytic +ectophloic +ectopy +ectopia +ectopias +ectopic +ectopistes +ectoplacenta +ectoplasy +ectoplasm +ectoplasmatic +ectoplasmic +ectoplastic +ectoproct +ectoprocta +ectoproctan +ectoproctous +ectopterygoid +ectoretina +ectorganism +ectorhinal +ectosarc +ectosarcous +ectosarcs +ectoskeleton +ectosomal +ectosome +ectosphenoid +ectosphenotic +ectosphere +ectosteal +ectosteally +ectostosis +ectotheca +ectotherm +ectothermic +ectotoxin +ectotrophi +ectotrophic +ectotropic +ectozoa +ectozoan +ectozoans +ectozoic +ectozoon +ectrodactyly +ectrodactylia +ectrodactylism +ectrodactylous +ectrogeny +ectrogenic +ectromelia +ectromelian +ectromelic +ectromelus +ectropion +ectropionization +ectropionize +ectropionized +ectropionizing +ectropium +ectropometer +ectrosyndactyly +ectrotic +ecttypal +ecu +ecuador +ecuadoran +ecuadorian +ecuelle +ecuelling +ecumenacy +ecumene +ecumenic +ecumenical +ecumenicalism +ecumenicality +ecumenically +ecumenicism +ecumenicist +ecumenicity +ecumenicize +ecumenics +ecumenism +ecumenist +ecumenistic +ecumenopolis +ecurie +ecus +eczema +eczemas +eczematization +eczematoid +eczematosis +eczematous +ed +edacious +edaciously +edaciousness +edacity +edacities +edam +edana +edaphic +edaphically +edaphodont +edaphology +edaphon +edaphosauria +edaphosaurid +edaphosaurus +edda +eddaic +edder +eddy +eddic +eddie +eddied +eddies +eddying +eddyroot +eddish +eddo +eddoes +edea +edeagra +edeitis +edelweiss +edelweisses +edema +edemas +edemata +edematose +edematous +edemic +eden +edenic +edenite +edenization +edenize +edental +edentalous +edentata +edentate +edentates +edentulate +edentulous +edeodynia +edeology +edeomania +edeoscopy +edeotomy +edessan +edestan +edestin +edestosaurus +edgar +edge +edgebone +edgeboned +edged +edgeless +edgeling +edgemaker +edgemaking +edgeman +edger +edgerman +edgers +edges +edgeshot +edgestone +edgeway +edgeways +edgeweed +edgewise +edgy +edgier +edgiest +edgily +edginess +edginesses +edging +edgingly +edgings +edgrew +edgrow +edh +edhs +edibile +edibility +edible +edibleness +edibles +edict +edictal +edictally +edicts +edictum +edicule +ediface +edify +edificable +edificant +edificate +edification +edificative +edificator +edificatory +edifice +edificed +edifices +edificial +edificing +edified +edifier +edifiers +edifies +edifying +edifyingly +edifyingness +ediya +edile +ediles +edility +edinburgh +edingtonite +edison +edit +editable +edital +editchar +edited +edith +editing +edition +editions +editor +editorial +editorialist +editorialization +editorializations +editorialize +editorialized +editorializer +editorializers +editorializes +editorializing +editorially +editorials +editors +editorship +editorships +editress +editresses +edits +edituate +edmond +edmund +edna +edo +edomite +edomitish +edoni +edp +edplot +edriasteroidea +edrioasteroid +edrioasteroidea +edriophthalma +edriophthalmatous +edriophthalmian +edriophthalmic +edriophthalmous +eds +eduardo +educ +educabilia +educabilian +educability +educable +educables +educand +educatability +educatable +educate +educated +educatedly +educatedness +educatee +educates +educating +education +educationable +educational +educationalism +educationalist +educationally +educationary +educationese +educationist +educations +educative +educator +educatory +educators +educatress +educe +educed +educement +educes +educible +educing +educive +educt +eduction +eductions +eductive +eductor +eductors +educts +edulcorate +edulcorated +edulcorating +edulcoration +edulcorative +edulcorator +eduskunta +edward +edwardean +edwardeanism +edwardian +edwardine +edwards +edwardsia +edwardsiidae +edwin +edwina +ee +eebree +eegrass +eeyuch +eeyuck +eel +eelback +eelblenny +eelblennies +eelboat +eelbob +eelbobber +eelcake +eelcatcher +eeler +eelery +eelfare +eelfish +eelgrass +eelgrasses +eely +eelier +eeliest +eeling +eellike +eelpot +eelpout +eelpouts +eels +eelshop +eelskin +eelspear +eelware +eelworm +eelworms +eemis +een +eequinoctium +eer +eery +eerie +eerier +eeriest +eerily +eeriness +eerinesses +eerisome +eerock +eesome +eeten +ef +efecks +eff +effable +efface +effaceable +effaced +effacement +effacer +effacers +effaces +effacing +effare +effascinate +effate +effatum +effect +effected +effecter +effecters +effectful +effectible +effecting +effective +effectively +effectiveness +effectivity +effectless +effector +effectors +effectress +effects +effectual +effectuality +effectualize +effectually +effectualness +effectuate +effectuated +effectuates +effectuating +effectuation +effectuous +effeir +effeminacy +effeminate +effeminated +effeminately +effeminateness +effeminating +effemination +effeminatize +effeminisation +effeminise +effeminised +effeminising +effeminization +effeminize +effeminized +effeminizing +effendi +effendis +efference +efferent +efferently +efferents +efferous +effervesce +effervesced +effervescence +effervescency +effervescent +effervescently +effervesces +effervescible +effervescing +effervescingly +effervescive +effet +effete +effetely +effeteness +effetman +effetmen +efficace +efficacy +efficacies +efficacious +efficaciously +efficaciousness +efficacity +efficience +efficiency +efficiencies +efficient +efficiently +effie +effierce +effigy +effigial +effigiate +effigiated +effigiating +effigiation +effigies +effigurate +effiguration +efflagitate +efflate +efflation +effleurage +effloresce +effloresced +efflorescence +efflorescency +efflorescent +effloresces +efflorescing +efflower +effluence +effluences +effluency +effluent +effluents +effluve +effluvia +effluviable +effluvial +effluvias +effluviate +effluviography +effluvious +effluvium +effluviums +effluvivia +effluviviums +efflux +effluxes +effluxion +effodient +effodientia +effoliate +efforce +efford +efform +efformation +efformative +effort +effortful +effortfully +effortfulness +effortless +effortlessly +effortlessness +efforts +effossion +effraction +effractor +effray +effranchise +effranchisement +effrenate +effront +effronted +effrontery +effronteries +effs +effude +effulge +effulged +effulgence +effulgences +effulgent +effulgently +effulges +effulging +effumability +effume +effund +effuse +effused +effusely +effuses +effusing +effusiometer +effusion +effusions +effusive +effusively +effusiveness +effuso +effuviate +efik +efl +eflagelliferous +efoliolate +efoliose +efoveolate +efph +efractory +efreet +efs +eft +eftest +efts +eftsoon +eftsoons +eg +egad +egads +egal +egalitarian +egalitarianism +egalitarians +egalite +egalites +egality +egall +egally +egards +egba +egbert +egbo +egence +egency +eger +egeran +egeria +egers +egest +egesta +egested +egesting +egestion +egestions +egestive +egests +egg +eggar +eggars +eggbeater +eggbeaters +eggberry +eggberries +eggcrate +eggcup +eggcupful +eggcups +eggeater +egged +egger +eggers +eggfish +eggfruit +egghead +eggheaded +eggheadedness +eggheads +egghot +eggy +egging +eggler +eggless +egglike +eggment +eggnog +eggnogs +eggplant +eggplants +eggroll +eggrolls +eggs +eggshell +eggshells +eggwhisk +egilops +egypt +egyptian +egyptianism +egyptianization +egyptianize +egyptians +egyptize +egipto +egyptologer +egyptology +egyptologic +egyptological +egyptologist +egis +egises +eglamore +eglandular +eglandulose +eglandulous +eglantine +eglantines +eglatere +eglateres +eglestonite +egling +eglogue +eglomerate +eglomise +egma +ego +egocentric +egocentrically +egocentricity +egocentricities +egocentrism +egocentristic +egocerus +egohood +egoism +egoisms +egoist +egoistic +egoistical +egoistically +egoisticalness +egoistry +egoists +egoity +egoize +egoizer +egol +egolatrous +egomania +egomaniac +egomaniacal +egomaniacally +egomanias +egomism +egophony +egophonic +egos +egosyntonic +egotheism +egotism +egotisms +egotist +egotistic +egotistical +egotistically +egotisticalness +egotists +egotize +egotized +egotizing +egracias +egranulose +egre +egregious +egregiously +egregiousness +egremoigne +egress +egressed +egresses +egressing +egression +egressive +egressor +egret +egrets +egretta +egrid +egrimony +egrimonle +egriot +egritude +egromancy +egualmente +egueiite +egurgitate +egurgitated +egurgitating +eguttulate +eh +ehatisaht +eheu +ehlite +ehretia +ehretiaceae +ehrman +ehrwaldite +ehtanethial +ehuawa +ey +eyah +eyalet +eyas +eyases +eyass +eichbergite +eichhornia +eichwaldite +eicosane +eide +eident +eydent +eidently +eider +eiderdown +eiders +eidetic +eidetically +eidograph +eidola +eidolic +eidolism +eidology +eidolology +eidolon +eidolons +eidoptometry +eidos +eidouranion +eye +eyeable +eyeball +eyeballed +eyeballing +eyeballs +eyebalm +eyebar +eyebath +eyebeam +eyebeams +eyeberry +eyeblack +eyeblink +eyebolt +eyebolts +eyebree +eyebridled +eyebright +eyebrow +eyebrows +eyecup +eyecups +eyed +eyedness +eyednesses +eyedot +eyedrop +eyedropper +eyedropperful +eyedroppers +eyeflap +eyeful +eyefuls +eyeglance +eyeglass +eyeglasses +eyeground +eyehole +eyeholes +eyehook +eyehooks +eyey +eyeing +eyeish +eyelash +eyelashes +eyelast +eyeless +eyelessness +eyelet +eyeleted +eyeleteer +eyeleting +eyelets +eyeletted +eyeletter +eyeletting +eyelid +eyelids +eyelight +eyelike +eyeline +eyeliner +eyeliners +eyemark +eyen +eyeopener +eyepiece +eyepieces +eyepit +eyepoint +eyepoints +eyepopper +eyer +eyereach +eyeroot +eyers +eyes +eyesalve +eyeseed +eyeservant +eyeserver +eyeservice +eyeshade +eyeshades +eyeshield +eyeshine +eyeshot +eyeshots +eyesight +eyesights +eyesome +eyesore +eyesores +eyespot +eyespots +eyess +eyestalk +eyestalks +eyestone +eyestones +eyestrain +eyestring +eyestrings +eyeteeth +eyetooth +eyewaiter +eyewash +eyewashes +eyewater +eyewaters +eyewear +eyewink +eyewinker +eyewinks +eyewitness +eyewitnesses +eyewort +eiffel +eigenfrequency +eigenfunction +eigenspace +eigenstate +eigenvalue +eigenvalues +eigenvector +eigenvectors +eigh +eight +eyght +eightball +eightballs +eighteen +eighteenfold +eighteenmo +eighteenmos +eighteens +eighteenth +eighteenthly +eighteenths +eightfoil +eightfold +eighth +eighthes +eighthly +eighths +eighty +eighties +eightieth +eightieths +eightyfold +eightling +eightpenny +eights +eightscore +eightsman +eightsmen +eightsome +eightvo +eightvos +eigne +eying +eikon +eikones +eikonogen +eikonology +eikons +eyl +eila +eild +eileen +eyliad +eimak +eimer +eimeria +eyn +eyne +einkanter +einkorn +einkorns +einstein +einsteinian +einsteinium +eyot +eyoty +eir +eyr +eyra +eirack +eyrant +eyrar +eyras +eire +eyre +eireannach +eyren +eirenarch +eirene +eirenic +eirenicon +eyrer +eyres +eiresione +eiry +eyry +eyrie +eyries +eyrir +eisegeses +eisegesis +eisegetic +eisegetical +eisell +eisenberg +eisenhower +eisodic +eysoge +eisoptrophobia +eisteddfod +eisteddfodau +eisteddfodic +eisteddfodism +eisteddfods +either +ejacula +ejaculate +ejaculated +ejaculates +ejaculating +ejaculation +ejaculations +ejaculative +ejaculator +ejaculatory +ejaculators +ejaculum +ejam +eject +ejecta +ejectable +ejectamenta +ejected +ejectee +ejecting +ejection +ejections +ejective +ejectively +ejectives +ejectivity +ejectment +ejector +ejectors +ejects +ejectum +ejicient +ejidal +ejido +ejidos +ejoo +ejulate +ejulation +ejurate +ejuration +ejusd +ejusdem +ekaboron +ekacaesium +ekaha +ekamanganese +ekasilicon +ekatantalum +eke +ekebergite +eked +ekename +eker +ekerite +ekes +ekhimi +eking +ekistic +ekistics +ekka +ekoi +ekphore +ekphory +ekphoria +ekphorias +ekphorize +ekron +ekronite +ektene +ektenes +ektexine +ektexines +ektodynamorphic +el +ela +elabor +elaborate +elaborated +elaborately +elaborateness +elaborates +elaborating +elaboration +elaborations +elaborative +elaboratively +elaborator +elaboratory +elaborators +elabrate +elachista +elachistaceae +elachistaceous +elacolite +elaeagnaceae +elaeagnaceous +elaeagnus +elaeis +elaenia +elaeoblast +elaeoblastic +elaeocarpaceae +elaeocarpaceous +elaeocarpus +elaeococca +elaeodendron +elaeodochon +elaeomargaric +elaeometer +elaeopten +elaeoptene +elaeosaccharum +elaeosia +elaeothesia +elaeothesium +elaic +elaidate +elaidic +elaidin +elaidinic +elayl +elain +elaine +elains +elaioleucite +elaioplast +elaiosome +elamite +elamitic +elamitish +elamp +elan +elance +eland +elands +elanet +elans +elanus +elaphe +elaphebolion +elaphine +elaphodus +elaphoglossum +elaphomyces +elaphomycetaceae +elaphrium +elaphure +elaphurine +elaphurus +elapid +elapidae +elapids +elapinae +elapine +elapoid +elaps +elapse +elapsed +elapses +elapsing +elapsoidea +elargement +elasmobranch +elasmobranchian +elasmobranchiate +elasmobranchii +elasmosaur +elasmosaurus +elasmothere +elasmotherium +elastance +elastase +elastases +elastic +elastica +elastically +elasticate +elastician +elasticin +elasticity +elasticities +elasticize +elasticized +elasticizer +elasticizes +elasticizing +elasticness +elastics +elasticum +elastin +elastins +elastivity +elastomer +elastomeric +elastomers +elastometer +elastometry +elastose +elatcha +elate +elated +elatedly +elatedness +elater +elatery +elaterid +elateridae +elaterids +elaterin +elaterins +elaterist +elaterite +elaterium +elateroid +elaterometer +elaters +elates +elatha +elatinaceae +elatinaceous +elatine +elating +elation +elations +elative +elatives +elator +elatrometer +elb +elbert +elberta +elboic +elbow +elbowboard +elbowbush +elbowchair +elbowed +elbower +elbowy +elbowing +elbowpiece +elbowroom +elbows +elbuck +elcaja +elchee +eld +elder +elderberry +elderberries +elderbrotherhood +elderbrotherish +elderbrotherly +elderbush +elderhood +elderly +elderlies +elderliness +elderling +elderman +eldermen +eldern +elders +eldership +eldersisterly +elderwoman +elderwomen +elderwood +elderwort +eldest +eldfather +eldin +elding +eldmother +eldorado +eldred +eldress +eldrich +eldritch +elds +elean +eleanor +eleatic +eleaticism +eleazar +elec +elecampane +elechi +elecive +elecives +elect +electability +electable +electant +electary +elected +electee +electees +electic +electicism +electing +election +electionary +electioneer +electioneered +electioneerer +electioneering +electioneers +elections +elective +electively +electiveness +electives +electivism +electivity +electly +electo +elector +electoral +electorally +electorate +electorates +electorial +electors +electorship +electra +electragy +electragist +electral +electralize +electre +electrepeter +electress +electret +electrets +electric +electrical +electricalize +electrically +electricalness +electrican +electricans +electrician +electricians +electricity +electricize +electrics +electriferous +electrify +electrifiable +electrification +electrified +electrifier +electrifiers +electrifies +electrifying +electrine +electrion +electrionic +electrizable +electrization +electrize +electrized +electrizer +electrizing +electro +electroacoustic +electroacoustical +electroacoustically +electroacoustics +electroaffinity +electroamalgamation +electroanalysis +electroanalytic +electroanalytical +electroanesthesia +electroballistic +electroballistically +electroballistician +electroballistics +electrobath +electrobiology +electrobiological +electrobiologically +electrobiologist +electrobioscopy +electroblasting +electrobrasser +electrobus +electrocapillary +electrocapillarity +electrocardiogram +electrocardiograms +electrocardiograph +electrocardiography +electrocardiographic +electrocardiographically +electrocardiographs +electrocatalysis +electrocatalytic +electrocataphoresis +electrocataphoretic +electrocautery +electrocauteries +electrocauterization +electroceramic +electrochemical +electrochemically +electrochemist +electrochemistry +electrochronograph +electrochronographic +electrochronometer +electrochronometric +electrocystoscope +electrocoagulation +electrocoating +electrocolloidal +electrocontractility +electroconvulsive +electrocorticogram +electrocratic +electroculture +electrocute +electrocuted +electrocutes +electrocuting +electrocution +electrocutional +electrocutioner +electrocutions +electrode +electrodeless +electrodentistry +electrodeposit +electrodepositable +electrodeposition +electrodepositor +electrodes +electrodesiccate +electrodesiccation +electrodiagnoses +electrodiagnosis +electrodiagnostic +electrodiagnostically +electrodialyses +electrodialysis +electrodialitic +electrodialytic +electrodialitically +electrodialyze +electrodialyzer +electrodynamic +electrodynamical +electrodynamics +electrodynamism +electrodynamometer +electrodiplomatic +electrodispersive +electrodissolution +electroed +electroencephalogram +electroencephalograms +electroencephalograph +electroencephalography +electroencephalographic +electroencephalographical +electroencephalographically +electroencephalographs +electroendosmose +electroendosmosis +electroendosmotic +electroengrave +electroengraving +electroergometer +electroetching +electroethereal +electroextraction +electrofishing +electroform +electroforming +electrofuse +electrofused +electrofusion +electrogalvanic +electrogalvanization +electrogalvanize +electrogasdynamics +electrogenesis +electrogenetic +electrogenic +electrogild +electrogilding +electrogilt +electrogram +electrograph +electrography +electrographic +electrographite +electrograving +electroharmonic +electrohemostasis +electrohydraulic +electrohydraulically +electrohomeopathy +electrohorticulture +electroimpulse +electroindustrial +electroing +electroionic +electroirrigation +electrojet +electrokinematics +electrokinetic +electrokinetics +electroless +electrolier +electrolysation +electrolyse +electrolysed +electrolyser +electrolyses +electrolysing +electrolysis +electrolyte +electrolytes +electrolithotrity +electrolytic +electrolytical +electrolytically +electrolyzability +electrolyzable +electrolyzation +electrolyze +electrolyzed +electrolyzer +electrolyzing +electrology +electrologic +electrological +electrologist +electrologists +electroluminescence +electroluminescent +electromagnet +electromagnetic +electromagnetical +electromagnetically +electromagnetics +electromagnetism +electromagnetist +electromagnetize +electromagnets +electromassage +electromechanical +electromechanically +electromechanics +electromedical +electromer +electromeric +electromerism +electrometallurgy +electrometallurgical +electrometallurgist +electrometeor +electrometer +electrometry +electrometric +electrometrical +electrometrically +electromyogram +electromyograph +electromyography +electromyographic +electromyographical +electromyographically +electromobile +electromobilism +electromotion +electromotiv +electromotive +electromotivity +electromotograph +electromotor +electromuscular +electron +electronarcosis +electronegative +electronegativity +electronervous +electroneutral +electroneutrality +electronic +electronically +electronics +electronography +electronographic +electrons +electronvolt +electrooculogram +electrooptic +electrooptical +electrooptically +electrooptics +electroori +electroosmosis +electroosmotic +electroosmotically +electrootiatrics +electropathy +electropathic +electropathology +electropercussive +electrophilic +electrophilically +electrophysicist +electrophysics +electrophysiology +electrophysiologic +electrophysiological +electrophysiologically +electrophysiologist +electrophobia +electrophone +electrophonic +electrophonically +electrophore +electrophorese +electrophoresed +electrophoreses +electrophoresing +electrophoresis +electrophoretic +electrophoretically +electrophoretogram +electrophori +electrophoric +electrophoridae +electrophorus +electrophotography +electrophotographic +electrophotometer +electrophotometry +electrophotomicrography +electrophototherapy +electrophrenic +electropyrometer +electropism +electroplaque +electroplate +electroplated +electroplater +electroplates +electroplating +electroplax +electropneumatic +electropneumatically +electropoion +electropolar +electropolish +electropositive +electropotential +electropower +electropsychrometer +electropult +electropuncturation +electropuncture +electropuncturing +electroreceptive +electroreduction +electrorefine +electrorefining +electroresection +electroretinogram +electroretinograph +electroretinography +electroretinographic +electros +electroscission +electroscope +electroscopes +electroscopic +electrosensitive +electrosherardizing +electroshock +electroshocks +electrosynthesis +electrosynthetic +electrosynthetically +electrosmosis +electrostatic +electrostatical +electrostatically +electrostatics +electrosteel +electrostenolysis +electrostenolytic +electrostereotype +electrostriction +electrostrictive +electrosurgery +electrosurgeries +electrosurgical +electrosurgically +electrotactic +electrotautomerism +electrotaxis +electrotechnic +electrotechnical +electrotechnician +electrotechnics +electrotechnology +electrotechnologist +electrotelegraphy +electrotelegraphic +electrotelethermometer +electrotellurograph +electrotest +electrothanasia +electrothanatosis +electrotherapeutic +electrotherapeutical +electrotherapeutics +electrotherapeutist +electrotherapy +electrotherapies +electrotherapist +electrotheraputic +electrotheraputical +electrotheraputically +electrotheraputics +electrothermal +electrothermally +electrothermancy +electrothermic +electrothermics +electrothermometer +electrothermostat +electrothermostatic +electrothermotic +electrotype +electrotyped +electrotyper +electrotypes +electrotypy +electrotypic +electrotyping +electrotypist +electrotitration +electrotonic +electrotonicity +electrotonize +electrotonus +electrotrephine +electrotropic +electrotropism +electrovalence +electrovalency +electrovalent +electrovalently +electrovection +electroviscous +electrovital +electrowin +electrowinning +electrum +electrums +elects +electuary +electuaries +eledoisin +eledone +eleemosinar +eleemosynar +eleemosynary +eleemosynarily +eleemosynariness +elegance +elegances +elegancy +elegancies +elegant +elegante +eleganter +elegantly +elegy +elegiac +elegiacal +elegiacally +elegiacs +elegiambic +elegiambus +elegiast +elegibility +elegies +elegious +elegise +elegised +elegises +elegising +elegist +elegists +elegit +elegits +elegize +elegized +elegizes +elegizing +eleidin +elektra +elelments +elem +eleme +element +elemental +elementalism +elementalist +elementalistic +elementalistically +elementality +elementalize +elementally +elementaloid +elementals +elementary +elementarily +elementariness +elementarism +elementarist +elementarity +elementate +elementish +elementoid +elements +elemi +elemicin +elemin +elemis +elemol +elemong +elench +elenchi +elenchic +elenchical +elenchically +elenchize +elenchtic +elenchtical +elenchus +elenctic +elenctical +elenge +elengely +elengeness +eleoblast +eleocharis +eleolite +eleomargaric +eleometer +eleonorite +eleoplast +eleoptene +eleostearate +eleostearic +eleotrid +elepaio +elephancy +elephant +elephanta +elephantiac +elephantiases +elephantiasic +elephantiasis +elephantic +elephanticide +elephantidae +elephantine +elephantlike +elephantoid +elephantoidal +elephantopus +elephantous +elephantry +elephants +elephas +elettaria +eleuin +eleusine +eleusinia +eleusinian +eleusinion +eleut +eleutherarch +eleutheri +eleutheria +eleutherian +eleutherios +eleutherism +eleutherodactyl +eleutherodactyli +eleutherodactylus +eleutheromania +eleutheromaniac +eleutheromorph +eleutheropetalous +eleutherophyllous +eleutherophobia +eleutherosepalous +eleutherozoa +eleutherozoan +elev +elevable +elevate +elevated +elevatedly +elevatedness +elevates +elevating +elevatingly +elevation +elevational +elevations +elevato +elevator +elevatory +elevators +eleve +eleven +elevener +elevenfold +elevens +elevenses +eleventeenth +eleventh +eleventhly +elevenths +elevon +elevons +elf +elfdom +elfenfolk +elfhood +elfic +elfin +elfins +elfinwood +elfish +elfishly +elfishness +elfkin +elfland +elflike +elflock +elflocks +elfship +elfwife +elfwort +elhi +eli +elia +elian +elianic +elias +eliasite +elychnious +elicit +elicitable +elicitate +elicitation +elicited +eliciting +elicitor +elicitory +elicitors +elicits +elide +elided +elides +elidible +eliding +elydoric +eligenda +eligent +eligibility +eligibilities +eligible +eligibleness +eligibles +eligibly +elihu +elijah +elymi +eliminability +eliminable +eliminand +eliminant +eliminate +eliminated +eliminates +eliminating +elimination +eliminations +eliminative +eliminator +eliminatory +eliminators +elymus +elinguate +elinguated +elinguating +elinguation +elingued +elinor +elinvar +eliot +eliphalet +eliquate +eliquated +eliquating +eliquation +eliquidate +elisabeth +elysee +elisha +elishah +elysia +elysian +elysiidae +elision +elisions +elysium +elisor +elissa +elite +elites +elitism +elitisms +elitist +elitists +elytra +elytral +elytriferous +elytriform +elytrigerous +elytrin +elytrocele +elytroclasia +elytroid +elytron +elytroplastic +elytropolypus +elytroposis +elytroptosis +elytrorhagia +elytrorrhagia +elytrorrhaphy +elytrostenosis +elytrotomy +elytrous +elytrtra +elytrum +elix +elixate +elixation +elixed +elixir +elixirs +elixiviate +eliza +elizabeth +elizabethan +elizabethanism +elizabethanize +elizabethans +elk +elkanah +elkdom +elkesaite +elkhorn +elkhound +elkhounds +elkoshite +elks +elkslip +elkuma +elkwood +ell +ella +ellachick +ellagate +ellagic +ellagitannin +ellan +ellasar +elle +ellebore +elleck +ellen +ellenyard +ellerian +ellfish +ellice +ellick +elling +ellinge +elliot +elliott +ellipse +ellipses +ellipsis +ellipsograph +ellipsoid +ellipsoidal +ellipsoids +ellipsometer +ellipsometry +ellipsone +ellipsonic +elliptic +elliptical +elliptically +ellipticalness +ellipticity +elliptograph +elliptoid +ellops +ells +ellwand +elm +elmer +elmy +elmier +elmiest +elms +elmwood +elne +eloah +elocation +elocular +elocute +elocution +elocutionary +elocutioner +elocutionist +elocutionists +elocutionize +elocutive +elod +elodea +elodeaceae +elodeas +elodes +eloge +elogy +elogium +elohim +elohimic +elohism +elohist +elohistic +eloign +eloigned +eloigner +eloigners +eloigning +eloignment +eloigns +eloin +eloine +eloined +eloiner +eloiners +eloining +eloinment +eloins +eloise +elon +elong +elongate +elongated +elongates +elongating +elongation +elongations +elongative +elonite +elope +eloped +elopement +elopements +eloper +elopers +elopes +elopidae +eloping +elops +eloquence +eloquent +eloquential +eloquently +eloquentness +elotherium +elotillo +elpasolite +elpidite +elrage +elric +elritch +elroquite +els +elsa +else +elsehow +elses +elseways +elsewards +elsewhat +elsewhen +elsewhere +elsewheres +elsewhither +elsewise +elshin +elsholtzia +elsin +elt +eltime +eltrot +eluant +eluants +eluate +eluated +eluates +eluating +elucid +elucidate +elucidated +elucidates +elucidating +elucidation +elucidations +elucidative +elucidator +elucidatory +elucidators +eluctate +eluctation +elucubrate +elucubration +elude +eluded +eluder +eluders +eludes +eludible +eluding +eluent +eluents +elul +elumbated +elusion +elusions +elusive +elusively +elusiveness +elusory +elusoriness +elute +eluted +elutes +eluting +elution +elutions +elutor +elutriate +elutriated +elutriating +elutriation +elutriator +eluvia +eluvial +eluviate +eluviated +eluviates +eluviating +eluviation +eluvies +eluvium +eluviums +eluvivia +eluxate +elvan +elvanite +elvanitic +elve +elver +elvers +elves +elvet +elvira +elvis +elvish +elvishly +elwood +elzevir +elzevirian +em +emacerate +emacerated +emaceration +emaciate +emaciated +emaciates +emaciating +emaciation +emaculate +emagram +email +emailed +emajagua +emamelware +emanant +emanate +emanated +emanates +emanating +emanation +emanational +emanationism +emanationist +emanations +emanatism +emanatist +emanatistic +emanativ +emanative +emanatively +emanator +emanatory +emanators +emancipate +emancipated +emancipates +emancipating +emancipation +emancipationist +emancipations +emancipatist +emancipative +emancipator +emancipatory +emancipators +emancipatress +emancipist +emandibulate +emane +emanent +emanium +emarcid +emarginate +emarginated +emarginately +emarginating +emargination +emarginula +emasculate +emasculated +emasculates +emasculating +emasculation +emasculations +emasculative +emasculator +emasculatory +emasculators +embace +embacle +embadomonas +embay +embayed +embaying +embayment +embain +embays +embale +emball +emballonurid +emballonuridae +emballonurine +embalm +embalmed +embalmer +embalmers +embalming +embalmment +embalms +embank +embanked +embanking +embankment +embankments +embanks +embannered +embaphium +embar +embarcadero +embarcation +embarge +embargo +embargoed +embargoes +embargoing +embargoist +embargos +embark +embarkation +embarkations +embarked +embarking +embarkment +embarks +embarment +embarque +embarras +embarrased +embarrass +embarrassed +embarrassedly +embarrasses +embarrassing +embarrassingly +embarrassment +embarrassments +embarred +embarrel +embarren +embarricado +embarring +embars +embase +embassade +embassador +embassadress +embassage +embassy +embassiate +embassies +embastardize +embastioned +embathe +embatholithic +embattle +embattled +embattlement +embattles +embattling +embden +embeam +embed +embeddable +embedded +embedder +embedding +embedment +embeds +embeggar +embelia +embelic +embelif +embelin +embellish +embellished +embellisher +embellishers +embellishes +embellishing +embellishment +embellishments +ember +embergeese +embergoose +emberiza +emberizidae +emberizinae +emberizine +embers +embetter +embezzle +embezzled +embezzlement +embezzlements +embezzler +embezzlers +embezzles +embezzling +embiid +embiidae +embiidina +embillow +embind +embiodea +embioptera +embiotocid +embiotocidae +embiotocoid +embira +embitter +embittered +embitterer +embittering +embitterment +embitterments +embitters +embladder +emblanch +emblaze +emblazed +emblazer +emblazers +emblazes +emblazing +emblazon +emblazoned +emblazoner +emblazoning +emblazonment +emblazonments +emblazonry +emblazons +emblem +emblema +emblematic +emblematical +emblematically +emblematicalness +emblematicize +emblematise +emblematised +emblematising +emblematist +emblematize +emblematized +emblematizing +emblematology +emblemed +emblement +emblements +embleming +emblemish +emblemist +emblemize +emblemized +emblemizing +emblemology +emblems +emblic +embliss +embloom +emblossom +embody +embodied +embodier +embodiers +embodies +embodying +embodiment +embodiments +embog +embogue +emboil +emboite +emboitement +emboites +embolden +emboldened +emboldener +emboldening +emboldens +embole +embolectomy +embolectomies +embolemia +emboli +emboly +embolic +embolies +emboliform +embolimeal +embolism +embolismic +embolisms +embolismus +embolite +embolium +embolization +embolize +embolo +embololalia +embolomalerism +embolomeri +embolomerism +embolomerous +embolomycotic +embolon +emboltement +embolum +embolus +embonpoint +emborder +embordered +embordering +emborders +emboscata +embosk +embosked +embosking +embosks +embosom +embosomed +embosoming +embosoms +emboss +embossable +embossage +embossed +embosser +embossers +embosses +embossing +embossman +embossmen +embossment +embossments +embost +embosture +embottle +embouchement +embouchment +embouchure +embouchures +embound +embourgeoisement +embow +embowed +embowel +emboweled +emboweler +emboweling +embowelled +emboweller +embowelling +embowelment +embowels +embower +embowered +embowering +embowerment +embowers +embowing +embowl +embowment +embows +embox +embrace +embraceable +embraceably +embraced +embracement +embraceor +embraceorr +embracer +embracery +embraceries +embracers +embraces +embracing +embracingly +embracingness +embracive +embraciveg +embraid +embrail +embrake +embranchment +embrangle +embrangled +embranglement +embrangling +embrase +embrasure +embrasured +embrasures +embrasuring +embrave +embrawn +embreach +embread +embreastment +embreathe +embreathement +embrectomy +embrew +embrica +embryectomy +embryectomies +embright +embrighten +embryo +embryocardia +embryoctony +embryoctonic +embryoferous +embryogenesis +embryogenetic +embryogeny +embryogenic +embryogony +embryographer +embryography +embryographic +embryoid +embryoism +embryol +embryology +embryologic +embryological +embryologically +embryologies +embryologist +embryologists +embryoma +embryomas +embryomata +embryon +embryonal +embryonally +embryonary +embryonate +embryonated +embryony +embryonic +embryonically +embryoniferous +embryoniform +embryons +embryopathology +embryophagous +embryophyta +embryophyte +embryophore +embryoplastic +embryos +embryoscope +embryoscopic +embryotega +embryotegae +embryotic +embryotome +embryotomy +embryotomies +embryotroph +embryotrophe +embryotrophy +embryotrophic +embryous +embrittle +embrittled +embrittlement +embrittling +embryulci +embryulcia +embryulculci +embryulcus +embryulcuses +embroaden +embrocado +embrocate +embrocated +embrocates +embrocating +embrocation +embrocations +embroche +embroglio +embroglios +embroider +embroidered +embroiderer +embroiderers +embroideress +embroidery +embroideries +embroidering +embroiders +embroil +embroiled +embroiler +embroiling +embroilment +embroilments +embroils +embronze +embroscopic +embrothelled +embrowd +embrown +embrowned +embrowning +embrowns +embrue +embrued +embrues +embruing +embrute +embruted +embrutes +embruting +embubble +embue +embuia +embulk +embull +embus +embush +embusy +embusk +embuskin +embusqu +embusque +embussed +embussing +emcee +emceed +emceeing +emcees +emceing +emcumbering +emda +emden +eme +emeer +emeerate +emeerates +emeers +emeership +emeline +emend +emendable +emendandum +emendate +emendated +emendately +emendates +emendating +emendation +emendations +emendator +emendatory +emended +emender +emenders +emendicate +emending +emends +emer +emerald +emeraldine +emeralds +emerant +emeras +emeraude +emerge +emerged +emergence +emergences +emergency +emergencies +emergent +emergently +emergentness +emergents +emergers +emerges +emerging +emery +emerick +emeried +emeries +emerying +emeril +emerit +emerita +emerited +emeriti +emeritus +emerituti +emerize +emerized +emerizing +emerod +emerods +emeroid +emeroids +emerse +emersed +emersion +emersions +emerson +emersonian +emersonianism +emes +emesa +emeses +emesidae +emesis +emetatrophia +emetia +emetic +emetical +emetically +emetics +emetin +emetine +emetines +emetins +emetocathartic +emetology +emetomorphine +emetophobia +emeu +emeus +emeute +emeutes +emf +emforth +emgalla +emhpasizing +emic +emicant +emicate +emication +emiction +emictory +emyd +emyde +emydea +emydes +emydian +emydidae +emydinae +emydosauria +emydosaurian +emyds +emigate +emigated +emigates +emigating +emigr +emigrant +emigrants +emigrate +emigrated +emigrates +emigrating +emigration +emigrational +emigrationist +emigrations +emigrative +emigrator +emigratory +emigre +emigree +emigres +emil +emily +emilia +emim +eminence +eminences +eminency +eminencies +eminent +eminently +emir +emirate +emirates +emirs +emirship +emys +emissary +emissaria +emissaries +emissaryship +emissarium +emissi +emissile +emission +emissions +emissitious +emissive +emissivity +emissory +emit +emits +emittance +emitted +emittent +emitter +emitters +emitting +emlen +emm +emma +emmantle +emmanuel +emmarble +emmarbled +emmarbling +emmarvel +emmeleia +emmenagogic +emmenagogue +emmenia +emmenic +emmeniopathy +emmenology +emmensite +emmental +emmer +emmergoose +emmers +emmet +emmetrope +emmetropy +emmetropia +emmetropic +emmetropism +emmets +emmett +emmew +emmy +emmies +emmove +emodin +emodins +emollescence +emolliate +emollience +emollient +emollients +emollition +emoloa +emolument +emolumental +emolumentary +emoluments +emong +emony +emory +emote +emoted +emoter +emoters +emotes +emoting +emotiometabolic +emotiomotor +emotiomuscular +emotion +emotionable +emotional +emotionalise +emotionalised +emotionalising +emotionalism +emotionalist +emotionalistic +emotionality +emotionalization +emotionalize +emotionalized +emotionalizing +emotionally +emotioned +emotionist +emotionize +emotionless +emotionlessly +emotionlessness +emotions +emotiovascular +emotive +emotively +emotiveness +emotivism +emotivity +emove +emp +empacket +empaestic +empair +empaistic +empale +empaled +empalement +empaler +empalers +empales +empaling +empall +empanada +empanel +empaneled +empaneling +empanelled +empanelling +empanelment +empanels +empannel +empanoply +empaper +emparadise +emparchment +empark +emparl +empasm +empasma +empassion +empathetic +empathetically +empathy +empathic +empathically +empathies +empathize +empathized +empathizes +empathizing +empatron +empearl +empedoclean +empeine +empeirema +empemata +empennage +empennages +empeo +empeople +empeopled +empeoplement +emperess +empery +emperies +emperil +emperish +emperize +emperor +emperors +emperorship +empest +empestic +empetraceae +empetraceous +empetrous +empetrum +empexa +emphase +emphases +emphasis +emphasise +emphasised +emphasising +emphasize +emphasized +emphasizes +emphasizing +emphatic +emphatical +emphatically +emphaticalness +emphemeralness +emphysema +emphysematous +emphyteusis +emphyteuta +emphyteutic +emphlysis +emphractic +emphraxis +emphrensy +empicture +empididae +empidonax +empiecement +empyema +empyemas +empyemata +empyemic +empierce +empiercement +empyesis +empight +empyocele +empire +empyreal +empyrean +empyreans +empirema +empires +empyreum +empyreuma +empyreumata +empyreumatic +empyreumatical +empyreumatize +empiry +empiric +empirical +empyrical +empirically +empiricalness +empiricism +empiricist +empiricists +empirics +empiriocritcism +empiriocritical +empiriological +empirism +empiristic +empyromancy +empyrosis +emplace +emplaced +emplacement +emplacements +emplaces +emplacing +emplane +emplaned +emplanement +emplanes +emplaning +emplaster +emplastic +emplastra +emplastration +emplastrum +emplead +emplectic +emplection +emplectite +emplecton +empleomania +employ +employability +employable +employe +employed +employee +employees +employer +employers +employes +employing +employless +employment +employments +employs +emplore +emplume +emplunge +empocket +empodia +empodium +empoison +empoisoned +empoisoner +empoisoning +empoisonment +empoisons +empolder +emporetic +emporeutic +empory +emporia +emporial +emporiria +empoririums +emporium +emporiums +emporte +emportment +empover +empoverish +empower +empowered +empowering +empowerment +empowers +emprent +empresa +empresario +empress +empresse +empressement +empressements +empresses +empressment +emprime +emprint +emprise +emprises +emprison +emprize +emprizes +emprosthotonic +emprosthotonos +emprosthotonus +empt +empty +emptiable +emptied +emptier +emptiers +empties +emptiest +emptyhearted +emptying +emptily +emptiness +emptings +emptins +emptio +emption +emptional +emptysis +emptive +emptor +emptores +emptory +empurple +empurpled +empurples +empurpling +empusa +empuzzle +emraud +emrode +ems +emu +emulable +emulant +emulate +emulated +emulates +emulating +emulation +emulations +emulative +emulatively +emulator +emulatory +emulators +emulatress +emule +emulge +emulgence +emulgens +emulgent +emulous +emulously +emulousness +emuls +emulsibility +emulsible +emulsic +emulsify +emulsifiability +emulsifiable +emulsification +emulsifications +emulsified +emulsifier +emulsifiers +emulsifies +emulsifying +emulsin +emulsion +emulsionize +emulsions +emulsive +emulsoid +emulsoidal +emulsoids +emulsor +emunct +emunctory +emunctories +emundation +emunge +emus +emuscation +emusify +emusified +emusifies +emusifying +emusive +en +enable +enabled +enablement +enabler +enablers +enables +enabling +enact +enactable +enacted +enacting +enaction +enactive +enactment +enactments +enactor +enactory +enactors +enacts +enacture +enaena +enage +enajim +enalid +enaliornis +enaliosaur +enaliosauria +enaliosaurian +enalyron +enalite +enallachrome +enallage +enaluron +enam +enamber +enambush +enamdar +enamel +enameled +enameler +enamelers +enameling +enamelist +enamellar +enamelled +enameller +enamellers +enamelless +enamelling +enamellist +enameloma +enamels +enamelware +enamelwork +enami +enamine +enamines +enamor +enamorado +enamorate +enamorato +enamored +enamoredness +enamoring +enamorment +enamors +enamour +enamoured +enamouredness +enamouring +enamourment +enamours +enanguish +enanthem +enanthema +enanthematous +enanthesis +enantiobiosis +enantioblastic +enantioblastous +enantiomer +enantiomeric +enantiomeride +enantiomorph +enantiomorphy +enantiomorphic +enantiomorphism +enantiomorphous +enantiomorphously +enantiopathy +enantiopathia +enantiopathic +enantioses +enantiosis +enantiotropy +enantiotropic +enantobiosis +enapt +enarbor +enarbour +enarch +enarched +enargite +enarm +enarme +enarration +enarthrodia +enarthrodial +enarthroses +enarthrosis +enascent +enatant +enate +enates +enatic +enation +enations +enaunter +enbaissing +enbibe +enbloc +enbranglement +enbrave +enbusshe +enc +encadre +encaenia +encage +encaged +encages +encaging +encake +encalendar +encallow +encamp +encamped +encamping +encampment +encampments +encamps +encanker +encanthis +encapsulate +encapsulated +encapsulates +encapsulating +encapsulation +encapsulations +encapsule +encapsuled +encapsules +encapsuling +encaptivate +encaptive +encardion +encarditis +encarnadine +encarnalise +encarnalised +encarnalising +encarnalize +encarnalized +encarnalizing +encarpa +encarpi +encarpium +encarpus +encarpuspi +encase +encased +encasement +encases +encash +encashable +encashed +encashes +encashing +encashment +encasing +encasserole +encastage +encastered +encastre +encastrement +encatarrhaphy +encauma +encaustes +encaustic +encaustically +encave +encefalon +enceint +enceinte +enceintes +encelia +encell +encense +encenter +encephala +encephalalgia +encephalartos +encephalasthenia +encephalic +encephalin +encephalitic +encephalitis +encephalitogenic +encephalocele +encephalocoele +encephalodialysis +encephalogram +encephalograph +encephalography +encephalographic +encephalographically +encephaloid +encephalola +encephalolith +encephalology +encephaloma +encephalomalacia +encephalomalacosis +encephalomalaxis +encephalomas +encephalomata +encephalomeningitis +encephalomeningocele +encephalomere +encephalomeric +encephalometer +encephalometric +encephalomyelitic +encephalomyelitis +encephalomyelopathy +encephalomyocarditis +encephalon +encephalonarcosis +encephalopathy +encephalopathia +encephalopathic +encephalophyma +encephalopyosis +encephalopsychesis +encephalorrhagia +encephalos +encephalosclerosis +encephaloscope +encephaloscopy +encephalosepsis +encephalosis +encephalospinal +encephalothlipsis +encephalotome +encephalotomy +encephalotomies +encephalous +enchafe +enchain +enchained +enchainement +enchainements +enchaining +enchainment +enchainments +enchains +enchair +enchalice +enchancement +enchannel +enchant +enchanted +enchanter +enchantery +enchanters +enchanting +enchantingly +enchantingness +enchantment +enchantments +enchantress +enchantresses +enchants +encharge +encharged +encharging +encharm +encharnel +enchase +enchased +enchaser +enchasers +enchases +enchasing +enchasten +encheason +encheat +encheck +encheer +encheiria +enchelycephali +enchequer +encheson +enchesoun +enchest +enchilada +enchiladas +enchylema +enchylematous +enchyma +enchymatous +enchiridia +enchiridion +enchiridions +enchiriridia +enchisel +enchytrae +enchytraeid +enchytraeidae +enchytraeus +enchodontid +enchodontidae +enchodontoid +enchodus +enchondroma +enchondromas +enchondromata +enchondromatous +enchondrosis +enchorial +enchoric +enchronicle +enchurch +ency +encia +encyc +encycl +encyclic +encyclical +encyclicals +encyclics +encyclopaedia +encyclopaediac +encyclopaedial +encyclopaedian +encyclopaedias +encyclopaedic +encyclopaedical +encyclopaedically +encyclopaedism +encyclopaedist +encyclopaedize +encyclopedia +encyclopediac +encyclopediacal +encyclopedial +encyclopedian +encyclopedias +encyclopediast +encyclopedic +encyclopedical +encyclopedically +encyclopedism +encyclopedist +encyclopedize +encydlopaedic +enciente +encina +encinal +encinas +encincture +encinctured +encincturing +encinder +encinillo +encipher +enciphered +encipherer +enciphering +encipherment +encipherments +enciphers +encircle +encircled +encirclement +encirclements +encircler +encircles +encircling +encyrtid +encyrtidae +encist +encyst +encystation +encysted +encysting +encystment +encystments +encysts +encitadel +encl +enclaret +enclasp +enclasped +enclasping +enclasps +enclave +enclaved +enclavement +enclaves +enclaving +enclear +enclisis +enclitic +enclitical +enclitically +enclitics +encloak +enclog +encloister +enclosable +enclose +enclosed +encloser +enclosers +encloses +enclosing +enclosure +enclosures +enclothe +encloud +encoach +encode +encoded +encodement +encoder +encoders +encodes +encoding +encodings +encoffin +encoffinment +encoignure +encoignures +encoil +encolden +encollar +encolor +encolour +encolpia +encolpion +encolumn +encolure +encomendero +encomy +encomia +encomiast +encomiastic +encomiastical +encomiastically +encomic +encomienda +encomiendas +encomimia +encomimiums +encomiologic +encomium +encomiumia +encomiums +encommon +encompany +encompass +encompassed +encompasser +encompasses +encompassing +encompassment +encoop +encopreses +encopresis +encorbellment +encorbelment +encore +encored +encores +encoring +encoronal +encoronate +encoronet +encorpore +encounter +encounterable +encountered +encounterer +encounterers +encountering +encounters +encourage +encouraged +encouragement +encouragements +encourager +encouragers +encourages +encouraging +encouragingly +encover +encowl +encraal +encradle +encranial +encraty +encratic +encratism +encratite +encrease +encreel +encrimson +encrinal +encrinic +encrinidae +encrinital +encrinite +encrinitic +encrinitical +encrinoid +encrinoidea +encrinus +encrypt +encrypted +encrypting +encryption +encryptions +encrypts +encrisp +encroach +encroached +encroacher +encroaches +encroaching +encroachingly +encroachment +encroachments +encrotchet +encrown +encrownment +encrust +encrustant +encrustation +encrusted +encrusting +encrustment +encrusts +encuirassed +enculturate +enculturated +enculturating +enculturation +enculturative +encumber +encumbered +encumberer +encumbering +encumberingly +encumberment +encumbers +encumbrance +encumbrancer +encumbrances +encumbrous +encup +encurl +encurtain +encushion +end +endable +endamage +endamageable +endamaged +endamagement +endamages +endamaging +endamask +endameba +endamebae +endamebas +endamebiasis +endamebic +endamnify +endamoeba +endamoebae +endamoebas +endamoebiasis +endamoebic +endamoebidae +endangeitis +endanger +endangered +endangerer +endangering +endangerment +endangerments +endangers +endangiitis +endangitis +endangium +endaortic +endaortitis +endarch +endarchy +endarchies +endark +endarterectomy +endarteria +endarterial +endarteritis +endarterium +endarteteria +endaseh +endaspidean +endaze +endball +endboard +endbrain +endbrains +enddamage +enddamaged +enddamaging +ende +endear +endearance +endeared +endearedly +endearedness +endearing +endearingly +endearingness +endearment +endearments +endears +endeavor +endeavored +endeavorer +endeavoring +endeavors +endeavour +endeavoured +endeavourer +endeavouring +endebt +endecha +ended +endeictic +endeign +endellionite +endemial +endemic +endemical +endemically +endemicity +endemics +endemiology +endemiological +endemism +endemisms +endenization +endenize +endenizen +endent +ender +endere +endergonic +endermatic +endermic +endermically +enderon +enderonic +enders +endevil +endew +endexine +endexines +endfile +endgame +endgate +endhand +endia +endiablee +endiadem +endiaper +endict +endyma +endymal +endimanche +endymion +ending +endings +endysis +endite +endited +endites +enditing +endive +endives +endjunk +endleaf +endleaves +endless +endlessly +endlessness +endlichite +endlong +endmatcher +endmost +endnote +endnotes +endoabdominal +endoangiitis +endoaortitis +endoappendicitis +endoarteritis +endoauscultation +endobatholithic +endobiotic +endoblast +endoblastic +endobronchial +endobronchially +endobronchitis +endocannibalism +endocardia +endocardiac +endocardial +endocarditic +endocarditis +endocardium +endocarp +endocarpal +endocarpic +endocarpoid +endocarps +endocellular +endocentric +endoceras +endoceratidae +endoceratite +endoceratitic +endocervical +endocervicitis +endochylous +endochondral +endochorion +endochorionic +endochrome +endocycle +endocyclic +endocyemate +endocyst +endocystitis +endocytic +endocytosis +endocytotic +endoclinal +endocline +endocoelar +endocoele +endocoeliac +endocolitis +endocolpitis +endocondensation +endocone +endoconidia +endoconidium +endocorpuscular +endocortex +endocrania +endocranial +endocranium +endocrin +endocrinal +endocrine +endocrines +endocrinic +endocrinism +endocrinology +endocrinologic +endocrinological +endocrinologies +endocrinologist +endocrinologists +endocrinopath +endocrinopathy +endocrinopathic +endocrinotherapy +endocrinous +endocritic +endoderm +endodermal +endodermic +endodermis +endoderms +endodynamomorphic +endodontia +endodontic +endodontically +endodontics +endodontist +endodontium +endodontology +endodontologist +endoenteritis +endoenzyme +endoergic +endoerythrocytic +endoesophagitis +endofaradism +endogalvanism +endogamy +endogamic +endogamies +endogamous +endogastric +endogastrically +endogastritis +endogen +endogenae +endogenesis +endogenetic +endogeny +endogenic +endogenicity +endogenies +endogenous +endogenously +endogens +endoglobular +endognath +endognathal +endognathion +endogonidium +endointoxication +endokaryogamy +endolabyrinthitis +endolaryngeal +endolemma +endolymph +endolymphangial +endolymphatic +endolymphic +endolysin +endolithic +endolumbar +endomastoiditis +endome +endomesoderm +endometry +endometria +endometrial +endometriosis +endometritis +endometrium +endomyces +endomycetaceae +endomictic +endomysial +endomysium +endomitosis +endomitotic +endomixis +endomorph +endomorphy +endomorphic +endomorphism +endoneurial +endoneurium +endonuclear +endonuclease +endonucleolus +endoparasite +endoparasitic +endoparasitica +endoparasitism +endopathic +endopelvic +endopeptidase +endopericarditis +endoperidial +endoperidium +endoperitonitis +endophagy +endophagous +endophasia +endophasic +endophyllaceae +endophyllous +endophyllum +endophytal +endophyte +endophytic +endophytically +endophytous +endophlebitis +endophragm +endophragmal +endoplasm +endoplasma +endoplasmic +endoplast +endoplastron +endoplastular +endoplastule +endopleura +endopleural +endopleurite +endopleuritic +endopod +endopodite +endopoditic +endopods +endopolyploid +endopolyploidy +endoproct +endoprocta +endoproctous +endopsychic +endopterygota +endopterygote +endopterygotic +endopterygotism +endopterygotous +endorachis +endoradiosonde +endoral +endore +endorhinitis +endorphin +endorsable +endorsation +endorse +endorsed +endorsee +endorsees +endorsement +endorsements +endorser +endorsers +endorses +endorsing +endorsingly +endorsor +endorsors +endosalpingitis +endosarc +endosarcode +endosarcous +endosarcs +endosclerite +endoscope +endoscopes +endoscopy +endoscopic +endoscopically +endoscopies +endoscopist +endosecretory +endosepsis +endosymbiosis +endosiphon +endosiphonal +endosiphonate +endosiphuncle +endoskeletal +endoskeleton +endoskeletons +endosmic +endosmometer +endosmometric +endosmos +endosmose +endosmoses +endosmosic +endosmosis +endosmotic +endosmotically +endosome +endosomes +endosperm +endospermic +endospermous +endospore +endosporia +endosporic +endosporium +endosporous +endosporously +endoss +endostea +endosteal +endosteally +endosteitis +endosteoma +endosteomas +endosteomata +endosternite +endosternum +endosteum +endostylar +endostyle +endostylic +endostitis +endostoma +endostomata +endostome +endostosis +endostraca +endostracal +endostracum +endosulfan +endotheca +endothecal +endothecate +endothecia +endothecial +endothecium +endothelia +endothelial +endothelioblastoma +endotheliocyte +endothelioid +endotheliolysin +endotheliolytic +endothelioma +endotheliomas +endotheliomata +endotheliomyoma +endotheliomyxoma +endotheliotoxin +endotheliulia +endothelium +endotheloid +endotherm +endothermal +endothermy +endothermic +endothermically +endothermism +endothermous +endothia +endothys +endothoracic +endothorax +endothrix +endotys +endotoxic +endotoxin +endotoxoid +endotracheal +endotracheitis +endotrachelitis +endotrophi +endotrophic +endotropic +endoubt +endoute +endovaccination +endovasculitis +endovenous +endover +endow +endowed +endower +endowers +endowing +endowment +endowments +endows +endozoa +endozoic +endpaper +endpapers +endpiece +endplay +endplate +endplates +endpleasure +endpoint +endpoints +endrin +endrins +endromididae +endromis +endrudge +endrumpf +ends +endseal +endshake +endsheet +endship +endsweep +endue +endued +enduement +endues +enduing +endungeon +endura +endurability +endurable +endurableness +endurably +endurance +endurant +endure +endured +endurer +endures +enduring +enduringly +enduringness +enduro +enduros +endways +endwise +eneas +enecate +eneclann +ened +eneid +enema +enemas +enemata +enemy +enemied +enemies +enemying +enemylike +enemyship +enent +enepidermic +energeia +energesis +energetic +energetical +energetically +energeticalness +energeticist +energeticness +energetics +energetistic +energy +energiatye +energic +energical +energico +energid +energids +energies +energise +energised +energiser +energises +energising +energism +energist +energistic +energize +energized +energizer +energizers +energizes +energizing +energumen +energumenon +enervate +enervated +enervates +enervating +enervation +enervative +enervator +enervators +enerve +enervous +enetophobia +eneuch +eneugh +enew +enface +enfaced +enfacement +enfaces +enfacing +enfamish +enfamous +enfant +enfants +enfarce +enfasten +enfatico +enfavor +enfeature +enfect +enfeeble +enfeebled +enfeeblement +enfeeblements +enfeebler +enfeebles +enfeebling +enfeeblish +enfelon +enfeoff +enfeoffed +enfeoffing +enfeoffment +enfeoffs +enfester +enfetter +enfettered +enfettering +enfetters +enfever +enfevered +enfevering +enfevers +enfief +enfield +enfierce +enfigure +enfilade +enfiladed +enfilades +enfilading +enfile +enfiled +enfin +enfire +enfirm +enflagellate +enflagellation +enflame +enflamed +enflames +enflaming +enflesh +enfleurage +enflower +enflowered +enflowering +enfoeffment +enfoil +enfold +enfolded +enfolden +enfolder +enfolders +enfolding +enfoldings +enfoldment +enfolds +enfollow +enfonce +enfonced +enfoncee +enforce +enforceability +enforceable +enforced +enforcedly +enforcement +enforcer +enforcers +enforces +enforcibility +enforcible +enforcing +enforcingly +enforcive +enforcively +enforest +enfork +enform +enfort +enforth +enfortune +enfoul +enfoulder +enfrai +enframe +enframed +enframement +enframes +enframing +enfranch +enfranchisable +enfranchise +enfranchised +enfranchisement +enfranchisements +enfranchiser +enfranchises +enfranchising +enfree +enfrenzy +enfroward +enfuddle +enfume +enfurrow +eng +engage +engaged +engagedly +engagedness +engagee +engagement +engagements +engager +engagers +engages +engaging +engagingly +engagingness +engallant +engaol +engarb +engarble +engarde +engarland +engarment +engarrison +engastrimyth +engastrimythic +engaud +engaze +engelmann +engelmanni +engelmannia +engem +engender +engendered +engenderer +engendering +engenderment +engenders +engendrure +engendure +engerminate +enghle +enghosted +engild +engilded +engilding +engilds +engin +engine +engined +engineer +engineered +engineery +engineering +engineeringly +engineers +engineership +enginehouse +engineless +enginelike +engineman +enginemen +enginery +engineries +engines +engining +enginous +engird +engirded +engirding +engirdle +engirdled +engirdles +engirdling +engirds +engirt +engiscope +engyscope +engysseismology +engystomatidae +engjateigur +engl +englacial +englacially +englad +engladden +england +englander +englanders +englante +engle +engleim +engler +englerophoenix +englify +englifier +englyn +englyns +english +englishable +englished +englisher +englishes +englishhood +englishing +englishism +englishize +englishly +englishman +englishmen +englishness +englishry +englishwoman +englishwomen +englobe +englobed +englobement +englobing +engloom +englory +englue +englut +englute +engluts +englutted +englutting +engnessang +engobe +engold +engolden +engore +engorge +engorged +engorgement +engorges +engorging +engoue +engouee +engouement +engouled +engoument +engr +engrace +engraced +engracing +engraff +engraffed +engraffing +engraft +engraftation +engrafted +engrafter +engrafting +engraftment +engrafts +engrail +engrailed +engrailing +engrailment +engrails +engrain +engrained +engrainedly +engrainer +engraining +engrains +engram +engramma +engrammatic +engramme +engrammes +engrammic +engrams +engrandize +engrandizement +engraphy +engraphia +engraphic +engraphically +engrapple +engrasp +engraulidae +engraulis +engrave +engraved +engravement +engraven +engraver +engravers +engraves +engraving +engravings +engreaten +engreen +engrege +engregge +engrid +engrieve +engroove +engross +engrossed +engrossedly +engrosser +engrossers +engrosses +engrossing +engrossingly +engrossingness +engrossment +engs +enguard +engulf +engulfed +engulfing +engulfment +engulfs +enhaemospore +enhallow +enhalo +enhaloed +enhaloes +enhaloing +enhalos +enhamper +enhance +enhanced +enhancement +enhancements +enhancer +enhancers +enhances +enhancing +enhancive +enhappy +enharbor +enharbour +enharden +enhardy +enharmonic +enharmonical +enharmonically +enhat +enhaulse +enhaunt +enhazard +enhearse +enheart +enhearten +enheaven +enhedge +enhelm +enhemospore +enherit +enheritage +enheritance +enhydra +enhydrinae +enhydris +enhydrite +enhydritic +enhydros +enhydrous +enhypostasia +enhypostasis +enhypostatic +enhypostatize +enhorror +enhort +enhuile +enhunger +enhungered +enhusk +eniac +enicuridae +enid +enif +enigma +enigmas +enigmata +enigmatic +enigmatical +enigmatically +enigmaticalness +enigmatist +enigmatization +enigmatize +enigmatized +enigmatizing +enigmatographer +enigmatography +enigmatology +enigua +enisle +enisled +enisles +enisling +enjail +enjamb +enjambed +enjambement +enjambements +enjambment +enjambments +enjelly +enjeopard +enjeopardy +enjewel +enjoy +enjoyable +enjoyableness +enjoyably +enjoyed +enjoyer +enjoyers +enjoying +enjoyingly +enjoyment +enjoyments +enjoin +enjoinder +enjoinders +enjoined +enjoiner +enjoiners +enjoining +enjoinment +enjoins +enjoys +enkennel +enkerchief +enkernel +enki +enkidu +enkindle +enkindled +enkindler +enkindles +enkindling +enkolpia +enkolpion +enkraal +enl +enlace +enlaced +enlacement +enlaces +enlacing +enlay +enlard +enlarge +enlargeable +enlargeableness +enlarged +enlargedly +enlargedness +enlargement +enlargements +enlarger +enlargers +enlarges +enlarging +enlargingly +enlaurel +enleaf +enleague +enleagued +enleen +enlength +enlevement +enlief +enlife +enlight +enlighten +enlightened +enlightenedly +enlightenedness +enlightener +enlighteners +enlightening +enlighteningly +enlightenment +enlightenments +enlightens +enlimn +enlink +enlinked +enlinking +enlinkment +enlist +enlisted +enlistee +enlistees +enlister +enlisters +enlisting +enlistment +enlistments +enlists +enlive +enliven +enlivened +enlivener +enlivening +enliveningly +enlivenment +enlivenments +enlivens +enlock +enlodge +enlodgement +enlumine +enlure +enlute +enmagazine +enmanche +enmarble +enmarbled +enmarbling +enmask +enmass +enmesh +enmeshed +enmeshes +enmeshing +enmeshment +enmeshments +enmew +enmist +enmity +enmities +enmoss +enmove +enmuffle +ennage +enneacontahedral +enneacontahedron +ennead +enneadianome +enneadic +enneads +enneaeteric +enneagynous +enneagon +enneagonal +enneagons +enneahedra +enneahedral +enneahedria +enneahedron +enneahedrons +enneandrian +enneandrous +enneapetalous +enneaphyllous +enneasemic +enneasepalous +enneasyllabic +enneaspermous +enneastylar +enneastyle +enneastylos +enneateric +enneatic +enneatical +ennedra +ennerve +ennew +ennia +enniche +ennoble +ennobled +ennoblement +ennoblements +ennobler +ennoblers +ennobles +ennobling +ennoblingly +ennoblment +ennoy +ennoic +ennomic +ennui +ennuyant +ennuyante +ennuye +ennuied +ennuyee +ennuying +ennuis +enoch +enochic +enocyte +enodal +enodally +enodate +enodation +enode +enoil +enoint +enol +enolase +enolases +enolate +enolic +enolizable +enolization +enolize +enolized +enolizing +enology +enological +enologies +enologist +enols +enomania +enomaniac +enomotarch +enomoty +enophthalmos +enophthalmus +enopla +enoplan +enoplion +enoptromancy +enorganic +enorm +enormious +enormity +enormities +enormous +enormously +enormousness +enorn +enorthotrope +enos +enosis +enosises +enosist +enostosis +enough +enoughs +enounce +enounced +enouncement +enounces +enouncing +enow +enows +enphytotic +enpia +enplane +enplaned +enplanement +enplanes +enplaning +enquarter +enquere +enqueue +enqueued +enqueues +enquicken +enquire +enquired +enquirer +enquires +enquiry +enquiries +enquiring +enrace +enrage +enraged +enragedly +enragedness +enragement +enrages +enraging +enray +enrail +enramada +enrange +enrank +enrapt +enrapted +enrapting +enrapts +enrapture +enraptured +enrapturedly +enrapturer +enraptures +enrapturing +enravish +enravished +enravishes +enravishing +enravishingly +enravishment +enregiment +enregister +enregistered +enregistering +enregistration +enregistry +enrheum +enrib +enrich +enriched +enrichener +enricher +enrichers +enriches +enriching +enrichingly +enrichment +enrichments +enridged +enright +enring +enringed +enringing +enripen +enrive +enrobe +enrobed +enrobement +enrober +enrobers +enrobes +enrobing +enrockment +enrol +enroll +enrolle +enrolled +enrollee +enrollees +enroller +enrollers +enrolles +enrolling +enrollment +enrollments +enrolls +enrolment +enrols +enroot +enrooted +enrooting +enroots +enrough +enround +enruin +enrut +ens +ensafe +ensaffron +ensaint +ensalada +ensample +ensampler +ensamples +ensand +ensandal +ensanguine +ensanguined +ensanguining +ensate +enscale +enscene +enschedule +ensconce +ensconced +ensconces +ensconcing +enscroll +enscrolled +enscrolling +enscrolls +ensculpture +ense +enseal +ensealed +ensealing +enseam +ensear +ensearch +ensearcher +enseat +enseated +enseating +enseel +enseem +ensellure +ensemble +ensembles +ensepulcher +ensepulchered +ensepulchering +ensepulchre +enseraph +enserf +enserfed +enserfing +enserfment +enserfs +ensete +enshade +enshadow +enshawl +ensheath +ensheathe +ensheathed +ensheathes +ensheathing +ensheaths +enshell +enshelter +enshield +enshielded +enshielding +enshrine +enshrined +enshrinement +enshrinements +enshrines +enshrining +enshroud +enshrouded +enshrouding +enshrouds +ensient +ensiferi +ensiform +ensign +ensigncy +ensigncies +ensigned +ensignhood +ensigning +ensignment +ensignry +ensigns +ensignship +ensilability +ensilage +ensilaged +ensilages +ensilaging +ensilate +ensilation +ensile +ensiled +ensiles +ensiling +ensilist +ensilver +ensindon +ensynopticity +ensisternal +ensisternum +ensky +enskied +enskyed +enskies +enskying +enslave +enslaved +enslavedness +enslavement +enslavements +enslaver +enslavers +enslaves +enslaving +enslumber +ensmall +ensnare +ensnared +ensnarement +ensnarements +ensnarer +ensnarers +ensnares +ensnaring +ensnaringly +ensnarl +ensnarled +ensnarling +ensnarls +ensnow +ensober +ensophic +ensorcel +ensorceled +ensorceling +ensorcelize +ensorcell +ensorcellment +ensorcels +ensorcerize +ensorrow +ensoul +ensouled +ensouling +ensouls +enspangle +enspell +ensphere +ensphered +enspheres +ensphering +enspirit +ensporia +enstamp +enstar +enstate +enstatite +enstatitic +enstatitite +enstatolite +ensteel +ensteep +enstyle +enstool +enstore +enstranged +enstrengthen +ensuable +ensuance +ensuant +ensue +ensued +ensuer +ensues +ensuing +ensuingly +ensuite +ensulphur +ensurance +ensure +ensured +ensurer +ensurers +ensures +ensuring +enswathe +enswathed +enswathement +enswathes +enswathing +ensweep +ensweeten +entablature +entablatured +entablement +entablements +entach +entackle +entad +entada +entail +entailable +entailed +entailer +entailers +entailing +entailment +entailments +entails +ental +entalent +entally +entame +entameba +entamebae +entamebas +entamebic +entamoeba +entamoebiasis +entamoebic +entangle +entangleable +entangled +entangledly +entangledness +entanglement +entanglements +entangler +entanglers +entangles +entangling +entanglingly +entapophysial +entapophysis +entarthrotic +entases +entasia +entasias +entasis +entassment +entastic +entea +entelam +entelechy +entelechial +entelechies +entellus +entelluses +entelodon +entelodont +entempest +entemple +entender +entendre +entendres +entente +ententes +ententophil +entepicondylar +enter +entera +enterable +enteraden +enteradenography +enteradenographic +enteradenology +enteradenological +enteral +enteralgia +enterally +enterate +enterauxe +enterclose +enterectomy +enterectomies +entered +enterer +enterers +enterfeat +entergogenic +enteria +enteric +entericoid +entering +enteritidis +enteritis +entermete +entermise +enteroanastomosis +enterobacterial +enterobacterium +enterobiasis +enterobiliary +enterocele +enterocentesis +enteroceptor +enterochirurgia +enterochlorophyll +enterocholecystostomy +enterochromaffin +enterocinesia +enterocinetic +enterocyst +enterocystoma +enterocleisis +enteroclisis +enteroclysis +enterococcal +enterococci +enterococcus +enterocoel +enterocoela +enterocoele +enterocoelic +enterocoelous +enterocolitis +enterocolostomy +enterocrinin +enterodelous +enterodynia +enteroepiplocele +enterogastritis +enterogastrone +enterogenous +enterogram +enterograph +enterography +enterohelcosis +enterohemorrhage +enterohepatitis +enterohydrocele +enteroid +enterointestinal +enteroischiocele +enterokinase +enterokinesia +enterokinetic +enterolysis +enterolith +enterolithiasis +enterolobium +enterology +enterologic +enterological +enteromegaly +enteromegalia +enteromere +enteromesenteric +enteromycosis +enteromyiasis +enteromorpha +enteron +enteroneuritis +enterons +enteroparalysis +enteroparesis +enteropathy +enteropathogenic +enteropexy +enteropexia +enterophthisis +enteroplasty +enteroplegia +enteropneust +enteropneusta +enteropneustal +enteropneustan +enteroptosis +enteroptotic +enterorrhagia +enterorrhaphy +enterorrhea +enterorrhexis +enteroscope +enteroscopy +enterosepsis +enterosyphilis +enterospasm +enterostasis +enterostenosis +enterostomy +enterostomies +enterotome +enterotomy +enterotoxemia +enterotoxication +enterotoxin +enteroviral +enterovirus +enterozoa +enterozoan +enterozoic +enterozoon +enterparlance +enterpillar +enterprise +enterprised +enterpriseless +enterpriser +enterprises +enterprising +enterprisingly +enterprisingness +enterprize +enterritoriality +enterrologist +enters +entertain +entertainable +entertained +entertainer +entertainers +entertaining +entertainingly +entertainingness +entertainment +entertainments +entertains +entertake +entertissue +entete +entfaoilff +enthalpy +enthalpies +entheal +enthean +entheasm +entheate +enthelmintha +enthelminthes +enthelminthic +entheos +enthetic +enthymematic +enthymematical +enthymeme +enthral +enthraldom +enthrall +enthralldom +enthralled +enthraller +enthralling +enthrallingly +enthrallment +enthrallments +enthralls +enthralment +enthrals +enthrill +enthrone +enthroned +enthronement +enthronements +enthrones +enthrong +enthroning +enthronise +enthronised +enthronising +enthronization +enthronize +enthronized +enthronizing +enthuse +enthused +enthuses +enthusiasm +enthusiasms +enthusiast +enthusiastic +enthusiastical +enthusiastically +enthusiasticalness +enthusiastly +enthusiasts +enthusing +entia +entice +enticeable +enticed +enticeful +enticement +enticements +enticer +enticers +entices +enticing +enticingly +enticingness +entier +enties +entify +entifical +entification +entyloma +entincture +entypies +entire +entirely +entireness +entires +entirety +entireties +entiris +entirities +entitative +entitatively +entity +entities +entitle +entitled +entitledness +entitlement +entitles +entitling +entitule +entoblast +entoblastic +entobranchiate +entobronchium +entocalcaneal +entocarotid +entocele +entocyemate +entocyst +entocnemial +entocoel +entocoele +entocoelic +entocondylar +entocondyle +entocondyloid +entocone +entoconid +entocornea +entocranial +entocuneiform +entocuniform +entoderm +entodermal +entodermic +entoderms +entogastric +entogenous +entoglossal +entohyal +entoil +entoiled +entoiling +entoilment +entoils +entoire +entoloma +entom +entomb +entombed +entombing +entombment +entombments +entombs +entomere +entomeric +entomic +entomical +entomion +entomofauna +entomogenous +entomoid +entomol +entomolegist +entomolite +entomology +entomologic +entomological +entomologically +entomologies +entomologise +entomologised +entomologising +entomologist +entomologists +entomologize +entomologized +entomologizing +entomophaga +entomophagan +entomophagous +entomophila +entomophily +entomophilous +entomophytous +entomophobia +entomophthora +entomophthoraceae +entomophthoraceous +entomophthorales +entomophthorous +entomosporium +entomostraca +entomostracan +entomostracous +entomotaxy +entomotomy +entomotomist +entone +entonement +entonic +entoolitic +entoparasite +entoparasitic +entoperipheral +entophytal +entophyte +entophytic +entophytically +entophytous +entopic +entopical +entoplasm +entoplastic +entoplastral +entoplastron +entopopliteal +entoproct +entoprocta +entoproctous +entopterygoid +entoptic +entoptical +entoptically +entoptics +entoptoscope +entoptoscopy +entoptoscopic +entoretina +entorganism +entortill +entosarc +entosclerite +entosphenal +entosphenoid +entosphere +entosterna +entosternal +entosternite +entosternum +entosthoblast +entothorax +entotic +entotympanic +entotrophi +entour +entourage +entourages +entozoa +entozoal +entozoan +entozoans +entozoarian +entozoic +entozoology +entozoological +entozoologically +entozoologist +entozoon +entr +entracte +entrada +entradas +entrail +entrails +entrain +entrained +entrainer +entraining +entrainment +entrains +entrammel +entrance +entranced +entrancedly +entrancement +entrancements +entrancer +entrances +entranceway +entrancing +entrancingly +entrant +entrants +entrap +entrapment +entrapments +entrapped +entrapper +entrapping +entrappingly +entraps +entre +entreasure +entreasured +entreasuring +entreat +entreatable +entreated +entreater +entreatful +entreaty +entreaties +entreating +entreatingly +entreatment +entreats +entrec +entrechat +entrechats +entrecote +entrecotes +entredeux +entree +entrees +entrefer +entrelac +entremess +entremets +entrench +entrenched +entrenches +entrenching +entrenchment +entrenchments +entrep +entrepas +entrepeneur +entrepeneurs +entrepot +entrepots +entreprenant +entrepreneur +entrepreneurial +entrepreneurs +entrepreneurship +entrepreneuse +entrepreneuses +entrept +entrer +entresalle +entresol +entresols +entresse +entrez +entry +entria +entries +entrike +entryman +entrymen +entryway +entryways +entrochite +entrochus +entropy +entropies +entropion +entropionize +entropium +entrough +entrust +entrusted +entrusting +entrustment +entrusts +entte +entune +enturret +entwine +entwined +entwinement +entwines +entwining +entwist +entwisted +entwisting +entwists +entwite +enucleate +enucleated +enucleating +enucleation +enucleator +enukki +enumerability +enumerable +enumerably +enumerate +enumerated +enumerates +enumerating +enumeration +enumerations +enumerative +enumerator +enumerators +enunciability +enunciable +enunciate +enunciated +enunciates +enunciating +enunciation +enunciations +enunciative +enunciatively +enunciator +enunciatory +enunciators +enure +enured +enures +enureses +enuresis +enuresises +enuretic +enuring +enurny +env +envaye +envapor +envapour +envassal +envassalage +envault +enveigle +enveil +envelop +envelope +enveloped +enveloper +envelopers +envelopes +enveloping +envelopment +envelopments +envelops +envenom +envenomation +envenomed +envenoming +envenomization +envenomous +envenoms +enventual +enverdure +envergure +envermeil +envy +enviable +enviableness +enviably +envied +envier +enviers +envies +envigor +envying +envyingly +envine +envined +envineyard +envious +enviously +enviousness +envire +enviroment +environ +environage +environal +environed +environic +environing +environment +environmental +environmentalism +environmentalist +environmentalists +environmentally +environments +environs +envisage +envisaged +envisagement +envisages +envisaging +envision +envisioned +envisioning +envisionment +envisions +envoi +envoy +envois +envoys +envoyship +envolume +envolupen +enwall +enwallow +enweave +enweaved +enweaving +enweb +enwheel +enwheeled +enwheeling +enwheels +enwiden +enwind +enwinding +enwinds +enwing +enwingly +enwisen +enwoman +enwomb +enwombed +enwombing +enwombs +enwood +enworthed +enworthy +enwound +enwove +enwoven +enwrap +enwrapment +enwrapped +enwrapping +enwraps +enwrapt +enwreath +enwreathe +enwreathed +enwreathing +enwrite +enwrought +enwwove +enwwoven +enzygotic +enzym +enzymatic +enzymatically +enzyme +enzymes +enzymic +enzymically +enzymolysis +enzymolytic +enzymology +enzymologies +enzymologist +enzymosis +enzymotic +enzyms +enzone +enzooty +enzootic +enzootically +enzootics +eo +eoan +eoanthropus +eobiont +eobionts +eocarboniferous +eocene +eodevonian +eodiscid +eof +eogaea +eogaean +eoghanacht +eohippus +eohippuses +eoith +eoiths +eolation +eole +eolian +eolienne +eolipile +eolipiles +eolith +eolithic +eoliths +eolopile +eolopiles +eolotropic +eom +eomecon +eon +eonian +eonism +eonisms +eons +eopalaeozoic +eopaleozoic +eophyte +eophytic +eophyton +eorhyolite +eos +eosate +eosaurus +eoside +eosin +eosinate +eosine +eosines +eosinic +eosinlike +eosinoblast +eosinophil +eosinophile +eosinophilia +eosinophilic +eosinophilous +eosins +eosophobia +eosphorite +eozoic +eozoon +eozoonal +ep +epa +epacmaic +epacme +epacrid +epacridaceae +epacridaceous +epacris +epact +epactal +epacts +epaenetic +epagoge +epagogic +epagomenae +epagomenal +epagomenic +epagomenous +epaleaceous +epalpate +epalpebrate +epanadiplosis +epanagoge +epanalepsis +epanaleptic +epanaphora +epanaphoral +epanastrophe +epanisognathism +epanisognathous +epanody +epanodos +epanorthidae +epanorthoses +epanorthosis +epanorthotic +epanthous +epapillate +epapophysial +epapophysis +epappose +eparch +eparchate +eparchean +eparchy +eparchial +eparchies +eparchs +eparcuale +eparterial +epaule +epaulement +epaulet +epauleted +epaulets +epaulette +epauletted +epauliere +epaxial +epaxially +epedaphic +epee +epeeist +epeeists +epees +epeidia +epeira +epeiric +epeirid +epeiridae +epeirogenesis +epeirogenetic +epeirogeny +epeirogenic +epeirogenically +epeisodia +epeisodion +epembryonic +epencephal +epencephala +epencephalic +epencephalon +epencephalons +ependyma +ependymal +ependymary +ependyme +ependymitis +ependymoma +ependytes +epenetic +epenla +epentheses +epenthesis +epenthesize +epenthetic +epephragmal +epepophysial +epepophysis +epergne +epergnes +eperlan +eperotesis +eperua +eperva +epeus +epexegeses +epexegesis +epexegetic +epexegetical +epexegetically +epha +ephah +ephahs +ephapse +epharmony +epharmonic +ephas +ephebe +ephebea +ephebeia +ephebeibeia +ephebeion +ephebes +ephebeubea +ephebeum +ephebi +ephebic +epheboi +ephebos +ephebus +ephectic +ephedra +ephedraceae +ephedras +ephedrin +ephedrine +ephedrins +ephelcystic +ephelis +ephemera +ephemerae +ephemeral +ephemerality +ephemeralities +ephemerally +ephemeralness +ephemeran +ephemeras +ephemeric +ephemerid +ephemerida +ephemeridae +ephemerides +ephemeris +ephemerist +ephemeromorph +ephemeromorphic +ephemeron +ephemerons +ephemeroptera +ephemerous +ephererist +ephesian +ephesians +ephesine +ephestia +ephestian +ephetae +ephete +ephetic +ephialtes +ephydra +ephydriad +ephydrid +ephydridae +ephidrosis +ephymnium +ephippia +ephippial +ephippium +ephyra +ephyrae +ephyrula +ephod +ephods +ephoi +ephor +ephoral +ephoralty +ephorate +ephorates +ephori +ephoric +ephors +ephorship +ephorus +ephphatha +ephraim +ephraimite +ephraimitic +ephraimitish +ephraitic +ephrathite +ephthalite +ephthianura +ephthianure +epi +epibasal +epibaterium +epibatholithic +epibatus +epibenthic +epibenthos +epibiotic +epiblast +epiblastema +epiblastic +epiblasts +epiblema +epiblemata +epibole +epiboly +epibolic +epibolies +epibolism +epiboulangerite +epibranchial +epic +epical +epicalyces +epicalyx +epicalyxes +epically +epicanthi +epicanthic +epicanthus +epicardia +epicardiac +epicardial +epicardium +epicarid +epicaridan +epicaridea +epicarides +epicarp +epicarpal +epicarps +epicauta +epicede +epicedia +epicedial +epicedian +epicedium +epicele +epicene +epicenes +epicenism +epicenity +epicenter +epicenters +epicentra +epicentral +epicentre +epicentrum +epicentrums +epicerastic +epiceratodus +epicerebral +epicheirema +epicheiremata +epichil +epichile +epichilia +epichilium +epichindrotic +epichirema +epichlorohydrin +epichondrosis +epichondrotic +epichordal +epichorial +epichoric +epichorion +epichoristic +epichristian +epicycle +epicycles +epicyclic +epicyclical +epicycloid +epicycloidal +epicyemate +epicier +epicyesis +epicism +epicist +epicystotomy +epicyte +epiclastic +epicleidian +epicleidium +epicleses +epiclesis +epicly +epiclidal +epiclike +epiclinal +epicnemial +epicoela +epicoelar +epicoele +epicoelia +epicoeliac +epicoelian +epicoeloma +epicoelous +epicolic +epicondylar +epicondyle +epicondylian +epicondylic +epicondylitis +epicontinental +epicoracohumeral +epicoracoid +epicoracoidal +epicormic +epicorolline +epicortical +epicostal +epicotyl +epicotyleal +epicotyledonary +epicotyls +epicranial +epicranium +epicranius +epicrasis +epicrates +epicrises +epicrisis +epicrystalline +epicritic +epics +epictetian +epicure +epicurean +epicureanism +epicureans +epicures +epicurish +epicurishly +epicurism +epicurize +epicuticle +epicuticular +epideictic +epideictical +epideistic +epidemy +epidemial +epidemic +epidemical +epidemically +epidemicalness +epidemicity +epidemics +epidemiography +epidemiographist +epidemiology +epidemiologic +epidemiological +epidemiologically +epidemiologies +epidemiologist +epidendral +epidendric +epidendron +epidendrum +epiderm +epiderma +epidermal +epidermatic +epidermatoid +epidermatous +epidermic +epidermical +epidermically +epidermidalization +epidermis +epidermization +epidermoid +epidermoidal +epidermolysis +epidermomycosis +epidermophyton +epidermophytosis +epidermose +epidermous +epiderms +epidesmine +epidia +epidialogue +epidiascope +epidiascopic +epidictic +epidictical +epididymal +epididymectomy +epididymides +epididymis +epididymite +epididymitis +epididymodeferentectomy +epididymodeferential +epididymovasostomy +epidymides +epidiorite +epidiorthosis +epidiplosis +epidosite +epidote +epidotes +epidotic +epidotiferous +epidotization +epidural +epifascial +epifauna +epifaunae +epifaunal +epifaunas +epifocal +epifolliculitis +epigaea +epigaeous +epigamic +epigaster +epigastraeum +epigastral +epigastria +epigastrial +epigastric +epigastrical +epigastriocele +epigastrium +epigastrocele +epigeal +epigean +epigee +epigeic +epigene +epigenesis +epigenesist +epigenetic +epigenetically +epigenic +epigenist +epigenous +epigeous +epigeum +epigyne +epigyny +epigynies +epigynous +epigynum +epiglot +epiglottal +epiglottic +epiglottidean +epiglottides +epiglottiditis +epiglottis +epiglottises +epiglottitis +epignathous +epigne +epigon +epigonal +epigonation +epigone +epigoneion +epigones +epigoni +epigonic +epigonichthyidae +epigonichthys +epigonism +epigonium +epigonos +epigonous +epigonousepigons +epigonus +epigram +epigrammatarian +epigrammatic +epigrammatical +epigrammatically +epigrammatise +epigrammatised +epigrammatising +epigrammatism +epigrammatist +epigrammatize +epigrammatized +epigrammatizer +epigrammatizing +epigramme +epigrams +epigraph +epigrapher +epigraphy +epigraphic +epigraphical +epigraphically +epigraphist +epigraphs +epiguanine +epihyal +epihydric +epihydrinic +epihippus +epikeia +epiky +epikia +epikleses +epiklesis +epikouros +epil +epilabra +epilabrum +epilachna +epilachnides +epilamellar +epilaryngeal +epilate +epilated +epilating +epilation +epilator +epilatory +epilegomenon +epilemma +epilemmal +epileny +epilepsy +epilepsia +epilepsies +epileptic +epileptical +epileptically +epileptics +epileptiform +epileptogenic +epileptogenous +epileptoid +epileptology +epileptologist +epilimnetic +epilimnia +epilimnial +epilimnion +epilimnionia +epilithic +epyllia +epyllion +epilobe +epilobiaceae +epilobium +epilog +epilogate +epilogation +epilogic +epilogical +epilogism +epilogist +epilogistic +epilogize +epilogized +epilogizing +epilogs +epilogue +epilogued +epilogues +epiloguing +epiloguize +epiloia +epimachinae +epimacus +epimandibular +epimanikia +epimanikion +epimedium +epimenidean +epimer +epimeral +epimerase +epimere +epimeres +epimeric +epimeride +epimerise +epimerised +epimerising +epimerism +epimerite +epimeritic +epimerize +epimerized +epimerizing +epimeron +epimers +epimerum +epimyocardial +epimyocardium +epimysia +epimysium +epimyth +epimorpha +epimorphic +epimorphism +epimorphosis +epinaoi +epinaos +epinard +epinasty +epinastic +epinastically +epinasties +epineolithic +epinephelidae +epinephelus +epinephrin +epinephrine +epinette +epineuneuria +epineural +epineuria +epineurial +epineurium +epingle +epinglette +epinicia +epinicial +epinician +epinicion +epinyctis +epinikia +epinikian +epinikion +epinine +epionychia +epionychium +epionynychia +epiopticon +epiotic +epipactis +epipaleolithic +epipany +epipanies +epiparasite +epiparodos +epipastic +epipedometry +epipelagic +epiperipheral +epipetalous +epiphany +epiphanic +epiphanies +epiphanise +epiphanised +epiphanising +epiphanize +epiphanized +epiphanizing +epiphanous +epipharyngeal +epipharynx +epiphegus +epiphenomena +epiphenomenal +epiphenomenalism +epiphenomenalist +epiphenomenally +epiphenomenon +epiphylaxis +epiphyll +epiphylline +epiphyllospermous +epiphyllous +epiphyllum +epiphysary +epiphyseal +epiphyseolysis +epiphyses +epiphysial +epiphysis +epiphysitis +epiphytal +epiphyte +epiphytes +epiphytic +epiphytical +epiphytically +epiphytism +epiphytology +epiphytotic +epiphytous +epiphloedal +epiphloedic +epiphloeum +epiphonema +epiphonemae +epiphonemas +epiphora +epiphragm +epiphragmal +epipial +epiplankton +epiplanktonic +epiplasm +epiplasmic +epiplastral +epiplastron +epiplectic +epipleura +epipleurae +epipleural +epiplexis +epiploce +epiplocele +epiploic +epiploitis +epiploon +epiplopexy +epipodia +epipodial +epipodiale +epipodialia +epipodite +epipoditic +epipodium +epipolic +epipolism +epipolize +epiprecoracoid +epiproct +epipsychidion +epipteric +epipterygoid +epipterous +epipubes +epipubic +epipubis +epirhizous +epirogenetic +epirogeny +epirogenic +epirot +epirote +epirotic +epirotulian +epirrhema +epirrhematic +epirrheme +episarcine +episarkine +episcenia +episcenium +episcia +episcias +episclera +episcleral +episcleritis +episcopable +episcopacy +episcopacies +episcopal +episcopalian +episcopalianism +episcopalianize +episcopalians +episcopalism +episcopality +episcopally +episcopant +episcoparian +episcopate +episcopates +episcopation +episcopature +episcope +episcopes +episcopy +episcopicide +episcopise +episcopised +episcopising +episcopization +episcopize +episcopized +episcopizing +episcopolatry +episcotister +episedia +episematic +episememe +episepalous +episyllogism +episynaloephe +episynthetic +episyntheton +episiocele +episiohematoma +episioplasty +episiorrhagia +episiorrhaphy +episiostenosis +episiotomy +episiotomies +episkeletal +episkotister +episodal +episode +episodes +episodial +episodic +episodical +episodically +episomal +episomally +episome +episomes +epispadia +epispadiac +epispadias +epispastic +episperm +epispermic +epispinal +episplenitis +episporangium +epispore +episporium +epist +epistapedial +epistases +epistasy +epistasies +epistasis +epistatic +epistaxis +episteme +epistemic +epistemically +epistemolog +epistemology +epistemological +epistemologically +epistemologist +epistemonic +epistemonical +epistemophilia +epistemophiliac +epistemophilic +epistena +episterna +episternal +episternalia +episternite +episternum +episthotonos +epistylar +epistilbite +epistyle +epistyles +epistylis +epistlar +epistle +epistler +epistlers +epistles +epistolar +epistolary +epistolarian +epistolarily +epistolatory +epistolean +epistoler +epistolet +epistolic +epistolical +epistolise +epistolised +epistolising +epistolist +epistolizable +epistolization +epistolize +epistolized +epistolizer +epistolizing +epistolographer +epistolography +epistolographic +epistolographist +epistoma +epistomal +epistomata +epistome +epistomian +epistroma +epistrophe +epistropheal +epistropheus +epistrophy +epistrophic +epit +epitactic +epitaph +epitapher +epitaphial +epitaphian +epitaphic +epitaphical +epitaphist +epitaphize +epitaphless +epitaphs +epitases +epitasis +epitaxy +epitaxial +epitaxially +epitaxic +epitaxies +epitaxis +epitela +epitendineum +epitenon +epithalami +epithalamy +epithalamia +epithalamial +epithalamiast +epithalamic +epithalamion +epithalamium +epithalamiumia +epithalamiums +epithalamize +epithalamus +epithalline +epithamia +epitheca +epithecal +epithecate +epithecia +epithecial +epithecicia +epithecium +epithelia +epithelial +epithelialize +epithelilia +epitheliliums +epithelioblastoma +epithelioceptor +epitheliogenetic +epithelioglandular +epithelioid +epitheliolysin +epitheliolysis +epitheliolytic +epithelioma +epitheliomas +epitheliomata +epitheliomatous +epitheliomuscular +epitheliosis +epitheliotoxin +epitheliulia +epithelium +epitheliums +epithelization +epithelize +epitheloid +epithem +epitheme +epithermal +epithermally +epithesis +epithet +epithetic +epithetical +epithetically +epithetician +epithetize +epitheton +epithets +epithi +epithyme +epithymetic +epithymetical +epithumetic +epitimesis +epitympa +epitympanic +epitympanum +epityphlitis +epityphlon +epitoke +epitomate +epitomator +epitomatory +epitome +epitomes +epitomic +epitomical +epitomically +epitomisation +epitomise +epitomised +epitomiser +epitomising +epitomist +epitomization +epitomize +epitomized +epitomizer +epitomizes +epitomizing +epitonic +epitoniidae +epitonion +epitonium +epitoxoid +epitra +epitrachelia +epitrachelion +epitrchelia +epitria +epitrichial +epitrichium +epitrite +epitritic +epitrochlea +epitrochlear +epitrochoid +epitrochoidal +epitrope +epitrophy +epitrophic +epituberculosis +epituberculous +epiural +epivalve +epixylous +epizeuxis +epizoa +epizoal +epizoan +epizoarian +epizoic +epizoicide +epizoism +epizoisms +epizoite +epizoites +epizoology +epizoon +epizooty +epizootic +epizootically +epizooties +epizootiology +epizootiologic +epizootiological +epizootiologically +epizootology +epizzoa +eplot +epoch +epocha +epochal +epochally +epoche +epochism +epochist +epochs +epode +epodes +epodic +epoist +epollicate +epomophorus +eponge +eponychium +eponym +eponymy +eponymic +eponymies +eponymism +eponymist +eponymize +eponymous +eponyms +eponymus +epoophoron +epop +epopee +epopees +epopoean +epopoeia +epopoeias +epopoeist +epopt +epoptes +epoptic +epoptist +epornitic +epornitically +epos +eposes +epotation +epoxy +epoxide +epoxides +epoxidize +epoxied +epoxyed +epoxies +epoxying +eppes +eppy +eppie +epris +eprise +eproboscidea +eprosy +eprouvette +epruinose +epsilon +epsilons +epsom +epsomite +eptatretidae +eptatretus +epulary +epulation +epulis +epulo +epuloid +epulones +epulosis +epulotic +epupillate +epural +epurate +epuration +eq +eqpt +equability +equable +equableness +equably +equaeval +equal +equalable +equaled +equaling +equalisation +equalise +equalised +equalises +equalising +equalist +equalitarian +equalitarianism +equality +equalities +equalization +equalize +equalized +equalizer +equalizers +equalizes +equalizing +equalled +equaller +equally +equalling +equalness +equals +equangular +equanimity +equanimous +equanimously +equanimousness +equant +equatability +equatable +equate +equated +equates +equating +equation +equational +equationally +equationism +equationist +equations +equative +equator +equatoreal +equatorial +equatorially +equators +equatorward +equatorwards +equerry +equerries +equerryship +eques +equestrial +equestrian +equestrianism +equestrianize +equestrians +equestrianship +equestrienne +equestriennes +equianchorate +equiangle +equiangular +equiangularity +equianharmonic +equiarticulate +equiatomic +equiaxe +equiaxed +equiaxial +equibalance +equibalanced +equibiradiate +equicaloric +equicellular +equichangeable +equicohesive +equicontinuous +equiconvex +equicostate +equicrural +equicurve +equid +equidense +equidensity +equidiagonal +equidifferent +equidimensional +equidist +equidistance +equidistant +equidistantial +equidistantly +equidistribution +equidiurnal +equidivision +equidominant +equidurable +equielliptical +equiexcellency +equiform +equiformal +equiformity +equiglacial +equigranular +equijacent +equilater +equilateral +equilaterally +equilibrant +equilibrate +equilibrated +equilibrates +equilibrating +equilibration +equilibrations +equilibrative +equilibrator +equilibratory +equilibria +equilibrial +equilibriate +equilibrio +equilibrious +equilibriria +equilibrist +equilibristat +equilibristic +equilibrity +equilibrium +equilibriums +equilibrize +equilin +equiliria +equilobate +equilobed +equilocation +equilucent +equimodal +equimolal +equimolar +equimolecular +equimomental +equimultiple +equinal +equinate +equine +equinecessary +equinely +equines +equinia +equinity +equinities +equinoctial +equinoctially +equinovarus +equinox +equinoxes +equinumerally +equinus +equiomnipotent +equip +equipaga +equipage +equipages +equiparable +equiparant +equiparate +equiparation +equipartile +equipartisan +equipartition +equiped +equipedal +equipede +equipendent +equiperiodic +equipluve +equipment +equipments +equipoise +equipoised +equipoises +equipoising +equipollence +equipollency +equipollent +equipollently +equipollentness +equiponderance +equiponderancy +equiponderant +equiponderate +equiponderated +equiponderating +equiponderation +equiponderous +equipondious +equipostile +equipotent +equipotential +equipotentiality +equipped +equipper +equippers +equipping +equiprobabilism +equiprobabilist +equiprobability +equiprobable +equiprobably +equiproducing +equiproportional +equiproportionality +equips +equipt +equiradial +equiradiate +equiradical +equirotal +equisegmented +equiseta +equisetaceae +equisetaceous +equisetales +equisetic +equisetum +equisetums +equisided +equisignal +equisized +equison +equisonance +equisonant +equispaced +equispatial +equisufficiency +equisurface +equitability +equitable +equitableness +equitably +equitangential +equitant +equitation +equitative +equitemporal +equitemporaneous +equites +equity +equities +equitist +equitriangular +equiv +equivale +equivalence +equivalenced +equivalences +equivalency +equivalencies +equivalencing +equivalent +equivalently +equivalents +equivaliant +equivalue +equivaluer +equivalve +equivalved +equivalvular +equivelocity +equivocacy +equivocacies +equivocal +equivocality +equivocalities +equivocally +equivocalness +equivocate +equivocated +equivocates +equivocating +equivocatingly +equivocation +equivocations +equivocator +equivocatory +equivocators +equivoke +equivokes +equivoluminal +equivoque +equivorous +equivote +equoid +equoidean +equulei +equuleus +equus +equvalent +er +era +erade +eradiate +eradiated +eradiates +eradiating +eradiation +eradicable +eradicably +eradicant +eradicate +eradicated +eradicates +eradicating +eradication +eradications +eradicative +eradicator +eradicatory +eradicators +eradiculose +eragrostis +eral +eranist +eranthemum +eranthis +eras +erasability +erasable +erase +erased +erasement +eraser +erasers +erases +erasing +erasion +erasions +erasmian +erasmus +erastian +erastianism +erastianize +erastus +erasure +erasures +erat +erato +erava +erbia +erbium +erbiums +erd +erdvark +ere +erebus +erechtheum +erechtheus +erechtites +erect +erectable +erected +erecter +erecters +erectile +erectility +erectilities +erecting +erection +erections +erective +erectly +erectness +erectopatent +erector +erectors +erects +erelong +eremacausis +eremian +eremic +eremital +eremite +eremites +eremiteship +eremitic +eremitical +eremitish +eremitism +eremochaeta +eremochaetous +eremology +eremophilous +eremophyte +eremopteris +eremuri +eremurus +erenach +erenow +erepsin +erepsins +erept +ereptase +ereptic +ereption +erer +erethic +erethisia +erethism +erethismic +erethisms +erethistic +erethitic +erethizon +erethizontidae +eretrian +erewhile +erewhiles +erf +erg +ergal +ergamine +ergane +ergasia +ergasterion +ergastic +ergastoplasm +ergastoplasmic +ergastulum +ergatandry +ergatandromorph +ergatandromorphic +ergatandrous +ergate +ergates +ergative +ergatocracy +ergatocrat +ergatogyne +ergatogyny +ergatogynous +ergatoid +ergatomorph +ergatomorphic +ergatomorphism +ergmeter +ergo +ergocalciferol +ergodic +ergodicity +ergogram +ergograph +ergographic +ergoism +ergology +ergomaniac +ergometer +ergometric +ergometrine +ergon +ergonomic +ergonomically +ergonomics +ergonomist +ergonovine +ergophile +ergophobia +ergophobiac +ergophobic +ergoplasm +ergostat +ergosterin +ergosterol +ergot +ergotamine +ergotaminine +ergoted +ergothioneine +ergotic +ergotin +ergotine +ergotinine +ergotism +ergotisms +ergotist +ergotization +ergotize +ergotized +ergotizing +ergotoxin +ergotoxine +ergots +ergs +ergusia +eria +erian +erianthus +eric +erica +ericaceae +ericaceous +ericad +erical +ericales +ericas +ericetal +ericeticolous +ericetum +erichthoid +erichthus +erichtoid +ericineous +ericius +erick +ericoid +ericolin +ericophyte +eridanid +erie +erigenia +erigeron +erigerons +erigible +eriglossa +eriglossate +eryhtrism +erik +erika +erikite +erymanthian +erin +erinaceidae +erinaceous +erinaceus +erineum +eryngium +eringo +eryngo +eringoes +eryngoes +eringos +eryngos +erinys +erinite +erinize +erinnic +erinose +eriobotrya +eriocaulaceae +eriocaulaceous +eriocaulon +eriocomi +eriodendron +eriodictyon +erioglaucine +eriogonum +eriometer +eryon +erionite +eriophyes +eriophyid +eriophyidae +eriophyllous +eriophorum +eryopid +eryops +eryopsid +eriosoma +eriphyle +eris +erysibe +erysimum +erysipelas +erysipelatoid +erysipelatous +erysipeloid +erysipelothrix +erysipelous +erysiphaceae +erysiphe +eristalis +eristic +eristical +eristically +eristics +erithacus +erythea +erythema +erythemal +erythemas +erythematic +erythematous +erythemic +erythorbate +erythraea +erythraean +erythraeidae +erythraemia +erythrasma +erythrean +erythremia +erythremomelalgia +erythrene +erythric +erythrin +erythrina +erythrine +erythrinidae +erythrinus +erythrism +erythrismal +erythristic +erythrite +erythritic +erythritol +erythroblast +erythroblastic +erythroblastosis +erythroblastotic +erythrocarpous +erythrocatalysis +erythrochaete +erythrochroic +erythrochroism +erythrocyte +erythrocytes +erythrocytic +erythrocytoblast +erythrocytolysin +erythrocytolysis +erythrocytolytic +erythrocytometer +erythrocytometry +erythrocytorrhexis +erythrocytoschisis +erythrocytosis +erythroclasis +erythroclastic +erythrodegenerative +erythroderma +erythrodermia +erythrodextrin +erythrogen +erythrogenesis +erythrogenic +erythroglucin +erythrogonium +erythroid +erythrol +erythrolein +erythrolysin +erythrolysis +erythrolytic +erythrolitmin +erythromania +erythromelalgia +erythromycin +erythron +erythroneocytosis +erythronium +erythrons +erythropenia +erythrophage +erythrophagous +erythrophyll +erythrophyllin +erythrophilous +erythrophleine +erythrophobia +erythrophore +erythropia +erythroplastid +erythropoiesis +erythropoietic +erythropoietin +erythropsia +erythropsin +erythrorrhexis +erythroscope +erythrose +erythrosiderite +erythrosin +erythrosine +erythrosinophile +erythrosis +erythroxylaceae +erythroxylaceous +erythroxyline +erythroxylon +erythroxylum +erythrozyme +erythrozincite +erythrulose +eritrean +eryx +erizo +erk +erke +erliche +erlking +erlkings +erma +ermanaric +ermani +ermanrich +erme +ermelin +ermiline +ermine +ermined +erminee +ermines +erminette +ermining +erminites +erminois +ermit +ermitophobia +ern +erne +ernes +ernesse +ernest +ernestine +ernie +erns +ernst +erodability +erodable +erode +eroded +erodent +erodes +erodibility +erodible +eroding +erodium +erogate +erogeneity +erogenesis +erogenetic +erogeny +erogenic +erogenous +eromania +eros +erose +erosely +eroses +erosible +erosion +erosional +erosionally +erosionist +erosions +erosive +erosiveness +erosivity +erostrate +erotema +eroteme +erotesis +erotetic +erotic +erotica +erotical +erotically +eroticism +eroticist +eroticization +eroticize +eroticizing +eroticomania +eroticomaniac +eroticomaniacal +erotics +erotylid +erotylidae +erotism +erotisms +erotization +erotize +erotized +erotizing +erotogeneses +erotogenesis +erotogenetic +erotogenic +erotogenicity +erotographomania +erotology +erotomania +erotomaniac +erotomaniacal +erotopath +erotopathy +erotopathic +erotophobia +erpetoichthys +erpetology +erpetologist +err +errability +errable +errableness +errabund +errancy +errancies +errand +errands +errant +errantia +errantly +errantness +errantry +errantries +errants +errata +erratas +erratic +erratical +erratically +erraticalness +erraticism +erraticness +erratics +erratum +erratums +erratuta +erred +errhine +errhines +erring +erringly +errite +erron +erroneous +erroneously +erroneousness +error +errordump +errorful +errorist +errorless +errors +errs +errsyn +ers +ersar +ersatz +ersatzes +erse +erses +ersh +erst +erstwhile +erstwhiles +ertebolle +erth +erthen +erthly +erthling +erubescence +erubescent +erubescite +eruc +eruca +erucic +eruciform +erucin +erucivorous +eruct +eructance +eructate +eructated +eructates +eructating +eructation +eructative +eructed +eructing +eruction +eructs +erudit +erudite +eruditely +eruditeness +eruditical +erudition +eruditional +eruditionist +erugate +erugation +erugatory +eruginous +erugo +erugos +erump +erumpent +erupt +erupted +eruptible +erupting +eruption +eruptional +eruptions +eruptive +eruptively +eruptiveness +eruptives +eruptivity +erupts +erupturient +ervenholder +ervil +ervils +ervipiame +ervum +erwin +erwinia +erzahler +es +esau +esbay +esbatement +esc +esca +escadrille +escadrilles +escalade +escaladed +escalader +escalades +escalading +escalado +escalan +escalate +escalated +escalates +escalating +escalation +escalations +escalator +escalatory +escalators +escalier +escalin +escallonia +escalloniaceae +escalloniaceous +escallop +escalloped +escalloping +escallops +escalop +escalope +escaloped +escaloping +escalops +escambio +escambron +escamotage +escamoteur +escandalize +escapable +escapade +escapades +escapado +escapage +escape +escaped +escapee +escapees +escapeful +escapeless +escapement +escapements +escaper +escapers +escapes +escapeway +escaping +escapingly +escapism +escapisms +escapist +escapists +escapology +escapologist +escar +escarbuncle +escargatoire +escargot +escargotieres +escargots +escarmouche +escarole +escaroles +escarp +escarped +escarping +escarpment +escarpments +escarps +escars +escarteled +escartelly +eschalot +eschalots +eschar +eschara +escharine +escharoid +escharotic +eschars +eschatocol +eschatology +eschatological +eschatologically +eschatologist +eschaufe +eschaunge +escheat +escheatable +escheatage +escheated +escheating +escheatment +escheator +escheatorship +escheats +eschel +eschele +escherichia +escheve +eschevin +eschew +eschewal +eschewals +eschewance +eschewed +eschewer +eschewers +eschewing +eschews +eschynite +eschoppe +eschrufe +eschscholtzia +esclandre +esclavage +escoba +escobadura +escobedo +escobilla +escobita +escocheon +escolar +escolars +esconson +escopet +escopeta +escopette +escorial +escort +escortage +escorted +escortee +escorting +escortment +escorts +escot +escoted +escoting +escots +escout +escry +escribano +escribe +escribed +escribiente +escribientes +escribing +escrime +escript +escritoire +escritoires +escritorial +escrod +escrol +escroll +escropulo +escrow +escrowed +escrowee +escrowing +escrows +escruage +escuage +escuages +escudero +escudo +escudos +escuela +esculapian +esculent +esculents +esculetin +esculic +esculin +escurialize +escutcheon +escutcheoned +escutcheons +escutellate +esd +esdragol +esdras +ese +esebrias +esemplasy +esemplastic +eseptate +esere +eserin +eserine +eserines +eses +esexual +esguard +eshin +esiphonal +eskar +eskars +esker +eskers +eskimauan +eskimo +eskimoes +eskimoic +eskimoid +eskimoized +eskimos +eskualdun +eskuara +eslabon +eslisor +esloign +esmayle +esmeralda +esmeraldan +esmeraldite +esne +esnecy +esoanhydride +esocataphoria +esocyclic +esocidae +esociform +esodic +esoenteritis +esoethmoiditis +esogastritis +esonarthex +esoneural +esopgi +esophagal +esophagalgia +esophageal +esophagean +esophagectasia +esophagectomy +esophagi +esophagism +esophagismus +esophagitis +esophago +esophagocele +esophagodynia +esophagogastroscopy +esophagogastrostomy +esophagomalacia +esophagometer +esophagomycosis +esophagopathy +esophagoplasty +esophagoplegia +esophagoplication +esophagoptosis +esophagorrhagia +esophagoscope +esophagoscopy +esophagospasm +esophagostenosis +esophagostomy +esophagotome +esophagotomy +esophagus +esophoria +esophoric +esopus +esotery +esoteric +esoterica +esoterical +esoterically +esotericism +esotericist +esoterics +esoterism +esoterist +esoterize +esothyropexy +esotrope +esotropia +esotropic +esox +esp +espace +espacement +espada +espadon +espadrille +espadrilles +espagnole +espagnolette +espalier +espaliered +espaliering +espaliers +espanol +espanoles +espantoon +esparcet +esparsette +esparto +espartos +espathate +espave +espavel +espec +espece +especial +especially +especialness +espeire +esperance +esperantic +esperantidist +esperantido +esperantism +esperantist +esperanto +esphresis +espy +espial +espials +espichellite +espied +espiegle +espieglerie +espiegleries +espier +espies +espigle +espiglerie +espying +espinal +espinel +espinette +espingole +espinillo +espino +espinos +espionage +espiritual +esplanade +esplanades +esplees +esponton +espontoon +espousage +espousal +espousals +espouse +espoused +espousement +espouser +espousers +espouses +espousing +espressivo +espresso +espressos +espriella +espringal +esprise +esprit +esprits +esprove +espundia +esq +esquamate +esquamulose +esquiline +esquimau +esquire +esquirearchy +esquired +esquiredom +esquires +esquireship +esquiring +esquisse +esrog +esrogim +esrogs +ess +essay +essayed +essayer +essayers +essayette +essayical +essaying +essayish +essayism +essayist +essayistic +essayistical +essayists +essaylet +essays +essancia +essancias +essang +essart +esse +essed +esseda +essede +essedones +essee +esselen +esselenian +essence +essenced +essences +essency +essencing +essene +essenhout +essenian +essenianism +essenic +essenical +essenis +essenism +essenize +essentia +essential +essentialism +essentialist +essentiality +essentialities +essentialization +essentialize +essentialized +essentializing +essentially +essentialness +essentials +essentiate +essenwood +essera +esses +essex +essexite +essie +essive +essling +essoign +essoin +essoined +essoinee +essoiner +essoining +essoinment +essoins +essonite +essonites +essorant +est +estab +estable +establish +establishable +established +establisher +establishes +establishing +establishment +establishmentarian +establishmentarianism +establishmentism +establishments +establismentarian +establismentarianism +estacade +estadal +estadel +estadio +estado +estafa +estafet +estafette +estafetted +estall +estamene +estamin +estaminet +estaminets +estamp +estampage +estampede +estampedero +estampie +estancia +estancias +estanciero +estancieros +estang +estantion +estate +estated +estately +estates +estatesman +estatesmen +estating +estats +esteem +esteemable +esteemed +esteemer +esteeming +esteems +estella +estensible +ester +esterase +esterases +esterellite +esteriferous +esterify +esterifiable +esterification +esterified +esterifies +esterifying +esterization +esterize +esterizing +esterlin +esterling +esteros +esters +estevin +esth +esthacyte +esthematology +esther +estheria +estherian +estheriidae +estheses +esthesia +esthesias +esthesio +esthesioblast +esthesiogen +esthesiogeny +esthesiogenic +esthesiography +esthesiology +esthesiometer +esthesiometry +esthesiometric +esthesioneurosis +esthesiophysiology +esthesis +esthesises +esthete +esthetes +esthetic +esthetical +esthetically +esthetician +estheticism +esthetics +esthetology +esthetophore +esthiomene +esthiomenus +estimable +estimableness +estimably +estimate +estimated +estimates +estimating +estimatingly +estimation +estimations +estimative +estimator +estimators +estipulate +estivage +estival +estivate +estivated +estivates +estivating +estivation +estivator +estive +estmark +estoc +estocada +estocs +estoil +estoile +estolide +estonia +estonian +estonians +estop +estoppage +estoppal +estopped +estoppel +estoppels +estopping +estops +estoque +estotiland +estovers +estrada +estradas +estrade +estradiol +estradiot +estrado +estragol +estragole +estragon +estragons +estray +estrayed +estraying +estrays +estral +estramazone +estrange +estranged +estrangedness +estrangelo +estrangement +estrangements +estranger +estranges +estranging +estrangle +estrapade +estre +estreat +estreated +estreating +estreats +estrepe +estrepement +estriate +estrich +estriche +estrif +estrildine +estrin +estrins +estriol +estriols +estrogen +estrogenic +estrogenically +estrogenicity +estrogens +estrone +estrones +estrous +estrual +estruate +estruation +estrum +estrums +estrus +estruses +estuant +estuary +estuarial +estuarian +estuaries +estuarine +estuate +estudy +estufa +estuosity +estuous +esture +estus +esu +esugarization +esurience +esuriency +esurient +esuriently +esurine +et +eta +etaballi +etabelli +etacism +etacist +etaerio +etagere +etageres +etagre +etalage +etalon +etamin +etamine +etamines +etamins +etang +etape +etapes +etas +etatism +etatisme +etatisms +etatist +etc +etcetera +etceteras +etch +etchant +etchareottine +etched +etcher +etchers +etches +etchimin +etching +etchings +eten +eteocles +eteoclus +eteocretes +eteocreton +eteostic +eterminable +eternal +eternalise +eternalised +eternalising +eternalism +eternalist +eternality +eternalization +eternalize +eternalized +eternalizing +eternally +eternalness +eternals +eterne +eternisation +eternise +eternised +eternises +eternish +eternising +eternity +eternities +eternization +eternize +eternized +eternizes +eternizing +etesian +etesians +eth +ethal +ethaldehyde +ethambutol +ethan +ethanal +ethanamide +ethane +ethanedial +ethanediol +ethanedithiol +ethanes +ethanethial +ethanethiol +ethanim +ethanoyl +ethanol +ethanolamine +ethanolysis +ethanols +ethchlorvynol +ethel +etheling +ethene +etheneldeli +ethenes +ethenic +ethenyl +ethenoid +ethenoidal +ethenol +etheostoma +etheostomidae +etheostominae +etheostomoid +ether +etherate +ethereal +etherealisation +etherealise +etherealised +etherealising +etherealism +ethereality +etherealization +etherealize +etherealized +etherealizing +ethereally +etherealness +etherean +ethered +etherene +ethereous +etheria +etherial +etherialisation +etherialise +etherialised +etherialising +etherialism +etherialization +etherialize +etherialized +etherializing +etherially +etheric +etherical +etherify +etherification +etherified +etherifies +etherifying +etheriform +etheriidae +etherin +etherion +etherish +etherism +etherization +etherize +etherized +etherizer +etherizes +etherizing +etherlike +ethernet +ethernets +etherol +etherolate +etherous +ethers +ethic +ethical +ethicalism +ethicality +ethicalities +ethically +ethicalness +ethicals +ethician +ethicians +ethicism +ethicist +ethicists +ethicize +ethicized +ethicizes +ethicizing +ethicoaesthetic +ethicophysical +ethicopolitical +ethicoreligious +ethicosocial +ethics +ethid +ethide +ethidene +ethyl +ethylamide +ethylamime +ethylamin +ethylamine +ethylate +ethylated +ethylates +ethylating +ethylation +ethylbenzene +ethyldichloroarsine +ethylenation +ethylene +ethylenediamine +ethylenes +ethylenic +ethylenically +ethylenimine +ethylenoid +ethylhydrocupreine +ethylic +ethylidene +ethylidyne +ethylin +ethylmorphine +ethyls +ethylsulphuric +ethylthioethane +ethylthioether +ethinamate +ethine +ethyne +ethynes +ethinyl +ethynyl +ethynylation +ethinyls +ethynyls +ethiodide +ethion +ethionamide +ethionic +ethionine +ethions +ethiop +ethiopia +ethiopian +ethiopians +ethiopic +ethiops +ethysulphuric +ethize +ethmyphitis +ethmofrontal +ethmoid +ethmoidal +ethmoiditis +ethmoids +ethmolachrymal +ethmolith +ethmomaxillary +ethmonasal +ethmopalatal +ethmopalatine +ethmophysal +ethmopresphenoidal +ethmose +ethmosphenoid +ethmosphenoidal +ethmoturbinal +ethmoturbinate +ethmovomer +ethmovomerine +ethnal +ethnarch +ethnarchy +ethnarchies +ethnarchs +ethnic +ethnical +ethnically +ethnicism +ethnicist +ethnicity +ethnicize +ethnicon +ethnics +ethnish +ethnize +ethnobiology +ethnobiological +ethnobotany +ethnobotanic +ethnobotanical +ethnobotanist +ethnocentric +ethnocentrically +ethnocentricity +ethnocentrism +ethnocracy +ethnodicy +ethnoflora +ethnog +ethnogeny +ethnogenic +ethnogenies +ethnogenist +ethnogeographer +ethnogeography +ethnogeographic +ethnogeographical +ethnogeographically +ethnographer +ethnography +ethnographic +ethnographical +ethnographically +ethnographies +ethnographist +ethnohistory +ethnohistorian +ethnohistoric +ethnohistorical +ethnohistorically +ethnol +ethnolinguist +ethnolinguistic +ethnolinguistics +ethnologer +ethnology +ethnologic +ethnological +ethnologically +ethnologist +ethnologists +ethnomaniac +ethnomanic +ethnomusicology +ethnomusicological +ethnomusicologically +ethnomusicologist +ethnopsychic +ethnopsychology +ethnopsychological +ethnos +ethnoses +ethnotechnics +ethnotechnography +ethnozoology +ethnozoological +ethography +etholide +ethology +ethologic +ethological +ethologically +ethologies +ethologist +ethologists +ethonomic +ethonomics +ethonone +ethopoeia +ethopoetic +ethos +ethoses +ethoxy +ethoxycaffeine +ethoxide +ethoxyethane +ethoxyl +ethoxyls +ethrog +ethrogim +ethrogs +eths +ety +etiam +etym +etyma +etymic +etymography +etymol +etymologer +etymology +etymologic +etymological +etymologically +etymologicon +etymologies +etymologisable +etymologise +etymologised +etymologising +etymologist +etymologists +etymologizable +etymologization +etymologize +etymologized +etymologizing +etymon +etymonic +etymons +etiogenic +etiolate +etiolated +etiolates +etiolating +etiolation +etiolin +etiolize +etiology +etiologic +etiological +etiologically +etiologies +etiologist +etiologue +etiophyllin +etioporphyrin +etiotropic +etiotropically +etypic +etypical +etypically +etiquet +etiquette +etiquettes +etiquettical +etna +etnas +etnean +etoffe +etoile +etoiles +eton +etonian +etouffe +etourderie +etrenne +etrier +etrog +etrogim +etrogs +etruria +etrurian +etruscan +etruscans +etruscology +etruscologist +etta +ettarre +ettercap +ettirone +ettle +ettled +ettling +etua +etude +etudes +etui +etuis +etuve +etuvee +etwas +etwee +etwees +etwite +eu +euahlayi +euangiotic +euascomycetes +euaster +eubacteria +eubacteriales +eubacterium +eubasidii +euboean +euboic +eubranchipus +eubteria +eucaine +eucaines +eucairite +eucalyn +eucalypt +eucalypteol +eucalypti +eucalyptian +eucalyptic +eucalyptography +eucalyptol +eucalyptole +eucalypts +eucalyptus +eucalyptuses +eucarida +eucaryote +eucaryotic +eucarpic +eucarpous +eucatropine +eucephalous +eucgia +eucharis +eucharises +eucharist +eucharistial +eucharistic +eucharistical +eucharistically +eucharistize +eucharistized +eucharistizing +eucharists +eucharitidae +euchymous +euchysiderite +euchite +euchlaena +euchlorhydria +euchloric +euchlorine +euchlorite +euchlorophyceae +euchology +euchologia +euchological +euchologies +euchologion +euchorda +euchre +euchred +euchres +euchring +euchroic +euchroite +euchromatic +euchromatin +euchrome +euchromosome +euchrone +eucyclic +euciliate +eucirripedia +euclase +euclases +euclea +eucleid +eucleidae +euclid +euclidean +euclideanism +euclidian +eucnemidae +eucolite +eucommia +eucommiaceae +eucone +euconic +euconjugatae +eucopepoda +eucosia +eucosmid +eucosmidae +eucrasy +eucrasia +eucrasite +eucre +eucryphia +eucryphiaceae +eucryphiaceous +eucryptite +eucrystalline +eucrite +eucrites +eucritic +eucti +euctical +euda +eudaemon +eudaemony +eudaemonia +eudaemonic +eudaemonical +eudaemonics +eudaemonism +eudaemonist +eudaemonistic +eudaemonistical +eudaemonistically +eudaemonize +eudaemons +eudaimonia +eudaimonism +eudaimonist +eudalene +eudemian +eudemon +eudemony +eudemonia +eudemonic +eudemonics +eudemonism +eudemonist +eudemonistic +eudemonistical +eudemonistically +eudemons +eudendrium +eudesmol +eudeve +eudiagnostic +eudialyte +eudiaphoresis +eudidymite +eudiometer +eudiometry +eudiometric +eudiometrical +eudiometrically +eudipleural +eudyptes +eudist +eudora +eudorina +eudoxian +eudromias +euectic +euemerism +euergetes +euflavine +euge +eugene +eugenesic +eugenesis +eugenetic +eugeny +eugenia +eugenic +eugenical +eugenically +eugenicist +eugenicists +eugenics +eugenie +eugenism +eugenist +eugenists +eugenol +eugenolate +eugenols +eugeosynclinal +eugeosyncline +euglandina +euglena +euglenaceae +euglenales +euglenas +euglenida +euglenidae +euglenineae +euglenoid +euglenoidina +euglobulin +eugonic +eugranitic +eugregarinida +eugubine +eugubium +euhages +euharmonic +euhedral +euhemerise +euhemerised +euhemerising +euhemerism +euhemerist +euhemeristic +euhemeristically +euhemerize +euhemerized +euhemerizing +euhyostyly +euhyostylic +eukairite +eukaryote +euktolite +eulachan +eulachans +eulachon +eulachons +eulalia +eulamellibranch +eulamellibranchia +eulamellibranchiata +eulamellibranchiate +euler +eulerian +eulima +eulimidae +eulysite +eulytin +eulytine +eulytite +eulogy +eulogia +eulogiae +eulogias +eulogic +eulogical +eulogically +eulogies +eulogious +eulogisation +eulogise +eulogised +eulogiser +eulogises +eulogising +eulogism +eulogist +eulogistic +eulogistical +eulogistically +eulogists +eulogium +eulogiums +eulogization +eulogize +eulogized +eulogizer +eulogizers +eulogizes +eulogizing +eulophid +eumelanin +eumemorrhea +eumenes +eumenid +eumenidae +eumenidean +eumenides +eumenorrhea +eumerism +eumeristic +eumerogenesis +eumerogenetic +eumeromorph +eumeromorphic +eumycete +eumycetes +eumycetic +eumitosis +eumitotic +eumoiriety +eumoirous +eumolpides +eumolpique +eumolpus +eumorphic +eumorphous +eundem +eunectes +eunice +eunicid +eunicidae +eunomy +eunomia +eunomian +eunomianism +eunuch +eunuchal +eunuchise +eunuchised +eunuchising +eunuchism +eunuchize +eunuchized +eunuchizing +eunuchoid +eunuchoidism +eunuchry +eunuchs +euodic +euomphalid +euomphalus +euonym +euonymy +euonymin +euonymous +euonymus +euonymuses +euornithes +euornithic +euorthoptera +euosmite +euouae +eupad +eupanorthidae +eupanorthus +eupathy +eupatory +eupatoriaceous +eupatorin +eupatorine +eupatorium +eupatrid +eupatridae +eupatrids +eupepsy +eupepsia +eupepsias +eupepsies +eupeptic +eupeptically +eupepticism +eupepticity +euphausia +euphausiacea +euphausid +euphausiid +euphausiidae +euphemy +euphemia +euphemian +euphemious +euphemiously +euphemisation +euphemise +euphemised +euphemiser +euphemising +euphemism +euphemisms +euphemist +euphemistic +euphemistical +euphemistically +euphemization +euphemize +euphemized +euphemizer +euphemizing +euphemous +euphenic +euphenics +euphyllite +euphyllopoda +euphon +euphone +euphonetic +euphonetics +euphony +euphonia +euphoniad +euphonic +euphonical +euphonically +euphonicalness +euphonies +euphonym +euphonious +euphoniously +euphoniousness +euphonise +euphonised +euphonising +euphonism +euphonium +euphonize +euphonized +euphonizing +euphonon +euphonous +euphorbia +euphorbiaceae +euphorbiaceous +euphorbial +euphorbine +euphorbium +euphory +euphoria +euphoriant +euphorias +euphoric +euphorically +euphotic +euphotide +euphrasy +euphrasia +euphrasies +euphratean +euphrates +euphroe +euphroes +euphrosyne +euphues +euphuism +euphuisms +euphuist +euphuistic +euphuistical +euphuistically +euphuists +euphuize +euphuized +euphuizing +eupion +eupione +eupyrchroite +eupyrene +eupyrion +eupittone +eupittonic +euplastic +euplectella +euplexoptera +euplocomi +euploeinae +euploid +euploidy +euploidies +euploids +euplotid +eupnea +eupneas +eupneic +eupnoea +eupnoeas +eupnoeic +eupolidean +eupolyzoa +eupolyzoan +eupomatia +eupomatiaceae +eupotamic +eupractic +eupraxia +euprepia +euproctis +eupsychics +euptelea +eupterotidae +eurafric +eurafrican +euraquilo +eurasia +eurasian +eurasianism +eurasians +eurasiatic +eure +eureka +eurhythmy +eurhythmic +eurhythmical +eurhythmics +eurhodine +eurhodol +euryalae +euryale +euryaleae +euryalean +euryalida +euryalidan +euryalus +eurybathic +eurybenthic +eurycephalic +eurycephalous +eurycerotidae +eurycerous +eurychoric +euryclea +eurydice +eurygaea +eurygaean +eurygnathic +eurygnathism +eurygnathous +euryhaline +eurylaimi +eurylaimidae +eurylaimoid +eurylaimus +eurymus +eurindic +euryon +eurypelma +euryphage +euryphagous +eurypharyngidae +eurypharynx +euripi +euripidean +euripides +eurypyga +eurypygae +eurypygidae +eurypylous +euripos +euryprognathous +euryprosopic +eurypterid +eurypterida +eurypteroid +eurypteroidea +eurypterus +euripupi +euripus +euryscope +eurystheus +eurystomatous +eurite +euryte +eurytherm +eurythermal +eurythermic +eurithermophile +eurithermophilic +eurythermous +eurythmy +eurythmic +eurythmical +eurythmics +eurythmies +eurytomid +eurytomidae +eurytopic +eurytopicity +eurytropic +eurytus +euryzygous +euro +euroaquilo +eurobin +eurocentric +euroclydon +eurodollar +eurodollars +europa +europasian +europe +european +europeanism +europeanization +europeanize +europeanly +europeans +europeward +europhium +europium +europiums +europocentric +euros +eurous +eurus +euscaro +eusebian +euselachii +eusynchite +euskaldun +euskara +euskarian +euskaric +euskera +eusol +euspongia +eusporangiate +eustace +eustachian +eustachium +eustacy +eustacies +eustathian +eustatic +eustatically +eustele +eusteles +eusthenopteron +eustyle +eustomatous +eusuchia +eusuchian +eutaenia +eutannin +eutaxy +eutaxic +eutaxie +eutaxies +eutaxite +eutaxitic +eutechnic +eutechnics +eutectic +eutectics +eutectoid +eutelegenic +euterpe +euterpean +eutexia +euthamia +euthanasy +euthanasia +euthanasic +euthanatize +euthenasia +euthenic +euthenics +euthenist +eutheria +eutherian +euthermic +euthycomi +euthycomic +euthymy +euthyneura +euthyneural +euthyneurous +euthyroid +euthytatic +euthytropic +eutychian +eutychianism +eutocia +eutomous +eutony +eutopia +eutopian +eutrophy +eutrophic +eutrophication +eutrophies +eutropic +eutropous +euvrou +euxanthate +euxanthic +euxanthin +euxanthone +euxenite +euxenites +euxine +eva +evacuant +evacuants +evacuate +evacuated +evacuates +evacuating +evacuation +evacuations +evacuative +evacuator +evacuators +evacue +evacuee +evacuees +evadable +evade +evaded +evader +evaders +evades +evadible +evading +evadingly +evadne +evagation +evaginable +evaginate +evaginated +evaginating +evagination +eval +evaluable +evaluate +evaluated +evaluates +evaluating +evaluation +evaluations +evaluative +evaluator +evaluators +evalue +evan +evanesce +evanesced +evanescence +evanescency +evanescenrly +evanescent +evanescently +evanesces +evanescible +evanescing +evang +evangel +evangelary +evangely +evangelian +evangeliary +evangeliaries +evangeliarium +evangelic +evangelical +evangelicalism +evangelicality +evangelically +evangelicalness +evangelicals +evangelican +evangelicism +evangelicity +evangeline +evangelion +evangelisation +evangelise +evangelised +evangeliser +evangelising +evangelism +evangelist +evangelistary +evangelistaries +evangelistarion +evangelistarium +evangelistic +evangelistically +evangelistics +evangelists +evangelistship +evangelium +evangelization +evangelize +evangelized +evangelizer +evangelizes +evangelizing +evangels +evanid +evaniidae +evanish +evanished +evanishes +evanishing +evanishment +evanition +evans +evansite +evap +evaporability +evaporable +evaporate +evaporated +evaporates +evaporating +evaporation +evaporations +evaporative +evaporatively +evaporativity +evaporator +evaporators +evaporimeter +evaporite +evaporitic +evaporize +evaporometer +evapotranspiration +evase +evasible +evasion +evasional +evasions +evasive +evasively +evasiveness +eve +evea +evechurr +eveck +evectant +evected +evectic +evection +evectional +evections +evector +evehood +evejar +eveless +evelight +evelyn +evelina +eveline +evelong +even +evenblush +evendown +evene +evened +evener +eveners +evenest +evenfall +evenfalls +evenforth +evenglome +evenglow +evenhand +evenhanded +evenhandedly +evenhandedness +evenhead +evening +evenings +evenly +evenlight +evenlong +evenmete +evenminded +evenmindedness +evenness +evennesses +evenoo +evens +evensong +evensongs +event +eventail +eventerate +eventful +eventfully +eventfulness +eventide +eventides +eventilate +eventime +eventless +eventlessly +eventlessness +eventognath +eventognathi +eventognathous +eventration +events +eventual +eventuality +eventualities +eventualize +eventually +eventuate +eventuated +eventuates +eventuating +eventuation +eventuations +evenwise +evenworthy +eveque +ever +everard +everbearer +everbearing +everbloomer +everblooming +everduring +everest +everett +everglade +everglades +evergreen +evergreenery +evergreenite +evergreens +every +everybody +everich +everyday +everydayness +everydeal +everyhow +everylike +everyman +everymen +everyness +everyone +everyplace +everything +everyway +everywhen +everywhence +everywhere +everywhereness +everywheres +everywhither +everywoman +everlasting +everlastingly +everlastingness +everly +everliving +evermo +evermore +everness +evernia +evernioid +everse +eversible +eversion +eversions +eversive +eversporting +evert +evertebral +evertebrata +evertebrate +everted +evertile +everting +evertor +evertors +everts +everwhich +everwho +eves +evese +evestar +evetide +eveweed +evg +evibrate +evicke +evict +evicted +evictee +evictees +evicting +eviction +evictions +evictor +evictors +evicts +evidence +evidenced +evidences +evidencing +evidencive +evident +evidential +evidentially +evidentiary +evidently +evidentness +evigilation +evil +evildoer +evildoers +evildoing +eviler +evilest +evilhearted +eviller +evillest +evilly +evilmouthed +evilness +evilnesses +evilproof +evils +evilsayer +evilspeaker +evilspeaking +evilwishing +evince +evinced +evincement +evinces +evincible +evincibly +evincing +evincingly +evincive +evirate +eviration +evirato +evirtuate +eviscerate +eviscerated +eviscerates +eviscerating +evisceration +eviscerations +eviscerator +evisite +evitable +evitate +evitation +evite +evited +eviternal +evites +eviting +evittate +evocable +evocate +evocated +evocating +evocation +evocations +evocative +evocatively +evocativeness +evocator +evocatory +evocators +evocatrix +evodia +evoe +evoke +evoked +evoker +evokers +evokes +evoking +evolate +evolute +evolutes +evolutility +evolution +evolutional +evolutionally +evolutionary +evolutionarily +evolutionism +evolutionist +evolutionistic +evolutionistically +evolutionists +evolutionize +evolutions +evolutive +evolutoid +evolvable +evolve +evolved +evolvement +evolvements +evolvent +evolver +evolvers +evolves +evolving +evolvulus +evomit +evonymus +evonymuses +evovae +evulgate +evulgation +evulge +evulse +evulsion +evulsions +evviva +evzone +evzones +ew +ewder +ewe +ewelease +ewer +ewerer +ewery +eweries +ewers +ewes +ewest +ewhow +ewing +ewound +ewry +ewte +ex +exacerbate +exacerbated +exacerbates +exacerbating +exacerbatingly +exacerbation +exacerbations +exacerbescence +exacerbescent +exacervation +exacinate +exact +exacta +exactable +exactas +exacted +exacter +exacters +exactest +exacting +exactingly +exactingness +exaction +exactions +exactitude +exactive +exactiveness +exactly +exactment +exactness +exactor +exactors +exactress +exacts +exactus +exacuate +exacum +exadverso +exadversum +exaestuate +exaggerate +exaggerated +exaggeratedly +exaggeratedness +exaggerates +exaggerating +exaggeratingly +exaggeration +exaggerations +exaggerative +exaggeratively +exaggerativeness +exaggerator +exaggeratory +exaggerators +exagitate +exagitation +exairesis +exalate +exalbuminose +exalbuminous +exallotriote +exalt +exaltate +exaltation +exaltations +exaltative +exalte +exalted +exaltedly +exaltedness +exaltee +exalter +exalters +exalting +exaltment +exalts +exam +examen +examens +exameter +examinability +examinable +examinant +examinate +examination +examinational +examinationism +examinationist +examinations +examinative +examinator +examinatory +examinatorial +examine +examined +examinee +examinees +examiner +examiners +examinership +examines +examining +examiningly +examplar +example +exampled +exampleless +examples +exampleship +exampless +exampling +exams +exanguin +exanimate +exanimation +exannulate +exanthalose +exanthem +exanthema +exanthemas +exanthemata +exanthematic +exanthematous +exanthems +exanthine +exantlate +exantlation +exappendiculate +exarate +exaration +exarch +exarchal +exarchate +exarchateship +exarchy +exarchic +exarchies +exarchist +exarchs +exareolate +exarillate +exaristate +exarteritis +exarticulate +exarticulation +exasper +exasperate +exasperated +exasperatedly +exasperater +exasperates +exasperating +exasperatingly +exasperation +exasperative +exaspidean +exauctorate +exaudi +exaugurate +exauguration +exaun +exauthorate +exauthorize +exauthorizeexc +excalate +excalation +excalcarate +excalceate +excalceation +excalfaction +excalibur +excamb +excamber +excambion +excandescence +excandescency +excandescent +excantation +excardination +excarnate +excarnation +excarnificate +excathedral +excaudate +excavate +excavated +excavates +excavating +excavation +excavational +excavationist +excavations +excavator +excavatory +excavatorial +excavators +excave +excecate +excecation +excedent +exceed +exceedable +exceeded +exceeder +exceeders +exceeding +exceedingly +exceedingness +exceeds +excel +excelente +excelled +excellence +excellences +excellency +excellencies +excellent +excellently +excelling +excels +excelse +excelsin +excelsior +excelsitude +excentral +excentric +excentrical +excentricity +excepable +except +exceptant +excepted +excepter +excepting +exceptio +exception +exceptionability +exceptionable +exceptionableness +exceptionably +exceptional +exceptionality +exceptionally +exceptionalness +exceptionary +exceptioner +exceptionless +exceptions +exceptious +exceptiousness +exceptive +exceptively +exceptiveness +exceptless +exceptor +excepts +excercise +excerebrate +excerebration +excern +excerp +excerpt +excerpta +excerpted +excerpter +excerptible +excerpting +excerption +excerptive +excerptor +excerpts +excess +excesses +excessive +excessively +excessiveness +excessman +excessmen +exch +exchange +exchangeability +exchangeable +exchangeably +exchanged +exchangee +exchanger +exchanges +exchanging +exchangite +excheat +exchequer +exchequers +excide +excided +excides +exciding +excipient +exciple +exciples +excipula +excipulaceae +excipular +excipule +excipuliform +excipulum +excircle +excisable +excise +excised +exciseman +excisemanship +excisemen +excises +excising +excision +excisions +excisor +excyst +excystation +excysted +excystment +excitability +excitabilities +excitable +excitableness +excitably +excitancy +excitant +excitants +excitate +excitation +excitations +excitative +excitator +excitatory +excite +excited +excitedly +excitedness +excitement +excitements +exciter +exciters +excites +exciting +excitingly +excitive +excitoglandular +excitometabolic +excitomotion +excitomotor +excitomotory +excitomuscular +exciton +excitonic +excitons +excitonutrient +excitor +excitory +excitors +excitosecretory +excitovascular +excitron +excl +exclaim +exclaimed +exclaimer +exclaimers +exclaiming +exclaimingly +exclaims +exclam +exclamation +exclamational +exclamations +exclamative +exclamatively +exclamatory +exclamatorily +exclaustration +exclave +exclaves +exclosure +excludability +excludable +exclude +excluded +excluder +excluders +excludes +excludible +excluding +excludingly +exclusion +exclusionary +exclusioner +exclusionism +exclusionist +exclusions +exclusive +exclusively +exclusiveness +exclusivism +exclusivist +exclusivistic +exclusivity +exclusory +excoct +excoction +excoecaria +excogitable +excogitate +excogitated +excogitates +excogitating +excogitation +excogitative +excogitator +excommenge +excommune +excommunicable +excommunicant +excommunicate +excommunicated +excommunicates +excommunicating +excommunication +excommunications +excommunicative +excommunicator +excommunicatory +excommunicators +excommunion +exconjugant +excoriable +excoriate +excoriated +excoriates +excoriating +excoriation +excoriations +excoriator +excorticate +excorticated +excorticating +excortication +excreation +excrement +excremental +excrementally +excrementary +excrementitial +excrementitious +excrementitiously +excrementitiousness +excrementive +excrementize +excrementous +excrements +excresce +excrescence +excrescences +excrescency +excrescencies +excrescent +excrescential +excrescently +excresence +excression +excreta +excretal +excrete +excreted +excreter +excreters +excretes +excreting +excretion +excretionary +excretions +excretitious +excretive +excretolic +excretory +excriminate +excruciable +excruciate +excruciated +excruciating +excruciatingly +excruciatingness +excruciation +excruciator +excubant +excubitoria +excubitorium +excubittoria +excud +excudate +excuderunt +excudit +exculpable +exculpate +exculpated +exculpates +exculpating +exculpation +exculpations +exculpative +exculpatory +exculpatorily +excur +excurrent +excurse +excursed +excursing +excursion +excursional +excursionary +excursioner +excursionism +excursionist +excursionists +excursionize +excursions +excursive +excursively +excursiveness +excursory +excursus +excursuses +excurvate +excurvated +excurvation +excurvature +excurved +excusability +excusable +excusableness +excusably +excusal +excusation +excusative +excusator +excusatory +excuse +excused +excuseful +excusefully +excuseless +excuser +excusers +excuses +excusing +excusingly +excusive +excusively +excuss +excussed +excussing +excussio +excussion +exdelicto +exdie +exdividend +exeat +exec +execeptional +execrable +execrableness +execrably +execrate +execrated +execrates +execrating +execration +execrations +execrative +execratively +execrator +execratory +execrators +execs +exect +executable +executancy +executant +execute +executed +executer +executers +executes +executing +execution +executional +executioneering +executioner +executioneress +executioners +executionist +executions +executive +executively +executiveness +executives +executiveship +executonis +executor +executory +executorial +executors +executorship +executress +executry +executrices +executrix +executrixes +executrixship +exede +exedent +exedra +exedrae +exedral +exegeses +exegesis +exegesist +exegete +exegetes +exegetic +exegetical +exegetically +exegetics +exegetist +exembryonate +exempla +exemplar +exemplary +exemplaric +exemplarily +exemplariness +exemplarism +exemplarity +exemplars +exempli +exemplify +exemplifiable +exemplification +exemplificational +exemplifications +exemplificative +exemplificator +exemplified +exemplifier +exemplifiers +exemplifies +exemplifying +exemplum +exemplupla +exempt +exempted +exemptible +exemptile +exempting +exemption +exemptionist +exemptions +exemptive +exempts +exencephalia +exencephalic +exencephalous +exencephalus +exendospermic +exendospermous +exenterate +exenterated +exenterating +exenteration +exenteritis +exequatur +exequy +exequial +exequies +exerce +exercent +exercisable +exercise +exercised +exerciser +exercisers +exercises +exercising +exercitant +exercitation +exercite +exercitor +exercitorial +exercitorian +exeresis +exergonic +exergual +exergue +exergues +exert +exerted +exerting +exertion +exertionless +exertions +exertive +exerts +exes +exesion +exestuate +exeunt +exfetation +exfiguration +exfigure +exfiltrate +exfiltration +exflagellate +exflagellation +exflect +exfodiate +exfodiation +exfoliate +exfoliated +exfoliating +exfoliation +exfoliative +exfoliatory +exgorgitation +exhalable +exhalant +exhalants +exhalate +exhalation +exhalations +exhalatory +exhale +exhaled +exhalent +exhalents +exhales +exhaling +exhance +exhaust +exhaustable +exhausted +exhaustedly +exhaustedness +exhauster +exhaustibility +exhaustible +exhausting +exhaustingly +exhaustion +exhaustive +exhaustively +exhaustiveness +exhaustivity +exhaustless +exhaustlessly +exhaustlessness +exhausts +exhbn +exhedra +exhedrae +exheredate +exheredation +exhibit +exhibitable +exhibitant +exhibited +exhibiter +exhibiters +exhibiting +exhibition +exhibitional +exhibitioner +exhibitionism +exhibitionist +exhibitionistic +exhibitionists +exhibitionize +exhibitions +exhibitive +exhibitively +exhibitor +exhibitory +exhibitorial +exhibitors +exhibitorship +exhibits +exhilarant +exhilarate +exhilarated +exhilarates +exhilarating +exhilaratingly +exhilaration +exhilarative +exhilarator +exhilaratory +exhort +exhortation +exhortations +exhortative +exhortatively +exhortator +exhortatory +exhorted +exhorter +exhorters +exhorting +exhortingly +exhorts +exhumate +exhumated +exhumating +exhumation +exhumations +exhumator +exhumatory +exhume +exhumed +exhumer +exhumers +exhumes +exhuming +exhusband +exibilate +exies +exigeant +exigeante +exigence +exigences +exigency +exigencies +exigent +exigenter +exigently +exigible +exiguity +exiguities +exiguous +exiguously +exiguousness +exilable +exilarch +exilarchate +exile +exiled +exiledom +exilement +exiler +exiles +exilian +exilic +exiling +exility +exilition +eximidus +eximious +eximiously +eximiousness +exinanite +exinanition +exindusiate +exine +exines +exing +exinguinal +exinite +exintine +exion +exist +existability +existant +existed +existence +existences +existent +existential +existentialism +existentialist +existentialistic +existentialistically +existentialists +existentialize +existentially +existently +existents +exister +existibility +existible +existimation +existing +existless +existlessness +exists +exit +exitance +exite +exited +exitial +exiting +exition +exitious +exits +exiture +exitus +exla +exlex +exmeridian +exmoor +exoarteritis +exoascaceae +exoascaceous +exoascales +exoascus +exobasidiaceae +exobasidiales +exobasidium +exobiology +exobiological +exobiologist +exobiologists +exocannibalism +exocardia +exocardiac +exocardial +exocarp +exocarps +exocataphoria +exoccipital +exocentric +exochorda +exochorion +exocyclic +exocyclica +exocycloida +exocytosis +exoclinal +exocline +exocoelar +exocoele +exocoelic +exocoelom +exocoelum +exocoetidae +exocoetus +exocolitis +exocone +exocrine +exocrines +exocrinology +exocrinologies +exoculate +exoculated +exoculating +exoculation +exode +exoderm +exodermal +exodermis +exoderms +exody +exodic +exodist +exodium +exodoi +exodontia +exodontic +exodontics +exodontist +exodos +exodromy +exodromic +exodus +exoduses +exoenzyme +exoenzymic +exoergic +exoerythrocytic +exogamy +exogamic +exogamies +exogamous +exogastric +exogastrically +exogastritis +exogen +exogenae +exogenetic +exogeny +exogenic +exogenism +exogenous +exogenously +exogens +exogyra +exognathion +exognathite +exogonium +exograph +exolemma +exolete +exolution +exolve +exometritis +exomion +exomis +exomologesis +exomorphic +exomorphism +exomphalos +exomphalous +exomphalus +exon +exonarthex +exoner +exonerate +exonerated +exonerates +exonerating +exoneration +exonerations +exonerative +exonerator +exonerators +exoneretur +exoneural +exonian +exonym +exonship +exonuclease +exopathic +exopeptidase +exoperidium +exophagy +exophagous +exophasia +exophasic +exophoria +exophoric +exophthalmia +exophthalmic +exophthalmos +exophthalmus +exoplasm +exopod +exopodite +exopoditic +exopt +exopterygota +exopterygote +exopterygotic +exopterygotism +exopterygotous +exor +exorability +exorable +exorableness +exorate +exorbital +exorbitance +exorbitancy +exorbitant +exorbitantly +exorbitate +exorbitation +exorcisation +exorcise +exorcised +exorcisement +exorciser +exorcisers +exorcises +exorcising +exorcism +exorcismal +exorcisms +exorcisory +exorcist +exorcista +exorcistic +exorcistical +exorcists +exorcization +exorcize +exorcized +exorcizement +exorcizer +exorcizes +exorcizing +exordia +exordial +exordium +exordiums +exordize +exorganic +exorhason +exormia +exornate +exornation +exortion +exosculation +exosepsis +exoskeletal +exoskeleton +exosmic +exosmose +exosmoses +exosmosis +exosmotic +exosperm +exosphere +exospheres +exospheric +exospherical +exosporal +exospore +exospores +exosporium +exosporous +exossate +exosseous +exostema +exostome +exostosed +exostoses +exostosis +exostotic +exostra +exostracism +exostracize +exostrae +exotery +exoteric +exoterica +exoterical +exoterically +exotericism +exoterics +exotheca +exothecal +exothecate +exothecium +exothermal +exothermally +exothermic +exothermically +exothermicity +exothermous +exotic +exotica +exotically +exoticalness +exoticism +exoticist +exoticity +exoticness +exotics +exotism +exotisms +exotospore +exotoxic +exotoxin +exotoxins +exotropia +exotropic +exotropism +exp +expalpate +expand +expandability +expandable +expanded +expandedly +expandedness +expander +expanders +expandibility +expandible +expanding +expandingly +expands +expanse +expanses +expansibility +expansible +expansibleness +expansibly +expansile +expansion +expansional +expansionary +expansionism +expansionist +expansionistic +expansionists +expansions +expansive +expansively +expansiveness +expansivity +expansometer +expansum +expansure +expatiate +expatiated +expatiater +expatiates +expatiating +expatiatingly +expatiation +expatiations +expatiative +expatiator +expatiatory +expatiators +expatriate +expatriated +expatriates +expatriating +expatriation +expatriations +expatriatism +expdt +expect +expectable +expectably +expectance +expectancy +expectancies +expectant +expectantly +expectation +expectations +expectative +expected +expectedly +expectedness +expecter +expecters +expecting +expectingly +expection +expective +expectorant +expectorants +expectorate +expectorated +expectorates +expectorating +expectoration +expectorations +expectorative +expectorator +expectorators +expects +expede +expeded +expediate +expedience +expediences +expediency +expediencies +expedient +expediente +expediential +expedientially +expedientist +expediently +expedients +expediment +expeding +expeditate +expeditated +expeditating +expeditation +expedite +expedited +expeditely +expediteness +expediter +expediters +expedites +expediting +expedition +expeditionary +expeditionist +expeditions +expeditious +expeditiously +expeditiousness +expeditive +expeditor +expel +expellable +expellant +expelled +expellee +expellees +expellent +expeller +expellers +expelling +expels +expend +expendability +expendable +expendables +expended +expender +expenders +expendible +expending +expenditor +expenditrix +expenditure +expenditures +expends +expense +expensed +expenseful +expensefully +expensefulness +expenseless +expenselessness +expenses +expensilation +expensing +expensive +expensively +expensiveness +expenthesis +expergefacient +expergefaction +experience +experienceable +experienced +experienceless +experiencer +experiences +experiencible +experiencing +experient +experiential +experientialism +experientialist +experientialistic +experientially +experiment +experimental +experimentalism +experimentalist +experimentalists +experimentalize +experimentally +experimentarian +experimentation +experimentations +experimentative +experimentator +experimented +experimentee +experimenter +experimenters +experimenting +experimentist +experimentize +experimently +experimentor +experiments +expermentized +experrection +expert +experted +experting +expertise +expertised +expertising +expertism +expertize +expertized +expertizing +expertly +expertness +experts +expertship +expetible +expy +expiable +expiate +expiated +expiates +expiating +expiation +expiational +expiations +expiatist +expiative +expiator +expiatory +expiatoriness +expiators +expilate +expilation +expilator +expirable +expirant +expirate +expiration +expirations +expirator +expiratory +expire +expired +expiree +expirer +expirers +expires +expiry +expiries +expiring +expiringly +expiscate +expiscated +expiscating +expiscation +expiscator +expiscatory +explain +explainability +explainable +explainableness +explained +explainer +explainers +explaining +explainingly +explains +explait +explanate +explanation +explanations +explanative +explanatively +explanator +explanatory +explanatorily +explanatoriness +explanitory +explant +explantation +explanted +explanting +explants +explat +explees +explement +explemental +explementary +explete +expletive +expletively +expletiveness +expletives +expletory +explicability +explicable +explicableness +explicably +explicanda +explicandum +explicans +explicantia +explicate +explicated +explicates +explicating +explication +explications +explicative +explicatively +explicator +explicatory +explicators +explicit +explicitly +explicitness +explicits +explida +explodable +explode +exploded +explodent +exploder +exploders +explodes +exploding +exploit +exploitable +exploitage +exploitation +exploitationist +exploitations +exploitative +exploitatively +exploitatory +exploited +exploitee +exploiter +exploiters +exploiting +exploitive +exploits +exploiture +explorable +explorate +exploration +explorational +explorations +explorative +exploratively +explorativeness +explorator +exploratory +explore +explored +explorement +explorer +explorers +explores +exploring +exploringly +explosibility +explosible +explosimeter +explosion +explosionist +explosions +explosive +explosively +explosiveness +explosives +expo +expoliate +expolish +expone +exponence +exponency +exponent +exponential +exponentially +exponentials +exponentiate +exponentiated +exponentiates +exponentiating +exponentiation +exponentiations +exponention +exponents +exponible +export +exportability +exportable +exportation +exportations +exported +exporter +exporters +exporting +exports +expos +exposable +exposal +exposals +expose +exposed +exposedness +exposer +exposers +exposes +exposing +exposit +exposited +expositing +exposition +expositional +expositionary +expositions +expositive +expositively +expositor +expository +expositorial +expositorially +expositorily +expositoriness +expositors +expositress +exposits +expostulate +expostulated +expostulates +expostulating +expostulatingly +expostulation +expostulations +expostulative +expostulatively +expostulator +expostulatory +exposture +exposure +exposures +expound +expoundable +expounded +expounder +expounders +expounding +expounds +expreme +express +expressable +expressage +expressed +expresser +expresses +expressibility +expressible +expressibly +expressing +expressio +expression +expressionable +expressional +expressionful +expressionism +expressionist +expressionistic +expressionistically +expressionists +expressionless +expressionlessly +expressionlessness +expressions +expressive +expressively +expressiveness +expressivism +expressivity +expressless +expressly +expressman +expressmen +expressness +expresso +expressor +expressure +expressway +expressways +exprimable +exprobate +exprobrate +exprobration +exprobratory +expromission +expromissor +expropriable +expropriate +expropriated +expropriates +expropriating +expropriation +expropriations +expropriator +expropriatory +expt +exptl +expugn +expugnable +expuition +expulsatory +expulse +expulsed +expulser +expulses +expulsing +expulsion +expulsionist +expulsions +expulsive +expulsory +expunction +expunge +expungeable +expunged +expungement +expunger +expungers +expunges +expunging +expurgate +expurgated +expurgates +expurgating +expurgation +expurgational +expurgations +expurgative +expurgator +expurgatory +expurgatorial +expurgators +expurge +expwy +exquire +exquisite +exquisitely +exquisiteness +exquisitism +exquisitive +exquisitively +exquisitiveness +exr +exradio +exradius +exrupeal +exrx +exsanguinate +exsanguinated +exsanguinating +exsanguination +exsanguine +exsanguineous +exsanguinity +exsanguinous +exsanguious +exscind +exscinded +exscinding +exscinds +exscissor +exscribe +exscript +exscriptural +exsculp +exsculptate +exscutellate +exsec +exsecant +exsecants +exsect +exsected +exsectile +exsecting +exsection +exsector +exsects +exsequatur +exsert +exserted +exsertile +exserting +exsertion +exserts +exsheath +exship +exsibilate +exsibilation +exsiccant +exsiccatae +exsiccate +exsiccated +exsiccating +exsiccation +exsiccative +exsiccator +exsiliency +exsolution +exsolve +exsolved +exsolving +exsomatic +exspoliation +exspuition +exsputory +exstemporal +exstemporaneous +exstill +exstimulate +exstipulate +exstrophy +exstruct +exsuccous +exsuction +exsudate +exsufflate +exsufflation +exsufflicate +exsuperance +exsuperate +exsurge +exsurgent +exsuscitate +ext +exta +extacie +extance +extancy +extant +extatic +extbook +extemporal +extemporally +extemporalness +extemporaneity +extemporaneous +extemporaneously +extemporaneousness +extemporary +extemporarily +extemporariness +extempore +extempory +extemporisation +extemporise +extemporised +extemporiser +extemporising +extemporization +extemporize +extemporized +extemporizer +extemporizes +extemporizing +extend +extendability +extendable +extended +extendedly +extendedness +extender +extenders +extendibility +extendible +extending +extendlessness +extends +extense +extensibility +extensible +extensibleness +extensile +extensimeter +extension +extensional +extensionalism +extensionality +extensionally +extensionist +extensionless +extensions +extensity +extensive +extensively +extensiveness +extensivity +extensometer +extensor +extensory +extensors +extensum +extensure +extent +extentions +extents +extenuate +extenuated +extenuates +extenuating +extenuatingly +extenuation +extenuations +extenuative +extenuator +extenuatory +exter +exterior +exteriorate +exterioration +exteriorisation +exteriorise +exteriorised +exteriorising +exteriority +exteriorization +exteriorize +exteriorized +exteriorizing +exteriorly +exteriorness +exteriors +exterminable +exterminate +exterminated +exterminates +exterminating +extermination +exterminations +exterminative +exterminator +exterminatory +exterminators +exterminatress +exterminatrix +extermine +extermined +extermining +exterminist +extern +externa +external +externalisation +externalise +externalised +externalising +externalism +externalist +externalistic +externality +externalities +externalization +externalize +externalized +externalizes +externalizing +externally +externalness +externals +externat +externate +externation +externe +externes +externity +externization +externize +externomedian +externs +externship +externum +exteroceptist +exteroceptive +exteroceptor +exterous +exterraneous +exterrestrial +exterritorial +exterritoriality +exterritorialize +exterritorially +extersive +extg +extill +extima +extime +extimulate +extinct +extincted +extincteur +extincting +extinction +extinctionist +extinctions +extinctive +extinctor +extincts +extine +extinguised +extinguish +extinguishable +extinguishant +extinguished +extinguisher +extinguishers +extinguishes +extinguishing +extinguishment +extypal +extipulate +extirp +extirpate +extirpated +extirpateo +extirpates +extirpating +extirpation +extirpationist +extirpations +extirpative +extirpator +extirpatory +extispex +extispices +extispicy +extispicious +extogenous +extol +extoled +extoling +extoll +extollation +extolled +extoller +extollers +extolling +extollingly +extollment +extolls +extolment +extols +extoolitic +extorsion +extorsive +extorsively +extort +extorted +extorter +extorters +extorting +extortion +extortionary +extortionate +extortionately +extortionateness +extortioner +extortioners +extortionist +extortionists +extortions +extortive +extorts +extra +extrabold +extraboldface +extrabranchial +extrabronchial +extrabuccal +extrabulbar +extrabureau +extraburghal +extracalendar +extracalicular +extracanonical +extracapsular +extracardial +extracarpal +extracathedral +extracellular +extracellularly +extracerebral +extrachromosomal +extracystic +extracivic +extracivically +extraclassroom +extraclaustral +extracloacal +extracollegiate +extracolumella +extracondensed +extraconscious +extraconstellated +extraconstitutional +extracorporeal +extracorporeally +extracorpuscular +extracosmic +extracosmical +extracostal +extracranial +extract +extractability +extractable +extractant +extracted +extractibility +extractible +extractiform +extracting +extraction +extractions +extractive +extractively +extractor +extractors +extractorship +extracts +extracultural +extracurial +extracurricular +extracurriculum +extracutaneous +extradecretal +extradialectal +extradict +extradictable +extradicted +extradicting +extradictionary +extraditable +extradite +extradited +extradites +extraditing +extradition +extraditions +extradomestic +extrados +extradosed +extradoses +extradotal +extraduction +extradural +extraembryonal +extraembryonic +extraenteric +extraepiphyseal +extraequilibrium +extraessential +extraessentially +extrafascicular +extrafine +extrafloral +extrafocal +extrafoliaceous +extraforaneous +extraformal +extragalactic +extragastric +extrahazardous +extrahepatic +extrait +extrajudicial +extrajudicially +extralateral +extralegal +extralegally +extraliminal +extralimital +extralinguistic +extralinguistically +extralite +extrality +extramarginal +extramarital +extramatrical +extramedullary +extramental +extrameridian +extrameridional +extrametaphysical +extrametrical +extrametropolitan +extramission +extramodal +extramolecular +extramorainal +extramorainic +extramoral +extramoralist +extramundane +extramural +extramurally +extramusical +extranational +extranatural +extranean +extraneity +extraneous +extraneously +extraneousness +extranidal +extranormal +extranuclear +extraocular +extraofficial +extraoral +extraorbital +extraorbitally +extraordinary +extraordinaries +extraordinarily +extraordinariness +extraorganismal +extraovate +extraovular +extraparenchymal +extraparental +extraparietal +extraparliamentary +extraparochial +extraparochially +extrapatriarchal +extrapelvic +extraperineal +extraperiodic +extraperiosteal +extraperitoneal +extraphenomenal +extraphysical +extraphysiological +extrapyramidal +extrapituitary +extraplacental +extraplanetary +extrapleural +extrapoetical +extrapolar +extrapolate +extrapolated +extrapolates +extrapolating +extrapolation +extrapolations +extrapolative +extrapolator +extrapolatory +extrapopular +extraposition +extraprofessional +extraprostatic +extraprovincial +extrapulmonary +extrapunitive +extraquiz +extrared +extraregarding +extraregular +extraregularly +extrarenal +extraretinal +extrarhythmical +extras +extrasacerdotal +extrascholastic +extraschool +extrascientific +extrascriptural +extrascripturality +extrasensible +extrasensory +extrasensorial +extrasensuous +extraserous +extrasyllabic +extrasyllogistic +extrasyphilitic +extrasystole +extrasystolic +extrasocial +extrasolar +extrasomatic +extraspectral +extraspherical +extraspinal +extrastapedial +extrastate +extrasterile +extrastomachal +extratabular +extratarsal +extratellurian +extratelluric +extratemporal +extratension +extratensive +extraterrene +extraterrestrial +extraterrestrially +extraterrestrials +extraterritorial +extraterritoriality +extraterritorially +extraterritorials +extrathecal +extratheistic +extrathermodynamic +extrathoracic +extratympanic +extratorrid +extratracheal +extratribal +extratropical +extratubal +extraught +extrauterine +extravagance +extravagances +extravagancy +extravagancies +extravagant +extravagantes +extravagantly +extravagantness +extravaganza +extravaganzas +extravagate +extravagated +extravagating +extravagation +extravagence +extravaginal +extravasate +extravasated +extravasating +extravasation +extravascular +extravehicular +extravenate +extraventricular +extraversion +extraversive +extraversively +extravert +extraverted +extravertish +extravertive +extravertively +extravillar +extraviolet +extravisceral +extrazodiacal +extreat +extrema +extremal +extreme +extremeless +extremely +extremeness +extremer +extremes +extremest +extremis +extremism +extremist +extremistic +extremists +extremital +extremity +extremities +extremum +extremuma +extricable +extricably +extricate +extricated +extricates +extricating +extrication +extrications +extrinsic +extrinsical +extrinsicality +extrinsically +extrinsicalness +extrinsicate +extrinsication +extroitive +extromit +extropical +extrorsal +extrorse +extrorsely +extrospect +extrospection +extrospective +extroversion +extroversive +extroversively +extrovert +extroverted +extrovertedness +extrovertish +extrovertive +extrovertively +extroverts +extruct +extrudability +extrudable +extrude +extruded +extruder +extruders +extrudes +extruding +extrusible +extrusile +extrusion +extrusions +extrusive +extrusory +extubate +extubation +extuberance +extuberant +extuberate +extumescence +extund +exturb +extusion +exuberance +exuberancy +exuberant +exuberantly +exuberantness +exuberate +exuberated +exuberating +exuberation +exuccous +exucontian +exudate +exudates +exudation +exudations +exudative +exudatory +exude +exuded +exudence +exudes +exuding +exul +exulate +exulcerate +exulcerated +exulcerating +exulceration +exulcerative +exulceratory +exulding +exult +exultance +exultancy +exultant +exultantly +exultation +exulted +exultet +exulting +exultingly +exults +exululate +exumbral +exumbrella +exumbrellar +exundance +exundancy +exundate +exundation +exungulate +exuperable +exurb +exurban +exurbanite +exurbanites +exurbia +exurbias +exurbs +exurge +exuscitate +exust +exuvia +exuviability +exuviable +exuviae +exuvial +exuviate +exuviated +exuviates +exuviating +exuviation +exuvium +exxon +exzodiacal +ezan +ezba +ezekiel +ezod +ezra +f +fa +faade +faailk +fab +faba +fabaceae +fabaceous +fabella +fabes +fabian +fabianism +fabianist +fabiform +fable +fabled +fabledom +fableist +fableland +fablemaker +fablemonger +fablemongering +fabler +fablers +fables +fabliau +fabliaux +fabling +fabraea +fabric +fabricable +fabricant +fabricate +fabricated +fabricates +fabricating +fabrication +fabricational +fabrications +fabricative +fabricator +fabricators +fabricatress +fabricature +fabrics +fabrikoid +fabrile +fabrique +fabronia +fabroniaceae +fabula +fabular +fabulate +fabulist +fabulists +fabulize +fabulosity +fabulous +fabulously +fabulousness +faburden +fac +facadal +facade +facaded +facades +face +faceable +facebar +facebow +facebread +facecloth +faced +facedown +faceharden +faceless +facelessness +facelift +facelifts +facellite +facemaker +facemaking +faceman +facemark +faceoff +facepiece +faceplate +facer +facers +faces +facesaving +facet +facete +faceted +facetely +faceteness +facetiae +facetiation +faceting +facetious +facetiously +facetiousness +facets +facette +facetted +facetting +faceup +facewise +facework +facy +facia +facial +facially +facials +facias +faciata +faciation +facie +faciend +faciends +faciendum +facient +facier +facies +faciest +facile +facilely +facileness +facily +facilitate +facilitated +facilitates +facilitating +facilitation +facilitations +facilitative +facilitator +facility +facilities +facing +facingly +facings +facinorous +facinorousness +faciobrachial +faciocervical +faciolingual +facioplegia +facioscapulohumeral +facit +fack +fackeltanz +fackings +fackins +facks +faconde +faconne +facsim +facsimile +facsimiled +facsimileing +facsimiles +facsimiling +facsimilist +facsimilize +fact +factable +factabling +factfinder +factful +facty +factice +facticide +facticity +faction +factional +factionalism +factionalist +factionally +factionary +factionaries +factionate +factioneer +factionism +factionist +factionistism +factions +factious +factiously +factiousness +factish +factitial +factitious +factitiously +factitiousness +factitive +factitively +factitude +factive +facto +factor +factorability +factorable +factorage +factordom +factored +factoress +factory +factorial +factorially +factorials +factories +factorylike +factoring +factoryship +factorist +factorization +factorizations +factorize +factorized +factorizing +factors +factorship +factotum +factotums +factrix +facts +factual +factualism +factualist +factualistic +factuality +factually +factualness +factum +facture +factures +facula +faculae +facular +faculative +faculous +facultate +facultative +facultatively +faculty +facultied +faculties +facultize +facund +facundity +fad +fadable +fadaise +faddy +faddier +faddiest +faddiness +fadding +faddish +faddishly +faddishness +faddism +faddisms +faddist +faddists +faddle +fade +fadeaway +fadeaways +faded +fadedly +fadedness +fadednyess +fadeless +fadelessly +faden +fadeout +fader +faders +fades +fadge +fadged +fadges +fadging +fady +fading +fadingly +fadingness +fadings +fadlike +fadme +fadmonger +fadmongery +fadmongering +fado +fados +fadridden +fads +fae +faecal +faecalith +faeces +faecula +faeculence +faena +faenas +faence +faenus +faery +faerie +faeries +faeryland +faeroe +faeroese +fafaronade +faff +faffy +faffle +fafnir +fag +fagaceae +fagaceous +fagald +fagales +fagara +fage +fagelia +fager +fagged +fagger +faggery +faggy +fagging +faggingly +faggot +faggoted +faggoty +faggoting +faggotry +faggots +fagin +fagine +fagins +fagopyrism +fagopyrismus +fagopyrum +fagot +fagoted +fagoter +fagoters +fagoty +fagoting +fagotings +fagots +fagott +fagotte +fagottino +fagottist +fagotto +fagottone +fags +fagus +faham +fahlband +fahlbands +fahlerz +fahlore +fahlunite +fahlunitte +fahrenheit +fahrenhett +fay +fayal +fayalite +fayalites +fayed +faience +fayence +faiences +fayettism +faying +faikes +fail +failance +failed +fayles +failing +failingly +failingness +failings +faille +failles +fails +failsafe +failsoft +failure +failures +fain +fainaigue +fainaigued +fainaiguer +fainaiguing +fainant +faineance +faineancy +faineant +faineantise +faineantism +faineants +fainer +fainest +fainly +fainness +fains +faint +fainted +fainter +fainters +faintest +faintful +faintheart +fainthearted +faintheartedly +faintheartedness +fainty +fainting +faintingly +faintise +faintish +faintishness +faintly +faintling +faintness +faints +faipule +fair +fairbanks +faire +faired +fairer +fairest +fairfieldite +fairgoer +fairgoing +fairgrass +fairground +fairgrounds +fairhead +fairy +fairydom +fairies +fairyfloss +fairyfolk +fairyhood +fairyish +fairyism +fairyisms +fairyland +fairylands +fairily +fairylike +fairing +fairings +fairyology +fairyologist +fairish +fairyship +fairishly +fairishness +fairkeeper +fairlead +fairleader +fairleads +fairly +fairlike +fairling +fairm +fairness +fairnesses +fairs +fairship +fairsome +fairstead +fairtime +fairway +fairways +fairwater +fays +faisan +faisceau +fait +faitery +faith +faithbreach +faithbreaker +faithed +faithful +faithfully +faithfulness +faithfuls +faithing +faithless +faithlessly +faithlessness +faiths +faithwise +faithworthy +faithworthiness +faitor +faitour +faitours +faits +fayumic +fake +faked +fakeer +fakeers +fakement +faker +fakery +fakeries +fakers +fakes +faki +faky +fakiness +faking +fakir +fakirism +fakirs +fakofo +fala +falafel +falanaka +falange +falangism +falangist +falasha +falbala +falbalas +falbelo +falcade +falcata +falcate +falcated +falcation +falcer +falces +falchion +falchions +falcial +falcidian +falciform +falcinellus +falciparum +falco +falcon +falconbill +falconelle +falconer +falconers +falcones +falconet +falconets +falconidae +falconiform +falconiformes +falconinae +falconine +falconlike +falconnoid +falconoid +falconry +falconries +falcons +falcopern +falcula +falcular +falculate +falcunculus +falda +faldage +falderal +falderals +falderol +falderols +faldetta +faldfee +falding +faldistory +faldstool +faldworth +falerian +falern +falernian +falerno +faliscan +falisci +falk +falkland +fall +falla +fallace +fallacy +fallacia +fallacies +fallacious +fallaciously +fallaciousness +fallage +fallal +fallalery +fallalishly +fallals +fallation +fallaway +fallback +fallbacks +fallectomy +fallen +fallency +fallenness +faller +fallers +fallfish +fallfishes +fally +fallibilism +fallibilist +fallibility +fallible +fallibleness +fallibly +falling +fallings +falloff +falloffs +fallopian +fallostomy +fallotomy +fallout +fallouts +fallow +fallowed +fallowing +fallowist +fallowness +fallows +falls +falltime +fallway +falsary +false +falsedad +falseface +falsehearted +falseheartedly +falseheartedness +falsehood +falsehoods +falsely +falsen +falseness +falser +falsest +falsettist +falsetto +falsettos +falsework +falsidical +falsie +falsies +falsify +falsifiability +falsifiable +falsificate +falsification +falsifications +falsificator +falsified +falsifier +falsifiers +falsifies +falsifying +falsism +falsiteit +falsity +falsities +falstaffian +falsum +faltboat +faltboats +faltche +falter +faltere +faltered +falterer +falterers +faltering +falteringly +falters +falun +falunian +faluns +falus +falutin +falx +fam +fama +famacide +famatinite +famble +fame +famed +fameflower +fameful +fameless +famelessly +famelessness +famelic +fames +fameuse +fameworthy +familarity +family +familia +familial +familiar +familiary +familiarisation +familiarise +familiarised +familiariser +familiarising +familiarisingly +familiarism +familiarity +familiarities +familiarization +familiarizations +familiarize +familiarized +familiarizer +familiarizes +familiarizing +familiarizingly +familiarly +familiarness +familiars +familic +families +familyish +familism +familist +familistere +familistery +familistic +familistical +famille +famine +famines +faming +famish +famished +famishes +famishing +famishment +famose +famous +famously +famousness +famp +famular +famulary +famulative +famuli +famulli +famulus +fan +fana +fanakalo +fanal +fanaloka +fanam +fanatic +fanatical +fanatically +fanaticalness +fanaticise +fanaticised +fanaticising +fanaticism +fanaticize +fanaticized +fanaticizing +fanatico +fanatics +fanatism +fanback +fanbearer +fancy +fanciable +fancical +fancied +fancier +fanciers +fancies +fanciest +fancify +fanciful +fancifully +fancifulness +fancying +fanciless +fancily +fancymonger +fanciness +fancysick +fancywork +fand +fandangle +fandango +fandangos +fandom +fandoms +fane +fanega +fanegada +fanegadas +fanegas +fanes +fanfarade +fanfare +fanfares +fanfaron +fanfaronade +fanfaronading +fanfarons +fanfish +fanfishes +fanflower +fanfold +fanfolds +fanfoot +fang +fanga +fangas +fanged +fanger +fangy +fanging +fangle +fangled +fanglement +fangless +fanglet +fanglike +fanglomerate +fango +fangot +fangotherapy +fangs +fanhouse +fany +faniente +fanion +fanioned +fanions +fanit +fanjet +fanjets +fankle +fanleaf +fanlight +fanlights +fanlike +fanmaker +fanmaking +fanman +fanned +fannel +fanneling +fannell +fanner +fanners +fanny +fannia +fannier +fannies +fanning +fannings +fannon +fano +fanon +fanons +fanos +fanout +fans +fant +fantad +fantaddish +fantail +fantailed +fantails +fantaisie +fantaseid +fantasy +fantasia +fantasias +fantasie +fantasied +fantasies +fantasying +fantasist +fantasists +fantasize +fantasized +fantasizes +fantasizing +fantasm +fantasmagoria +fantasmagoric +fantasmagorically +fantasmal +fantasms +fantasque +fantassin +fantast +fantastic +fantastical +fantasticality +fantastically +fantasticalness +fantasticate +fantastication +fantasticism +fantasticly +fantasticness +fantastico +fantastry +fantasts +fanteague +fantee +fanteeg +fanterie +fanti +fantigue +fantoccini +fantocine +fantod +fantoddish +fantods +fantom +fantoms +fanum +fanums +fanwe +fanweed +fanwise +fanwork +fanwort +fanworts +fanwright +fanzine +fanzines +faon +fapesmo +faq +faqir +faqirs +faquir +faquirs +far +farad +faraday +faradaic +faradays +faradic +faradisation +faradise +faradised +faradiser +faradises +faradising +faradism +faradisms +faradization +faradize +faradized +faradizer +faradizes +faradizing +faradmeter +faradocontractility +faradomuscular +faradonervous +faradopalpation +farads +farand +farandine +farandman +farandmen +farandola +farandole +farandoles +faraon +farasula +faraway +farawayness +farce +farced +farcelike +farcemeat +farcer +farcers +farces +farcetta +farceur +farceurs +farceuse +farceuses +farci +farcy +farcial +farcialize +farcical +farcicality +farcically +farcicalness +farcie +farcied +farcies +farcify +farcilite +farcin +farcing +farcinoma +farcist +farctate +fard +fardage +farde +farded +fardel +fardelet +fardels +fardh +farding +fardo +fards +fare +fared +farenheit +farer +farers +fares +faretta +farewell +farewelled +farewelling +farewells +farfal +farfara +farfel +farfels +farfet +farfetch +farfetched +farfetchedness +farforthly +farfugium +fargite +fargoing +fargood +farhand +farhands +farina +farinaceous +farinaceously +farinacious +farinas +farine +faring +farinha +farinhas +farinometer +farinose +farinosel +farinosely +farinulent +fario +farish +farkleberry +farkleberries +farl +farle +farley +farles +farleu +farls +farm +farmable +farmage +farmed +farmer +farmeress +farmerette +farmery +farmeries +farmerish +farmerly +farmerlike +farmers +farmership +farmhand +farmhands +farmhold +farmhouse +farmhousey +farmhouses +farmy +farmyard +farmyardy +farmyards +farming +farmings +farmland +farmlands +farmost +farmout +farmplace +farms +farmscape +farmstead +farmsteading +farmsteads +farmtown +farmwife +farnesol +farnesols +farness +farnesses +farnovian +faro +faroeish +faroelite +faroese +faroff +farolito +faros +farouche +farouk +farrage +farraginous +farrago +farragoes +farragos +farrand +farrandly +farrant +farrantly +farreachingly +farreate +farreation +farrel +farrier +farriery +farrieries +farrierlike +farriers +farris +farrisite +farrow +farrowed +farrowing +farrows +farruca +farsakh +farsalah +farsang +farse +farseeing +farseeingness +farseer +farset +farsi +farsight +farsighted +farsightedly +farsightedness +farstepped +fart +farted +farth +farther +fartherance +fartherer +farthermore +farthermost +farthest +farthing +farthingale +farthingales +farthingdeal +farthingless +farthings +farting +fartlek +farts +farweltered +fas +fasc +fasces +fascet +fascia +fasciae +fascial +fascias +fasciate +fasciated +fasciately +fasciation +fascicle +fascicled +fascicles +fascicular +fascicularly +fasciculate +fasciculated +fasciculately +fasciculation +fascicule +fasciculi +fasciculite +fasciculus +fascili +fascinate +fascinated +fascinatedly +fascinates +fascinating +fascinatingly +fascination +fascinations +fascinative +fascinator +fascinatress +fascine +fascinery +fascines +fascintatingly +fascio +fasciodesis +fasciola +fasciolae +fasciolar +fasciolaria +fasciolariidae +fasciole +fasciolet +fascioliasis +fasciolidae +fascioloid +fascioplasty +fasciotomy +fascis +fascism +fascisms +fascist +fascista +fascisti +fascistic +fascistically +fascisticization +fascisticize +fascistization +fascistize +fascists +fasels +fash +fashed +fasher +fashery +fasherie +fashes +fashing +fashion +fashionability +fashionable +fashionableness +fashionably +fashional +fashionative +fashioned +fashioner +fashioners +fashioning +fashionist +fashionize +fashionless +fashionmonger +fashionmonging +fashions +fashious +fashiousness +fasibitikite +fasinite +fasnacht +fasola +fass +fassaite +fassalite +fast +fastback +fastbacks +fastball +fastballs +fasted +fasten +fastened +fastener +fasteners +fastening +fastenings +fastens +faster +fastest +fastgoing +fasthold +fasti +fastidiosity +fastidious +fastidiously +fastidiousness +fastidium +fastigate +fastigated +fastigia +fastigiate +fastigiated +fastigiately +fastigious +fastigium +fastigiums +fastiia +fasting +fastingly +fastings +fastish +fastland +fastly +fastnacht +fastness +fastnesses +fasts +fastuous +fastuously +fastuousness +fastus +fastwalk +fat +fatagaga +fatal +fatale +fatales +fatalism +fatalisms +fatalist +fatalistic +fatalistically +fatalists +fatality +fatalities +fatalize +fatally +fatalness +fatals +fatback +fatbacks +fatbird +fatbirds +fatbrained +fatcake +fate +fated +fateful +fatefully +fatefulness +fatelike +fates +fath +fathead +fatheaded +fatheadedly +fatheadedness +fatheads +fathearted +father +fathercraft +fathered +fatherhood +fathering +fatherkin +fatherland +fatherlandish +fatherlands +fatherless +fatherlessness +fatherly +fatherlike +fatherliness +fatherling +fathers +fathership +fathmur +fathogram +fathom +fathomable +fathomableness +fathomage +fathomed +fathomer +fathometer +fathoming +fathomless +fathomlessly +fathomlessness +fathoms +faticableness +fatidic +fatidical +fatidically +fatiferous +fatigability +fatigable +fatigableness +fatigate +fatigated +fatigating +fatigation +fatiguability +fatiguabilities +fatiguable +fatigue +fatigued +fatigueless +fatigues +fatiguesome +fatiguing +fatiguingly +fatiha +fatihah +fatil +fatiloquent +fatima +fatimid +fating +fatiscence +fatiscent +fatless +fatly +fatlike +fatling +fatlings +fatness +fatnesses +fator +fats +fatshedera +fatsia +fatso +fatsoes +fatsos +fatstock +fatstocks +fattable +fatted +fatten +fattenable +fattened +fattener +fatteners +fattening +fattens +fatter +fattest +fatty +fattier +fatties +fattiest +fattily +fattiness +fatting +fattish +fattishness +fattrels +fatuate +fatuism +fatuity +fatuities +fatuitous +fatuitousness +fatuoid +fatuous +fatuously +fatuousness +fatuus +fatwa +fatwood +faubourg +faubourgs +faucal +faucalize +faucals +fauces +faucet +faucets +fauchard +fauchards +faucial +faucitis +fauconnier +faucre +faufel +faugh +faujasite +faujdar +fauld +faulds +faulkland +faulkner +fault +faultage +faulted +faulter +faultfind +faultfinder +faultfinders +faultfinding +faultful +faultfully +faulty +faultier +faultiest +faultily +faultiness +faulting +faultless +faultlessly +faultlessness +faults +faultsman +faulx +faun +fauna +faunae +faunal +faunally +faunas +faunated +faunch +faunish +faunist +faunistic +faunistical +faunistically +faunlike +faunology +faunological +fauns +fauntleroy +faunula +faunule +faunus +faurd +faured +fausant +fause +fausen +faussebraie +faussebraye +faussebrayed +faust +fauster +faustian +faut +faute +fauterer +fauteuil +fauteuils +fautor +fautorship +fauve +fauves +fauvette +fauvism +fauvisms +fauvist +fauvists +faux +fauxbourdon +favaginous +favel +favela +favelas +favelidium +favella +favellae +favellidia +favellidium +favellilidia +favelloid +faventine +faveolate +faveoli +faveoluli +faveolus +faverel +faverole +favi +faviform +favilla +favillae +favillous +favism +favissa +favissae +favn +favonian +favonius +favor +favorability +favorable +favorableness +favorably +favored +favoredly +favoredness +favorer +favorers +favoress +favoring +favoringly +favorite +favorites +favoritism +favorless +favors +favose +favosely +favosite +favosites +favositidae +favositoid +favour +favourable +favourableness +favourably +favoured +favouredly +favouredness +favourer +favourers +favouress +favouring +favouringly +favourite +favouritism +favourless +favours +favous +favus +favuses +fawe +fawkener +fawn +fawned +fawner +fawnery +fawners +fawny +fawnier +fawniest +fawning +fawningly +fawningness +fawnlike +fawns +fawnskin +fax +faxed +faxes +faxing +faze +fazed +fazenda +fazendas +fazendeiro +fazes +fazing +fb +fbi +fc +fchar +fcy +fcomp +fconv +fconvert +fcp +fcs +fdname +fdnames +fdtype +fdub +fdubs +fe +feaberry +feague +feak +feaked +feaking +feal +fealty +fealties +fear +fearable +fearbabe +feared +fearedly +fearedness +fearer +fearers +fearful +fearfuller +fearfullest +fearfully +fearfulness +fearing +fearingly +fearless +fearlessly +fearlessness +fearnaught +fearnought +fears +fearsome +fearsomely +fearsomeness +feasance +feasances +feasant +fease +feased +feases +feasibility +feasibilities +feasible +feasibleness +feasibly +feasing +feasor +feast +feasted +feasten +feaster +feasters +feastful +feastfully +feasting +feastless +feastly +feastraw +feasts +feat +feateous +feater +featest +feather +featherback +featherbed +featherbedded +featherbedding +featherbird +featherbone +featherbrain +featherbrained +feathercut +featherdom +feathered +featheredge +featheredged +featheredges +featherer +featherers +featherfew +featherfoil +featherhead +featherheaded +feathery +featherier +featheriest +featheriness +feathering +featherleaf +featherless +featherlessness +featherlet +featherlight +featherlike +featherman +feathermonger +featherpate +featherpated +feathers +featherstitch +featherstitching +feathertop +featherway +featherweed +featherweight +featherweights +featherwing +featherwise +featherwood +featherwork +featherworker +featy +featish +featishly +featishness +featless +featly +featlier +featliest +featliness +featness +featous +feats +featural +featurally +feature +featured +featureful +featureless +featurelessness +featurely +featureliness +features +featurette +featuring +featurish +feaze +feazed +feazes +feazing +feazings +febres +febricant +febricide +febricitant +febricitation +febricity +febricula +febrifacient +febriferous +febrific +febrifugal +febrifuge +febrifuges +febrile +febrility +febriphobia +febris +febronian +febronianism +february +februaries +februarius +februation +fec +fecal +fecalith +fecaloid +fecche +feceris +feces +fechnerian +fecial +fecials +fecifork +fecit +feck +fecket +feckful +feckfully +feckless +fecklessly +fecklessness +feckly +fecks +feckulence +fecula +feculae +feculence +feculency +feculent +fecund +fecundate +fecundated +fecundates +fecundating +fecundation +fecundations +fecundative +fecundator +fecundatory +fecundify +fecundity +fecundities +fecundize +fed +fedayee +fedayeen +fedarie +feddan +feddans +fedelini +fedellini +federacy +federacies +federal +federalese +federalisation +federalise +federalised +federalising +federalism +federalist +federalistic +federalists +federalization +federalizations +federalize +federalized +federalizes +federalizing +federally +federalness +federals +federary +federarie +federate +federated +federates +federating +federation +federational +federationist +federations +federatist +federative +federatively +federator +fedia +fedifragous +fedity +fedn +fedora +fedoras +feds +fee +feeable +feeb +feeble +feeblebrained +feeblehearted +feebleheartedly +feebleheartedness +feebleminded +feeblemindedly +feeblemindedness +feebleness +feebler +feebless +feeblest +feebly +feebling +feeblish +feed +feedable +feedback +feedbacks +feedbag +feedbags +feedbin +feedboard +feedbox +feedboxes +feeded +feeder +feeders +feedhead +feedy +feeding +feedings +feedingstuff +feedlot +feedlots +feedman +feeds +feedsman +feedstock +feedstuff +feedstuffs +feedway +feedwater +feeing +feel +feelable +feeler +feelers +feeless +feely +feelies +feeling +feelingful +feelingless +feelinglessly +feelingly +feelingness +feelings +feels +feer +feere +feerie +feering +fees +feest +feet +feetage +feetfirst +feetless +feeze +feezed +feezes +feezing +feff +fefnicute +fegary +fegatella +fegs +feh +fehmic +fei +fey +feyer +feyest +feif +feigher +feign +feigned +feignedly +feignedness +feigner +feigners +feigning +feigningly +feigns +feijoa +feil +feyness +feynesses +feinschmecker +feinschmeckers +feint +feinted +feinter +feinting +feints +feirie +feis +feiseanna +feist +feisty +feistier +feistiest +feists +felafel +felaheen +felahin +felanders +felapton +feldsher +feldspar +feldsparphyre +feldspars +feldspath +feldspathic +feldspathization +feldspathoid +feldspathoidal +feldspathose +fele +felichthys +felicide +felicify +felicific +felicitate +felicitated +felicitates +felicitating +felicitation +felicitations +felicitator +felicitators +felicity +felicities +felicitous +felicitously +felicitousness +felid +felidae +felids +feliform +felinae +feline +felinely +felineness +felines +felinity +felinities +felinophile +felinophobe +felis +felix +fell +fella +fellable +fellage +fellagha +fellah +fellaheen +fellahin +fellahs +fellani +fellas +fellata +fellatah +fellate +fellated +fellatee +fellating +fellatio +fellation +fellations +fellatios +fellator +fellatory +fellatrice +fellatrices +fellatrix +fellatrixes +felled +fellen +feller +fellers +fellest +fellfare +felly +fellic +felliducous +fellies +fellifluous +felling +fellingbird +fellinic +fellmonger +fellmongered +fellmongery +fellmongering +fellness +fellnesses +felloe +felloes +fellon +fellow +fellowcraft +fellowed +fellowess +fellowheirship +fellowing +fellowless +fellowly +fellowlike +fellowman +fellowmen +fellowred +fellows +fellowship +fellowshiped +fellowshiping +fellowshipped +fellowshipping +fellowships +fells +fellside +fellsman +feloid +felon +felones +feloness +felony +felonies +felonious +feloniously +feloniousness +felonous +felonry +felonries +felons +felonsetter +felonsetting +felonweed +felonwood +felonwort +fels +felsic +felsite +felsites +felsitic +felsobanyite +felsophyre +felsophyric +felsosphaerite +felspar +felspars +felspath +felspathic +felspathose +felstone +felstones +felt +felted +felter +felty +feltyfare +feltyflier +felting +feltings +feltlike +feltmaker +feltmaking +feltman +feltmonger +feltness +felts +feltwork +feltwort +felucca +feluccas +felup +felwort +felworts +fem +female +femalely +femaleness +females +femalist +femality +femalize +femcee +feme +femereil +femerell +femes +femic +femicide +feminacy +feminacies +feminal +feminality +feminate +femineity +feminie +feminility +feminin +feminine +femininely +feminineness +feminines +femininism +femininity +feminisation +feminise +feminised +feminises +feminising +feminism +feminisms +feminist +feministic +feministics +feminists +feminity +feminities +feminization +feminize +feminized +feminizes +feminizing +feminology +feminologist +feminophobe +femme +femmes +femora +femoral +femorocaudal +femorocele +femorococcygeal +femorofibular +femoropopliteal +femororotulian +femorotibial +fempty +femur +femurs +fen +fenagle +fenagled +fenagler +fenagles +fenagling +fenbank +fenberry +fence +fenced +fenceful +fenceless +fencelessness +fencelet +fencelike +fenceplay +fencepost +fencer +fenceress +fencers +fences +fenchene +fenchyl +fenchol +fenchone +fencible +fencibles +fencing +fencings +fend +fendable +fended +fender +fendered +fendering +fenderless +fenders +fendy +fendillate +fendillation +fending +fends +fenerate +feneration +fenestella +fenestellae +fenestellid +fenestellidae +fenester +fenestra +fenestrae +fenestral +fenestrate +fenestrated +fenestration +fenestrato +fenestrone +fenestrule +fenetre +fengite +fenian +fenianism +fenite +fenks +fenland +fenlander +fenman +fenmen +fennec +fennecs +fennel +fennelflower +fennels +fenner +fenny +fennici +fennig +fennish +fennoman +fenouillet +fenouillette +fenrir +fens +fensive +fenster +fent +fentanyl +fenter +fenugreek +fenzelia +feod +feodal +feodality +feodary +feodaries +feodatory +feods +feodum +feoff +feoffed +feoffee +feoffees +feoffeeship +feoffer +feoffers +feoffing +feoffment +feoffor +feoffors +feoffs +feower +fer +feracious +feracity +feracities +ferae +ferahan +feral +feralin +ferally +feramorz +ferash +ferbam +ferbams +ferberite +ferd +ferdiad +ferdwit +fere +feres +feretory +feretories +feretra +feretrum +ferfathmur +ferfel +ferfet +ferforth +ferganite +fergus +fergusite +ferguson +fergusonite +feria +feriae +ferial +ferias +feriation +feridgi +feridjee +feridji +ferie +ferigee +ferijee +ferine +ferinely +ferineness +feringhee +feringi +ferio +ferison +ferity +ferities +ferk +ferkin +ferly +ferlie +ferlied +ferlies +ferlying +ferling +fermacy +fermage +fermail +fermal +fermata +fermatas +fermate +fermatian +ferme +ferment +fermentability +fermentable +fermental +fermentarian +fermentate +fermentation +fermentations +fermentative +fermentatively +fermentativeness +fermentatory +fermented +fermenter +fermentescible +fermenting +fermentitious +fermentive +fermentology +fermentor +ferments +fermentum +fermerer +fermery +fermi +fermila +fermillet +fermion +fermions +fermis +fermium +fermiums +fermorite +fern +fernambuck +fernandinite +fernando +fernbird +fernbrake +ferned +fernery +ferneries +ferngale +ferngrower +ferny +fernyear +fernier +ferniest +ferninst +fernland +fernleaf +fernless +fernlike +ferns +fernseed +fernshaw +fernsick +ferntickle +ferntickled +fernticle +fernwort +ferocactus +feroce +ferocious +ferociously +ferociousness +ferocity +ferocities +feroher +feronia +ferous +ferox +ferr +ferrado +ferrament +ferrandin +ferrara +ferrarese +ferrary +ferrash +ferrate +ferrated +ferrateen +ferrates +ferratin +ferrean +ferredoxin +ferreiro +ferrel +ferreled +ferreling +ferrelled +ferrelling +ferrels +ferren +ferreous +ferrer +ferret +ferreted +ferreter +ferreters +ferrety +ferreting +ferrets +ferretto +ferri +ferry +ferriage +ferryage +ferriages +ferryboat +ferryboats +ferric +ferrichloride +ferricyanate +ferricyanhydric +ferricyanic +ferricyanide +ferricyanogen +ferried +ferrier +ferries +ferriferous +ferrihemoglobin +ferrihydrocyanic +ferryhouse +ferrying +ferrimagnet +ferrimagnetic +ferrimagnetically +ferrimagnetism +ferryman +ferrymen +ferring +ferriprussiate +ferriprussic +ferris +ferrite +ferrites +ferritic +ferritin +ferritins +ferritization +ferritungstite +ferrivorous +ferryway +ferroalloy +ferroaluminum +ferroboron +ferrocalcite +ferrocene +ferrocerium +ferrochrome +ferrochromium +ferrocyanate +ferrocyanhydric +ferrocyanic +ferrocyanide +ferrocyanogen +ferroconcrete +ferroconcretor +ferroelectric +ferroelectrically +ferroelectricity +ferroglass +ferrogoslarite +ferrohydrocyanic +ferroinclave +ferromagnesian +ferromagnet +ferromagnetic +ferromagneticism +ferromagnetism +ferromanganese +ferrometer +ferromolybdenum +ferronatrite +ferronickel +ferrophosphorus +ferroprint +ferroprussiate +ferroprussic +ferrosilicon +ferrotype +ferrotyped +ferrotyper +ferrotypes +ferrotyping +ferrotitanium +ferrotungsten +ferrous +ferrovanadium +ferrozirconium +ferruginate +ferruginated +ferruginating +ferrugination +ferruginean +ferrugineous +ferruginous +ferrugo +ferrule +ferruled +ferruler +ferrules +ferruling +ferrum +ferruminate +ferruminated +ferruminating +ferrumination +ferrums +fers +fersmite +ferter +ferth +ferther +ferthumlungur +fertil +fertile +fertilely +fertileness +fertilisability +fertilisable +fertilisation +fertilisational +fertilise +fertilised +fertiliser +fertilising +fertilitate +fertility +fertilities +fertilizability +fertilizable +fertilization +fertilizational +fertilizations +fertilize +fertilized +fertilizer +fertilizers +fertilizes +fertilizing +feru +ferula +ferulaceous +ferulae +ferulaic +ferular +ferulas +ferule +feruled +ferules +ferulic +feruling +ferv +fervanite +fervence +fervency +fervencies +fervent +fervently +ferventness +fervescence +fervescent +fervid +fervidity +fervidly +fervidness +fervidor +fervor +fervorless +fervorlessness +fervorous +fervors +fervour +fervours +fesapo +fescennine +fescenninity +fescue +fescues +fesels +fess +fesse +fessed +fessely +fesses +fessewise +fessing +fessways +fesswise +fest +festa +festae +festal +festally +feste +festellae +fester +festered +festering +festerment +festers +festy +festilogy +festilogies +festin +festinance +festinate +festinated +festinately +festinating +festination +festine +festing +festino +festival +festivalgoer +festivally +festivals +festive +festively +festiveness +festivity +festivities +festivous +festology +feston +festoon +festooned +festoonery +festooneries +festoony +festooning +festoons +festschrift +festschriften +festschrifts +festshrifts +festuca +festucine +festucous +fet +feta +fetal +fetalism +fetalization +fetas +fetation +fetations +fetch +fetched +fetcher +fetchers +fetches +fetching +fetchingly +fete +feted +feteless +feterita +feteritas +fetes +fetial +fetiales +fetialis +fetials +fetich +fetiches +fetichic +fetichism +fetichist +fetichistic +fetichize +fetichlike +fetichmonger +fetichry +feticidal +feticide +feticides +fetid +fetidity +fetidly +fetidness +fetiferous +feting +fetiparous +fetis +fetise +fetish +fetisheer +fetisher +fetishes +fetishic +fetishism +fetishist +fetishistic +fetishists +fetishization +fetishize +fetishlike +fetishmonger +fetishry +fetlock +fetlocked +fetlocks +fetlow +fetography +fetology +fetologies +fetologist +fetometry +fetoplacental +fetor +fetors +fets +fetted +fetter +fetterbush +fettered +fetterer +fetterers +fettering +fetterless +fetterlock +fetters +fetticus +fetting +fettle +fettled +fettler +fettles +fettling +fettlings +fettstein +fettuccine +fettucine +fettucini +feture +fetus +fetuses +fetwa +feu +feuage +feuar +feuars +feucht +feud +feudal +feudalisation +feudalise +feudalised +feudalising +feudalism +feudalist +feudalistic +feudalists +feudality +feudalities +feudalizable +feudalization +feudalize +feudalized +feudalizing +feudally +feudary +feudaries +feudatary +feudatory +feudatorial +feudatories +feuded +feudee +feuder +feuding +feudist +feudists +feudovassalism +feuds +feudum +feued +feuillage +feuillants +feuille +feuillemorte +feuillet +feuilleton +feuilletonism +feuilletonist +feuilletonistic +feuilletons +feuing +feulamort +feus +feute +feuter +feuterer +fever +feverberry +feverberries +feverbush +fevercup +fevered +feveret +feverfew +feverfews +fevergum +fevery +fevering +feverish +feverishly +feverishness +feverless +feverlike +feverous +feverously +feverroot +fevers +fevertrap +fevertwig +fevertwitch +feverweed +feverwort +few +fewer +fewest +fewmand +fewmets +fewnes +fewneses +fewness +fewnesses +fewsome +fewter +fewterer +fewtrils +fez +fezes +fezzan +fezzed +fezzes +fezzy +fezziwig +ff +ffa +fg +fgn +fgrid +fhrer +fi +fy +fiacre +fiacres +fiador +fiancailles +fiance +fianced +fiancee +fiancees +fiances +fianchetti +fianchetto +fiancing +fianna +fiant +fiants +fiar +fiard +fiaroblast +fiars +fiaschi +fiasco +fiascoes +fiascos +fiat +fiatconfirmatio +fiats +fiaunt +fib +fibbed +fibber +fibbery +fibbers +fibbing +fibdom +fiber +fiberboard +fibered +fiberfill +fiberglas +fiberglass +fiberization +fiberize +fiberized +fiberizer +fiberizes +fiberizing +fiberless +fiberous +fibers +fiberscope +fiberware +fibra +fibration +fibratus +fibre +fibreboard +fibred +fibrefill +fibreglass +fibreless +fibres +fibreware +fibry +fibriform +fibril +fibrilated +fibrilation +fibrilations +fibrilla +fibrillae +fibrillar +fibrillary +fibrillate +fibrillated +fibrillating +fibrillation +fibrillations +fibrilled +fibrilliferous +fibrilliform +fibrillose +fibrillous +fibrils +fibrin +fibrinate +fibrination +fibrine +fibrinemia +fibrinoalbuminous +fibrinocellular +fibrinogen +fibrinogenetic +fibrinogenic +fibrinogenically +fibrinogenous +fibrinoid +fibrinokinase +fibrinolyses +fibrinolysin +fibrinolysis +fibrinolytic +fibrinoplastic +fibrinoplastin +fibrinopurulent +fibrinose +fibrinosis +fibrinous +fibrins +fibrinuria +fibro +fibroadenia +fibroadenoma +fibroadipose +fibroangioma +fibroareolar +fibroblast +fibroblastic +fibrobronchitis +fibrocalcareous +fibrocarcinoma +fibrocartilage +fibrocartilaginous +fibrocaseose +fibrocaseous +fibrocellular +fibrocement +fibrochondritis +fibrochondroma +fibrochondrosteal +fibrocyst +fibrocystic +fibrocystoma +fibrocyte +fibrocytic +fibrocrystalline +fibroelastic +fibroenchondroma +fibrofatty +fibroferrite +fibroglia +fibroglioma +fibrohemorrhagic +fibroid +fibroids +fibroin +fibroins +fibrointestinal +fibroligamentous +fibrolipoma +fibrolipomatous +fibrolite +fibrolitic +fibroma +fibromas +fibromata +fibromatoid +fibromatosis +fibromatous +fibromembrane +fibromembranous +fibromyectomy +fibromyitis +fibromyoma +fibromyomatous +fibromyomectomy +fibromyositis +fibromyotomy +fibromyxoma +fibromyxosarcoma +fibromucous +fibromuscular +fibroneuroma +fibronuclear +fibronucleated +fibropapilloma +fibropericarditis +fibroplasia +fibroplastic +fibropolypus +fibropsammoma +fibropurulent +fibroreticulate +fibrosarcoma +fibrose +fibroserous +fibroses +fibrosis +fibrosity +fibrosities +fibrositis +fibrospongiae +fibrotic +fibrotuberculosis +fibrous +fibrously +fibrousness +fibrovasal +fibrovascular +fibs +fibster +fibula +fibulae +fibular +fibulare +fibularia +fibulas +fibulocalcaneal +fica +ficary +ficaria +ficaries +ficche +fice +fyce +ficelle +fices +fyces +fichat +fiche +fiches +fichtean +fichteanism +fichtelite +fichu +fichus +ficiform +ficin +ficins +fickle +ficklehearted +fickleness +fickler +ficklest +ficklety +ficklewise +fickly +fico +ficoes +ficoid +ficoidaceae +ficoidal +ficoideae +ficoides +fict +fictation +fictil +fictile +fictileness +fictility +fiction +fictional +fictionalization +fictionalize +fictionalized +fictionalizes +fictionalizing +fictionally +fictionary +fictioneer +fictioneering +fictioner +fictionisation +fictionise +fictionised +fictionising +fictionist +fictionistic +fictionization +fictionize +fictionized +fictionizing +fictionmonger +fictions +fictious +fictitious +fictitiously +fictitiousness +fictive +fictively +fictor +ficula +ficus +fid +fidac +fidalgo +fidate +fidation +fidawi +fidded +fidding +fiddle +fiddleback +fiddlebow +fiddlebrained +fiddlecome +fiddled +fiddlededee +fiddledeedee +fiddlefaced +fiddlehead +fiddleheaded +fiddley +fiddleys +fiddleneck +fiddler +fiddlerfish +fiddlerfishes +fiddlery +fiddlers +fiddles +fiddlestick +fiddlesticks +fiddlestring +fiddlewood +fiddly +fiddlies +fiddling +fide +fideicommiss +fideicommissa +fideicommissary +fideicommissaries +fideicommission +fideicommissioner +fideicommissor +fideicommissum +fideicommissumissa +fideism +fideisms +fideist +fideistic +fideists +fidejussion +fidejussionary +fidejussor +fidejussory +fidel +fidele +fideles +fidelia +fidelio +fidelis +fidelity +fidelities +fideos +fidepromission +fidepromissor +fides +fidessa +fidfad +fidge +fidged +fidges +fidget +fidgetation +fidgeted +fidgeter +fidgeters +fidgety +fidgetily +fidgetiness +fidgeting +fidgetingly +fidgets +fidging +fidia +fidibus +fidicinal +fidicinales +fidicula +fidiculae +fidley +fidleys +fido +fidos +fids +fiducia +fiducial +fiducially +fiduciary +fiduciaries +fiduciarily +fiducinales +fie +fied +fiedlerite +fief +fiefdom +fiefdoms +fiefs +fiel +field +fieldball +fieldbird +fielded +fielden +fielder +fielders +fieldfare +fieldfight +fieldy +fieldie +fielding +fieldish +fieldleft +fieldman +fieldmen +fieldmice +fieldmouse +fieldpiece +fieldpieces +fields +fieldsman +fieldsmen +fieldstone +fieldstrip +fieldward +fieldwards +fieldwork +fieldworker +fieldwort +fiend +fiendful +fiendfully +fiendhead +fiendish +fiendishly +fiendishness +fiendism +fiendly +fiendlier +fiendliest +fiendlike +fiendliness +fiends +fiendship +fient +fierabras +fierasfer +fierasferid +fierasferidae +fierasferoid +fierce +fiercehearted +fiercely +fiercen +fiercened +fierceness +fiercening +fiercer +fiercest +fiercly +fierding +fieri +fiery +fierier +fieriest +fierily +fieriness +fierte +fiesta +fiestas +fieulamort +fife +fifed +fifer +fifers +fifes +fifie +fifing +fifish +fifo +fifteen +fifteener +fifteenfold +fifteens +fifteenth +fifteenthly +fifteenths +fifth +fifthly +fifths +fifty +fifties +fiftieth +fiftieths +fiftyfold +fiftypenny +fig +figary +figaro +figbird +figboy +figeater +figeaters +figent +figeter +figged +figgery +figgy +figgier +figgiest +figging +figgle +figgum +fight +fightable +fighter +fighteress +fighters +fighting +fightingly +fightings +fights +fightwite +figitidae +figless +figlike +figment +figmental +figments +figo +figpecker +figs +figshell +figulate +figulated +figuline +figulines +figura +figurability +figurable +figurae +figural +figurally +figurant +figurante +figurants +figurate +figurately +figuration +figurational +figurations +figurative +figuratively +figurativeness +figurato +figure +figured +figuredly +figurehead +figureheadless +figureheads +figureheadship +figureless +figurer +figurers +figures +figuresome +figurette +figury +figurial +figurine +figurines +figuring +figurings +figurism +figurist +figuriste +figurize +figworm +figwort +figworts +fiji +fijian +fike +fyke +fiked +fikey +fikery +fykes +fikh +fikie +fiking +fil +fila +filace +filaceous +filacer +filago +filagree +filagreed +filagreeing +filagrees +filagreing +filament +filamentar +filamentary +filamented +filamentiferous +filamentoid +filamentose +filamentous +filaments +filamentule +filander +filanders +filao +filar +filaree +filarees +filaria +filariae +filarial +filarian +filariasis +filaricidal +filariform +filariid +filariidae +filariids +filarious +filasse +filate +filator +filatory +filature +filatures +filaze +filazer +filbert +filberts +filch +filched +filcher +filchery +filchers +filches +filching +filchingly +file +filea +fileable +filecard +filechar +filed +filefish +filefishes +filelike +filemaker +filemaking +filemark +filemarks +filemot +filename +filenames +filer +filers +files +filesave +filesmith +filesniff +filespec +filestatus +filet +fileted +fileting +filets +fylfot +fylfots +fylgja +fylgjur +fili +filial +filiality +filially +filialness +filiate +filiated +filiates +filiating +filiation +filibeg +filibegs +filibranch +filibranchia +filibranchiate +filibuster +filibustered +filibusterer +filibusterers +filibustering +filibusterism +filibusterous +filibusters +filibustrous +filical +filicales +filicauline +filices +filicic +filicidal +filicide +filicides +filiciform +filicin +filicineae +filicinean +filicinian +filicite +filicites +filicoid +filicoids +filicology +filicologist +filicornia +filiety +filiferous +filiform +filiformed +filigera +filigerous +filigrain +filigrained +filigrane +filigraned +filigree +filigreed +filigreeing +filigrees +filigreing +filii +filing +filings +filionymic +filiopietistic +filioque +filipendula +filipendulous +filipina +filipiniana +filipinization +filipinize +filipino +filipinos +filippi +filippic +filippo +filipuncture +filister +filisters +filite +filius +filix +fylker +fill +filla +fillable +fillagree +fillagreed +fillagreing +fille +fillebeg +filled +fillemot +filler +fillercap +fillers +filles +fillet +filleted +filleter +filleting +filletlike +fillets +filletster +filleul +filly +fillies +filling +fillingly +fillingness +fillings +fillip +filliped +fillipeen +filliping +fillips +fillister +fillmass +fillmore +fillock +fillowite +fills +film +filmable +filmcard +filmcards +filmdom +filmdoms +filmed +filmer +filmet +filmgoer +filmgoers +filmgoing +filmy +filmic +filmically +filmier +filmiest +filmiform +filmily +filminess +filming +filmish +filmist +filmize +filmized +filmizing +filmland +filmlands +filmlike +filmmake +filmmaker +filmmaking +filmogen +filmography +filmographies +films +filmset +filmsets +filmsetter +filmsetting +filmslide +filmstrip +filmstrips +filo +filoplumaceous +filoplume +filopodia +filopodium +filosa +filose +filoselle +filosofe +filosus +fils +filt +filter +filterability +filterable +filterableness +filtered +filterer +filterers +filtering +filterman +filtermen +filters +filth +filthy +filthier +filthiest +filthify +filthified +filthifying +filthily +filthiness +filthless +filths +filtrability +filtrable +filtratable +filtrate +filtrated +filtrates +filtrating +filtration +filtre +filum +fimble +fimbles +fimbria +fimbriae +fimbrial +fimbriate +fimbriated +fimbriating +fimbriation +fimbriatum +fimbricate +fimbricated +fimbrilla +fimbrillae +fimbrillate +fimbrilliferous +fimbrillose +fimbriodentate +fimbristylis +fimetarious +fimetic +fimicolous +fin +finable +finableness +finagle +finagled +finagler +finaglers +finagles +finagling +final +finale +finales +finalis +finalism +finalisms +finalist +finalists +finality +finalities +finalization +finalizations +finalize +finalized +finalizes +finalizing +finally +finals +finance +financed +financer +finances +financial +financialist +financially +financier +financiere +financiered +financiery +financiering +financiers +financing +financist +finary +finback +finbacks +finbone +finca +fincas +finch +finchbacked +finched +finchery +finches +find +findability +findable +findal +finder +finders +findfault +findhorn +findy +finding +findings +findjan +findon +finds +fine +fineable +fineableness +finebent +finecomb +fined +finedraw +finedrawing +fineer +fineish +fineleaf +fineless +finely +finement +fineness +finenesses +finer +finery +fineries +fines +finespun +finesse +finessed +finesser +finesses +finessing +finest +finestill +finestiller +finestra +finetop +finew +finewed +finfish +finfishes +finfoot +finfoots +fingal +fingall +fingallian +fingan +fingent +finger +fingerable +fingerberry +fingerboard +fingerboards +fingerbreadth +fingered +fingerer +fingerers +fingerfish +fingerfishes +fingerflower +fingerhold +fingerhook +fingery +fingering +fingerings +fingerleaf +fingerless +fingerlet +fingerlike +fingerling +fingerlings +fingermark +fingernail +fingernails +fingerparted +fingerpost +fingerprint +fingerprinted +fingerprinting +fingerprints +fingerroot +fingers +fingersmith +fingerspin +fingerstall +fingerstone +fingertip +fingertips +fingerwise +fingerwork +fingian +fingram +fingrigo +fingu +fini +finial +finialed +finials +finical +finicality +finically +finicalness +finicism +finick +finicky +finickier +finickiest +finickily +finickin +finickiness +finicking +finickingly +finickingness +finify +finific +finiglacial +finikin +finiking +fining +finings +finis +finises +finish +finishable +finished +finisher +finishers +finishes +finishing +finitary +finite +finitely +finiteness +finites +finitesimal +finity +finitism +finitive +finitude +finitudes +finjan +fink +finked +finkel +finking +finks +finland +finlander +finlandization +finless +finlet +finlike +finmark +finmarks +finn +finnac +finnack +finnan +finned +finner +finnesko +finny +finnic +finnicize +finnick +finnicky +finnickier +finnickiest +finnicking +finnier +finniest +finning +finnip +finnish +finnmark +finnmarks +finnoc +finnochio +finns +fino +finochio +finochios +fins +finspot +fintadores +fionnuala +fiord +fiorded +fiords +fioretti +fiorin +fiorite +fioritura +fioriture +fiot +fip +fipenny +fippence +fipple +fipples +fiqh +fique +fiques +fir +firbolg +firca +fyrd +fyrdung +fire +fireable +firearm +firearmed +firearms +fireback +fireball +fireballs +firebase +firebases +firebed +firebird +firebirds +fireblende +fireboard +fireboat +fireboats +fireboy +firebolt +firebolted +firebomb +firebombed +firebombing +firebombs +fireboot +firebote +firebox +fireboxes +firebrand +firebrands +firebrat +firebrats +firebreak +firebreaks +firebrick +firebricks +firebug +firebugs +fireburn +fireclay +fireclays +firecoat +firecracker +firecrackers +firecrest +fired +firedamp +firedamps +firedog +firedogs +firedragon +firedrake +firefall +firefang +firefanged +firefanging +firefangs +firefight +firefighter +firefighters +firefighting +fireflaught +firefly +fireflies +fireflirt +fireflower +fireguard +firehall +firehalls +firehouse +firehouses +fireless +firelight +firelike +fireling +firelit +firelock +firelocks +fireman +firemanship +firemaster +firemen +firepan +firepans +firepink +firepinks +fireplace +fireplaces +fireplough +fireplow +fireplug +fireplugs +firepot +firepower +fireproof +fireproofed +fireproofing +fireproofness +firer +fireroom +firerooms +firers +fires +firesafe +firesafeness +firesafety +fireshaft +fireshine +fireside +firesider +firesides +firesideship +firespout +firestone +firestop +firestopping +firestorm +firetail +firethorn +firetop +firetower +firetrap +firetraps +firewall +fireward +firewarden +firewater +fireweed +fireweeds +firewood +firewoods +firework +fireworky +fireworkless +fireworks +fireworm +fireworms +firy +firiness +firing +firings +firk +firked +firker +firkin +firking +firkins +firlot +firm +firma +firmament +firmamental +firmaments +firman +firmance +firmans +firmarii +firmarius +firmation +firmed +firmer +firmers +firmest +firmhearted +firming +firmisternal +firmisternia +firmisternial +firmisternous +firmity +firmitude +firmland +firmless +firmly +firmness +firmnesses +firms +firmware +firn +firnification +firnismalerei +firns +firoloida +firry +firring +firs +first +firstborn +firstcomer +firster +firstfruits +firsthand +firstly +firstling +firstlings +firstness +firsts +firstship +firth +firths +fisc +fiscal +fiscalify +fiscalism +fiscality +fiscalization +fiscalize +fiscalized +fiscalizing +fiscally +fiscals +fischerite +fiscs +fiscus +fise +fisetin +fish +fishability +fishable +fishback +fishbed +fishberry +fishberries +fishboat +fishboats +fishbolt +fishbolts +fishbone +fishbones +fishbowl +fishbowls +fisheater +fished +fisheye +fisheyes +fisher +fisherboat +fisherboy +fisheress +fisherfolk +fishergirl +fishery +fisheries +fisherman +fishermen +fisherpeople +fishers +fisherwoman +fishes +fishet +fishfall +fishfinger +fishful +fishgarth +fishgig +fishgigs +fishgrass +fishhold +fishhood +fishhook +fishhooks +fishhouse +fishy +fishyard +fishyback +fishybacking +fishier +fishiest +fishify +fishified +fishifying +fishily +fishiness +fishing +fishingly +fishings +fishless +fishlet +fishlike +fishline +fishlines +fishling +fishman +fishmeal +fishmeals +fishmen +fishmonger +fishmouth +fishnet +fishnets +fishplate +fishpole +fishpoles +fishpond +fishponds +fishpool +fishpot +fishpotter +fishpound +fishskin +fishspear +fishtail +fishtailed +fishtailing +fishtails +fishway +fishways +fishweed +fishweir +fishwife +fishwives +fishwoman +fishwood +fishworker +fishworks +fishworm +fisk +fisnoga +fissate +fissicostate +fissidactyl +fissidens +fissidentaceae +fissidentaceous +fissile +fissileness +fissilingual +fissilinguia +fissility +fission +fissionability +fissionable +fissional +fissioned +fissioning +fissions +fissipalmate +fissipalmation +fissiparation +fissiparism +fissiparity +fissiparous +fissiparously +fissiparousness +fissiped +fissipeda +fissipedal +fissipedate +fissipedia +fissipedial +fissipeds +fissipes +fissirostral +fissirostrate +fissirostres +fissive +fissle +fissura +fissural +fissuration +fissure +fissured +fissureless +fissurella +fissurellidae +fissures +fissury +fissuriform +fissuring +fist +fisted +fister +fistfight +fistful +fistfuls +fisty +fistiana +fistic +fistical +fisticuff +fisticuffer +fisticuffery +fisticuffing +fisticuffs +fistify +fistiness +fisting +fistinut +fistle +fistlike +fistmele +fistnote +fistnotes +fists +fistuca +fistula +fistulae +fistulana +fistular +fistularia +fistulariidae +fistularioid +fistulas +fistulate +fistulated +fistulatome +fistulatous +fistule +fistuliform +fistulina +fistulization +fistulize +fistulized +fistulizing +fistulose +fistulous +fistwise +fit +fitch +fitche +fitched +fitchee +fitcher +fitchered +fitchery +fitchering +fitches +fitchet +fitchets +fitchew +fitchews +fitchy +fitful +fitfully +fitfulness +fitified +fitly +fitment +fitments +fitness +fitnesses +fitout +fitroot +fits +fittable +fittage +fytte +fitted +fittedness +fitten +fitter +fitters +fyttes +fittest +fitty +fittier +fittiest +fittyfied +fittily +fittiness +fitting +fittingly +fittingness +fittings +fittit +fittyways +fittywise +fittonia +fitweed +fitz +fitzclarence +fitzroy +fitzroya +fiuman +fiumara +five +fivebar +fivefold +fivefoldness +fiveling +fivepence +fivepenny +fivepins +fiver +fivers +fives +fivescore +fivesome +fivestones +fivish +fix +fixable +fixage +fixate +fixated +fixates +fixatif +fixatifs +fixating +fixation +fixations +fixative +fixatives +fixator +fixature +fixe +fixed +fixedly +fixedness +fixer +fixers +fixes +fixgig +fixidity +fixing +fixings +fixion +fixity +fixities +fixive +fixt +fixture +fixtureless +fixtures +fixup +fixups +fixure +fixures +fiz +fizelyite +fizgig +fizgigs +fizz +fizzed +fizzer +fizzers +fizzes +fizzy +fizzier +fizziest +fizzing +fizzle +fizzled +fizzles +fizzling +fizzwater +fjarding +fjeld +fjelds +fjerding +fjord +fjorded +fjords +fjorgyn +fl +flab +flabbella +flabbergast +flabbergastation +flabbergasted +flabbergasting +flabbergastingly +flabbergasts +flabby +flabbier +flabbiest +flabbily +flabbiness +flabel +flabella +flabellarium +flabellate +flabellation +flabellifoliate +flabelliform +flabellinerved +flabellum +flabile +flabra +flabrum +flabs +flaccid +flaccidity +flaccidities +flaccidly +flaccidness +flachery +flacherie +flacian +flacianism +flacianist +flack +flacked +flacker +flackery +flacket +flacks +flacon +flacons +flacourtia +flacourtiaceae +flacourtiaceous +flaff +flaffer +flag +flagarie +flagboat +flagella +flagellant +flagellantism +flagellants +flagellar +flagellaria +flagellariaceae +flagellariaceous +flagellata +flagellatae +flagellate +flagellated +flagellates +flagellating +flagellation +flagellations +flagellative +flagellator +flagellatory +flagellators +flagelliferous +flagelliform +flagellist +flagellosis +flagellula +flagellulae +flagellum +flagellums +flageolet +flageolets +flagfall +flagfish +flagfishes +flagged +flaggelate +flaggelated +flaggelating +flaggelation +flaggella +flagger +flaggery +flaggers +flaggy +flaggier +flaggiest +flaggily +flagginess +flagging +flaggingly +flaggings +flaggish +flagilate +flagitate +flagitation +flagitious +flagitiously +flagitiousness +flagleaf +flagless +flaglet +flaglike +flagmaker +flagmaking +flagman +flagmen +flagon +flagonet +flagonless +flagons +flagpole +flagpoles +flagrance +flagrancy +flagrant +flagrante +flagrantly +flagrantness +flagrate +flagroot +flags +flagship +flagships +flagstaff +flagstaffs +flagstaves +flagstick +flagstone +flagstones +flagworm +flay +flayed +flayer +flayers +flayflint +flaying +flail +flailed +flailing +flaillike +flails +flain +flair +flairs +flays +flaite +flaith +flaithship +flajolotite +flak +flakage +flake +flakeboard +flaked +flakeless +flakelet +flaker +flakers +flakes +flaky +flakier +flakiest +flakily +flakiness +flaking +flam +flamandization +flamandize +flamant +flamb +flambage +flambant +flambe +flambeau +flambeaus +flambeaux +flambee +flambeed +flambeing +flamberg +flamberge +flambes +flamboyance +flamboyancy +flamboyant +flamboyantism +flamboyantize +flamboyantly +flamboyer +flame +flamed +flamefish +flamefishes +flameflower +flameholder +flameless +flamelet +flamelike +flamen +flamenco +flamencos +flamens +flamenship +flameout +flameouts +flameproof +flameproofer +flamer +flamers +flames +flamethrower +flamethrowers +flamfew +flamy +flamier +flamiest +flamineous +flamines +flaming +flamingant +flamingly +flamingo +flamingoes +flamingos +flaminian +flaminica +flaminical +flamless +flammability +flammable +flammably +flammant +flammation +flammed +flammeous +flammiferous +flammigerous +flamming +flammivomous +flammulated +flammulation +flammule +flams +flan +flancard +flancards +flanch +flanchard +flanche +flanched +flanconade +flanconnade +flandan +flanderkin +flanders +flandowser +flane +flanerie +flaneries +flanes +flaneur +flaneurs +flang +flange +flanged +flangeless +flanger +flangers +flanges +flangeway +flanging +flank +flankard +flanked +flanken +flanker +flankers +flanky +flanking +flanks +flankwise +flanned +flannel +flannelboard +flannelbush +flanneled +flannelet +flannelette +flannelflower +flanneling +flannelleaf +flannelleaves +flannelled +flannelly +flannelling +flannelmouth +flannelmouthed +flannelmouths +flannels +flanning +flanque +flans +flap +flapcake +flapdock +flapdoodle +flapdragon +flaperon +flapjack +flapjacks +flapless +flapmouthed +flappable +flapped +flapper +flapperdom +flappered +flapperhood +flappering +flapperish +flapperism +flappers +flappet +flappy +flappier +flappiest +flapping +flaps +flare +flareback +flareboard +flared +flareless +flarer +flares +flarfish +flarfishes +flary +flaring +flaringly +flaser +flash +flashback +flashbacks +flashboard +flashbulb +flashbulbs +flashcube +flashcubes +flashed +flasher +flashers +flashes +flashet +flashflood +flashforward +flashforwards +flashgun +flashguns +flashy +flashier +flashiest +flashily +flashiness +flashing +flashingly +flashings +flashlamp +flashlamps +flashly +flashlight +flashlights +flashlike +flashness +flashover +flashpan +flashproof +flashtester +flashtube +flashtubes +flask +flasker +flasket +flaskets +flaskful +flasklet +flasks +flasque +flat +flatbed +flatbeds +flatboat +flatboats +flatbottom +flatbread +flatbrod +flatcap +flatcaps +flatcar +flatcars +flatdom +flated +flateria +flatette +flatfeet +flatfish +flatfishes +flatfoot +flatfooted +flatfootedly +flatfootedness +flatfooting +flatfoots +flathat +flathe +flathead +flatheads +flatiron +flatirons +flative +flatland +flatlander +flatlanders +flatlands +flatlet +flatlets +flatly +flatling +flatlings +flatlong +flatman +flatmate +flatmen +flatness +flatnesses +flatnose +flats +flatted +flatten +flattened +flattener +flatteners +flattening +flattens +flatter +flatterable +flattercap +flatterdock +flattered +flatterer +flatterers +flatteress +flattery +flatteries +flattering +flatteringly +flatteringness +flatterous +flatters +flattest +flatteur +flattie +flatting +flattish +flattop +flattops +flatulence +flatulences +flatulency +flatulencies +flatulent +flatulently +flatulentness +flatuosity +flatuous +flatus +flatuses +flatway +flatways +flatware +flatwares +flatwash +flatwashes +flatweed +flatwise +flatwoods +flatwork +flatworks +flatworm +flatworms +flaubert +flaubertian +flaucht +flaught +flaughtbred +flaughter +flaughts +flaunch +flaunche +flaunched +flaunching +flaunt +flaunted +flaunter +flaunters +flaunty +flauntier +flauntiest +flauntily +flauntiness +flaunting +flauntingly +flaunts +flautino +flautist +flautists +flauto +flav +flavanilin +flavaniline +flavanone +flavanthrene +flavanthrone +flavedo +flavedos +flaveria +flavescence +flavescent +flavia +flavian +flavic +flavicant +flavid +flavin +flavine +flavines +flavins +flavius +flavo +flavobacteria +flavobacterium +flavone +flavones +flavonoid +flavonol +flavonols +flavoprotein +flavopurpurin +flavor +flavored +flavorer +flavorers +flavorful +flavorfully +flavorfulness +flavory +flavoriness +flavoring +flavorings +flavorless +flavorlessness +flavorous +flavorousness +flavors +flavorsome +flavorsomeness +flavour +flavoured +flavourer +flavourful +flavourfully +flavoury +flavouring +flavourless +flavourous +flavours +flavoursome +flavous +flaw +flawed +flawedness +flawflower +flawful +flawy +flawier +flawiest +flawing +flawless +flawlessly +flawlessness +flawn +flaws +flax +flaxbird +flaxboard +flaxbush +flaxdrop +flaxen +flaxes +flaxy +flaxier +flaxiest +flaxlike +flaxman +flaxseed +flaxseeds +flaxtail +flaxweed +flaxwench +flaxwife +flaxwoman +flaxwort +flb +flche +flchette +fld +fldxt +flea +fleabag +fleabags +fleabane +fleabanes +fleabite +fleabites +fleabiting +fleabitten +fleabug +fleabugs +fleadock +fleahopper +fleay +fleak +fleam +fleamy +fleams +fleapit +flear +fleas +fleaseed +fleaweed +fleawood +fleawort +fleaworts +flebile +flebotomy +fleche +fleches +flechette +flechettes +fleck +flecked +flecken +flecker +fleckered +fleckering +flecky +fleckier +fleckiest +fleckiness +flecking +fleckled +fleckless +flecklessly +flecks +flecnodal +flecnode +flect +flection +flectional +flectionless +flections +flector +fled +fledge +fledged +fledgeless +fledgeling +fledges +fledgy +fledgier +fledgiest +fledging +fledgling +fledglings +flee +fleece +fleeceable +fleeced +fleeceflower +fleeceless +fleecelike +fleecer +fleecers +fleeces +fleech +fleeched +fleeches +fleeching +fleechment +fleecy +fleecier +fleeciest +fleecily +fleeciness +fleecing +fleeing +fleer +fleered +fleerer +fleering +fleeringly +fleerish +fleers +flees +fleet +fleeted +fleeten +fleeter +fleetest +fleetful +fleeting +fleetingly +fleetingness +fleetings +fleetly +fleetness +fleets +fleetwing +flegm +fley +fleyed +fleyedly +fleyedness +fleying +fleyland +fleing +fleys +fleishig +fleysome +flem +fleme +flemer +fleming +flemings +flemish +flemished +flemishes +flemishing +flench +flenched +flenches +flenching +flense +flensed +flenser +flensers +flenses +flensing +flentes +flerry +flerried +flerrying +flesh +fleshbrush +fleshed +fleshen +flesher +fleshers +fleshes +fleshful +fleshhood +fleshhook +fleshy +fleshier +fleshiest +fleshiness +fleshing +fleshings +fleshless +fleshlessness +fleshly +fleshlier +fleshliest +fleshlike +fleshlily +fleshliness +fleshling +fleshment +fleshmonger +fleshpot +fleshpots +fleshquake +flet +fleta +fletch +fletched +fletcher +fletcherism +fletcherite +fletcherize +fletchers +fletches +fletching +fletchings +flether +fletton +fleur +fleuret +fleurette +fleurettee +fleuretty +fleury +fleuron +fleuronee +fleuronne +fleuronnee +flew +flewed +flewit +flews +flex +flexanimous +flexed +flexes +flexibility +flexibilities +flexibilty +flexible +flexibleness +flexibly +flexile +flexility +flexing +flexion +flexional +flexionless +flexions +flexity +flexitime +flexive +flexo +flexography +flexographic +flexographically +flexor +flexors +flexuose +flexuosely +flexuoseness +flexuosity +flexuosities +flexuous +flexuously +flexuousness +flexura +flexural +flexure +flexured +flexures +fly +flyability +flyable +flyaway +flyaways +flyback +flyball +flybane +flibbertigibbet +flibbertigibbety +flibbertigibbets +flybelt +flybelts +flyby +flybys +flyblew +flyblow +flyblowing +flyblown +flyblows +flyboat +flyboats +flyboy +flybook +flybrush +flibustier +flic +flycaster +flycatcher +flycatchers +flicflac +flichter +flichtered +flichtering +flichters +flick +flicked +flicker +flickered +flickery +flickering +flickeringly +flickermouse +flickerproof +flickers +flickertail +flicky +flicking +flicks +flics +flidder +flidge +flyeater +flied +flier +flyer +fliers +flyers +flies +fliest +fliffus +flyflap +flyflapper +flyflower +fligged +fligger +flight +flighted +flighter +flightful +flighthead +flighty +flightier +flightiest +flightily +flightiness +flighting +flightless +flights +flightshot +flightworthy +flying +flyingly +flyings +flyleaf +flyleaves +flyless +flyman +flymen +flimflam +flimflammed +flimflammer +flimflammery +flimflamming +flimflams +flimmer +flimp +flimsy +flimsier +flimsies +flimsiest +flimsily +flimsilyst +flimsiness +flinch +flinched +flincher +flinchers +flinches +flinching +flinchingly +flinder +flinders +flindersia +flindosa +flindosy +flyness +fling +flingdust +flinger +flingers +flingy +flinging +flings +flinkite +flint +flinted +flinter +flinthead +flinthearted +flinty +flintier +flintiest +flintify +flintified +flintifying +flintily +flintiness +flinting +flintless +flintlike +flintlock +flintlocks +flints +flintstone +flintwood +flintwork +flintworker +flyoff +flioma +flyover +flyovers +flip +flypaper +flypapers +flypast +flypasts +flipe +flype +fliped +flipflop +fliping +flipjack +flippance +flippancy +flippancies +flippant +flippantly +flippantness +flipped +flipper +flippery +flipperling +flippers +flippest +flipping +flyproof +flips +flirt +flirtable +flirtation +flirtational +flirtationless +flirtations +flirtatious +flirtatiously +flirtatiousness +flirted +flirter +flirters +flirty +flirtier +flirtiest +flirtigig +flirting +flirtingly +flirtish +flirtishness +flirtling +flirts +flysch +flysches +flisk +flisked +flisky +fliskier +fliskiest +flyspeck +flyspecked +flyspecking +flyspecks +flyswat +flyswatter +flit +flytail +flitch +flitched +flitchen +flitches +flitching +flitchplate +flite +flyte +flited +flyted +flites +flytes +flitfold +flytier +flytiers +flytime +fliting +flyting +flytings +flytrap +flytraps +flits +flitted +flitter +flitterbat +flittered +flittering +flittermice +flittermmice +flittermouse +flittern +flitters +flitty +flittiness +flitting +flittingly +flitwite +flivver +flivvers +flyway +flyways +flyweight +flyweights +flywheel +flywheels +flywinch +flywire +flywort +flix +flixweed +fll +flnerie +flneur +flneuse +flo +fload +float +floatability +floatable +floatage +floatages +floatation +floatative +floatboard +floated +floater +floaters +floaty +floatier +floatiest +floatiness +floating +floatingly +floative +floatless +floatmaker +floatman +floatmen +floatplane +floats +floatsman +floatsmen +floatstone +flob +flobby +floc +flocced +flocci +floccilation +floccillation +floccing +floccipend +floccose +floccosely +flocculable +flocculant +floccular +flocculate +flocculated +flocculating +flocculation +flocculator +floccule +flocculence +flocculency +flocculent +flocculently +floccules +flocculi +flocculose +flocculous +flocculus +floccus +flock +flockbed +flocked +flocker +flocky +flockier +flockiest +flocking +flockings +flockless +flocklike +flockling +flockman +flockmaster +flockowner +flocks +flockwise +flocoon +flocs +flodge +floe +floeberg +floey +floerkea +floes +flog +floggable +flogged +flogger +floggers +flogging +floggingly +floggings +flogmaster +flogs +flogster +floyd +floit +floyt +flokite +flon +flong +flongs +flood +floodable +floodage +floodboard +floodcock +flooded +flooder +flooders +floodgate +floodgates +floody +flooding +floodless +floodlet +floodlight +floodlighted +floodlighting +floodlights +floodlike +floodlilit +floodlit +floodmark +floodometer +floodplain +floodproof +floods +floodtime +floodway +floodways +floodwall +floodwater +floodwood +flooey +flook +flookan +floor +floorage +floorages +floorboard +floorboards +floorcloth +floorcloths +floored +floorer +floorers +floorhead +flooring +floorings +floorless +floorman +floormen +floors +floorshift +floorshifts +floorshow +floorthrough +floorway +floorwalker +floorwalkers +floorward +floorwise +floosy +floosies +floozy +floozie +floozies +flop +floperoo +flophouse +flophouses +flopover +flopovers +flopped +flopper +floppers +floppy +floppier +floppies +floppiest +floppily +floppiness +flopping +flops +flopwing +flor +flora +florae +floral +floralia +floralize +florally +floramor +floramour +floran +floras +florate +floreal +floreat +floreate +floreated +floreating +florence +florences +florent +florentine +florentines +florentinism +florentium +flores +florescence +florescent +floressence +floret +floreta +floreted +florets +florette +floretty +floretum +flory +floria +floriage +florian +floriate +floriated +floriation +floribunda +florican +floricin +floricomous +floricultural +floriculturally +floriculture +floriculturist +florid +florida +floridan +floridans +florideae +floridean +florideous +floridian +floridians +floridity +floridities +floridly +floridness +floriferous +floriferously +floriferousness +florification +floriform +florigen +florigenic +florigens +florigraphy +florikan +floriken +florilage +florilege +florilegia +florilegium +florimania +florimanist +florin +florinda +florins +floriparous +floripondio +floriscope +florissant +florist +floristic +floristically +floristics +floristry +florists +florisugent +florivorous +florizine +floroon +floroscope +floroun +floruit +floruits +florula +florulae +florulas +florulent +floscular +floscularia +floscularian +flosculariidae +floscule +flosculet +flosculose +flosculous +flosh +floss +flossa +flossed +flosser +flosses +flossflower +flossy +flossie +flossier +flossies +flossiest +flossification +flossiness +flossing +flot +flota +flotage +flotages +flotant +flotas +flotation +flotations +flotative +flote +floter +flotilla +flotillas +flotorial +flots +flotsam +flotsams +flotsan +flotsen +flotson +flotten +flotter +flounce +flounced +flouncey +flounces +flouncy +flouncier +flounciest +flouncing +flounder +floundered +floundering +flounderingly +flounders +flour +floured +flourescent +floury +flouriness +flouring +flourish +flourishable +flourished +flourisher +flourishes +flourishy +flourishing +flourishingly +flourishment +flourless +flourlike +flours +flouse +floush +flout +flouted +flouter +flouters +flouting +floutingly +flouts +flow +flowable +flowage +flowages +flowchart +flowcharted +flowcharting +flowcharts +flowcontrol +flowe +flowed +flower +flowerage +flowerbed +flowered +flowerer +flowerers +floweret +flowerets +flowerfence +flowerfly +flowerful +flowery +flowerier +floweriest +flowerily +floweriness +flowering +flowerist +flowerless +flowerlessness +flowerlet +flowerlike +flowerpecker +flowerpot +flowerpots +flowers +flowerwork +flowing +flowingly +flowingness +flowk +flowmanostat +flowmeter +flown +flowoff +flows +flowstone +flrie +flu +fluate +fluavil +fluavile +flub +flubbed +flubbing +flubdub +flubdubbery +flubdubberies +flubdubs +flubs +flucan +fluctiferous +fluctigerous +fluctisonant +fluctisonous +fluctuability +fluctuable +fluctuant +fluctuate +fluctuated +fluctuates +fluctuating +fluctuation +fluctuational +fluctuations +fluctuosity +fluctuous +flue +flued +fluegelhorn +fluey +flueless +fluellen +fluellin +fluellite +flueman +fluemen +fluence +fluency +fluencies +fluent +fluently +fluentness +fluer +flueric +fluerics +flues +fluework +fluff +fluffed +fluffer +fluffy +fluffier +fluffiest +fluffily +fluffiness +fluffing +fluffs +flugel +flugelhorn +flugelman +flugelmen +fluible +fluid +fluidacetextract +fluidal +fluidally +fluidextract +fluidglycerate +fluidible +fluidic +fluidics +fluidify +fluidification +fluidified +fluidifier +fluidifying +fluidimeter +fluidisation +fluidise +fluidised +fluidiser +fluidises +fluidising +fluidism +fluidist +fluidity +fluidities +fluidization +fluidize +fluidized +fluidizer +fluidizes +fluidizing +fluidly +fluidmeter +fluidness +fluidounce +fluidrachm +fluidram +fluidrams +fluids +fluigram +fluigramme +fluing +fluyt +fluitant +fluyts +fluke +fluked +flukey +flukeless +flukes +flukeworm +flukewort +fluky +flukier +flukiest +flukily +flukiness +fluking +flumadiddle +flumdiddle +flume +flumed +flumerin +flumes +fluming +fluminose +fluminous +flummadiddle +flummer +flummery +flummeries +flummydiddle +flummox +flummoxed +flummoxes +flummoxing +flump +flumped +flumping +flumps +flung +flunk +flunked +flunkey +flunkeydom +flunkeyhood +flunkeyish +flunkeyism +flunkeyistic +flunkeyite +flunkeyize +flunkeys +flunker +flunkers +flunky +flunkydom +flunkies +flunkyhood +flunkyish +flunkyism +flunkyistic +flunkyite +flunkyize +flunking +flunks +fluoaluminate +fluoaluminic +fluoarsenate +fluoborate +fluoboric +fluoborid +fluoboride +fluoborite +fluobromide +fluocarbonate +fluocerine +fluocerite +fluochloride +fluohydric +fluophosphate +fluor +fluoran +fluorane +fluoranthene +fluorapatite +fluorate +fluorated +fluorbenzene +fluorboric +fluorene +fluorenes +fluorenyl +fluoresage +fluoresce +fluoresced +fluorescein +fluoresceine +fluorescence +fluorescent +fluorescer +fluoresces +fluorescigenic +fluorescigenous +fluorescin +fluorescing +fluorhydric +fluoric +fluorid +fluoridate +fluoridated +fluoridates +fluoridating +fluoridation +fluoridations +fluoride +fluorides +fluoridisation +fluoridise +fluoridised +fluoridising +fluoridization +fluoridize +fluoridized +fluoridizing +fluorids +fluoryl +fluorimeter +fluorimetry +fluorimetric +fluorin +fluorinate +fluorinated +fluorinates +fluorinating +fluorination +fluorinations +fluorindin +fluorindine +fluorine +fluorines +fluorins +fluorite +fluorites +fluormeter +fluorobenzene +fluoroborate +fluorocarbon +fluorocarbons +fluorochrome +fluoroform +fluoroformol +fluorogen +fluorogenic +fluorography +fluorographic +fluoroid +fluorometer +fluorometry +fluorometric +fluorophosphate +fluoroscope +fluoroscoped +fluoroscopes +fluoroscopy +fluoroscopic +fluoroscopically +fluoroscopies +fluoroscoping +fluoroscopist +fluoroscopists +fluorosis +fluorotic +fluorotype +fluorouracil +fluors +fluorspar +fluosilicate +fluosilicic +fluotantalate +fluotantalic +fluotitanate +fluotitanic +fluozirconic +fluphenazine +flurn +flurr +flurry +flurried +flurriedly +flurries +flurrying +flurriment +flurt +flus +flush +flushable +flushboard +flushed +flusher +flusherman +flushermen +flushers +flushes +flushest +flushgate +flushy +flushing +flushingly +flushness +flusk +flusker +fluster +flusterate +flusterated +flusterating +flusteration +flustered +flusterer +flustery +flustering +flusterment +flusters +flustra +flustrate +flustrated +flustrating +flustration +flustrine +flustroid +flustrum +flute +flutebird +fluted +flutey +flutelike +flutemouth +fluter +fluters +flutes +flutework +fluther +fluty +flutidae +flutier +flutiest +flutina +fluting +flutings +flutist +flutists +flutter +flutterable +flutteration +flutterboard +fluttered +flutterer +flutterers +fluttery +flutteriness +fluttering +flutteringly +flutterless +flutterment +flutters +fluttersome +fluvanna +fluvial +fluvialist +fluviatic +fluviatile +fluviation +fluvicoline +fluvio +fluvioglacial +fluviograph +fluviolacustrine +fluviology +fluviomarine +fluviometer +fluviose +fluvioterrestrial +fluvious +fluviovolcanic +flux +fluxation +fluxed +fluxer +fluxes +fluxgraph +fluxibility +fluxible +fluxibleness +fluxibly +fluxile +fluxility +fluxing +fluxion +fluxional +fluxionally +fluxionary +fluxionist +fluxions +fluxive +fluxmeter +fluxroot +fluxure +fluxweed +fm +fmt +fn +fname +fnese +fo +foal +foaled +foalfoot +foalfoots +foalhood +foaly +foaling +foals +foam +foambow +foamed +foamer +foamers +foamflower +foamy +foamier +foamiest +foamily +foaminess +foaming +foamingly +foamless +foamlike +foams +fob +fobbed +fobbing +fobs +focal +focalisation +focalise +focalised +focalises +focalising +focalization +focalize +focalized +focalizes +focalizing +focally +focaloid +foci +focimeter +focimetry +fockle +focoids +focometer +focometry +focsle +focus +focusable +focused +focuser +focusers +focuses +focusing +focusless +focussed +focusses +focussing +fod +fodda +fodder +foddered +fodderer +foddering +fodderless +fodders +foder +fodge +fodgel +fodient +fodientia +foe +foederal +foederati +foederatus +foederis +foeffment +foehn +foehnlike +foehns +foeish +foeless +foelike +foeman +foemanship +foemen +foeniculum +foenngreek +foes +foeship +foetal +foetalism +foetalization +foetation +foeti +foeticidal +foeticide +foetid +foetiferous +foetiparous +foetor +foetors +foeture +foetus +foetuses +fofarraw +fog +fogas +fogbank +fogbound +fogbow +fogbows +fogdog +fogdogs +fogdom +foge +fogeater +fogey +fogeys +fogfruit +fogfruits +foggage +foggages +foggara +fogged +fogger +foggers +foggy +foggier +foggiest +foggily +fogginess +fogging +foggish +foghorn +foghorns +fogy +fogydom +fogie +fogies +fogyish +fogyishness +fogyism +fogyisms +fogle +fogless +foglietto +fogman +fogmen +fogo +fogon +fogou +fogproof +fogram +fogramite +fogramity +fogrum +fogs +fogscoffer +fogus +foh +fohat +fohn +fohns +foy +foyaite +foyaitic +foible +foibles +foiblesse +foyboat +foyer +foyers +foil +foilable +foiled +foiler +foiling +foils +foilsman +foilsmen +foin +foined +foining +foiningly +foins +foys +foysen +foism +foison +foisonless +foisons +foist +foisted +foister +foisty +foistiness +foisting +foists +foiter +fokker +fol +folacin +folacins +folate +folates +folcgemot +fold +foldable +foldage +foldaway +foldboat +foldboater +foldboating +foldboats +foldcourse +folded +foldedly +folden +folder +folderol +folderols +folders +foldy +folding +foldless +foldout +foldouts +folds +foldskirt +foldstool +foldure +foldwards +fole +foleye +folgerite +folia +foliaceous +foliaceousness +foliage +foliaged +foliageous +foliages +foliaging +folial +foliar +foliary +foliate +foliated +foliates +foliating +foliation +foliator +foliature +folic +folie +folies +foliicolous +foliiferous +foliiform +folily +folio +foliobranch +foliobranchiate +foliocellosis +folioed +folioing +foliolate +foliole +folioliferous +foliolose +folios +foliose +foliosity +foliot +folious +foliously +folium +foliums +folk +folkboat +folkcraft +folkfree +folky +folkish +folkishness +folkland +folklike +folklore +folklores +folkloric +folklorish +folklorism +folklorist +folkloristic +folklorists +folkmoot +folkmooter +folkmoots +folkmot +folkmote +folkmoter +folkmotes +folkmots +folkright +folks +folksay +folksey +folksy +folksier +folksiest +folksily +folksiness +folksinger +folksinging +folksong +folksongs +folktale +folktales +folkvang +folkvangr +folkway +folkways +foll +foller +folles +folletage +folletti +folletto +folly +follicle +follicles +follicular +folliculate +folliculated +follicule +folliculin +folliculina +folliculitis +folliculose +folliculosis +folliculous +follied +follyer +follies +folliful +follying +follily +follyproof +follis +follow +followable +followed +follower +followers +followership +followeth +following +followingly +followings +follows +followup +folsom +fomalhaut +foment +fomentation +fomentations +fomented +fomenter +fomenters +fomenting +fomento +foments +fomes +fomites +fon +fonctionnaire +fond +fondaco +fondak +fondant +fondants +fondateur +fonded +fonder +fondest +fonding +fondish +fondle +fondled +fondler +fondlers +fondles +fondlesome +fondly +fondlike +fondling +fondlingly +fondlings +fondness +fondnesses +fondon +fondouk +fonds +fondu +fondue +fondues +fonduk +fondus +fone +fonly +fonnish +fono +fons +font +fontainea +fontal +fontally +fontanel +fontanelle +fontanels +fontange +fontanges +fonted +fontes +fontful +fonticulus +fontina +fontinal +fontinalaceae +fontinalaceous +fontinalis +fontinas +fontlet +fonts +foo +foobar +foochow +foochowese +food +fooder +foodful +foody +foodless +foodlessness +foods +foodservices +foodstuff +foodstuffs +foofaraw +foofaraws +fooyoung +fooyung +fool +foolable +fooldom +fooled +fooler +foolery +fooleries +fooless +foolfish +foolfishes +foolhardy +foolhardier +foolhardiest +foolhardihood +foolhardily +foolhardiness +foolhardiship +foolhead +foolheaded +foolheadedness +foolify +fooling +foolish +foolisher +foolishest +foolishly +foolishness +foollike +foolmonger +foolocracy +foolproof +foolproofness +fools +foolscap +foolscaps +foolship +fooner +fooster +foosterer +foot +footage +footages +footback +football +footballer +footballist +footballs +footband +footbath +footbaths +footbeat +footblower +footboard +footboards +footboy +footboys +footbreadth +footbridge +footbridges +footcandle +footcandles +footcloth +footcloths +footed +footeite +footer +footers +footfall +footfalls +footfarer +footfault +footfeed +footfolk +footful +footganger +footgear +footgears +footgeld +footglove +footgrip +foothalt +foothil +foothill +foothills +foothils +foothold +footholds +foothook +foothot +footy +footie +footier +footiest +footing +footingly +footings +footle +footled +footler +footlers +footles +footless +footlessly +footlessness +footlicker +footlicking +footlight +footlights +footlike +footling +footlining +footlock +footlocker +footlockers +footlog +footloose +footmaker +footman +footmanhood +footmanry +footmanship +footmark +footmarks +footmen +footmenfootpad +footnote +footnoted +footnotes +footnoting +footpace +footpaces +footpad +footpaddery +footpads +footpath +footpaths +footpick +footplate +footpound +footpounds +footprint +footprints +footrace +footraces +footrail +footrest +footrests +footrill +footroom +footrope +footropes +foots +footscald +footscraper +footsy +footsie +footsies +footslog +footslogged +footslogger +footslogging +footslogs +footsoldier +footsoldiers +footsore +footsoreness +footsores +footstalk +footstall +footstep +footsteps +footstick +footstock +footstone +footstool +footstools +footway +footways +footwalk +footwall +footwalls +footwarmer +footwarmers +footwear +footweary +footwears +footwork +footworks +footworn +foozle +foozled +foozler +foozlers +foozles +foozling +fop +fopdoodle +fopling +fopped +foppery +fopperies +fopperly +foppy +fopping +foppish +foppishly +foppishness +fops +fopship +for +fora +forage +foraged +foragement +forager +foragers +forages +foraging +foray +forayed +forayer +forayers +foraying +forays +foralite +foram +foramen +foramens +foramina +foraminal +foraminate +foraminated +foramination +foraminifer +foraminifera +foraminiferal +foraminiferan +foraminiferous +foraminose +foraminous +foraminulate +foraminule +foraminulose +foraminulous +forams +forane +foraneen +foraneous +foraramens +foraramina +forasmuch +forastero +forb +forbad +forbade +forbar +forbare +forbarred +forbathe +forbbore +forbborne +forbear +forbearable +forbearance +forbearances +forbearant +forbearantly +forbearer +forbearers +forbearing +forbearingly +forbearingness +forbears +forbecause +forbesite +forby +forbid +forbidal +forbidals +forbiddable +forbiddal +forbiddance +forbidden +forbiddenly +forbiddenness +forbidder +forbidding +forbiddingly +forbiddingness +forbids +forbye +forbysen +forbysening +forbit +forbite +forblack +forbled +forblow +forbode +forboded +forbodes +forboding +forbore +forborn +forborne +forbow +forbreak +forbruise +forbs +forcaria +forcarve +forcat +force +forceable +forced +forcedly +forcedness +forceful +forcefully +forcefulness +forceless +forcelessness +forcelet +forcemeat +forcement +forcene +forceps +forcepses +forcepslike +forceput +forcer +forcers +forces +forcet +forchase +forche +forches +forcy +forcibility +forcible +forcibleness +forcibly +forcing +forcingly +forcipal +forcipate +forcipated +forcipation +forcipes +forcipial +forcipiform +forcipressure +forcipulata +forcipulate +forcite +forcive +forcleave +forclose +forconceit +forcut +ford +fordable +fordableness +fordays +fordam +fordeal +forded +fordy +fordicidia +fordid +fording +fordless +fordo +fordoes +fordoing +fordone +fordrive +fords +fordull +fordwine +fore +foreaccounting +foreaccustom +foreacquaint +foreact +foreadapt +foreadmonish +foreadvertise +foreadvice +foreadvise +foreallege +foreallot +foreannounce +foreannouncement +foreanswer +foreappoint +foreappointment +forearm +forearmed +forearming +forearms +foreassign +foreassurance +forebackwardly +forebay +forebays +forebar +forebear +forebearing +forebears +forebemoan +forebemoaned +forebespeak +foreby +forebye +forebitt +forebitten +forebitter +forebless +foreboard +forebode +foreboded +forebodement +foreboder +forebodes +forebody +forebodies +foreboding +forebodingly +forebodingness +forebodings +foreboom +forebooms +foreboot +forebow +forebowels +forebowline +forebows +forebrace +forebrain +forebreast +forebridge +forebroads +foreburton +forebush +forecabin +forecaddie +forecar +forecarriage +forecast +forecasted +forecaster +forecasters +forecasting +forecastingly +forecastle +forecastlehead +forecastleman +forecastlemen +forecastles +forecastors +forecasts +forecatching +forecatharping +forechamber +forechase +forechoice +forechoir +forechoose +forechurch +forecited +foreclaw +foreclosable +foreclose +foreclosed +forecloses +foreclosing +foreclosure +foreclosures +forecome +forecomingness +forecommend +foreconceive +foreconclude +forecondemn +foreconscious +foreconsent +foreconsider +forecontrive +forecool +forecooler +forecounsel +forecount +forecourse +forecourt +forecourts +forecover +forecovert +foreday +foredays +foredate +foredated +foredates +foredating +foredawn +foredeck +foredecks +foredeclare +foredecree +foredeem +foredeep +foredefeated +foredefine +foredenounce +foredescribe +foredeserved +foredesign +foredesignment +foredesk +foredestine +foredestined +foredestiny +foredestining +foredetermination +foredetermine +foredevised +foredevote +foredid +forediscern +foredispose +foredivine +foredo +foredoes +foredoing +foredone +foredoom +foredoomed +foredoomer +foredooming +foredooms +foredoor +foredune +foreface +forefaces +forefather +forefatherly +forefathers +forefault +forefeel +forefeeling +forefeelingly +forefeels +forefeet +forefelt +forefence +forefend +forefended +forefending +forefends +foreffelt +forefield +forefigure +forefin +forefinger +forefingers +forefit +foreflank +foreflap +foreflipper +forefoot +forefront +forefronts +foregahger +foregallery +foregame +foreganger +foregate +foregather +foregift +foregirth +foreglance +foregleam +foreglimpse +foreglimpsed +foreglow +forego +foregoer +foregoers +foregoes +foregoing +foregone +foregoneness +foreground +foregrounds +foreguess +foreguidance +foregut +foreguts +forehalf +forehall +forehammer +forehand +forehanded +forehandedly +forehandedness +forehands +forehandsel +forehard +forehatch +forehatchway +forehead +foreheaded +foreheads +forehear +forehearth +foreheater +forehent +forehew +forehill +forehinting +forehock +forehold +forehood +forehoof +forehoofs +forehook +forehooves +forehorse +foreyard +foreyards +foreyear +foreign +foreigneering +foreigner +foreigners +foreignership +foreignism +foreignization +foreignize +foreignly +foreignness +foreigns +foreimagination +foreimagine +foreimpressed +foreimpression +foreinclined +foreinstruct +foreintend +foreiron +forejudge +forejudged +forejudger +forejudging +forejudgment +forekeel +foreking +foreknee +foreknew +foreknow +foreknowable +foreknowableness +foreknower +foreknowing +foreknowingly +foreknowledge +foreknown +foreknows +forel +forelady +foreladies +forelay +forelaid +forelaying +foreland +forelands +foreleader +foreleech +foreleg +forelegs +forelimb +forelimbs +forelive +forellenstein +forelock +forelocks +forelook +foreloop +forelooper +foreloper +forelouper +foremade +foreman +foremanship +foremarch +foremark +foremartyr +foremast +foremasthand +foremastman +foremastmen +foremasts +foremean +foremeant +foremelt +foremen +foremention +forementioned +foremessenger +foremilk +foremilks +foremind +foremisgiving +foremistress +foremost +foremostly +foremother +forename +forenamed +forenames +forenent +forenews +forenight +forenoon +forenoons +forenote +forenoted +forenotice +forenotion +forensal +forensic +forensical +forensicality +forensically +forensics +foreordain +foreordained +foreordaining +foreordainment +foreordainments +foreordains +foreorder +foreordinate +foreordinated +foreordinating +foreordination +foreorlop +forepad +forepayment +forepale +forepaled +forepaling +foreparent +foreparents +forepart +foreparts +forepass +forepassed +forepast +forepaw +forepaws +forepeak +forepeaks +foreperiod +forepiece +foreplace +foreplay +foreplays +foreplan +foreplanting +forepleasure +foreplot +forepoint +forepointer +forepole +forepoled +forepoling +foreporch +forepossessed +forepost +forepredicament +forepreparation +foreprepare +forepretended +foreprise +foreprize +foreproduct +foreproffer +forepromise +forepromised +foreprovided +foreprovision +forepurpose +forequarter +forequarters +forequoted +forerake +foreran +forerank +foreranks +forereach +forereaching +foreread +forereading +forerecited +forereckon +forerehearsed +foreremembered +forereport +forerequest +forerevelation +forerib +foreribs +forerigging +foreright +foreroyal +foreroom +forerun +forerunner +forerunners +forerunnership +forerunning +forerunnings +foreruns +fores +foresaddle +foresay +foresaid +foresaying +foresail +foresails +foresays +foresaw +forescene +forescent +foreschool +foreschooling +forescript +foreseason +foreseat +foresee +foreseeability +foreseeable +foreseeing +foreseeingly +foreseen +foreseer +foreseers +foresees +foresey +foreseing +foreseize +foresend +foresense +foresentence +foreset +foresettle +foresettled +foreshadow +foreshadowed +foreshadower +foreshadowing +foreshadows +foreshaft +foreshank +foreshape +foresheet +foresheets +foreshift +foreship +foreshock +foreshoe +foreshop +foreshore +foreshorten +foreshortened +foreshortening +foreshortens +foreshot +foreshots +foreshoulder +foreshow +foreshowed +foreshower +foreshowing +foreshown +foreshows +foreshroud +foreside +foresides +foresight +foresighted +foresightedly +foresightedness +foresightful +foresightless +foresights +foresign +foresignify +foresin +foresing +foresinger +foreskin +foreskins +foreskirt +foreslack +foresleeve +foreslow +foresound +forespake +forespeak +forespeaker +forespeaking +forespecified +forespeech +forespeed +forespencer +forespent +forespoke +forespoken +forest +forestaff +forestaffs +forestage +forestay +forestair +forestays +forestaysail +forestal +forestall +forestalled +forestaller +forestalling +forestallment +forestalls +forestalment +forestarling +forestate +forestation +forestaves +forestcraft +forested +foresteep +forestem +forestep +forester +forestery +foresters +forestership +forestful +foresty +forestial +forestian +forestick +forestiera +forestine +foresting +forestish +forestland +forestless +forestlike +forestology +forestral +forestress +forestry +forestries +forests +forestside +forestudy +forestwards +foresummer +foresummon +foreswear +foreswearing +foresweat +foreswore +foresworn +foret +foretack +foretackle +foretake +foretalk +foretalking +foretaste +foretasted +foretaster +foretastes +foretasting +foreteach +foreteeth +foretell +foretellable +foretellableness +foreteller +foretellers +foretelling +foretells +forethink +forethinker +forethinking +forethough +forethought +forethoughted +forethoughtful +forethoughtfully +forethoughtfulness +forethoughtless +forethrift +foretime +foretimed +foretimes +foretype +foretypified +foretoken +foretokened +foretokening +foretokens +foretold +foretooth +foretop +foretopman +foretopmast +foretopmen +foretops +foretopsail +foretrace +foretriangle +foretrysail +foreturn +foreuse +foreutter +forevalue +forever +forevermore +foreverness +forevers +foreview +forevision +forevouch +forevouched +forevow +foreward +forewarm +forewarmer +forewarn +forewarned +forewarner +forewarning +forewarningly +forewarnings +forewarns +forewaters +foreween +foreweep +foreweigh +forewent +forewind +forewing +forewings +forewinning +forewisdom +forewish +forewit +forewoman +forewomen +forewonted +foreword +forewords +foreworld +foreworn +forewritten +forewrought +forex +forfairn +forfalt +forfar +forfare +forfars +forfault +forfaulture +forfear +forfeit +forfeitable +forfeitableness +forfeited +forfeiter +forfeiting +forfeits +forfeiture +forfeitures +forfend +forfended +forfending +forfends +forfex +forficate +forficated +forfication +forficiform +forficula +forficulate +forficulidae +forfit +forfouchten +forfoughen +forfoughten +forgab +forgainst +forgat +forgather +forgathered +forgathering +forgathers +forgave +forge +forgeability +forgeable +forged +forgedly +forgeful +forgeman +forgemen +forger +forgery +forgeries +forgers +forges +forget +forgetable +forgetful +forgetfully +forgetfulness +forgetive +forgetness +forgets +forgett +forgettable +forgettably +forgette +forgetter +forgettery +forgetters +forgetting +forgettingly +forgie +forgift +forging +forgings +forgivable +forgivableness +forgivably +forgive +forgiveable +forgiveably +forgiveless +forgiven +forgiveness +forgivenesses +forgiver +forgivers +forgives +forgiving +forgivingly +forgivingness +forgo +forgoer +forgoers +forgoes +forgoing +forgone +forgot +forgotten +forgottenness +forgrow +forgrown +forhaile +forhale +forheed +forhoo +forhooy +forhooie +forhow +foryield +forinsec +forinsecal +forint +forints +forisfamiliate +forisfamiliation +forjaskit +forjesket +forjudge +forjudged +forjudger +forjudges +forjudging +forjudgment +fork +forkable +forkbeard +forked +forkedly +forkedness +forker +forkers +forkful +forkfuls +forkhead +forky +forkier +forkiest +forkiness +forking +forkless +forklift +forklifts +forklike +forkman +forkmen +forks +forksful +forksmith +forktail +forkwise +forlay +forlain +forlana +forlanas +forlane +forleave +forleaving +forleft +forleit +forlese +forlet +forletting +forlie +forlive +forloin +forlore +forlorn +forlorner +forlornest +forlornity +forlornly +forlornness +form +forma +formability +formable +formably +formagen +formagenic +formal +formalazine +formaldehyd +formaldehyde +formaldehydesulphoxylate +formaldehydesulphoxylic +formaldoxime +formalesque +formalin +formalins +formalisation +formalise +formalised +formaliser +formalising +formalism +formalisms +formalist +formalistic +formalistically +formaliter +formalith +formality +formalities +formalizable +formalization +formalizations +formalize +formalized +formalizer +formalizes +formalizing +formally +formalness +formals +formamide +formamidine +formamido +formamidoxime +formanilide +formant +formants +format +formate +formated +formates +formating +formation +formational +formations +formative +formatively +formativeness +formats +formatted +formatter +formatters +formatting +formature +formazan +formazyl +formby +formboard +forme +formed +formedon +formee +formel +formelt +formene +formenic +formentation +former +formeret +formerly +formerness +formers +formes +formfeed +formfeeds +formfitting +formful +formy +formiate +formic +formica +formican +formicary +formicaria +formicariae +formicarian +formicaries +formicariidae +formicarioid +formicarium +formicaroid +formicate +formicated +formicating +formication +formicative +formicicide +formicid +formicidae +formicide +formicina +formicinae +formicine +formicivora +formicivorous +formicoidea +formidability +formidable +formidableness +formidably +formidolous +formyl +formylal +formylate +formylated +formylating +formylation +formyls +formin +forminate +forming +formism +formity +formless +formlessly +formlessness +formly +formnail +formol +formolit +formolite +formols +formonitrile +formosan +formose +formosity +formous +formoxime +forms +formula +formulable +formulae +formulaic +formulaically +formular +formulary +formularies +formularisation +formularise +formularised +formulariser +formularising +formularism +formularist +formularistic +formularization +formularize +formularized +formularizer +formularizing +formulas +formulate +formulated +formulates +formulating +formulation +formulations +formulator +formulatory +formulators +formule +formulisation +formulise +formulised +formuliser +formulising +formulism +formulist +formulistic +formulization +formulize +formulized +formulizer +formulizing +formwork +fornacic +fornax +fornaxid +forncast +fornenst +fornent +fornical +fornicate +fornicated +fornicates +fornicating +fornication +fornications +fornicator +fornicatory +fornicators +fornicatress +fornicatrices +fornicatrix +fornices +forniciform +forninst +fornix +forold +forpass +forpet +forpine +forpined +forpining +forpit +forprise +forra +forrad +forrader +forrard +forrarder +forrel +forride +forril +forrit +forritsome +forrue +forsado +forsay +forsake +forsaken +forsakenly +forsakenness +forsaker +forsakers +forsakes +forsaking +forsar +forsee +forseeable +forseek +forseen +forset +forshape +forsythia +forsythias +forslack +forslake +forsloth +forslow +forsook +forsooth +forspeak +forspeaking +forspend +forspent +forspoke +forspoken +forspread +forst +forstall +forstand +forsteal +forsterite +forstraught +forsung +forswat +forswear +forswearer +forswearing +forswears +forswore +forsworn +forswornness +fort +fortake +fortalice +fortaxed +forte +fortemente +fortepiano +fortes +fortescue +fortescure +forth +forthby +forthbring +forthbringer +forthbringing +forthbrought +forthcall +forthcame +forthcome +forthcomer +forthcoming +forthcomingness +forthcut +forthfare +forthfigured +forthgaze +forthgo +forthgoing +forthy +forthink +forthinking +forthon +forthought +forthputting +forthright +forthrightly +forthrightness +forthrights +forthset +forthtell +forthteller +forthward +forthwith +forty +fortier +forties +fortieth +fortieths +fortify +fortifiable +fortification +fortifications +fortified +fortifier +fortifiers +fortifies +fortifying +fortifyingly +fortifys +fortyfive +fortyfives +fortyfold +fortyish +fortilage +fortin +fortiori +fortypenny +fortis +fortissimi +fortissimo +fortissimos +fortitude +fortitudes +fortitudinous +fortlet +fortnight +fortnightly +fortnightlies +fortnights +fortran +fortranh +fortravail +fortread +fortress +fortressed +fortresses +fortressing +forts +fortuity +fortuities +fortuitism +fortuitist +fortuitous +fortuitously +fortuitousness +fortuitus +fortunate +fortunately +fortunateness +fortunation +fortune +fortuned +fortunel +fortuneless +fortunella +fortunes +fortunetell +fortuneteller +fortunetellers +fortunetelling +fortuning +fortunite +fortunize +fortunous +fortuuned +forum +forumize +forums +forvay +forwake +forwaked +forwalk +forwander +forward +forwardal +forwardation +forwarded +forwarder +forwarders +forwardest +forwarding +forwardly +forwardness +forwards +forwardsearch +forwarn +forwaste +forwean +forwear +forweary +forwearied +forwearying +forweend +forweep +forwelk +forwent +forwhy +forwoden +forworden +forwore +forwork +forworn +forwrap +forz +forzando +forzandos +forzato +fosh +fosie +fosite +foss +fossa +fossae +fossage +fossane +fossarian +fossate +fosse +fossed +fosses +fosset +fossette +fossettes +fossick +fossicked +fossicker +fossicking +fossicks +fossified +fossiform +fossil +fossilage +fossilated +fossilation +fossildom +fossiled +fossiliferous +fossilify +fossilification +fossilisable +fossilisation +fossilise +fossilised +fossilising +fossilism +fossilist +fossilizable +fossilization +fossilize +fossilized +fossilizes +fossilizing +fossillike +fossilogy +fossilogist +fossilology +fossilological +fossilologist +fossils +fosslfying +fosslify +fosslology +fossor +fossores +fossoria +fossorial +fossorious +fossors +fossula +fossulae +fossulate +fossule +fossulet +fostell +foster +fosterable +fosterage +fostered +fosterer +fosterers +fosterhood +fostering +fosteringly +fosterite +fosterland +fosterling +fosterlings +fosters +fostership +fostress +fot +fotch +fotched +fother +fothergilla +fothering +fotive +fotmal +fotui +fou +foud +foudroyant +fouett +fouette +fouettee +fouettes +fougade +fougasse +fought +foughten +foughty +fougue +foujdar +foujdary +foujdarry +foul +foulage +foulard +foulards +foulbrood +foulder +fouldre +fouled +fouler +foulest +fouling +foulings +foulish +foully +foulmart +foulminded +foulmouth +foulmouthed +foulmouthedly +foulmouthedness +foulness +foulnesses +fouls +foulsome +foumart +foun +founce +found +foundation +foundational +foundationally +foundationary +foundationed +foundationer +foundationless +foundationlessness +foundations +founded +founder +foundered +foundery +foundering +founderous +founders +foundership +founding +foundling +foundlings +foundress +foundry +foundries +foundryman +foundrymen +foundrous +founds +fount +fountain +fountained +fountaineer +fountainhead +fountainheads +fountaining +fountainless +fountainlet +fountainlike +fountainous +fountainously +fountains +fountainwise +founte +fountful +founts +fouquieria +fouquieriaceae +fouquieriaceous +four +fourb +fourbagger +fourball +fourberie +fourble +fourche +fourchee +fourcher +fourchet +fourchette +fourchite +fourdrinier +fourer +fourfiusher +fourflusher +fourflushers +fourfold +fourgon +fourgons +fourhanded +fourier +fourierian +fourierism +fourierist +fourieristic +fourierite +fourling +fourneau +fourness +fourniture +fourpence +fourpenny +fourposter +fourposters +fourpounder +fourquine +fourrag +fourragere +fourrageres +fourre +fourrier +fours +fourscore +fourscorth +foursome +foursomes +foursquare +foursquarely +foursquareness +fourstrand +fourteen +fourteener +fourteenfold +fourteens +fourteenth +fourteenthly +fourteenths +fourth +fourther +fourthly +fourths +foussa +foute +fouter +fouth +fouty +foutra +foutre +fovea +foveae +foveal +foveate +foveated +foveation +foveiform +fovent +foveola +foveolae +foveolar +foveolarious +foveolas +foveolate +foveolated +foveole +foveoles +foveolet +foveolets +fovilla +fow +fowage +fowells +fowent +fowk +fowl +fowled +fowler +fowlery +fowlerite +fowlers +fowlfoot +fowling +fowlings +fowlpox +fowlpoxes +fowls +fox +foxbane +foxberry +foxberries +foxchop +foxed +foxer +foxery +foxes +foxfeet +foxfinger +foxfire +foxfires +foxfish +foxfishes +foxglove +foxgloves +foxhole +foxholes +foxhound +foxhounds +foxy +foxie +foxier +foxiest +foxily +foxiness +foxinesses +foxing +foxings +foxish +foxite +foxly +foxlike +foxproof +foxship +foxskin +foxskins +foxtail +foxtailed +foxtails +foxtongue +foxtrot +foxwood +fozy +fozier +foziest +foziness +fozinesses +fp +fplot +fpm +fps +fpsps +fr +fra +frab +frabbit +frabjous +frabjously +frabous +fracas +fracases +fracedinous +frache +fracid +frack +fract +fractable +fractabling +fractal +fractals +fracted +fracticipita +fractile +fraction +fractional +fractionalism +fractionalization +fractionalize +fractionalized +fractionalizing +fractionally +fractionary +fractionate +fractionated +fractionating +fractionation +fractionator +fractioned +fractioning +fractionisation +fractionise +fractionised +fractionising +fractionization +fractionize +fractionized +fractionizing +fractionlet +fractions +fractious +fractiously +fractiousness +fractocumulus +fractonimbus +fractostratus +fractuosity +fractur +fracturable +fracturableness +fractural +fracture +fractured +fractureproof +fractures +fracturing +fracturs +fractus +fradicin +frae +fraela +fraena +fraenula +fraenular +fraenulum +fraenum +fraenums +frag +fragaria +fragged +fragging +fraggings +fraghan +fragilaria +fragilariaceae +fragile +fragilely +fragileness +fragility +fragilities +fragment +fragmental +fragmentalize +fragmentally +fragmentary +fragmentarily +fragmentariness +fragmentate +fragmentation +fragmented +fragmenting +fragmentisation +fragmentise +fragmentised +fragmentising +fragmentist +fragmentitious +fragmentization +fragmentize +fragmentized +fragmentizer +fragmentizing +fragments +fragor +fragrance +fragrances +fragrancy +fragrancies +fragrant +fragrantly +fragrantness +frags +fray +fraicheur +fraid +fraidycat +frayed +frayedly +frayedness +fraying +frayings +fraik +frail +fraile +frailejon +frailer +frailero +fraileros +frailes +frailest +frailish +frailly +frailness +frails +frailty +frailties +frayn +frayne +frayproof +frays +fraischeur +fraise +fraised +fraiser +fraises +fraising +fraist +fraken +frakfurt +fraktur +frakturs +fram +framable +framableness +frambesia +framboesia +framboise +frame +framea +frameable +frameableness +frameae +framed +frameless +framer +framers +frames +frameshift +framesmith +framework +frameworks +framing +frammit +frampler +frampold +franc +franca +francas +france +frances +franchisal +franchise +franchised +franchisee +franchisees +franchisement +franchiser +franchisers +franchises +franchising +franchisor +francia +francic +francis +francisc +francisca +franciscan +franciscanism +franciscans +francisco +francium +franciums +francize +franco +francois +francolin +francolite +francomania +franconian +francophil +francophile +francophilism +francophobe +francophobia +francophone +francs +frangent +franger +frangi +frangibility +frangible +frangibleness +frangipane +frangipani +frangipanis +frangipanni +frangula +frangulaceae +frangulic +frangulin +frangulinic +franion +frank +frankability +frankable +frankalmoign +frankalmoigne +frankalmoin +franked +frankenia +frankeniaceae +frankeniaceous +frankenstein +frankensteins +franker +frankers +frankest +frankfold +frankfort +frankforter +frankfurt +frankfurter +frankfurters +frankhearted +frankheartedly +frankheartedness +frankheartness +frankify +frankincense +frankincensed +franking +frankish +frankist +franklandite +frankly +franklin +franklinia +franklinian +frankliniana +franklinic +franklinism +franklinist +franklinite +franklinization +franklins +frankmarriage +frankness +frankpledge +franks +franseria +frantic +frantically +franticly +franticness +franz +franzy +frap +frape +fraple +frapler +frapp +frappe +frapped +frappeed +frappeing +frappes +frapping +fraps +frary +frasco +frase +fraser +frasera +frasier +frass +frasse +frat +fratch +fratched +fratcheous +fratcher +fratchety +fratchy +fratching +frate +frater +fratercula +fratery +frateries +fraternal +fraternalism +fraternalist +fraternality +fraternally +fraternate +fraternation +fraternisation +fraternise +fraternised +fraterniser +fraternising +fraternism +fraternity +fraternities +fraternization +fraternize +fraternized +fraternizer +fraternizes +fraternizing +fraters +fraticelli +fraticellian +fratority +fratry +fratriage +fratricelli +fratricidal +fratricide +fratricides +fratries +frats +frau +fraud +frauder +fraudful +fraudfully +fraudless +fraudlessly +fraudlessness +fraudproof +frauds +fraudulence +fraudulency +fraudulent +fraudulently +fraudulentness +frauen +fraughan +fraught +fraughtage +fraughted +fraughting +fraughts +fraulein +frauleins +fraunch +fraus +fravashi +frawn +fraxetin +fraxin +fraxinella +fraxinus +fraze +frazed +frazer +frazil +frazing +frazzle +frazzled +frazzles +frazzling +frden +freak +freakdom +freaked +freakery +freakful +freaky +freakier +freakiest +freakily +freakiness +freaking +freakish +freakishly +freakishness +freakout +freakouts +freakpot +freaks +fream +freath +freck +frecked +frecken +freckened +frecket +freckle +freckled +freckledness +freckleproof +freckles +freckly +frecklier +freckliest +freckliness +freckling +frecklish +fred +fredaine +freddy +freddie +freddo +frederic +frederica +frederick +frederik +fredricite +free +freebee +freebees +freeby +freebie +freebies +freeboard +freeboot +freebooted +freebooter +freebootery +freebooters +freebooty +freebooting +freeboots +freeborn +freechurchism +freed +freedman +freedmen +freedom +freedoms +freedoot +freedstool +freedwoman +freedwomen +freefd +freeform +freehand +freehanded +freehandedly +freehandedness +freehearted +freeheartedly +freeheartedness +freehold +freeholder +freeholders +freeholdership +freeholding +freeholds +freeing +freeings +freeish +freekirker +freelage +freelance +freelanced +freelancer +freelances +freelancing +freely +freeload +freeloaded +freeloader +freeloaders +freeloading +freeloads +freeloving +freelovism +freeman +freemanship +freemartin +freemason +freemasonic +freemasonical +freemasonism +freemasonry +freemasons +freemen +freen +freend +freeness +freenesses +freeport +freer +freers +frees +freesheet +freesia +freesias +freesilverism +freesilverite +freesp +freespac +freespace +freest +freestanding +freestyle +freestyler +freestone +freestones +freet +freethink +freethinker +freethinkers +freethinking +freety +freetrader +freeway +freeways +freeward +freewheel +freewheeler +freewheelers +freewheeling +freewheelingness +freewill +freewoman +freewomen +freezable +freeze +freezed +freezer +freezers +freezes +freezy +freezing +freezingly +fregata +fregatae +fregatidae +fregit +frey +freya +freyalite +freibergite +freycinetia +freieslebenite +freiezlebenhe +freight +freightage +freighted +freighter +freighters +freightyard +freighting +freightless +freightliner +freightment +freights +freyja +freijo +freinage +freir +freyr +freit +freith +freity +fremd +fremdly +fremdness +fremescence +fremescent +fremitus +fremituses +fremontia +fremontodendron +fremt +fren +frena +frenal +frenatae +frenate +french +frenched +frenchen +frenches +frenchy +frenchify +frenchification +frenchily +frenchiness +frenching +frenchism +frenchize +frenchless +frenchly +frenchman +frenchmen +frenchness +frenchwise +frenchwoman +frenchwomen +frenetic +frenetical +frenetically +frenetics +frenghi +frenne +frenula +frenular +frenulum +frenum +frenums +frenuna +frenzelite +frenzy +frenzic +frenzied +frenziedly +frenziedness +frenzies +frenzying +frenzily +freon +freq +frequence +frequency +frequencies +frequent +frequentable +frequentage +frequentation +frequentative +frequented +frequenter +frequenters +frequentest +frequenting +frequently +frequentness +frequents +frere +freres +frescade +fresco +frescoed +frescoer +frescoers +frescoes +frescoing +frescoist +frescoists +frescos +fresh +freshed +freshen +freshened +freshener +fresheners +freshening +freshens +fresher +freshes +freshest +freshet +freshets +freshhearted +freshing +freshish +freshly +freshman +freshmanhood +freshmanic +freshmanship +freshmen +freshment +freshness +freshwater +freshwoman +fresison +fresne +fresnel +fresnels +fresno +fress +fresser +fret +fretful +fretfully +fretfulness +fretish +fretize +fretless +frets +fretsaw +fretsaws +fretsome +frett +frettage +frettation +frette +fretted +fretten +fretter +fretters +fretty +frettier +frettiest +fretting +frettingly +fretum +fretways +fretwise +fretwork +fretworked +fretworks +freud +freudian +freudianism +freudians +freudism +freudist +fry +friability +friable +friableness +friand +friandise +friar +friarbird +friarhood +friary +friaries +friarly +friarling +friars +friation +frib +fribby +fribble +fribbled +fribbleism +fribbler +fribblery +fribblers +fribbles +fribbling +fribblish +friborg +friborgh +fribourg +fricace +fricandeau +fricandeaus +fricandeaux +fricandel +fricandelle +fricando +fricandoes +fricassee +fricasseed +fricasseeing +fricassees +fricasseing +frication +fricative +fricatives +fricatrice +frickle +fricti +friction +frictionable +frictional +frictionally +frictionize +frictionized +frictionizing +frictionless +frictionlessly +frictionlessness +frictionproof +frictions +friday +fridays +fridge +fridges +fridila +fridstool +fried +frieda +friedcake +friedelite +friedman +friedrichsdor +friend +friended +friending +friendless +friendlessness +friendly +friendlier +friendlies +friendliest +friendlike +friendlily +friendliness +friendliwise +friends +friendship +friendships +frier +fryer +friers +fryers +fries +friese +frieseite +friesian +friesic +friesish +frieze +friezed +friezer +friezes +friezy +friezing +frig +frigage +frigate +frigates +frigatoon +frigefact +frigga +frigged +frigger +frigging +friggle +fright +frightable +frighted +frighten +frightenable +frightened +frightenedly +frightenedness +frightener +frightening +frighteningly +frighteningness +frightens +frighter +frightful +frightfully +frightfulness +frighty +frighting +frightless +frightment +frights +frightsome +frigid +frigidaire +frigidaria +frigidarium +frigiddaria +frigidity +frigidities +frigidly +frigidness +frigidoreceptor +frigiferous +frigolabile +frigor +frigoric +frigorify +frigorific +frigorifical +frigorifico +frigorimeter +frigostable +frigotherapy +frigs +frying +frija +frijol +frijole +frijoles +frijolillo +frijolito +frike +frilal +frill +frillback +frilled +friller +frillery +frillers +frilly +frillier +frillies +frilliest +frillily +frilliness +frilling +frillings +frills +frim +frimaire +frimitts +fringe +fringed +fringeflower +fringefoot +fringehead +fringeless +fringelet +fringelike +fringent +fringepod +fringes +fringetail +fringy +fringier +fringiest +fringilla +fringillaceous +fringillid +fringillidae +fringilliform +fringilliformes +fringilline +fringilloid +fringiness +fringing +frypan +frypans +friponerie +fripper +fripperer +frippery +fripperies +frippet +fris +frisado +frisbee +frisbees +frisca +friscal +frisch +frisco +frise +frises +frisesomorum +frisette +frisettes +friseur +friseurs +frisian +frisii +frisk +frisked +frisker +friskers +friskest +frisket +friskets +friskful +frisky +friskier +friskiest +friskily +friskin +friskiness +frisking +friskingly +friskle +frisks +frislet +frisolee +frison +friss +frisson +frissons +frist +frisure +friszka +frit +frith +frithborgh +frithborh +frithbot +frithy +frithles +friths +frithsoken +frithstool +frithwork +fritillary +fritillaria +fritillaries +fritniency +frits +fritt +frittata +fritted +fritter +frittered +fritterer +fritterers +frittering +fritters +fritting +fritts +fritz +friulian +frivol +frivoled +frivoler +frivolers +frivoling +frivolism +frivolist +frivolity +frivolities +frivolize +frivolized +frivolizing +frivolled +frivoller +frivolling +frivolous +frivolously +frivolousness +frivols +frixion +friz +frizado +frize +frized +frizel +frizer +frizers +frizes +frizette +frizettes +frizing +frizz +frizzante +frizzed +frizzen +frizzer +frizzers +frizzes +frizzy +frizzier +frizziest +frizzily +frizziness +frizzing +frizzle +frizzled +frizzler +frizzlers +frizzles +frizzly +frizzlier +frizzliest +frizzling +fro +frock +frocked +frocking +frockless +frocklike +frockmaker +frocks +froe +froebelian +froebelism +froebelist +froeman +froes +frog +frogbit +frogeater +frogeye +frogeyed +frogeyes +frogface +frogfish +frogfishes +frogflower +frogfoot +frogged +frogger +froggery +froggy +froggier +froggies +froggiest +frogginess +frogging +froggish +froghood +froghopper +frogland +frogleaf +frogleg +froglet +froglets +froglike +frogling +frogman +frogmarch +frogmen +frogmouth +frogmouths +frognose +frogs +frogskin +frogskins +frogspawn +frogstool +frogtongue +frogwort +frohlich +froideur +froise +froisse +frokin +frolic +frolicful +frolicked +frolicker +frolickers +frolicky +frolicking +frolickly +frolicks +frolicly +frolicness +frolics +frolicsome +frolicsomely +frolicsomeness +from +fromage +fromages +fromenty +fromenties +fromfile +fromward +fromwards +frond +frondage +frondation +fronde +fronded +frondent +frondesce +frondesced +frondescence +frondescent +frondescing +frondeur +frondeurs +frondiferous +frondiform +frondigerous +frondivorous +frondless +frondlet +frondose +frondosely +frondous +fronds +frons +front +frontad +frontage +frontager +frontages +frontal +frontalis +frontality +frontally +frontals +frontate +frontbencher +frontcourt +fronted +frontenis +fronter +frontes +frontier +frontierless +frontierlike +frontierman +frontiers +frontiersman +frontiersmen +frontignac +frontignan +fronting +frontingly +frontirostria +frontis +frontispiece +frontispieced +frontispieces +frontispiecing +frontlash +frontless +frontlessly +frontlessness +frontlet +frontlets +frontoauricular +frontoethmoid +frontogenesis +frontolysis +frontomalar +frontomallar +frontomaxillary +frontomental +fronton +frontonasal +frontons +frontooccipital +frontoorbital +frontoparietal +frontopontine +frontosphenoidal +frontosquamosal +frontotemporal +frontozygomatic +frontpiece +frontrunner +fronts +frontsman +frontspiece +frontspieces +frontstall +fronture +frontways +frontward +frontwards +frontwise +froom +froppish +frore +froren +frory +frosh +frosk +frost +frostation +frostbird +frostbit +frostbite +frostbiter +frostbites +frostbiting +frostbitten +frostbound +frostbow +frosted +frosteds +froster +frostfish +frostfishes +frostflower +frosty +frostier +frostiest +frostily +frostiness +frosting +frostings +frostless +frostlike +frostnipped +frostproof +frostproofing +frostroot +frosts +frostweed +frostwork +frostwort +frot +froth +frothed +frother +frothi +frothy +frothier +frothiest +frothily +frothiness +frothing +frothless +froths +frothsome +frottage +frottages +frotted +frotteur +frotteurs +frotting +frottola +frottole +frotton +froufrou +froufrous +frough +froughy +frounce +frounced +frounceless +frounces +frouncing +frousy +frousier +frousiest +froust +frousty +frouze +frouzy +frouzier +frouziest +frow +froward +frowardly +frowardness +frower +frowy +frowl +frown +frowned +frowner +frowners +frownful +frowny +frowning +frowningly +frownless +frowns +frows +frowsy +frowsier +frowsiest +frowsily +frowsiness +frowst +frowsty +frowstier +frowstiest +frowstily +frowstiness +frowze +frowzy +frowzier +frowziest +frowzily +frowziness +frowzled +frowzly +froze +frozen +frozenhearted +frozenly +frozenness +frs +frsiket +frsikets +frt +frubbish +fruchtschiefer +fructed +fructescence +fructescent +fructiculose +fructicultural +fructiculture +fructidor +fructiferous +fructiferously +fructiferousness +fructify +fructification +fructificative +fructified +fructifier +fructifies +fructifying +fructiform +fructiparous +fructivorous +fructokinase +fructosan +fructose +fructoses +fructoside +fructuary +fructuarius +fructuate +fructuose +fructuosity +fructuous +fructuously +fructuousness +fructure +fructus +frug +frugal +frugalism +frugalist +frugality +frugalities +frugally +frugalness +fruggan +frugged +fruggin +frugging +frugiferous +frugiferousness +frugivora +frugivorous +frugs +fruit +fruitade +fruitage +fruitages +fruitarian +fruitarianism +fruitbearing +fruitcake +fruitcakey +fruitcakes +fruited +fruiter +fruiterer +fruiterers +fruiteress +fruitery +fruiteries +fruiters +fruitester +fruitful +fruitfuller +fruitfullest +fruitfully +fruitfullness +fruitfulness +fruitgrower +fruitgrowing +fruity +fruitier +fruitiest +fruitiness +fruiting +fruition +fruitions +fruitist +fruitive +fruitless +fruitlessly +fruitlessness +fruitlet +fruitlets +fruitlike +fruitling +fruits +fruitstalk +fruittime +fruitwise +fruitwoman +fruitwomen +fruitwood +fruitworm +frumaryl +frument +frumentaceous +frumentarious +frumentation +frumenty +frumenties +frumentum +frumety +frump +frumpery +frumperies +frumpy +frumpier +frumpiest +frumpily +frumpiness +frumpish +frumpishly +frumpishness +frumple +frumpled +frumpling +frumps +frundel +frush +frusla +frust +frusta +frustrable +frustraneous +frustrate +frustrated +frustrately +frustrater +frustrates +frustrating +frustratingly +frustration +frustrations +frustrative +frustratory +frustula +frustule +frustulent +frustules +frustulose +frustulum +frustum +frustums +frutage +frutescence +frutescent +frutex +fruticant +fruticeous +frutices +fruticeta +fruticetum +fruticose +fruticous +fruticulose +fruticulture +frutify +frutilla +fruz +frwy +fs +fsiest +fstore +ft +fth +fthm +ftncmd +ftnerr +fu +fuage +fub +fubbed +fubbery +fubby +fubbing +fubs +fubsy +fubsier +fubsiest +fucaceae +fucaceous +fucales +fucate +fucation +fucatious +fuchi +fuchsia +fuchsian +fuchsias +fuchsin +fuchsine +fuchsines +fuchsinophil +fuchsinophilous +fuchsins +fuchsite +fuchsone +fuci +fucinita +fuciphagous +fucivorous +fuck +fucked +fucker +fucking +fucks +fuckwit +fucoid +fucoidal +fucoideae +fucoidin +fucoids +fucosan +fucose +fucoses +fucous +fucoxanthin +fucoxanthine +fucus +fucused +fucuses +fud +fudder +fuddle +fuddlebrained +fuddled +fuddledness +fuddlement +fuddler +fuddles +fuddling +fuder +fudge +fudged +fudger +fudges +fudgy +fudging +fuds +fuegian +fuehrer +fuehrers +fuel +fueled +fueler +fuelers +fueling +fuelizer +fuelled +fueller +fuellers +fuelling +fuels +fuerte +fuff +fuffy +fuffit +fuffle +fug +fugacy +fugacious +fugaciously +fugaciousness +fugacity +fugacities +fugal +fugally +fugara +fugard +fugate +fugato +fugatos +fugged +fuggy +fuggier +fuggiest +fugging +fughetta +fughettas +fughette +fugie +fugient +fugio +fugios +fugit +fugitate +fugitated +fugitating +fugitation +fugitive +fugitively +fugitiveness +fugitives +fugitivism +fugitivity +fugle +fugled +fugleman +fuglemanship +fuglemen +fugler +fugles +fugling +fugs +fugu +fugue +fugued +fuguelike +fugues +fuguing +fuguist +fuguists +fuhrer +fuhrers +fuidhir +fuye +fuirdays +fuirena +fuji +fujis +fula +fulah +fulani +fulciform +fulciment +fulcra +fulcraceous +fulcral +fulcrate +fulcrum +fulcrumage +fulcrumed +fulcruming +fulcrums +fulfil +fulfill +fulfilled +fulfiller +fulfillers +fulfilling +fulfillment +fulfillments +fulfills +fulfilment +fulfils +fulful +fulfulde +fulfullment +fulgence +fulgency +fulgent +fulgently +fulgentness +fulgid +fulgide +fulgidity +fulgor +fulgora +fulgorid +fulgoridae +fulgoroidea +fulgorous +fulgour +fulgourous +fulgur +fulgural +fulgurant +fulgurantly +fulgurata +fulgurate +fulgurated +fulgurating +fulguration +fulgurator +fulgurite +fulgurous +fulham +fulhams +fulica +fulicinae +fulicine +fuliginosity +fuliginous +fuliginously +fuliginousness +fuligo +fuligula +fuligulinae +fuliguline +fulyie +fulimart +fulk +full +fullage +fullam +fullams +fullback +fullbacks +fullbodied +fulldo +fulled +fuller +fullerboard +fullered +fullery +fulleries +fullering +fullers +fullest +fullface +fullfaces +fullfil +fullgrownness +fullhearted +fully +fullymart +fulling +fullish +fullmouth +fullmouthed +fullmouthedly +fullness +fullnesses +fullom +fullonian +fulls +fullterm +fulltime +fullword +fullwords +fulmar +fulmars +fulmarus +fulmen +fulmicotton +fulmina +fulminancy +fulminant +fulminate +fulminated +fulminates +fulminating +fulmination +fulminations +fulminator +fulminatory +fulmine +fulmined +fulmineous +fulmines +fulminic +fulmining +fulminous +fulminurate +fulminuric +fulness +fulnesses +fulsamic +fulsome +fulsomely +fulsomeness +fulth +fultz +fulup +fulvene +fulvescent +fulvid +fulvidness +fulvous +fulwa +fulzie +fum +fumacious +fumade +fumado +fumados +fumage +fumagine +fumago +fumant +fumarase +fumarases +fumarate +fumarates +fumaria +fumariaceae +fumariaceous +fumaric +fumaryl +fumarin +fumarine +fumarium +fumaroid +fumaroidal +fumarole +fumaroles +fumarolic +fumatory +fumatoria +fumatories +fumatorium +fumatoriums +fumattoria +fumble +fumbled +fumbler +fumblers +fumbles +fumbling +fumblingly +fumblingness +fumbulator +fume +fumed +fumeless +fumelike +fumer +fumerel +fumeroot +fumers +fumes +fumet +fumets +fumette +fumettes +fumeuse +fumeuses +fumewort +fumy +fumid +fumidity +fumiduct +fumier +fumiest +fumiferana +fumiferous +fumify +fumigant +fumigants +fumigate +fumigated +fumigates +fumigating +fumigation +fumigations +fumigator +fumigatory +fumigatories +fumigatorium +fumigators +fumily +fuminess +fuming +fumingly +fumish +fumishing +fumishly +fumishness +fumistery +fumitory +fumitories +fummel +fummle +fumose +fumosity +fumous +fumously +fumuli +fumulus +fun +funambulant +funambulate +funambulated +funambulating +funambulation +funambulator +funambulatory +funambule +funambulic +funambulism +funambulist +funambulo +funambuloes +funaria +funariaceae +funariaceous +funbre +function +functional +functionalism +functionalist +functionalistic +functionality +functionalities +functionalize +functionalized +functionalizing +functionally +functionals +functionary +functionaries +functionarism +functionate +functionated +functionating +functionation +functioned +functioning +functionize +functionless +functionlessness +functionnaire +functions +functor +functorial +functors +functus +fund +fundable +fundal +fundament +fundamental +fundamentalism +fundamentalist +fundamentalistic +fundamentalists +fundamentality +fundamentally +fundamentalness +fundamentals +fundatorial +fundatrices +fundatrix +funded +funder +funders +fundholder +fundi +fundic +fundiform +funding +funditor +funditores +fundless +fundmonger +fundmongering +fundraise +fundraising +funds +funduck +fundulinae +funduline +fundulus +fundungi +fundus +funebre +funebrial +funebrious +funebrous +funeral +funeralize +funerally +funerals +funerary +funerate +funeration +funereal +funereality +funereally +funerealness +funest +funestal +funfair +funfairs +funfest +fungaceous +fungal +fungales +fungals +fungate +fungated +fungating +fungation +funge +fungi +fungia +fungian +fungibility +fungible +fungibles +fungic +fungicidal +fungicidally +fungicide +fungicides +fungicolous +fungid +fungiferous +fungify +fungiform +fungilliform +fungillus +fungin +fungistat +fungistatic +fungistatically +fungite +fungitoxic +fungitoxicity +fungivorous +fungo +fungoes +fungoid +fungoidal +fungoids +fungology +fungological +fungologist +fungose +fungosity +fungosities +fungous +fungus +fungused +funguses +fungusy +funguslike +funic +funicle +funicles +funicular +funiculars +funiculate +funicule +funiculi +funiculitis +funiculus +funiform +funiliform +funipendulous +funis +funje +funk +funked +funker +funkers +funky +funkia +funkias +funkier +funkiest +funkiness +funking +funks +funli +funmaker +funmaking +funned +funnel +funneled +funnelform +funneling +funnelled +funnellike +funnelling +funnels +funnelwise +funny +funnier +funnies +funniest +funnily +funnyman +funnymen +funniment +funniness +funning +funori +funorin +funs +funster +funt +funtumia +fur +furacana +furacious +furaciousness +furacity +fural +furaldehyde +furan +furandi +furane +furanes +furanoid +furanose +furanoses +furanoside +furans +furazan +furazane +furazolidone +furbearer +furbelow +furbelowed +furbelowing +furbelows +furbish +furbishable +furbished +furbisher +furbishes +furbishing +furbishment +furca +furcae +furcal +furcate +furcated +furcately +furcates +furcating +furcation +furcellaria +furcellate +furciferine +furciferous +furciform +furcilia +furcraea +furcraeas +furcula +furculae +furcular +furcule +furculum +furdel +furdle +furfooz +furfur +furfuraceous +furfuraceously +furfural +furfuralcohol +furfuraldehyde +furfurals +furfuramid +furfuramide +furfuran +furfurans +furfuration +furfures +furfuryl +furfurylidene +furfurine +furfuroid +furfurol +furfurole +furfurous +fury +furial +furiant +furibund +furicane +furied +furies +furify +furil +furyl +furile +furilic +furiosa +furiosity +furioso +furious +furiouser +furiousity +furiously +furiousness +furison +furivae +furl +furlable +furlan +furlana +furlanas +furlane +furled +furler +furlers +furless +furling +furlong +furlongs +furlough +furloughed +furloughing +furloughs +furls +furmente +furmenty +furmenties +furmety +furmeties +furmint +furmity +furmities +furnace +furnaced +furnacelike +furnaceman +furnacemen +furnacer +furnaces +furnacing +furnacite +furnage +furnariidae +furnariides +furnarius +furner +furniment +furnish +furnishable +furnished +furnisher +furnishes +furnishing +furnishings +furnishment +furnishness +furnit +furniture +furnitureless +furnitures +furoate +furodiazole +furoic +furoid +furoin +furole +furomethyl +furomonazole +furor +furore +furores +furors +furosemide +furphy +furred +furry +furrier +furriered +furriery +furrieries +furriers +furriest +furrily +furriner +furriners +furriness +furring +furrings +furrow +furrowed +furrower +furrowers +furrowy +furrowing +furrowless +furrowlike +furrows +furrure +furs +fursemide +furstone +further +furtherance +furtherances +furthered +furtherer +furtherest +furthering +furtherly +furthermore +furthermost +furthers +furthersome +furthest +furthy +furtive +furtively +furtiveness +furtum +furud +furuncle +furuncles +furuncular +furunculoid +furunculosis +furunculous +furunculus +furze +furzechat +furzed +furzeling +furzery +furzes +furzetop +furzy +furzier +furziest +fusain +fusains +fusarial +fusariose +fusariosis +fusarium +fusarole +fusate +fusc +fuscescent +fuscin +fuscohyaline +fuscous +fuse +fuseau +fuseboard +fused +fusee +fusees +fusel +fuselage +fuselages +fuseless +fuselike +fusels +fuseplug +fuses +fusetron +fusht +fusibility +fusible +fusibleness +fusibly +fusicladium +fusicoccum +fusiform +fusiformis +fusil +fusilade +fusiladed +fusilades +fusilading +fusile +fusileer +fusileers +fusilier +fusiliers +fusillade +fusilladed +fusillades +fusillading +fusilly +fusils +fusing +fusinist +fusinite +fusion +fusional +fusionism +fusionist +fusionless +fusions +fusk +fusobacteria +fusobacterium +fusobteria +fusoid +fuss +fussbudget +fussbudgety +fussbudgets +fussed +fusser +fussers +fusses +fussy +fussier +fussiest +fussify +fussification +fussily +fussiness +fussing +fussle +fussock +fusspot +fusspots +fust +fustanella +fustanelle +fustee +fuster +fusteric +fustet +fusty +fustian +fustianish +fustianist +fustianize +fustians +fustic +fustics +fustie +fustier +fustiest +fustigate +fustigated +fustigating +fustigation +fustigator +fustigatory +fustilarian +fustily +fustilugs +fustin +fustinella +fustiness +fustle +fustoc +fusula +fusulae +fusulas +fusulina +fusuma +fusure +fusus +fut +futchel +futchell +fute +futharc +futharcs +futhark +futharks +futhermore +futhorc +futhorcs +futhork +futhorks +futile +futiley +futilely +futileness +futilitarian +futilitarianism +futility +futilities +futilize +futilous +futtah +futter +futteret +futtermassel +futtock +futtocks +futurable +futural +futurama +futuramic +future +futureless +futurely +futureness +futures +futuric +futurism +futurisms +futurist +futuristic +futuristically +futurists +futurity +futurities +futurition +futurize +futuro +futurology +futurologist +futurologists +futwa +fuze +fuzed +fuzee +fuzees +fuzes +fuzil +fuzils +fuzing +fuzz +fuzzball +fuzzed +fuzzes +fuzzy +fuzzier +fuzziest +fuzzily +fuzzines +fuzziness +fuzzing +fuzzle +fuzztail +fv +fw +fwd +fwelling +fz +g +ga +gaatch +gab +gabardine +gabardines +gabari +gabarit +gabback +gabbai +gabbais +gabbard +gabbards +gabbart +gabbarts +gabbed +gabber +gabbers +gabby +gabbier +gabbiest +gabbiness +gabbing +gabble +gabbled +gabblement +gabbler +gabblers +gabbles +gabbling +gabbro +gabbroic +gabbroid +gabbroitic +gabbros +gabe +gabeler +gabelle +gabelled +gabelleman +gabeller +gabelles +gabendum +gaberdine +gaberdines +gaberloonie +gaberlunzie +gabert +gabfest +gabfests +gabgab +gabi +gaby +gabies +gabion +gabionade +gabionage +gabioned +gabions +gablatores +gable +gableboard +gabled +gableended +gablelike +gabler +gables +gablet +gablewindowed +gablewise +gabling +gablock +gabon +gaboon +gaboons +gabriel +gabriella +gabrielrache +gabs +gabunese +gachupin +gad +gadaba +gadabout +gadabouts +gadaea +gadarene +gadaria +gadbee +gadbush +gaddang +gadded +gadder +gadders +gaddi +gadding +gaddingly +gaddis +gaddish +gaddishness +gade +gadean +gader +gades +gadfly +gadflies +gadge +gadger +gadget +gadgeteer +gadgeteers +gadgety +gadgetry +gadgetries +gadgets +gadhelic +gadi +gadid +gadidae +gadids +gadinic +gadinine +gadis +gaditan +gadite +gadling +gadman +gadoid +gadoidea +gadoids +gadolinia +gadolinic +gadolinite +gadolinium +gadroon +gadroonage +gadrooned +gadrooning +gadroons +gads +gadsbodikins +gadsbud +gadslid +gadsman +gadso +gadswoons +gaduin +gadus +gadwall +gadwalls +gadwell +gadzooks +gae +gaea +gaed +gaedelian +gaedown +gael +gaeldom +gaelic +gaelicism +gaelicist +gaelicization +gaelicize +gaels +gaeltacht +gaen +gaertnerian +gaes +gaet +gaetulan +gaetuli +gaetulian +gaff +gaffe +gaffed +gaffer +gaffers +gaffes +gaffing +gaffkya +gaffle +gaffs +gaffsail +gaffsman +gag +gaga +gagaku +gagate +gage +gageable +gaged +gagee +gageite +gagelike +gager +gagers +gagership +gages +gagged +gagger +gaggery +gaggers +gagging +gaggle +gaggled +gaggler +gaggles +gaggling +gaging +gagman +gagmen +gagor +gagroot +gags +gagster +gagsters +gagtooth +gagwriter +gahnite +gahnites +gahrwali +gay +gaia +gayal +gayals +gaiassa +gayatri +gaybine +gaycat +gaydiang +gaidropsaridae +gayer +gayest +gaiety +gayety +gaieties +gayeties +gayyou +gayish +gail +gaily +gayly +gaylies +gaillard +gaillardia +gaylussacia +gaylussite +gayment +gain +gainable +gainage +gainbirth +gaincall +gaincome +gaincope +gaine +gained +gainer +gainers +gayness +gaynesses +gainful +gainfully +gainfulness +gaingiving +gainyield +gaining +gainings +gainless +gainlessness +gainly +gainlier +gainliest +gainliness +gainor +gainpain +gains +gainsay +gainsaid +gainsayer +gainsayers +gainsaying +gainsays +gainset +gainsome +gainspeaker +gainspeaking +gainst +gainstand +gainstrive +gainturn +gaintwist +gainward +gaypoo +gair +gairfish +gairfowl +gays +gaisling +gaysome +gaist +gait +gaited +gaiter +gaiterless +gaiters +gaiting +gaits +gaitt +gaius +gayway +gaywing +gaywings +gaize +gaj +gal +gala +galabeah +galabia +galabieh +galabiya +galacaceae +galactagog +galactagogue +galactagoguic +galactan +galactase +galactemia +galacthidrosis +galactia +galactic +galactically +galactidrosis +galactin +galactite +galactocele +galactodendron +galactodensimeter +galactogenetic +galactogogue +galactohemia +galactoid +galactolipide +galactolipin +galactolysis +galactolytic +galactoma +galactometer +galactometry +galactonic +galactopathy +galactophagist +galactophagous +galactophygous +galactophlebitis +galactophlysis +galactophore +galactophoritis +galactophorous +galactophthysis +galactopyra +galactopoiesis +galactopoietic +galactorrhea +galactorrhoea +galactosamine +galactosan +galactoscope +galactose +galactosemia +galactosemic +galactosidase +galactoside +galactosyl +galactosis +galactostasis +galactosuria +galactotherapy +galactotrophy +galacturia +galagala +galaginae +galago +galagos +galah +galahad +galahads +galahs +galanas +galanga +galangal +galangals +galangin +galany +galant +galante +galanthus +galantine +galantuomo +galapago +galapee +galas +galatae +galatea +galateas +galatian +galatians +galatic +galatine +galatotrophic +galavant +galavanted +galavanting +galavants +galax +galaxes +galaxy +galaxian +galaxias +galaxies +galaxiidae +galban +galbanum +galbanums +galbe +galbraithian +galbula +galbulae +galbulidae +galbulinae +galbulus +galcha +galchic +gale +galea +galeae +galeage +galeas +galeass +galeate +galeated +galeche +galee +galeeny +galeenies +galega +galegine +galei +galey +galeid +galeidae +galeiform +galempong +galempung +galen +galena +galenas +galenian +galenic +galenical +galenism +galenist +galenite +galenites +galenobismutite +galenoid +galeod +galeodes +galeodidae +galeoid +galeopithecus +galeopsis +galeorchis +galeorhinidae +galeorhinus +galeproof +galera +galere +galeres +galericulate +galerie +galerite +galerum +galerus +gales +galesaur +galesaurus +galet +galette +galeus +galewort +galga +galgal +galgulidae +gali +galyac +galyacs +galyak +galyaks +galianes +galibi +galician +galictis +galidia +galidictis +galik +galilean +galilee +galilees +galilei +galileo +galimatias +galinaceous +galingale +galinsoga +galiongee +galionji +galiot +galiots +galipidine +galipine +galipoidin +galipoidine +galipoipin +galipot +galipots +galium +galivant +galivanted +galivanting +galivants +galjoen +gall +galla +gallacetophenone +gallach +gallah +gallamine +gallanilide +gallant +gallanted +gallanting +gallantize +gallantly +gallantness +gallantry +gallantries +gallants +gallate +gallates +gallature +gallberry +gallberries +gallbladder +gallbladders +gallbush +galleass +galleasses +galled +gallegan +galley +galleylike +galleyman +gallein +galleine +galleins +galleypot +galleys +galleyworm +galleon +galleons +galler +gallera +gallery +galleria +gallerian +galleried +galleries +gallerygoer +galleriidae +galleriies +gallerying +galleryite +gallerylike +gallet +galleta +galletas +galleting +gallfly +gallflies +gallflower +galli +gally +galliambic +galliambus +gallian +galliard +galliardise +galliardize +galliardly +galliardness +galliards +galliass +galliasses +gallybagger +gallybeggar +gallic +gallican +gallicanism +gallicism +gallicisms +gallicization +gallicize +gallicizer +gallicola +gallicolae +gallicole +gallicolous +gallycrow +gallied +gallies +galliferous +gallify +gallification +galliform +galliformes +galligaskin +galligaskins +gallygaskins +gallying +gallimatia +gallimaufry +gallimaufries +gallinaceae +gallinacean +gallinacei +gallinaceous +gallinae +gallinaginous +gallinago +gallinazo +galline +galliney +galling +gallingly +gallingness +gallinipper +gallinula +gallinule +gallinulelike +gallinules +gallinulinae +gallinuline +galliot +galliots +gallipot +gallipots +gallirallus +gallish +gallisin +gallium +galliums +gallivant +gallivanted +gallivanter +gallivanters +gallivanting +gallivants +gallivat +gallivorous +galliwasp +gallywasp +gallize +gallnut +gallnuts +gallocyanin +gallocyanine +galloflavin +galloflavine +galloglass +galloman +gallomania +gallomaniac +gallon +gallonage +galloner +gallons +galloon +gallooned +galloons +galloot +galloots +gallop +gallopade +galloped +galloper +galloperdix +gallopers +gallophile +gallophilism +gallophobe +gallophobia +galloping +gallops +galloptious +gallotannate +gallotannic +gallotannin +gallous +gallovidian +gallow +galloway +gallowglass +gallows +gallowses +gallowsmaker +gallowsness +gallowsward +galls +gallstone +gallstones +galluot +gallup +galluptious +gallus +gallused +galluses +gallweed +gallwort +galoch +galoisian +galoot +galoots +galop +galopade +galopades +galoped +galopin +galoping +galops +galore +galores +galosh +galoshe +galoshed +galoshes +galoubet +galp +galravage +galravitch +gals +galt +galtonia +galtonian +galtrap +galuchat +galumph +galumphed +galumphing +galumphs +galumptious +galusha +galut +galuth +galv +galvayne +galvayned +galvayning +galvanic +galvanical +galvanically +galvanisation +galvanise +galvanised +galvaniser +galvanising +galvanism +galvanist +galvanization +galvanizations +galvanize +galvanized +galvanizer +galvanizers +galvanizes +galvanizing +galvanocautery +galvanocauteries +galvanocauterization +galvanocontractility +galvanofaradization +galvanoglyph +galvanoglyphy +galvanograph +galvanography +galvanographic +galvanolysis +galvanology +galvanologist +galvanomagnet +galvanomagnetic +galvanomagnetism +galvanometer +galvanometers +galvanometry +galvanometric +galvanometrical +galvanometrically +galvanoplasty +galvanoplastic +galvanoplastical +galvanoplastically +galvanoplastics +galvanopsychic +galvanopuncture +galvanoscope +galvanoscopy +galvanoscopic +galvanosurgery +galvanotactic +galvanotaxis +galvanotherapy +galvanothermy +galvanothermometer +galvanotonic +galvanotropic +galvanotropism +galvo +galvvanoscopy +galways +galwegian +galziekte +gam +gamahe +gamaliel +gamari +gamash +gamashes +gamasid +gamasidae +gamasoidea +gamb +gamba +gambade +gambades +gambado +gambadoes +gambados +gambang +gambas +gambe +gambeer +gambeered +gambeering +gambelli +gambes +gambeson +gambesons +gambet +gambetta +gambette +gambia +gambiae +gambian +gambians +gambias +gambier +gambiers +gambir +gambirs +gambist +gambit +gambits +gamble +gambled +gambler +gamblers +gambles +gamblesome +gamblesomeness +gambling +gambodic +gamboge +gamboges +gambogian +gambogic +gamboised +gambol +gamboled +gamboler +gamboling +gambolled +gamboller +gambolling +gambols +gambone +gambrel +gambreled +gambrelled +gambrels +gambroon +gambs +gambusia +gambusias +gamdeboo +gamdia +game +gamebag +gameball +gamecock +gamecocks +gamecraft +gamed +gameful +gamey +gamekeeper +gamekeepers +gamekeeping +gamelan +gamelang +gamelans +gameless +gamely +gamelike +gamelin +gamelion +gamelote +gamelotte +gamene +gameness +gamenesses +gamer +games +gamesman +gamesmanship +gamesome +gamesomely +gamesomeness +gamest +gamester +gamesters +gamestress +gametal +gametange +gametangia +gametangium +gamete +gametes +gametic +gametically +gametocyst +gametocyte +gametogenesis +gametogeny +gametogenic +gametogenous +gametogony +gametogonium +gametoid +gametophagia +gametophyll +gametophyte +gametophytic +gametophobia +gametophore +gametophoric +gamgee +gamgia +gamy +gamic +gamier +gamiest +gamily +gamin +gamine +gamines +gaminesque +gaminess +gaminesses +gaming +gamings +gaminish +gamins +gamma +gammacism +gammacismus +gammadia +gammadion +gammarid +gammaridae +gammarine +gammaroid +gammarus +gammas +gammation +gammed +gammelost +gammer +gammerel +gammers +gammerstang +gammexane +gammy +gammick +gamming +gammock +gammon +gammoned +gammoner +gammoners +gammoning +gammons +gamobium +gamodeme +gamodemes +gamodesmy +gamodesmic +gamogamy +gamogenesis +gamogenetic +gamogenetical +gamogenetically +gamogeny +gamogony +gamolepis +gamomania +gamond +gamone +gamont +gamopetalae +gamopetalous +gamophagy +gamophagia +gamophyllous +gamori +gamosepalous +gamostele +gamostely +gamostelic +gamotropic +gamotropism +gamp +gamphrel +gamps +gams +gamut +gamuts +gan +ganam +ganancial +gananciales +ganancias +ganapati +ganch +ganched +ganching +ganda +gander +gandered +ganderess +gandergoose +gandering +gandermooner +ganders +ganderteeth +gandertmeeth +gandhara +gandharva +gandhi +gandhian +gandhiism +gandhism +gandhist +gandoura +gandul +gandum +gandurah +gane +ganef +ganefs +ganev +ganevs +gang +ganga +gangamopteris +gangan +gangava +gangbang +gangboard +gangbuster +gangdom +gange +ganged +ganger +gangerel +gangers +ganges +gangetic +gangflower +ganggang +ganging +gangion +gangism +gangland +ganglander +ganglands +gangly +ganglia +gangliac +ganglial +gangliar +gangliasthenia +gangliate +gangliated +gangliectomy +ganglier +gangliest +gangliform +gangliglia +gangliglions +gangliitis +gangling +ganglioblast +gangliocyte +ganglioform +ganglioid +ganglioma +gangliomas +gangliomata +ganglion +ganglionary +ganglionate +ganglionated +ganglionectomy +ganglionectomies +ganglioneural +ganglioneure +ganglioneuroma +ganglioneuron +ganglionic +ganglionitis +ganglionless +ganglions +ganglioplexus +ganglioside +gangman +gangmaster +gangplank +gangplanks +gangplow +gangplows +gangrel +gangrels +gangrenate +gangrene +gangrened +gangrenes +gangrenescent +gangrening +gangrenous +gangs +gangsa +gangshag +gangsman +gangster +gangsterism +gangsters +gangtide +gangue +ganguela +gangues +gangwa +gangway +gangwayed +gangwayman +gangwaymen +gangways +ganyie +ganymede +ganymedes +ganister +ganisters +ganja +ganjas +ganner +gannet +gannetry +gannets +gannister +ganoblast +ganocephala +ganocephalan +ganocephalous +ganodont +ganodonta +ganodus +ganof +ganofs +ganoid +ganoidal +ganoidean +ganoidei +ganoidian +ganoids +ganoin +ganoine +ganomalite +ganophyllite +ganoses +ganosis +ganowanian +gansa +gansey +gansel +ganser +gansy +gant +ganta +gantang +gantangs +gantelope +gantlet +gantleted +gantleting +gantlets +gantline +gantlines +gantlope +gantlopes +ganton +gantry +gantries +gantryman +gantsl +ganza +ganzie +gaol +gaolage +gaolbird +gaoled +gaoler +gaolering +gaolerness +gaolers +gaoling +gaoloring +gaols +gaon +gaonate +gaonic +gap +gapa +gape +gaped +gaper +gapers +gapes +gapeseed +gapeseeds +gapeworm +gapeworms +gapy +gaping +gapingly +gapingstock +gapless +gaplessness +gapo +gaposis +gaposises +gapped +gapper +gapperi +gappy +gappier +gappiest +gapping +gaps +gar +gara +garabato +garad +garage +garaged +garageman +garages +garaging +garamond +garance +garancin +garancine +garapata +garapato +garau +garava +garavance +garawi +garb +garbage +garbages +garbanzo +garbanzos +garbardine +garbed +garbel +garbell +garbill +garbing +garble +garbleable +garbled +garbler +garblers +garbles +garbless +garbline +garbling +garblings +garbo +garboard +garboards +garboil +garboils +garbologist +garbs +garbure +garce +garcinia +garcon +garcons +gard +gardant +gardbrace +garde +gardebras +gardeen +garden +gardenable +gardencraft +gardened +gardener +gardeners +gardenership +gardenesque +gardenful +gardenhood +gardeny +gardenia +gardenias +gardenin +gardening +gardenize +gardenless +gardenly +gardenlike +gardenmaker +gardenmaking +gardens +gardenwards +gardenwise +garderobe +gardeviance +gardevin +gardevisure +gardy +gardyloo +gardinol +gardnap +gardon +gare +garefowl +garefowls +gareh +gareth +garetta +garewaite +garfield +garfish +garfishes +garg +gargalize +garganey +garganeys +gargantua +gargantuan +gargarism +gargarize +garget +gargety +gargets +gargil +gargle +gargled +gargler +garglers +gargles +gargling +gargoyle +gargoyled +gargoyley +gargoyles +gargoylish +gargoylishly +gargoylism +gargol +garhwali +gary +garial +gariba +garibaldi +garibaldian +garigue +garish +garishly +garishness +garland +garlandage +garlanded +garlanding +garlandless +garlandlike +garlandry +garlands +garlandwise +garle +garlic +garlicky +garliclike +garlicmonger +garlics +garlicwort +garlion +garlopa +garment +garmented +garmenting +garmentless +garmentmaker +garments +garmenture +garmentworker +garn +garnel +garner +garnerage +garnered +garnering +garners +garnet +garnetberry +garneter +garnetiferous +garnetlike +garnets +garnett +garnetter +garnetwork +garnetz +garni +garnice +garniec +garnierite +garnish +garnishable +garnished +garnishee +garnisheed +garnisheeing +garnisheement +garnishees +garnisheing +garnisher +garnishes +garnishing +garnishment +garnishments +garnishry +garnison +garniture +garnitures +garo +garon +garoo +garookuh +garote +garoted +garoter +garotes +garoting +garotte +garotted +garotter +garotters +garottes +garotting +garous +garpike +garpikes +garrafa +garran +garrat +garred +garret +garreted +garreteer +garretmaster +garrets +garrya +garryaceae +garrick +garridge +garrigue +garring +garrison +garrisoned +garrisonian +garrisoning +garrisonism +garrisons +garrnishable +garron +garrons +garroo +garrooka +garrot +garrote +garroted +garroter +garroters +garrotes +garroting +garrotte +garrotted +garrotter +garrottes +garrotting +garrulinae +garruline +garrulity +garrulous +garrulously +garrulousness +garrulus +garrupa +gars +garse +garshuni +garsil +garston +garten +garter +gartered +gartering +garterless +garters +garth +garthman +garths +garua +garuda +garum +garvance +garvanzo +garvey +garveys +garvie +garvock +gas +gasalier +gasaliers +gasan +gasbag +gasbags +gasboat +gascheck +gascoign +gascoigny +gascoyne +gascon +gasconade +gasconaded +gasconader +gasconading +gasconism +gascons +gascromh +gaseity +gaselier +gaseliers +gaseosity +gaseous +gaseously +gaseousness +gases +gasfiring +gash +gashed +gasher +gashes +gashest +gashful +gashy +gashing +gashly +gashliness +gasholder +gashouse +gashouses +gasify +gasifiable +gasification +gasified +gasifier +gasifiers +gasifies +gasifying +gasiform +gasket +gaskets +gaskin +gasking +gaskings +gaskins +gasless +gaslight +gaslighted +gaslighting +gaslightness +gaslights +gaslike +gaslit +gaslock +gasmaker +gasman +gasmen +gasmetophytic +gasogen +gasogene +gasogenes +gasogenic +gasohol +gasolene +gasolenes +gasolier +gasoliery +gasoliers +gasoline +gasolineless +gasoliner +gasolines +gasolinic +gasometer +gasometry +gasometric +gasometrical +gasometrically +gasoscope +gasp +gaspar +gasparillo +gasped +gasper +gaspereau +gaspereaus +gaspergou +gaspergous +gaspers +gaspy +gaspiness +gasping +gaspingly +gasproof +gasps +gassed +gassendist +gasser +gasserian +gassers +gasses +gassy +gassier +gassiest +gassiness +gassing +gassings +gassit +gast +gastaldite +gastaldo +gasted +gaster +gasteralgia +gasteria +gasterolichenes +gasteromycete +gasteromycetes +gasteromycetous +gasterophilus +gasteropod +gasteropoda +gasterosteid +gasterosteidae +gasterosteiform +gasterosteoid +gasterosteus +gasterotheca +gasterothecal +gasterotricha +gasterotrichan +gasterozooid +gastful +gasthaus +gasthauser +gasthauses +gastight +gastightness +gasting +gastly +gastness +gastnesses +gastornis +gastornithidae +gastradenitis +gastraea +gastraead +gastraeadae +gastraeal +gastraeas +gastraeum +gastral +gastralgy +gastralgia +gastralgic +gastraneuria +gastrasthenia +gastratrophia +gastrea +gastreas +gastrectasia +gastrectasis +gastrectomy +gastrectomies +gastrelcosis +gastric +gastricism +gastrilegous +gastriloquy +gastriloquial +gastriloquism +gastriloquist +gastriloquous +gastrimargy +gastrin +gastrins +gastritic +gastritis +gastroadenitis +gastroadynamic +gastroalbuminorrhea +gastroanastomosis +gastroarthritis +gastroatonia +gastroatrophia +gastroblennorrhea +gastrocatarrhal +gastrocele +gastrocentrous +gastrochaena +gastrochaenidae +gastrocystic +gastrocystis +gastrocnemial +gastrocnemian +gastrocnemii +gastrocnemius +gastrocoel +gastrocoele +gastrocolic +gastrocoloptosis +gastrocolostomy +gastrocolotomy +gastrocolpotomy +gastrodermal +gastrodermis +gastrodialysis +gastrodiaphanoscopy +gastrodidymus +gastrodynia +gastrodisc +gastrodisk +gastroduodenal +gastroduodenitis +gastroduodenoscopy +gastroduodenostomy +gastroduodenostomies +gastroduodenotomy +gastroelytrotomy +gastroenteralgia +gastroenteric +gastroenteritic +gastroenteritis +gastroenteroanastomosis +gastroenterocolitis +gastroenterocolostomy +gastroenterology +gastroenterologic +gastroenterological +gastroenterologically +gastroenterologist +gastroenterologists +gastroenteroptosis +gastroenterostomy +gastroenterostomies +gastroenterotomy +gastroepiploic +gastroesophageal +gastroesophagostomy +gastrogastrotomy +gastrogenic +gastrogenital +gastrogenous +gastrograph +gastrohelcosis +gastrohepatic +gastrohepatitis +gastrohydrorrhea +gastrohyperneuria +gastrohypertonic +gastrohysterectomy +gastrohysteropexy +gastrohysterorrhaphy +gastrohysterotomy +gastroid +gastrointestinal +gastrojejunal +gastrojejunostomy +gastrojejunostomies +gastrolater +gastrolatrous +gastrolavage +gastrolienal +gastrolysis +gastrolith +gastrolytic +gastrolobium +gastrologer +gastrology +gastrological +gastrologically +gastrologist +gastrologists +gastromalacia +gastromancy +gastromelus +gastromenia +gastromyces +gastromycosis +gastromyxorrhea +gastronephritis +gastronome +gastronomer +gastronomes +gastronomy +gastronomic +gastronomical +gastronomically +gastronomics +gastronomist +gastronosus +gastropancreatic +gastropancreatitis +gastroparalysis +gastroparesis +gastroparietal +gastropathy +gastropathic +gastroperiodynia +gastropexy +gastrophile +gastrophilism +gastrophilist +gastrophilite +gastrophilus +gastrophrenic +gastrophthisis +gastropyloric +gastroplasty +gastroplenic +gastropleuritis +gastroplication +gastropneumatic +gastropneumonic +gastropod +gastropoda +gastropodan +gastropodous +gastropods +gastropore +gastroptosia +gastroptosis +gastropulmonary +gastropulmonic +gastrorrhagia +gastrorrhaphy +gastrorrhea +gastroschisis +gastroscope +gastroscopy +gastroscopic +gastroscopies +gastroscopist +gastrosoph +gastrosopher +gastrosophy +gastrospasm +gastrosplenic +gastrostaxis +gastrostegal +gastrostege +gastrostenosis +gastrostomy +gastrostomies +gastrostomize +gastrostomus +gastrosuccorrhea +gastrotaxis +gastrotheca +gastrothecal +gastrotympanites +gastrotome +gastrotomy +gastrotomic +gastrotomies +gastrotrich +gastrotricha +gastrotrichan +gastrotubotomy +gastrovascular +gastroxynsis +gastrozooid +gastrula +gastrulae +gastrular +gastrulas +gastrulate +gastrulated +gastrulating +gastrulation +gastruran +gasts +gasworker +gasworks +gat +gata +gatch +gatchwork +gate +gateado +gateage +gateau +gateaux +gatecrasher +gatecrashers +gated +gatefold +gatefolds +gatehouse +gatehouses +gatekeep +gatekeeper +gatekeepers +gateless +gatelike +gatemaker +gateman +gatemen +gatepost +gateposts +gater +gates +gatetender +gateway +gatewaying +gatewayman +gatewaymen +gateways +gateward +gatewards +gatewise +gatewoman +gateworks +gatewright +gatha +gather +gatherable +gathered +gatherer +gatherers +gathering +gatherings +gathers +gatherum +gathic +gating +gatling +gator +gats +gatsby +gatten +gatter +gatteridge +gattine +gau +gaub +gauby +gauche +gauchely +gaucheness +gaucher +gaucherie +gaucheries +gauchest +gaucho +gauchos +gaucy +gaucie +gaud +gaudeamus +gaudeamuses +gaudery +gauderies +gaudete +gaudful +gaudy +gaudier +gaudies +gaudiest +gaudily +gaudiness +gaudish +gaudless +gauds +gaudsman +gaufer +gauffer +gauffered +gaufferer +gauffering +gauffers +gauffre +gauffred +gaufre +gaufrette +gaufrettes +gauge +gaugeable +gaugeably +gauged +gauger +gaugers +gaugership +gauges +gauging +gauily +gauk +gaul +gaulding +gauleiter +gaulic +gaulin +gaulish +gaullism +gaullist +gauloiserie +gauls +gaulsh +gault +gaulter +gaultherase +gaultheria +gaultherin +gaultherine +gaults +gaum +gaumed +gaumy +gauming +gaumish +gaumless +gaumlike +gaums +gaun +gaunch +gaunt +gaunted +gaunter +gauntest +gaunty +gauntlet +gauntleted +gauntleting +gauntlets +gauntly +gauntness +gauntree +gauntry +gauntries +gaup +gauping +gaupus +gaur +gaura +gaure +gaurian +gauric +gaurie +gaurs +gaus +gauss +gaussage +gaussbergite +gausses +gaussian +gaussmeter +gauster +gausterer +gaut +gauteite +gauze +gauzelike +gauzes +gauzewing +gauzy +gauzier +gauziest +gauzily +gauziness +gavage +gavages +gavall +gave +gavel +gavelage +gaveled +gaveler +gavelet +gaveling +gavelkind +gavelkinder +gavelled +gaveller +gavelling +gavelman +gavelmen +gavelock +gavelocks +gavels +gaverick +gavia +gaviae +gavial +gavialis +gavialoid +gavials +gaviiformes +gavyuti +gavot +gavots +gavotte +gavotted +gavottes +gavotting +gaw +gawain +gawby +gawcey +gawcie +gawgaw +gawish +gawk +gawked +gawker +gawkers +gawkhammer +gawky +gawkier +gawkies +gawkiest +gawkihood +gawkily +gawkiness +gawking +gawkish +gawkishly +gawkishness +gawks +gawm +gawn +gawney +gawp +gawsy +gawsie +gaz +gazabo +gazaboes +gazabos +gazangabin +gazania +gaze +gazebo +gazeboes +gazebos +gazed +gazee +gazeful +gazehound +gazel +gazeless +gazella +gazelle +gazellelike +gazelles +gazelline +gazement +gazer +gazers +gazes +gazet +gazettal +gazette +gazetted +gazetteer +gazetteerage +gazetteerish +gazetteers +gazetteership +gazettes +gazetting +gazi +gazy +gazing +gazingly +gazingstock +gazogene +gazogenes +gazolyte +gazometer +gazon +gazook +gazophylacium +gazoz +gazpacho +gazpachos +gazump +gazzetta +gcd +gconv +gconvert +gd +gdinfo +gds +ge +geadephaga +geadephagous +geal +gean +geanticlinal +geanticline +gear +gearbox +gearboxes +gearcase +gearcases +geared +gearing +gearings +gearksutite +gearless +gearman +gears +gearset +gearshift +gearshifts +gearwheel +gearwheels +gease +geason +geast +geaster +geat +geatas +geb +gebang +gebanga +gebbie +gebur +gecarcinian +gecarcinidae +gecarcinus +geck +gecked +gecking +gecko +geckoes +geckoid +geckos +geckotian +geckotid +geckotidae +geckotoid +gecks +ged +gedackt +gedact +gedanite +gedanken +gedd +gedder +gedds +gedeckt +gedecktwork +gederathite +gederite +gedrite +geds +gedunk +gee +geebong +geebung +geechee +geed +geegaw +geegaws +geeing +geejee +geek +geeks +geelbec +geelbeck +geelbek +geeldikkop +geelhout +geepound +geepounds +geer +geerah +gees +geese +geest +geests +geet +geez +geezer +geezers +gefilte +gefulltefish +gegenion +gegenschein +gegg +geggee +gegger +geggery +gehey +geheimrat +gehenna +gehlenite +gey +geyan +geic +geyerite +geiger +geikia +geikielite +geylies +gein +geir +geira +geisa +geisenheimer +geyser +geyseral +geyseric +geyserine +geyserish +geyserite +geysers +geisha +geishas +geison +geisotherm +geisothermal +geissoloma +geissolomataceae +geissolomataceous +geissorhiza +geissospermin +geissospermine +geist +geistlich +geitjie +geitonogamy +geitonogamous +gekko +gekkones +gekkonid +gekkonidae +gekkonoid +gekkota +gel +gelable +gelada +geladas +gelandejump +gelandelaufer +gelandesprung +gelant +gelants +gelasian +gelasimus +gelastic +gelastocoridae +gelate +gelated +gelates +gelatia +gelatification +gelatigenous +gelatin +gelatinate +gelatinated +gelatinating +gelatination +gelatine +gelatined +gelatines +gelating +gelatiniferous +gelatinify +gelatiniform +gelatinigerous +gelatinisation +gelatinise +gelatinised +gelatiniser +gelatinising +gelatinity +gelatinizability +gelatinizable +gelatinization +gelatinize +gelatinized +gelatinizer +gelatinizing +gelatinobromide +gelatinochloride +gelatinoid +gelatinotype +gelatinous +gelatinously +gelatinousness +gelatins +gelation +gelations +gelatose +geld +geldability +geldable +geldant +gelded +gelder +gelders +geldesprung +gelding +geldings +gelds +gelechia +gelechiid +gelechiidae +gelee +geleem +gelees +gelfomino +gelid +gelidiaceae +gelidity +gelidities +gelidium +gelidly +gelidness +gelignite +gelilah +gelinotte +gell +gellant +gellants +gelled +gellert +gelly +gelling +gelndesprung +gelofer +gelofre +gelogenic +gelong +geloscopy +gelose +gelosie +gelosin +gelosine +gelotherapy +gelotometer +gelotoscopy +gelototherapy +gels +gelsemia +gelsemic +gelsemin +gelsemine +gelseminic +gelseminine +gelsemium +gelsemiumia +gelsemiums +gelt +gelts +gem +gemara +gemaric +gemarist +gematria +gematrical +gematriot +gemauve +gemeinde +gemeinschaft +gemeinschaften +gemel +gemeled +gemelled +gemellion +gemellione +gemellus +gemels +geminal +geminally +geminate +geminated +geminately +geminates +geminating +gemination +geminations +geminative +gemini +geminid +geminiflorous +geminiform +geminis +geminorum +geminous +gemitores +gemitorial +gemless +gemlich +gemlike +gemma +gemmaceous +gemmae +gemman +gemmary +gemmate +gemmated +gemmates +gemmating +gemmation +gemmative +gemmed +gemmel +gemmeous +gemmer +gemmery +gemmy +gemmier +gemmiest +gemmiferous +gemmiferousness +gemmification +gemmiform +gemmily +gemminess +gemming +gemmingia +gemmipara +gemmipares +gemmiparity +gemmiparous +gemmiparously +gemmoid +gemmology +gemmological +gemmologist +gemmologists +gemmula +gemmulation +gemmule +gemmules +gemmuliferous +gemology +gemological +gemologies +gemologist +gemologists +gemonies +gemot +gemote +gemotes +gemots +gempylid +gems +gemsbok +gemsboks +gemsbuck +gemsbucks +gemse +gemses +gemshorn +gemstone +gemstones +gemuetlich +gemul +gemuti +gemutlich +gemutlichkeit +gemwork +gen +gena +genae +genal +genapp +genappe +genapped +genapper +genapping +genarch +genarcha +genarchaship +genarchship +gendarme +gendarmery +gendarmerie +gendarmes +gender +gendered +genderer +gendering +genderless +genders +gene +geneal +genealogy +genealogic +genealogical +genealogically +genealogies +genealogist +genealogists +genealogize +genealogizer +genear +genearch +geneat +genecology +genecologic +genecological +genecologically +genecologist +genecor +geneki +genep +genepi +genera +generability +generable +generableness +general +generalate +generalcy +generalcies +generale +generalia +generalidad +generalific +generalisable +generalisation +generalise +generalised +generaliser +generalising +generalism +generalissima +generalissimo +generalissimos +generalist +generalistic +generalists +generaliter +generality +generalities +generalizable +generalization +generalizations +generalize +generalizeable +generalized +generalizer +generalizers +generalizes +generalizing +generall +generally +generalness +generals +generalship +generalships +generalty +generant +generate +generated +generater +generates +generating +generation +generational +generationism +generations +generative +generatively +generativeness +generator +generators +generatrices +generatrix +generic +generical +generically +genericalness +genericness +generics +generification +generis +generosity +generosities +generous +generously +generousness +genes +genesee +geneserin +geneserine +geneses +genesiac +genesiacal +genesial +genesic +genesiology +genesis +genesitic +genesiurgic +genet +genethliac +genethliacal +genethliacally +genethliacism +genethliacon +genethliacs +genethlialogy +genethlialogic +genethlialogical +genethliatic +genethlic +genetic +genetical +genetically +geneticism +geneticist +geneticists +genetics +genetika +genetmoil +genetoid +genetor +genetous +genetrix +genets +genetta +genette +genettes +geneura +geneva +genevan +genevas +genevese +genevieve +genevois +genevoise +genghis +genial +geniality +genialize +genially +genialness +genian +genyantrum +genic +genically +genicular +geniculate +geniculated +geniculately +geniculation +geniculum +genie +genies +genii +genin +genio +genioglossal +genioglossi +genioglossus +geniohyoglossal +geniohyoglossus +geniohyoid +geniolatry +genion +genyophrynidae +genioplasty +genyoplasty +genip +genipa +genipap +genipapada +genipaps +genyplasty +genips +genys +genisaro +genista +genistein +genistin +genit +genital +genitalia +genitalial +genitalic +genitally +genitals +geniting +genitival +genitivally +genitive +genitives +genitocrural +genitofemoral +genitor +genitory +genitorial +genitors +genitourinary +geniture +genitures +genius +geniuses +genizah +genizero +genl +genny +genoa +genoas +genoblast +genoblastic +genocidal +genocide +genocides +genoese +genoise +genom +genome +genomes +genomic +genoms +genonema +genophobia +genos +genospecies +genotype +genotypes +genotypic +genotypical +genotypically +genotypicity +genouillere +genoveva +genovino +genre +genres +genro +genros +gens +genseng +gensengs +genson +gent +gentamicin +genteel +genteeler +genteelest +genteelish +genteelism +genteelize +genteelly +genteelness +gentes +genthite +genty +gentian +gentiana +gentianaceae +gentianaceous +gentianal +gentianales +gentianella +gentianic +gentianin +gentianose +gentians +gentianwort +gentiin +gentil +gentile +gentiledom +gentiles +gentilesse +gentilhomme +gentilic +gentilish +gentilism +gentility +gentilitial +gentilitian +gentilities +gentilitious +gentilization +gentilize +gentiobiose +gentiopicrin +gentisate +gentisein +gentisic +gentisin +gentium +gentle +gentled +gentlefolk +gentlefolks +gentlehearted +gentleheartedly +gentleheartedness +gentlehood +gentleman +gentlemanhood +gentlemanism +gentlemanize +gentlemanly +gentlemanlike +gentlemanlikeness +gentlemanliness +gentlemanship +gentlemen +gentlemens +gentlemouthed +gentleness +gentlepeople +gentler +gentles +gentleship +gentlest +gentlewoman +gentlewomanhood +gentlewomanish +gentlewomanly +gentlewomanlike +gentlewomanliness +gentlewomen +gently +gentling +gentman +gentoo +gentry +gentrice +gentrices +gentries +gentrification +gents +genu +genua +genual +genuclast +genuflect +genuflected +genuflecting +genuflection +genuflections +genuflector +genuflectory +genuflects +genuflex +genuflexion +genuflexuous +genuine +genuinely +genuineness +genupectoral +genus +genuses +geo +geoaesthesia +geoagronomic +geobiology +geobiologic +geobiont +geobios +geoblast +geobotany +geobotanic +geobotanical +geobotanically +geobotanist +geocarpic +geocentric +geocentrical +geocentrically +geocentricism +geocerite +geochemical +geochemically +geochemist +geochemistry +geochemists +geochrony +geochronic +geochronology +geochronologic +geochronological +geochronologically +geochronologist +geochronometry +geochronometric +geocyclic +geocline +geococcyx +geocoronium +geocratic +geocronite +geod +geodaesia +geodal +geode +geodes +geodesy +geodesia +geodesic +geodesical +geodesics +geodesies +geodesist +geodesists +geodete +geodetic +geodetical +geodetically +geodetician +geodetics +geodiatropism +geodic +geodiferous +geodynamic +geodynamical +geodynamicist +geodynamics +geodist +geoduck +geoducks +geoemtry +geoethnic +geoff +geoffrey +geoffroyin +geoffroyine +geoform +geog +geogen +geogenesis +geogenetic +geogeny +geogenic +geogenous +geoglyphic +geoglossaceae +geoglossum +geognosy +geognosies +geognosis +geognosist +geognost +geognostic +geognostical +geognostically +geogony +geogonic +geogonical +geographer +geographers +geography +geographic +geographical +geographically +geographics +geographies +geographism +geographize +geographized +geohydrology +geohydrologic +geohydrologist +geoid +geoidal +geoids +geoisotherm +geol +geolatry +geolinguistics +geologer +geologers +geology +geologian +geologic +geological +geologically +geologician +geologies +geologise +geologised +geologising +geologist +geologists +geologize +geologized +geologizing +geom +geomagnetic +geomagnetically +geomagnetician +geomagnetics +geomagnetism +geomagnetist +geomaly +geomalic +geomalism +geomance +geomancer +geomancy +geomancies +geomant +geomantic +geomantical +geomantically +geomechanics +geomedical +geomedicine +geometdecrne +geometer +geometers +geometry +geometric +geometrical +geometrically +geometrician +geometricians +geometricism +geometricist +geometricize +geometrid +geometridae +geometries +geometriform +geometrina +geometrine +geometrise +geometrised +geometrising +geometrize +geometrized +geometrizing +geometroid +geometroidea +geomyid +geomyidae +geomys +geomoroi +geomorphy +geomorphic +geomorphist +geomorphogeny +geomorphogenic +geomorphogenist +geomorphology +geomorphologic +geomorphological +geomorphologically +geomorphologist +geon +geonavigation +geonegative +geonic +geonyctinastic +geonyctitropic +geonim +geonoma +geoparallelotropic +geophagy +geophagia +geophagies +geophagism +geophagist +geophagous +geophila +geophilid +geophilidae +geophilous +geophilus +geophysical +geophysically +geophysicist +geophysicists +geophysics +geophyte +geophytes +geophytic +geophone +geophones +geoplagiotropism +geoplana +geoplanidae +geopolar +geopolitic +geopolitical +geopolitically +geopolitician +geopolitics +geopolitik +geopolitist +geopony +geoponic +geoponical +geoponics +geopositive +geopotential +geoprumnon +georama +geordie +george +georgemas +georgette +georgia +georgiadesite +georgian +georgiana +georgians +georgic +georgical +georgics +georgie +georgium +geoscience +geoscientist +geoscientists +geoscopy +geoscopic +geoselenic +geosid +geoside +geosynchronous +geosynclinal +geosyncline +geosynclines +geosphere +geospiza +geostatic +geostatics +geostationary +geostrategy +geostrategic +geostrategist +geostrophic +geostrophically +geotactic +geotactically +geotaxes +geotaxy +geotaxis +geotechnic +geotechnics +geotectology +geotectonic +geotectonically +geotectonics +geoteuthis +geotherm +geothermal +geothermally +geothermic +geothermometer +geothlypis +geoty +geotic +geotical +geotilla +geotonic +geotonus +geotropy +geotropic +geotropically +geotropism +gepeoo +gephyrea +gephyrean +gephyrocercal +gephyrocercy +gephyrophobia +gepidae +gepoun +ger +geraera +gerah +gerahs +gerald +geraldine +geraniaceae +geraniaceous +geranial +geraniales +geranials +geranic +geranyl +geranin +geraniol +geraniols +geranium +geraniums +geranomorph +geranomorphae +geranomorphic +gerara +gerard +gerardia +gerardias +gerasene +gerastian +gerate +gerated +gerately +geraty +geratic +geratology +geratologic +geratologous +gerb +gerbe +gerbera +gerberas +gerberia +gerbil +gerbille +gerbilles +gerbillinae +gerbillus +gerbils +gerbo +gercrow +gere +gereagle +gerefa +gerenda +gerendum +gerent +gerents +gerenuk +gerenuks +gerfalcon +gerful +gerhardtite +gery +geriatric +geriatrician +geriatrics +geriatrist +gerygone +gerim +geryon +geryonia +geryonid +geryonidae +geryoniidae +gerip +gerkin +gerland +germ +germain +germal +german +germander +germane +germanely +germaneness +germanesque +germanhood +germany +germania +germanic +germanical +germanically +germanics +germanies +germanify +germanification +germanyl +germanious +germanish +germanism +germanist +germanistic +germanite +germanity +germanium +germaniums +germanization +germanize +germanized +germanizer +germanly +germanness +germanocentric +germanomania +germanomaniac +germanophile +germanophilist +germanophobe +germanophobia +germanophobic +germanophobist +germanous +germans +germantown +germarium +germen +germens +germfree +germy +germicidal +germicide +germicides +germiculture +germier +germiest +germifuge +germigene +germigenous +germin +germina +germinability +germinable +germinal +germinally +germinance +germinancy +germinant +germinate +germinated +germinates +germinating +germination +germinational +germinations +germinative +germinatively +germinator +germing +germiniparous +germinogony +germiparity +germiparous +germless +germlike +germling +germon +germproof +germs +germule +gernative +gernitz +gerocomy +gerocomia +gerocomical +geroderma +gerodermia +gerodontia +gerodontic +gerodontics +gerodontology +geromorphism +geronomite +geront +gerontal +gerontes +gerontic +gerontine +gerontism +geronto +gerontocracy +gerontocracies +gerontocrat +gerontocratic +gerontogeous +gerontology +gerontologic +gerontological +gerontologies +gerontologist +gerontologists +gerontomorphosis +gerontophilia +gerontotherapy +gerontotherapies +gerontoxon +geropiga +gerousia +gerres +gerrhosaurid +gerrhosauridae +gerridae +gerrymander +gerrymandered +gerrymanderer +gerrymandering +gerrymanders +gers +gersdorffite +gershom +gershon +gershonite +gersum +gertie +gertrude +gerund +gerundial +gerundially +gerundival +gerundive +gerundively +gerunds +gerusia +gervais +gervao +gervas +gervase +ges +gesan +gesellschaft +gesellschaften +geshurites +gesith +gesithcund +gesithcundman +gesling +gesnera +gesneraceae +gesneraceous +gesnerad +gesneria +gesneriaceae +gesneriaceous +gesnerian +gesning +gess +gessamine +gesseron +gesso +gessoes +gest +gestae +gestalt +gestalten +gestalter +gestaltist +gestalts +gestant +gestapo +gestapos +gestate +gestated +gestates +gestating +gestation +gestational +gestations +gestative +gestatory +gestatorial +gestatorium +geste +gested +gesten +gestening +gester +gestes +gestic +gestical +gesticulacious +gesticulant +gesticular +gesticularious +gesticulate +gesticulated +gesticulates +gesticulating +gesticulation +gesticulations +gesticulative +gesticulatively +gesticulator +gesticulatory +gestio +gestion +gestning +gestonie +gestor +gests +gestura +gestural +gesture +gestured +gestureless +gesturer +gesturers +gestures +gesturing +gesturist +gesundheit +geswarp +get +geta +getable +getae +getah +getas +getatability +getatable +getatableness +getaway +getaways +getfd +gether +gethsemane +gethsemanic +getic +getid +getling +getmesost +getmjlkost +getpenny +gets +getspa +getspace +getsul +gettable +gettableness +getter +gettered +gettering +getters +getting +gettings +gettysburg +getup +getups +geulah +geullah +geum +geumatophobia +geums +gewgaw +gewgawed +gewgawy +gewgawish +gewgawry +gewgaws +gez +gezerah +ggr +ghaffir +ghafir +ghain +ghaist +ghalva +ghan +ghana +ghanaian +ghanaians +ghanian +gharial +gharnao +gharri +gharry +gharries +gharris +ghassanid +ghast +ghastful +ghastfully +ghastfulness +ghastily +ghastly +ghastlier +ghastliest +ghastlily +ghastliness +ghat +ghats +ghatti +ghatwal +ghatwazi +ghaut +ghauts +ghawazee +ghawazi +ghazal +ghazel +ghazi +ghazies +ghazis +ghazism +ghaznevid +ghbor +gheber +ghebeta +ghedda +ghee +ghees +gheg +ghegish +gheleem +ghent +ghenting +gherao +gheraoed +gheraoes +gheraoing +gherkin +gherkins +ghess +ghetchoo +ghetti +ghetto +ghettoed +ghettoes +ghettoing +ghettoization +ghettoize +ghettoized +ghettoizes +ghettoizing +ghettos +ghi +ghibelline +ghibellinism +ghibli +ghiblis +ghyll +ghillie +ghillies +ghylls +ghilzai +ghiordes +ghis +ghizite +ghole +ghoom +ghorkhar +ghost +ghostcraft +ghostdom +ghosted +ghoster +ghostess +ghostfish +ghostfishes +ghostflower +ghosthood +ghosty +ghostier +ghostiest +ghostified +ghostily +ghosting +ghostish +ghostism +ghostland +ghostless +ghostlet +ghostly +ghostlier +ghostliest +ghostlify +ghostlike +ghostlikeness +ghostlily +ghostliness +ghostmonger +ghostology +ghosts +ghostship +ghostweed +ghostwrite +ghostwriter +ghostwriters +ghostwrites +ghostwriting +ghostwritten +ghostwrote +ghoul +ghoulery +ghoulie +ghoulish +ghoulishly +ghoulishness +ghouls +ghrush +ghurry +ghuz +gi +gyal +giallolino +giambeux +giansar +giant +giantesque +giantess +giantesses +gianthood +giantish +giantism +giantisms +giantize +giantkind +giantly +giantlike +giantlikeness +giantry +giants +giantship +giantsize +giaour +giaours +giardia +giardiasis +giarra +giarre +gyarung +gyascutus +gyassa +gib +gibaro +gibbals +gibbar +gibbartas +gibbed +gibber +gibbered +gibberella +gibberellin +gibbergunyah +gibbering +gibberish +gibberose +gibberosity +gibbers +gibbert +gibbet +gibbeted +gibbeting +gibbets +gibbetted +gibbetting +gibbetwise +gibbi +gibby +gibbier +gibbing +gibbled +gibblegabble +gibblegabbler +gibblegable +gibbles +gibbol +gibbon +gibbons +gibbose +gibbosely +gibboseness +gibbosity +gibbosities +gibbous +gibbously +gibbousness +gibbsite +gibbsites +gibbus +gibe +gybe +gibed +gybed +gibel +gibelite +gibeonite +giber +gibers +gibes +gybes +gibetting +gibier +gibing +gybing +gibingly +gibleh +giblet +giblets +gibli +giboia +gibraltar +gibs +gibson +gibsons +gibstaff +gibus +gibuses +gid +giddap +giddea +giddy +giddyberry +giddybrain +giddied +giddier +giddies +giddiest +giddify +giddyhead +giddying +giddyish +giddily +giddiness +giddypate +gideon +gideonite +gidgea +gidgee +gidyea +gidjee +gids +gie +gye +gieaway +gieaways +gied +gieing +gien +gienah +gierfalcon +gies +gieseckite +giesel +gif +gifblaar +giffgaff +gifola +gift +giftbook +gifted +giftedly +giftedness +giftie +gifting +giftless +giftlike +giftling +gifts +gifture +giftware +giftwrap +giftwrapping +gig +giga +gigabit +gigabyte +gigabytes +gigabits +gigacycle +gigadoid +gigahertz +gigahertzes +gigaherz +gigamaree +gigameter +gigant +gigantal +gigantean +gigantesque +gigantic +gigantical +gigantically +giganticidal +giganticide +giganticness +gigantine +gigantism +gigantize +gigantoblast +gigantocyte +gigantolite +gigantology +gigantological +gigantomachy +gigantomachia +gigantopithecus +gigantosaurus +gigantostraca +gigantostracan +gigantostracous +gigartina +gigartinaceae +gigartinaceous +gigartinales +gigas +gigasecond +gigaton +gigatons +gigavolt +gigawatt +gigawatts +gigback +gigelira +gigeria +gigerium +gyges +gigful +gigge +gigged +gigger +gigget +gigging +giggish +giggit +giggle +giggled +giggledom +gigglement +giggler +gigglers +giggles +gigglesome +giggly +gigglier +giggliest +giggling +gigglingly +gigglish +gighe +gigi +gygis +giglet +giglets +gigliato +giglio +giglot +giglots +gigman +gigmaness +gigmanhood +gigmania +gigmanic +gigmanically +gigmanism +gigmanity +gignate +gignitive +gigolo +gigolos +gigot +gigots +gigs +gigsman +gigsmen +gigster +gigtree +gigue +gigues +gigunu +giher +giinwale +gil +gila +gilaki +gilbert +gilbertage +gilbertese +gilbertian +gilbertianism +gilbertine +gilbertite +gilberts +gild +gildable +gilded +gildedness +gilden +gilder +gilders +gildhall +gildhalls +gilding +gildings +gilds +gildship +gildsman +gildsmen +gile +gyle +gileadite +gilenyer +gilenyie +gileno +giles +gilet +gilgai +gilgames +gilgamesh +gilgie +gilguy +gilgul +gilgulim +gilia +giliak +gilim +gill +gillar +gillaroo +gillbird +gilled +gillenia +giller +gillers +gilles +gillflirt +gillhooter +gilly +gillian +gillie +gillied +gillies +gilliflirt +gilliflower +gillyflower +gillygaupus +gillying +gilling +gillion +gilliver +gillnet +gillnets +gillnetted +gillnetting +gillot +gillotage +gillotype +gills +gillstoup +gilo +gilour +gilpey +gilpy +gilravage +gilravager +gils +gilse +gilsonite +gilt +giltcup +gilten +gilthead +giltheads +gilty +gilts +gilttail +gilver +gim +gym +gimbal +gimbaled +gimbaling +gimbaljawed +gimballed +gimballing +gimbals +gimbawawed +gimberjawed +gimble +gimblet +gimbri +gimcrack +gimcrackery +gimcracky +gimcrackiness +gimcracks +gimel +gymel +gimels +gimirrai +gymkhana +gymkhanas +gimlet +gimleted +gimleteyed +gimlety +gimleting +gimlets +gimmal +gymmal +gimmaled +gimmals +gimme +gimmer +gimmeringly +gimmerpet +gimmick +gimmicked +gimmickery +gimmicky +gimmicking +gimmickry +gimmicks +gimmor +gymnadenia +gymnadeniopsis +gymnanthes +gymnanthous +gymnarchidae +gymnarchus +gymnasia +gymnasial +gymnasiarch +gymnasiarchy +gymnasiast +gymnasic +gymnasisia +gymnasisiums +gymnasium +gymnasiums +gymnast +gymnastic +gymnastical +gymnastically +gymnastics +gymnasts +gymnemic +gymnetrous +gymnic +gymnical +gymnics +gymnite +gymnoblastea +gymnoblastic +gymnocalycium +gymnocarpic +gymnocarpous +gymnocerata +gymnoceratous +gymnocidium +gymnocladus +gymnoconia +gymnoderinae +gymnodiniaceae +gymnodiniaceous +gymnodiniidae +gymnodinium +gymnodont +gymnodontes +gymnogen +gymnogene +gymnogenous +gymnogynous +gymnogyps +gymnoglossa +gymnoglossate +gymnolaema +gymnolaemata +gymnolaematous +gymnonoti +gymnopaedes +gymnopaedic +gymnophiona +gymnophobia +gymnoplast +gymnorhina +gymnorhinal +gymnorhininae +gymnosoph +gymnosophy +gymnosophical +gymnosophist +gymnosperm +gymnospermae +gymnospermal +gymnospermy +gymnospermic +gymnospermism +gymnospermous +gymnosperms +gymnosporangium +gymnospore +gymnosporous +gymnostomata +gymnostomina +gymnostomous +gymnothorax +gymnotid +gymnotidae +gymnotoka +gymnotokous +gymnotus +gymnura +gymnure +gymnurinae +gymnurine +gimp +gimped +gimper +gimpy +gympie +gimpier +gimpiest +gimping +gimps +gyms +gymsia +gymslip +gin +gyn +gynaecea +gynaeceum +gynaecia +gynaecian +gynaecic +gynaecium +gynaecocoenic +gynaecocracy +gynaecocracies +gynaecocrat +gynaecocratic +gynaecoid +gynaecol +gynaecology +gynaecologic +gynaecological +gynaecologist +gynaecomasty +gynaecomastia +gynaecomorphous +gynaeconitis +gynaeocracy +gynaeolater +gynaeolatry +gynander +gynandrarchy +gynandrarchic +gynandry +gynandria +gynandrian +gynandries +gynandrism +gynandroid +gynandromorph +gynandromorphy +gynandromorphic +gynandromorphism +gynandromorphous +gynandrophore +gynandrosporous +gynandrous +gynantherous +gynarchy +gynarchic +gynarchies +gyne +gyneccia +gynecia +gynecic +gynecicgynecidal +gynecidal +gynecide +gynecium +gynecocentric +gynecocracy +gynecocracies +gynecocrat +gynecocratic +gynecocratical +gynecoid +gynecol +gynecolatry +gynecology +gynecologic +gynecological +gynecologies +gynecologist +gynecologists +gynecomania +gynecomaniac +gynecomaniacal +gynecomasty +gynecomastia +gynecomastism +gynecomazia +gynecomorphous +gyneconitis +gynecopathy +gynecopathic +gynecophore +gynecophoric +gynecophorous +gynecotelic +gynecratic +gyneocracy +gyneolater +gyneolatry +ginep +gynephobia +gynerium +ginete +gynethusia +gynetype +ging +gingal +gingall +gingalls +gingals +gingeley +gingeleys +gingeli +gingely +gingelies +gingelis +gingelly +gingellies +ginger +gingerade +gingerberry +gingerbread +gingerbready +gingered +gingery +gingerin +gingering +gingerleaf +gingerly +gingerline +gingerliness +gingerness +gingernut +gingerol +gingerous +gingerroot +gingers +gingersnap +gingersnaps +gingerspice +gingerwork +gingerwort +gingham +ginghamed +ginghams +gingili +gingilis +gingiva +gingivae +gingival +gingivalgia +gingivectomy +gingivitis +gingivoglossitis +gingivolabial +gingko +gingkoes +gingle +gingles +ginglyform +ginglymi +ginglymoarthrodia +ginglymoarthrodial +ginglymodi +ginglymodian +ginglymoid +ginglymoidal +ginglymostoma +ginglymostomoid +ginglymus +ginglyni +ginglmi +gingras +ginhound +ginhouse +gyniatry +gyniatrics +gyniatries +gynic +gynics +gyniolatry +gink +ginkgo +ginkgoaceae +ginkgoaceous +ginkgoales +ginkgoes +ginks +ginmill +ginn +ginned +ginney +ginnel +ginner +ginnery +ginneries +ginners +ginnet +ginny +ginnier +ginniest +ginning +ginnings +ginnle +gynobase +gynobaseous +gynobasic +gynocardia +gynocardic +gynocracy +gynocratic +gynodioecious +gynodioeciously +gynodioecism +gynoecia +gynoecium +gynoeciumcia +gynogenesis +gynogenetic +gynomonecious +gynomonoecious +gynomonoeciously +gynomonoecism +gynopara +gynophagite +gynophore +gynophoric +ginorite +gynosporangium +gynospore +gynostegia +gynostegigia +gynostegium +gynostemia +gynostemium +gynostemiumia +gins +ginseng +ginsengs +gynura +ginward +ginzo +ginzoes +gio +giobertite +giocoso +giojoso +gyokuro +giornata +giornatate +giottesque +giovanni +gip +gyp +gypaetus +gype +gipon +gipons +gipped +gypped +gipper +gypper +gyppery +gippers +gyppers +gippy +gipping +gypping +gippo +gyppo +gips +gyps +gipseian +gypseian +gypseous +gipser +gipsy +gypsy +gipsydom +gypsydom +gypsydoms +gipsied +gypsied +gipsies +gypsies +gipsyesque +gypsyesque +gypsiferous +gipsyfy +gypsyfy +gipsyhead +gypsyhead +gipsyhood +gypsyhood +gipsying +gypsying +gipsyish +gypsyish +gipsyism +gypsyism +gypsyisms +gipsylike +gypsylike +gypsine +gipsiologist +gypsiologist +gipsire +gipsyry +gypsyry +gypsite +gipsyweed +gypsyweed +gypsywise +gipsywort +gypsywort +gypsography +gipsology +gypsology +gypsologist +gypsophila +gypsophily +gypsophilous +gypsoplast +gypsous +gypster +gypsum +gypsumed +gypsuming +gypsums +gyracanthus +giraffa +giraffe +giraffes +giraffesque +giraffidae +giraffine +giraffish +giraffoid +gyral +gyrally +girandola +girandole +gyrant +girasol +girasole +girasoles +girasols +gyrate +gyrated +gyrates +gyrating +gyration +gyrational +gyrations +gyrator +gyratory +gyrators +girba +gird +girded +girder +girderage +girdering +girderless +girders +girding +girdingly +girdle +girdlecake +girdled +girdlelike +girdler +girdlers +girdles +girdlestead +girdling +girdlingly +girds +gire +gyre +gyrectomy +gyrectomies +gyred +girella +girellidae +gyrencephala +gyrencephalate +gyrencephalic +gyrencephalous +gyrene +gyrenes +gyres +gyrfalcon +gyrfalcons +girgashite +girgasite +gyri +gyric +gyring +gyrinid +gyrinidae +gyrinus +girja +girkin +girl +girland +girlchild +girleen +girlery +girlfriend +girlfriends +girlfully +girlhood +girlhoods +girly +girlie +girlies +girliness +girling +girlish +girlishly +girlishness +girlism +girllike +girllikeness +girls +girn +girnal +girned +girnel +girny +girnie +girning +girns +giro +gyro +gyrocar +gyroceracone +gyroceran +gyroceras +gyrochrome +gyrocompass +gyrocompasses +gyrodactylidae +gyrodactylus +gyrodyne +giroflore +gyrofrequency +gyrofrequencies +gyrogonite +gyrograph +gyrohorizon +gyroidal +gyroidally +gyrolite +gyrolith +gyroma +gyromagnetic +gyromancy +gyromele +gyrometer +gyromitra +giron +gyron +gironde +girondin +girondism +girondist +gironny +gyronny +girons +gyrons +gyrophora +gyrophoraceae +gyrophoraceous +gyrophoric +gyropigeon +gyropilot +gyroplane +giros +gyros +gyroscope +gyroscopes +gyroscopic +gyroscopically +gyroscopics +gyrose +gyrosyn +girosol +girosols +gyrostabilized +gyrostabilizer +gyrostachys +gyrostat +gyrostatic +gyrostatically +gyrostatics +gyrostats +gyrotheca +girouette +girouettes +girouettism +gyrous +gyrovagi +gyrovague +gyrovagues +gyrowheel +girr +girrit +girrock +girse +girsh +girshes +girsle +girt +girted +girth +girthed +girthing +girthline +girths +girting +girtline +girtonian +girts +gyrus +gis +gisant +gisants +gisarme +gisarmes +gise +gyse +gisel +gisement +gish +gisla +gisler +gismo +gismondine +gismondite +gismos +gispin +gist +gists +git +gitaligenin +gitalin +gitana +gitanemuck +gitanemuk +gitano +gitanos +gite +gyte +giterne +gith +gitim +gitksan +gytling +gitonin +gitoxigenin +gitoxin +gytrash +gitter +gittern +gitterns +gittite +gittith +gyttja +giulio +giunta +giuseppe +giust +giustamente +giustina +giusto +give +gyve +giveable +giveaway +giveaways +gyved +givey +given +givenness +givens +giver +givers +gives +gyves +giveth +givin +giving +gyving +givingness +gizmo +gizmos +gizz +gizzard +gizzards +gizzen +gizzened +gizzern +gjedost +gjetost +gjetosts +gl +glabbella +glabella +glabellae +glabellar +glabellous +glabellum +glabrate +glabreity +glabrescent +glabriety +glabrous +glabrousness +glace +glaceed +glaceing +glaces +glaciable +glacial +glacialism +glacialist +glacialize +glacially +glaciaria +glaciarium +glaciate +glaciated +glaciates +glaciating +glaciation +glacier +glaciered +glacieret +glacierist +glaciers +glacify +glacification +glacioaqueous +glaciolacustrine +glaciology +glaciologic +glaciological +glaciologist +glaciologists +glaciomarine +glaciometer +glacionatant +glacious +glacis +glacises +glack +glacon +glad +gladatorial +gladded +gladden +gladdened +gladdener +gladdening +gladdens +gladder +gladdest +gladdy +gladding +gladdon +glade +gladeye +gladelike +gladen +glades +gladful +gladfully +gladfulness +gladhearted +glady +gladiate +gladiator +gladiatory +gladiatorial +gladiatorism +gladiators +gladiatorship +gladiatrix +gladier +gladiest +gladify +gladii +gladiola +gladiolar +gladiolas +gladiole +gladioli +gladiolus +gladioluses +gladys +gladite +gladius +gladkaite +gladless +gladly +gladlier +gladliest +gladness +gladnesses +gladrags +glads +gladship +gladsome +gladsomely +gladsomeness +gladsomer +gladsomest +gladstone +gladstonian +gladstonianism +gladwin +glaga +glagah +glagol +glagolic +glagolitic +glagolitsa +glaieul +glaik +glaiket +glaiketness +glaikit +glaikitness +glaiks +glaymore +glair +glaire +glaired +glaireous +glaires +glairy +glairier +glairiest +glairin +glairiness +glairing +glairs +glaister +glaistig +glaive +glaived +glaives +glaizie +glaked +glaky +glali +glam +glamberry +glamor +glamorization +glamorizations +glamorize +glamorized +glamorizer +glamorizes +glamorizing +glamorous +glamorously +glamorousness +glamors +glamour +glamoured +glamoury +glamourie +glamouring +glamourization +glamourize +glamourizer +glamourless +glamourous +glamourously +glamourousness +glamours +glance +glanced +glancer +glances +glancing +glancingly +gland +glandaceous +glandarious +glander +glandered +glanderous +glanders +glandes +glandiferous +glandiform +glanditerous +glandless +glandlike +glands +glandula +glandular +glandularly +glandulation +glandule +glandules +glanduliferous +glanduliform +glanduligerous +glandulose +glandulosity +glandulous +glandulousness +glaniostomi +glanis +glans +glar +glare +glared +glareless +glareola +glareole +glareolidae +glareous +glareproof +glares +glareworm +glary +glarier +glariest +glarily +glariness +glaring +glaringly +glaringness +glarry +glaserian +glaserite +glasgow +glashan +glass +glassblower +glassblowers +glassblowing +glassed +glasseye +glassen +glasser +glasses +glassfish +glassful +glassfuls +glasshouse +glasshouses +glassy +glassie +glassier +glassies +glassiest +glassily +glassin +glassine +glassines +glassiness +glassing +glassite +glassless +glasslike +glasslikeness +glassmaker +glassmaking +glassman +glassmen +glassophone +glassrope +glassteel +glassware +glassweed +glasswork +glassworker +glassworkers +glassworking +glassworks +glassworm +glasswort +glastonbury +glaswegian +glathsheim +glathsheimr +glauber +glauberite +glaucescence +glaucescent +glaucic +glaucidium +glaucin +glaucine +glaucionetta +glaucium +glaucochroite +glaucodot +glaucodote +glaucolite +glaucoma +glaucomas +glaucomatous +glaucomys +glauconia +glauconiferous +glauconiidae +glauconite +glauconitic +glauconitization +glaucophane +glaucophanite +glaucophanization +glaucophanize +glaucophyllous +glaucopis +glaucosis +glaucosuria +glaucous +glaucously +glaucousness +glaucus +glauke +glaum +glaumrie +glaur +glaury +glaux +glave +glaver +glavered +glavering +glaze +glazed +glazement +glazen +glazer +glazers +glazes +glazework +glazy +glazier +glaziery +glazieries +glaziers +glaziest +glazily +glaziness +glazing +glazings +glb +gld +glead +gleam +gleamed +gleamy +gleamier +gleamiest +gleamily +gleaminess +gleaming +gleamingly +gleamless +gleams +glean +gleanable +gleaned +gleaner +gleaners +gleaning +gleanings +gleans +gleary +gleave +gleba +glebae +glebal +glebe +glebeless +glebes +gleby +glebous +glecoma +gled +glede +gledes +gledge +gledy +gleditsia +gleds +glee +gleed +gleeds +gleeful +gleefully +gleefulness +gleeishly +gleek +gleeked +gleeking +gleeks +gleemaiden +gleeman +gleemen +gleen +glees +gleesome +gleesomely +gleesomeness +gleet +gleeted +gleety +gleetier +gleetiest +gleeting +gleets +gleewoman +gleg +glegly +glegness +glegnesses +gley +gleyde +gleir +gleys +gleit +gleization +glen +glendale +glendover +glene +glengarry +glengarries +glenlike +glenlivet +glenn +glenohumeral +glenoid +glenoidal +glens +glent +glenwood +glessite +gletscher +gletty +glew +glia +gliadin +gliadine +gliadines +gliadins +glial +glib +glibber +glibbery +glibbest +glibly +glibness +glibnesses +glyc +glycaemia +glycaemic +glycan +glycans +glycemia +glycemic +glyceral +glyceraldehyde +glycerate +glyceria +glyceric +glyceride +glyceridic +glyceryl +glyceryls +glycerin +glycerinate +glycerinated +glycerinating +glycerination +glycerine +glycerinize +glycerins +glycerite +glycerize +glycerizin +glycerizine +glycerogel +glycerogelatin +glycerol +glycerolate +glycerole +glycerolyses +glycerolysis +glycerolize +glycerols +glycerophosphate +glycerophosphoric +glycerose +glyceroxide +glycic +glycid +glycide +glycidic +glycidol +glycyl +glycyls +glycin +glycine +glycines +glycinin +glycins +glycyphyllin +glycyrize +glycyrrhiza +glycyrrhizin +glick +glycocholate +glycocholic +glycocin +glycocoll +glycogelatin +glycogen +glycogenase +glycogenesis +glycogenetic +glycogeny +glycogenic +glycogenize +glycogenolysis +glycogenolytic +glycogenosis +glycogenous +glycogens +glycohaemia +glycohemia +glycol +glycolaldehyde +glycolate +glycolic +glycolide +glycolyl +glycolylurea +glycolipid +glycolipide +glycolipin +glycolipine +glycolysis +glycolytic +glycolytically +glycollate +glycollic +glycollide +glycols +glycoluric +glycoluril +glyconean +glyconeogenesis +glyconeogenetic +glyconian +glyconic +glyconics +glyconin +glycopeptide +glycopexia +glycopexis +glycoproteid +glycoprotein +glycosaemia +glycose +glycosemia +glycosidase +glycoside +glycosides +glycosidic +glycosidically +glycosyl +glycosyls +glycosin +glycosine +glycosuria +glycosuric +glycuresis +glycuronic +glycuronid +glycuronide +glidder +gliddery +glide +glided +glideless +glideness +glider +gliderport +gliders +glides +glidewort +gliding +glidingly +gliff +gliffy +gliffing +gliffs +glike +glykopectic +glykopexic +glim +glime +glimed +glimes +gliming +glimmer +glimmered +glimmery +glimmering +glimmeringly +glimmerings +glimmerite +glimmerous +glimmers +glimpse +glimpsed +glimpser +glimpsers +glimpses +glimpsing +glims +glyn +glink +glynn +glinse +glint +glinted +glinting +glints +gliocyte +glioma +gliomas +gliomata +gliomatous +gliosa +gliosis +glyoxal +glyoxalase +glyoxalic +glyoxalin +glyoxaline +glyoxyl +glyoxylic +glyoxilin +glyoxim +glyoxime +glyph +glyphic +glyphograph +glyphographer +glyphography +glyphographic +glyphs +glyptal +glyptic +glyptical +glyptician +glyptics +glyptodon +glyptodont +glyptodontidae +glyptodontoid +glyptograph +glyptographer +glyptography +glyptographic +glyptolith +glyptology +glyptological +glyptologist +glyptotheca +glyptotherium +glires +gliridae +gliriform +gliriformia +glirine +glis +glisk +glisky +gliss +glissade +glissaded +glissader +glissades +glissading +glissandi +glissando +glissandos +glissette +glist +glisten +glistened +glistening +glisteningly +glistens +glister +glyster +glistered +glistering +glisteringly +glisters +glitch +glitches +glitnir +glitter +glitterance +glittered +glittery +glittering +glitteringly +glitters +glittersome +glitzy +gloam +gloaming +gloamings +gloams +gloat +gloated +gloater +gloaters +gloating +gloatingly +gloats +glob +global +globalism +globalist +globalists +globality +globalization +globalize +globalized +globalizing +globally +globate +globated +globe +globed +globefish +globefishes +globeflower +globeholder +globelet +globelike +globes +globetrotter +globetrotters +globetrotting +globy +globical +globicephala +globiferous +globigerina +globigerinae +globigerinas +globigerine +globigerinidae +globin +globing +globins +globiocephalus +globoid +globoids +globose +globosely +globoseness +globosite +globosity +globosities +globosphaerite +globous +globously +globousness +globs +globular +globularia +globulariaceae +globulariaceous +globularity +globularly +globularness +globule +globules +globulet +globulicidal +globulicide +globuliferous +globuliform +globulimeter +globulin +globulins +globulinuria +globulysis +globulite +globulitic +globuloid +globulolysis +globulose +globulous +globulousness +globus +glochchidia +glochid +glochideous +glochidia +glochidial +glochidian +glochidiate +glochidium +glochids +glochines +glochis +glockenspiel +glockenspiels +glod +gloea +gloeal +gloeocapsa +gloeocapsoid +gloeosporiose +gloeosporium +glogg +gloggs +gloy +gloiopeltis +gloiosiphonia +gloiosiphoniaceae +glom +glome +glomeli +glomera +glomerate +glomeration +glomerella +glomeroporphyritic +glomerular +glomerulate +glomerule +glomeruli +glomerulitis +glomerulonephritis +glomerulose +glomerulus +glomi +glommed +glomming +glommox +gloms +glomus +glonoin +glonoine +glood +gloom +gloomed +gloomful +gloomfully +gloomy +gloomier +gloomiest +gloomily +gloominess +glooming +gloomingly +gloomings +gloomless +glooms +gloomth +glop +glopnen +gloppen +gloppy +glops +glor +glore +glory +gloria +gloriam +gloriana +glorias +gloriation +gloried +glories +gloriette +glorify +glorifiable +glorification +glorifications +glorified +glorifier +glorifiers +glorifies +glorifying +gloryful +glorying +gloryingly +gloryless +gloriole +glorioles +gloriosa +gloriosity +glorioso +glorious +gloriously +gloriousness +glos +gloss +glossa +glossae +glossagra +glossal +glossalgy +glossalgia +glossanthrax +glossary +glossarial +glossarially +glossarian +glossaries +glossarist +glossarize +glossas +glossata +glossate +glossator +glossatorial +glossectomy +glossectomies +glossed +glossem +glossematic +glossematics +glosseme +glossemes +glossemic +glosser +glossers +glosses +glossy +glossic +glossier +glossies +glossiest +glossily +glossina +glossinas +glossiness +glossing +glossingly +glossiphonia +glossiphonidae +glossist +glossitic +glossitis +glossless +glossmeter +glossocarcinoma +glossocele +glossocoma +glossocomium +glossocomon +glossodynamometer +glossodynia +glossoepiglottic +glossoepiglottidean +glossograph +glossographer +glossography +glossographical +glossohyal +glossoid +glossokinesthetic +glossolabial +glossolabiolaryngeal +glossolabiopharyngeal +glossolaly +glossolalia +glossolalist +glossolaryngeal +glossolysis +glossology +glossological +glossologies +glossologist +glossoncus +glossopalatine +glossopalatinus +glossopathy +glossopetra +glossophaga +glossophagine +glossopharyngeal +glossopharyngeus +glossophytia +glossophobia +glossophora +glossophorous +glossopyrosis +glossoplasty +glossoplegia +glossopode +glossopodium +glossopteris +glossoptosis +glossorrhaphy +glossoscopy +glossoscopia +glossospasm +glossosteresis +glossotherium +glossotype +glossotomy +glossotomies +glost +glosts +glottal +glottalite +glottalization +glottalize +glottalized +glottalizing +glottic +glottid +glottidean +glottides +glottis +glottiscope +glottises +glottitis +glottochronology +glottochronological +glottogony +glottogonic +glottogonist +glottology +glottologic +glottological +glottologies +glottologist +glotum +gloucester +glout +glouted +glouting +glouts +glove +gloved +glovey +gloveless +glovelike +glovemaker +glovemaking +gloveman +glovemen +glover +gloveress +glovers +gloves +gloving +glow +glowbard +glowbird +glowed +glower +glowered +glowerer +glowering +gloweringly +glowers +glowfly +glowflies +glowing +glowingly +glows +glowworm +glowworms +gloxinia +gloxinias +gloze +glozed +glozer +glozes +glozing +glozingly +glt +glub +glucaemia +glucagon +glucagons +glucase +glucate +glucemia +glucic +glucid +glucide +glucidic +glucina +glucine +glucinic +glucinium +glucinum +glucinums +gluck +glucke +glucocorticoid +glucocorticord +glucofrangulin +glucogene +glucogenesis +glucogenic +glucokinase +glucokinin +glucolipid +glucolipide +glucolipin +glucolipine +glucolysis +gluconate +gluconeogenesis +gluconeogenetic +gluconeogenic +gluconokinase +glucoprotein +glucosaemia +glucosamine +glucosan +glucosane +glucosazone +glucose +glucosemia +glucoses +glucosic +glucosid +glucosidal +glucosidase +glucoside +glucosidic +glucosidically +glucosin +glucosine +glucosone +glucosulfone +glucosuria +glucosuric +glucuronic +glucuronidase +glucuronide +glue +glued +gluey +glueyness +glueing +gluelike +gluelikeness +gluemaker +gluemaking +glueman +gluepot +gluer +gluers +glues +glug +glugglug +gluhwein +gluier +gluiest +gluily +gluiness +gluing +gluish +gluishness +glum +gluma +glumaceae +glumaceous +glumal +glumales +glume +glumelike +glumella +glumes +glumiferous +glumiflorae +glumly +glummer +glummest +glummy +glumness +glumnesses +glumose +glumosity +glumous +glump +glumpy +glumpier +glumpiest +glumpily +glumpiness +glumpish +glunch +glunched +glunches +glunching +gluneamie +glunimie +gluon +glusid +gluside +glut +glutael +glutaeous +glutamate +glutamates +glutamic +glutaminase +glutamine +glutaminic +glutaraldehyde +glutaric +glutathione +glutch +gluteal +glutei +glutelin +glutelins +gluten +glutenin +glutenous +glutens +gluteofemoral +gluteoinguinal +gluteoperineal +glutetei +glutethimide +gluteus +glutimate +glutin +glutinant +glutinate +glutination +glutinative +glutinize +glutinose +glutinosity +glutinous +glutinously +glutinousness +glutition +glutoid +glutose +gluts +glutted +gluttei +glutter +gluttery +glutting +gluttingly +glutton +gluttoness +gluttony +gluttonies +gluttonise +gluttonised +gluttonish +gluttonising +gluttonism +gluttonize +gluttonized +gluttonizing +gluttonous +gluttonously +gluttonousness +gluttons +gm +gmelina +gmelinite +gn +gnabble +gnaeus +gnamma +gnaphalioid +gnaphalium +gnapweed +gnar +gnarl +gnarled +gnarly +gnarlier +gnarliest +gnarliness +gnarling +gnarls +gnarr +gnarred +gnarring +gnarrs +gnars +gnash +gnashed +gnashes +gnashing +gnashingly +gnast +gnat +gnatcatcher +gnateater +gnatflower +gnathal +gnathalgia +gnathic +gnathidium +gnathion +gnathions +gnathism +gnathite +gnathites +gnathitis +gnatho +gnathobase +gnathobasic +gnathobdellae +gnathobdellida +gnathometer +gnathonic +gnathonical +gnathonically +gnathonism +gnathonize +gnathophorous +gnathoplasty +gnathopod +gnathopoda +gnathopodite +gnathopodous +gnathostegite +gnathostoma +gnathostomata +gnathostomatous +gnathostome +gnathostomi +gnathostomous +gnathotheca +gnatlike +gnatling +gnatoo +gnatproof +gnats +gnatsnap +gnatsnapper +gnatter +gnatty +gnattier +gnattiest +gnatworm +gnaw +gnawable +gnawed +gnawer +gnawers +gnawing +gnawingly +gnawings +gnawn +gnaws +gneiss +gneisses +gneissy +gneissic +gneissitic +gneissoid +gneissose +gnessic +gnetaceae +gnetaceous +gnetales +gnetum +gnetums +gneu +gnide +gnocchetti +gnocchi +gnoff +gnome +gnomed +gnomelike +gnomes +gnomesque +gnomic +gnomical +gnomically +gnomide +gnomish +gnomist +gnomists +gnomology +gnomologic +gnomological +gnomologist +gnomon +gnomonia +gnomoniaceae +gnomonic +gnomonical +gnomonics +gnomonology +gnomonological +gnomonologically +gnomons +gnoses +gnosiology +gnosiological +gnosis +gnostic +gnostical +gnostically +gnosticism +gnosticity +gnosticize +gnosticizer +gnostology +gnotobiology +gnotobiologies +gnotobiosis +gnotobiote +gnotobiotic +gnotobiotically +gnotobiotics +gnow +gns +gnu +gnus +go +goa +goad +goaded +goading +goadlike +goads +goadsman +goadster +goaf +goajiro +goal +goala +goalage +goaled +goalee +goaler +goalers +goalie +goalies +goaling +goalkeeper +goalkeepers +goalkeeping +goalless +goalmouth +goalpost +goalposts +goals +goaltender +goaltenders +goaltending +goan +goanese +goanna +goar +goas +goasila +goat +goatbeard +goatbrush +goatbush +goatee +goateed +goatees +goatfish +goatfishes +goatherd +goatherdess +goatherds +goaty +goatish +goatishly +goatishness +goatland +goatly +goatlike +goatling +goatpox +goatroot +goats +goatsbane +goatsbeard +goatsfoot +goatskin +goatskins +goatstone +goatsucker +goatweed +goave +goaves +gob +goback +goban +gobang +gobangs +gobans +gobbe +gobbed +gobber +gobbet +gobbets +gobby +gobbin +gobbing +gobble +gobbled +gobbledegook +gobbledygook +gobbler +gobblers +gobbles +gobbling +gobelin +gobemouche +gobernadora +gobet +gobi +goby +gobia +gobian +gobies +gobiesocid +gobiesocidae +gobiesociform +gobiesox +gobiid +gobiidae +gobiiform +gobiiformes +gobylike +gobinism +gobinist +gobio +gobioid +gobioidea +gobioidei +gobioids +goblet +gobleted +gobletful +goblets +goblin +gobline +goblinesque +goblinish +goblinism +goblinize +goblinry +goblins +gobmouthed +gobo +goboes +gobonated +gobonee +gobony +gobos +gobs +gobstick +gobstopper +goburra +gocart +goclenian +god +godawful +godchild +godchildren +goddam +goddammed +goddamming +goddammit +goddamn +goddamndest +goddamned +goddamnedest +goddamning +goddamnit +goddamns +goddams +goddard +goddaughter +goddaughters +godded +goddess +goddesses +goddesshood +goddessship +goddikin +godding +goddize +gode +godelich +godendag +godet +godetia +godfather +godfatherhood +godfathers +godfathership +godforsaken +godfrey +godful +godhead +godheads +godhood +godhoods +godiva +godkin +godless +godlessly +godlessness +godlet +godly +godlier +godliest +godlike +godlikeness +godlily +godliness +godling +godlings +godmaker +godmaking +godmamma +godmother +godmotherhood +godmothers +godmothership +godown +godowns +godpapa +godparent +godparents +godroon +godroons +gods +godsake +godsend +godsends +godsent +godship +godships +godsib +godson +godsons +godsonship +godspeed +godward +godwin +godwinian +godwit +godwits +goebbels +goeduck +goel +goelism +goemagot +goemot +goen +goer +goers +goes +goetae +goethe +goethian +goethite +goethites +goety +goetia +goetic +goetical +gofer +gofers +goff +goffer +goffered +gofferer +goffering +goffers +goffle +gog +gogetting +gogga +goggan +goggle +gogglebox +goggled +goggler +gogglers +goggles +goggly +gogglier +goggliest +goggling +goglet +goglets +gogmagog +gogo +gogos +gohila +goi +goy +goiabada +goyana +goyazite +goidel +goidelic +goyetian +goyim +goyin +goyish +goyle +going +goings +gois +goys +goitcho +goiter +goitered +goiterogenic +goiters +goitral +goitre +goitres +goitrogen +goitrogenic +goitrogenicity +goitrous +gokuraku +gol +gola +golach +goladar +golandaas +golandause +golaseccan +golconda +golcondas +gold +goldang +goldanged +goldarn +goldarned +goldarnedest +goldarns +goldbeater +goldbeating +goldbird +goldbrick +goldbricker +goldbrickers +goldbricks +goldbug +goldbugs +goldcrest +goldcup +goldeye +goldeyes +golden +goldenback +goldeney +goldeneye +goldeneyes +goldener +goldenest +goldenfleece +goldenhair +goldenknop +goldenly +goldenlocks +goldenmouth +goldenmouthed +goldenness +goldenpert +goldenrod +goldenrods +goldenseal +goldentop +goldenwing +golder +goldest +goldfield +goldfielder +goldfields +goldfinch +goldfinches +goldfinny +goldfinnies +goldfish +goldfishes +goldflower +goldhammer +goldhead +goldi +goldy +goldic +goldie +goldilocks +goldylocks +goldin +golding +goldish +goldless +goldlike +goldminer +goldmist +goldney +goldonian +golds +goldseed +goldsinny +goldsmith +goldsmithery +goldsmithing +goldsmithry +goldsmiths +goldspink +goldstone +goldtail +goldthread +goldtit +goldurn +goldurned +goldurnedest +goldurns +goldwater +goldweed +goldwork +goldworker +golee +golem +golems +goles +golet +golf +golfdom +golfed +golfer +golfers +golfing +golfings +golfs +golgi +golgotha +golgothas +goli +goliad +goliard +goliardeys +goliardery +goliardic +goliards +goliath +goliathize +goliaths +golilla +golkakra +goll +golland +gollar +goller +golly +gollywobbler +golliwog +gollywog +golliwogg +golliwogs +gollop +golo +goloch +goloe +goloka +golosh +goloshes +golp +golpe +golundauze +goluptious +goma +gomari +gomarian +gomarist +gomarite +gomart +gomashta +gomasta +gomavel +gombay +gombeen +gombeenism +gombo +gombos +gombroon +gombroons +gome +gomeisa +gomer +gomeral +gomerals +gomerec +gomerel +gomerels +gomeril +gomerils +gomlah +gommelin +gommier +gomontia +gomorrah +gomorrean +gomorrhean +gomphiasis +gomphocarpus +gomphodont +gompholobium +gomphoses +gomphosis +gomphrena +gomukhi +gomuti +gomutis +gon +gona +gonad +gonadal +gonadectomy +gonadectomies +gonadectomized +gonadectomizing +gonadial +gonadic +gonadotrope +gonadotrophic +gonadotrophin +gonadotropic +gonadotropin +gonads +gonaduct +gonagia +gonagra +gonake +gonakie +gonal +gonalgia +gonangia +gonangial +gonangium +gonangiums +gonapod +gonapophysal +gonapophysial +gonapophysis +gonarthritis +goncalo +gond +gondang +gondi +gondite +gondola +gondolas +gondolet +gondoletta +gondolier +gondoliere +gondoliers +gone +goney +goneness +gonenesses +goneoclinic +gonepoiesis +gonepoietic +goner +goneril +goners +gonesome +gonfalcon +gonfalon +gonfalonier +gonfalonierate +gonfaloniership +gonfalons +gonfanon +gonfanons +gong +gonged +gonging +gonglike +gongman +gongoresque +gongorism +gongorist +gongoristic +gongs +gony +gonia +goniac +gonial +goniale +gonyalgia +goniaster +goniatite +goniatites +goniatitic +goniatitid +goniatitidae +goniatitoid +gonyaulax +gonycampsis +gonid +gonidangium +gonydeal +gonidia +gonidial +gonydial +gonidic +gonidiferous +gonidiogenous +gonidioid +gonidiophore +gonidiose +gonidiospore +gonidium +gonif +gonifs +gonimic +gonimium +gonimoblast +gonimolobe +gonimous +goninidia +gonyocele +goniocraniometry +goniodoridae +goniodorididae +goniodoris +goniometer +goniometry +goniometric +goniometrical +goniometrically +gonion +gonyoncus +gonionia +goniopholidae +goniopholis +goniostat +goniotheca +goniotropous +gonys +gonystylaceae +gonystylaceous +gonystylus +gonytheca +gonitis +gonium +goniums +goniunia +gonk +gonna +gonnardite +gonne +gonoblast +gonoblastic +gonoblastidial +gonoblastidium +gonocalycine +gonocalyx +gonocheme +gonochorism +gonochorismal +gonochorismus +gonochoristic +gonocyte +gonocytes +gonococcal +gonococci +gonococcic +gonococcocci +gonococcoid +gonococcus +gonocoel +gonocoele +gonoecium +gonof +gonofs +gonogenesis +gonolobus +gonomere +gonomery +gonoph +gonophore +gonophoric +gonophorous +gonophs +gonoplasm +gonopod +gonopodia +gonopodial +gonopodium +gonopodpodia +gonopoietic +gonopore +gonopores +gonorrhea +gonorrheal +gonorrheic +gonorrhoea +gonorrhoeal +gonorrhoeic +gonosomal +gonosome +gonosphere +gonostyle +gonotheca +gonothecae +gonothecal +gonotyl +gonotype +gonotocont +gonotokont +gonotome +gonozooid +gonzalo +gonzo +goo +goober +goobers +good +goodby +goodbye +goodbyes +goodbys +goodenia +goodeniaceae +goodeniaceous +goodenoviaceae +gooder +gooders +goodhap +goodhearted +goodheartedly +goodheartedness +goodhumoredness +goody +goodie +goodyear +goodyera +goodies +goodyish +goodyism +goodyness +gooding +goodish +goodyship +goodishness +goodless +goodly +goodlier +goodliest +goodlihead +goodlike +goodliness +goodman +goodmanship +goodmen +goodnaturedness +goodness +goodnesses +goodnight +goodrich +goods +goodship +goodsire +goodsome +goodtemperedness +goodwife +goodwily +goodwilies +goodwill +goodwilled +goodwilly +goodwillie +goodwillies +goodwillit +goodwills +goodwives +gooey +goof +goofah +goofball +goofballs +goofed +goofer +goofy +goofier +goofiest +goofily +goofiness +goofing +goofs +goog +googly +googlies +googol +googolplex +googols +googul +gooier +gooiest +gook +gooky +gooks +gool +goolah +goolde +gools +gooma +goombay +goon +goonch +goonda +goondie +gooney +gooneys +goony +goonie +goonies +goons +goop +goopy +goops +gooral +goorals +gooranut +gooroo +goos +goosander +goose +goosebeak +gooseberry +gooseberries +goosebill +goosebird +gooseboy +goosebone +goosecap +goosed +goosefish +goosefishes +gooseflesh +gooseflower +goosefoot +goosefoots +goosegirl +goosegog +goosegrass +gooseherd +goosehouse +goosey +gooselike +gooseliver +goosemouth +gooseneck +goosenecked +goosepimply +goosery +gooseries +gooserumped +gooses +gooseskin +goosetongue +gooseweed +goosewing +goosewinged +goosy +goosier +goosiest +goosing +goosish +goosishly +goosishness +gootee +goozle +gopak +gopher +gopherberry +gopherberries +gopherman +gopherroot +gophers +gopherwood +gopura +gor +gora +goracco +goral +goralog +gorals +goran +gorb +gorbal +gorbelly +gorbellied +gorbellies +gorbet +gorbit +gorble +gorblimey +gorblimy +gorblin +gorce +gorcock +gorcocks +gorcrow +gordiacea +gordiacean +gordiaceous +gordyaean +gordian +gordiid +gordiidae +gordioid +gordioidea +gordius +gordolobo +gordon +gordonia +gordunite +gore +gorebill +gored +gorefish +gorer +gores +gorevan +gorfly +gorge +gorgeable +gorged +gorgedly +gorgelet +gorgeous +gorgeously +gorgeousness +gorger +gorgeret +gorgerin +gorgerins +gorgers +gorges +gorget +gorgeted +gorgets +gorgia +gorging +gorgio +gorglin +gorgon +gorgonacea +gorgonacean +gorgonaceous +gorgoneia +gorgoneion +gorgoneioneia +gorgonesque +gorgoneum +gorgonia +gorgoniacea +gorgoniacean +gorgoniaceous +gorgonian +gorgonin +gorgonise +gorgonised +gorgonising +gorgonize +gorgonized +gorgonizing +gorgonlike +gorgons +gorgonzola +gorgosaurus +gorhen +gorhens +gory +goric +gorier +goriest +gorily +gorilla +gorillalike +gorillas +gorillaship +gorillian +gorilline +gorilloid +goriness +gorinesses +goring +gorkhali +gorki +gorkiesque +gorkun +gorlin +gorling +gorlois +gorman +gormand +gormandise +gormandised +gormandiser +gormandising +gormandism +gormandize +gormandized +gormandizer +gormandizers +gormandizes +gormandizing +gormands +gormaw +gormed +gormless +gorra +gorraf +gorrel +gorry +gorse +gorsebird +gorsechat +gorsedd +gorsehatch +gorses +gorsy +gorsier +gorsiest +gorst +gortonian +gortonite +gos +gosain +goschen +goschens +gosh +goshawful +goshawk +goshawks +goshdarn +goshen +goshenite +goslarite +goslet +gosling +goslings +gosmore +gospel +gospeler +gospelers +gospelist +gospelize +gospeller +gospelly +gospellike +gospelmonger +gospels +gospelwards +gosplan +gospoda +gospodar +gospodin +gospodipoda +gosport +gosports +goss +gossamer +gossamered +gossamery +gossameriness +gossamers +gossampine +gossan +gossaniferous +gossans +gossard +gossep +gossy +gossip +gossipdom +gossiped +gossipee +gossiper +gossipers +gossiphood +gossipy +gossypin +gossypine +gossipiness +gossiping +gossipingly +gossypium +gossipmonger +gossipmongering +gossypol +gossypols +gossypose +gossipped +gossipper +gossipping +gossipred +gossipry +gossipries +gossips +gossoon +gossoons +goster +gosther +got +gotch +gotched +gotchy +gote +goter +goth +gotha +gotham +gothamite +gothic +gothically +gothicism +gothicist +gothicity +gothicize +gothicizer +gothicness +gothics +gothish +gothism +gothite +gothites +gothlander +gothonic +goths +gotiglacial +goto +gotos +gotra +gotraja +gotta +gotten +gottfried +gottlieb +gou +gouache +gouaches +gouaree +gouda +goudy +gouge +gouged +gouger +gougers +gouges +gouging +gougingly +goujay +goujat +goujon +goujons +goulan +goularo +goulash +goulashes +gouldian +goumi +goumier +gounau +goundou +goup +goupen +goupin +gour +goura +gourami +gouramis +gourd +gourde +gourded +gourdes +gourdful +gourdhead +gourdy +gourdiness +gourding +gourdlike +gourds +gourdworm +goury +gourinae +gourmand +gourmander +gourmanderie +gourmandise +gourmandism +gourmandize +gourmandizer +gourmands +gourmet +gourmetism +gourmets +gournard +gourounut +gousty +goustie +goustrous +gout +gouter +gouty +goutier +goutiest +goutify +goutily +goutiness +goutish +gouts +goutte +goutweed +goutwort +gouvernante +gouvernantes +gov +gove +govern +governability +governable +governableness +governably +governail +governance +governante +governed +governeress +governess +governessdom +governesses +governesshood +governessy +governing +governingly +governless +government +governmental +governmentalism +governmentalist +governmentalize +governmentally +governmentish +governments +governor +governorate +governors +governorship +governorships +governs +govt +gowan +gowaned +gowany +gowans +gowd +gowdy +gowdie +gowdnie +gowdnook +gowds +gowf +gowfer +gowiddie +gowk +gowked +gowkedly +gowkedness +gowkit +gowks +gowl +gowlan +gowland +gown +gowned +gowning +gownlet +gowns +gownsman +gownsmen +gowpen +gowpin +gox +goxes +gozell +gozill +gozzan +gozzard +gp +gpad +gpcd +gpd +gph +gpm +gps +gpss +gr +gra +graafian +graal +graals +grab +grabbable +grabbed +grabber +grabbers +grabby +grabbier +grabbiest +grabbing +grabbings +grabble +grabbled +grabbler +grabblers +grabbles +grabbling +grabbots +graben +grabens +grabhook +grabman +grabouche +grabs +grace +graced +graceful +gracefuller +gracefullest +gracefully +gracefulness +graceless +gracelessly +gracelessness +gracelike +gracer +graces +gracy +gracias +gracilaria +gracilariid +gracilariidae +gracile +gracileness +graciles +gracilescent +gracilis +gracility +gracing +graciosity +gracioso +graciosos +gracious +graciously +graciousness +grackle +grackles +graculus +grad +gradable +gradal +gradate +gradated +gradates +gradatim +gradating +gradation +gradational +gradationally +gradationately +gradations +gradative +gradatively +gradatory +graddan +grade +graded +gradefinder +gradeless +gradely +grademark +grader +graders +grades +gradgrind +gradgrindian +gradgrindish +gradgrindism +gradient +gradienter +gradientia +gradients +gradin +gradine +gradines +grading +gradings +gradino +gradins +gradiometer +gradiometric +gradometer +grads +gradual +graduale +gradualism +gradualist +gradualistic +graduality +gradually +gradualness +graduals +graduand +graduands +graduate +graduated +graduates +graduateship +graduatical +graduating +graduation +graduations +graduator +graduators +gradus +graduses +graeae +graecian +graecism +graecize +graecized +graecizes +graecizing +graecomania +graecophil +graeculus +graeme +graf +graff +graffage +graffer +graffias +graffiti +graffito +grafship +graft +graftage +graftages +graftdom +grafted +grafter +grafters +grafting +graftonite +graftproof +grafts +grager +gragers +graham +grahamism +grahamite +grahams +gray +graian +grayback +graybacks +graybeard +graybearded +graybeards +graycoat +grayed +grayer +grayest +grayfish +grayfishes +grayfly +grayhair +grayhead +grayhound +graying +grayish +grayishness +grail +graylag +graylags +grailer +grayly +grailing +grayling +graylings +graille +grails +graymalkin +graymill +grain +grainage +graine +grained +grainedness +grainer +grainery +grainering +grainers +grayness +graynesses +grainfield +grainy +grainier +grainiest +graininess +graining +grainland +grainless +grainman +grains +grainsick +grainsickness +grainsman +grainsmen +grainways +grayout +grayouts +graip +graypate +grays +graysby +graysbies +graisse +graith +graithly +graywacke +graywall +grayware +graywether +grakle +grallae +grallatores +grallatory +grallatorial +grallic +grallina +gralline +gralloch +gram +grama +gramaphone +gramary +gramarye +gramaries +gramaryes +gramas +gramash +gramashes +grame +gramenite +gramercy +gramercies +gramy +gramicidin +graminaceae +graminaceous +gramineae +gramineal +gramineous +gramineousness +graminicolous +graminiferous +graminifolious +graminiform +graminin +graminivore +graminivorous +graminology +graminological +graminous +gramma +grammalogue +grammar +grammarian +grammarianism +grammarians +grammarless +grammars +grammates +grammatic +grammatical +grammaticality +grammatically +grammaticalness +grammaticaster +grammatication +grammaticism +grammaticize +grammatics +grammatist +grammatistical +grammatite +grammatolator +grammatolatry +grammatology +grammatophyllum +gramme +grammel +grammes +grammy +grammies +grammontine +gramoches +gramophone +gramophones +gramophonic +gramophonical +gramophonically +gramophonist +gramp +grampa +gramper +gramps +grampus +grampuses +grams +grana +granada +granadilla +granadillo +granadine +granado +granage +granam +granary +granaries +granat +granate +granatite +granatum +granch +grand +grandad +grandada +grandaddy +grandads +grandam +grandame +grandames +grandams +grandaunt +grandaunts +grandbaby +grandchild +grandchildren +granddad +granddada +granddaddy +granddaddies +granddads +granddam +granddaughter +granddaughterly +granddaughters +grande +grandee +grandeeism +grandees +grandeeship +grander +grandesque +grandest +grandeur +grandeurs +grandeval +grandevity +grandevous +grandeza +grandezza +grandfather +grandfatherhood +grandfatherish +grandfatherless +grandfatherly +grandfathers +grandfathership +grandfer +grandfilial +grandgore +grandiflora +grandiloquence +grandiloquent +grandiloquently +grandiloquous +grandiose +grandiosely +grandioseness +grandiosity +grandioso +grandisonant +grandisonian +grandisonianism +grandisonous +grandity +grandly +grandma +grandmama +grandmamma +grandmammy +grandmas +grandmaster +grandmaternal +grandmontine +grandmother +grandmotherhood +grandmotherism +grandmotherly +grandmotherliness +grandmothers +grandnephew +grandnephews +grandness +grandniece +grandnieces +grando +grandpa +grandpap +grandpapa +grandpappy +grandparent +grandparentage +grandparental +grandparenthood +grandparents +grandpas +grandpaternal +grandrelle +grands +grandsir +grandsire +grandsirs +grandson +grandsons +grandsonship +grandstand +grandstanded +grandstander +grandstanding +grandstands +grandtotal +granduncle +granduncles +grane +granes +granet +grange +granger +grangerisation +grangerise +grangerised +grangeriser +grangerising +grangerism +grangerite +grangerization +grangerize +grangerized +grangerizer +grangerizing +grangers +granges +grangousier +graniferous +graniform +granilla +granita +granite +granitelike +granites +graniteware +granitic +granitical +graniticoline +granitiferous +granitification +granitiform +granitite +granitization +granitize +granitized +granitizing +granitoid +granitoidal +granivore +granivorous +granjeno +grank +granma +grannam +granny +grannybush +grannie +grannies +grannyknot +grannom +grano +granoblastic +granodiorite +granodioritic +granogabbro +granola +granolite +granolith +granolithic +granomerite +granophyre +granophyric +granose +granospherite +grant +grantable +granted +grantedly +grantee +grantees +granter +granters +granth +grantha +granthi +grantia +grantiidae +granting +grantor +grantors +grants +grantsman +grantsmanship +grantsmen +granula +granular +granulary +granularity +granularly +granulate +granulated +granulater +granulates +granulating +granulation +granulations +granulative +granulator +granulators +granule +granules +granulet +granuliferous +granuliform +granulite +granulitic +granulitis +granulitization +granulitize +granulization +granulize +granuloadipose +granuloblast +granuloblastic +granulocyte +granulocytic +granulocytopoiesis +granuloma +granulomas +granulomata +granulomatosis +granulomatous +granulometric +granulosa +granulose +granulosis +granulous +granum +granville +granza +granzita +grape +graped +grapeflower +grapefruit +grapefruits +grapeful +grapey +grapeys +grapeless +grapelet +grapelike +grapeline +grapenuts +grapery +graperies +graperoot +grapes +grapeshot +grapeskin +grapestalk +grapestone +grapevine +grapevines +grapewise +grapewort +graph +graphalloy +graphanalysis +graphed +grapheme +graphemes +graphemic +graphemically +graphemics +graphy +graphic +graphical +graphically +graphicalness +graphicly +graphicness +graphics +graphidiaceae +graphing +graphiola +graphiology +graphiological +graphiologist +graphis +graphite +graphiter +graphites +graphitic +graphitizable +graphitization +graphitize +graphitized +graphitizing +graphitoid +graphitoidal +graphium +graphoanalytical +grapholite +graphology +graphologic +graphological +graphologies +graphologist +graphologists +graphomania +graphomaniac +graphomaniacal +graphometer +graphometry +graphometric +graphometrical +graphometrist +graphomotor +graphonomy +graphophobia +graphophone +graphophonic +graphorrhea +graphoscope +graphospasm +graphostatic +graphostatical +graphostatics +graphotype +graphotypic +graphs +grapy +grapier +grapiest +graping +graplin +grapline +graplines +graplins +grapnel +grapnels +grappa +grappas +grapple +grappled +grapplement +grappler +grapplers +grapples +grappling +grapsidae +grapsoid +grapsus +grapta +graptolite +graptolitha +graptolithida +graptolithina +graptolitic +graptolitoidea +graptoloidea +graptomancy +gras +grasni +grasp +graspable +grasped +grasper +graspers +grasping +graspingly +graspingness +graspless +grasps +grass +grassant +grassation +grassbird +grasschat +grasscut +grasscutter +grassed +grasseye +grasser +grasserie +grassers +grasses +grasset +grassfinch +grassfire +grassflat +grassflower +grasshook +grasshop +grasshopper +grasshopperdom +grasshopperish +grasshoppers +grasshouse +grassy +grassie +grassier +grassiest +grassily +grassiness +grassing +grassland +grasslands +grassless +grasslike +grassman +grassmen +grassnut +grassplat +grassplot +grassquit +grassroots +grasswards +grassweed +grasswidow +grasswidowhood +grasswork +grassworm +grat +grata +gratae +grate +grated +grateful +gratefuller +gratefullest +gratefully +gratefulness +grateless +gratelike +grateman +grater +graters +grates +gratewise +grather +gratia +gratiano +gratias +graticulate +graticulation +graticule +gratify +gratifiable +gratification +gratifications +gratified +gratifiedly +gratifier +gratifies +gratifying +gratifyingly +gratility +gratillity +gratin +gratinate +gratinated +gratinating +grating +gratingly +gratings +gratins +gratiola +gratiolin +gratiosolin +gratis +gratitude +grattage +gratten +gratters +grattoir +grattoirs +gratton +gratuitant +gratuity +gratuities +gratuito +gratuitous +gratuitously +gratuitousness +gratulant +gratulate +gratulated +gratulating +gratulation +gratulatory +gratulatorily +graunt +graupel +graupels +graustark +grauwacke +grav +gravamem +gravamen +gravamens +gravamina +gravaminous +gravat +gravata +grave +graveclod +gravecloth +graveclothes +graved +gravedigger +gravediggers +gravedo +gravegarth +graveyard +graveyards +gravel +graveldiver +graveled +graveless +gravely +gravelike +graveling +gravelish +gravelled +gravelly +gravelliness +gravelling +gravelous +gravelroot +gravels +gravelstone +gravelweed +gravemaker +gravemaking +graveman +gravemaster +graven +graveness +gravenstein +graveolence +graveolency +graveolent +graver +gravery +graverobber +graverobbing +gravers +graves +graveship +graveside +gravest +gravestead +gravestone +gravestones +gravette +graveward +gravewards +gravy +gravic +gravicembali +gravicembalo +gravicembalos +gravid +gravida +gravidae +gravidas +gravidate +gravidation +gravidity +gravidly +gravidness +graviers +gravies +gravific +gravigrada +gravigrade +gravilea +gravimeter +gravimeters +gravimetry +gravimetric +gravimetrical +gravimetrically +graving +gravipause +gravisphere +gravispheric +gravitate +gravitated +gravitater +gravitates +gravitating +gravitation +gravitational +gravitationally +gravitations +gravitative +gravity +gravitic +gravities +gravitometer +graviton +gravitons +gravure +gravures +grawls +grazable +graze +grazeable +grazed +grazer +grazers +grazes +grazie +grazier +grazierdom +graziery +graziers +grazing +grazingly +grazings +grazioso +gre +greable +greably +grease +greaseball +greasebush +greased +greasehorn +greaseless +greaselessness +greasepaint +greaseproof +greaseproofness +greaser +greasers +greases +greasewood +greasy +greasier +greasiest +greasily +greasiness +greasing +great +greatcoat +greatcoated +greatcoats +greaten +greatened +greatening +greatens +greater +greatest +greathead +greatheart +greathearted +greatheartedly +greatheartedness +greatish +greatly +greatmouthed +greatness +greats +greave +greaved +greaves +grebe +grebes +grebo +grecale +grece +grecian +grecianize +grecians +grecing +grecism +grecize +grecized +grecizes +grecizing +greco +grecomania +grecomaniac +grecophil +grecoue +grecque +gree +greece +greed +greedy +greedier +greediest +greedygut +greedyguts +greedily +greediness +greedless +greeds +greedsome +greegree +greegrees +greeing +greek +greekdom +greekery +greekess +greekish +greekism +greekist +greekize +greekless +greekling +greeks +green +greenable +greenage +greenalite +greenback +greenbacker +greenbackism +greenbacks +greenbark +greenbelt +greenboard +greenbone +greenbottle +greenbrier +greenbug +greenbugs +greenbul +greencloth +greencoat +greened +greeney +greener +greenery +greeneries +greenest +greenfinch +greenfish +greenfishes +greenfly +greenflies +greengage +greengill +greengrocer +greengrocery +greengroceries +greengrocers +greenhead +greenheaded +greenheart +greenhearted +greenhew +greenhide +greenhood +greenhorn +greenhornism +greenhorns +greenhouse +greenhouses +greeny +greenyard +greenier +greeniest +greening +greenings +greenish +greenishness +greenkeeper +greenkeeping +greenland +greenlander +greenlandic +greenlandish +greenlandite +greenlandman +greenleaf +greenleek +greenless +greenlet +greenlets +greenly +greenling +greenness +greenockite +greenovite +greenroom +greenrooms +greens +greensand +greensauce +greenshank +greensick +greensickness +greenside +greenskeeper +greenslade +greenstick +greenstone +greenstuff +greensward +greenswarded +greentail +greenth +greenths +greenthumbed +greenuk +greenware +greenwax +greenweed +greenwich +greenwing +greenwithe +greenwood +greenwoods +greenwort +grees +greesagh +greese +greeshoch +greet +greeted +greeter +greeters +greeting +greetingless +greetingly +greetings +greets +greeve +greffe +greffier +greffotome +greg +gregal +gregale +gregaloid +gregarian +gregarianism +gregarina +gregarinae +gregarinaria +gregarine +gregarinian +gregarinida +gregarinidal +gregariniform +gregarinina +gregarinoidea +gregarinosis +gregarinous +gregarious +gregariously +gregariousness +gregaritic +gregatim +gregau +grege +gregg +gregge +greggle +greggriffin +grego +gregor +gregory +gregorian +gregorianist +gregorianize +gregorianizer +gregos +grey +greyback +greybeard +greycoat +greyed +greyer +greyest +greyfish +greyfly +greyflies +greige +greiges +greyhen +greyhens +greyhound +greyhounds +greyiaceae +greying +greyish +greylag +greylags +greyly +greyling +greillade +grein +greyness +greynesses +greing +greypate +greys +greisen +greisens +greyskin +greystone +greit +greith +greywacke +greyware +greywether +greking +grelot +gremial +gremiale +gremials +gremio +gremlin +gremlins +gremmy +gremmie +gremmies +grenada +grenade +grenades +grenadian +grenadier +grenadierial +grenadierly +grenadiers +grenadiership +grenadilla +grenadin +grenadine +grenadines +grenado +grenat +grenatite +grendel +grene +grenelle +grenier +gres +gresil +gressible +gressoria +gressorial +gressorious +gret +greta +gretchen +grete +gretel +greund +grevillea +grew +grewhound +grewia +grewsome +grewsomely +grewsomeness +grewsomer +grewsomest +grewt +grex +grf +gry +gribane +gribble +gribbles +grice +grid +gridded +gridder +gridding +griddle +griddlecake +griddlecakes +griddled +griddler +griddles +griddling +gride +gryde +grided +gridelin +grides +griding +gridiron +gridirons +gridlock +grids +grieben +griece +grieced +griecep +grief +griefful +grieffully +griefless +grieflessness +griefs +griege +grieko +grieshoch +grieshuckle +grievable +grievance +grievances +grievant +grievants +grieve +grieved +grievedly +griever +grievers +grieves +grieveship +grieving +grievingly +grievous +grievously +grievousness +griff +griffade +griffado +griffaun +griffe +griffes +griffin +griffinage +griffinesque +griffinhood +griffinish +griffinism +griffins +griffith +griffithite +griffon +griffonage +griffonne +griffons +griffs +grift +grifted +grifter +grifters +grifting +grifts +grig +griggles +grignet +grigri +grigris +grigs +grihastha +grihyasutra +grike +grill +grillade +grilladed +grillades +grillading +grillage +grillages +grille +grylle +grilled +grillee +griller +grillers +grilles +grillework +grilly +grylli +gryllid +gryllidae +grilling +gryllos +gryllotalpa +grillroom +grills +gryllus +grillwork +grilse +grilses +grim +grimace +grimaced +grimacer +grimacers +grimaces +grimacier +grimacing +grimacingly +grimalkin +grime +grimed +grimes +grimful +grimgribber +grimy +grimier +grimiest +grimily +grimines +griminess +griming +grimly +grimliness +grimm +grimme +grimmer +grimmest +grimmia +grimmiaceae +grimmiaceous +grimmish +grimness +grimnesses +grimoire +grimp +grimsir +grimsire +grin +grinagog +grinch +grincome +grind +grindable +grindal +grinded +grindelia +grinder +grindery +grinderies +grinderman +grinders +grinding +grindingly +grindings +grindle +grinds +grindstone +grindstones +gringo +gringole +gringolee +gringophobia +gringos +grinned +grinnellia +grinner +grinners +grinny +grinnie +grinning +grinningly +grins +grint +grinter +grintern +griot +griots +griotte +grip +grypanian +gripe +grype +griped +gripeful +gripey +griper +gripers +gripes +gripgrass +griph +gryph +gryphaea +griphe +griphite +gryphite +gryphon +gryphons +griphosaurus +gryphosaurus +griphus +gripy +gripier +gripiest +griping +gripingly +gripless +gripman +gripmen +gripment +gryposis +grypotherium +grippal +grippe +gripped +grippelike +gripper +grippers +grippes +grippy +grippier +grippiest +grippiness +gripping +grippingly +grippingness +grippit +gripple +grippleness +grippotoxin +grips +gripsack +gripsacks +gript +griqua +griquaite +griqualander +gris +grisaille +grisailles +grisard +grisbet +grysbok +grise +griselda +griseofulvin +griseous +grisette +grisettes +grisettish +grisgris +griskin +griskins +grisled +grisly +grislier +grisliest +grisliness +grison +grisons +grisounite +grisoutine +grisping +grissel +grissen +grissens +grisset +grissons +grist +gristbite +grister +gristhorbia +gristy +gristle +gristles +gristly +gristlier +gristliest +gristliness +gristmill +gristmiller +gristmilling +grists +grit +grith +grithbreach +grithman +griths +gritless +gritrock +grits +gritstone +gritted +gritten +gritter +gritty +grittie +grittier +grittiest +grittily +grittiness +gritting +grittle +grivation +grivet +grivets +grivna +grivois +grivoise +grizard +grizel +grizelin +grizzel +grizzle +grizzled +grizzler +grizzlers +grizzles +grizzly +grizzlier +grizzlies +grizzliest +grizzlyman +grizzliness +grizzling +gro +groan +groaned +groaner +groaners +groanful +groaning +groaningly +groans +groat +groats +groatsworth +grobian +grobianism +grocer +grocerdom +groceress +grocery +groceries +groceryman +grocerymen +grocerly +grocers +grocerwise +groceteria +grockle +groenendael +groenlandicus +groff +grog +grogged +grogger +groggery +groggeries +groggy +groggier +groggiest +groggily +grogginess +grogging +grognard +grogram +grograms +grogs +grogshop +grogshops +groin +groyne +groined +groinery +groynes +groining +groins +grolier +grolieresque +groma +gromatic +gromatical +gromatics +gromet +gromia +gromil +gromyl +grommet +grommets +gromwell +gromwells +grond +grondwet +gront +groof +groom +groomed +groomer +groomers +groomy +grooming +groomish +groomishly +groomlet +groomling +grooms +groomsman +groomsmen +groop +grooper +groose +groot +grooty +groove +grooved +grooveless +groovelike +groover +grooverhead +groovers +grooves +groovy +groovier +grooviest +grooviness +grooving +groow +grope +groped +groper +gropers +gropes +groping +gropingly +gropple +groroilite +grorudite +gros +grosbeak +grosbeaks +groschen +groser +groset +grosgrain +grosgrained +grosgrains +gross +grossart +grosse +grossed +grossen +grosser +grossers +grosses +grossest +grosshead +grossierete +grossify +grossification +grossing +grossirete +grossly +grossness +grosso +grossulaceous +grossular +grossularia +grossulariaceae +grossulariaceous +grossularious +grossularite +grosz +groszy +grot +grote +groten +grotesco +grotesque +grotesquely +grotesqueness +grotesquery +grotesquerie +grotesqueries +grotesques +grothine +grothite +grotian +grotianism +grots +grottesco +grotty +grotto +grottoed +grottoes +grottolike +grottos +grottowork +grotzen +grouch +grouched +grouches +grouchy +grouchier +grouchiest +grouchily +grouchiness +grouching +grouchingly +groucho +grouf +grough +ground +groundable +groundably +groundage +groundberry +groundbird +groundbreaker +grounded +groundedly +groundedness +grounden +groundenell +grounder +grounders +groundflower +groundhog +groundy +grounding +groundkeeper +groundless +groundlessly +groundlessness +groundly +groundline +groundliness +groundling +groundlings +groundman +groundmass +groundneedle +groundnut +groundout +groundplot +grounds +groundsel +groundsheet +groundsill +groundskeep +groundskeeping +groundsman +groundspeed +groundswell +groundswells +groundway +groundwall +groundward +groundwards +groundwater +groundwave +groundwood +groundwork +group +groupable +groupage +groupageness +grouped +grouper +groupers +groupie +groupies +grouping +groupings +groupist +grouplet +groupment +groupoid +groupoids +groups +groupthink +groupwise +grouse +grouseberry +groused +grouseless +grouselike +grouser +grousers +grouses +grouseward +grousewards +grousy +grousing +grout +grouted +grouter +grouters +grouthead +grouty +groutier +groutiest +grouting +groutite +groutnoll +grouts +grouze +grove +groved +grovel +groveled +groveler +grovelers +groveless +groveling +grovelingly +grovelings +grovelled +groveller +grovelling +grovellingly +grovellings +grovels +grover +grovers +groves +grovet +grovy +grow +growable +growan +growed +grower +growers +growing +growingly +growingupness +growl +growled +growler +growlery +growleries +growlers +growly +growlier +growliest +growliness +growling +growlingly +growls +grown +grownup +grownups +grows +growse +growsome +growth +growthful +growthy +growthiness +growthless +growths +growze +grozart +grozer +grozet +grr +grs +grub +grubbed +grubber +grubbery +grubberies +grubbers +grubby +grubbier +grubbies +grubbiest +grubbily +grubbiness +grubbing +grubble +grubhood +grubless +grubroot +grubs +grubstake +grubstaked +grubstaker +grubstakes +grubstaking +grubstreet +grubworm +grubworms +grucche +grudge +grudged +grudgeful +grudgefully +grudgefulness +grudgekin +grudgeless +grudgeons +grudger +grudgery +grudgers +grudges +grudging +grudgingly +grudgingness +grudgment +grue +gruel +grueled +grueler +gruelers +grueling +gruelingly +gruelings +gruelled +grueller +gruellers +gruelly +gruelling +gruellings +gruels +grues +gruesome +gruesomely +gruesomeness +gruesomer +gruesomest +gruf +gruff +gruffed +gruffer +gruffest +gruffy +gruffier +gruffiest +gruffily +gruffiness +gruffing +gruffish +gruffly +gruffness +gruffs +gruft +grufted +grugous +grugru +grugrus +gruidae +gruyere +gruiform +gruiformes +gruine +gruis +gruys +grulla +grum +grumble +grumbled +grumbler +grumblers +grumbles +grumblesome +grumbletonian +grumbly +grumbling +grumblingly +grume +grumes +grumium +grumly +grummel +grummels +grummer +grummest +grummet +grummeter +grummets +grumness +grumose +grumous +grumousness +grump +grumped +grumph +grumphy +grumphie +grumphies +grumpy +grumpier +grumpiest +grumpily +grumpiness +grumping +grumpish +grumpishness +grumps +grun +grunch +grundel +grundy +grundified +grundyism +grundyist +grundyite +grundlov +grundsil +grunerite +gruneritization +grungy +grungier +grungiest +grunion +grunions +grunswel +grunt +grunted +grunter +grunters +grunth +grunting +gruntingly +gruntle +gruntled +gruntles +gruntling +grunts +grunzie +gruppetto +gruppo +grus +grush +grushie +grusian +grusinian +gruss +grutch +grutched +grutches +grutching +grutten +grx +gs +gt +gtc +gtd +gte +gteau +gthite +gtt +gu +guaba +guacacoa +guacamole +guachamaca +guacharo +guacharoes +guacharos +guachipilin +guacho +guacico +guacimo +guacin +guaco +guaconize +guacos +guadagnini +guadalcazarite +guadua +guageable +guaguanche +guaharibo +guahiban +guahibo +guahivo +guayaba +guayabera +guayaberas +guayabi +guayabo +guaiac +guayacan +guaiacol +guaiacolize +guaiacols +guaiaconic +guaiacs +guaiacum +guaiacums +guayaqui +guaiaretic +guaiasanol +guaican +guaycuru +guaycuruan +guaymie +guaiocum +guaiocums +guaiol +guayroto +guayule +guayules +guajillo +guajira +guajiras +guaka +gualaca +guam +guama +guamachil +guamuchil +guan +guana +guanabana +guanabano +guanaco +guanacos +guanay +guanayes +guanays +guanajuatite +guanamine +guanare +guanase +guanases +guanche +guaneide +guanethidine +guango +guanidin +guanidine +guanidins +guanidopropionic +guaniferous +guanyl +guanylic +guanin +guanine +guanines +guanins +guanize +guano +guanophore +guanos +guanosine +guans +guao +guapena +guapilla +guapinol +guaque +guar +guara +guarabu +guaracha +guarachas +guarache +guaraguao +guarana +guarand +guarani +guaranian +guaranies +guaranin +guaranine +guaranis +guarantee +guaranteed +guaranteeing +guaranteer +guaranteers +guarantees +guaranteeship +guaranteing +guaranty +guarantied +guaranties +guarantying +guarantine +guarantor +guarantors +guarantorship +guarapo +guarapucu +guaraunan +guarauno +guard +guardable +guardage +guardant +guardants +guarded +guardedly +guardedness +guardee +guardeen +guarder +guarders +guardfish +guardful +guardfully +guardhouse +guardhouses +guardian +guardiancy +guardianess +guardianless +guardianly +guardians +guardianship +guardianships +guarding +guardingly +guardless +guardlike +guardo +guardrail +guardrails +guardroom +guards +guardship +guardsman +guardsmen +guardstone +guarea +guary +guariba +guarico +guarinite +guarish +guarneri +guarnerius +guarnieri +guarrau +guarri +guars +guaruan +guasa +guastalline +guatambu +guatemala +guatemalan +guatemalans +guatemaltecan +guatibero +guativere +guato +guatoan +guatusan +guatuso +guauaenok +guava +guavaberry +guavas +guavina +guaxima +guaza +guazuma +guazuti +guazzo +gubat +gubbertush +gubbin +gubbings +gubbins +gubbo +guberla +gubernacula +gubernacular +gubernaculum +gubernance +gubernation +gubernative +gubernator +gubernatorial +gubernatrix +gubernia +guberniya +guck +gucked +gucki +gucks +gud +gudame +guddle +guddled +guddler +guddling +gude +gudebrother +gudefather +gudemother +gudes +gudesake +gudesakes +gudesire +gudewife +gudge +gudgeon +gudgeoned +gudgeoning +gudgeons +gudget +gudok +gudrun +gue +guebre +guebucu +guejarite +guelf +guelph +guelphic +guelphish +guelphism +guemal +guemul +guenepe +guenon +guenons +guepard +gueparde +guerdon +guerdonable +guerdoned +guerdoner +guerdoning +guerdonless +guerdons +guereba +guereza +guergal +guerickian +gueridon +gueridons +guerilla +guerillaism +guerillas +guerinet +guerison +guerite +guerites +guernsey +guernseyed +guernseys +guerre +guerrila +guerrilla +guerrillaism +guerrillas +guerrillaship +guesdism +guesdist +guess +guessable +guessed +guesser +guessers +guesses +guessing +guessingly +guessive +guesstimate +guesstimated +guesstimates +guesstimating +guesswork +guessworker +guest +guestchamber +guested +guesten +guester +guesthouse +guesthouses +guestimate +guestimated +guestimating +guesting +guestive +guestless +guestling +guestmaster +guests +guestship +guestwise +guetar +guetare +guetre +gufa +guff +guffaw +guffawed +guffawing +guffaws +guffer +guffy +guffin +guffs +gufought +gugal +guggle +guggled +guggles +gugglet +guggling +guglet +guglets +guglia +guglio +gugu +guha +guhayna +guhr +guy +guiac +guiana +guyana +guianan +guyandot +guianese +guib +guiba +guichet +guid +guidable +guidage +guidance +guidances +guide +guideboard +guidebook +guidebooky +guidebookish +guidebooks +guidecraft +guided +guideless +guideline +guidelines +guidepost +guideposts +guider +guideress +guiders +guidership +guides +guideship +guideway +guiding +guidingly +guidman +guido +guydom +guidon +guidonian +guidons +guids +guidsire +guidwife +guidwilly +guidwillie +guyed +guyer +guyers +guige +guignardia +guigne +guignol +guying +guijo +guilandina +guild +guilder +guilders +guildhall +guildic +guildite +guildry +guilds +guildship +guildsman +guildsmen +guile +guiled +guileful +guilefully +guilefulness +guileless +guilelessly +guilelessness +guiler +guilery +guiles +guilfat +guily +guyline +guiling +guillem +guillemet +guillemot +guillermo +guillevat +guilloche +guillochee +guillotinade +guillotine +guillotined +guillotinement +guillotiner +guillotines +guillotining +guillotinism +guillotinist +guilt +guiltful +guilty +guiltier +guiltiest +guiltily +guiltiness +guiltless +guiltlessly +guiltlessness +guilts +guiltsick +guimbard +guimpe +guimpes +guinde +guinea +guineaman +guinean +guineapig +guineas +guinevere +guinfo +guinness +guyot +guyots +guipure +guipures +guirlande +guiro +guys +guisard +guisards +guisarme +guise +guised +guiser +guises +guisian +guising +guitar +guitarfish +guitarfishes +guitarist +guitarists +guitarlike +guitars +guitermanite +guitguit +guytrash +guittonian +guywire +gujar +gujarati +gujerat +gujrati +gul +gula +gulae +gulaman +gulancha +guland +gulanganes +gular +gularis +gulas +gulash +gulch +gulches +guld +gulden +guldengroschen +guldens +gule +gules +gulf +gulfed +gulfy +gulfier +gulfiest +gulfing +gulflike +gulfs +gulfside +gulfwards +gulfweed +gulfweeds +gulgul +guly +gulinula +gulinulae +gulinular +gulist +gulix +gull +gullability +gullable +gullably +gullage +gullah +gulled +gulley +gulleys +guller +gullery +gulleries +gullet +gulleting +gullets +gully +gullibility +gullible +gullibly +gullied +gullies +gullygut +gullyhole +gullying +gulling +gullion +gullish +gullishly +gullishness +gulliver +gulllike +gulls +gulmohar +gulo +gulonic +gulose +gulosity +gulosities +gulp +gulped +gulper +gulpers +gulph +gulpy +gulpier +gulpiest +gulpin +gulping +gulpingly +gulps +gulravage +guls +gulsach +gult +gum +gumby +gumbo +gumboil +gumboils +gumbolike +gumboots +gumbos +gumbotil +gumbotils +gumchewer +gumdigger +gumdigging +gumdrop +gumdrops +gumfield +gumflower +gumhar +gumi +gumihan +gumlah +gumless +gumly +gumlike +gumlikeness +gumma +gummage +gummaker +gummaking +gummas +gummata +gummatous +gummed +gummer +gummers +gummy +gummic +gummier +gummiest +gummiferous +gumminess +gumming +gummite +gummites +gummose +gummoses +gummosis +gummosity +gummous +gump +gumpheon +gumphion +gumption +gumptionless +gumptions +gumptious +gumpus +gums +gumshield +gumshoe +gumshoed +gumshoeing +gumshoes +gumshoing +gumtree +gumtrees +gumweed +gumweeds +gumwood +gumwoods +gun +guna +gunarchy +gunate +gunated +gunating +gunation +gunbarrel +gunbearer +gunboat +gunboats +gunbright +gunbuilder +guncotton +gunda +gundalow +gundeck +gundelet +gundelow +gundi +gundy +gundie +gundygut +gundog +gundogs +gunebo +gunfight +gunfighter +gunfighters +gunfighting +gunfights +gunfire +gunfires +gunflint +gunflints +gunfought +gung +gunge +gunhouse +gunyah +gunyang +gunyeh +gunite +guniter +gunj +gunja +gunjah +gunk +gunkhole +gunkholed +gunkholing +gunky +gunks +gunl +gunlayer +gunlaying +gunless +gunline +gunlock +gunlocks +gunmaker +gunmaking +gunman +gunmanship +gunmen +gunmetal +gunmetals +gunnage +gunnar +gunne +gunned +gunnel +gunnels +gunnen +gunner +gunnera +gunneraceae +gunneress +gunnery +gunneries +gunners +gunnership +gunny +gunnies +gunning +gunnings +gunnysack +gunnysacks +gunnung +gunocracy +gunong +gunpaper +gunpapers +gunplay +gunplays +gunpoint +gunpoints +gunport +gunpowder +gunpowdery +gunpowderous +gunpower +gunrack +gunreach +gunroom +gunrooms +gunrunner +gunrunning +guns +gunsel +gunsels +gunship +gunships +gunshop +gunshot +gunshots +gunsling +gunslinger +gunslingers +gunslinging +gunsman +gunsmith +gunsmithery +gunsmithing +gunsmiths +gunster +gunstick +gunstock +gunstocker +gunstocking +gunstocks +gunstone +gunter +gunther +guntub +gunung +gunwale +gunwales +gunwhale +gunz +gunzian +gup +guppy +guppies +guptavidya +gur +guran +gurdfish +gurdy +gurdle +gurdwara +gurge +gurged +gurgeon +gurgeons +gurges +gurging +gurgitation +gurgle +gurgled +gurgles +gurglet +gurglets +gurgly +gurgling +gurglingly +gurgoyl +gurgoyle +gurgulation +gurgulio +gurian +guric +gurish +gurjan +gurjara +gurjun +gurk +gurkha +gurl +gurle +gurlet +gurly +gurmukhi +gurnard +gurnards +gurney +gurneyite +gurneys +gurnet +gurnets +gurnetty +gurniad +gurr +gurrah +gurry +gurries +gursh +gurshes +gurt +gurts +guru +gurus +guruship +guruships +gus +gusain +guser +guserid +gush +gushed +gusher +gushers +gushes +gushet +gushy +gushier +gushiest +gushily +gushiness +gushing +gushingly +gushingness +gusla +gusle +guslee +guss +gusset +gusseted +gusseting +gussets +gussy +gussie +gussied +gussies +gussying +gust +gustable +gustables +gustard +gustation +gustative +gustativeness +gustatory +gustatorial +gustatorially +gustatorily +gustavus +gusted +gustful +gustfully +gustfulness +gusty +gustier +gustiest +gustily +gustiness +gusting +gustless +gusto +gustoes +gustoish +gustoso +gusts +gustus +gut +gutbucket +guti +gutierrez +gutium +gutless +gutlessness +gutlike +gutling +gutnic +gutnish +guts +gutser +gutsy +gutsier +gutsiest +gutsily +gutsiness +gutt +gutta +guttable +guttae +guttar +guttate +guttated +guttatim +guttation +gutte +gutted +guttee +gutter +guttera +gutteral +gutterblood +guttered +guttery +guttering +gutterize +gutterlike +gutterling +gutterman +gutters +guttersnipe +guttersnipes +guttersnipish +gutterspout +gutterwise +gutti +gutty +guttide +guttie +guttier +guttiest +guttifer +guttiferae +guttiferal +guttiferales +guttiferous +guttiform +guttiness +gutting +guttle +guttled +guttler +guttlers +guttles +guttling +guttula +guttulae +guttular +guttulate +guttule +guttulous +guttur +guttural +gutturalisation +gutturalise +gutturalised +gutturalising +gutturalism +gutturality +gutturalization +gutturalize +gutturalized +gutturalizing +gutturally +gutturalness +gutturals +gutturine +gutturize +gutturonasal +gutturopalatal +gutturopalatine +gutturotetany +guttus +gutweed +gutwise +gutwort +guv +guvacine +guvacoline +guz +guze +guzerat +guzmania +guzul +guzzle +guzzled +guzzledom +guzzler +guzzlers +guzzles +guzzling +gv +gwag +gwantus +gweduc +gweduck +gweducks +gweducs +gweed +gweeon +gwely +gwen +gwendolen +gwerziou +gwine +gwiniad +gwyniad +h +ha +haab +haaf +haafs +haak +haar +haars +hab +habab +habaera +habakkuk +habanera +habaneras +habbe +habble +habbub +habdalah +habdalahs +habe +habeas +habena +habenal +habenar +habenaria +habendum +habenula +habenulae +habenular +haberdash +haberdasher +haberdasheress +haberdashery +haberdasheries +haberdashers +haberdine +habere +habergeon +habet +habilable +habilant +habilatory +habile +habilement +habiliment +habilimental +habilimentary +habilimentation +habilimented +habiliments +habilitate +habilitated +habilitating +habilitation +habilitator +hability +habille +habiri +habiru +habit +habitability +habitable +habitableness +habitably +habitacle +habitacule +habitally +habitan +habitance +habitancy +habitancies +habitans +habitant +habitants +habitat +habitatal +habitate +habitatio +habitation +habitational +habitations +habitative +habitator +habitats +habited +habiting +habits +habitual +habituality +habitualize +habitually +habitualness +habituate +habituated +habituates +habituating +habituation +habituations +habitude +habitudes +habitudinal +habitue +habitues +habiture +habitus +hable +habnab +haboob +haboub +habronema +habronemiasis +habronemic +habrowne +habsburg +habu +habub +habuka +habus +habutae +habutai +habutaye +haccucal +hacek +haceks +hacendado +hache +hachiman +hachis +hachment +hacht +hachure +hachured +hachures +hachuring +hacienda +haciendado +haciendas +hack +hackamatak +hackamore +hackbarrow +hackberry +hackberries +hackbolt +hackbush +hackbut +hackbuteer +hackbuts +hackbutter +hackdriver +hacked +hackee +hackeem +hackees +hackeymal +hacker +hackery +hackeries +hackers +hacky +hackia +hackie +hackies +hackin +hacking +hackingly +hackle +hackleback +hackled +hackler +hacklers +hackles +hacklet +hackly +hacklier +hackliest +hackling +hacklog +hackmack +hackmall +hackman +hackmatack +hackmen +hackney +hackneyed +hackneyedly +hackneyedness +hackneyer +hackneying +hackneyism +hackneyman +hackneys +hacks +hacksaw +hacksaws +hacksilber +hackster +hackthorn +hacktree +hackwood +hackwork +hackworks +hacqueton +had +hadada +hadal +hadarim +hadassah +hadaway +hadbot +hadbote +hadden +hadder +haddest +haddie +haddin +haddo +haddock +haddocker +haddocks +hade +hadean +haded +hadendoa +hadendowa +hadentomoid +hadentomoidea +hadephobia +hades +hadhramautian +hading +hadit +hadith +hadiths +hadj +hadjee +hadjees +hadjemi +hadjes +hadji +hadjis +hadland +hadnt +hadramautian +hadrom +hadrome +hadromerina +hadromycosis +hadron +hadronic +hadrons +hadrosaur +hadrosaurus +hadst +hae +haec +haecceity +haecceities +haeckelian +haeckelism +haed +haeing +haem +haemachrome +haemacytometer +haemad +haemagglutinate +haemagglutinated +haemagglutinating +haemagglutination +haemagglutinative +haemagglutinin +haemagogue +haemal +haemamoeba +haemangioma +haemangiomas +haemangiomata +haemangiomatosis +haemanthus +haemaphysalis +haemapophysis +haemaspectroscope +haematal +haematein +haematemesis +haematherm +haemathermal +haemathermous +haematic +haematics +haematid +haematin +haematinic +haematinon +haematins +haematinum +haematite +haematitic +haematoblast +haematobranchia +haematobranchiate +haematocele +haematocyst +haematocystis +haematocyte +haematocrya +haematocryal +haematocrit +haematogenesis +haematogenous +haematoid +haematoidin +haematoin +haematolysis +haematology +haematologic +haematological +haematologist +haematoma +haematomas +haematomata +haematometer +haematophilina +haematophiline +haematophyte +haematopoiesis +haematopoietic +haematopus +haematorrhachis +haematosepsis +haematosin +haematosis +haematotherma +haematothermal +haematoxylic +haematoxylin +haematoxylon +haematozoa +haematozoal +haematozoic +haematozoon +haematozzoa +haematuria +haemic +haemin +haemins +haemoblast +haemochrome +haemocyanin +haemocyte +haemocytoblast +haemocytoblastic +haemocytometer +haemocoel +haemoconcentration +haemodialysis +haemodilution +haemodynamic +haemodynamics +haemodoraceae +haemodoraceous +haemoflagellate +haemoglobic +haemoglobin +haemoglobinous +haemoglobinuria +haemogram +haemogregarina +haemogregarinidae +haemoid +haemolysin +haemolysis +haemolytic +haemometer +haemonchiasis +haemonchosis +haemonchus +haemony +haemophil +haemophile +haemophilia +haemophiliac +haemophilic +haemopod +haemopoiesis +haemoproteus +haemoptysis +haemorrhage +haemorrhaged +haemorrhagy +haemorrhagia +haemorrhagic +haemorrhaging +haemorrhoid +haemorrhoidal +haemorrhoidectomy +haemorrhoids +haemosporid +haemosporidia +haemosporidian +haemosporidium +haemostasia +haemostasis +haemostat +haemostatic +haemothorax +haemotoxic +haemotoxin +haems +haemulidae +haemuloid +haen +haeredes +haeremai +haeres +haes +haet +haets +haf +haff +haffat +haffet +haffets +haffit +haffits +haffkinize +haffle +hafflins +hafgan +hafis +hafiz +haflin +hafnia +hafnyl +hafnium +hafniums +haft +haftarah +haftarahs +haftarot +haftaroth +hafted +hafter +hafters +hafting +haftorah +haftorahs +haftorot +haftoroth +hafts +hag +hagada +hagadic +hagadist +hagadists +haganah +hagar +hagarene +hagarite +hagberry +hagberries +hagboat +hagbolt +hagborn +hagbush +hagbushes +hagbut +hagbuts +hagden +hagdin +hagdon +hagdons +hagdown +hageen +hagein +hagenia +hagfish +hagfishes +haggada +haggadah +haggaday +haggadal +haggadic +haggadical +haggadist +haggadistic +haggai +haggard +haggardly +haggardness +haggards +hagged +haggeis +hagger +haggy +hagging +haggiographal +haggis +haggises +haggish +haggishly +haggishness +haggister +haggle +haggled +haggler +hagglers +haggles +haggly +haggling +hagi +hagia +hagiarchy +hagiarchies +hagigah +hagiocracy +hagiocracies +hagiographa +hagiographal +hagiographer +hagiographers +hagiography +hagiographic +hagiographical +hagiographies +hagiographist +hagiolater +hagiolatry +hagiolatrous +hagiolith +hagiology +hagiologic +hagiological +hagiologically +hagiologies +hagiologist +hagiophobia +hagioscope +hagioscopic +haglet +haglike +haglin +hagmall +hagmane +hagmena +hagmenay +hagrid +hagridden +hagride +hagrider +hagrides +hagriding +hagrode +hagrope +hags +hagseed +hagship +hagstone +hagtaper +hague +hagueton +hagweed +hagworm +hah +haha +hahnemannian +hahnemannism +hahnium +hahs +hay +haya +haiari +haiathalah +hayband +haybird +haybote +haybox +hayburner +haycap +haycart +haick +haycock +haycocks +haida +haidan +haidee +haydenite +haidingerite +haydn +haiduck +haiduk +haye +hayed +hayey +hayer +hayers +hayes +hayfield +hayfields +hayfork +hayforks +haygrower +haying +hayings +haik +haika +haikai +haikal +haikh +haiks +haiku +haikun +haikwan +hail +haylage +haylages +hailed +hailer +hailers +hailes +haily +haylift +hailing +hayloft +haylofts +hailproof +hails +hailse +hailshot +hailstone +hailstoned +hailstones +hailstorm +hailstorms +hailweed +haymaker +haymakers +haymaking +haymarket +haimavati +haymish +haymow +haymows +haimsucken +hain +hainai +hainan +hainanese +hainberry +hainch +haine +hayne +hained +hair +hayrack +hayracks +hayrake +hayraker +hairball +hairballs +hairband +hairbands +hairbeard +hairbell +hairbird +hairbrain +hairbrained +hairbreadth +hairbreadths +hairbrush +hairbrushes +haircap +haircaps +haircloth +haircloths +haircut +haircuts +haircutter +haircutting +hairdo +hairdodos +hairdos +hairdress +hairdresser +hairdressers +hairdressing +hairdryer +hairdryers +haire +haired +hairen +hairgrass +hairgrip +hairhoof +hairhound +hairy +hairychested +hayrick +hayricks +hayride +hayrides +hairier +hairiest +hairif +hairiness +hairlace +hairless +hairlessness +hairlet +hairlike +hairline +hairlines +hairlock +hairlocks +hairmeal +hairmoneering +hairmonger +hairnet +hairof +hairpiece +hairpieces +hairpin +hairpins +hairs +hairsbreadth +hairsbreadths +hairse +hairsplitter +hairsplitters +hairsplitting +hairspray +hairsprays +hairspring +hairsprings +hairst +hairstane +hairstyle +hairstyles +hairstyling +hairstylist +hairstylists +hairstone +hairstreak +hairtail +hairup +hairweave +hairweaver +hairweavers +hairweaving +hairweed +hairwood +hairwork +hairworks +hairworm +hairworms +hays +hayseed +hayseeds +haysel +hayshock +haisla +haystack +haystacks +haysuck +hait +haithal +haythorn +haiti +haitian +haitians +haytime +haitsai +haiver +haywagon +hayward +haywards +hayweed +haywire +haywires +hayz +haj +haje +hajes +haji +hajib +hajilij +hajis +hajj +hajjes +hajji +hajjis +hak +hakafoth +hakam +hakamim +hakdar +hake +hakea +hakeem +hakeems +hakenkreuz +hakenkreuzler +hakes +hakim +hakims +hakka +hako +haku +hal +hala +halacha +halachah +halachist +halaka +halakah +halakahs +halakhist +halakic +halakist +halakistic +halakists +halakoth +halal +halala +halalah +halalahs +halalas +halalcor +halapepe +halas +halation +halations +halavah +halavahs +halawi +halazone +halberd +halberdier +halberdman +halberds +halberdsman +halbert +halberts +halch +halcyon +halcyonian +halcyonic +halcyonidae +halcyoninae +halcyonine +halcyons +haldanite +haldu +hale +halebi +halecomorphi +halecret +haled +haleday +halely +haleness +halenesses +halenia +haler +halers +haleru +halerz +hales +halesia +halesome +halest +haleweed +half +halfa +halfback +halfbacks +halfbeak +halfbeaks +halfblood +halfcock +halfcocked +halfen +halfendeal +halfer +halfheaded +halfhearted +halfheartedly +halfheartedness +halfhourly +halfy +halflang +halfly +halflife +halflin +halfling +halflings +halflives +halfman +halfmoon +halfness +halfnesses +halfpace +halfpaced +halfpence +halfpenny +halfpennies +halfpennyworth +halftime +halftimes +halftone +halftones +halftrack +halfungs +halfway +halfwise +halfwit +halfword +halfwords +haliaeetus +halyard +halyards +halibios +halibiotic +halibiu +halibut +halibuter +halibuts +halicarnassean +halicarnassian +halichondriae +halichondrine +halichondroid +halicore +halicoridae +halicot +halid +halide +halides +halidom +halidome +halidomes +halidoms +halids +halieutic +halieutical +halieutically +halieutics +halifax +haligonian +halimeda +halimot +halimous +haling +halinous +haliographer +haliography +haliotidae +haliotis +haliotoid +haliplankton +haliplid +haliplidae +haliserites +halysites +halisteresis +halisteretic +halite +halites +halitheriidae +halitherium +halitoses +halitosis +halituosity +halituous +halitus +halituses +halkahs +halke +hall +hallabaloo +hallage +hallah +hallahs +hallalcor +hallali +hallan +hallanshaker +hallboy +hallcist +hallebardier +hallecret +halleflinta +halleflintoid +halleyan +hallel +hallels +halleluiah +hallelujah +hallelujahs +hallelujatic +hallex +halliard +halliards +halliblash +hallicet +hallidome +hallier +halling +hallion +hallman +hallmark +hallmarked +hallmarker +hallmarking +hallmarks +hallmoot +hallmote +hallo +halloa +halloaed +halloaing +halloas +hallock +halloed +halloes +halloing +halloysite +halloo +hallooed +hallooing +halloos +hallopididae +hallopodous +hallopus +hallos +hallot +halloth +hallow +hallowd +hallowday +hallowed +hallowedly +hallowedness +halloween +halloweens +hallower +hallowers +hallowing +hallowmas +hallows +hallowtide +hallroom +halls +hallstatt +hallstattian +hallucal +halluces +hallucinate +hallucinated +hallucinates +hallucinating +hallucination +hallucinational +hallucinations +hallucinative +hallucinator +hallucinatory +hallucined +hallucinogen +hallucinogenic +hallucinogens +hallucinoses +hallucinosis +hallux +hallway +hallways +halm +halma +halmalille +halmawise +halms +halo +haloa +halobates +halobiont +halobios +halobiotic +halocaine +halocarbon +halochromy +halochromism +halocynthiidae +halocline +haloed +haloes +haloesque +halogen +halogenate +halogenated +halogenating +halogenation +halogenoid +halogenous +halogens +halogeton +halohydrin +haloid +haloids +haloing +halolike +halolimnic +halomancy +halometer +halomorphic +halomorphism +haloperidol +halophile +halophilic +halophilism +halophilous +halophyte +halophytic +halophytism +halopsyche +halopsychidae +haloragidaceae +haloragidaceous +halos +halosauridae +halosaurus +haloscope +halosere +halosphaera +halothane +halotrichite +haloxene +haloxylin +halp +halpace +halper +hals +halse +halsen +halser +halsfang +halt +halte +halted +halter +halterbreak +haltere +haltered +halteres +halteridium +haltering +halterlike +halterproof +halters +haltica +halting +haltingly +haltingness +haltless +halts +halucket +halukkah +halurgy +halurgist +halutz +halutzim +halva +halvah +halvahs +halvaner +halvans +halvas +halve +halved +halvelings +halver +halvers +halves +halving +halwe +ham +hamacratic +hamada +hamadan +hamadryad +hamadryades +hamadryads +hamadryas +hamal +hamald +hamals +hamamelidaceae +hamamelidaceous +hamamelidanthemum +hamamelidin +hamamelidoxylon +hamamelin +hamamelis +hamamelites +haman +hamantasch +hamantaschen +hamantash +hamantashen +hamartia +hamartias +hamartiology +hamartiologist +hamartite +hamartophobia +hamata +hamate +hamated +hamates +hamathite +hamatum +hamaul +hamauls +hamber +hambergite +hamble +hambone +hambro +hambroline +hamburg +hamburger +hamburgers +hamburgs +hamdmaid +hame +hameil +hamel +hamelia +hamelt +hames +hamesoken +hamesucken +hametugs +hametz +hamewith +hamfare +hamfat +hamfatter +hamhung +hami +hamidian +hamidieh +hamiform +hamilt +hamilton +hamiltonian +hamiltonianism +hamiltonism +hamingja +haminoea +hamirostrate +hamital +hamite +hamites +hamitic +hamiticized +hamitism +hamitoid +hamlah +hamlet +hamleted +hamleteer +hamletization +hamletize +hamlets +hamli +hamline +hamlinite +hammada +hammaid +hammal +hammals +hammam +hammed +hammer +hammerable +hammerbird +hammercloth +hammercloths +hammerdress +hammered +hammerer +hammerers +hammerfish +hammerhead +hammerheaded +hammerheads +hammering +hammeringly +hammerkop +hammerless +hammerlike +hammerlock +hammerlocks +hammerman +hammers +hammersmith +hammerstone +hammertoe +hammertoes +hammerwise +hammerwork +hammerwort +hammy +hammier +hammiest +hammily +hamminess +hamming +hammochrysos +hammock +hammocklike +hammocks +hamose +hamotzi +hamous +hamper +hampered +hamperedly +hamperedness +hamperer +hamperers +hampering +hamperman +hampers +hampshire +hampshireman +hampshiremen +hampshirite +hampshirites +hamrongite +hams +hamsa +hamshackle +hamster +hamsters +hamstring +hamstringed +hamstringing +hamstrings +hamstrung +hamular +hamulate +hamule +hamuli +hamulites +hamulose +hamulous +hamulus +hamus +hamza +hamzah +hamzahs +hamzas +han +hanafi +hanafite +hanahill +hanap +hanaper +hanapers +hanaster +hanbalite +hanbury +hance +hanced +hances +hanch +hancockite +hand +handarm +handbag +handbags +handball +handballer +handballs +handbank +handbanker +handbarrow +handbarrows +handbell +handbells +handbill +handbills +handblow +handbolt +handbook +handbooks +handbound +handbow +handbrake +handbreadth +handbreed +handcar +handcars +handcart +handcarts +handclap +handclapping +handclasp +handclasps +handcloth +handcraft +handcrafted +handcrafting +handcraftman +handcrafts +handcraftsman +handcuff +handcuffed +handcuffing +handcuffs +handed +handedly +handedness +handel +handelian +hander +handersome +handfast +handfasted +handfasting +handfastly +handfastness +handfasts +handfeed +handfish +handflag +handflower +handful +handfuls +handgallop +handgrasp +handgravure +handgrip +handgriping +handgrips +handgun +handguns +handhaving +handhold +handholds +handhole +handy +handybilly +handybillies +handyblow +handybook +handicap +handicapped +handicapper +handicappers +handicapping +handicaps +handicraft +handicrafter +handicrafts +handicraftship +handicraftsman +handicraftsmanship +handicraftsmen +handicraftswoman +handicuff +handycuff +handier +handiest +handyfight +handyframe +handygrip +handygripe +handily +handyman +handymen +handiness +handing +handiron +handistroke +handiwork +handjar +handkercher +handkerchief +handkerchiefful +handkerchiefs +handkerchieves +handlaid +handle +handleable +handlebar +handlebars +handled +handleless +handler +handlers +handles +handless +handlike +handline +handling +handlings +handlist +handlists +handload +handloader +handloading +handlock +handloom +handloomed +handlooms +handmade +handmaid +handmaiden +handmaidenly +handmaidens +handmaids +handoff +handoffs +handout +handouts +handpick +handpicked +handpicking +handpicks +handpiece +handpost +handpress +handprint +handrail +handrailing +handrails +handreader +handreading +handrest +hands +handsale +handsaw +handsawfish +handsawfishes +handsaws +handsbreadth +handscrape +handsel +handseled +handseling +handselled +handseller +handselling +handsels +handset +handsets +handsetting +handsew +handsewed +handsewing +handsewn +handsful +handshake +handshaker +handshakes +handshaking +handsled +handsmooth +handsome +handsomeish +handsomely +handsomeness +handsomer +handsomest +handspade +handspan +handspec +handspike +handspoke +handspring +handsprings +handstaff +handstand +handstands +handstone +handstroke +handtrap +handwaled +handwaving +handwear +handweaving +handwheel +handwhile +handwork +handworked +handworker +handworkman +handworks +handworm +handwoven +handwrist +handwrit +handwrite +handwrites +handwriting +handwritings +handwritten +handwrote +handwrought +hanefiyeh +hang +hangability +hangable +hangalai +hangar +hangared +hangaring +hangars +hangby +hangbird +hangbirds +hangdog +hangdogs +hange +hanged +hangee +hanger +hangers +hangfire +hangfires +hangie +hanging +hangingly +hangings +hangkang +hangle +hangman +hangmanship +hangmen +hangment +hangnail +hangnails +hangnest +hangnests +hangout +hangouts +hangover +hangovers +hangs +hangtag +hangtags +hangul +hangup +hangups +hangwoman +hangworm +hangworthy +hanif +hanifiya +hanifism +hanifite +hank +hanked +hanker +hankered +hankerer +hankerers +hankering +hankeringly +hankerings +hankers +hanky +hankie +hankies +hanking +hankle +hanks +hanksite +hankt +hankul +hanna +hannayite +hannibal +hannibalian +hannibalic +hano +hanoi +hanologate +hanover +hanoverian +hanoverianize +hanoverize +hans +hansa +hansard +hansardization +hansardize +hanse +hanseatic +hansel +hanseled +hanseling +hanselled +hanselling +hansels +hansenosis +hanses +hansgrave +hansom +hansomcab +hansoms +hant +hanted +hanting +hantle +hantles +hants +hanukkah +hanuman +hanumans +hao +haole +haoles +haoma +haori +haoris +hap +hapale +hapalidae +hapalote +hapalotis +hapax +hapaxanthous +hapaxes +hapchance +haphazard +haphazardly +haphazardness +haphazardry +haphophobia +haphtarah +hapi +hapiton +hapless +haplessly +haplessness +haply +haplite +haplites +haplitic +haplobiont +haplobiontic +haplocaulescent +haplochlamydeous +haplodoci +haplodon +haplodont +haplodonty +haplography +haploid +haploidy +haploidic +haploidies +haploids +haplolaly +haplology +haplologic +haploma +haplome +haplomi +haplomid +haplomitosis +haplomous +haplont +haplontic +haplonts +haploperistomic +haploperistomous +haplopetalous +haplophase +haplophyte +haplopia +haplopias +haploscope +haploscopic +haploses +haplosis +haplostemonous +haplotype +happed +happen +happenchance +happened +happening +happenings +happens +happenstance +happer +happy +happier +happiest +happify +happiless +happily +happiness +happing +haps +hapsburg +hapten +haptene +haptenes +haptenic +haptens +haptera +haptere +hapteron +haptic +haptical +haptics +haptoglobin +haptometer +haptophobia +haptophor +haptophoric +haptophorous +haptor +haptotropic +haptotropically +haptotropism +hapu +hapuku +haquebut +haqueton +harace +haraya +harakeke +harakiri +haram +harambee +harang +harangue +harangued +harangueful +haranguer +haranguers +harangues +haranguing +hararese +harari +haras +harass +harassable +harassed +harassedly +harasser +harassers +harasses +harassing +harassingly +harassment +harassments +harast +haratch +harateen +haratin +haraucana +harb +harbergage +harbi +harbinge +harbinger +harbingery +harbingers +harbingership +harbor +harborage +harbored +harborer +harborers +harborful +harboring +harborless +harbormaster +harborough +harborous +harbors +harborside +harborward +harbour +harbourage +harboured +harbourer +harbouring +harbourless +harbourous +harbours +harbourside +harbourward +harbrough +hard +hardanger +hardback +hardbacks +hardbake +hardball +hardballs +hardbeam +hardberry +hardboard +hardboiled +hardboot +hardboots +hardbought +hardbound +hardcase +hardcopy +hardcore +hardcover +hardcovered +hardcovers +harden +hardenability +hardenable +hardenbergia +hardened +hardenedness +hardener +hardeners +hardening +hardenite +hardens +harder +harderian +hardest +hardfern +hardfist +hardfisted +hardfistedness +hardhack +hardhacks +hardhanded +hardhandedness +hardhat +hardhats +hardhead +hardheaded +hardheadedly +hardheadedness +hardheads +hardhearted +hardheartedly +hardheartedness +hardhewer +hardy +hardie +hardier +hardies +hardiesse +hardiest +hardihead +hardyhead +hardihood +hardily +hardim +hardiment +hardiness +harding +hardish +hardishrew +hardystonite +hardly +hardmouth +hardmouthed +hardness +hardnesses +hardnose +hardock +hardpan +hardpans +hards +hardsalt +hardscrabble +hardset +hardshell +hardship +hardships +hardstand +hardstanding +hardstands +hardtack +hardtacks +hardtail +hardtails +hardtop +hardtops +hardway +hardwall +hardware +hardwareman +hardwares +hardweed +hardwickia +hardwired +hardwood +hardwoods +hardworking +hare +harebell +harebells +harebottle +harebrain +harebrained +harebrainedly +harebrainedness +harebur +hared +hareem +hareems +harefoot +harefooted +harehearted +harehound +hareld +harelda +harelike +harelip +harelipped +harelips +harem +haremism +haremlik +harems +harengiform +harenut +hares +harewood +harfang +hariana +harianas +harico +haricot +haricots +harier +hariffe +harigalds +harijan +harijans +harikari +harim +haring +harynges +hariolate +hariolation +hariolize +harish +hark +harka +harked +harkee +harken +harkened +harkener +harkeners +harkening +harkens +harking +harks +harl +harle +harled +harleian +harlem +harlemese +harlemite +harlequin +harlequina +harlequinade +harlequinery +harlequinesque +harlequinic +harlequinism +harlequinize +harlequins +harling +harlock +harlot +harlotry +harlotries +harlots +harls +harm +harmachis +harmal +harmala +harmalin +harmaline +harman +harmattan +harmed +harmel +harmer +harmers +harmful +harmfully +harmfulness +harmin +harmine +harmines +harming +harminic +harmins +harmless +harmlessly +harmlessness +harmon +harmony +harmonia +harmoniacal +harmonial +harmonic +harmonica +harmonical +harmonically +harmonicalness +harmonicas +harmonichord +harmonici +harmonicism +harmonicon +harmonics +harmonies +harmonious +harmoniously +harmoniousness +harmoniphon +harmoniphone +harmonisable +harmonisation +harmonise +harmonised +harmoniser +harmonising +harmonist +harmonistic +harmonistically +harmonite +harmonium +harmoniums +harmonizable +harmonization +harmonizations +harmonize +harmonized +harmonizer +harmonizers +harmonizes +harmonizing +harmonogram +harmonograph +harmonometer +harmoot +harmost +harmotome +harmotomic +harmout +harmproof +harms +harn +harness +harnessed +harnesser +harnessers +harnesses +harnessing +harnessless +harnesslike +harnessry +harnpan +harns +harold +haroset +haroseth +harp +harpa +harpago +harpagon +harpagornis +harpalides +harpalinae +harpalus +harpaxophobia +harped +harper +harperess +harpers +harpy +harpidae +harpier +harpies +harpyia +harpylike +harpin +harping +harpingly +harpings +harpins +harpist +harpists +harpless +harplike +harpocrates +harpoon +harpooned +harpooneer +harpooner +harpooners +harpooning +harpoonlike +harpoons +harporhynchus +harpress +harps +harpsical +harpsichon +harpsichord +harpsichordist +harpsichords +harpula +harpullia +harpwaytuning +harpwise +harquebus +harquebusade +harquebuse +harquebuses +harquebusier +harquebuss +harr +harrage +harrateen +harre +harry +harrycane +harrid +harridan +harridans +harried +harrier +harriers +harries +harriet +harrying +harris +harrisia +harrisite +harrison +harrovian +harrow +harrowed +harrower +harrowers +harrowing +harrowingly +harrowingness +harrowment +harrows +harrowtry +harrumph +harrumphed +harrumphing +harrumphs +harsh +harshen +harshened +harshening +harshens +harsher +harshest +harshish +harshlet +harshlets +harshly +harshness +harshweed +harslet +harslets +harst +harstigite +harstrang +harstrong +hart +hartail +hartake +hartal +hartall +hartals +hartberry +hartebeest +hartebeests +harten +hartford +hartin +hartite +hartleian +hartleyan +hartly +hartmann +hartmannia +hartogia +harts +hartshorn +hartstongue +harttite +hartungen +hartwort +haruspex +haruspical +haruspicate +haruspication +haruspice +haruspices +haruspicy +harv +harvard +harvardian +harvardize +harvey +harveian +harveyize +harvest +harvestable +harvestbug +harvested +harvester +harvesters +harvestfish +harvestfishes +harvesting +harvestless +harvestman +harvestmen +harvestry +harvests +harvesttime +harzburgite +has +hasan +hasard +hasenpfeffer +hash +hashab +hashabi +hashed +hasheesh +hasheeshes +hasher +hashery +hashes +hashhead +hashheads +hashy +hashiya +hashimite +hashing +hashish +hashishes +hasht +hasid +hasidean +hasidic +hasidim +hasidism +hasinai +hask +haskalah +haskard +hasky +haskness +haskwort +haslet +haslets +haslock +hasmonaean +hasmonaeans +hasn +hasnt +hasp +hasped +haspicol +hasping +haspling +hasps +haspspecs +hassar +hassel +hassels +hassenpfeffer +hassing +hassle +hassled +hassles +hasslet +hassling +hassock +hassocky +hassocks +hast +hasta +hastate +hastated +hastately +hastati +hastatolanceolate +hastatosagittate +haste +hasted +hasteful +hastefully +hasteless +hastelessness +hasten +hastened +hastener +hasteners +hastening +hastens +hasteproof +haster +hastes +hasty +hastier +hastiest +hastif +hastifly +hastifness +hastifoliate +hastiform +hastile +hastily +hastilude +hastiness +hasting +hastings +hastingsite +hastish +hastive +hastler +hastula +hat +hatable +hatband +hatbands +hatbox +hatboxes +hatbrim +hatbrush +hatch +hatchability +hatchable +hatchback +hatchbacks +hatcheck +hatched +hatchel +hatcheled +hatcheler +hatcheling +hatchelled +hatcheller +hatchelling +hatchels +hatcher +hatchery +hatcheries +hatcheryman +hatchers +hatches +hatchet +hatchetback +hatchetfaced +hatchetfish +hatchetfishes +hatchety +hatchetlike +hatchetman +hatchets +hatchettin +hatchettine +hatchettite +hatchettolite +hatchgate +hatching +hatchings +hatchite +hatchling +hatchman +hatchment +hatchminder +hatchway +hatchwayman +hatchways +hate +hateable +hated +hateful +hatefully +hatefulness +hatel +hateless +hatelessness +hatemonger +hatemongering +hater +haters +hates +hatful +hatfuls +hath +hatherlite +hathi +hathor +hathoric +hathpace +hati +hatikvah +hating +hatless +hatlessness +hatlike +hatmaker +hatmakers +hatmaking +hatpin +hatpins +hatrack +hatracks +hatrail +hatred +hatreds +hatress +hats +hatsful +hatstand +hatt +hatte +hatted +hattemist +hatter +hattery +hatteria +hatterias +hatters +hatti +hatty +hattic +hattie +hatting +hattism +hattize +hattock +hau +haubergeon +hauberget +hauberk +hauberks +hauberticum +haubois +hauchecornite +hauerite +hauflin +haugh +haughland +haughs +haught +haughty +haughtier +haughtiest +haughtily +haughtiness +haughtly +haughtness +haughtonite +hauyne +hauynite +hauynophyre +haul +haulabout +haulage +haulages +haulageway +haulaway +haulback +hauld +hauled +hauler +haulers +haulyard +haulyards +haulier +hauliers +hauling +haulm +haulmy +haulmier +haulmiest +haulms +hauls +haulse +haulster +hault +haum +haunce +haunch +haunched +hauncher +haunches +haunchy +haunching +haunchless +haunt +haunted +haunter +haunters +haunty +haunting +hauntingly +haunts +haupia +hauranitic +hauriant +haurient +hausa +hause +hausen +hausens +hausfrau +hausfrauen +hausfraus +hausmannite +hausse +haussmannization +haussmannize +haust +haustella +haustellate +haustellated +haustellous +haustellum +haustement +haustoria +haustorial +haustorium +haustral +haustrum +haustus +haut +hautain +hautboy +hautboyist +hautbois +hautboys +haute +hautein +hautesse +hauteur +hauteurs +hav +havage +havaiki +havaikian +havana +havance +havanese +havdalah +havdalahs +have +haveable +haveage +havel +haveless +havelock +havelocks +haven +havenage +havened +havener +havenership +havenet +havenful +havening +havenless +havens +havent +havenward +haver +haveral +havercake +havered +haverel +haverels +haverer +havergrass +havering +havermeal +havers +haversack +haversacks +haversian +haversine +haves +havier +havildar +having +havingness +havings +havior +haviored +haviors +haviour +havioured +haviours +havlagah +havoc +havocked +havocker +havockers +havocking +havocs +haw +hawaii +hawaiian +hawaiians +hawaiite +hawbuck +hawcuaite +hawcubite +hawebake +hawed +hawer +hawfinch +hawfinches +hawiya +hawing +hawk +hawkbill +hawkbills +hawkbit +hawked +hawkey +hawkeye +hawkeys +hawker +hawkery +hawkers +hawky +hawkie +hawkies +hawking +hawkings +hawkins +hawkish +hawkishly +hawkishness +hawklike +hawkmoth +hawkmoths +hawknose +hawknosed +hawknoses +hawknut +hawks +hawksbeak +hawksbill +hawkshaw +hawkshaws +hawkweed +hawkweeds +hawkwise +hawm +hawok +haworthia +haws +hawse +hawsed +hawsehole +hawseman +hawsepiece +hawsepipe +hawser +hawsers +hawserwise +hawses +hawsing +hawthorn +hawthorne +hawthorned +hawthorny +hawthorns +hazan +hazanim +hazans +hazanut +hazara +hazard +hazardable +hazarded +hazarder +hazardful +hazarding +hazardize +hazardless +hazardous +hazardously +hazardousness +hazardry +hazards +haze +hazed +hazel +hazeled +hazeless +hazelhen +hazeline +hazelly +hazelnut +hazelnuts +hazels +hazelwood +hazelwort +hazemeter +hazen +hazer +hazers +hazes +hazy +hazier +haziest +hazily +haziness +hazinesses +hazing +hazings +hazle +haznadar +hazzan +hazzanim +hazzans +hazzanut +hb +hcb +hcf +hcl +hconvert +hd +hdbk +hdkf +hdlc +hdqrs +hdwe +he +head +headache +headaches +headachy +headachier +headachiest +headband +headbander +headbands +headboard +headboards +headborough +headbox +headcap +headchair +headcheese +headchute +headcloth +headclothes +headcloths +headdress +headdresses +headed +headend +headender +headends +header +headers +headfast +headfirst +headfish +headfishes +headforemost +headframe +headful +headgate +headgates +headgear +headgears +headhunt +headhunted +headhunter +headhunters +headhunting +headhunts +heady +headier +headiest +headily +headiness +heading +headings +headkerchief +headlamp +headlamps +headland +headlands +headle +headledge +headless +headlessness +headly +headlight +headlighting +headlights +headlike +headliked +headline +headlined +headliner +headliners +headlines +headling +headlining +headload +headlock +headlocks +headlong +headlongly +headlongness +headlongs +headlongwise +headman +headmark +headmaster +headmasterly +headmasters +headmastership +headmen +headmistress +headmistresses +headmistressship +headmold +headmost +headmould +headnote +headnotes +headpenny +headphone +headphones +headpiece +headpieces +headpin +headpins +headplate +headpost +headquarter +headquartered +headquartering +headquarters +headrace +headraces +headrail +headreach +headrent +headrest +headrests +headrig +headright +headring +headroom +headrooms +headrope +heads +headsail +headsails +headsaw +headscarf +headset +headsets +headshake +headshaker +headsheet +headsheets +headship +headships +headshrinker +headsill +headskin +headsman +headsmen +headspace +headspring +headsquare +headstay +headstays +headstall +headstalls +headstand +headstands +headstick +headstock +headstone +headstones +headstream +headstrong +headstrongly +headstrongness +headtire +headway +headways +headwaiter +headwaiters +headwall +headward +headwards +headwark +headwater +headwaters +headwear +headwind +headwinds +headword +headwords +headwork +headworker +headworking +headworks +heaf +heal +healable +heald +healder +healed +healer +healers +healful +healing +healingly +healless +heals +healsome +healsomeness +health +healthcare +healthcraft +healthful +healthfully +healthfulness +healthguard +healthy +healthier +healthiest +healthily +healthiness +healthless +healthlessness +healths +healthsome +healthsomely +healthsomeness +healthward +heap +heaped +heaper +heapy +heaping +heaps +heapstead +hear +hearable +heard +hearer +hearers +hearing +hearingless +hearings +hearken +hearkened +hearkener +hearkening +hearkens +hears +hearsay +hearsays +hearse +hearsecloth +hearsed +hearselike +hearses +hearsing +hearst +heart +heartache +heartaches +heartaching +heartbeat +heartbeats +heartbird +heartblock +heartblood +heartbreak +heartbreaker +heartbreaking +heartbreakingly +heartbreaks +heartbroke +heartbroken +heartbrokenly +heartbrokenness +heartburn +heartburning +heartburns +heartdeep +heartease +hearted +heartedly +heartedness +hearten +heartened +heartener +heartening +hearteningly +heartens +heartfelt +heartful +heartfully +heartfulness +heartgrief +hearth +hearthless +hearthman +hearthpenny +hearthrug +hearths +hearthside +hearthsides +hearthstead +hearthstone +hearthstones +hearthward +hearthwarming +hearty +heartier +hearties +heartiest +heartikin +heartily +heartiness +hearting +heartland +heartlands +heartleaf +heartless +heartlessly +heartlessness +heartlet +heartly +heartlike +heartling +heartnut +heartpea +heartquake +heartrending +heartrendingly +heartroot +heartrot +hearts +heartscald +heartsease +heartseed +heartsette +heartshake +heartsick +heartsickening +heartsickness +heartsmitten +heartsome +heartsomely +heartsomeness +heartsore +heartsoreness +heartstring +heartstrings +heartthrob +heartthrobs +heartward +heartwarming +heartwater +heartweed +heartwise +heartwood +heartworm +heartwort +heartwounding +heat +heatable +heatdrop +heatdrops +heated +heatedly +heatedness +heaten +heater +heaterman +heaters +heatful +heath +heathberry +heathberries +heathbird +heathbrd +heathen +heathendom +heatheness +heathenesse +heathenhood +heathenise +heathenised +heathenish +heathenishly +heathenishness +heathenising +heathenism +heathenist +heathenize +heathenized +heathenizing +heathenly +heathenness +heathenry +heathens +heathenship +heather +heathered +heathery +heatheriness +heathers +heathfowl +heathy +heathier +heathiest +heathless +heathlike +heathrman +heaths +heathwort +heating +heatingly +heatless +heatlike +heatmaker +heatmaking +heatproof +heatronic +heats +heatsman +heatstroke +heatstrokes +heaume +heaumer +heaumes +heautarit +heautomorphism +heautontimorumenos +heautophany +heave +heaved +heaveless +heaven +heavenese +heavenful +heavenhood +heavenish +heavenishly +heavenize +heavenless +heavenly +heavenlier +heavenliest +heavenlike +heavenliness +heavens +heavenward +heavenwardly +heavenwardness +heavenwards +heaver +heavers +heaves +heavy +heavyback +heavier +heavies +heaviest +heavyhanded +heavyhandedness +heavyheaded +heavyhearted +heavyheartedly +heavyheartedness +heavily +heaviness +heaving +heavinsogme +heavyset +heavisome +heavity +heavyweight +heavyweights +heazy +hebamic +hebdomad +hebdomadal +hebdomadally +hebdomadary +hebdomadaries +hebdomader +hebdomads +hebdomary +hebdomarian +hebdomcad +hebe +hebeanthous +hebecarpous +hebecladous +hebegynous +heben +hebenon +hebeosteotomy +hebepetalous +hebephrenia +hebephreniac +hebephrenic +hebetate +hebetated +hebetates +hebetating +hebetation +hebetative +hebete +hebetic +hebetomy +hebetude +hebetudes +hebetudinous +hebotomy +hebraean +hebraic +hebraica +hebraical +hebraically +hebraicize +hebraism +hebraist +hebraistic +hebraistical +hebraistically +hebraists +hebraization +hebraize +hebraized +hebraizer +hebraizes +hebraizing +hebrew +hebrewdom +hebrewess +hebrewism +hebrews +hebrician +hebridean +hebronite +hecastotheism +hecate +hecatean +hecatic +hecatine +hecatomb +hecatombaeon +hecatombed +hecatombs +hecatomped +hecatompedon +hecatonstylon +hecatontarchy +hecatontome +hecatophyllous +hecchsmhaer +hecco +hecctkaerre +hech +hechsher +hechsherim +hechshers +hecht +hechtia +heck +heckelphone +heckerism +heckimal +heckle +heckled +heckler +hecklers +heckles +heckling +hecks +hectar +hectare +hectares +hecte +hectic +hectical +hectically +hecticly +hecticness +hectyli +hective +hectocotyl +hectocotyle +hectocotyli +hectocotyliferous +hectocotylization +hectocotylize +hectocotylus +hectogram +hectogramme +hectograms +hectograph +hectography +hectographic +hectoliter +hectoliters +hectolitre +hectometer +hectometers +hector +hectorean +hectored +hectorer +hectorian +hectoring +hectoringly +hectorism +hectorly +hectors +hectorship +hectostere +hectowatt +hecuba +hed +heddle +heddlemaker +heddler +heddles +hede +hedebo +hedenbergite +hedeoma +heder +hedera +hederaceous +hederaceously +hederal +hederated +hederic +hederiferous +hederiform +hederigerent +hederin +hederose +heders +hedge +hedgebe +hedgeberry +hedgeborn +hedgebote +hedgebreaker +hedged +hedgehog +hedgehoggy +hedgehogs +hedgehop +hedgehoppe +hedgehopped +hedgehopper +hedgehopping +hedgehops +hedgeless +hedgemaker +hedgemaking +hedgepig +hedgepigs +hedger +hedgerow +hedgerows +hedgers +hedges +hedgesmith +hedgetaper +hedgeweed +hedgewise +hedgewood +hedgy +hedgier +hedgiest +hedging +hedgingly +hedychium +hedyphane +hedysarum +hedonic +hedonical +hedonically +hedonics +hedonism +hedonisms +hedonist +hedonistic +hedonistically +hedonists +hedonology +hedonophobia +hedriophthalmous +hedrocele +hedrumite +hee +heed +heeded +heeder +heeders +heedful +heedfully +heedfulness +heedy +heedily +heediness +heeding +heedless +heedlessly +heedlessness +heeds +heehaw +heehawed +heehawing +heehaws +heel +heelball +heelballs +heelband +heelcap +heeled +heeler +heelers +heelgrip +heeling +heelings +heelless +heelmaker +heelmaking +heelpath +heelpiece +heelplate +heelpost +heelposts +heelprint +heels +heelstrap +heeltap +heeltaps +heeltree +heelwork +heemraad +heemraat +heep +heer +heeze +heezed +heezes +heezy +heezie +heezing +heft +hefted +hefter +hefters +hefty +heftier +heftiest +heftily +heftiness +hefting +hefts +hegari +hegaris +hegelian +hegelianism +hegelianize +hegelizer +hegemon +hegemony +hegemonic +hegemonical +hegemonies +hegemonist +hegemonistic +hegemonizer +hegira +hegiras +hegumen +hegumene +hegumenes +hegumeness +hegumeny +hegumenies +hegumenos +hegumens +heh +hehe +hei +hey +heiau +heyday +heydays +heydeguy +heydey +heydeys +heidi +heyduck +heifer +heiferhood +heifers +heigh +heygh +heighday +height +heighted +heighten +heightened +heightener +heightening +heightens +heighth +heighths +heights +heii +heikum +heil +heild +heiled +heily +heiling +heils +heiltsuk +heimdal +heimin +heimish +hein +heinesque +heinie +heinies +heynne +heinous +heinously +heinousness +heinrich +heintzite +heinz +heypen +heir +heyrat +heirdom +heirdoms +heired +heiress +heiressdom +heiresses +heiresshood +heiring +heirless +heirlo +heirloom +heirlooms +heirs +heirship +heirships +heirskip +heist +heisted +heister +heisters +heisting +heists +heitiki +heize +heized +heizing +hejazi +hejazian +hejira +hejiras +hekhsher +hekhsherim +hekhshers +hektare +hektares +hekteus +hektogram +hektograph +hektoliter +hektometer +hektostere +hel +helas +helbeh +helco +helcoid +helcology +helcoplasty +helcosis +helcotic +held +heldentenor +heldentenore +heldentenors +helder +helderbergian +hele +helen +helena +helenin +helenioid +helenium +helenn +helenus +helepole +helewou +helge +heliac +heliacal +heliacally +heliaea +heliaean +heliamphora +heliand +helianthaceous +helianthemum +helianthic +helianthin +helianthium +helianthoidea +helianthoidean +helianthus +helianthuses +heliast +heliastic +heliasts +heliazophyte +helibus +helical +helically +heliced +helices +helichryse +helichrysum +helicidae +heliciform +helicin +helicina +helicine +helicinidae +helicity +helicitic +helicities +helicline +helicogyrate +helicogyre +helicograph +helicoid +helicoidal +helicoidally +helicoids +helicometry +helicon +heliconia +heliconian +heliconiidae +heliconiinae +heliconist +heliconius +helicons +helicoprotein +helicopt +helicopted +helicopter +helicopters +helicopting +helicopts +helicorubin +helicotrema +helicteres +helictite +helide +helidrome +heligmus +heling +helio +heliocentric +heliocentrical +heliocentrically +heliocentricism +heliocentricity +heliochrome +heliochromy +heliochromic +heliochromoscope +heliochromotype +helioculture +heliodon +heliodor +helioelectric +helioengraving +heliofugal +heliogabalize +heliogabalus +heliogram +heliograph +heliographer +heliography +heliographic +heliographical +heliographically +heliographs +heliogravure +helioid +heliolater +heliolator +heliolatry +heliolatrous +heliolite +heliolites +heliolithic +heliolitidae +heliology +heliological +heliologist +heliometer +heliometry +heliometric +heliometrical +heliometrically +heliomicrometer +helion +heliophilia +heliophiliac +heliophyllite +heliophilous +heliophyte +heliophobe +heliophobia +heliophobic +heliophobous +heliophotography +heliopora +heliopore +helioporidae +heliopsis +heliopticon +heliornis +heliornithes +heliornithidae +helios +helioscope +helioscopy +helioscopic +heliosis +heliostat +heliostatic +heliotactic +heliotaxis +heliotherapy +heliotherapies +heliothermometer +heliothis +heliotype +heliotyped +heliotypy +heliotypic +heliotypically +heliotyping +heliotypography +heliotrope +heliotroper +heliotropes +heliotropy +heliotropiaceae +heliotropian +heliotropic +heliotropical +heliotropically +heliotropin +heliotropine +heliotropism +heliotropium +heliozoa +heliozoan +heliozoic +helipad +helipads +heliport +heliports +helipterum +helispheric +helispherical +helistop +helistops +helium +heliums +helix +helixes +helixin +helizitic +hell +helladian +helladic +helladotherium +hellandite +hellanodic +hellbender +hellbent +hellbore +hellborn +hellbox +hellboxes +hellbred +hellbroth +hellcat +hellcats +helldiver +helldog +helleboraceous +helleboraster +hellebore +helleborein +hellebores +helleboric +helleborin +helleborine +helleborism +helleborus +helled +hellelt +hellen +hellene +hellenes +hellenian +hellenic +hellenically +hellenicism +hellenism +hellenist +hellenistic +hellenistical +hellenistically +hellenisticism +hellenists +hellenization +hellenize +hellenizer +hellenocentric +hellenophile +heller +helleri +hellery +helleries +hellers +hellespont +hellespontine +hellfire +hellfires +hellgrammite +hellgrammites +hellhag +hellhole +hellholes +hellhound +helly +hellicat +hellicate +hellier +hellim +helling +hellion +hellions +hellish +hellishly +hellishness +hellkite +hellkites +hellman +hellness +hello +helloed +helloes +helloing +hellos +hellroot +hells +hellship +helluo +helluva +hellvine +hellward +hellweed +helm +helmage +helmed +helmet +helmeted +helmetflower +helmeting +helmetlike +helmetmaker +helmetmaking +helmetpod +helmets +helmholtzian +helming +helminth +helminthagogic +helminthagogue +helminthes +helminthiasis +helminthic +helminthism +helminthite +helminthocladiaceae +helminthoid +helminthology +helminthologic +helminthological +helminthologist +helminthophobia +helminthosporiose +helminthosporium +helminthosporoid +helminthous +helminths +helmless +helms +helmsman +helmsmanship +helmsmen +helobious +heloderm +heloderma +helodermatidae +helodermatoid +helodermatous +helodes +heloe +heloma +helonias +helonin +helosis +helot +helotage +helotages +helotism +helotisms +helotize +helotomy +helotry +helotries +helots +help +helpable +helped +helper +helpers +helpful +helpfully +helpfulness +helping +helpingly +helpings +helpless +helplessly +helplessness +helply +helpmate +helpmates +helpmeet +helpmeets +helps +helpsome +helpworthy +helsingkite +helsinki +helterskelteriness +helve +helved +helvell +helvella +helvellaceae +helvellaceous +helvellales +helvellic +helver +helves +helvetia +helvetian +helvetic +helvetii +helvidian +helvin +helvine +helving +helvite +helzel +hem +hemabarometer +hemachate +hemachrome +hemachrosis +hemacite +hemacytometer +hemad +hemadynameter +hemadynamic +hemadynamics +hemadynamometer +hemadrometer +hemadrometry +hemadromograph +hemadromometer +hemafibrite +hemagglutinate +hemagglutinated +hemagglutinating +hemagglutination +hemagglutinative +hemagglutinin +hemagog +hemagogic +hemagogs +hemagogue +hemal +hemalbumen +hemameba +hemamoeba +heman +hemanalysis +hemangioma +hemangiomas +hemangiomata +hemangiomatosis +hemangiosarcoma +hemaphein +hemaphobia +hemapod +hemapodous +hemapoiesis +hemapoietic +hemapophyseal +hemapophysial +hemapophysis +hemarthrosis +hemase +hemaspectroscope +hemastatics +hematachometer +hematachometry +hematal +hematein +hemateins +hematemesis +hematemetic +hematencephalon +hematherapy +hematherm +hemathermal +hemathermous +hemathidrosis +hematic +hematics +hematid +hematidrosis +hematimeter +hematin +hematine +hematines +hematinic +hematinometer +hematinometric +hematins +hematinuria +hematite +hematites +hematitic +hematobic +hematobious +hematobium +hematoblast +hematoblastic +hematobranchiate +hematocatharsis +hematocathartic +hematocele +hematochezia +hematochyluria +hematochrome +hematocyanin +hematocyst +hematocystis +hematocyte +hematocytoblast +hematocytogenesis +hematocytometer +hematocytotripsis +hematocytozoon +hematocyturia +hematoclasia +hematoclasis +hematocolpus +hematocryal +hematocrystallin +hematocrit +hematodynamics +hematodynamometer +hematodystrophy +hematogen +hematogenesis +hematogenetic +hematogenic +hematogenous +hematoglobulin +hematography +hematohidrosis +hematoid +hematoidin +hematoids +hematolymphangioma +hematolin +hematolysis +hematolite +hematolytic +hematology +hematologic +hematological +hematologies +hematologist +hematologists +hematoma +hematomancy +hematomas +hematomata +hematometer +hematometra +hematometry +hematomyelia +hematomyelitis +hematomphalocele +hematonephrosis +hematonic +hematopathology +hematopericardium +hematopexis +hematophagous +hematophyte +hematophobia +hematoplast +hematoplastic +hematopoiesis +hematopoietic +hematopoietically +hematoporphyria +hematoporphyrin +hematoporphyrinuria +hematorrhachis +hematorrhea +hematosalpinx +hematoscope +hematoscopy +hematose +hematosepsis +hematosin +hematosis +hematospectrophotometer +hematospectroscope +hematospermatocele +hematospermia +hematostibiite +hematotherapy +hematothermal +hematothorax +hematoxic +hematoxylic +hematoxylin +hematozymosis +hematozymotic +hematozoa +hematozoal +hematozoan +hematozoic +hematozoon +hematozzoa +hematuresis +hematuria +hematuric +hemautogram +hemautograph +hemautography +hemautographic +heme +hemelytra +hemelytral +hemelytron +hemelytrum +hemelyttra +hemellitene +hemellitic +hemen +hemera +hemeralope +hemeralopia +hemeralopic +hemerythrin +hemerobaptism +hemerobaptist +hemerobian +hemerobiid +hemerobiidae +hemerobius +hemerocallis +hemerology +hemerologium +hemes +hemiablepsia +hemiacetal +hemiachromatopsia +hemiageusia +hemiageustia +hemialbumin +hemialbumose +hemialbumosuria +hemialgia +hemiamaurosis +hemiamb +hemiamblyopia +hemiamyosthenia +hemianacusia +hemianalgesia +hemianatropous +hemianesthesia +hemianopia +hemianopic +hemianopsia +hemianoptic +hemianosmia +hemiapraxia +hemiascales +hemiasci +hemiascomycetes +hemiasynergia +hemiataxy +hemiataxia +hemiathetosis +hemiatrophy +hemiauxin +hemiazygous +hemibasidiales +hemibasidii +hemibasidiomycetes +hemibasidium +hemibathybian +hemibenthic +hemibenthonic +hemibranch +hemibranchiate +hemibranchii +hemic +hemicanities +hemicardia +hemicardiac +hemicarp +hemicatalepsy +hemicataleptic +hemicellulose +hemicentrum +hemicephalous +hemicerebrum +hemicholinium +hemichorda +hemichordate +hemichorea +hemichromatopsia +hemicycle +hemicyclic +hemicyclium +hemicylindrical +hemicircle +hemicircular +hemiclastic +hemicollin +hemicrane +hemicrany +hemicrania +hemicranic +hemicrystalline +hemidactyl +hemidactylous +hemidactylus +hemidemisemiquaver +hemidiapente +hemidiaphoresis +hemidysergia +hemidysesthesia +hemidystrophy +hemiditone +hemidomatic +hemidome +hemidrachm +hemiekton +hemielytra +hemielytral +hemielytron +hemielliptic +hemiepes +hemiepilepsy +hemifacial +hemiform +hemigale +hemigalus +hemiganus +hemigastrectomy +hemigeusia +hemiglyph +hemiglobin +hemiglossal +hemiglossitis +hemignathous +hemihdry +hemihedral +hemihedrally +hemihedric +hemihedrism +hemihedron +hemihydrate +hemihydrated +hemihydrosis +hemihypalgesia +hemihyperesthesia +hemihyperidrosis +hemihypertonia +hemihypertrophy +hemihypesthesia +hemihypoesthesia +hemihypotonia +hemiholohedral +hemikaryon +hemikaryotic +hemilaminectomy +hemilaryngectomy +hemileia +hemilethargy +hemiligulate +hemilingual +hemimellitene +hemimellitic +hemimelus +hemimeridae +hemimerus +hemimetabola +hemimetabole +hemimetaboly +hemimetabolic +hemimetabolism +hemimetabolous +hemimetamorphic +hemimetamorphosis +hemimetamorphous +hemimyaria +hemimorph +hemimorphy +hemimorphic +hemimorphism +hemimorphite +hemin +hemina +hemine +heminee +hemineurasthenia +hemingway +hemins +hemiobol +hemiola +hemiolas +hemiolia +hemiolic +hemionus +hemiope +hemiopia +hemiopic +hemiopsia +hemiorthotype +hemiparalysis +hemiparanesthesia +hemiparaplegia +hemiparasite +hemiparasitic +hemiparasitism +hemiparesis +hemiparesthesia +hemiparetic +hemipenis +hemipeptone +hemiphrase +hemipic +hemipinnate +hemipyramid +hemiplane +hemiplankton +hemiplegy +hemiplegia +hemiplegic +hemipod +hemipodan +hemipode +hemipodii +hemipodius +hemippe +hemiprism +hemiprismatic +hemiprotein +hemipter +hemiptera +hemipteral +hemipteran +hemipteroid +hemipterology +hemipterological +hemipteron +hemipterous +hemipters +hemiquinonoid +hemiramph +hemiramphidae +hemiramphinae +hemiramphine +hemiramphus +hemisaprophyte +hemisaprophytic +hemiscotosis +hemisect +hemisection +hemisymmetry +hemisymmetrical +hemisystematic +hemisystole +hemispasm +hemispheral +hemisphere +hemisphered +hemispheres +hemispheric +hemispherical +hemispherically +hemispheroid +hemispheroidal +hemispherule +hemistater +hemistich +hemistichal +hemistichs +hemistrumectomy +hemiterata +hemiteratic +hemiteratics +hemitery +hemiteria +hemiterpene +hemithyroidectomy +hemitype +hemitypic +hemitone +hemitremor +hemitrichous +hemitriglyph +hemitropal +hemitrope +hemitropy +hemitropic +hemitropism +hemitropous +hemivagotony +hemizygote +hemizygous +heml +hemline +hemlines +hemlock +hemlocks +hemmed +hemmel +hemmer +hemmers +hemming +hemoalkalimeter +hemoblast +hemochromatosis +hemochromatotic +hemochrome +hemochromogen +hemochromometer +hemochromometry +hemocyanin +hemocyte +hemocytes +hemocytoblast +hemocytoblastic +hemocytogenesis +hemocytolysis +hemocytometer +hemocytotripsis +hemocytozoon +hemocyturia +hemoclasia +hemoclasis +hemoclastic +hemocoel +hemocoele +hemocoelic +hemocoelom +hemocoels +hemoconcentration +hemoconia +hemoconiosis +hemocry +hemocrystallin +hemoculture +hemodia +hemodiagnosis +hemodialyses +hemodialysis +hemodialyzer +hemodilution +hemodynameter +hemodynamic +hemodynamically +hemodynamics +hemodystrophy +hemodrometer +hemodrometry +hemodromograph +hemodromometer +hemoerythrin +hemoflagellate +hemofuscin +hemogastric +hemogenesis +hemogenetic +hemogenia +hemogenic +hemogenous +hemoglobic +hemoglobin +hemoglobinemia +hemoglobinic +hemoglobiniferous +hemoglobinocholia +hemoglobinometer +hemoglobinopathy +hemoglobinophilic +hemoglobinous +hemoglobinuria +hemoglobinuric +hemoglobulin +hemogram +hemogregarine +hemoid +hemokonia +hemokoniosis +hemol +hemoleucocyte +hemoleucocytic +hemolymph +hemolymphatic +hemolysate +hemolysin +hemolysis +hemolytic +hemolyze +hemolyzed +hemolyzes +hemolyzing +hemology +hemologist +hemomanometer +hemometer +hemometry +hemonephrosis +hemopathy +hemopathology +hemopericardium +hemoperitoneum +hemopexis +hemophage +hemophagy +hemophagia +hemophagocyte +hemophagocytosis +hemophagous +hemophile +hemophileae +hemophilia +hemophiliac +hemophiliacs +hemophilic +hemophilioid +hemophilus +hemophobia +hemophthalmia +hemophthisis +hemopiezometer +hemopyrrole +hemoplasmodium +hemoplastic +hemopneumothorax +hemopod +hemopoiesis +hemopoietic +hemoproctia +hemoprotein +hemoptysis +hemoptoe +hemorrhage +hemorrhaged +hemorrhages +hemorrhagic +hemorrhagin +hemorrhaging +hemorrhea +hemorrhodin +hemorrhoid +hemorrhoidal +hemorrhoidectomy +hemorrhoidectomies +hemorrhoids +hemosalpinx +hemoscope +hemoscopy +hemosiderin +hemosiderosis +hemosiderotic +hemospasia +hemospastic +hemospermia +hemosporid +hemosporidian +hemostasia +hemostasis +hemostat +hemostatic +hemostats +hemotachometer +hemotherapeutics +hemotherapy +hemothorax +hemotoxic +hemotoxin +hemotrophe +hemotrophic +hemotropic +hemozoon +hemp +hempbush +hempen +hempherds +hempy +hempie +hempier +hempiest +hemplike +hemps +hempseed +hempseeds +hempstring +hempweed +hempweeds +hempwort +hems +hemself +hemstitch +hemstitched +hemstitcher +hemstitches +hemstitching +hemule +hen +henad +henbane +henbanes +henbill +henbit +henbits +hence +henceforth +henceforward +henceforwards +henchboy +henchman +henchmanship +henchmen +hencoop +hencoops +hencote +hend +hendecacolic +hendecagon +hendecagonal +hendecahedra +hendecahedral +hendecahedron +hendecahedrons +hendecane +hendecasemic +hendecasyllabic +hendecasyllable +hendecatoic +hendecyl +hendecoic +hendedra +hendy +hendiadys +hendly +hendness +heneicosane +henen +henequen +henequens +henequin +henequins +henfish +heng +henge +hengest +henhawk +henhearted +henheartedness +henhouse +henhouses +henhussy +henhussies +henyard +heniquen +heniquens +henism +henlike +henmoldy +henna +hennaed +hennaing +hennas +hennebique +hennery +henneries +hennes +henny +hennin +hennish +henogeny +henotheism +henotheist +henotheistic +henotic +henpeck +henpecked +henpecking +henpecks +henpen +henry +henrician +henries +henrietta +henrys +henroost +hens +hent +hented +hentenian +henter +henting +hentriacontane +hents +henware +henwife +henwile +henwise +henwoodite +heo +heortology +heortological +heortologion +hep +hepar +heparin +heparinization +heparinize +heparinized +heparinizing +heparinoid +heparins +hepatalgia +hepatatrophy +hepatatrophia +hepatauxe +hepatectomy +hepatectomies +hepatectomize +hepatectomized +hepatectomizing +hepatic +hepatica +hepaticae +hepatical +hepaticas +hepaticoduodenostomy +hepaticoenterostomy +hepaticoenterostomies +hepaticogastrostomy +hepaticology +hepaticologist +hepaticopulmonary +hepaticostomy +hepaticotomy +hepatics +hepatisation +hepatise +hepatised +hepatising +hepatite +hepatitis +hepatization +hepatize +hepatized +hepatizes +hepatizing +hepatocele +hepatocellular +hepatocirrhosis +hepatocystic +hepatocyte +hepatocolic +hepatodynia +hepatodysentery +hepatoduodenal +hepatoduodenostomy +hepatoenteric +hepatoflavin +hepatogastric +hepatogenic +hepatogenous +hepatography +hepatoid +hepatolenticular +hepatolysis +hepatolith +hepatolithiasis +hepatolithic +hepatolytic +hepatology +hepatological +hepatologist +hepatoma +hepatomalacia +hepatomas +hepatomata +hepatomegaly +hepatomegalia +hepatomelanosis +hepatonephric +hepatopancreas +hepatopathy +hepatoperitonitis +hepatopexy +hepatopexia +hepatophyma +hepatophlebitis +hepatophlebotomy +hepatopneumonic +hepatoportal +hepatoptosia +hepatoptosis +hepatopulmonary +hepatorenal +hepatorrhagia +hepatorrhaphy +hepatorrhea +hepatorrhexis +hepatorrhoea +hepatoscopy +hepatoscopies +hepatostomy +hepatotherapy +hepatotomy +hepatotoxemia +hepatotoxic +hepatotoxicity +hepatotoxin +hepatoumbilical +hepburn +hepcat +hepcats +hephaesteum +hephaestian +hephaestic +hephaestus +hephthemimer +hephthemimeral +hepialid +hepialidae +hepialus +heppen +hepper +hepplewhite +heptacapsular +heptace +heptachlor +heptachord +heptachronous +heptacolic +heptacosane +heptad +heptadecane +heptadecyl +heptadic +heptads +heptagynia +heptagynous +heptaglot +heptagon +heptagonal +heptagons +heptagrid +heptahedra +heptahedral +heptahedrdra +heptahedrical +heptahedron +heptahedrons +heptahexahedral +heptahydrate +heptahydrated +heptahydric +heptahydroxy +heptal +heptameride +heptameron +heptamerous +heptameter +heptameters +heptamethylene +heptametrical +heptanaphthene +heptanchus +heptandria +heptandrous +heptane +heptanes +heptanesian +heptangular +heptanoic +heptanone +heptapetalous +heptaphyllous +heptaploid +heptaploidy +heptapody +heptapodic +heptarch +heptarchal +heptarchy +heptarchic +heptarchical +heptarchies +heptarchist +heptarchs +heptasemic +heptasepalous +heptasyllabic +heptasyllable +heptaspermous +heptastich +heptastylar +heptastyle +heptastylos +heptastrophic +heptasulphide +heptateuch +heptatomic +heptatonic +heptatrema +heptavalent +heptene +hepteris +heptyl +heptylene +heptylic +heptine +heptyne +heptite +heptitol +heptode +heptoic +heptorite +heptose +heptoses +heptoxide +heptranchias +her +hera +heraclean +heracleid +heracleidan +heracleonite +heracleopolitan +heracleopolite +heracleum +heraclid +heraclidae +heraclidan +heraclitean +heracliteanism +heraclitic +heraclitical +heraclitism +herakles +herald +heralded +heraldess +heraldic +heraldical +heraldically +heralding +heraldist +heraldists +heraldize +heraldress +heraldry +heraldries +heralds +heraldship +herapathite +herat +heraud +heraus +herb +herba +herbaceous +herbaceously +herbage +herbaged +herbager +herbages +herbagious +herbal +herbalism +herbalist +herbalists +herbalize +herbals +herbane +herbar +herbarbaria +herbary +herbaria +herbarial +herbarian +herbariia +herbariiums +herbarism +herbarist +herbarium +herbariums +herbarize +herbarized +herbarizing +herbartian +herbartianism +herbbane +herber +herbergage +herberger +herbert +herbescent +herby +herbicidal +herbicidally +herbicide +herbicides +herbicolous +herbid +herbier +herbiest +herbiferous +herbish +herbist +herbivora +herbivore +herbivores +herbivorism +herbivority +herbivorous +herbivorously +herbivorousness +herbless +herblet +herblike +herbman +herborist +herborization +herborize +herborized +herborizer +herborizing +herbose +herbosity +herbous +herbrough +herbs +herbwife +herbwoman +hercynian +hercynite +hercogamy +hercogamous +herculanean +herculanensian +herculanian +herculean +hercules +herculeses +herculid +herd +herdboy +herdbook +herded +herder +herderite +herders +herdess +herdic +herdics +herding +herdlike +herdman +herdmen +herds +herdship +herdsman +herdsmen +herdswoman +herdswomen +herdwick +here +hereabout +hereabouts +hereadays +hereafter +hereafterward +hereagain +hereagainst +hereamong +hereanent +hereat +hereaway +hereaways +herebefore +hereby +heredes +heredia +heredipety +heredipetous +hereditability +hereditable +hereditably +heredital +hereditament +hereditaments +hereditary +hereditarian +hereditarianism +hereditarily +hereditariness +hereditarist +hereditas +hereditation +hereditative +heredity +heredities +hereditism +hereditist +hereditivity +heredium +heredofamilial +heredolues +heredoluetic +heredosyphilis +heredosyphilitic +heredosyphilogy +heredotuberculosis +hereford +herefords +herefore +herefrom +heregeld +heregild +herehence +herein +hereinabove +hereinafter +hereinbefore +hereinbelow +hereinto +herem +heremeit +herenach +hereness +hereniging +hereof +hereon +hereout +hereright +herero +heres +heresy +heresiarch +heresies +heresimach +heresiographer +heresiography +heresiographies +heresiologer +heresiology +heresiologies +heresiologist +heresyphobia +heresyproof +heretic +heretical +heretically +hereticalness +hereticate +hereticated +heretication +hereticator +hereticide +hereticize +heretics +hereto +heretoch +heretofore +heretoforetime +heretoga +heretrices +heretrix +heretrixes +hereunder +hereunto +hereupon +hereupto +hereward +herewith +herewithal +herezeld +hery +herigaut +herile +heriot +heriotable +heriots +herisson +heritability +heritabilities +heritable +heritably +heritage +heritages +heritance +heritiera +heritor +heritors +heritress +heritrices +heritrix +heritrixes +herl +herling +herls +herm +herma +hermae +hermaean +hermai +hermaic +herman +hermandad +hermaphrodeity +hermaphrodism +hermaphrodite +hermaphrodites +hermaphroditic +hermaphroditical +hermaphroditically +hermaphroditish +hermaphroditism +hermaphroditize +hermaphroditus +hermatypic +hermele +hermeneut +hermeneutic +hermeneutical +hermeneutically +hermeneutics +hermeneutist +hermes +hermesian +hermesianism +hermetic +hermetical +hermetically +hermeticism +hermetics +hermetism +hermetist +hermi +hermidin +herminone +hermione +hermit +hermitage +hermitages +hermitary +hermitess +hermitian +hermitic +hermitical +hermitically +hermitish +hermitism +hermitize +hermitlike +hermitry +hermitries +hermits +hermitship +hermo +hermodact +hermodactyl +hermogenian +hermogeniarnun +hermoglyphic +hermoglyphist +hermokopid +herms +hern +hernandia +hernandiaceae +hernandiaceous +hernanesell +hernani +hernant +herne +hernia +herniae +hernial +herniary +herniaria +herniarin +hernias +herniate +herniated +herniates +herniating +herniation +herniations +hernioenterotomy +hernioid +herniology +hernioplasty +hernioplasties +herniopuncture +herniorrhaphy +herniorrhaphies +herniotome +herniotomy +herniotomies +herniotomist +herns +hernsew +hernshaw +hero +heroarchy +herodian +herodianic +herodii +herodiones +herodionine +heroes +heroess +herohead +herohood +heroic +heroical +heroically +heroicalness +heroicity +heroicly +heroicness +heroicomic +heroicomical +heroics +heroid +heroides +heroify +heroin +heroine +heroines +heroineship +heroinism +heroinize +heroins +heroism +heroisms +heroistic +heroization +heroize +heroized +heroizes +heroizing +herola +herolike +heromonger +heron +heronbill +heroner +heronite +heronry +heronries +herons +heronsew +heroogony +heroology +heroologist +herophile +herophilist +heros +heroship +herotheism +heroworshipper +herp +herpangina +herpes +herpeses +herpestes +herpestinae +herpestine +herpesvirus +herpet +herpetic +herpetiform +herpetism +herpetography +herpetoid +herpetology +herpetologic +herpetological +herpetologically +herpetologist +herpetologists +herpetomonad +herpetomonas +herpetophobia +herpetotomy +herpetotomist +herpolhode +herpotrichia +herquein +herr +herrengrundite +herrenvolk +herrgrdsost +herry +herried +herries +herrying +herryment +herring +herringbone +herringbones +herringer +herringlike +herrings +herrnhuter +hers +hersall +herschel +herschelian +herschelite +herse +hersed +herself +hershey +hership +hersir +hert +hertfordshire +hertz +hertzes +hertzian +heruli +herulian +hervati +herve +herzegovinian +hes +heshvan +hesychasm +hesychast +hesychastic +hesiodic +hesione +hesionidae +hesitance +hesitancy +hesitancies +hesitant +hesitantly +hesitate +hesitated +hesitater +hesitaters +hesitates +hesitating +hesitatingly +hesitatingness +hesitation +hesitations +hesitative +hesitatively +hesitator +hesitatory +hesped +hespel +hespeperidia +hesper +hespera +hesperia +hesperian +hesperic +hesperid +hesperidate +hesperidene +hesperideous +hesperides +hesperidia +hesperidian +hesperidin +hesperidium +hesperiid +hesperiidae +hesperinon +hesperinos +hesperis +hesperitin +hesperornis +hesperornithes +hesperornithid +hesperornithiformes +hesperornithoid +hesperus +hessian +hessians +hessite +hessites +hessonite +hest +hester +hestern +hesternal +hesther +hesthogenous +hestia +hests +het +hetaera +hetaerae +hetaeras +hetaery +hetaeria +hetaeric +hetaerio +hetaerism +hetaerist +hetaeristic +hetaerocracy +hetaerolite +hetaira +hetairai +hetairas +hetairy +hetairia +hetairic +hetairism +hetairist +hetairistic +hetchel +hete +heteradenia +heteradenic +heterakid +heterakis +heteralocha +heterandry +heterandrous +heteratomic +heterauxesis +heteraxial +heterecious +heteric +heterically +hetericism +hetericist +heterism +heterization +heterize +hetero +heteroagglutinin +heteroalbumose +heteroaromatic +heteroatom +heteroatomic +heteroautotrophic +heteroauxin +heteroblasty +heteroblastic +heteroblastically +heterocaryon +heterocaryosis +heterocaryotic +heterocarpism +heterocarpous +heterocarpus +heterocaseose +heterocellular +heterocentric +heterocephalous +heterocera +heterocerc +heterocercal +heterocercality +heterocercy +heterocerous +heterochiral +heterochlamydeous +heterochloridales +heterochromatic +heterochromatin +heterochromatism +heterochromatization +heterochromatized +heterochrome +heterochromy +heterochromia +heterochromic +heterochromosome +heterochromous +heterochrony +heterochronic +heterochronism +heterochronistic +heterochronous +heterochrosis +heterochthon +heterochthonous +heterocycle +heterocyclic +heterocyst +heterocystous +heterocline +heteroclinous +heteroclital +heteroclite +heteroclitic +heteroclitica +heteroclitical +heteroclitous +heterocoela +heterocoelous +heterocotylea +heterocrine +heterodactyl +heterodactylae +heterodactylous +heterodera +heterodyne +heterodyned +heterodyning +heterodon +heterodont +heterodonta +heterodontidae +heterodontism +heterodontoid +heterodontus +heterodox +heterodoxal +heterodoxy +heterodoxical +heterodoxies +heterodoxly +heterodoxness +heterodromy +heterodromous +heteroecy +heteroecious +heteroeciously +heteroeciousness +heteroecism +heteroecismal +heteroepy +heteroepic +heteroerotic +heteroerotism +heterofermentative +heterofertilization +heterogalactic +heterogamete +heterogamety +heterogametic +heterogametism +heterogamy +heterogamic +heterogamous +heterogangliate +heterogen +heterogene +heterogeneal +heterogenean +heterogeneity +heterogeneities +heterogeneous +heterogeneously +heterogeneousness +heterogenesis +heterogenetic +heterogenetically +heterogeny +heterogenic +heterogenicity +heterogenisis +heterogenist +heterogenous +heterogyna +heterogynal +heterogynous +heteroglobulose +heterognath +heterognathi +heterogone +heterogony +heterogonic +heterogonism +heterogonous +heterogonously +heterograft +heterography +heterographic +heterographical +heterographies +heteroicous +heteroimmune +heteroinfection +heteroinoculable +heteroinoculation +heterointoxication +heterokaryon +heterokaryosis +heterokaryotic +heterokinesia +heterokinesis +heterokinetic +heterokontae +heterokontan +heterolalia +heterolateral +heterolecithal +heterolysin +heterolysis +heterolith +heterolytic +heterolobous +heterology +heterologic +heterological +heterologically +heterologies +heterologous +heterologously +heteromallous +heteromastigate +heteromastigote +heteromeles +heteromera +heteromeral +heteromeran +heteromeri +heteromeric +heteromerous +heteromesotrophic +heterometabola +heterometabole +heterometaboly +heterometabolic +heterometabolism +heterometabolous +heterometatrophic +heterometric +heteromi +heteromya +heteromyaria +heteromyarian +heteromyidae +heteromys +heteromita +heteromorpha +heteromorphae +heteromorphy +heteromorphic +heteromorphism +heteromorphite +heteromorphosis +heteromorphous +heteronereid +heteronereis +heteroneura +heteronym +heteronymy +heteronymic +heteronymous +heteronymously +heteronomy +heteronomic +heteronomous +heteronomously +heteronuclear +heteroousia +heteroousian +heteroousiast +heteroousious +heteropathy +heteropathic +heteropelmous +heteropetalous +heterophaga +heterophagi +heterophagous +heterophasia +heterophemy +heterophemism +heterophemist +heterophemistic +heterophemize +heterophil +heterophile +heterophylesis +heterophyletic +heterophyly +heterophilic +heterophylly +heterophyllous +heterophyte +heterophytic +heterophobia +heterophony +heterophonic +heterophoria +heterophoric +heteropia +heteropycnosis +heteropidae +heteroplasia +heteroplasm +heteroplasty +heteroplastic +heteroplasties +heteroploid +heteroploidy +heteropod +heteropoda +heteropodal +heteropodous +heteropolar +heteropolarity +heteropoly +heteropolysaccharide +heteroproteide +heteroproteose +heteropter +heteroptera +heteropterous +heteroptics +heterorhachis +heteros +heteroscedasticity +heteroscian +heteroscope +heteroscopy +heteroses +heterosex +heterosexual +heterosexuality +heterosexually +heterosexuals +heteroside +heterosyllabic +heterosiphonales +heterosis +heterosomata +heterosomati +heterosomatous +heterosome +heterosomi +heterosomous +heterosphere +heterosporeae +heterospory +heterosporic +heterosporium +heterosporous +heterostatic +heterostemonous +heterostyled +heterostyly +heterostylism +heterostylous +heterostraca +heterostracan +heterostraci +heterostrophy +heterostrophic +heterostrophous +heterostructure +heterosuggestion +heterotactic +heterotactous +heterotaxy +heterotaxia +heterotaxic +heterotaxis +heterotelic +heterotelism +heterothallic +heterothallism +heterothermal +heterothermic +heterotic +heterotype +heterotypic +heterotypical +heterotopy +heterotopia +heterotopic +heterotopism +heterotopous +heterotransplant +heterotransplantation +heterotrich +heterotricha +heterotrichales +heterotrichida +heterotrichosis +heterotrichous +heterotropal +heterotroph +heterotrophy +heterotrophic +heterotrophically +heterotropia +heterotropic +heterotropous +heteroxanthine +heteroxenous +heterozetesis +heterozygosis +heterozygosity +heterozygote +heterozygotes +heterozygotic +heterozygous +heterozygousness +heth +hethen +hething +heths +hetman +hetmanate +hetmans +hetmanship +hetter +hetterly +hetty +hettie +heuau +heuch +heuchera +heuchs +heugh +heughs +heuk +heulandite +heumite +heureka +heuretic +heuristic +heuristically +heuristics +heuvel +hevea +heved +hevi +hew +hewable +hewe +hewed +hewel +hewer +hewers +hewettite +hewgag +hewgh +hewhall +hewhole +hewing +hewn +hews +hewt +hex +hexa +hexabasic +hexabiblos +hexabiose +hexabromid +hexabromide +hexacanth +hexacanthous +hexacapsular +hexacarbon +hexace +hexachloraphene +hexachlorethane +hexachloride +hexachlorocyclohexane +hexachloroethane +hexachlorophene +hexachord +hexachronous +hexacyclic +hexacid +hexacolic +hexacoralla +hexacorallan +hexacorallia +hexacosane +hexacosihedroid +hexact +hexactinal +hexactine +hexactinellid +hexactinellida +hexactinellidan +hexactinelline +hexactinian +hexad +hexadactyle +hexadactyly +hexadactylic +hexadactylism +hexadactylous +hexadd +hexade +hexadecahedroid +hexadecane +hexadecanoic +hexadecene +hexadecyl +hexadecimal +hexades +hexadic +hexadiene +hexadiine +hexadiyne +hexads +hexaemeric +hexaemeron +hexafluoride +hexafoil +hexagyn +hexagynia +hexagynian +hexagynous +hexaglot +hexagon +hexagonal +hexagonally +hexagonial +hexagonical +hexagonous +hexagons +hexagram +hexagrammidae +hexagrammoid +hexagrammos +hexagrams +hexahedra +hexahedral +hexahedron +hexahedrons +hexahemeric +hexahemeron +hexahydrate +hexahydrated +hexahydric +hexahydride +hexahydrite +hexahydrobenzene +hexahydrothymol +hexahydroxy +hexahydroxycyclohexane +hexakisoctahedron +hexakistetrahedron +hexamer +hexameral +hexameric +hexamerism +hexameron +hexamerous +hexameter +hexameters +hexamethylenamine +hexamethylene +hexamethylenetetramine +hexamethonium +hexametral +hexametric +hexametrical +hexametrist +hexametrize +hexametrographer +hexamine +hexamines +hexamita +hexamitiasis +hexammin +hexammine +hexammino +hexanal +hexanaphthene +hexanchidae +hexanchus +hexandry +hexandria +hexandric +hexandrous +hexane +hexanedione +hexanes +hexangle +hexangular +hexangularly +hexanitrate +hexanitrodiphenylamine +hexapartite +hexaped +hexapetaloid +hexapetaloideous +hexapetalous +hexaphyllous +hexapla +hexaplar +hexaplarian +hexaplaric +hexaplas +hexaploid +hexaploidy +hexapod +hexapoda +hexapodal +hexapodan +hexapody +hexapodic +hexapodies +hexapodous +hexapods +hexapterous +hexaradial +hexarch +hexarchy +hexarchies +hexascha +hexaseme +hexasemic +hexasepalous +hexasyllabic +hexasyllable +hexaspermous +hexastemonous +hexaster +hexastich +hexasticha +hexastichy +hexastichic +hexastichon +hexastichous +hexastigm +hexastylar +hexastyle +hexastylos +hexasulphide +hexatetrahedron +hexateuch +hexateuchal +hexathlon +hexatomic +hexatriacontane +hexatriose +hexavalent +hexaxon +hexdra +hexecontane +hexed +hexenbesen +hexene +hexer +hexerei +hexereis +hexeris +hexers +hexes +hexestrol +hexicology +hexicological +hexyl +hexylene +hexylic +hexylresorcinol +hexyls +hexine +hexyne +hexing +hexiology +hexiological +hexis +hexitol +hexobarbital +hexobiose +hexoctahedral +hexoctahedron +hexode +hexoestrol +hexogen +hexoic +hexoylene +hexokinase +hexone +hexones +hexonic +hexosamine +hexosaminic +hexosan +hexosans +hexose +hexosediphosphoric +hexosemonophosphoric +hexosephosphatase +hexosephosphoric +hexoses +hexpartite +hexs +hexsub +hezekiah +hezron +hezronites +hf +hg +hgrnotine +hgt +hgwy +hhd +hi +hy +hia +hyacine +hyacinth +hyacinthia +hyacinthian +hyacinthin +hyacinthine +hyacinths +hyacinthus +hyades +hyaena +hyaenanche +hyaenarctos +hyaenas +hyaenic +hyaenid +hyaenidae +hyaenodon +hyaenodont +hyaenodontoid +hyahya +hyakume +hyalescence +hyalescent +hyalin +hyaline +hyalines +hyalinization +hyalinize +hyalinized +hyalinizing +hyalinocrystalline +hyalinosis +hyalins +hyalite +hyalites +hyalithe +hyalitis +hyaloandesite +hyalobasalt +hyalocrystalline +hyalodacite +hyalogen +hyalogens +hyalograph +hyalographer +hyalography +hyaloid +hyaloiditis +hyaloids +hyaloliparite +hyalolith +hyalomelan +hyalomere +hyalomucoid +hyalonema +hyalophagia +hyalophane +hyalophyre +hyalopilitic +hyaloplasm +hyaloplasma +hyaloplasmic +hyalopsite +hyalopterous +hyalosiderite +hyalospongia +hyalotekite +hyalotype +hyalts +hyaluronic +hyaluronidase +hianakoto +hiant +hiatal +hiate +hiation +hiatus +hiatuses +hiawatha +hibachi +hibachis +hybanthus +hibbertia +hibbin +hibernacle +hibernacula +hibernacular +hibernaculum +hibernal +hibernate +hibernated +hibernates +hibernating +hibernation +hibernator +hibernators +hibernia +hibernian +hibernianism +hibernic +hibernical +hibernically +hibernicism +hibernicize +hibernization +hibernize +hibernology +hibernologist +hibiscus +hibiscuses +hibito +hibitos +hibla +hybla +hyblaea +hyblaean +hyblan +hybodont +hybodus +hybosis +hybrid +hybrida +hybridae +hybridal +hybridation +hybridisable +hybridise +hybridised +hybridiser +hybridising +hybridism +hybridist +hybridity +hybridizable +hybridization +hybridizations +hybridize +hybridized +hybridizer +hybridizers +hybridizes +hybridizing +hybridous +hybrids +hybris +hybrises +hybristic +hibunci +hic +hicaco +hicatee +hiccough +hiccoughed +hiccoughing +hiccoughs +hiccup +hiccuped +hiccuping +hiccupped +hiccupping +hiccups +hicht +hichu +hick +hickey +hickeyes +hickeys +hicket +hicky +hickified +hickish +hickishness +hickory +hickories +hicks +hickscorner +hicksite +hickway +hickwall +hicoria +hid +hyd +hidable +hidage +hydage +hidalgism +hidalgo +hidalgoism +hidalgos +hydantoate +hydantoic +hydantoin +hidated +hydathode +hydatic +hydatid +hydatidiform +hydatidinous +hydatidocele +hydatids +hydatiform +hydatigenous +hydatina +hidation +hydatogenesis +hydatogenic +hydatogenous +hydatoid +hydatomorphic +hydatomorphism +hydatopyrogenic +hydatopneumatic +hydatopneumatolytic +hydatoscopy +hidatsa +hiddels +hidden +hiddenite +hiddenly +hiddenmost +hiddenness +hide +hyde +hideaway +hideaways +hidebind +hidebound +hideboundness +hided +hidegeld +hidel +hideland +hideless +hideling +hideosity +hideous +hideously +hideousness +hideout +hideouts +hider +hiders +hides +hiding +hidings +hidling +hidlings +hidlins +hydnaceae +hydnaceous +hydnocarpate +hydnocarpic +hydnocarpus +hydnoid +hydnora +hydnoraceae +hydnoraceous +hydnum +hydra +hydracetin +hydrachna +hydrachnid +hydrachnidae +hydracid +hydracids +hydracoral +hydracrylate +hydracrylic +hydractinia +hydractinian +hidradenitis +hydradephaga +hydradephagan +hydradephagous +hydrae +hydraemia +hydraemic +hydragog +hydragogy +hydragogs +hydragogue +hydralazine +hydramide +hydramine +hydramnion +hydramnios +hydrangea +hydrangeaceae +hydrangeaceous +hydrangeas +hydrant +hydranth +hydranths +hydrants +hydrarch +hydrargillite +hydrargyrate +hydrargyria +hydrargyriasis +hydrargyric +hydrargyrism +hydrargyrosis +hydrargyrum +hydrarthrosis +hydrarthrus +hydras +hydrase +hydrases +hydrastine +hydrastinine +hydrastis +hydrate +hydrated +hydrates +hydrating +hydration +hydrations +hydrator +hydrators +hydratropic +hydraucone +hydraul +hydrauli +hydraulic +hydraulically +hydraulician +hydraulicity +hydraulicked +hydraulicking +hydraulicon +hydraulics +hydraulis +hydraulist +hydraulus +hydrauluses +hydrazide +hydrazidine +hydrazyl +hydrazimethylene +hydrazin +hydrazine +hydrazino +hydrazo +hydrazoate +hydrazobenzene +hydrazoic +hydrazone +hydremia +hydremic +hydrencephalocele +hydrencephaloid +hydrencephalus +hydria +hydriad +hydriae +hydriatry +hydriatric +hydriatrist +hydric +hydrically +hydrid +hydride +hydrides +hydrids +hydriform +hydrindene +hydriodate +hydriodic +hydriodide +hydrion +hydriotaphia +hydriote +hydro +hydroa +hydroacoustic +hydroadipsia +hydroaeric +hydroairplane +hydroalcoholic +hydroaromatic +hydroatmospheric +hydroaviation +hydrobarometer +hydrobates +hydrobatidae +hydrobenzoin +hydrobilirubin +hydrobiology +hydrobiological +hydrobiologist +hydrobiosis +hydrobiplane +hydrobomb +hydroboracite +hydroborofluoric +hydrobranchiate +hydrobromate +hydrobromic +hydrobromid +hydrobromide +hydrocarbide +hydrocarbon +hydrocarbonaceous +hydrocarbonate +hydrocarbonic +hydrocarbonous +hydrocarbons +hydrocarbostyril +hydrocarburet +hydrocardia +hydrocaryaceae +hydrocaryaceous +hydrocatalysis +hydrocauline +hydrocaulus +hydrocele +hydrocellulose +hydrocephali +hydrocephaly +hydrocephalic +hydrocephalies +hydrocephalocele +hydrocephaloid +hydrocephalous +hydrocephalus +hydroceramic +hydrocerussite +hydrocharidaceae +hydrocharidaceous +hydrocharis +hydrocharitaceae +hydrocharitaceous +hydrochelidon +hydrochemical +hydrochemistry +hydrochlorate +hydrochlorauric +hydrochloric +hydrochlorid +hydrochloride +hydrochlorothiazide +hydrochlorplatinic +hydrochlorplatinous +hydrochoerus +hydrocholecystis +hydrocyanate +hydrocyanic +hydrocyanide +hydrocycle +hydrocyclic +hydrocyclist +hydrocinchonine +hydrocinnamaldehyde +hydrocinnamic +hydrocinnamyl +hydrocinnamoyl +hydrocyon +hydrocirsocele +hydrocyst +hydrocystic +hidrocystoma +hydrocladium +hydroclastic +hydrocleis +hydroclimate +hydrocobalticyanic +hydrocoele +hydrocollidine +hydrocolloid +hydrocolloidal +hydroconion +hydrocoral +hydrocorallia +hydrocorallinae +hydrocoralline +hydrocores +hydrocorisae +hydrocorisan +hydrocortisone +hydrocotarnine +hydrocotyle +hydrocoumaric +hydrocrack +hydrocracking +hydrocupreine +hydrodamalidae +hydrodamalis +hydrodesulfurization +hydrodesulphurization +hydrodictyaceae +hydrodictyon +hydrodynamic +hydrodynamical +hydrodynamically +hydrodynamicist +hydrodynamics +hydrodynamometer +hydrodrome +hydrodromica +hydrodromican +hydroeconomics +hydroelectric +hydroelectrically +hydroelectricity +hydroelectrization +hydroergotinine +hydroextract +hydroextractor +hydroferricyanic +hydroferrocyanate +hydroferrocyanic +hydrofluate +hydrofluoboric +hydrofluoric +hydrofluorid +hydrofluoride +hydrofluosilicate +hydrofluosilicic +hydrofluozirconic +hydrofoil +hydrofoils +hydroformer +hydroformylation +hydroforming +hydrofranklinite +hydrofuge +hydrogalvanic +hydrogasification +hydrogel +hydrogels +hydrogen +hydrogenase +hydrogenate +hydrogenated +hydrogenates +hydrogenating +hydrogenation +hydrogenations +hydrogenator +hydrogenic +hydrogenide +hydrogenisation +hydrogenise +hydrogenised +hydrogenising +hydrogenium +hydrogenization +hydrogenize +hydrogenized +hydrogenizing +hydrogenolyses +hydrogenolysis +hydrogenomonas +hydrogenous +hydrogens +hydrogeology +hydrogeologic +hydrogeological +hydrogeologist +hydrogymnastics +hydroglider +hydrognosy +hydrogode +hydrograph +hydrographer +hydrographers +hydrography +hydrographic +hydrographical +hydrographically +hydroguret +hydrohalide +hydrohematite +hydrohemothorax +hydroid +hydroida +hydroidea +hydroidean +hydroids +hydroiodic +hydrokineter +hydrokinetic +hydrokinetical +hydrokinetics +hydrol +hydrolant +hydrolase +hydrolatry +hydrolea +hydroleaceae +hydrolysable +hydrolysate +hydrolysation +hydrolyse +hydrolysed +hydrolyser +hydrolyses +hydrolysing +hydrolysis +hydrolyst +hydrolyte +hydrolytic +hydrolytically +hydrolyzable +hydrolyzate +hydrolyzation +hydrolize +hydrolyze +hydrolyzed +hydrolyzer +hydrolyzing +hydrology +hydrologic +hydrological +hydrologically +hydrologist +hydrologists +hydromagnesite +hydromagnetic +hydromagnetics +hydromancer +hidromancy +hydromancy +hydromania +hydromaniac +hydromantic +hydromantical +hydromantically +hydromassage +hydrome +hydromechanic +hydromechanical +hydromechanics +hydromedusa +hydromedusae +hydromedusan +hydromedusoid +hydromel +hydromels +hydromeningitis +hydromeningocele +hydrometallurgy +hydrometallurgical +hydrometallurgically +hydrometamorphism +hydrometeor +hydrometeorology +hydrometeorologic +hydrometeorological +hydrometeorologist +hydrometer +hydrometers +hydrometra +hydrometry +hydrometric +hydrometrical +hydrometrid +hydrometridae +hydromica +hydromicaceous +hydromyelia +hydromyelocele +hydromyoma +hydromys +hydromonoplane +hydromorph +hydromorphy +hydromorphic +hydromorphous +hydromotor +hydronaut +hydrone +hydronegative +hydronephelite +hydronephrosis +hydronephrotic +hydronic +hydronically +hydronitric +hydronitrogen +hydronitroprussic +hydronitrous +hydronium +hydropac +hydroparacoumaric +hydroparastatae +hydropath +hydropathy +hydropathic +hydropathical +hydropathically +hydropathist +hydropericarditis +hydropericardium +hydroperiod +hydroperitoneum +hydroperitonitis +hydroperoxide +hydrophane +hydrophanous +hydrophid +hydrophidae +hydrophil +hydrophylacium +hydrophile +hydrophily +hydrophilic +hydrophilicity +hydrophilid +hydrophilidae +hydrophilism +hydrophilite +hydrophyll +hydrophyllaceae +hydrophyllaceous +hydrophylliaceous +hydrophyllium +hydrophyllum +hydrophiloid +hydrophilous +hydrophinae +hydrophis +hydrophysometra +hydrophyte +hydrophytic +hydrophytism +hydrophyton +hydrophytous +hydrophobe +hydrophoby +hydrophobia +hydrophobic +hydrophobical +hydrophobicity +hydrophobist +hydrophobophobia +hydrophobous +hydrophoid +hydrophone +hydrophones +hydrophora +hydrophoran +hydrophore +hydrophoria +hydrophorous +hydrophthalmia +hydrophthalmos +hydrophthalmus +hydropic +hydropical +hydropically +hydropigenous +hydroplane +hydroplaned +hydroplaner +hydroplanes +hydroplaning +hydroplanula +hydroplatinocyanic +hydroplutonic +hydropneumatic +hydropneumatization +hydropneumatosis +hydropneumopericardium +hydropneumothorax +hidropoiesis +hidropoietic +hydropolyp +hydroponic +hydroponically +hydroponicist +hydroponics +hydroponist +hydropositive +hydropot +hydropotes +hydropower +hydropropulsion +hydrops +hydropses +hydropsy +hydropsies +hydropterideae +hydroptic +hydropult +hydropultic +hydroquinine +hydroquinol +hydroquinoline +hydroquinone +hydrorachis +hydrorhiza +hydrorhizae +hydrorhizal +hydrorrhachis +hydrorrhachitis +hydrorrhea +hydrorrhoea +hydrorubber +hydros +hydrosalpinx +hydrosalt +hydrosarcocele +hydroscope +hydroscopic +hydroscopical +hydroscopicity +hydroscopist +hydroselenic +hydroselenide +hydroselenuret +hydroseparation +hydrosere +hidroses +hydrosilicate +hydrosilicon +hidrosis +hydroski +hydrosol +hydrosole +hydrosolic +hydrosols +hydrosoma +hydrosomal +hydrosomata +hydrosomatous +hydrosome +hydrosorbic +hydrospace +hydrosphere +hydrospheres +hydrospheric +hydrospire +hydrospiric +hydrostat +hydrostatic +hydrostatical +hydrostatically +hydrostatician +hydrostatics +hydrostome +hydrosulfate +hydrosulfide +hydrosulfite +hydrosulfurous +hydrosulphate +hydrosulphide +hydrosulphite +hydrosulphocyanic +hydrosulphurated +hydrosulphuret +hydrosulphureted +hydrosulphuric +hydrosulphuryl +hydrosulphurous +hydrotachymeter +hydrotactic +hydrotalcite +hydrotasimeter +hydrotaxis +hydrotechny +hydrotechnic +hydrotechnical +hydrotechnologist +hydroterpene +hydrotheca +hydrothecae +hydrothecal +hydrotherapeutic +hydrotherapeutical +hydrotherapeutically +hydrotherapeutician +hydrotherapeuticians +hydrotherapeutics +hydrotherapy +hydrotherapies +hydrotherapist +hydrothermal +hydrothermally +hydrothoracic +hydrothorax +hidrotic +hydrotic +hydrotical +hydrotimeter +hydrotimetry +hydrotimetric +hydrotype +hydrotomy +hydrotropic +hydrotropically +hydrotropism +hydroturbine +hydrous +hydrovane +hydroxamic +hydroxamino +hydroxy +hydroxyacetic +hydroxyanthraquinone +hydroxyapatite +hydroxyazobenzene +hydroxybenzene +hydroxybutyricacid +hydroxycorticosterone +hydroxide +hydroxydehydrocorticosterone +hydroxides +hydroxydesoxycorticosterone +hydroxyketone +hydroxyl +hydroxylactone +hydroxylamine +hydroxylase +hydroxylate +hydroxylation +hydroxylic +hydroxylization +hydroxylize +hydroxyls +hydroximic +hydroxyproline +hydroxytryptamine +hydroxyurea +hydroxyzine +hydrozincite +hydrozoa +hydrozoal +hydrozoan +hydrozoic +hydrozoon +hydrula +hydruntine +hydruret +hydrurus +hydrus +hydurilate +hydurilic +hie +hye +hied +hieder +hieing +hielaman +hielamen +hielamon +hieland +hield +hielmite +hiemal +hyemal +hiemate +hiemation +hiems +hyena +hyenadog +hyenanchin +hyenas +hyenia +hyenic +hyeniform +hyenine +hyenoid +hienz +hiera +hieracian +hieracite +hieracium +hieracosphinges +hieracosphinx +hieracosphinxes +hierapicra +hierarch +hierarchal +hierarchy +hierarchial +hierarchic +hierarchical +hierarchically +hierarchies +hierarchise +hierarchised +hierarchising +hierarchism +hierarchist +hierarchize +hierarchized +hierarchizing +hierarchs +hieratic +hieratica +hieratical +hieratically +hieraticism +hieratite +hierochloe +hierocracy +hierocracies +hierocratic +hierocratical +hierodeacon +hierodule +hierodulic +hierofalco +hierogamy +hieroglyph +hieroglypher +hieroglyphy +hieroglyphic +hieroglyphical +hieroglyphically +hieroglyphics +hieroglyphist +hieroglyphize +hieroglyphology +hieroglyphologist +hierogram +hierogrammat +hierogrammate +hierogrammateus +hierogrammatic +hierogrammatical +hierogrammatist +hierograph +hierographer +hierography +hierographic +hierographical +hierolatry +hierology +hierologic +hierological +hierologist +hieromachy +hieromancy +hieromartyr +hieromnemon +hieromonach +hieromonk +hieron +hieronymian +hieronymic +hieronymite +hieropathic +hierophancy +hierophant +hierophantes +hierophantic +hierophantically +hierophanticly +hierophants +hierophobia +hieros +hieroscopy +hierosolymitan +hierosolymite +hierurgy +hierurgical +hierurgies +hies +hyetal +hyetograph +hyetography +hyetographic +hyetographical +hyetographically +hyetology +hyetological +hyetologist +hyetometer +hyetometric +hyetometrograph +hyetometrographic +hifalutin +higdon +hygeen +hygeia +hygeian +hygeiolatry +hygeist +hygeistic +hygeists +hygenics +hygeology +higgaion +higginsite +higgle +higgled +higglehaggle +higgler +higglery +higglers +higgles +higgling +high +highball +highballed +highballing +highballs +highbelia +highbinder +highbinding +highboard +highboy +highboys +highborn +highbred +highbrow +highbrowed +highbrowism +highbrows +highbush +highchair +highchairs +highdaddy +highdaddies +higher +highermost +highest +highfalutin +highfaluting +highfalutinism +highflier +highflyer +highflying +highhanded +highhandedly +highhandedness +highhat +highhatting +highhearted +highheartedly +highheartedness +highholder +highhole +highish +highjack +highjacked +highjacker +highjacking +highjacks +highland +highlander +highlanders +highlandish +highlandman +highlandry +highlands +highly +highlife +highlight +highlighted +highlighting +highlights +highline +highliving +highlow +highman +highmoor +highmost +highness +highnesses +highpockets +highroad +highroads +highs +highschool +hight +hightail +hightailed +hightailing +hightails +highted +highth +highths +highting +hightoby +hightop +hights +highveld +highway +highwayman +highwaymen +highways +hygiantic +hygiantics +hygiastic +hygiastics +hygieist +hygieists +hygienal +hygiene +hygienes +hygienic +hygienical +hygienically +hygienics +hygienist +hygienists +hygienization +hygienize +hygiology +hygiologist +higra +hygric +hygrin +hygrine +hygristor +hygroblepharic +hygrodeik +hygroexpansivity +hygrogram +hygrograph +hygrology +hygroma +hygromatous +hygrometer +hygrometers +hygrometry +hygrometric +hygrometrical +hygrometrically +hygrometries +hygrophaneity +hygrophanous +hygrophilous +hygrophyte +hygrophytic +hygrophobia +hygrophthalmic +hygroplasm +hygroplasma +hygroscope +hygroscopy +hygroscopic +hygroscopical +hygroscopically +hygroscopicity +hygrostat +hygrostatics +hygrostomia +hygrothermal +hygrothermograph +higuero +hiyakkin +hying +hyingly +hijack +hijacked +hijacker +hijackers +hijacking +hijackings +hijacks +hijinks +hijra +hike +hyke +hiked +hiker +hikers +hikes +hiking +hikuli +hila +hyla +hylactic +hylactism +hylaeosaurus +hilar +hylarchic +hylarchical +hilary +hilaria +hilarymas +hilarious +hilariously +hilariousness +hilarity +hilarytide +hilarities +hylas +hilasmic +hylasmus +hilborn +hilch +hilda +hildebrand +hildebrandian +hildebrandic +hildebrandine +hildebrandism +hildebrandist +hildebrandslied +hildegarde +hilding +hildings +hile +hyle +hylean +hyleg +hylegiacal +hili +hyli +hylic +hylicism +hylicist +hylidae +hylids +hiliferous +hylism +hylist +hill +hillary +hillberry +hillbilly +hillbillies +hillbird +hillcrest +hillculture +hillebrandite +hilled +hillel +hiller +hillers +hillet +hillfort +hillhousia +hilly +hillier +hilliest +hilliness +hilling +hillman +hillmen +hillo +hilloa +hilloaed +hilloaing +hilloas +hillock +hillocked +hillocky +hillocks +hilloed +hilloing +hillos +hills +hillsale +hillsalesman +hillside +hillsides +hillsite +hillsman +hilltop +hilltopped +hilltopper +hilltopping +hilltops +hilltrot +hyllus +hillward +hillwoman +hillwort +hylobates +hylobatian +hylobatic +hylobatine +hylocereus +hylocichla +hylocomium +hylodes +hylogenesis +hylogeny +hyloid +hyloist +hylology +hylomys +hylomorphic +hylomorphical +hylomorphism +hylomorphist +hylomorphous +hylopathy +hylopathism +hylopathist +hylophagous +hylotheism +hylotheist +hylotheistic +hylotheistical +hylotomous +hylotropic +hylozoic +hylozoism +hylozoist +hylozoistic +hylozoistically +hilsa +hilsah +hilt +hilted +hilting +hiltless +hilts +hilum +hilus +him +hima +himalaya +himalayan +himalayas +himamatia +himantopus +himati +himatia +himation +himations +himawan +hymen +hymenaea +hymenaeus +hymenaic +hymenal +himene +hymeneal +hymeneally +hymeneals +hymenean +hymenia +hymenial +hymenic +hymenicolar +hymeniferous +hymeniophore +hymenium +hymeniumnia +hymeniums +hymenocallis +hymenochaete +hymenogaster +hymenogastraceae +hymenogeny +hymenoid +hymenolepis +hymenomycetal +hymenomycete +hymenomycetes +hymenomycetoid +hymenomycetous +hymenophyllaceae +hymenophyllaceous +hymenophyllites +hymenophyllum +hymenophore +hymenophorum +hymenopter +hymenoptera +hymenopteran +hymenopterist +hymenopterology +hymenopterological +hymenopterologist +hymenopteron +hymenopterous +hymenopttera +hymenotome +hymenotomy +hymenotomies +hymens +hymettian +hymettic +himyaric +himyarite +himyaritic +himming +hymn +hymnal +hymnals +hymnary +hymnaria +hymnaries +hymnarium +hymnariunaria +hymnbook +hymnbooks +himne +hymned +hymner +hymnic +hymning +hymnist +hymnists +hymnless +hymnlike +hymnode +hymnody +hymnodical +hymnodies +hymnodist +hymnograher +hymnographer +hymnography +hymnology +hymnologic +hymnological +hymnologically +hymnologist +hymns +hymnwise +himp +himple +himself +himward +himwards +hin +hinayana +hinau +hinch +hind +hynd +hindberry +hindbrain +hindcast +hinddeck +hynde +hinder +hynder +hinderance +hindered +hinderer +hinderers +hinderest +hinderful +hinderfully +hindering +hinderingly +hinderlands +hinderly +hinderlings +hinderlins +hinderment +hindermost +hinders +hindersome +hindgut +hindguts +hindhand +hindhead +hindi +hindmost +hindoo +hindquarter +hindquarters +hindrance +hindrances +hinds +hindsaddle +hindsight +hindu +hinduism +hinduize +hindus +hindustan +hindustani +hindward +hindwards +hine +hyne +hiney +hing +hinge +hingecorner +hinged +hingeflower +hingeless +hingelike +hinger +hingers +hinges +hingeways +hinging +hingle +hinney +hinner +hinny +hinnible +hinnied +hinnies +hinnying +hinnites +hinoid +hinoideous +hinoki +hins +hinsdalite +hint +hinted +hintedly +hinter +hinterland +hinterlander +hinterlands +hinters +hinting +hintingly +hintproof +hints +hintzeite +hyobranchial +hyocholalic +hyocholic +hiodon +hiodont +hiodontidae +hyoepiglottic +hyoepiglottidean +hyoglycocholic +hyoglossal +hyoglossi +hyoglossus +hyoid +hyoidal +hyoidan +hyoideal +hyoidean +hyoides +hyoids +hyolithes +hyolithid +hyolithidae +hyolithoid +hyomandibula +hyomandibular +hyomental +hyoplastral +hyoplastron +hiortdahlite +hyoscapular +hyoscyamine +hyoscyamus +hyoscine +hyoscines +hyosternal +hyosternum +hyostyly +hyostylic +hyothere +hyotherium +hyothyreoid +hyothyroid +hip +hyp +hypabyssal +hypabyssally +hypacusia +hypacusis +hypaesthesia +hypaesthesic +hypaethral +hypaethron +hypaethros +hypaethrum +hypalgesia +hypalgesic +hypalgia +hypalgic +hypallactic +hypallage +hypanthia +hypanthial +hypanthium +hypantrum +hypapante +hypapophysial +hypapophysis +hyparterial +hypaspist +hypate +hypaton +hypautomorphic +hypaxial +hipberry +hipbone +hipbones +hipe +hype +hyped +hypegiaphobia +hypenantron +hiper +hyper +hyperabelian +hyperabsorption +hyperaccuracy +hyperaccurate +hyperaccurately +hyperaccurateness +hyperacid +hyperacidaminuria +hyperacidity +hyperacousia +hyperacoustics +hyperaction +hyperactive +hyperactively +hyperactivity +hyperactivities +hyperacuity +hyperacuness +hyperacusia +hyperacusis +hyperacute +hyperacuteness +hyperadenosis +hyperadipose +hyperadiposis +hyperadiposity +hyperadrenalemia +hyperadrenalism +hyperadrenia +hyperaemia +hyperaemic +hyperaeolism +hyperaesthesia +hyperaesthete +hyperaesthetic +hyperalbuminosis +hyperaldosteronism +hyperalgebra +hyperalgesia +hyperalgesic +hyperalgesis +hyperalgetic +hyperalgia +hyperalimentation +hyperalkalinity +hyperaltruism +hyperaltruist +hyperaltruistic +hyperaminoacidemia +hyperanabolic +hyperanabolism +hyperanacinesia +hyperanakinesia +hyperanakinesis +hyperanarchy +hyperanarchic +hyperangelic +hyperangelical +hyperangelically +hyperaphia +hyperaphic +hyperapophyseal +hyperapophysial +hyperapophysis +hyperarchaeological +hyperarchepiscopal +hyperaspist +hyperazotemia +hyperazoturia +hyperbarbarism +hyperbarbarous +hyperbarbarously +hyperbarbarousness +hyperbaric +hyperbarically +hyperbarism +hyperbata +hyperbatbata +hyperbatic +hyperbatically +hyperbaton +hyperbatons +hyperbola +hyperbolae +hyperbolaeon +hyperbolas +hyperbole +hyperboles +hyperbolic +hyperbolical +hyperbolically +hyperbolicly +hyperbolism +hyperbolist +hyperbolize +hyperbolized +hyperbolizing +hyperboloid +hyperboloidal +hyperboreal +hyperborean +hyperbrachycephal +hyperbrachycephaly +hyperbrachycephalic +hyperbrachycranial +hyperbrachyskelic +hyperbranchia +hyperbranchial +hyperbrutal +hyperbrutally +hyperbulia +hypercalcaemia +hypercalcemia +hypercalcemic +hypercalcinaemia +hypercalcinemia +hypercalcinuria +hypercalciuria +hypercalcuria +hypercapnia +hypercapnic +hypercarbamidemia +hypercarbia +hypercarbureted +hypercarburetted +hypercarnal +hypercarnally +hypercatabolism +hypercatalectic +hypercatalexis +hypercatharsis +hypercathartic +hypercathexis +hypercenosis +hyperchamaerrhine +hypercharge +hyperchloraemia +hyperchloremia +hyperchlorhydria +hyperchloric +hyperchlorination +hypercholesteremia +hypercholesteremic +hypercholesterinemia +hypercholesterolemia +hypercholesterolemic +hypercholesterolia +hypercholia +hypercyanosis +hypercyanotic +hypercycle +hypercylinder +hypercythemia +hypercytosis +hypercivilization +hypercivilized +hyperclassical +hyperclassicality +hyperclimax +hypercoagulability +hypercoagulable +hypercomplex +hypercomposite +hyperconcentration +hypercone +hyperconfidence +hyperconfident +hyperconfidently +hyperconformist +hyperconformity +hyperconscientious +hyperconscientiously +hyperconscientiousness +hyperconscious +hyperconsciousness +hyperconservatism +hyperconservative +hyperconservatively +hyperconservativeness +hyperconstitutional +hyperconstitutionalism +hyperconstitutionally +hypercoracoid +hypercorrect +hypercorrection +hypercorrectness +hypercorticoidism +hypercosmic +hypercreaturely +hypercryaesthesia +hypercryalgesia +hypercryesthesia +hypercrinemia +hypercrinia +hypercrinism +hypercrisia +hypercritic +hypercritical +hypercritically +hypercriticalness +hypercriticism +hypercriticize +hypercube +hyperdactyl +hyperdactyly +hyperdactylia +hyperdactylism +hyperdeify +hyperdeification +hyperdeified +hyperdeifying +hyperdelicacy +hyperdelicate +hyperdelicately +hyperdelicateness +hyperdelicious +hyperdeliciously +hyperdeliciousness +hyperdelness +hyperdemocracy +hyperdemocratic +hyperdeterminant +hyperdiabolical +hyperdiabolically +hyperdiabolicalness +hyperdialectism +hyperdiapason +hyperdiapente +hyperdiastole +hyperdiastolic +hyperdiatessaron +hyperdiazeuxis +hyperdicrotic +hyperdicrotism +hyperdicrotous +hyperdimensional +hyperdimensionality +hyperdiploid +hyperdissyllable +hyperdistention +hyperditone +hyperdivision +hyperdolichocephal +hyperdolichocephaly +hyperdolichocephalic +hyperdolichocranial +hyperdoricism +hyperdulia +hyperdulic +hyperdulical +hyperelegance +hyperelegancy +hyperelegant +hyperelegantly +hyperelliptic +hyperemesis +hyperemetic +hyperemia +hyperemic +hyperemization +hyperemotional +hyperemotionally +hyperemotive +hyperemotively +hyperemotiveness +hyperemotivity +hyperemphasize +hyperemphasized +hyperemphasizing +hyperendocrinia +hyperendocrinism +hyperendocrisia +hyperenergetic +hyperenthusiasm +hyperenthusiastic +hyperenthusiastically +hypereosinophilia +hyperephidrosis +hyperepinephry +hyperepinephria +hyperepinephrinemia +hyperequatorial +hypererethism +hyperessence +hyperesthesia +hyperesthete +hyperesthetic +hyperethical +hyperethically +hyperethicalness +hypereuryprosopic +hypereutectic +hypereutectoid +hyperexaltation +hyperexcitability +hyperexcitable +hyperexcitableness +hyperexcitably +hyperexcitement +hyperexcursive +hyperexcursively +hyperexcursiveness +hyperexophoria +hyperextend +hyperextension +hyperfastidious +hyperfastidiously +hyperfastidiousness +hyperfederalist +hyperfine +hyperflexibility +hyperflexible +hyperflexibleness +hyperflexibly +hyperflexion +hyperfocal +hyperform +hyperfunction +hyperfunctional +hyperfunctionally +hyperfunctioning +hypergalactia +hypergalactosia +hypergalactosis +hypergamy +hypergamous +hypergenesis +hypergenetic +hypergenetical +hypergenetically +hypergeneticalness +hypergeometry +hypergeometric +hypergeometrical +hypergeusesthesia +hypergeusia +hypergeustia +hyperglycaemia +hyperglycaemic +hyperglycemia +hyperglycemic +hyperglycistia +hyperglycorrhachia +hyperglycosuria +hyperglobulia +hyperglobulism +hypergoddess +hypergol +hypergolic +hypergolically +hypergols +hypergon +hypergrammatical +hypergrammatically +hypergrammaticalness +hyperhedonia +hyperhemoglobinemia +hyperhepatia +hyperhidrosis +hyperhidrotic +hyperhilarious +hyperhilariously +hyperhilariousness +hyperhypocrisy +hypericaceae +hypericaceous +hypericales +hypericin +hypericism +hypericum +hyperidealistic +hyperidealistically +hyperideation +hyperidrosis +hyperimmune +hyperimmunity +hyperimmunization +hyperimmunize +hyperimmunized +hyperimmunizing +hyperin +hyperinflation +hyperingenuity +hyperinosis +hyperinotic +hyperinsulinism +hyperinsulinization +hyperinsulinize +hyperintellectual +hyperintellectually +hyperintellectualness +hyperintelligence +hyperintelligent +hyperintelligently +hyperinvolution +hyperion +hyperirritability +hyperirritable +hyperisotonic +hyperite +hyperkalemia +hyperkalemic +hyperkaliemia +hyperkatabolism +hyperkeratoses +hyperkeratosis +hyperkeratotic +hyperkinesia +hyperkinesis +hyperkinetic +hyperlactation +hyperleptoprosopic +hyperlethal +hyperlethargy +hyperleucocytosis +hyperleucocytotic +hyperleukocytosis +hyperlexis +hyperlipaemia +hyperlipaemic +hyperlipemia +hyperlipemic +hyperlipidemia +hyperlipoidemia +hyperlithuria +hyperlogical +hyperlogicality +hyperlogically +hyperlogicalness +hyperlustrous +hyperlustrously +hyperlustrousness +hypermagical +hypermagically +hypermakroskelic +hypermarket +hypermedication +hypermegasoma +hypermenorrhea +hypermetabolism +hypermetamorphic +hypermetamorphism +hypermetamorphoses +hypermetamorphosis +hypermetamorphotic +hypermetaphysical +hypermetaphoric +hypermetaphorical +hypermetaplasia +hypermeter +hypermetric +hypermetrical +hypermetron +hypermetrope +hypermetropy +hypermetropia +hypermetropic +hypermetropical +hypermicrosoma +hypermyotonia +hypermyotrophy +hypermiraculous +hypermiraculously +hypermiraculousness +hypermyriorama +hypermystical +hypermystically +hypermysticalness +hypermixolydian +hypermnesia +hypermnesic +hypermnesis +hypermnestic +hypermodest +hypermodestly +hypermodestness +hypermonosyllable +hypermoral +hypermorally +hypermorph +hypermorphic +hypermorphism +hypermorphosis +hypermotile +hypermotility +hypernatremia +hypernatronemia +hypernatural +hypernaturally +hypernaturalness +hypernephroma +hyperneuria +hyperneurotic +hypernic +hypernik +hypernitrogenous +hypernomian +hypernomic +hypernormal +hypernormality +hypernormally +hypernormalness +hypernote +hypernotion +hypernotions +hypernutrition +hypernutritive +hyperoartia +hyperoartian +hyperobtrusive +hyperobtrusively +hyperobtrusiveness +hyperodontogeny +hyperon +hyperons +hyperoodon +hyperoon +hyperope +hyperopes +hyperopia +hyperopic +hyperorganic +hyperorganically +hyperorthodox +hyperorthodoxy +hyperorthognathy +hyperorthognathic +hyperorthognathous +hyperosmia +hyperosmic +hyperosteogeny +hyperostoses +hyperostosis +hyperostotic +hyperothodox +hyperothodoxy +hyperotreta +hyperotretan +hyperotreti +hyperotretous +hyperovaria +hyperovarianism +hyperovarism +hyperoxemia +hyperoxidation +hyperoxide +hyperoxygenate +hyperoxygenating +hyperoxygenation +hyperoxygenize +hyperoxygenized +hyperoxygenizing +hyperoxymuriate +hyperoxymuriatic +hyperpanegyric +hyperparasite +hyperparasitic +hyperparasitism +hyperparasitize +hyperparathyroidism +hyperparoxysm +hyperpathetic +hyperpathetical +hyperpathetically +hyperpathia +hyperpathic +hyperpatriotic +hyperpatriotically +hyperpatriotism +hyperpencil +hyperpepsinia +hyperper +hyperperfection +hyperperistalsis +hyperperistaltic +hyperpersonal +hyperpersonally +hyperphagia +hyperphagic +hyperphalangeal +hyperphalangism +hyperpharyngeal +hyperphenomena +hyperphysical +hyperphysically +hyperphysics +hyperphoria +hyperphoric +hyperphosphatemia +hyperphospheremia +hyperphosphorescence +hyperpiesia +hyperpiesis +hyperpietic +hyperpietist +hyperpigmentation +hyperpigmented +hyperpinealism +hyperpyramid +hyperpyretic +hyperpyrexia +hyperpyrexial +hyperpituitary +hyperpituitarism +hyperplagiarism +hyperplane +hyperplasia +hyperplasic +hyperplastic +hyperplatyrrhine +hyperploid +hyperploidy +hyperpnea +hyperpneic +hyperpnoea +hyperpolarization +hyperpolarize +hyperpolysyllabic +hyperpolysyllabically +hyperpotassemia +hyperpotassemic +hyperpredator +hyperprism +hyperproduction +hyperprognathous +hyperprophetic +hyperprophetical +hyperprophetically +hyperprosexia +hyperpulmonary +hyperpure +hyperpurist +hyperquadric +hyperrational +hyperrationally +hyperreactive +hyperrealize +hyperrealized +hyperrealizing +hyperresonance +hyperresonant +hyperreverential +hyperrhythmical +hyperridiculous +hyperridiculously +hyperridiculousness +hyperritualism +hyperritualistic +hyperromantic +hyperromantically +hyperromanticism +hypersacerdotal +hypersaintly +hypersalivation +hypersceptical +hyperscholastic +hyperscholastically +hyperscrupulosity +hyperscrupulous +hypersecretion +hypersensibility +hypersensitisation +hypersensitise +hypersensitised +hypersensitising +hypersensitive +hypersensitiveness +hypersensitivity +hypersensitivities +hypersensitization +hypersensitize +hypersensitized +hypersensitizing +hypersensual +hypersensualism +hypersensually +hypersensualness +hypersensuous +hypersensuously +hypersensuousness +hypersentimental +hypersentimentally +hypersexual +hypersexuality +hypersexualities +hypersystole +hypersystolic +hypersolid +hypersomnia +hypersonic +hypersonically +hypersonics +hypersophisticated +hypersophistication +hyperspace +hyperspatial +hyperspeculative +hyperspeculatively +hyperspeculativeness +hypersphere +hyperspherical +hyperspiritualizing +hypersplenia +hypersplenism +hyperstatic +hypersthene +hypersthenia +hypersthenic +hypersthenite +hyperstoic +hyperstoical +hyperstrophic +hypersubtle +hypersubtlety +hypersuggestibility +hypersuggestible +hypersuggestibleness +hypersuggestibly +hypersuperlative +hypersurface +hypersusceptibility +hypersusceptible +hypertechnical +hypertechnically +hypertechnicalness +hypertely +hypertelic +hypertense +hypertensely +hypertenseness +hypertensin +hypertensinase +hypertensinogen +hypertension +hypertensive +hyperterrestrial +hypertetrahedron +hyperthermal +hyperthermalgesia +hyperthermally +hyperthermesthesia +hyperthermy +hyperthermia +hyperthermic +hyperthesis +hyperthetic +hyperthetical +hyperthymia +hyperthyreosis +hyperthyroid +hyperthyroidism +hyperthyroidization +hyperthyroidize +hyperthyroids +hyperthrombinemia +hypertype +hypertypic +hypertypical +hypertocicity +hypertonia +hypertonic +hypertonicity +hypertonus +hypertorrid +hypertoxic +hypertoxicity +hypertragic +hypertragical +hypertragically +hypertranscendent +hypertrichy +hypertrichosis +hypertridimensional +hypertrophy +hypertrophic +hypertrophied +hypertrophies +hypertrophying +hypertrophyphied +hypertrophous +hypertropia +hypertropical +hyperurbanism +hyperuresis +hyperuricemia +hypervascular +hypervascularity +hypervelocity +hypervenosity +hyperventilate +hyperventilation +hypervigilant +hypervigilantly +hypervigilantness +hyperviscosity +hyperviscous +hypervitalization +hypervitalize +hypervitalized +hypervitalizing +hypervitaminosis +hypervolume +hypervoluminous +hyperwrought +hypes +hypesthesia +hypesthesic +hypethral +hipflask +hypha +hyphae +hyphaene +hyphaeresis +hyphal +hiphalt +hyphantria +hiphape +hyphedonia +hyphema +hyphemia +hyphemias +hyphen +hyphenate +hyphenated +hyphenates +hyphenating +hyphenation +hyphenations +hyphened +hyphenic +hyphening +hyphenisation +hyphenise +hyphenised +hyphenising +hyphenism +hyphenization +hyphenize +hyphenized +hyphenizing +hyphenless +hyphens +hypho +hyphodrome +hyphomycetales +hyphomycete +hyphomycetes +hyphomycetic +hyphomycetous +hyphomycosis +hyphopdia +hyphopodia +hyphopodium +hiphuggers +hypidiomorphic +hypidiomorphically +hyping +hypinosis +hypinotic +hiplength +hipless +hiplike +hipline +hipmi +hipmold +hypnaceae +hypnaceous +hypnagogic +hypnale +hipness +hipnesses +hypnesthesis +hypnesthetic +hypnic +hypnoanalyses +hypnoanalysis +hypnoanalytic +hypnobate +hypnocyst +hypnody +hypnoetic +hypnogenesis +hypnogenetic +hypnogenetically +hypnogia +hypnogogic +hypnograph +hypnoid +hypnoidal +hypnoidization +hypnoidize +hypnology +hypnologic +hypnological +hypnologist +hypnone +hypnopaedia +hypnophoby +hypnophobia +hypnophobias +hypnophobic +hypnopompic +hypnos +hypnoses +hypnosis +hypnosperm +hypnosporangia +hypnosporangium +hypnospore +hypnosporic +hypnotherapy +hypnotherapist +hypnotic +hypnotically +hypnotics +hypnotisability +hypnotisable +hypnotisation +hypnotise +hypnotised +hypnotiser +hypnotising +hypnotism +hypnotist +hypnotistic +hypnotists +hypnotizability +hypnotizable +hypnotization +hypnotize +hypnotized +hypnotizer +hypnotizes +hypnotizing +hypnotoid +hypnotoxin +hypnum +hypo +hypoacid +hypoacidity +hypoactive +hypoactivity +hypoacusia +hypoacussis +hypoadenia +hypoadrenia +hypoaeolian +hypoalbuminemia +hypoalimentation +hypoalkaline +hypoalkalinity +hypoalonemia +hypoaminoacidemia +hypoantimonate +hypoazoturia +hypobaric +hypobarism +hypobaropathy +hypobasal +hypobases +hypobasis +hypobatholithic +hypobenthonic +hypobenthos +hypoblast +hypoblastic +hypobole +hypobranchial +hypobranchiate +hypobromite +hypobromites +hypobromous +hypobulia +hypobulic +hypocalcemia +hypocalcemic +hypocarp +hypocarpium +hypocarpogean +hypocatharsis +hypocathartic +hypocathexis +hypocaust +hypocenter +hypocenters +hypocentral +hypocentre +hypocentrum +hypocephalus +hypochaeris +hypochchilia +hypochdria +hypochil +hypochilia +hypochylia +hypochilium +hypochloremia +hypochloremic +hypochlorhydria +hypochlorhydric +hypochloric +hypochloridemia +hypochlorite +hypochlorous +hypochloruria +hypochnaceae +hypochnose +hypochnus +hypocholesteremia +hypocholesterinemia +hypocholesterolemia +hypochonder +hypochondry +hypochondria +hypochondriac +hypochondriacal +hypochondriacally +hypochondriacism +hypochondriacs +hypochondrial +hypochondriasis +hypochondriast +hypochondric +hypochondrium +hypochordal +hypochromia +hypochromic +hypochrosis +hypocycloid +hypocycloidal +hypocist +hypocistis +hypocystotomy +hypocytosis +hypocleidian +hypocleidium +hypocoelom +hypocondylar +hypocone +hypoconid +hypoconule +hypoconulid +hypocopy +hypocoracoid +hypocorism +hypocoristic +hypocoristical +hypocoristically +hypocotyl +hypocotyleal +hypocotyledonary +hypocotyledonous +hypocotylous +hypocrater +hypocrateriform +hypocraterimorphous +hypocreaceae +hypocreaceous +hypocreales +hypocrinia +hypocrinism +hypocrisy +hypocrisies +hypocrisis +hypocrystalline +hypocrital +hypocrite +hypocrites +hypocritic +hypocritical +hypocritically +hypocriticalness +hypocrize +hypodactylum +hypoderm +hypoderma +hypodermal +hypodermatic +hypodermatically +hypodermatoclysis +hypodermatomy +hypodermella +hypodermic +hypodermically +hypodermics +hypodermis +hypodermoclysis +hypodermosis +hypodermous +hypoderms +hypodiapason +hypodiapente +hypodiastole +hypodiatessaron +hypodiazeuxis +hypodicrotic +hypodicrotous +hypodynamia +hypodynamic +hypodiploid +hypodiploidy +hypoditone +hypodorian +hypoed +hypoeliminator +hypoendocrinia +hypoendocrinism +hypoendocrisia +hypoeosinophilia +hypoergic +hypoeutectic +hypoeutectoid +hypofunction +hypogaeic +hypogamy +hypogastria +hypogastric +hypogastrium +hypogastrocele +hypogea +hypogeal +hypogeally +hypogean +hypogee +hypogeic +hypogeiody +hypogene +hypogenesis +hypogenetic +hypogenic +hypogenous +hypogeocarpous +hypogeous +hypogeugea +hypogeum +hypogeusia +hypogyn +hypogyny +hypogynic +hypogynies +hypogynium +hypogynous +hypoglycaemia +hypoglycemia +hypoglycemic +hypoglobulia +hypoglossal +hypoglossis +hypoglossitis +hypoglossus +hypoglottis +hypognathism +hypognathous +hypogonadia +hypogonadism +hypogonation +hypohalous +hypohemia +hypohepatia +hypohyal +hypohyaline +hypohydrochloria +hypohidrosis +hypohypophysism +hypohippus +hypoid +hypoidrosis +hypoing +hypoinosemia +hypoiodite +hypoiodous +hypoionian +hypoischium +hypoisotonic +hypokalemia +hypokalemic +hypokaliemia +hypokeimenometry +hypokinemia +hypokinesia +hypokinesis +hypokinetic +hypokoristikon +hypolemniscus +hypoleptically +hypoleucocytosis +hypolydian +hypolimnetic +hypolimnia +hypolimnial +hypolimnion +hypolimnionia +hypolithic +hypolocrian +hypomania +hypomanic +hypomelancholia +hypomeral +hypomere +hypomeron +hypometropia +hypomyotonia +hypomixolydian +hypomnematic +hypomnesia +hypomnesis +hypomochlion +hypomorph +hypomorphic +hypomotility +hyponasty +hyponastic +hyponastically +hyponatremia +hyponea +hyponeas +hyponeuria +hyponychial +hyponychium +hyponym +hyponymic +hyponymous +hyponitric +hyponitrite +hyponitrous +hyponoetic +hyponoia +hyponoias +hyponome +hyponomic +hypoparathyroidism +hypoparia +hypopepsy +hypopepsia +hypopepsinia +hypopetaly +hypopetalous +hypophalangism +hypophamin +hypophamine +hypophare +hypopharyngeal +hypopharynges +hypopharyngoscope +hypopharyngoscopy +hypopharynx +hypopharynxes +hypophyge +hypophyll +hypophyllium +hypophyllous +hypophyllum +hypophypophysism +hypophyse +hypophyseal +hypophysectomy +hypophysectomies +hypophysectomize +hypophysectomized +hypophysectomizing +hypophyseoprivic +hypophyseoprivous +hypophyses +hypophysial +hypophysical +hypophysics +hypophysis +hypophysitis +hypophloeodal +hypophloeodic +hypophloeous +hypophonesis +hypophonia +hypophonic +hypophonous +hypophora +hypophoria +hypophosphate +hypophosphite +hypophosphoric +hypophosphorous +hypophrenia +hypophrenic +hypophrenosis +hypophrygian +hypopial +hypopiesia +hypopiesis +hypopygial +hypopygidium +hypopygium +hypopinealism +hypopyon +hypopyons +hypopitys +hypopituitary +hypopituitarism +hypoplankton +hypoplanktonic +hypoplasy +hypoplasia +hypoplasty +hypoplastic +hypoplastral +hypoplastron +hypoploid +hypoploidy +hypopnea +hypopneas +hypopnoea +hypopoddia +hypopodia +hypopodium +hypopotassemia +hypopotassemic +hypopraxia +hypoprosexia +hypoproteinemia +hypoproteinosis +hypopselaphesia +hypopsychosis +hypopteral +hypopteron +hypoptyalism +hypoptilar +hypoptilum +hypoptosis +hypopus +hyporadial +hyporadiolus +hyporadius +hyporchema +hyporchemata +hyporchematic +hyporcheme +hyporchesis +hyporhachidian +hyporhachis +hyporhined +hyporight +hyporit +hyporrhythmic +hypos +hyposalemia +hyposarca +hyposcenium +hyposcleral +hyposcope +hyposecretion +hyposensitive +hyposensitivity +hyposensitization +hyposensitize +hyposensitized +hyposensitizing +hyposyllogistic +hyposynaphe +hyposynergia +hyposystole +hyposkeletal +hyposmia +hypospadiac +hypospadias +hyposphene +hyposphresia +hypospray +hypostase +hypostases +hypostasy +hypostasis +hypostasise +hypostasised +hypostasising +hypostasization +hypostasize +hypostasized +hypostasizing +hypostatic +hypostatical +hypostatically +hypostatisation +hypostatise +hypostatised +hypostatising +hypostatization +hypostatize +hypostatized +hypostatizing +hyposternal +hyposternum +hyposthenia +hyposthenic +hyposthenuria +hypostigma +hypostilbite +hypostyle +hypostypsis +hypostyptic +hypostoma +hypostomata +hypostomatic +hypostomatous +hypostome +hypostomial +hypostomides +hypostomous +hypostrophe +hyposulfite +hyposulfurous +hyposulphate +hyposulphite +hyposulphuric +hyposulphurous +hyposuprarenalism +hypotactic +hypotarsal +hypotarsus +hypotaxia +hypotaxic +hypotaxis +hypotension +hypotensive +hypotensor +hypotenusal +hypotenuse +hypotenuses +hypoth +hypothalami +hypothalamic +hypothalamus +hypothalli +hypothalline +hypothallus +hypothami +hypothec +hypotheca +hypothecal +hypothecary +hypothecate +hypothecated +hypothecater +hypothecates +hypothecating +hypothecation +hypothecative +hypothecator +hypothecatory +hypothecia +hypothecial +hypothecium +hypothecs +hypothenal +hypothenar +hypothenic +hypothenusal +hypothenuse +hypotheria +hypothermal +hypothermy +hypothermia +hypothermic +hypotheses +hypothesi +hypothesis +hypothesise +hypothesised +hypothesiser +hypothesising +hypothesist +hypothesists +hypothesize +hypothesized +hypothesizer +hypothesizers +hypothesizes +hypothesizing +hypothetic +hypothetical +hypothetically +hypotheticalness +hypothetics +hypothetist +hypothetize +hypothetizer +hypothyreosis +hypothyroid +hypothyroidism +hypothyroids +hypotympanic +hypotype +hypotypic +hypotypical +hypotyposis +hypotony +hypotonia +hypotonic +hypotonically +hypotonicity +hypotonus +hypotoxic +hypotoxicity +hypotrachelia +hypotrachelium +hypotralia +hypotremata +hypotrich +hypotricha +hypotrichida +hypotrichosis +hypotrichous +hypotrochanteric +hypotrochoid +hypotrochoidal +hypotrophy +hypotrophic +hypotrophies +hypotthalli +hypovalve +hypovanadate +hypovanadic +hypovanadious +hypovanadous +hypovitaminosis +hypoxanthic +hypoxanthine +hypoxemia +hypoxemic +hypoxia +hypoxias +hypoxic +hypoxylon +hypoxis +hypozeugma +hypozeuxis +hypozoa +hypozoan +hypozoic +hippa +hippalectryon +hipparch +hipparchs +hipparion +hippeastrum +hipped +hypped +hippelates +hippen +hipper +hippest +hippi +hippy +hippia +hippian +hippiater +hippiatry +hippiatric +hippiatrical +hippiatrics +hippiatrist +hippic +hippidae +hippidion +hippidium +hippie +hippiedom +hippiehood +hippier +hippies +hippiest +hipping +hippish +hyppish +hipple +hippo +hippobosca +hippoboscid +hippoboscidae +hippocamp +hippocampal +hippocampi +hippocampine +hippocampus +hippocastanaceae +hippocastanaceous +hippocaust +hippocentaur +hippocentauric +hippocerf +hippocoprosterol +hippocras +hippocratea +hippocrateaceae +hippocrateaceous +hippocrates +hippocratian +hippocratic +hippocratical +hippocratism +hippocrene +hippocrenian +hippocrepian +hippocrepiform +hippodame +hippodamia +hippodamous +hippodrome +hippodromes +hippodromic +hippodromist +hippogastronomy +hippoglosinae +hippoglossidae +hippoglossus +hippogriff +hippogriffin +hippogryph +hippoid +hippolytan +hippolite +hippolyte +hippolith +hippolytidae +hippolytus +hippology +hippological +hippologist +hippomachy +hippomancy +hippomanes +hippomedon +hippomelanin +hippomenes +hippometer +hippometry +hippometric +hipponactean +hipponosology +hipponosological +hipponous +hippopathology +hippopathological +hippophagi +hippophagy +hippophagism +hippophagist +hippophagistical +hippophagous +hippophile +hippophobia +hippopod +hippopotami +hippopotamian +hippopotamic +hippopotamidae +hippopotamine +hippopotamoid +hippopotamus +hippopotamuses +hippos +hipposelinum +hippotigrine +hippotigris +hippotomy +hippotomical +hippotomist +hippotragine +hippotragus +hippurate +hippuria +hippuric +hippurid +hippuridaceae +hippuris +hippurite +hippurites +hippuritic +hippuritidae +hippuritoid +hippus +hips +hyps +hipshot +hypsibrachycephaly +hypsibrachycephalic +hypsibrachycephalism +hypsicephaly +hypsicephalic +hypsicephalous +hypsidolichocephaly +hypsidolichocephalic +hypsidolichocephalism +hypsiliform +hypsiloid +hypsilophodon +hypsilophodont +hypsilophodontid +hypsilophodontidae +hypsilophodontoid +hypsipyle +hypsiprymninae +hypsiprymnodontinae +hypsiprymnus +hypsistarian +hypsistenocephaly +hypsistenocephalic +hypsistenocephalism +hypsobathymetric +hypsocephalous +hypsochrome +hypsochromy +hypsochromic +hypsodont +hypsodonty +hypsodontism +hypsography +hypsographic +hypsographical +hypsoisotherm +hypsometer +hypsometry +hypsometric +hypsometrical +hypsometrically +hypsometrist +hypsophyll +hypsophyllar +hypsophyllary +hypsophyllous +hypsophyllum +hypsophobia +hypsophoeia +hypsophonous +hypsothermometer +hipster +hipsterism +hipsters +hypt +hypural +hipwort +hir +hirable +hyraces +hyraceum +hyrachyus +hyracid +hyracidae +hyraciform +hyracina +hyracodon +hyracodont +hyracodontid +hyracodontidae +hyracodontoid +hyracoid +hyracoidea +hyracoidean +hyracoidian +hyracoids +hyracothere +hyracotherian +hyracotheriinae +hyracotherium +hiragana +hiraganas +hiram +hiramite +hyrate +hyrax +hyraxes +hyrcan +hyrcanian +hircarra +hircic +hircin +hircine +hircinous +hircocerf +hircocervus +hircosity +hircus +hire +hireable +hired +hireless +hireling +hirelings +hireman +hiren +hirer +hirers +hires +hiring +hirings +hirling +hirmologion +hirmos +hirneola +hiro +hirofumi +hiroyuki +hirondelle +hiroshima +hirotoshi +hirple +hirpled +hirples +hirpling +hirrient +hirse +hyrse +hirsel +hirseled +hirseling +hirselled +hirselling +hirsels +hirsle +hirsled +hirsles +hirsling +hirst +hyrst +hirstie +hirsute +hirsuteness +hirsuties +hirsutism +hirsutulous +hirtch +hirtella +hirtellous +hirudin +hirudinal +hirudine +hirudinea +hirudinean +hirudiniculture +hirudinidae +hirudinize +hirudinoid +hirudins +hirudo +hirundine +hirundinidae +hirundinous +hirundo +his +hish +hisingerite +hisis +hislopite +hisn +hyson +hysons +hispa +hispania +hispanic +hispanicism +hispanicize +hispanics +hispanidad +hispaniola +hispaniolate +hispaniolize +hispanism +hispanist +hispanize +hispano +hispanophile +hispanophobe +hispid +hispidity +hispidulate +hispidulous +hispinae +hiss +hissed +hissel +hisself +hisser +hissers +hisses +hissy +hissing +hissingly +hissings +hyssop +hyssops +hyssopus +hissproof +hist +histamin +histaminase +histamine +histaminergic +histamines +histaminic +histamins +hystazarin +histed +hister +hysteralgia +hysteralgic +hysteranthous +hysterectomy +hysterectomies +hysterectomize +hysterectomized +hysterectomizes +hysterectomizing +hysterelcosis +hysteresial +hysteresis +hysteretic +hysteretically +hysteria +hysteriac +hysteriales +hysterias +hysteric +hysterical +hysterically +hystericky +hysterics +hystericus +hysteriform +hysterioid +hysterocarpus +hysterocatalepsy +hysterocele +hysterocystic +hysterocleisis +hysterocrystalline +hysterodynia +hysterogen +hysterogenetic +hysterogeny +hysterogenic +hysterogenous +hysteroid +hysteroidal +hysterolaparotomy +hysterolysis +hysterolith +hysterolithiasis +hysterology +hysteromania +hysteromaniac +hysteromaniacal +hysterometer +hysterometry +hysteromyoma +hysteromyomectomy +hysteromorphous +hysteron +hysteroneurasthenia +hysteropathy +hysteropexy +hysteropexia +hysterophyta +hysterophytal +hysterophyte +hysterophore +hysteroproterize +hysteroptosia +hysteroptosis +hysterorrhaphy +hysterorrhexis +hysteroscope +hysterosis +hysterotely +hysterotome +hysterotomy +hysterotomies +hysterotraumatism +histidin +histidine +histidins +histie +histing +histiocyte +histiocytic +histioid +histiology +histiophoridae +histiophorus +histoblast +histochemic +histochemical +histochemically +histochemistry +histocyte +histoclastic +histocompatibility +histodiagnosis +histodialysis +histodialytic +histogen +histogenesis +histogenetic +histogenetically +histogeny +histogenic +histogenous +histogens +histogram +histograms +histographer +histography +histographic +histographical +histographically +histographies +histoid +histolysis +histolytic +histology +histologic +histological +histologically +histologies +histologist +histologists +histometabasis +histomorphology +histomorphological +histomorphologically +histon +histonal +histone +histones +histonomy +histopathology +histopathologic +histopathological +histopathologically +histopathologist +histophyly +histophysiology +histophysiologic +histophysiological +histoplasma +histoplasmin +histoplasmosis +history +historial +historian +historians +historiated +historic +historical +historically +historicalness +historician +historicism +historicist +historicity +historicize +historicocabbalistical +historicocritical +historicocultural +historicodogmatic +historicogeographical +historicophilosophica +historicophysical +historicopolitical +historicoprophetic +historicoreligious +historics +historicus +historied +historier +histories +historiette +historify +historiograph +historiographer +historiographers +historiographership +historiography +historiographic +historiographical +historiographically +historiographies +historiology +historiological +historiometry +historiometric +historionomer +historious +historism +historize +histotherapy +histotherapist +histothrombin +histotome +histotomy +histotomies +histotrophy +histotrophic +histotropic +histozyme +histozoic +hystriciasis +hystricid +hystricidae +hystricinae +hystricine +hystricism +hystricismus +hystricoid +hystricomorph +hystricomorpha +hystricomorphic +hystricomorphous +histrio +histriobdella +histriomastix +histrion +histrionic +histrionical +histrionically +histrionicism +histrionics +histrionism +histrionize +hystrix +hists +hit +hitch +hitched +hitchel +hitcher +hitchers +hitches +hitchhike +hitchhiked +hitchhiker +hitchhikers +hitchhikes +hitchhiking +hitchy +hitchier +hitchiest +hitchily +hitchiness +hitching +hitchiti +hitchproof +hyte +hithe +hither +hythergraph +hithermost +hithertills +hitherto +hithertoward +hitherunto +hitherward +hitherwards +hitler +hitlerian +hitlerism +hitlerite +hitless +hitoshi +hits +hittable +hitter +hitters +hitting +hittite +hittitics +hittitology +hittology +hive +hived +hiveless +hivelike +hiver +hives +hiveward +hiving +hivite +hyzone +hizz +hizzie +hl +hld +hler +hlidhskjalf +hlithskjalf +hlorrithi +hlqn +hm +hny +ho +hoactzin +hoactzines +hoactzins +hoagy +hoagie +hoagies +hoaming +hoar +hoard +hoarded +hoarder +hoarders +hoarding +hoardings +hoards +hoardward +hoared +hoarfrost +hoarfrosts +hoarhead +hoarheaded +hoarhound +hoary +hoarier +hoariest +hoaryheaded +hoarily +hoariness +hoarish +hoarness +hoars +hoarse +hoarsely +hoarsen +hoarsened +hoarseness +hoarsening +hoarsens +hoarser +hoarsest +hoarstone +hoarwort +hoast +hoastman +hoatching +hoatzin +hoatzines +hoatzins +hoax +hoaxability +hoaxable +hoaxed +hoaxee +hoaxer +hoaxers +hoaxes +hoaxing +hoaxproof +hoazin +hob +hobbed +hobber +hobbesian +hobbet +hobby +hobbian +hobbies +hobbyhorse +hobbyhorses +hobbyhorsical +hobbyhorsically +hobbyism +hobbyist +hobbyists +hobbil +hobbyless +hobbing +hobbinoll +hobbism +hobbist +hobbistical +hobbit +hobble +hobblebush +hobbled +hobbledehoy +hobbledehoydom +hobbledehoyhood +hobbledehoyish +hobbledehoyishness +hobbledehoyism +hobbledehoys +hobbledygee +hobbler +hobblers +hobbles +hobbly +hobbling +hobblingly +hobgoblin +hobgoblins +hobhouchin +hobiler +hobits +hoblike +hoblob +hobnail +hobnailed +hobnailer +hobnails +hobnob +hobnobbed +hobnobber +hobnobbing +hobnobs +hobo +hoboe +hoboed +hoboes +hoboing +hoboism +hoboisms +hobomoco +hobos +hobs +hobthrush +hoc +hocco +hoch +hochelaga +hochheimer +hochhuth +hock +hockamore +hockday +hocked +hockey +hockeys +hockelty +hocker +hockers +hocket +hocky +hocking +hockle +hockled +hockling +hockmoney +hocks +hockshin +hockshop +hockshops +hocktide +hocus +hocused +hocuses +hocusing +hocussed +hocusses +hocussing +hod +hodad +hodaddy +hodaddies +hodads +hodden +hoddens +hodder +hoddy +hoddin +hoddins +hoddypeak +hoddle +hodening +hodful +hodge +hodgepodge +hodgepodges +hodgkin +hodgkinsonite +hodiernal +hodman +hodmandod +hodmen +hodograph +hodometer +hodometrical +hodophobia +hodoscope +hods +hodure +hoe +hoecake +hoecakes +hoed +hoedown +hoedowns +hoeful +hoey +hoeing +hoelike +hoer +hoernesite +hoers +hoes +hoeshin +hoffmannist +hoffmannite +hog +hoga +hogan +hogans +hogarthian +hogback +hogbacks +hogbush +hogchoker +hogcote +hogen +hogfish +hogfishes +hogframe +hogg +hoggaster +hogged +hoggee +hogger +hoggerel +hoggery +hoggeries +hoggers +hogget +hoggy +hoggie +hoggin +hogging +hoggins +hoggish +hoggishly +hoggishness +hoggism +hoggler +hoggs +hoghead +hogherd +hoghide +hoghood +hogyard +hoglike +hogling +hogmace +hogmanay +hogmanays +hogmane +hogmanes +hogmenay +hogmenays +hogmolly +hogmollies +hogni +hognose +hognoses +hognut +hognuts +hogo +hogpen +hogreeve +hogrophyte +hogs +hogshead +hogsheads +hogship +hogshouther +hogskin +hogsteer +hogsty +hogsucker +hogtie +hogtied +hogtieing +hogties +hogtiing +hogtying +hogton +hogward +hogwash +hogwashes +hogweed +hogweeds +hogwort +hohe +hohenstaufen +hohenzollern +hohenzollernism +hohn +hoho +hohokam +hoi +hoy +hoya +hoick +hoicked +hoicking +hoicks +hoiden +hoyden +hoidened +hoydened +hoydenhood +hoidening +hoydening +hoidenish +hoydenish +hoydenishness +hoydenism +hoidens +hoydens +hoihere +hoyle +hoyles +hoyman +hoin +hoys +hoise +hoised +hoises +hoising +hoist +hoistaway +hoisted +hoister +hoisters +hoisting +hoistman +hoists +hoistway +hoit +hoju +hokan +hoke +hoked +hokey +hokeyness +hokeypokey +hoker +hokerer +hokerly +hokes +hokier +hokiest +hoking +hokypoky +hokypokies +hokku +hokum +hokums +hol +hola +holagogue +holandry +holandric +holarctic +holard +holards +holarthritic +holarthritis +holaspidean +holcad +holcodont +holconoti +holcus +hold +holdable +holdall +holdalls +holdback +holdbacks +holden +holdenite +holder +holders +holdership +holdfast +holdfastness +holdfasts +holding +holdingly +holdings +holdman +holdout +holdouts +holdover +holdovers +holds +holdsman +holdup +holdups +hole +holeable +holectypina +holectypoid +holed +holey +holeless +holeman +holeproof +holer +holes +holethnic +holethnos +holewort +holgate +holi +holy +holia +holibut +holibuts +holiday +holyday +holidayed +holidayer +holidaying +holidayism +holidaymaker +holidaymaking +holidays +holydays +holidam +holier +holies +holiest +holily +holiness +holinesses +holing +holinight +holyokeite +holishkes +holism +holisms +holist +holistic +holistically +holystone +holystoned +holystones +holystoning +holists +holytide +holytides +holk +holked +holking +holks +holl +holla +hollaed +hollaing +hollaite +holland +hollandaise +hollander +hollanders +hollandish +hollandite +hollands +hollantide +hollas +holleke +holler +hollered +hollering +hollers +holly +hollies +hollyhock +hollyhocks +hollyleaf +hollin +holliper +hollywood +hollywooder +hollywoodize +hollo +holloa +holloaed +holloaing +holloas +hollock +holloed +holloes +holloing +hollong +holloo +hollooed +hollooing +holloos +hollos +hollow +holloware +hollowed +hollower +hollowest +hollowfaced +hollowfoot +hollowhearted +hollowheartedness +hollowing +hollowly +hollowness +hollowroot +hollows +hollowware +holluschick +holluschickie +holm +holmberry +holmes +holmgang +holmia +holmic +holmium +holmiums +holmos +holms +holobaptist +holobenthic +holoblastic +holoblastically +holobranch +holocaine +holocarpic +holocarpous +holocaust +holocaustal +holocaustic +holocausts +holocene +holocentrid +holocentridae +holocentroid +holocentrus +holocephala +holocephalan +holocephali +holocephalian +holocephalous +holochoanites +holochoanitic +holochoanoid +holochoanoida +holochoanoidal +holochordate +holochroal +holoclastic +holocrine +holocryptic +holocrystalline +holodactylic +holodedron +holodiscus +holoenzyme +holofernes +hologamy +hologamous +hologastrula +hologastrular +hologyny +hologynic +hologynies +holognatha +holognathous +hologonidia +hologonidium +hologoninidia +hologram +holograms +holograph +holography +holographic +holographical +holographically +holographies +holographs +holohedral +holohedry +holohedric +holohedrism +holohedron +holohemihedral +holohyaline +holoku +hololith +holomastigote +holometabola +holometabole +holometaboly +holometabolian +holometabolic +holometabolism +holometabolous +holometer +holomyaria +holomyarian +holomyarii +holomorph +holomorphy +holomorphic +holomorphism +holomorphosis +holoparasite +holoparasitic +holophane +holophyte +holophytic +holophotal +holophote +holophotometer +holophrase +holophrases +holophrasis +holophrasm +holophrastic +holoplankton +holoplanktonic +holoplexia +holopneustic +holoproteide +holoptic +holoptychian +holoptychiid +holoptychiidae +holoptychius +holoquinoid +holoquinoidal +holoquinonic +holoquinonoid +holorhinal +holosaprophyte +holosaprophytic +holoscope +holosericeous +holoside +holosiderite +holosymmetry +holosymmetric +holosymmetrical +holosiphona +holosiphonate +holosystematic +holosystolic +holosomata +holosomatous +holospondaic +holostean +holostei +holosteous +holosteric +holosteum +holostylic +holostomata +holostomate +holostomatous +holostome +holostomous +holothecal +holothoracic +holothuria +holothurian +holothuridea +holothurioid +holothurioidea +holotype +holotypes +holotypic +holotony +holotonia +holotonic +holotrich +holotricha +holotrichal +holotrichida +holotrichous +holour +holozoic +holp +holpen +hols +holsom +holstein +holsteins +holster +holstered +holsters +holt +holts +holw +hom +homacanth +homage +homageable +homaged +homager +homagers +homages +homaging +homagium +homalocenchrus +homalogonatous +homalographic +homaloid +homaloidal +homalonotus +homalopsinae +homaloptera +homalopterous +homalosternal +homalosternii +homam +homard +homaridae +homarine +homaroid +homarus +homatomic +homaxial +homaxonial +homaxonic +hombre +hombres +homburg +homburgs +home +homebody +homebodies +homeborn +homebound +homebred +homebreds +homebrew +homebrewed +homebuild +homebuilder +homebuilders +homebuilding +homecome +homecomer +homecoming +homecomings +homecraft +homecroft +homecrofter +homecrofting +homed +homefarer +homefarm +homefelt +homefolk +homefolks +homegoer +homeground +homegrown +homey +homeyness +homekeeper +homekeeping +homeland +homelander +homelands +homeless +homelessly +homelessness +homelet +homely +homelier +homeliest +homelife +homelike +homelikeness +homelily +homelyn +homeliness +homeling +homelovingness +homemade +homemake +homemaker +homemakers +homemaking +homeoblastic +homeochromatic +homeochromatism +homeochronous +homeocrystalline +homeogenic +homeogenous +homeoid +homeoidal +homeoidality +homeokinesis +homeokinetic +homeomerous +homeomorph +homeomorphy +homeomorphic +homeomorphism +homeomorphisms +homeomorphous +homeopath +homeopathy +homeopathic +homeopathically +homeopathician +homeopathicity +homeopathies +homeopathist +homeophony +homeoplasy +homeoplasia +homeoplastic +homeopolar +homeosis +homeostases +homeostasis +homeostatic +homeostatically +homeostatis +homeotherapy +homeotherm +homeothermal +homeothermy +homeothermic +homeothermism +homeothermous +homeotic +homeotype +homeotypic +homeotypical +homeotransplant +homeotransplantation +homeown +homeowner +homeowners +homeozoic +homeplace +homer +homered +homerian +homeric +homerical +homerically +homerid +homeridae +homeridian +homering +homerist +homerite +homerology +homerologist +homeromastix +homeroom +homerooms +homers +homes +homeseeker +homesick +homesickly +homesickness +homesite +homesites +homesome +homespun +homespuns +homestall +homestead +homesteader +homesteaders +homesteads +homester +homestretch +homestretches +hometown +hometowns +homeward +homewardly +homewards +homework +homeworker +homeworks +homewort +homy +homichlophobia +homicidal +homicidally +homicide +homicides +homicidious +homicidium +homiculture +homier +homiest +homiform +homilete +homiletic +homiletical +homiletically +homiletics +homily +homiliary +homiliaries +homiliarium +homilies +homilist +homilists +homilite +homilize +hominal +hominem +hominess +hominesses +homing +hominy +hominian +hominians +hominid +hominidae +hominids +hominies +hominify +hominiform +hominine +hominisection +hominivorous +hominization +hominized +hominoid +hominoids +homish +homishness +hommack +hommage +homme +hommock +hommocks +homo +homoanisaldehyde +homoanisic +homoarecoline +homobaric +homoblasty +homoblastic +homobront +homocarpous +homocategoric +homocentric +homocentrical +homocentrically +homocerc +homocercal +homocercality +homocercy +homocerebrin +homochiral +homochlamydeous +homochromatic +homochromatism +homochrome +homochromy +homochromic +homochromosome +homochromous +homochronous +homocycle +homocyclic +homoclinal +homocline +homocoela +homocoelous +homocreosol +homodermy +homodermic +homodynamy +homodynamic +homodynamous +homodyne +homodont +homodontism +homodox +homodoxian +homodromal +homodrome +homodromy +homodromous +homoean +homoeanism +homoecious +homoeoarchy +homoeoblastic +homoeochromatic +homoeochronous +homoeocrystalline +homoeogenic +homoeogenous +homoeography +homoeoid +homoeokinesis +homoeomerae +homoeomeral +homoeomeri +homoeomery +homoeomeria +homoeomerian +homoeomerianism +homoeomeric +homoeomerical +homoeomerous +homoeomorph +homoeomorphy +homoeomorphic +homoeomorphism +homoeomorphous +homoeopath +homoeopathy +homoeopathic +homoeopathically +homoeopathician +homoeopathicity +homoeopathist +homoeophyllous +homoeophony +homoeoplasy +homoeoplasia +homoeoplastic +homoeopolar +homoeosis +homoeotel +homoeoteleutic +homoeoteleuton +homoeotic +homoeotype +homoeotypic +homoeotypical +homoeotopy +homoeozoic +homoerotic +homoeroticism +homoerotism +homofermentative +homogametic +homogamy +homogamic +homogamies +homogamous +homogangliate +homogen +homogenate +homogene +homogeneal +homogenealness +homogeneate +homogeneity +homogeneities +homogeneization +homogeneize +homogeneous +homogeneously +homogeneousness +homogenesis +homogenetic +homogenetical +homogenetically +homogeny +homogenic +homogenies +homogenization +homogenize +homogenized +homogenizer +homogenizers +homogenizes +homogenizing +homogenous +homogentisic +homoglot +homogone +homogony +homogonies +homogonous +homogonously +homograft +homograph +homography +homographic +homographs +homohedral +homoiotherm +homoiothermal +homoiothermy +homoiothermic +homoiothermism +homoiothermous +homoiousia +homoiousian +homoiousianism +homoiousious +homolateral +homolecithal +homolegalis +homolysin +homolysis +homolytic +homolog +homologal +homologate +homologated +homologating +homologation +homology +homologic +homological +homologically +homologies +homologise +homologised +homologiser +homologising +homologist +homologize +homologized +homologizer +homologizing +homologon +homologoumena +homologous +homolography +homolographic +homologs +homologue +homologumena +homolosine +homomallous +homomeral +homomerous +homometrical +homometrically +homomorph +homomorpha +homomorphy +homomorphic +homomorphism +homomorphisms +homomorphosis +homomorphous +homoneura +homonid +homonym +homonymy +homonymic +homonymies +homonymity +homonymous +homonymously +homonyms +homonomy +homonomous +homonuclear +homoousia +homoousian +homoousianism +homoousianist +homoousiast +homoousion +homoousious +homopathy +homopause +homoperiodic +homopetalous +homophene +homophenous +homophile +homophiles +homophyly +homophylic +homophyllous +homophobia +homophobic +homophone +homophones +homophony +homophonic +homophonically +homophonous +homophthalic +homopiperonyl +homoplasy +homoplasis +homoplasmy +homoplasmic +homoplassy +homoplast +homoplastic +homoplastically +homopolar +homopolarity +homopolic +homopolymer +homopolymerization +homopolymerize +homopter +homoptera +homopteran +homopteron +homopterous +homorelaps +homorganic +homos +homoscedastic +homoscedasticity +homoseismal +homosexual +homosexualism +homosexualist +homosexuality +homosexually +homosexuals +homosystemic +homosphere +homospory +homosporous +homosteus +homostyled +homostyly +homostylic +homostylism +homostylous +homotactic +homotatic +homotaxeous +homotaxy +homotaxia +homotaxial +homotaxially +homotaxic +homotaxis +homothallic +homothallism +homotherm +homothermal +homothermy +homothermic +homothermism +homothermous +homothety +homothetic +homotypal +homotype +homotypy +homotypic +homotypical +homotony +homotonic +homotonous +homotonously +homotopy +homotopic +homotransplant +homotransplantation +homotropal +homotropous +homousian +homovanillic +homovanillin +homoveratric +homoveratrole +homozygosis +homozygosity +homozygote +homozygotes +homozygotic +homozygous +homozygously +homozygousness +homrai +homuncio +homuncle +homuncular +homuncule +homunculi +homunculus +hon +honan +honans +honcho +honchos +hond +honda +hondas +hondo +honduran +honduranean +honduranian +hondurans +honduras +hondurean +hondurian +hone +honed +honey +honeyballs +honeybee +honeybees +honeyberry +honeybind +honeyblob +honeybloom +honeybun +honeybunch +honeybuns +honeycomb +honeycombed +honeycombing +honeycombs +honeycreeper +honeycup +honeydew +honeydewed +honeydews +honeydrop +honeyed +honeyedly +honeyedness +honeyfall +honeyflower +honeyfogle +honeyfugle +honeyful +honeyhearted +honeying +honeyless +honeylike +honeylipped +honeymonth +honeymoon +honeymooned +honeymooner +honeymooners +honeymoony +honeymooning +honeymoonlight +honeymoons +honeymoonshine +honeymoonstruck +honeymouthed +honeypod +honeypot +honeys +honeystone +honeystucker +honeysuck +honeysucker +honeysuckle +honeysuckled +honeysuckles +honeysweet +honeyware +honeywood +honeywort +honer +honers +hones +honest +honester +honestest +honestete +honesty +honesties +honestly +honestness +honestone +honewort +honeworts +hong +hongkong +hongs +honied +honily +honing +honiton +honk +honked +honkey +honkeys +honker +honkers +honky +honkie +honkies +honking +honkytonks +honks +honolulu +honor +honora +honorability +honorable +honorableness +honorables +honorableship +honorably +honorance +honorand +honorands +honorararia +honorary +honoraria +honoraries +honorarily +honorarium +honorariums +honored +honoree +honorees +honorer +honorers +honoress +honorific +honorifical +honorifically +honorifics +honoring +honorless +honorous +honors +honorsman +honorworthy +honour +honourable +honourableness +honourably +honoured +honourer +honourers +honouring +honourless +honours +hont +hontish +hontous +honzo +hoo +hooch +hooches +hoochinoo +hood +hoodcap +hooded +hoodedness +hoodful +hoody +hoodie +hoodies +hooding +hoodle +hoodless +hoodlike +hoodlum +hoodlumish +hoodlumism +hoodlumize +hoodlums +hoodman +hoodmen +hoodmold +hoodoes +hoodoo +hoodooed +hoodooing +hoodooism +hoodoos +hoods +hoodsheaf +hoodshy +hoodshyness +hoodwink +hoodwinkable +hoodwinked +hoodwinker +hoodwinking +hoodwinks +hoodwise +hoodwort +hooey +hooeys +hoof +hoofbeat +hoofbeats +hoofbound +hoofed +hoofer +hoofers +hoofy +hoofiness +hoofing +hoofish +hoofless +hooflet +hooflike +hoofmark +hoofmarks +hoofprint +hoofrot +hoofs +hoofworm +hoogaars +hooye +hook +hooka +hookah +hookahs +hookaroon +hookas +hookcheck +hooked +hookedness +hookedwise +hookey +hookeys +hooker +hookera +hookerman +hookers +hookheal +hooky +hookier +hookies +hookiest +hooking +hookish +hookland +hookless +hooklet +hooklets +hooklike +hookmaker +hookmaking +hookman +hooknose +hooknoses +hooks +hookshop +hooksmith +hookswinging +hooktip +hookum +hookup +hookups +hookupu +hookweed +hookwise +hookworm +hookwormer +hookwormy +hookworms +hool +hoolakin +hoolaulea +hoolee +hooley +hooly +hoolie +hooligan +hooliganish +hooliganism +hooliganize +hooligans +hoolihan +hoolock +hoom +hoon +hoondee +hoondi +hoonoomaun +hoop +hooped +hooper +hooperman +hoopers +hooping +hoopla +hooplas +hoople +hoopless +hooplike +hoopmaker +hoopman +hoopmen +hoopoe +hoopoes +hoopoo +hoopoos +hoops +hoopskirt +hoopster +hoopsters +hoopstick +hoopwood +hoorah +hoorahed +hoorahing +hoorahs +hooray +hoorayed +hooraying +hoorays +hooroo +hooroosh +hoose +hoosegow +hoosegows +hoosgow +hoosgows +hoosh +hoosier +hoosierdom +hoosierese +hoosierize +hoosiers +hoot +hootay +hootch +hootches +hooted +hootenanny +hootenannies +hooter +hooters +hooting +hootingly +hootmalalie +hoots +hoove +hooved +hoovey +hooven +hoover +hooverism +hooverize +hooves +hop +hopak +hopbind +hopbine +hopbush +hopcalite +hopcrease +hope +hoped +hopeful +hopefully +hopefulness +hopefuls +hopeite +hopeless +hopelessly +hopelessness +hoper +hopers +hopes +hophead +hopheads +hopi +hopyard +hoping +hopingly +hopis +hopkinsian +hopkinsianism +hopkinsonian +hoplite +hoplites +hoplitic +hoplitodromos +hoplocephalus +hoplology +hoplomachy +hoplomachic +hoplomachist +hoplomachos +hoplonemertea +hoplonemertean +hoplonemertine +hoplonemertini +hoplophoneus +hopoff +hopped +hopper +hopperburn +hoppercar +hopperdozer +hopperette +hoppergrass +hopperings +hopperman +hoppers +hoppestere +hoppet +hoppy +hopping +hoppingly +hoppity +hoppytoad +hopple +hoppled +hopples +hoppling +hoppo +hops +hopsack +hopsacking +hopsacks +hopsage +hopscotch +hopscotcher +hopthumb +hoptoad +hoptoads +hoptree +hopvine +hor +hora +horace +horae +horah +horahs +horal +horary +horas +horatian +horatiye +horatio +horation +horatius +horatory +horbachite +hordary +hordarian +horde +hordeaceous +hordeate +horded +hordeiform +hordein +hordeins +hordenine +hordeola +hordeolum +hordes +hordeum +hording +hordock +hore +horehoond +horehound +horehounds +hory +horim +horismology +horizometer +horizon +horizonal +horizonless +horizons +horizontal +horizontalism +horizontality +horizontalization +horizontalize +horizontally +horizontalness +horizontic +horizontical +horizontically +horizonward +horkey +horla +horme +hormephobia +hormetic +hormic +hormigo +hormion +hormism +hormist +hormogon +hormogonales +hormogoneae +hormogoneales +hormogonium +hormogonous +hormonal +hormonally +hormone +hormonelike +hormones +hormonic +hormonize +hormonogenesis +hormonogenic +hormonoid +hormonology +hormonopoiesis +hormonopoietic +hormos +horn +hornada +hornbeak +hornbeam +hornbeams +hornbill +hornbills +hornblende +hornblendic +hornblendite +hornblendophyre +hornblower +hornbook +hornbooks +horned +hornedness +horner +hornerah +hornero +hornet +hornety +hornets +hornfair +hornfels +hornfish +hornful +horngeld +horny +hornie +hornier +horniest +hornify +hornification +hornified +hornyhanded +hornyhead +hornily +horniness +horning +hornish +hornist +hornito +hornitos +hornkeck +hornless +hornlessness +hornlet +hornlike +hornmouth +hornotine +hornpipe +hornpipes +hornplant +hornpout +hornpouts +horns +hornslate +hornsman +hornstay +hornstone +hornswaggle +hornswoggle +hornswoggled +hornswoggling +horntail +horntails +hornthumb +horntip +hornweed +hornwood +hornwork +hornworm +hornworms +hornwort +hornworts +hornwrack +horograph +horographer +horography +horokaka +horol +horologe +horologer +horologes +horology +horologia +horologic +horological +horologically +horologies +horologigia +horologiography +horologist +horologists +horologium +horologue +horometer +horometry +horometrical +horonite +horopito +horopter +horoptery +horopteric +horoscopal +horoscope +horoscoper +horoscopes +horoscopy +horoscopic +horoscopical +horoscopist +horotely +horotelic +horouta +horrah +horray +horral +horrendous +horrendously +horrent +horrescent +horreum +horry +horribility +horrible +horribleness +horribles +horribly +horrid +horridity +horridly +horridness +horrify +horrific +horrifically +horrification +horrified +horrifiedly +horrifies +horrifying +horrifyingly +horripilant +horripilate +horripilated +horripilating +horripilation +horrisonant +horror +horrorful +horrorish +horrorist +horrorize +horrormonger +horrormongering +horrorous +horrors +horrorsome +hors +horse +horseback +horsebacker +horsebane +horsebean +horseboy +horsebox +horsebreaker +horsebush +horsecar +horsecars +horsecart +horsecloth +horsecloths +horsecraft +horsed +horsedom +horsedrawing +horseess +horsefair +horsefeathers +horsefettler +horsefight +horsefish +horsefishes +horseflesh +horsefly +horseflies +horseflower +horsefoot +horsegate +horsehair +horsehaired +horsehead +horseheads +horseheal +horseheel +horseherd +horsehide +horsehides +horsehood +horsehoof +horsey +horseier +horseiest +horsejockey +horsekeeper +horsekeeping +horselaugh +horselaugher +horselaughs +horselaughter +horseleach +horseleech +horseless +horsely +horselike +horseload +horselock +horseman +horsemanship +horsemastership +horsemen +horsemint +horsemonger +horsenail +horsepipe +horseplay +horseplayer +horseplayers +horseplayful +horsepond +horsepower +horsepowers +horsepox +horser +horseradish +horseradishes +horses +horseshit +horseshoe +horseshoed +horseshoeing +horseshoer +horseshoers +horseshoes +horseshoing +horsetail +horsetails +horsetongue +horsetown +horsetree +horseway +horseweed +horsewhip +horsewhipped +horsewhipper +horsewhipping +horsewhips +horsewoman +horsewomanship +horsewomen +horsewood +horsfordite +horsy +horsier +horsiest +horsify +horsyism +horsily +horsiness +horsing +horst +horste +horstes +horsts +hort +hortation +hortative +hortatively +hortator +hortatory +hortatorily +hortense +hortensia +hortensial +hortensian +hortesian +hortyard +horticultor +horticultural +horticulturalist +horticulturally +horticulture +horticulturist +horticulturists +hortite +hortonolite +hortorium +hortulan +horvatian +hosackia +hosanna +hosannaed +hosannaing +hosannas +hose +hosea +hosebird +hosecock +hosed +hosel +hoseless +hoselike +hosels +hoseman +hosen +hosepipe +hoses +hosier +hosiery +hosieries +hosiers +hosing +hosiomartyr +hosp +hospice +hospices +hospita +hospitable +hospitableness +hospitably +hospitage +hospital +hospitalary +hospitaler +hospitalism +hospitality +hospitalities +hospitalization +hospitalizations +hospitalize +hospitalized +hospitalizes +hospitalizing +hospitaller +hospitalman +hospitalmen +hospitals +hospitant +hospitate +hospitation +hospitator +hospitia +hospitious +hospitium +hospitize +hospodar +hospodariat +hospodariate +hospodars +hoss +host +hosta +hostage +hostaged +hostager +hostages +hostageship +hostaging +hostal +hosted +hostel +hosteled +hosteler +hostelers +hosteling +hosteller +hostelling +hostelry +hostelries +hostels +hoster +hostess +hostessed +hostesses +hostessing +hostie +hostile +hostiley +hostilely +hostileness +hostiles +hostility +hostilities +hostilize +hosting +hostle +hostler +hostlers +hostlership +hostlerwife +hostless +hostly +hostry +hosts +hostship +hot +hotbed +hotbeds +hotblood +hotblooded +hotbloods +hotbox +hotboxes +hotbrained +hotcake +hotcakes +hotch +hotcha +hotched +hotches +hotching +hotchkiss +hotchpot +hotchpotch +hotchpotchly +hotchpots +hotdog +hotdogged +hotdogger +hotdogging +hotdogs +hote +hotel +hoteldom +hotelhood +hotelier +hoteliers +hotelization +hotelize +hotelkeeper +hotelless +hotelman +hotelmen +hotels +hotelward +hotfoot +hotfooted +hotfooting +hotfoots +hothead +hotheaded +hotheadedly +hotheadedness +hotheads +hothearted +hotheartedly +hotheartedness +hothouse +hothouses +hoti +hotkey +hotly +hotline +hotmelt +hotmouthed +hotness +hotnesses +hotplate +hotpot +hotpress +hotpressed +hotpresses +hotpressing +hotrod +hotrods +hots +hotshot +hotshots +hotsprings +hotspur +hotspurred +hotspurs +hotta +hotted +hottentot +hottentotese +hottentotic +hottentotish +hottentotism +hotter +hottery +hottest +hottie +hotting +hottish +hottle +hottonia +hotzone +houbara +houdah +houdahs +houdan +hough +houghband +hougher +houghite +houghmagandy +houghsinew +houghton +houhere +houyhnhnm +houlet +hoult +houmous +hounce +hound +hounded +hounder +hounders +houndfish +houndfishes +houndy +hounding +houndish +houndlike +houndman +hounds +houndsbane +houndsberry +houndsfoot +houndshark +hounskull +houpelande +houppelande +hour +hourful +hourglass +hourglasses +houri +houris +hourless +hourly +hourlong +hours +housage +housal +housatonic +house +houseball +houseboat +houseboating +houseboats +houseboy +houseboys +housebote +housebound +housebreak +housebreaker +housebreakers +housebreaking +housebroke +housebroken +housebrokenness +housebug +housebuilder +housebuilding +housecarl +houseclean +housecleaned +housecleaner +housecleaning +housecleans +housecoat +housecoats +housecraft +housed +housedress +housefast +housefather +housefly +houseflies +housefront +houseful +housefuls +housefurnishings +houseguest +household +householder +householders +householdership +householding +householdry +households +househusband +househusbands +housekeep +housekeeper +housekeeperly +housekeeperlike +housekeepers +housekeeping +housekept +housekkept +housel +houseled +houseleek +houseless +houselessness +houselet +houselights +houseline +houseling +houselled +houselling +housels +housemaid +housemaidenly +housemaidy +housemaiding +housemaids +houseman +housemaster +housemastership +housemate +housemating +housemen +houseminder +housemistress +housemother +housemotherly +housemothers +houseowner +housepaint +houseparent +housephone +houseplant +houser +houseridden +houseroom +housers +houses +housesat +housesit +housesits +housesitting +housesmith +housetop +housetops +houseward +housewares +housewarm +housewarmer +housewarming +housewarmings +housewear +housewife +housewifely +housewifeliness +housewifery +housewifeship +housewifish +housewive +housewives +housework +houseworker +houseworkers +housewrecker +housewright +housy +housing +housings +housling +houss +housty +houston +houstonia +hout +houting +houtou +houvari +houve +hova +hove +hovedance +hovel +hoveled +hoveler +hoveling +hovelled +hoveller +hovelling +hovels +hoven +hovenia +hover +hovercar +hovercraft +hovercrafts +hovered +hoverer +hoverers +hovering +hoveringly +hoverly +hoverport +hovers +hovertrain +how +howadji +howard +howardite +howbeit +howdah +howdahs +howder +howdy +howdie +howdies +howe +howea +howel +howes +however +howf +howff +howffs +howfing +howfs +howgates +howish +howitz +howitzer +howitzers +howk +howked +howker +howking +howkit +howks +howl +howled +howler +howlers +howlet +howlets +howling +howlingly +howlite +howls +hows +howsabout +howso +howsoever +howsomever +howsour +howtowdie +hox +hp +hpital +hq +hr +hrdwre +hrimfaxi +hrothgar +hrs +hrzn +hs +hsi +hsien +hsuan +ht +htel +hts +hu +huaca +huaco +huajillo +huamuchil +huanaco +huantajayite +huapango +huapangos +huarache +huaraches +huaracho +huarachos +huari +huarizo +huashi +huastec +huastecan +huave +huavean +hub +hubb +hubba +hubbaboo +hubbed +hubber +hubby +hubbies +hubbing +hubbite +hubble +hubbly +hubbob +hubbub +hubbuboo +hubbubs +hubcap +hubcaps +hubert +hubmaker +hubmaking +hubnerite +hubris +hubrises +hubristic +hubristically +hubs +hubshi +huccatoon +huchen +huchnom +hucho +huck +huckaback +huckle +huckleback +hucklebacked +huckleberry +huckleberries +hucklebone +huckles +huckmuck +hucks +huckster +hucksterage +huckstered +hucksterer +hucksteress +huckstery +huckstering +hucksterism +hucksterize +hucksters +huckstress +hud +hudderon +huddle +huddled +huddledom +huddlement +huddler +huddlers +huddles +huddling +huddlingly +huddock +huddroun +huddup +hudibras +hudibrastic +hudibrastically +hudson +hudsonia +hudsonian +hudsonite +hue +hued +hueful +huehuetl +huey +hueless +huelessness +huemul +huer +huerta +hues +huff +huffaker +huffcap +huffed +huffer +huffy +huffier +huffiest +huffily +huffiness +huffing +huffingly +huffish +huffishly +huffishness +huffle +huffler +huffs +hug +huge +hugely +hugelia +hugelite +hugeness +hugenesses +hugeous +hugeously +hugeousness +huger +hugest +huggable +hugged +hugger +huggery +huggermugger +huggermuggery +huggers +huggin +hugging +huggingly +huggle +hugh +hughes +hughoc +hugy +hugmatee +hugo +hugoesque +hugonis +hugs +hugsome +huguenot +huguenotic +huguenotism +huguenots +huh +hui +huia +huic +huygenian +huyghenian +huile +huipil +huipilla +huisache +huiscoyol +huisher +huisquil +huissier +huitain +huitre +huk +hukbalahap +huke +hula +hulas +hulch +hulchy +huldah +huldee +huly +hulk +hulkage +hulked +hulky +hulkier +hulkiest +hulkily +hulkiness +hulking +hulkingly +hulkingness +hulks +hull +hullaballoo +hullaballoos +hullabaloo +hullabaloos +hulled +huller +hullers +hulling +hullo +hulloa +hulloaed +hulloaing +hulloas +hullock +hulloed +hulloes +hulloing +hulloo +hullooed +hullooing +hulloos +hullos +hulls +huloist +hulotheism +hulsean +hulsite +hulster +hulu +hulver +hulverhead +hulverheaded +hulwort +hum +huma +human +humanate +humane +humanely +humaneness +humaner +humanest +humanhood +humanics +humanify +humanification +humaniform +humaniformian +humanisation +humanise +humanised +humaniser +humanises +humanish +humanising +humanism +humanisms +humanist +humanistic +humanistical +humanistically +humanists +humanitary +humanitarian +humanitarianism +humanitarianist +humanitarianize +humanitarians +humanity +humanitian +humanities +humanitymonger +humanization +humanize +humanized +humanizer +humanizers +humanizes +humanizing +humankind +humanly +humanlike +humanness +humanoid +humanoids +humans +humate +humates +humation +humbird +humble +humblebee +humbled +humblehearted +humblemouthed +humbleness +humbler +humblers +humbles +humblesse +humblesso +humblest +humbly +humblie +humbling +humblingly +humbo +humboldtilite +humboldtine +humboldtite +humbug +humbugability +humbugable +humbugged +humbugger +humbuggery +humbuggers +humbugging +humbuggism +humbugs +humbuzz +humdinger +humdingers +humdrum +humdrumminess +humdrummish +humdrummishness +humdrumness +humdrums +humdudgeon +hume +humean +humect +humectant +humectate +humectation +humective +humeral +humerals +humeri +humermeri +humeroabdominal +humerocubital +humerodigital +humerodorsal +humerometacarpal +humeroradial +humeroscapular +humeroulnar +humerus +humet +humettee +humetty +humhum +humic +humicubation +humid +humidate +humidfied +humidfies +humidify +humidification +humidified +humidifier +humidifiers +humidifies +humidifying +humidistat +humidity +humidities +humidityproof +humidly +humidness +humidor +humidors +humify +humific +humification +humified +humifuse +humilation +humiliant +humiliate +humiliated +humiliates +humiliating +humiliatingly +humiliation +humiliations +humiliative +humiliator +humiliatory +humilific +humilis +humility +humilities +humilitude +humin +humiria +humiriaceae +humiriaceous +humism +humist +humistratous +humit +humite +humiture +humlie +hummable +hummaul +hummed +hummel +hummeler +hummer +hummeri +hummers +hummie +humming +hummingbird +hummingbirds +hummingly +hummock +hummocky +hummocks +hummum +hummus +humongous +humor +humoral +humoralism +humoralist +humoralistic +humored +humorer +humorers +humoresque +humoresquely +humorful +humorific +humoring +humorism +humorist +humoristic +humoristical +humorists +humorize +humorless +humorlessly +humorlessness +humorology +humorous +humorously +humorousness +humorproof +humors +humorsome +humorsomely +humorsomeness +humour +humoural +humoured +humourful +humouring +humourist +humourize +humourless +humourlessness +humours +humoursome +humous +hump +humpback +humpbacked +humpbacks +humped +humph +humphed +humphing +humphrey +humphs +humpy +humpier +humpies +humpiest +humpiness +humping +humpless +humps +humpty +hums +humstrum +humuhumunukunukuapuaa +humulene +humulon +humulone +humulus +humus +humuses +humuslike +hun +hunanese +hunch +hunchakist +hunchback +hunchbacked +hunchbacks +hunched +hunches +hunchet +hunchy +hunching +hund +hunder +hundi +hundred +hundredal +hundredary +hundreder +hundredfold +hundredman +hundredpenny +hundreds +hundredth +hundredths +hundredweight +hundredweights +hundredwork +hunfysh +hung +hungar +hungary +hungaria +hungarian +hungarians +hungaric +hungarite +hunger +hungered +hungerer +hungering +hungeringly +hungerless +hungerly +hungerproof +hungerroot +hungers +hungerweed +hungry +hungrier +hungriest +hungrify +hungrily +hungriness +hunh +hunyak +hunk +hunker +hunkered +hunkering +hunkerism +hunkerous +hunkerousness +hunkers +hunky +hunkies +hunkpapa +hunks +hunlike +hunner +hunnian +hunnic +hunnican +hunnish +hunnishness +huns +hunt +huntable +huntaway +hunted +huntedly +hunter +hunterian +hunterlike +hunters +huntilite +hunting +huntings +huntley +huntress +huntresses +hunts +huntsman +huntsmanship +huntsmen +huntswoman +hup +hupa +hupaithric +huppah +huppahs +huppot +huppoth +hura +hurcheon +hurden +hurdies +hurdis +hurdle +hurdled +hurdleman +hurdler +hurdlers +hurdles +hurdlewise +hurdling +hurds +hure +hureaulite +hureek +hurf +hurgila +hurkaru +hurkle +hurl +hurlbarrow +hurlbat +hurled +hurley +hurleyhacket +hurleyhouse +hurleys +hurlement +hurler +hurlers +hurly +hurlies +hurling +hurlings +hurlock +hurlpit +hurls +hurlwind +huron +huronian +hurr +hurrah +hurrahed +hurrahing +hurrahs +hurray +hurrayed +hurraying +hurrays +hurrer +hurri +hurry +hurrian +hurricane +hurricanes +hurricanize +hurricano +hurridly +hurried +hurriedly +hurriedness +hurrier +hurriers +hurries +hurrygraph +hurrying +hurryingly +hurryproof +hurrisome +hurrock +hurroo +hurroosh +hursinghar +hurst +hurt +hurtable +hurted +hurter +hurters +hurtful +hurtfully +hurtfulness +hurty +hurting +hurtingest +hurtle +hurtleberry +hurtleberries +hurtled +hurtles +hurtless +hurtlessly +hurtlessness +hurtling +hurtlingly +hurts +hurtsome +husband +husbandable +husbandage +husbanded +husbander +husbandfield +husbandhood +husbanding +husbandland +husbandless +husbandly +husbandlike +husbandliness +husbandman +husbandmen +husbandress +husbandry +husbands +husbandship +huscarl +huse +hush +hushaby +hushable +hushcloth +hushed +hushedly +husheen +hushel +husher +hushes +hushful +hushfully +hushing +hushingly +hushion +hushllsost +husho +hushpuppy +hushpuppies +husht +husk +huskanaw +husked +huskened +husker +huskers +huskershredder +husky +huskier +huskies +huskiest +huskily +huskiness +husking +huskings +husklike +huskroot +husks +huskwort +huso +huspel +huspil +huss +hussar +hussars +hussy +hussydom +hussies +hussyness +hussite +hussitism +hust +husting +hustings +hustle +hustlecap +hustled +hustlement +hustler +hustlers +hustles +hustling +huswife +huswifes +huswives +hut +hutch +hutched +hutcher +hutches +hutchet +hutchie +hutching +hutchinsonian +hutchinsonianism +hutchinsonite +huterian +huthold +hutholder +hutia +hutkeeper +hutlet +hutlike +hutment +hutments +hutre +huts +hutsulian +hutted +hutterites +hutting +huttonian +huttonianism +huttoning +huttonweed +hutukhtu +hutuktu +hutung +hutzpa +hutzpah +hutzpahs +hutzpas +huurder +huvelyk +huxleian +huxter +huzoor +huzvaresh +huzz +huzza +huzzaed +huzzah +huzzahed +huzzahing +huzzahs +huzzaing +huzzard +huzzas +huzzy +hv +hvy +hw +hwa +hwan +hwy +hwyl +hwt +i +y +ia +ya +yaba +yabber +yabbered +yabbering +yabbers +yabbi +yabby +yabbie +yabble +yaboo +yabu +yacal +yacare +yacata +yacca +iacchic +iacchos +iacchus +yachan +iachimo +yacht +yachtdom +yachted +yachter +yachters +yachty +yachting +yachtings +yachtist +yachtman +yachtmanship +yachtmen +yachts +yachtsman +yachtsmanlike +yachtsmanship +yachtsmen +yachtswoman +yachtswomen +yack +yacked +yacking +yacks +yad +yadayim +yadava +yade +yadim +yaff +yaffed +yaffil +yaffing +yaffingale +yaffle +yaffler +yaffs +yager +yagers +yagger +yaghourt +yagi +yagis +yagnob +iago +yagourundi +yagua +yaguarundi +yaguas +yaguaza +yah +yahan +yahgan +yahganan +yahoo +yahoodom +yahooish +yahooism +yahooisms +yahoos +yahrzeit +yahrzeits +yahuna +yahuskin +yahveh +yahweh +yahwism +yahwist +yahwistic +yay +yaya +yair +yaird +yairds +yaje +yajein +yajeine +yajenin +yajenine +yajna +yajnavalkya +yajnopavita +yak +yaka +yakala +yakalo +yakamik +yakan +yakattalo +yakima +yakin +yakitori +yakitoris +yakka +yakked +yakker +yakkers +yakking +yakmak +yakman +yakona +yakonan +yaks +yaksha +yakshi +yakut +yakutat +yalb +yald +yale +yalensian +yali +yalla +yallaer +yallock +yallow +yam +yamacraw +yamalka +yamalkas +yamamadi +yamamai +yamanai +yamaskite +yamassee +yamato +iamatology +iamb +iambe +iambelegus +iambi +iambic +iambical +iambically +iambics +iambist +iambize +iambographer +iambs +iambus +iambuses +yamel +yamen +yamens +yameo +yamilke +yammadji +yammer +yammered +yammerer +yammerers +yammering +yammerly +yammers +yamp +yampa +yampee +yamph +yams +yamshik +yamstchick +yamstchik +yamulka +yamulkas +yamun +yamuns +ian +yan +yana +yanacona +yanan +yancopin +yander +yang +yanggona +yangs +yangtao +yangtze +yank +yanked +yankee +yankeedom +yankeefy +yankeeism +yankeeist +yankeeize +yankeeland +yankeeness +yankees +yanker +yanky +yanking +yanks +yankton +yanktonai +yannam +yannigan +yanolite +yanqui +yanquis +ianthina +ianthine +ianthinite +yantra +yantras +ianus +iao +yao +yaoort +yaourt +yaourti +yap +yapa +iapetus +iapyges +iapygian +iapygii +yaply +yapman +yapness +yapock +yapocks +yapok +yapoks +yapon +yapons +yapp +yapped +yapper +yappers +yappy +yappiness +yapping +yappingly +yappish +yaps +yapster +yaqona +yaqui +yaquina +yar +yaray +yarak +yarb +yarborough +yard +yardage +yardages +yardang +yardarm +yardarms +yardbird +yardbirds +yarded +yarder +yardful +yardgrass +yarding +yardkeep +yardland +yardlands +yardman +yardmaster +yardmasters +yardmen +yards +yardsman +yardstick +yardsticks +yardwand +yardwands +yardwork +yardworks +iare +yare +yarely +yarer +yarest +yareta +yariyari +yark +yarkand +yarke +yarkee +yarl +yarly +yarm +yarmalke +yarmelke +yarmelkes +yarmouth +yarmulka +yarmulke +yarmulkes +yarn +yarned +yarnen +yarner +yarners +yarning +yarns +yarnwindle +iarovization +yarovization +iarovize +yarovize +iarovized +yarovized +iarovizing +yarovizing +yarpha +yarr +yarraman +yarramen +yarran +yarry +yarringle +yarrow +yarrows +yarth +yarthen +yaru +yarura +yaruran +yaruro +yarwhelp +yarwhip +yas +yashiro +yashmac +yashmacs +yashmak +yashmaks +yasht +yasmak +yasmaks +yasna +yat +yatagan +yatagans +yataghan +yataghans +yatalite +yate +yati +yatigan +iatraliptic +iatraliptics +iatric +iatrical +iatrochemic +iatrochemical +iatrochemically +iatrochemist +iatrochemistry +iatrogenic +iatrogenically +iatrogenicity +iatrology +iatrological +iatromathematical +iatromathematician +iatromathematics +iatromechanical +iatromechanist +iatrophysical +iatrophysicist +iatrophysics +iatrotechnics +yatter +yattered +yattering +yatters +yatvyag +yauapery +yaud +yauds +yauld +yaup +yauped +yauper +yaupers +yauping +yaupon +yaupons +yaups +yautia +yautias +yava +yavapai +yaw +yawed +yawey +yawy +yawing +yawl +yawled +yawler +yawling +yawls +yawlsman +yawmeter +yawmeters +yawn +yawned +yawney +yawner +yawners +yawnful +yawnfully +yawny +yawnily +yawniness +yawning +yawningly +yawnproof +yawns +yawnups +yawp +yawped +yawper +yawpers +yawping +yawpings +yawps +yawroot +yaws +yawshrub +yawweed +yaxche +yazata +yazdegerdian +yazoo +ib +iba +ibad +ibadite +iban +ibanag +iberes +iberi +iberia +iberian +iberians +iberic +iberis +iberism +iberite +ibex +ibexes +ibices +ibycter +ibycus +ibid +ibidem +ibididae +ibidinae +ibidine +ibidium +ibilao +ibis +ibisbill +ibises +yblent +ibm +ibo +ibolium +ibota +ibsenian +ibsenic +ibsenish +ibsenism +ibsenite +ibuprofen +ic +icacinaceae +icacinaceous +icaco +icacorea +icaria +icarian +icarianism +icarus +icasm +icbm +ice +iceberg +icebergs +iceblink +iceblinks +iceboat +iceboater +iceboating +iceboats +icebone +icebound +icebox +iceboxes +icebreaker +icebreakers +icecap +icecaps +icecraft +iced +icefall +icefalls +icefish +icefishes +icehouse +icehouses +icekhana +icekhanas +iceland +icelander +icelanders +icelandian +icelandic +iceleaf +iceless +icelidae +icelike +iceman +icemen +iceni +icepick +icequake +icerya +iceroot +ices +iceskate +iceskated +iceskating +icespar +icework +ich +ichebu +ichibu +ichneumia +ichneumon +ichneumoned +ichneumones +ichneumonid +ichneumonidae +ichneumonidan +ichneumonides +ichneumoniform +ichneumonized +ichneumonoid +ichneumonoidea +ichneumonology +ichneumous +ichneutic +ichnite +ichnites +ichnography +ichnographic +ichnographical +ichnographically +ichnographies +ichnolite +ichnolithology +ichnolitic +ichnology +ichnological +ichnomancy +icho +ichoglan +ichor +ichorous +ichorrhaemia +ichorrhea +ichorrhemia +ichorrhoea +ichors +ichs +ichth +ichthammol +ichthyal +ichthyian +ichthyic +ichthyician +ichthyism +ichthyisms +ichthyismus +ichthyization +ichthyized +ichthyobatrachian +ichthyocephali +ichthyocephalous +ichthyocol +ichthyocolla +ichthyocoprolite +ichthyodea +ichthyodectidae +ichthyodian +ichthyodont +ichthyodorylite +ichthyodorulite +ichthyofauna +ichthyofaunal +ichthyoform +ichthyographer +ichthyography +ichthyographia +ichthyographic +ichthyographies +ichthyoid +ichthyoidal +ichthyoidea +ichthyol +ichthyolatry +ichthyolatrous +ichthyolite +ichthyolitic +ichthyology +ichthyologic +ichthyological +ichthyologically +ichthyologist +ichthyologists +ichthyomancy +ichthyomania +ichthyomantic +ichthyomorpha +ichthyomorphic +ichthyomorphous +ichthyonomy +ichthyopaleontology +ichthyophagan +ichthyophagi +ichthyophagy +ichthyophagian +ichthyophagist +ichthyophagize +ichthyophagous +ichthyophile +ichthyophobia +ichthyophthalmite +ichthyophthiriasis +ichthyophthirius +ichthyopolism +ichthyopolist +ichthyopsid +ichthyopsida +ichthyopsidan +ichthyopterygia +ichthyopterygian +ichthyopterygium +ichthyornis +ichthyornithes +ichthyornithic +ichthyornithidae +ichthyornithiformes +ichthyornithoid +ichthyosaur +ichthyosauria +ichthyosaurian +ichthyosaurid +ichthyosauridae +ichthyosauroid +ichthyosaurus +ichthyosauruses +ichthyosiform +ichthyosis +ichthyosism +ichthyotic +ichthyotomi +ichthyotomy +ichthyotomist +ichthyotomous +ichthyotoxin +ichthyotoxism +ichthys +ichthytaxidermy +ichthulin +ichthulinic +ichthus +ichu +ichulle +icy +icica +icicle +icicled +icicles +ycie +icier +iciest +icily +iciness +icinesses +icing +icings +icker +ickers +icky +ickier +ickiest +ickle +yclad +ycleped +ycleping +yclept +icod +icon +icones +iconian +iconic +iconical +iconically +iconicity +iconism +iconize +iconoclasm +iconoclast +iconoclastic +iconoclastically +iconoclasticism +iconoclasts +iconodule +iconoduly +iconodulic +iconodulist +iconograph +iconographer +iconography +iconographic +iconographical +iconographically +iconographies +iconographist +iconolagny +iconolater +iconolatry +iconolatrous +iconology +iconological +iconologist +iconomachal +iconomachy +iconomachist +iconomania +iconomatic +iconomatically +iconomaticism +iconomatography +iconometer +iconometry +iconometric +iconometrical +iconometrically +iconophile +iconophily +iconophilism +iconophilist +iconoplast +iconoscope +iconostas +iconostases +iconostasion +iconostasis +iconotype +icons +iconv +iconvert +icosaheddra +icosahedra +icosahedral +icosahedron +icosahedrons +icosandria +icosasemic +icosian +icositedra +icositetrahedra +icositetrahedron +icositetrahedrons +icosteid +icosteidae +icosteine +icosteus +icotype +icteric +icterical +icterics +icteridae +icterine +icteritious +icteritous +icterode +icterogenetic +icterogenic +icterogenous +icterohematuria +icteroid +icterous +icterus +icteruses +ictic +ictonyx +ictuate +ictus +ictuses +id +yd +ida +idaean +idaein +idaho +idahoan +idahoans +yday +idaic +idalia +idalian +idant +idcue +iddat +iddhi +iddio +ide +idea +ideaed +ideaful +ideagenous +ideaistic +ideal +idealess +idealy +idealisation +idealise +idealised +idealiser +idealises +idealising +idealism +idealisms +idealist +idealistic +idealistical +idealistically +idealists +ideality +idealities +idealization +idealizations +idealize +idealized +idealizer +idealizes +idealizing +idealless +ideally +idealness +idealogy +idealogical +idealogies +idealogue +ideals +ideamonger +idean +ideas +ideata +ideate +ideated +ideates +ideating +ideation +ideational +ideationally +ideations +ideative +ideatum +idee +ideefixe +ideist +idem +idemfactor +idempotency +idempotent +idence +idenitifiers +ident +identic +identical +identicalism +identically +identicalness +identies +identifer +identifers +identify +identifiability +identifiable +identifiableness +identifiably +identific +identification +identificational +identifications +identified +identifier +identifiers +identifies +identifying +identism +identity +identities +ideo +ideogenetic +ideogeny +ideogenical +ideogenous +ideoglyph +ideogram +ideogramic +ideogrammatic +ideogrammic +ideograms +ideograph +ideography +ideographic +ideographical +ideographically +ideographs +ideokinetic +ideolatry +ideolect +ideology +ideologic +ideological +ideologically +ideologies +ideologise +ideologised +ideologising +ideologist +ideologize +ideologized +ideologizing +ideologue +ideomania +ideomotion +ideomotor +ideoogist +ideophobia +ideophone +ideophonetics +ideophonous +ideoplasty +ideoplastia +ideoplastic +ideoplastics +ideopraxist +ideotype +ides +idesia +idest +ideta +idgah +idiasm +idic +idigbo +idyl +idyler +idylian +idylism +idylist +idylists +idylize +idyll +idyller +idyllia +idyllian +idyllic +idyllical +idyllically +idyllicism +idyllion +idyllist +idyllists +idyllium +idylls +idyls +idiobiology +idioblast +idioblastic +idiochromatic +idiochromatin +idiochromosome +idiocy +idiocyclophanous +idiocies +idiocrasy +idiocrasies +idiocrasis +idiocratic +idiocratical +idiocratically +idiodynamic +idiodynamics +idioelectric +idioelectrical +idiogastra +idiogenesis +idiogenetic +idiogenous +idioglossia +idioglottic +idiogram +idiograph +idiographic +idiographical +idiohypnotism +idiolalia +idiolatry +idiolect +idiolectal +idiolects +idiolysin +idiologism +idiom +idiomatic +idiomatical +idiomatically +idiomaticalness +idiomaticity +idiomaticness +idiomelon +idiometer +idiomography +idiomology +idiomorphic +idiomorphically +idiomorphism +idiomorphous +idioms +idiomuscular +idion +idiopathetic +idiopathy +idiopathic +idiopathical +idiopathically +idiopathies +idiophanism +idiophanous +idiophone +idiophonic +idioplasm +idioplasmatic +idioplasmic +idiopsychology +idiopsychological +idioreflex +idiorepulsive +idioretinal +idiorrhythmy +idiorrhythmic +idiorrhythmism +idiosepiidae +idiosepion +idiosyncracy +idiosyncracies +idiosyncrasy +idiosyncrasies +idiosyncratic +idiosyncratical +idiosyncratically +idiosome +idiospasm +idiospastic +idiostatic +idiot +idiotcy +idiotcies +idiothalamous +idiothermy +idiothermic +idiothermous +idiotic +idiotical +idiotically +idioticalness +idioticon +idiotype +idiotypic +idiotise +idiotised +idiotish +idiotising +idiotism +idiotisms +idiotize +idiotized +idiotizing +idiotry +idiotropian +idiotropic +idiots +idiozome +idism +idist +idistic +idite +iditol +idle +idleby +idled +idleful +idleheaded +idlehood +idleman +idlemen +idlement +idleness +idlenesses +idler +idlers +idles +idleset +idleship +idlesse +idlesses +idlest +idlety +idly +idling +idlish +ido +idocrase +idocrases +idoism +idoist +idoistic +idol +idola +idolaster +idolastre +idolater +idolaters +idolatress +idolatry +idolatric +idolatrical +idolatries +idolatrise +idolatrised +idolatriser +idolatrising +idolatrize +idolatrized +idolatrizer +idolatrizing +idolatrous +idolatrously +idolatrousness +idolet +idolify +idolisation +idolise +idolised +idoliser +idolisers +idolises +idolish +idolising +idolism +idolisms +idolist +idolistic +idolization +idolize +idolized +idolizer +idolizers +idolizes +idolizing +idoloclast +idoloclastic +idolodulia +idolographical +idololater +idololatry +idololatrical +idolomancy +idolomania +idolon +idolothyte +idolothytic +idolous +idols +idolum +idomeneus +idoneal +idoneity +idoneities +idoneous +idoneousness +idorgan +idosaccharic +idose +idotea +idoteidae +idothea +idotheidae +idrialin +idrialine +idrialite +idryl +idrisid +idrisite +idrosis +ids +yds +idumaean +ie +ye +yea +yeah +yealing +yealings +yean +yeaned +yeaning +yeanling +yeanlings +yeans +yeaoman +year +yeara +yearbird +yearbook +yearbooks +yeard +yearday +yeared +yearend +yearends +yearful +yearly +yearlies +yearling +yearlings +yearlong +yearn +yearned +yearner +yearners +yearnful +yearnfully +yearnfulness +yearning +yearningly +yearnings +yearnling +yearns +yearock +years +yearth +yeas +yeasayer +yeasayers +yeast +yeasted +yeasty +yeastier +yeastiest +yeastily +yeastiness +yeasting +yeastless +yeastlike +yeasts +yeat +yeather +yecch +yecchy +yecchs +yech +yechy +yechs +yed +yedding +yede +yederly +yee +yeech +ieee +yeel +yeelaman +yeelin +yeelins +yees +yeeuch +yeeuck +yegg +yeggman +yeggmen +yeggs +yeguita +yeh +yeld +yeldrin +yeldrine +yeldring +yeldrock +yelek +yelk +yelks +yell +yelled +yeller +yellers +yelling +yelloch +yellow +yellowammer +yellowback +yellowbark +yellowbelly +yellowbellied +yellowbellies +yellowberry +yellowberries +yellowbill +yellowbird +yellowcake +yellowcrown +yellowcup +yellowed +yellower +yellowest +yellowfin +yellowfish +yellowhammer +yellowhead +yellowy +yellowing +yellowish +yellowishness +yellowknife +yellowlegs +yellowly +yellowman +yellowness +yellowroot +yellowrump +yellows +yellowseed +yellowshank +yellowshanks +yellowshins +yellowstone +yellowtail +yellowtails +yellowthorn +yellowthroat +yellowtop +yellowware +yellowweed +yellowwood +yellowwort +yells +yelm +yelmer +yelp +yelped +yelper +yelpers +yelping +yelps +yelt +yelver +yemeless +yemen +yemeni +yemenic +yemenite +yemenites +yeming +yemschik +yemsel +yen +yender +yengee +yengees +yengeese +yeni +yenisei +yeniseian +yenite +yenned +yenning +yens +yenta +yentas +yente +yentes +yentnite +yeo +yeom +yeoman +yeomaness +yeomanette +yeomanhood +yeomanly +yeomanlike +yeomanry +yeomanries +yeomanwise +yeomen +yeorling +yeowoman +yeowomen +yep +yepeleic +yepely +yephede +yeply +yer +yerava +yeraver +yerb +yerba +yerbal +yerbales +yerbas +yercum +yerd +yere +yerga +yerk +yerked +yerking +yerks +yern +ierne +yertchuk +yerth +yerva +yes +yese +yeses +yeshibah +yeshiva +yeshivah +yeshivahs +yeshivas +yeshivot +yeshivoth +yeso +yessed +yesses +yessing +yesso +yest +yester +yesterday +yesterdayness +yesterdays +yestereve +yestereven +yesterevening +yesteryear +yesteryears +yestermorn +yestermorning +yestern +yesternight +yesternoon +yesterweek +yesty +yestreen +yestreens +yet +yeta +yetapa +yeth +yether +yethhounds +yeti +yetis +yetlin +yetling +yett +yetter +yetts +yetzer +yeuk +yeuked +yeuky +yeukieness +yeuking +yeuks +yeven +yew +yews +yex +yez +yezdi +yezidi +yezzy +if +yfacks +ife +ifecks +yfere +yferre +iff +iffy +iffier +iffiest +iffiness +iffinesses +ifint +ifreal +ifree +ifrit +ifs +ifugao +igad +ygapo +igara +igarape +igasuric +igbira +igdyr +igdrasil +igelstromite +ygerne +yggdrasil +ighly +igitur +iglesia +igloo +igloos +iglu +iglulirmiut +iglus +ign +igname +ignaro +ignatia +ignatian +ignatianist +ignatias +ignatius +ignavia +ignaw +igneoaqueous +igneous +ignescence +ignescent +ignicolist +igniferous +igniferousness +ignify +ignified +ignifies +ignifying +ignifluous +igniform +ignifuge +ignigenous +ignipotent +ignipuncture +ignis +ignitability +ignitable +ignite +ignited +igniter +igniters +ignites +ignitibility +ignitible +igniting +ignition +ignitions +ignitive +ignitor +ignitors +ignitron +ignitrons +ignivomous +ignivomousness +ignobility +ignoble +ignobleness +ignoblesse +ignobly +ignominy +ignominies +ignominious +ignominiously +ignominiousness +ignomious +ignorable +ignoramus +ignoramuses +ignorance +ignorant +ignorantia +ignorantine +ignorantism +ignorantist +ignorantly +ignorantness +ignoration +ignore +ignored +ignorement +ignorer +ignorers +ignores +ignoring +ignote +ignotus +igorot +igraine +iguana +iguanas +iguania +iguanian +iguanians +iguanid +iguanidae +iguaniform +iguanodon +iguanodont +iguanodontia +iguanodontidae +iguanodontoid +iguanodontoidea +iguanoid +iguvine +ihi +ihlat +ihleite +ihp +ihram +ihrams +ihs +yhwh +ii +yi +iyar +iiasa +yid +yiddish +yiddisher +yiddishism +yiddishist +yids +yield +yieldable +yieldableness +yieldance +yielded +yielden +yielder +yielders +yieldy +yielding +yieldingly +yieldingness +yields +yigh +iii +yike +yikes +yikirgaulit +yildun +yill +yills +yilt +yin +yince +yins +yinst +iyo +yip +yipe +yipes +yipped +yippee +yippie +yippies +yipping +yips +yird +yirds +yirk +yirm +yirmilik +yirn +yirr +yirred +yirring +yirrs +yirth +yirths +yis +yite +iiwi +yizkor +ijithad +ijma +ijmaa +ijo +ijolite +ijore +ijussite +ik +ikan +ikary +ikat +ike +ikebana +ikebanas +ikey +ikeyness +ikhwan +ikon +ikona +ikons +ikra +il +ila +ylahayll +ilama +ile +ilea +ileac +ileal +ileectomy +ileitides +ileitis +ylem +ylems +ileocaecal +ileocaecum +ileocecal +ileocolic +ileocolitis +ileocolostomy +ileocolotomy +ileon +ileosigmoidostomy +ileostomy +ileostomies +ileotomy +ilesite +ileum +ileus +ileuses +ilex +ilexes +ilia +ilya +iliac +iliacus +iliad +iliadic +iliadist +iliadize +iliads +iliahi +ilial +ilian +iliau +ilicaceae +ilicaceous +ilicic +ilicin +ilima +iliocaudal +iliocaudalis +iliococcygeal +iliococcygeus +iliococcygian +iliocostal +iliocostales +iliocostalis +iliodorsal +iliofemoral +iliohypogastric +ilioinguinal +ilioischiac +ilioischiatic +iliolumbar +ilion +iliopectineal +iliopelvic +ilioperoneal +iliopsoas +iliopsoatic +iliopubic +iliosacral +iliosciatic +ilioscrotal +iliospinal +iliotibial +iliotrochanteric +ilysanthes +ilysia +ilysiidae +ilysioid +ilissus +ilium +ilixanthin +ilk +ilka +ilkane +ilks +ill +illabile +illaborate +illachrymable +illachrymableness +illaenus +illamon +illano +illanun +illapsable +illapse +illapsed +illapsing +illapsive +illaqueable +illaqueate +illaqueation +illation +illations +illative +illatively +illatives +illaudable +illaudably +illaudation +illaudatory +illbred +illdisposedness +illecebraceae +illecebration +illecebrous +illeck +illect +illegal +illegalisation +illegalise +illegalised +illegalising +illegality +illegalities +illegalization +illegalize +illegalized +illegalizing +illegally +illegalness +illegibility +illegible +illegibleness +illegibly +illegitimacy +illegitimacies +illegitimate +illegitimated +illegitimately +illegitimateness +illegitimating +illegitimation +illegitimatise +illegitimatised +illegitimatising +illegitimatize +illegitimatized +illegitimatizing +illeism +illeist +iller +illess +illest +illeviable +illfare +illguide +illguided +illguiding +illhumor +illhumored +illy +illiberal +illiberalise +illiberalism +illiberality +illiberalize +illiberalized +illiberalizing +illiberally +illiberalness +illicit +illicitly +illicitness +illicium +illigation +illighten +illimitability +illimitable +illimitableness +illimitably +illimitate +illimitation +illimited +illimitedly +illimitedness +illing +illinition +illinium +illiniums +illinoian +illinois +illinoisan +illinoisian +illipe +illipene +illiquation +illiquid +illiquidity +illiquidly +illyrian +illyric +illish +illision +illite +illiteracy +illiteracies +illiteral +illiterate +illiterately +illiterateness +illiterates +illiterati +illiterature +illites +illitic +illium +illmanneredness +illnature +illness +illnesses +illocal +illocality +illocally +illocution +illogic +illogical +illogicality +illogicalities +illogically +illogicalness +illogician +illogicity +illogics +illoyal +illoyalty +illoricata +illoricate +illoricated +ills +illtempered +illth +illtreatment +illucidate +illucidation +illucidative +illude +illuded +illudedly +illuder +illuding +illume +illumed +illumer +illumes +illuminability +illuminable +illuminance +illuminant +illuminate +illuminated +illuminates +illuminati +illuminating +illuminatingly +illumination +illuminational +illuminations +illuminatism +illuminatist +illuminative +illuminato +illuminator +illuminatory +illuminators +illuminatus +illumine +illumined +illuminee +illuminer +illumines +illuming +illumining +illuminism +illuminist +illuministic +illuminize +illuminometer +illuminous +illumonate +illupi +illure +illurement +illus +illusible +illusion +illusionable +illusional +illusionary +illusioned +illusionism +illusionist +illusionistic +illusionists +illusions +illusive +illusively +illusiveness +illusor +illusory +illusorily +illusoriness +illust +illustrable +illustratable +illustrate +illustrated +illustrates +illustrating +illustration +illustrational +illustrations +illustrative +illustratively +illustrator +illustratory +illustrators +illustratress +illustre +illustricity +illustrious +illustriously +illustriousness +illustrissimo +illustrous +illutate +illutation +illuvia +illuvial +illuviate +illuviated +illuviating +illuviation +illuvium +illuviums +illuvivia +ilmenite +ilmenites +ilmenitite +ilmenorutile +ilocano +ilokano +iloko +ilongot +ilot +ilpirra +ilth +ilvaite +im +ym +ima +image +imageable +imaged +imageless +imagen +imager +imagery +imagerial +imagerially +imageries +images +imagilet +imaginability +imaginable +imaginableness +imaginably +imaginal +imaginant +imaginary +imaginaries +imaginarily +imaginariness +imaginate +imaginated +imaginating +imagination +imaginational +imaginationalism +imaginations +imaginative +imaginatively +imaginativeness +imaginator +imagine +imagined +imaginer +imaginers +imagines +imaging +imagining +imaginings +imaginist +imaginous +imagism +imagisms +imagist +imagistic +imagistically +imagists +imagnableness +imago +imagoes +imam +imamah +imamate +imamates +imambara +imambarah +imambarra +imamic +imams +imamship +iman +imanlaut +imantophyllum +imaret +imarets +imaum +imaumbarah +imaums +imbalance +imbalances +imbalm +imbalmed +imbalmer +imbalmers +imbalming +imbalmment +imbalms +imban +imband +imbannered +imbarge +imbark +imbarkation +imbarked +imbarking +imbarkment +imbarks +imbarn +imbase +imbased +imbastardize +imbat +imbathe +imbauba +imbe +imbecile +imbecilely +imbeciles +imbecilic +imbecilitate +imbecilitated +imbecility +imbecilities +imbed +imbedded +imbedding +imbeds +imbellic +imbellious +imber +imberbe +imbesel +imbibe +imbibed +imbiber +imbibers +imbibes +imbibing +imbibition +imbibitional +imbibitions +imbibitory +imbirussu +imbitter +imbittered +imbitterer +imbittering +imbitterment +imbitters +imblaze +imblazed +imblazes +imblazing +imbody +imbodied +imbodies +imbodying +imbodiment +imbolden +imboldened +imboldening +imboldens +imbolish +imbondo +imbonity +imborder +imbordure +imborsation +imboscata +imbosk +imbosom +imbosomed +imbosoming +imbosoms +imbower +imbowered +imbowering +imbowers +imbracery +imbraceries +imbranch +imbrangle +imbrangled +imbrangling +imbreathe +imbred +imbreviate +imbreviated +imbreviating +imbrex +imbricate +imbricated +imbricately +imbricating +imbrication +imbrications +imbricative +imbrices +imbrier +imbrium +imbrocado +imbroccata +imbroglio +imbroglios +imbroin +imbrown +imbrowned +imbrowning +imbrowns +imbrue +imbrued +imbruement +imbrues +imbruing +imbrute +imbruted +imbrutement +imbrutes +imbruting +imbu +imbue +imbued +imbuement +imbues +imbuia +imbuing +imburse +imbursed +imbursement +imbursing +imbute +ymca +imcnt +imdtly +imelle +imer +imerina +imeritian +imi +imid +imidazol +imidazole +imidazolyl +imide +imides +imidic +imido +imidogen +imids +iminazole +imine +imines +imino +iminohydrin +iminourea +imipramine +imit +imitability +imitable +imitableness +imitancy +imitant +imitate +imitated +imitatee +imitates +imitating +imitation +imitational +imitationist +imitations +imitative +imitatively +imitativeness +imitator +imitators +imitatorship +imitatress +imitatrix +immaculacy +immaculance +immaculate +immaculately +immaculateness +immailed +immalleable +immanacle +immanacled +immanacling +immanation +immane +immanely +immanence +immanency +immaneness +immanent +immanental +immanentism +immanentist +immanentistic +immanently +immanes +immanifest +immanifestness +immanity +immantle +immantled +immantling +immanuel +immarble +immarcescible +immarcescibly +immarcibleness +immarginate +immartial +immask +immatchable +immatchless +immatereality +immaterial +immaterialise +immaterialised +immaterialising +immaterialism +immaterialist +immaterialistic +immateriality +immaterialities +immaterialization +immaterialize +immaterialized +immaterializing +immaterially +immaterialness +immaterials +immateriate +immatriculate +immatriculation +immature +immatured +immaturely +immatureness +immatures +immaturity +immaturities +immeability +immeasurability +immeasurable +immeasurableness +immeasurably +immeasured +immechanical +immechanically +immediacy +immediacies +immedial +immediate +immediately +immediateness +immediatism +immediatist +immediatly +immedicable +immedicableness +immedicably +immelmann +immelodious +immember +immemorable +immemorial +immemorially +immense +immensely +immenseness +immenser +immensest +immensible +immensity +immensities +immensittye +immensive +immensurability +immensurable +immensurableness +immensurate +immerd +immerge +immerged +immergence +immergent +immerges +immerging +immerit +immerited +immeritorious +immeritoriously +immeritous +immerse +immersed +immersement +immerses +immersible +immersing +immersion +immersionism +immersionist +immersions +immersive +immesh +immeshed +immeshes +immeshing +immethodic +immethodical +immethodically +immethodicalness +immethodize +immetrical +immetrically +immetricalness +immeubles +immew +immi +immy +immies +immigrant +immigrants +immigrate +immigrated +immigrates +immigrating +immigration +immigrational +immigrations +immigrator +immigratory +immind +imminence +imminency +imminent +imminently +imminentness +immingle +immingled +immingles +immingling +imminute +imminution +immis +immiscibility +immiscible +immiscibly +immiss +immission +immit +immitigability +immitigable +immitigableness +immitigably +immittance +immitted +immix +immixable +immixed +immixes +immixing +immixt +immixting +immixture +immobile +immobiles +immobilia +immobilisation +immobilise +immobilised +immobilising +immobilism +immobility +immobilities +immobilization +immobilize +immobilized +immobilizer +immobilizes +immobilizing +immoderacy +immoderate +immoderately +immoderateness +immoderation +immodest +immodesty +immodestly +immodish +immodulated +immolate +immolated +immolates +immolating +immolation +immolations +immolator +immoment +immomentous +immonastered +immoral +immoralise +immoralised +immoralising +immoralism +immoralist +immorality +immoralities +immoralize +immoralized +immoralizing +immorally +immorigerous +immorigerousness +immortability +immortable +immortal +immortalisable +immortalisation +immortalise +immortalised +immortaliser +immortalising +immortalism +immortalist +immortality +immortalities +immortalizable +immortalization +immortalize +immortalized +immortalizer +immortalizes +immortalizing +immortally +immortalness +immortals +immortalship +immortelle +immortification +immortified +immote +immotile +immotility +immotioned +immotive +immound +immov +immovability +immovable +immovableness +immovables +immovably +immoveability +immoveable +immoveableness +immoveables +immoveably +immoved +immun +immund +immundicity +immundity +immune +immunes +immunisation +immunise +immunised +immuniser +immunises +immunising +immunist +immunity +immunities +immunization +immunizations +immunize +immunized +immunizer +immunizes +immunizing +immunoassay +immunochemical +immunochemically +immunochemistry +immunodiffusion +immunoelectrophoresis +immunoelectrophoretic +immunoelectrophoretically +immunofluorescence +immunofluorescent +immunogen +immunogenesis +immunogenetic +immunogenetical +immunogenetically +immunogenetics +immunogenic +immunogenically +immunogenicity +immunoglobulin +immunohematology +immunohematologic +immunohematological +immunol +immunology +immunologic +immunological +immunologically +immunologies +immunologist +immunologists +immunopathology +immunopathologic +immunopathological +immunopathologist +immunoreaction +immunoreactive +immunoreactivity +immunosuppressant +immunosuppressants +immunosuppression +immunosuppressive +immunotherapy +immunotherapies +immunotoxin +immuration +immure +immured +immurement +immures +immuring +immusical +immusically +immutability +immutable +immutableness +immutably +immutate +immutation +immute +immutilate +immutual +imogen +imolinda +imonium +imp +impacability +impacable +impack +impackment +impact +impacted +impacter +impacters +impactful +impacting +impaction +impactionize +impactite +impactive +impactment +impactor +impactors +impacts +impactual +impages +impayable +impaint +impainted +impainting +impaints +impair +impairable +impaired +impairer +impairers +impairing +impairment +impairments +impairs +impala +impalace +impalas +impalatable +impale +impaled +impalement +impalements +impaler +impalers +impales +impaling +impall +impallid +impalm +impalmed +impalpability +impalpable +impalpably +impalsy +impaludism +impanate +impanated +impanation +impanator +impane +impanel +impaneled +impaneling +impanelled +impanelling +impanelment +impanels +impapase +impapyrate +impapyrated +impar +imparadise +imparadised +imparadising +imparalleled +imparasitic +impardonable +impardonably +imparidigitate +imparipinnate +imparisyllabic +imparity +imparities +impark +imparkation +imparked +imparking +imparks +imparl +imparlance +imparled +imparling +imparsonee +impart +impartability +impartable +impartance +impartation +imparted +imparter +imparters +impartial +impartialism +impartialist +impartiality +impartially +impartialness +impartibilibly +impartibility +impartible +impartibly +imparticipable +imparting +impartite +impartive +impartivity +impartment +imparts +impassability +impassable +impassableness +impassably +impasse +impasses +impassibilibly +impassibility +impassible +impassibleness +impassibly +impassion +impassionable +impassionate +impassionately +impassioned +impassionedly +impassionedness +impassioning +impassionment +impassive +impassively +impassiveness +impassivity +impastation +impaste +impasted +impastes +impasting +impasto +impastoed +impastos +impasture +impaternate +impatible +impatience +impatiency +impatiens +impatient +impatientaceae +impatientaceous +impatiently +impatientness +impatronize +impave +impavid +impavidity +impavidly +impawn +impawned +impawning +impawns +impeach +impeachability +impeachable +impeachableness +impeached +impeacher +impeachers +impeaches +impeaching +impeachment +impeachments +impearl +impearled +impearling +impearls +impeccability +impeccable +impeccableness +impeccably +impeccance +impeccancy +impeccant +impeccunious +impectinate +impecuniary +impecuniosity +impecunious +impecuniously +impecuniousness +imped +impedance +impedances +impede +impeded +impeder +impeders +impedes +impedibility +impedible +impedient +impediment +impedimenta +impedimental +impedimentary +impediments +impeding +impedingly +impedit +impedite +impedition +impeditive +impedometer +impedor +impeevish +impeyan +impel +impelled +impellent +impeller +impellers +impelling +impellor +impellors +impels +impen +impend +impended +impendence +impendency +impendent +impending +impendingly +impends +impenetrability +impenetrable +impenetrableness +impenetrably +impenetrate +impenetration +impenetrative +impenitence +impenitency +impenitent +impenitently +impenitentness +impenitible +impenitibleness +impennate +impennes +impennous +impent +impeople +imper +imperance +imperant +imperata +imperate +imperation +imperatival +imperativally +imperative +imperatively +imperativeness +imperatives +imperator +imperatory +imperatorial +imperatorially +imperatorian +imperatorin +imperatorious +imperatorship +imperatrice +imperatrix +imperceivable +imperceivableness +imperceivably +imperceived +imperceiverant +imperceptibility +imperceptible +imperceptibleness +imperceptibly +imperception +imperceptive +imperceptiveness +imperceptivity +impercipience +impercipient +imperdible +imperence +imperent +imperf +imperfect +imperfectability +imperfected +imperfectibility +imperfectible +imperfection +imperfections +imperfectious +imperfective +imperfectly +imperfectness +imperfects +imperforable +imperforata +imperforate +imperforated +imperforates +imperforation +imperformable +impery +imperia +imperial +imperialin +imperialine +imperialisation +imperialise +imperialised +imperialising +imperialism +imperialist +imperialistic +imperialistically +imperialists +imperiality +imperialities +imperialization +imperialize +imperialized +imperializing +imperially +imperialness +imperials +imperialty +imperii +imperil +imperiled +imperiling +imperilled +imperilling +imperilment +imperilments +imperils +imperious +imperiously +imperiousness +imperish +imperishability +imperishable +imperishableness +imperishably +imperite +imperium +imperiums +impermanence +impermanency +impermanent +impermanently +impermeability +impermeabilities +impermeabilization +impermeabilize +impermeable +impermeableness +impermeably +impermeated +impermeator +impermissibility +impermissible +impermissibly +impermixt +impermutable +imperperia +impers +imperscriptible +imperscrutable +imperseverant +impersonable +impersonal +impersonalisation +impersonalise +impersonalised +impersonalising +impersonalism +impersonality +impersonalities +impersonalization +impersonalize +impersonalized +impersonalizing +impersonally +impersonate +impersonated +impersonates +impersonating +impersonation +impersonations +impersonative +impersonator +impersonators +impersonatress +impersonatrix +impersonify +impersonification +impersonization +impersonize +imperspicable +imperspicuity +imperspicuous +imperspirability +imperspirable +impersuadability +impersuadable +impersuadableness +impersuasibility +impersuasible +impersuasibleness +impersuasibly +impertinacy +impertinence +impertinences +impertinency +impertinencies +impertinent +impertinently +impertinentness +impertransible +imperturbability +imperturbable +imperturbableness +imperturbably +imperturbation +imperturbed +imperverse +impervertible +impervestigable +imperviability +imperviable +imperviableness +impervial +impervious +imperviously +imperviousness +impest +impestation +impester +impeticos +impetiginous +impetigo +impetigos +impetition +impetrable +impetrate +impetrated +impetrating +impetration +impetrative +impetrator +impetratory +impetre +impetulant +impetulantly +impetuosity +impetuosities +impetuoso +impetuous +impetuously +impetuousness +impeturbability +impetus +impetuses +impf +imphee +imphees +impi +impy +impicture +impierce +impierceable +impies +impiety +impieties +impignorate +impignorated +impignorating +impignoration +imping +impinge +impinged +impingement +impingements +impingence +impingent +impinger +impingers +impinges +impinging +impings +impinguate +impious +impiously +impiousness +impis +impish +impishly +impishness +impiteous +impitiably +implacability +implacable +implacableness +implacably +implacement +implacental +implacentalia +implacentate +implant +implantable +implantation +implanted +implanter +implanting +implants +implastic +implasticity +implate +implausibility +implausibilities +implausible +implausibleness +implausibly +impleach +implead +impleadable +impleaded +impleader +impleading +impleads +impleasing +impledge +impledged +impledges +impledging +implement +implementable +implemental +implementation +implementational +implementations +implemented +implementer +implementers +implementiferous +implementing +implementor +implementors +implements +implete +impletion +impletive +implex +imply +impliability +impliable +impliably +implial +implicant +implicants +implicate +implicated +implicately +implicateness +implicates +implicating +implication +implicational +implications +implicative +implicatively +implicativeness +implicatory +implicit +implicity +implicitly +implicitness +implied +impliedly +impliedness +implies +implying +impling +implode +imploded +implodent +implodes +imploding +implorable +imploration +implorations +implorator +imploratory +implore +implored +implorer +implorers +implores +imploring +imploringly +imploringness +implosion +implosions +implosive +implosively +implume +implumed +implunge +impluvia +impluvium +impocket +impofo +impoison +impoisoner +impolarily +impolarizable +impolder +impolicy +impolicies +impolished +impolite +impolitely +impoliteness +impolitic +impolitical +impolitically +impoliticalness +impoliticly +impoliticness +impollute +imponderabilia +imponderability +imponderable +imponderableness +imponderables +imponderably +imponderous +impone +imponed +imponent +impones +imponing +impoor +impopular +impopularly +imporosity +imporous +import +importability +importable +importableness +importably +importance +importancy +important +importantly +importation +importations +imported +importee +importer +importers +importing +importless +importment +importray +importraiture +imports +importunable +importunacy +importunance +importunate +importunately +importunateness +importunator +importune +importuned +importunely +importunement +importuner +importunes +importuning +importunite +importunity +importunities +imposable +imposableness +imposal +impose +imposed +imposement +imposer +imposers +imposes +imposing +imposingly +imposingness +imposition +impositional +impositions +impositive +impossibilia +impossibilification +impossibilism +impossibilist +impossibilitate +impossibility +impossibilities +impossible +impossibleness +impossibly +impost +imposted +imposter +imposterous +imposters +imposthumate +imposthume +imposting +impostor +impostorism +impostors +impostorship +impostress +impostrix +impostrous +imposts +impostumate +impostumation +impostume +imposture +impostures +impostury +imposturism +imposturous +imposure +impot +impotable +impotence +impotences +impotency +impotencies +impotent +impotently +impotentness +impotents +impotionate +impound +impoundable +impoundage +impounded +impounder +impounding +impoundment +impoundments +impounds +impoverish +impoverished +impoverisher +impoverishes +impoverishing +impoverishment +impower +impowered +impowering +impowers +impracticability +impracticable +impracticableness +impracticably +impractical +impracticality +impracticalities +impractically +impracticalness +imprasa +imprecant +imprecate +imprecated +imprecates +imprecating +imprecation +imprecations +imprecator +imprecatory +imprecatorily +imprecators +imprecise +imprecisely +impreciseness +imprecision +imprecisions +impredicability +impredicable +impreg +impregn +impregnability +impregnable +impregnableness +impregnably +impregnant +impregnate +impregnated +impregnates +impregnating +impregnation +impregnations +impregnative +impregnator +impregnatory +impregned +impregning +impregns +imprejudicate +imprejudice +impremeditate +imprenable +impreparation +impresa +impresari +impresario +impresarios +impresas +imprescience +imprescribable +imprescriptibility +imprescriptible +imprescriptibly +imprese +impreses +impress +impressa +impressable +impressari +impressario +impressed +impressedly +impresser +impressers +impresses +impressibility +impressible +impressibleness +impressibly +impressing +impression +impressionability +impressionable +impressionableness +impressionably +impressional +impressionalist +impressionality +impressionally +impressionary +impressionis +impressionism +impressionist +impressionistic +impressionistically +impressionists +impressionless +impressions +impressive +impressively +impressiveness +impressment +impressments +impressor +impressure +imprest +imprestable +imprested +impresting +imprests +imprevalency +impreventability +impreventable +imprevisibility +imprevisible +imprevision +imprevu +imprimatur +imprimatura +imprimaturs +imprime +impriment +imprimery +imprimis +imprimitive +imprimitivity +imprint +imprinted +imprinter +imprinters +imprinting +imprints +imprison +imprisonable +imprisoned +imprisoner +imprisoning +imprisonment +imprisonments +imprisons +improbability +improbabilities +improbabilize +improbable +improbableness +improbably +improbate +improbation +improbative +improbatory +improbity +improcreant +improcurability +improcurable +improducible +improduction +improficience +improficiency +improfitable +improgressive +improgressively +improgressiveness +improlific +improlificate +improlificical +imprompt +impromptitude +impromptu +impromptuary +impromptuist +improof +improper +improperation +improperly +improperness +impropitious +improportion +impropry +impropriate +impropriated +impropriating +impropriation +impropriator +impropriatrice +impropriatrix +impropriety +improprieties +improprium +improsperity +improsperous +improvability +improvable +improvableness +improvably +improve +improved +improvement +improvements +improver +improvers +improvership +improves +improvided +improvidence +improvident +improvidentially +improvidently +improving +improvingly +improvisate +improvisation +improvisational +improvisations +improvisatize +improvisator +improvisatore +improvisatory +improvisatorial +improvisatorially +improvisatorize +improvisatrice +improvise +improvised +improvisedly +improviser +improvisers +improvises +improvising +improvision +improviso +improvisor +improvisors +improvvisatore +improvvisatori +imprudence +imprudency +imprudent +imprudential +imprudently +imprudentness +imps +impship +impsonite +impuberal +impuberate +impuberty +impubic +impudence +impudency +impudencies +impudent +impudently +impudentness +impudicity +impugn +impugnability +impugnable +impugnation +impugned +impugner +impugners +impugning +impugnment +impugns +impuissance +impuissant +impulse +impulsed +impulses +impulsing +impulsion +impulsions +impulsive +impulsively +impulsiveness +impulsivity +impulsor +impulsory +impunctate +impunctual +impunctuality +impune +impunely +impunible +impunibly +impunity +impunities +impunitive +impuration +impure +impurely +impureness +impurify +impuritan +impuritanism +impurity +impurities +impurple +imput +imputability +imputable +imputableness +imputably +imputation +imputations +imputative +imputatively +imputativeness +impute +imputed +imputedly +imputer +imputers +imputes +imputing +imputrescence +imputrescibility +imputrescible +imputrid +imputting +impv +imshi +imsonic +imu +imvia +in +yn +inability +inabilities +inable +inabordable +inabstinence +inabstracted +inabusively +inaccentuated +inaccentuation +inacceptable +inaccessibility +inaccessible +inaccessibleness +inaccessibly +inaccordance +inaccordancy +inaccordant +inaccordantly +inaccuracy +inaccuracies +inaccurate +inaccurately +inaccurateness +inachid +inachidae +inachoid +inachus +inacquaintance +inacquiescent +inact +inactinic +inaction +inactionist +inactions +inactivate +inactivated +inactivates +inactivating +inactivation +inactivations +inactive +inactively +inactiveness +inactivity +inactivities +inactuate +inactuation +inadaptability +inadaptable +inadaptation +inadaptive +inadept +inadeptly +inadeptness +inadequacy +inadequacies +inadequate +inadequately +inadequateness +inadequation +inadequative +inadequatively +inadherent +inadhesion +inadhesive +inadjustability +inadjustable +inadmissability +inadmissable +inadmissibility +inadmissible +inadmissibly +inadulterate +inadventurous +inadvertant +inadvertantly +inadvertence +inadvertences +inadvertency +inadvertencies +inadvertent +inadvertently +inadvertisement +inadvisability +inadvisable +inadvisableness +inadvisably +inadvisedly +inaesthetic +inaffability +inaffable +inaffably +inaffectation +inaffected +inagglutinability +inagglutinable +inaggressive +inagile +inaidable +inaidible +inaja +inalacrity +inalienability +inalienable +inalienableness +inalienably +inalimental +inalterability +inalterable +inalterableness +inalterably +ynambu +inamia +inamissibility +inamissible +inamissibleness +inamorata +inamoratas +inamorate +inamoration +inamorato +inamoratos +inamour +inamovability +inamovable +inane +inanely +inaneness +inaner +inaners +inanes +inanest +inanga +inangular +inangulate +inanimadvertence +inanimate +inanimated +inanimately +inanimateness +inanimation +inanity +inanities +inanition +inantherate +inapathy +inapostate +inapparent +inapparently +inappealable +inappeasable +inappellability +inappellable +inappendiculate +inapperceptible +inappertinent +inappetence +inappetency +inappetent +inappetible +inapplicability +inapplicable +inapplicableness +inapplicably +inapplication +inapposite +inappositely +inappositeness +inappreciability +inappreciable +inappreciably +inappreciation +inappreciative +inappreciatively +inappreciativeness +inapprehensibility +inapprehensible +inapprehensibly +inapprehension +inapprehensive +inapprehensively +inapprehensiveness +inapproachability +inapproachable +inapproachably +inappropriable +inappropriableness +inappropriate +inappropriately +inappropriateness +inapropos +inapt +inaptitude +inaptly +inaptness +inaquate +inaqueous +inarable +inarch +inarched +inarches +inarching +inarculum +inarguable +inarguably +inark +inarm +inarmed +inarming +inarms +inarticulacy +inarticulata +inarticulate +inarticulated +inarticulately +inarticulateness +inarticulation +inartificial +inartificiality +inartificially +inartificialness +inartistic +inartistical +inartisticality +inartistically +inasmuch +inassimilable +inassimilation +inassuageable +inattackable +inattention +inattentive +inattentively +inattentiveness +inaudibility +inaudible +inaudibleness +inaudibly +inaugur +inaugural +inaugurals +inaugurate +inaugurated +inaugurates +inaugurating +inauguration +inaugurations +inaugurative +inaugurator +inauguratory +inaugurer +inaunter +inaurate +inauration +inauspicate +inauspicious +inauspiciously +inauspiciousness +inauthentic +inauthenticity +inauthoritative +inauthoritativeness +inaxon +inbardge +inbassat +inbbred +inbd +inbe +inbeaming +inbearing +inbeing +inbeings +inbending +inbent +inbetweener +inby +inbye +inbirth +inbits +inblow +inblowing +inblown +inboard +inboards +inbody +inbond +inborn +inbound +inbounds +inbow +inbowed +inbread +inbreak +inbreaking +inbreath +inbreathe +inbreathed +inbreather +inbreathing +inbred +inbreed +inbreeder +inbreeding +inbreeds +inbring +inbringer +inbringing +inbrought +inbuilt +inburning +inburnt +inburst +inbursts +inbush +inc +inca +incage +incaged +incages +incaging +incaic +incalculability +incalculable +incalculableness +incalculably +incalendared +incalescence +incalescency +incalescent +incaliculate +incalver +incalving +incameration +incamp +incan +incandent +incandesce +incandesced +incandescence +incandescency +incandescent +incandescently +incandescing +incanescent +incanous +incant +incantation +incantational +incantations +incantator +incantatory +incanton +incapability +incapabilities +incapable +incapableness +incapably +incapacious +incapaciousness +incapacitant +incapacitate +incapacitated +incapacitates +incapacitating +incapacitation +incapacitator +incapacity +incapacities +incapsulate +incapsulated +incapsulating +incapsulation +incaptivate +incarcerate +incarcerated +incarcerates +incarcerating +incarceration +incarcerations +incarcerative +incarcerator +incarcerators +incardinate +incardinated +incardinating +incardination +incarial +incarmined +incarn +incarnadine +incarnadined +incarnadines +incarnadining +incarnalise +incarnalised +incarnalising +incarnalize +incarnalized +incarnalizing +incarnant +incarnate +incarnated +incarnates +incarnating +incarnation +incarnational +incarnationist +incarnations +incarnative +incarve +incarvillea +incas +incase +incased +incasement +incases +incasing +incask +incast +incastellate +incastellated +incatenate +incatenation +incautelous +incaution +incautious +incautiously +incautiousness +incavate +incavated +incavation +incave +incavern +incavo +incede +incedingly +incelebrity +incend +incendiary +incendiaries +incendiarism +incendiarist +incendiarize +incendiarized +incendious +incendium +incendivity +incensation +incense +incensed +incenseless +incensement +incenser +incenses +incensing +incension +incensive +incensor +incensory +incensories +incensurable +incensurably +incenter +incentive +incentively +incentives +incentor +incentre +incept +incepted +incepting +inception +inceptions +inceptive +inceptively +inceptor +inceptors +incepts +incerate +inceration +incertain +incertainty +incertitude +incessable +incessably +incessancy +incessant +incessantly +incessantness +incession +incest +incests +incestuous +incestuously +incestuousness +incgrporate +inch +inchain +inchamber +inchangeable +inchant +incharitable +incharity +inchase +inchastity +inched +incher +inches +inchest +inching +inchling +inchmeal +inchoacy +inchoant +inchoate +inchoated +inchoately +inchoateness +inchoating +inchoation +inchoative +inchoatively +inchpin +inchurch +inchworm +inchworms +incicurable +incide +incidence +incidency +incident +incidental +incidentalist +incidentally +incidentalness +incidentals +incidentless +incidently +incidents +incienso +incinerable +incinerate +incinerated +incinerates +incinerating +incineration +incinerations +incinerator +incinerators +incipience +incipiency +incipiencies +incipient +incipiently +incipit +incipits +incipitur +incircle +incirclet +incircumscriptible +incircumscription +incircumspect +incircumspection +incircumspectly +incircumspectness +incisal +incise +incised +incisely +incises +incisiform +incising +incision +incisions +incisive +incisively +incisiveness +incisor +incisory +incisorial +incisors +incysted +incisura +incisural +incisure +incisures +incitability +incitable +incitamentum +incitant +incitants +incitate +incitation +incitations +incitative +incite +incited +incitement +incitements +inciter +inciters +incites +inciting +incitingly +incitive +incitory +incitress +incivic +incivil +incivility +incivilities +incivilization +incivilly +incivism +incl +inclamation +inclasp +inclasped +inclasping +inclasps +inclaudent +inclavate +inclave +incle +inclemency +inclemencies +inclement +inclemently +inclementness +inclinable +inclinableness +inclination +inclinational +inclinations +inclinator +inclinatory +inclinatorily +inclinatorium +incline +inclined +incliner +incliners +inclines +inclining +inclinograph +inclinometer +inclip +inclipped +inclipping +inclips +incloister +inclose +inclosed +incloser +inclosers +incloses +inclosing +inclosure +incloude +includable +include +included +includedness +includer +includes +includible +including +inclusa +incluse +inclusion +inclusionist +inclusions +inclusive +inclusively +inclusiveness +inclusory +inclusus +incoached +incoacted +incoagulable +incoalescence +incocted +incoercible +incoexistence +incoffin +incog +incogent +incogitability +incogitable +incogitance +incogitancy +incogitant +incogitantly +incogitative +incognita +incognite +incognitive +incognito +incognitos +incognizability +incognizable +incognizance +incognizant +incognoscent +incognoscibility +incognoscible +incogs +incoherence +incoherences +incoherency +incoherencies +incoherent +incoherentific +incoherently +incoherentness +incohering +incohesion +incohesive +incoincidence +incoincident +incolant +incolumity +incomber +incombining +incombustibility +incombustible +incombustibleness +incombustibly +incombustion +income +incomeless +incomer +incomers +incomes +incoming +incomings +incommend +incommensurability +incommensurable +incommensurableness +incommensurably +incommensurate +incommensurately +incommensurateness +incommiscibility +incommiscible +incommixed +incommodate +incommodation +incommode +incommoded +incommodement +incommodes +incommoding +incommodious +incommodiously +incommodiousness +incommodity +incommodities +incommunicability +incommunicable +incommunicableness +incommunicably +incommunicado +incommunicated +incommunicative +incommunicatively +incommunicativeness +incommutability +incommutable +incommutableness +incommutably +incompact +incompacted +incompactly +incompactness +incomparability +incomparable +incomparableness +incomparably +incompared +incompassion +incompassionate +incompassionately +incompassionateness +incompatibility +incompatibilities +incompatible +incompatibleness +incompatibles +incompatibly +incompendious +incompensated +incompensation +incompentence +incompetence +incompetency +incompetencies +incompetent +incompetently +incompetentness +incompetents +incompetible +incompletability +incompletable +incompletableness +incomplete +incompleted +incompletely +incompleteness +incompletion +incomplex +incompliable +incompliance +incompliancy +incompliancies +incompliant +incompliantly +incomplicate +incomplying +incomportable +incomposed +incomposedly +incomposedness +incomposite +incompossibility +incompossible +incomposure +incomprehended +incomprehending +incomprehendingly +incomprehense +incomprehensibility +incomprehensible +incomprehensibleness +incomprehensibly +incomprehensiblies +incomprehension +incomprehensive +incomprehensively +incomprehensiveness +incompressable +incompressibility +incompressible +incompressibleness +incompressibly +incompt +incomputable +incomputably +inconcealable +inconceivability +inconceivabilities +inconceivable +inconceivableness +inconceivably +inconceptible +inconcernino +inconcievable +inconciliable +inconcinn +inconcinnate +inconcinnately +inconcinnity +inconcinnous +inconcludent +inconcluding +inconclusible +inconclusion +inconclusive +inconclusively +inconclusiveness +inconcoct +inconcocted +inconcoction +inconcrete +inconcurrent +inconcurring +inconcussible +incondensability +incondensable +incondensibility +incondensible +incondite +inconditional +inconditionate +inconditioned +inconducive +inconel +inconfirm +inconfirmed +inconform +inconformable +inconformably +inconformity +inconfused +inconfusedly +inconfusion +inconfutable +inconfutably +incongealable +incongealableness +incongenerous +incongenial +incongeniality +inconglomerate +incongruence +incongruent +incongruently +incongruity +incongruities +incongruous +incongruously +incongruousness +incony +inconjoinable +inconjunct +inconnected +inconnectedness +inconnection +inconnexion +inconnu +inconnus +inconquerable +inconscience +inconscient +inconsciently +inconscionable +inconscious +inconsciously +inconsecutive +inconsecutively +inconsecutiveness +inconsequence +inconsequent +inconsequentia +inconsequential +inconsequentiality +inconsequentially +inconsequently +inconsequentness +inconsiderable +inconsiderableness +inconsiderably +inconsideracy +inconsiderate +inconsiderately +inconsiderateness +inconsideration +inconsidered +inconsistable +inconsistence +inconsistences +inconsistency +inconsistencies +inconsistent +inconsistently +inconsistentness +inconsolability +inconsolable +inconsolableness +inconsolably +inconsolate +inconsolately +inconsonance +inconsonant +inconsonantly +inconspicuous +inconspicuously +inconspicuousness +inconstance +inconstancy +inconstant +inconstantly +inconstantness +inconstruable +inconsultable +inconsumable +inconsumably +inconsumed +inconsummate +inconsumptible +incontaminable +incontaminate +incontaminateness +incontemptible +incontestability +incontestabilities +incontestable +incontestableness +incontestably +incontested +incontiguous +incontinence +incontinency +incontinencies +incontinent +incontinently +incontinuity +incontinuous +incontracted +incontractile +incontraction +incontrollable +incontrollably +incontrolled +incontrovertibility +incontrovertible +incontrovertibleness +incontrovertibly +inconvenience +inconvenienced +inconveniences +inconveniency +inconveniencies +inconveniencing +inconvenient +inconvenienti +inconveniently +inconvenientness +inconversable +inconversant +inconversibility +inconverted +inconvertibility +inconvertibilities +inconvertible +inconvertibleness +inconvertibly +inconvinced +inconvincedly +inconvincibility +inconvincible +inconvincibly +incoordinate +incoordinated +incoordination +incopresentability +incopresentable +incor +incord +incornished +incoronate +incoronated +incoronation +incorp +incorporable +incorporal +incorporality +incorporally +incorporalness +incorporate +incorporated +incorporatedness +incorporates +incorporating +incorporation +incorporations +incorporative +incorporator +incorporators +incorporatorship +incorporeal +incorporealism +incorporealist +incorporeality +incorporealize +incorporeally +incorporealness +incorporeity +incorporeities +incorporeous +incorpse +incorpsed +incorpses +incorpsing +incorr +incorrect +incorrection +incorrectly +incorrectness +incorrespondence +incorrespondency +incorrespondent +incorresponding +incorrigibility +incorrigible +incorrigibleness +incorrigibly +incorrodable +incorrodible +incorrosive +incorrupt +incorrupted +incorruptibility +incorruptibilities +incorruptible +incorruptibleness +incorruptibly +incorruption +incorruptive +incorruptly +incorruptness +incoup +incourse +incourteous +incourteously +incr +incra +incrash +incrassate +incrassated +incrassating +incrassation +incrassative +increasable +increasableness +increase +increased +increasedly +increaseful +increasement +increaser +increasers +increases +increasing +increasingly +increate +increately +increative +incredibility +incredibilities +incredible +incredibleness +incredibly +increditability +increditable +incredited +incredulity +incredulous +incredulously +incredulousness +increep +increeping +incremable +incremate +incremated +incremating +incremation +increment +incremental +incrementalism +incrementalist +incrementally +incrementation +incremented +incrementer +incrementing +increments +increpate +increpation +incrept +increscence +increscent +increst +incretion +incretionary +incretory +incriminate +incriminated +incriminates +incriminating +incrimination +incriminator +incriminatory +incrystal +incrystallizable +incroyable +incross +incrossbred +incrosses +incrossing +incrotchet +incruent +incruental +incruentous +incrust +incrustant +incrustata +incrustate +incrustated +incrustating +incrustation +incrustations +incrustator +incrusted +incrusting +incrustive +incrustment +incrusts +inctirate +inctri +incubate +incubated +incubates +incubating +incubation +incubational +incubations +incubative +incubator +incubatory +incubatorium +incubators +incube +incubee +incubi +incubiture +incubous +incubus +incubuses +incudal +incudate +incudectomy +incudes +incudomalleal +incudostapedial +inculcate +inculcated +inculcates +inculcating +inculcation +inculcative +inculcator +inculcatory +inculk +inculp +inculpability +inculpable +inculpableness +inculpably +inculpate +inculpated +inculpates +inculpating +inculpation +inculpative +inculpatory +incult +incultivated +incultivation +inculture +incumbant +incumbence +incumbency +incumbencies +incumbent +incumbentess +incumbently +incumbents +incumber +incumbered +incumbering +incumberment +incumbers +incumbition +incumbrance +incumbrancer +incumbrances +incunable +incunabula +incunabular +incunabulist +incunabulum +incunabuulum +incuneation +incur +incurability +incurable +incurableness +incurably +incuriosity +incurious +incuriously +incuriousness +incurment +incurrable +incurred +incurrence +incurrent +incurrer +incurring +incurs +incurse +incursion +incursionary +incursionist +incursions +incursive +incurtain +incurvate +incurvated +incurvating +incurvation +incurvature +incurve +incurved +incurves +incurving +incurvity +incurvous +incus +incuse +incused +incuses +incusing +incuss +incut +incute +incutting +ind +indaba +indabas +indaconitin +indaconitine +indagate +indagated +indagates +indagating +indagation +indagative +indagator +indagatory +indamage +indamin +indamine +indamines +indamins +indan +indane +indanthrene +indart +indazin +indazine +indazol +indazole +inde +indear +indebitatus +indebt +indebted +indebtedness +indebting +indebtment +indecence +indecency +indecencies +indecent +indecenter +indecentest +indecently +indecentness +indecidua +indeciduate +indeciduous +indecimable +indecipherability +indecipherable +indecipherableness +indecipherably +indecision +indecisive +indecisively +indecisiveness +indecl +indeclinable +indeclinableness +indeclinably +indecomponible +indecomposable +indecomposableness +indecorous +indecorously +indecorousness +indecorum +indeed +indeedy +indef +indefaceable +indefatigability +indefatigable +indefatigableness +indefatigably +indefeasibility +indefeasible +indefeasibleness +indefeasibly +indefeatable +indefectibility +indefectible +indefectibly +indefective +indefensibility +indefensible +indefensibleness +indefensibly +indefensive +indeficiency +indeficient +indeficiently +indefinability +indefinable +indefinableness +indefinably +indefinite +indefinitely +indefiniteness +indefinity +indefinitive +indefinitively +indefinitiveness +indefinitude +indeflectible +indefluent +indeformable +indehiscence +indehiscent +indelectable +indelegability +indelegable +indeliberate +indeliberately +indeliberateness +indeliberation +indelibility +indelible +indelibleness +indelibly +indelicacy +indelicacies +indelicate +indelicately +indelicateness +indemnify +indemnification +indemnifications +indemnificator +indemnificatory +indemnified +indemnifier +indemnifies +indemnifying +indemnitee +indemnity +indemnities +indemnitor +indemnization +indemoniate +indemonstrability +indemonstrable +indemonstrableness +indemonstrably +indene +indenes +indenize +indent +indentation +indentations +indented +indentedly +indentee +indenter +indenters +indentifiers +indenting +indention +indentions +indentment +indentor +indentors +indents +indenture +indentured +indentures +indentureship +indenturing +indentwise +independable +independence +independency +independencies +independent +independentism +independently +independents +independing +independista +indeposable +indepravate +indeprehensible +indeprivability +indeprivable +inderite +inderivative +indescribability +indescribabilities +indescribable +indescribableness +indescribably +indescript +indescriptive +indesert +indesignate +indesinent +indesirable +indestructibility +indestructible +indestructibleness +indestructibly +indetectable +indeterminable +indeterminableness +indeterminably +indeterminacy +indeterminacies +indeterminancy +indeterminate +indeterminately +indeterminateness +indetermination +indeterminative +indetermined +indeterminism +indeterminist +indeterministic +indevirginate +indevote +indevoted +indevotion +indevotional +indevout +indevoutly +indevoutness +indew +index +indexable +indexation +indexed +indexer +indexers +indexes +indexical +indexically +indexing +indexless +indexlessness +indexterity +indy +india +indiadem +indiademed +indiaman +indian +indiana +indianaite +indianan +indianans +indianapolis +indianeer +indianesque +indianhood +indianian +indianians +indianism +indianist +indianite +indianization +indianize +indians +indiary +indic +indicable +indical +indican +indicans +indicant +indicants +indicanuria +indicatable +indicate +indicated +indicates +indicating +indication +indicational +indications +indicative +indicatively +indicativeness +indicatives +indicator +indicatory +indicatoridae +indicatorinae +indicators +indicatrix +indicavit +indice +indices +indicia +indicial +indicially +indicias +indicible +indicium +indiciums +indico +indicolite +indict +indictability +indictable +indictableness +indictably +indicted +indictee +indictees +indicter +indicters +indicting +indiction +indictional +indictive +indictment +indictments +indictor +indictors +indicts +indidicia +indienne +indies +indiferous +indifference +indifferency +indifferencies +indifferent +indifferential +indifferentiated +indifferentism +indifferentist +indifferentistic +indifferently +indifferentness +indifulvin +indifuscin +indigen +indigena +indigenae +indigenal +indigenate +indigence +indigency +indigene +indigeneity +indigenes +indigenismo +indigenist +indigenity +indigenous +indigenously +indigenousness +indigens +indigent +indigently +indigents +indiges +indigest +indigested +indigestedness +indigestibility +indigestibilty +indigestible +indigestibleness +indigestibly +indigestion +indigestive +indigitamenta +indigitate +indigitation +indigites +indiglucin +indign +indignance +indignancy +indignant +indignantly +indignation +indignatory +indignify +indignified +indignifying +indignity +indignities +indignly +indigo +indigoberry +indigoes +indigofera +indigoferous +indigogen +indigoid +indigoids +indigometer +indigos +indigotate +indigotic +indigotin +indigotindisulphonic +indigotine +indiguria +indihumin +indii +indijbiously +indyl +indilatory +indylic +indiligence +indimensible +indimensional +indiminishable +indimple +indin +indirect +indirected +indirecting +indirection +indirections +indirectly +indirectness +indirects +indirubin +indirubine +indiscernibility +indiscernible +indiscernibleness +indiscernibly +indiscerpible +indiscerptibility +indiscerptible +indiscerptibleness +indiscerptibly +indisciplinable +indiscipline +indisciplined +indiscoverable +indiscoverably +indiscovered +indiscovery +indiscreet +indiscreetly +indiscreetness +indiscrete +indiscretely +indiscretion +indiscretionary +indiscretions +indiscrimanently +indiscriminantly +indiscriminate +indiscriminated +indiscriminately +indiscriminateness +indiscriminating +indiscriminatingly +indiscrimination +indiscriminative +indiscriminatively +indiscriminatory +indiscussable +indiscussed +indiscussible +indish +indispellable +indispensability +indispensabilities +indispensable +indispensableness +indispensably +indispensible +indispersed +indispose +indisposed +indisposedness +indisposing +indisposition +indispositions +indisputability +indisputable +indisputableness +indisputably +indisputed +indissipable +indissociable +indissociably +indissolubility +indissoluble +indissolubleness +indissolubly +indissolute +indissolvability +indissolvable +indissolvableness +indissolvably +indissuadable +indissuadably +indistance +indistant +indistinct +indistinctible +indistinction +indistinctive +indistinctively +indistinctiveness +indistinctly +indistinctness +indistinguishability +indistinguishable +indistinguishableness +indistinguishably +indistinguished +indistinguishing +indistortable +indistributable +indisturbable +indisturbance +indisturbed +inditch +indite +indited +inditement +inditer +inditers +indites +inditing +indium +indiums +indiv +indivertible +indivertibly +individ +individable +individed +individua +individual +individualisation +individualise +individualised +individualiser +individualising +individualism +individualist +individualistic +individualistically +individualists +individuality +individualities +individualization +individualize +individualized +individualizer +individualizes +individualizing +individualizingly +individually +individuals +individuate +individuated +individuates +individuating +individuation +individuative +individuator +individuity +individuous +individuum +individuums +indivinable +indivinity +indivisibility +indivisible +indivisibleness +indivisibly +indivisim +indivision +indn +indochina +indochinese +indocibility +indocible +indocibleness +indocile +indocilely +indocility +indoctrinate +indoctrinated +indoctrinates +indoctrinating +indoctrination +indoctrinations +indoctrinator +indoctrine +indoctrinization +indoctrinize +indoctrinized +indoctrinizing +indogaea +indogaean +indogen +indogenide +indoin +indol +indole +indolence +indolent +indolently +indoles +indolyl +indolin +indoline +indologenous +indology +indologian +indologist +indologue +indoloid +indols +indomable +indomethacin +indomitability +indomitable +indomitableness +indomitably +indone +indonesia +indonesian +indonesians +indoor +indoors +indophenin +indophenol +indophile +indophilism +indophilist +indorsable +indorsation +indorse +indorsed +indorsee +indorsees +indorsement +indorser +indorsers +indorses +indorsing +indorsor +indorsors +indow +indowed +indowing +indows +indoxyl +indoxylic +indoxyls +indoxylsulphuric +indra +indraft +indrafts +indrape +indraught +indrawal +indrawing +indrawn +indrench +indri +indris +indubious +indubiously +indubitability +indubitable +indubitableness +indubitably +indubitate +indubitatively +induc +induce +induceable +induced +inducedly +inducement +inducements +inducer +inducers +induces +induciae +inducibility +inducible +inducing +inducive +induct +inductance +inductances +inducted +inductee +inductees +inducteous +inductile +inductility +inducting +induction +inductional +inductionally +inductionless +inductions +inductive +inductively +inductiveness +inductivity +inductometer +inductophone +inductor +inductory +inductorium +inductors +inductoscope +inductothermy +inductril +inducts +indue +indued +induement +indues +induing +induism +indulge +indulgeable +indulged +indulgement +indulgence +indulgenced +indulgences +indulgency +indulgencies +indulgencing +indulgent +indulgential +indulgentially +indulgently +indulgentness +indulger +indulgers +indulges +indulgiate +indulging +indulgingly +indulin +induline +indulines +indulins +indult +indulto +indults +indument +indumenta +indumentum +indumentums +induna +induplicate +induplication +induplicative +indurable +indurance +indurate +indurated +indurates +indurating +induration +indurations +indurative +indure +indurite +indus +indusia +indusial +indusiate +indusiated +indusiform +indusioid +indusium +industry +industrial +industrialisation +industrialise +industrialised +industrialising +industrialism +industrialist +industrialists +industrialization +industrialize +industrialized +industrializes +industrializing +industrially +industrialness +industrials +industries +industrious +industriously +industriousness +industrys +industrochemical +indutive +induviae +induvial +induviate +indwell +indweller +indwelling +indwellingness +indwells +indwelt +inearth +inearthed +inearthing +inearths +inebriacy +inebriant +inebriate +inebriated +inebriates +inebriating +inebriation +inebriative +inebriety +inebrious +ineconomy +ineconomic +inedibility +inedible +inedita +inedited +ineducabilia +ineducabilian +ineducability +ineducable +ineducation +ineffability +ineffable +ineffableness +ineffably +ineffaceability +ineffaceable +ineffaceably +ineffectible +ineffectibly +ineffective +ineffectively +ineffectiveness +ineffectual +ineffectuality +ineffectually +ineffectualness +ineffervescence +ineffervescent +ineffervescibility +ineffervescible +inefficacy +inefficacious +inefficaciously +inefficaciousness +inefficacity +inefficience +inefficiency +inefficiencies +inefficient +inefficiently +ineffulgent +inegalitarian +ineye +inelaborate +inelaborated +inelaborately +inelastic +inelastically +inelasticate +inelasticity +inelegance +inelegances +inelegancy +inelegancies +inelegant +inelegantly +ineligibility +ineligible +ineligibleness +ineligibles +ineligibly +ineliminable +ineloquence +ineloquent +ineloquently +ineluctability +ineluctable +ineluctably +ineludible +ineludibly +inembryonate +inemendable +inemotivity +inemulous +inenarrability +inenarrable +inenarrably +inenergetic +inenubilable +inenucleable +inept +ineptitude +ineptly +ineptness +inequable +inequal +inequalitarian +inequality +inequalities +inequally +inequalness +inequation +inequiaxial +inequicostate +inequidistant +inequigranular +inequilateral +inequilaterally +inequilibrium +inequilobate +inequilobed +inequipotential +inequipotentiality +inequitable +inequitableness +inequitably +inequitate +inequity +inequities +inequivalent +inequivalve +inequivalved +inequivalvular +ineradicability +ineradicable +ineradicableness +ineradicably +inerasable +inerasableness +inerasably +inerasible +inergetic +ineri +inerm +inermes +inermi +inermia +inermous +inerrability +inerrable +inerrableness +inerrably +inerrancy +inerrant +inerrantly +inerratic +inerring +inerringly +inerroneous +inert +inertance +inertia +inertiae +inertial +inertially +inertias +inertion +inertly +inertness +inerts +inerubescent +inerudite +ineruditely +inerudition +inescapable +inescapableness +inescapably +inescate +inescation +inesculent +inescutcheon +inesite +inessential +inessentiality +inessive +inesthetic +inestimability +inestimable +inestimableness +inestimably +inestivation +inethical +ineunt +ineuphonious +inevadible +inevadibly +inevaporable +inevasible +inevasibleness +inevasibly +inevidence +inevident +inevitability +inevitabilities +inevitable +inevitableness +inevitably +inexact +inexacting +inexactitude +inexactly +inexactness +inexcellence +inexcitability +inexcitable +inexcitableness +inexcitably +inexclusive +inexclusively +inexcommunicable +inexcusability +inexcusable +inexcusableness +inexcusably +inexecrable +inexecutable +inexecution +inexertion +inexhalable +inexhaust +inexhausted +inexhaustedly +inexhaustibility +inexhaustible +inexhaustibleness +inexhaustibly +inexhaustive +inexhaustively +inexhaustless +inexigible +inexist +inexistence +inexistency +inexistent +inexorability +inexorable +inexorableness +inexorably +inexpansible +inexpansive +inexpectable +inexpectance +inexpectancy +inexpectant +inexpectation +inexpected +inexpectedly +inexpectedness +inexpedience +inexpediency +inexpedient +inexpediently +inexpensive +inexpensively +inexpensiveness +inexperience +inexperienced +inexpert +inexpertly +inexpertness +inexperts +inexpiable +inexpiableness +inexpiably +inexpiate +inexplainable +inexpleble +inexplicability +inexplicable +inexplicableness +inexplicables +inexplicably +inexplicit +inexplicitly +inexplicitness +inexplorable +inexplosive +inexportable +inexposable +inexposure +inexpress +inexpressibility +inexpressibilities +inexpressible +inexpressibleness +inexpressibles +inexpressibly +inexpressive +inexpressively +inexpressiveness +inexpugnability +inexpugnable +inexpugnableness +inexpugnably +inexpungeable +inexpungibility +inexpungible +inexsuperable +inextant +inextended +inextensibility +inextensible +inextensile +inextension +inextensional +inextensive +inexterminable +inextinct +inextinguible +inextinguishability +inextinguishable +inextinguishables +inextinguishably +inextinguished +inextirpable +inextirpableness +inextricability +inextricable +inextricableness +inextricably +inez +inf +inface +infair +infall +infallibilism +infallibilist +infallibility +infallible +infallibleness +infallibly +infallid +infalling +infalsificable +infamation +infamatory +infame +infamed +infamy +infamia +infamies +infamiliar +infamiliarity +infamize +infamized +infamizing +infamonize +infamous +infamously +infamousness +infancy +infancies +infand +infandous +infang +infanglement +infangthef +infangthief +infans +infant +infanta +infantado +infantas +infante +infantes +infanthood +infanticidal +infanticide +infanticides +infantile +infantilism +infantility +infantilize +infantine +infantive +infantly +infantlike +infantry +infantries +infantryman +infantrymen +infants +infarce +infarct +infarctate +infarcted +infarction +infarctions +infarcts +infare +infares +infashionable +infatigable +infatuate +infatuated +infatuatedly +infatuatedness +infatuates +infatuating +infatuation +infatuations +infatuator +infauna +infaunae +infaunal +infaunas +infaust +infausting +infeasibility +infeasible +infeasibleness +infect +infectant +infected +infectedness +infecter +infecters +infectible +infecting +infection +infectionist +infections +infectious +infectiously +infectiousness +infective +infectiveness +infectivity +infector +infectors +infectress +infects +infectum +infectuous +infecund +infecundity +infeeble +infeed +infeft +infefting +infeftment +infeijdation +infelicific +infelicity +infelicities +infelicitous +infelicitously +infelicitousness +infelonious +infelt +infeminine +infenible +infeodation +infeof +infeoff +infeoffed +infeoffing +infeoffment +infeoffs +infer +inferable +inferably +inference +inferences +inferent +inferential +inferentialism +inferentialist +inferentially +inferial +inferible +inferior +inferiorism +inferiority +inferiorities +inferiorize +inferiorly +inferiorness +inferiors +infern +infernal +infernalism +infernality +infernalize +infernally +infernalry +infernalship +inferno +infernos +inferoanterior +inferobranch +inferobranchiate +inferofrontal +inferolateral +inferomedian +inferoposterior +inferred +inferrer +inferrers +inferribility +inferrible +inferring +inferringly +infers +infertile +infertilely +infertileness +infertility +infest +infestant +infestation +infestations +infested +infester +infesters +infesting +infestious +infestive +infestivity +infestment +infests +infeudate +infeudation +infibulate +infibulation +inficete +infidel +infidelic +infidelical +infidelism +infidelistic +infidelity +infidelities +infidelize +infidelly +infidels +infield +infielder +infielders +infields +infieldsman +infight +infighter +infighters +infighting +infigured +infile +infill +infilling +infilm +infilter +infiltered +infiltering +infiltrate +infiltrated +infiltrates +infiltrating +infiltration +infiltrations +infiltrative +infiltrator +infiltrators +infima +infimum +infin +infinitant +infinitary +infinitarily +infinitate +infinitated +infinitating +infinitation +infinite +infinitely +infiniteness +infinites +infinitesimal +infinitesimalism +infinitesimality +infinitesimally +infinitesimalness +infinitesimals +infiniteth +infinity +infinities +infinitieth +infinitival +infinitivally +infinitive +infinitively +infinitives +infinitize +infinitized +infinitizing +infinitude +infinitum +infinituple +infirm +infirmable +infirmarer +infirmaress +infirmary +infirmarian +infirmaries +infirmate +infirmation +infirmative +infirmatory +infirmed +infirming +infirmity +infirmities +infirmly +infirmness +infirms +infissile +infit +infitter +infix +infixal +infixation +infixed +infixes +infixing +infixion +infixions +infl +inflamable +inflame +inflamed +inflamedly +inflamedness +inflamer +inflamers +inflames +inflaming +inflamingly +inflammability +inflammabilities +inflammable +inflammableness +inflammably +inflammation +inflammations +inflammative +inflammatory +inflammatorily +inflatable +inflate +inflated +inflatedly +inflatedness +inflater +inflaters +inflates +inflatile +inflating +inflatingly +inflation +inflationary +inflationism +inflationist +inflationists +inflations +inflative +inflator +inflators +inflatus +inflect +inflected +inflectedness +inflecting +inflection +inflectional +inflectionally +inflectionless +inflections +inflective +inflector +inflects +inflesh +inflex +inflexed +inflexibility +inflexible +inflexibleness +inflexibly +inflexion +inflexional +inflexionally +inflexionless +inflexive +inflexure +inflict +inflictable +inflicted +inflicter +inflicting +infliction +inflictions +inflictive +inflictor +inflicts +inflight +inflood +inflooding +inflorescence +inflorescent +inflow +inflowering +inflowing +inflows +influe +influencability +influencable +influence +influenceability +influenceabilities +influenceable +influenced +influencer +influences +influencing +influencive +influent +influential +influentiality +influentially +influentialness +influents +influenza +influenzal +influenzalike +influenzas +influenzic +influx +influxable +influxes +influxible +influxibly +influxion +influxionism +influxious +influxive +info +infold +infolded +infolder +infolders +infolding +infoldment +infolds +infoliate +inforgiveable +inform +informable +informal +informalism +informalist +informality +informalities +informalize +informally +informalness +informant +informants +informatics +information +informational +informative +informatively +informativeness +informatory +informatus +informed +informedly +informer +informers +informidable +informing +informingly +informity +informous +informs +infortiate +infortitude +infortunate +infortunately +infortunateness +infortune +infortunity +infos +infound +infra +infrabasal +infrabestial +infrabranchial +infrabuccal +infracanthal +infracaudal +infracelestial +infracentral +infracephalic +infraclavicle +infraclavicular +infraclusion +infraconscious +infracortical +infracostal +infracostalis +infracotyloid +infract +infracted +infractible +infracting +infraction +infractions +infractor +infracts +infradentary +infradiaphragmatic +infragenual +infraglacial +infraglenoid +infraglottic +infragrant +infragular +infrahyoid +infrahuman +infralabial +infralapsarian +infralapsarianism +infralinear +infralittoral +inframammary +inframammillary +inframandibular +inframarginal +inframaxillary +inframedian +inframercurial +inframercurian +inframolecular +inframontane +inframundane +infranatural +infranaturalism +infranchise +infrangibility +infrangible +infrangibleness +infrangibly +infranodal +infranuclear +infraoccipital +infraocclusion +infraocular +infraoral +infraorbital +infraordinary +infrapapillary +infrapatellar +infraperipherial +infrapose +infraposed +infraposing +infraposition +infraprotein +infrapubian +infraradular +infrared +infrareds +infrarenal +infrarenally +infrarimal +infrascapular +infrascapularis +infrascientific +infrasonic +infrasonics +infraspecific +infraspinal +infraspinate +infraspinatus +infraspinous +infrastapedial +infrasternal +infrastigmatal +infrastipular +infrastructure +infrastructures +infrasutral +infratemporal +infraterrene +infraterritorial +infrathoracic +infratonsillar +infratracheal +infratrochanteric +infratrochlear +infratubal +infraturbinal +infravaginal +infraventral +infree +infrequence +infrequency +infrequent +infrequentcy +infrequently +infrigidate +infrigidation +infrigidative +infringe +infringed +infringement +infringements +infringer +infringers +infringes +infringible +infringing +infructiferous +infructuose +infructuosity +infructuous +infructuously +infrugal +infrunite +infrustrable +infrustrably +infula +infulae +infumate +infumated +infumation +infume +infund +infundibula +infundibular +infundibulata +infundibulate +infundibuliform +infundibulum +infuneral +infuriate +infuriated +infuriatedly +infuriately +infuriates +infuriating +infuriatingly +infuriation +infuscate +infuscated +infuscation +infuse +infused +infusedly +infuser +infusers +infuses +infusibility +infusible +infusibleness +infusile +infusing +infusion +infusionism +infusionist +infusions +infusive +infusory +infusoria +infusorial +infusorian +infusories +infusoriform +infusorioid +infusorium +ing +inga +ingaevones +ingaevonic +ingallantry +ingan +ingang +ingangs +ingannation +ingate +ingates +ingather +ingathered +ingatherer +ingathering +ingathers +ingeldable +ingem +ingeminate +ingeminated +ingeminating +ingemination +ingender +ingene +ingenerability +ingenerable +ingenerably +ingenerate +ingenerated +ingenerately +ingenerating +ingeneration +ingenerative +ingeny +ingeniary +ingeniate +ingenie +ingenier +ingenio +ingeniosity +ingenious +ingeniously +ingeniousness +ingenit +ingenital +ingenite +ingent +ingenu +ingenue +ingenues +ingenuity +ingenuities +ingenuous +ingenuously +ingenuousness +inger +ingerminate +ingest +ingesta +ingestant +ingested +ingester +ingestible +ingesting +ingestion +ingestive +ingests +inghamite +inghilois +ingine +ingirt +ingiver +ingiving +ingle +inglenook +ingles +inglesa +ingleside +inglobate +inglobe +inglobed +inglobing +inglorious +ingloriously +ingloriousness +inglu +inglut +inglutition +ingluvial +ingluvies +ingluviitis +ingluvious +ingnue +ingoing +ingoingness +ingomar +ingorge +ingot +ingoted +ingoting +ingotman +ingotmen +ingots +ingracious +ingraft +ingraftation +ingrafted +ingrafter +ingrafting +ingraftment +ingrafts +ingrain +ingrained +ingrainedly +ingrainedness +ingraining +ingrains +ingram +ingrammaticism +ingramness +ingrandize +ingrapple +ingrate +ingrateful +ingratefully +ingratefulness +ingrately +ingrates +ingratiate +ingratiated +ingratiates +ingratiating +ingratiatingly +ingratiation +ingratiatory +ingratitude +ingrave +ingravescence +ingravescent +ingravidate +ingravidation +ingreat +ingredience +ingredient +ingredients +ingress +ingresses +ingression +ingressive +ingressiveness +ingreve +ingross +ingrossing +ingroup +ingroups +ingrow +ingrowing +ingrown +ingrownness +ingrowth +ingrowths +ingruent +inguen +inguilty +inguinal +inguinoabdominal +inguinocrural +inguinocutaneous +inguinodynia +inguinolabial +inguinoscrotal +inguklimiut +ingulf +ingulfed +ingulfing +ingulfment +ingulfs +ingurgitate +ingurgitated +ingurgitating +ingurgitation +ingush +ingustable +inhabile +inhabit +inhabitability +inhabitable +inhabitance +inhabitancy +inhabitancies +inhabitant +inhabitants +inhabitate +inhabitation +inhabitative +inhabitativeness +inhabited +inhabitedness +inhabiter +inhabiting +inhabitiveness +inhabitress +inhabits +inhalant +inhalants +inhalation +inhalational +inhalations +inhalator +inhalators +inhale +inhaled +inhalement +inhalent +inhaler +inhalers +inhales +inhaling +inhame +inhance +inharmony +inharmonic +inharmonical +inharmonious +inharmoniously +inharmoniousness +inhaul +inhauler +inhaulers +inhauls +inhaust +inhaustion +inhearse +inheaven +inhelde +inhell +inhere +inhered +inherence +inherency +inherencies +inherent +inherently +inheres +inhering +inherit +inheritability +inheritabilities +inheritable +inheritableness +inheritably +inheritage +inheritance +inheritances +inherited +inheriting +inheritor +inheritors +inheritress +inheritresses +inheritrice +inheritrices +inheritrix +inherits +inherle +inhesion +inhesions +inhesive +inhiate +inhibit +inhibitable +inhibited +inhibiter +inhibiting +inhibition +inhibitionist +inhibitions +inhibitive +inhibitor +inhibitory +inhibitors +inhibits +inhive +inhold +inholder +inholding +inhomogeneity +inhomogeneities +inhomogeneous +inhomogeneously +inhonest +inhoop +inhospitable +inhospitableness +inhospitably +inhospitality +inhuman +inhumane +inhumanely +inhumaneness +inhumanism +inhumanity +inhumanities +inhumanize +inhumanly +inhumanness +inhumate +inhumation +inhumationist +inhume +inhumed +inhumer +inhumers +inhumes +inhuming +inhumorous +inhumorously +inia +inial +inyala +inidoneity +inidoneous +inigo +inimaginable +inimicability +inimicable +inimical +inimicality +inimically +inimicalness +inimicitious +inimicous +inimitability +inimitable +inimitableness +inimitably +inimitative +inyoite +inyoke +iniome +iniomi +iniomous +inion +inique +iniquitable +iniquitably +iniquity +iniquities +iniquitous +iniquitously +iniquitousness +iniquous +inirritability +inirritable +inirritably +inirritant +inirritative +inisle +inissuable +init +inital +initial +initialed +initialer +initialing +initialisation +initialise +initialised +initialism +initialist +initialization +initializations +initialize +initialized +initializer +initializers +initializes +initializing +initialled +initialler +initially +initialling +initialness +initials +initiant +initiary +initiate +initiated +initiates +initiating +initiation +initiations +initiative +initiatively +initiatives +initiator +initiatory +initiatorily +initiators +initiatress +initiatrices +initiatrix +initiatrixes +initio +inition +initis +initive +inject +injectable +injectant +injected +injecting +injection +injections +injective +injector +injectors +injects +injelly +injoin +injoint +injucundity +injudicial +injudicially +injudicious +injudiciously +injudiciousness +injun +injunct +injunction +injunctions +injunctive +injunctively +injurable +injure +injured +injuredly +injuredness +injurer +injurers +injures +injury +injuria +injuries +injuring +injurious +injuriously +injuriousness +injust +injustice +injustices +injustifiable +injustly +ink +inkberry +inkberries +inkblot +inkblots +inkbush +inked +inken +inker +inkerman +inkers +inket +inkfish +inkholder +inkhorn +inkhornism +inkhornist +inkhornize +inkhornizer +inkhorns +inky +inkie +inkier +inkies +inkiest +inkindle +inkiness +inkinesses +inking +inkings +inkish +inkle +inkles +inkless +inklike +inkling +inklings +inkmaker +inkmaking +inkman +inknit +inknot +inkos +inkosi +inkpot +inkpots +inkra +inkroot +inks +inkshed +inkslinger +inkslinging +inkstain +inkstand +inkstandish +inkstands +inkster +inkstone +inkweed +inkwell +inkwells +inkwood +inkwoods +inkwriter +inlace +inlaced +inlaces +inlacing +inlagary +inlagation +inlay +inlaid +inlayed +inlayer +inlayers +inlaying +inlaik +inlays +inlake +inland +inlander +inlanders +inlandish +inlands +inlapidate +inlapidatee +inlard +inlaut +inlaw +inlawry +inleague +inleagued +inleaguer +inleaguing +inleak +inleakage +inless +inlet +inlets +inletting +inly +inlier +inliers +inlighten +inlying +inlike +inline +inlook +inlooker +inlooking +inmate +inmates +inmeat +inmeats +inmesh +inmeshed +inmeshes +inmeshing +inmew +inmigrant +inmixture +inmore +inmost +inmprovidence +inn +innage +innards +innascibility +innascible +innate +innately +innateness +innatism +innative +innatural +innaturality +innaturally +innavigable +inne +inned +inneity +inner +innerly +innermore +innermost +innermostly +innerness +inners +innersole +innerspring +innervate +innervated +innervates +innervating +innervation +innervational +innervations +innerve +innerved +innerves +innerving +inness +innest +innet +innholder +innyard +inning +innings +inninmorite +innisfail +innitency +innkeeper +innkeepers +innless +innobedient +innocence +innocency +innocencies +innocent +innocenter +innocentest +innocently +innocentness +innocents +innocuity +innoculate +innoculated +innoculating +innoculation +innocuous +innocuously +innocuousness +innodate +innominability +innominable +innominables +innominata +innominate +innominatum +innomine +innovant +innovate +innovated +innovates +innovating +innovation +innovational +innovationist +innovations +innovative +innovatively +innovativeness +innovator +innovatory +innovators +innoxious +innoxiously +innoxiousness +inns +innuate +innubilous +innuendo +innuendoed +innuendoes +innuendoing +innuendos +innuit +innumerability +innumerable +innumerableness +innumerably +innumerate +innumerous +innutrient +innutrition +innutritious +innutritiousness +innutritive +ino +inobedience +inobedient +inobediently +inoblast +inobnoxious +inobscurable +inobservable +inobservance +inobservancy +inobservant +inobservantly +inobservantness +inobservation +inobtainable +inobtrusive +inobtrusively +inobtrusiveness +inobvious +inocarpin +inocarpus +inoccupation +inoceramus +inochondritis +inochondroma +inocystoma +inocyte +inocula +inoculability +inoculable +inoculant +inocular +inoculate +inoculated +inoculates +inoculating +inoculation +inoculations +inoculative +inoculativity +inoculator +inoculum +inoculums +inodes +inodiate +inodorate +inodorous +inodorously +inodorousness +inoepithelioma +inoffending +inoffensive +inoffensively +inoffensiveness +inofficial +inofficially +inofficiosity +inofficious +inofficiously +inofficiousness +inogen +inogenesis +inogenic +inogenous +inoglia +inohymenitic +inolith +inoma +inominous +inomyoma +inomyositis +inomyxoma +inone +inoneuroma +inoperability +inoperable +inoperation +inoperational +inoperative +inoperativeness +inopercular +inoperculata +inoperculate +inopinable +inopinate +inopinately +inopine +inopportune +inopportunely +inopportuneness +inopportunism +inopportunist +inopportunity +inoppressive +inoppugnable +inopulent +inorb +inorderly +inordinacy +inordinance +inordinancy +inordinary +inordinate +inordinately +inordinateness +inordination +inorg +inorganic +inorganical +inorganically +inorganity +inorganizable +inorganization +inorganized +inoriginate +inornate +inornateness +inorthography +inosclerosis +inoscopy +inosculate +inosculated +inosculating +inosculation +inosic +inosilicate +inosin +inosine +inosinic +inosite +inosites +inositol +inositols +inostensible +inostensibly +inotropic +inower +inoxidability +inoxidable +inoxidizable +inoxidize +inoxidized +inoxidizing +inpayment +inparabola +inpardonable +inparfit +inpatient +inpatients +inpensioner +inphase +inphases +inpolygon +inpolyhedron +inponderable +inport +inpour +inpoured +inpouring +inpours +inpush +input +inputfile +inputs +inputted +inputting +inqilab +inquaintance +inquartation +inquest +inquests +inquestual +inquiet +inquietation +inquieted +inquieting +inquietly +inquietness +inquiets +inquietude +inquietudes +inquilinae +inquiline +inquilinism +inquilinity +inquilinous +inquinate +inquinated +inquinating +inquination +inquirable +inquirance +inquirant +inquiration +inquire +inquired +inquirendo +inquirent +inquirer +inquirers +inquires +inquiry +inquiries +inquiring +inquiringly +inquisible +inquisit +inquisite +inquisition +inquisitional +inquisitionist +inquisitions +inquisitive +inquisitively +inquisitiveness +inquisitor +inquisitory +inquisitorial +inquisitorially +inquisitorialness +inquisitorious +inquisitors +inquisitorship +inquisitress +inquisitrix +inquisiturient +inracinate +inradii +inradius +inradiuses +inrail +inreality +inregister +inrigged +inrigger +inrighted +inring +inro +inroad +inroader +inroads +inrol +inroll +inrolling +inrooted +inrub +inrun +inrunning +inruption +inrush +inrushes +inrushing +ins +insabbatist +insack +insafety +insagacity +insalivate +insalivated +insalivating +insalivation +insalubrious +insalubriously +insalubriousness +insalubrity +insalubrities +insalutary +insalvability +insalvable +insame +insanable +insane +insanely +insaneness +insaner +insanest +insaniate +insanie +insanify +insanitary +insanitariness +insanitation +insanity +insanities +insapiency +insapient +insapory +insatiability +insatiable +insatiableness +insatiably +insatiate +insatiated +insatiately +insatiateness +insatiety +insatisfaction +insatisfactorily +insaturable +inscape +inscenation +inscibile +inscience +inscient +inscious +insconce +inscribable +inscribableness +inscribe +inscribed +inscriber +inscribers +inscribes +inscribing +inscript +inscriptible +inscription +inscriptional +inscriptioned +inscriptionist +inscriptionless +inscriptions +inscriptive +inscriptively +inscriptured +inscroll +inscrolled +inscrolling +inscrolls +inscrutability +inscrutable +inscrutableness +inscrutables +inscrutably +insculp +insculped +insculping +insculps +insculpture +insculptured +inscutcheon +insea +inseam +inseamer +inseams +insearch +insecable +insect +insecta +insectan +insectary +insectaria +insectaries +insectarium +insectariums +insectation +insectean +insected +insecticidal +insecticidally +insecticide +insecticides +insectiferous +insectiform +insectifuge +insectile +insectine +insection +insectival +insectivora +insectivore +insectivory +insectivorous +insectlike +insectmonger +insectologer +insectology +insectologist +insectproof +insects +insecure +insecurely +insecureness +insecurity +insecurities +insecution +insee +inseeing +inseer +inselberg +inselberge +inseminate +inseminated +inseminates +inseminating +insemination +inseminations +inseminator +inseminators +insenescible +insensate +insensately +insensateness +insense +insensed +insensibility +insensibilities +insensibilization +insensibilize +insensibilizer +insensible +insensibleness +insensibly +insensing +insensitive +insensitively +insensitiveness +insensitivity +insensitivities +insensuous +insentience +insentiency +insentient +insep +inseparability +inseparable +inseparableness +inseparables +inseparably +inseparate +inseparately +insequent +insert +insertable +inserted +inserter +inserters +inserting +insertion +insertional +insertions +insertive +inserts +inserve +inserviceable +inservient +insession +insessor +insessores +insessorial +inset +insets +insetted +insetter +insetters +insetting +inseverable +inseverably +inshade +inshave +insheath +insheathe +insheathed +insheathing +insheaths +inshell +inshining +inship +inshoe +inshoot +inshore +inshrine +inshrined +inshrines +inshrining +inside +insident +insider +insiders +insides +insidiate +insidiation +insidiator +insidiosity +insidious +insidiously +insidiousness +insight +insighted +insightful +insightfully +insights +insigne +insignes +insignia +insignias +insignificance +insignificancy +insignificancies +insignificant +insignificantly +insignificative +insignisigne +insignment +insimplicity +insimulate +insincere +insincerely +insincerity +insincerities +insinew +insinking +insinuant +insinuate +insinuated +insinuates +insinuating +insinuatingly +insinuation +insinuations +insinuative +insinuatively +insinuativeness +insinuator +insinuatory +insinuators +insinuendo +insipid +insipidity +insipidities +insipidly +insipidness +insipience +insipient +insipiently +insist +insisted +insistence +insistency +insistencies +insistent +insistently +insister +insisters +insisting +insistingly +insistive +insists +insisture +insistuvree +insite +insitiency +insition +insititious +insnare +insnared +insnarement +insnarer +insnarers +insnares +insnaring +insobriety +insociability +insociable +insociableness +insociably +insocial +insocially +insociate +insofar +insol +insolate +insolated +insolates +insolating +insolation +insole +insolence +insolency +insolent +insolently +insolentness +insolents +insoles +insolid +insolidity +insolite +insolubility +insolubilities +insolubilization +insolubilize +insolubilized +insolubilizing +insoluble +insolubleness +insolubly +insolvability +insolvable +insolvably +insolvence +insolvency +insolvencies +insolvent +insomnia +insomniac +insomniacs +insomnias +insomnious +insomnolence +insomnolency +insomnolent +insomnolently +insomuch +insonorous +insooth +insorb +insorbent +insordid +insouciance +insouciant +insouciantly +insoul +insouled +insouling +insouls +insp +inspake +inspan +inspanned +inspanning +inspans +inspeak +inspeaking +inspect +inspectability +inspectable +inspected +inspecting +inspectingly +inspection +inspectional +inspectioneer +inspections +inspective +inspector +inspectoral +inspectorate +inspectorial +inspectors +inspectorship +inspectress +inspectrix +inspects +insperge +insperse +inspeximus +inspheration +insphere +insphered +inspheres +insphering +inspinne +inspirability +inspirable +inspirant +inspirate +inspiration +inspirational +inspirationalism +inspirationally +inspirationist +inspirations +inspirative +inspirator +inspiratory +inspiratrix +inspire +inspired +inspiredly +inspirer +inspirers +inspires +inspiring +inspiringly +inspirit +inspirited +inspiriter +inspiriting +inspiritingly +inspiritment +inspirits +inspirometer +inspissant +inspissate +inspissated +inspissating +inspissation +inspissator +inspissosis +inspoke +inspoken +inspreith +inst +instability +instabilities +instable +instal +install +installant +installation +installations +installed +installer +installers +installing +installment +installments +installs +instalment +instals +instamp +instance +instanced +instances +instancy +instancies +instancing +instanding +instant +instantaneity +instantaneous +instantaneously +instantaneousness +instanter +instantial +instantiate +instantiated +instantiates +instantiating +instantiation +instantiations +instantly +instantness +instants +instar +instarred +instarring +instars +instate +instated +instatement +instates +instating +instaurate +instauration +instaurator +instead +instealing +insteam +insteep +instellatinn +instellation +instep +insteps +instigant +instigate +instigated +instigates +instigating +instigatingly +instigation +instigative +instigator +instigators +instigatrix +instil +instyle +instill +instillation +instillator +instillatory +instilled +instiller +instillers +instilling +instillment +instills +instilment +instils +instimulate +instinct +instinction +instinctive +instinctively +instinctiveness +instinctivist +instinctivity +instincts +instinctual +instinctually +instipulate +institor +institory +institorial +institorian +institue +institute +instituted +instituter +instituters +institutes +instituting +institution +institutional +institutionalisation +institutionalise +institutionalised +institutionalising +institutionalism +institutionalist +institutionalists +institutionality +institutionalization +institutionalize +institutionalized +institutionalizes +institutionalizing +institutionally +institutionary +institutionize +institutions +institutive +institutively +institutor +institutors +institutress +institutrix +instonement +instop +instore +instr +instratified +instreaming +instrengthen +instressed +instroke +instrokes +instruct +instructable +instructed +instructedly +instructedness +instructer +instructible +instructing +instruction +instructional +instructionary +instructions +instructive +instructively +instructiveness +instructor +instructorial +instructorless +instructors +instructorship +instructorships +instructress +instructs +instrument +instrumental +instrumentalism +instrumentalist +instrumentalists +instrumentality +instrumentalities +instrumentalize +instrumentally +instrumentals +instrumentary +instrumentate +instrumentation +instrumentations +instrumentative +instrumented +instrumenting +instrumentist +instrumentman +instruments +insuavity +insubduable +insubjection +insubmergible +insubmersible +insubmission +insubmissive +insubordinate +insubordinately +insubordinateness +insubordination +insubstantial +insubstantiality +insubstantialize +insubstantially +insubstantiate +insubstantiation +insubvertible +insuccate +insuccation +insuccess +insuccessful +insucken +insue +insuetude +insufferable +insufferableness +insufferably +insufficience +insufficiency +insufficiencies +insufficient +insufficiently +insufficientness +insufflate +insufflated +insufflating +insufflation +insufflator +insuitable +insula +insulae +insulance +insulant +insulants +insular +insulary +insularism +insularity +insularize +insularized +insularizing +insularly +insulars +insulate +insulated +insulates +insulating +insulation +insulations +insulator +insulators +insulin +insulinase +insulination +insulinize +insulinized +insulinizing +insulins +insulize +insulphured +insulse +insulsity +insult +insultable +insultant +insultation +insulted +insulter +insulters +insulting +insultingly +insultment +insultproof +insults +insume +insunk +insuper +insuperability +insuperable +insuperableness +insuperably +insupportable +insupportableness +insupportably +insupposable +insuppressibility +insuppressible +insuppressibly +insuppressive +insurability +insurable +insurance +insurant +insurants +insure +insured +insureds +insuree +insurer +insurers +insures +insurge +insurgence +insurgences +insurgency +insurgencies +insurgent +insurgentism +insurgently +insurgents +insurgescence +insuring +insurmountability +insurmountable +insurmountableness +insurmountably +insurpassable +insurrect +insurrection +insurrectional +insurrectionally +insurrectionary +insurrectionaries +insurrectionise +insurrectionised +insurrectionising +insurrectionism +insurrectionist +insurrectionists +insurrectionize +insurrectionized +insurrectionizing +insurrections +insurrecto +insurrectory +insusceptibility +insusceptibilities +insusceptible +insusceptibly +insusceptive +insuspect +insusurration +inswamp +inswarming +inswathe +inswathed +inswathement +inswathes +inswathing +insweeping +inswell +inswept +inswing +inswinger +int +inta +intablature +intabulate +intact +intactible +intactile +intactly +intactness +intagli +intagliated +intagliation +intaglio +intaglioed +intaglioing +intaglios +intagliotype +intail +intake +intaker +intakes +intaminated +intangibility +intangibilities +intangible +intangibleness +intangibles +intangibly +intangle +intaria +intarissable +intarsa +intarsas +intarsia +intarsias +intarsiate +intarsist +intastable +intaxable +intebred +intebreeding +intechnicality +integer +integers +integrability +integrable +integral +integrality +integralization +integralize +integrally +integrals +integrand +integrant +integraph +integrate +integrated +integrates +integrating +integration +integrationist +integrations +integrative +integrator +integrifolious +integrious +integriously +integripallial +integripalliate +integrity +integrities +integrodifferential +integropallial +integropallialia +integropalliata +integropalliate +integumation +integument +integumental +integumentary +integumentation +integuments +inteind +intel +intellect +intellectation +intellected +intellectible +intellection +intellective +intellectively +intellects +intellectual +intellectualisation +intellectualise +intellectualised +intellectualiser +intellectualising +intellectualism +intellectualist +intellectualistic +intellectualistically +intellectuality +intellectualities +intellectualization +intellectualizations +intellectualize +intellectualized +intellectualizer +intellectualizes +intellectualizing +intellectually +intellectualness +intellectuals +intelligence +intelligenced +intelligencer +intelligences +intelligency +intelligencing +intelligent +intelligential +intelligentiary +intelligently +intelligentsia +intelligibility +intelligibilities +intelligible +intelligibleness +intelligibly +intelligize +intelsat +intemerate +intemerately +intemerateness +intemeration +intemperable +intemperably +intemperament +intemperance +intemperances +intemperancy +intemperant +intemperate +intemperately +intemperateness +intemperature +intemperies +intempestive +intempestively +intempestivity +intemporal +intemporally +intenability +intenable +intenancy +intend +intendance +intendancy +intendancies +intendant +intendantism +intendantship +intended +intendedly +intendedness +intendeds +intendence +intendency +intendencia +intendencies +intendente +intender +intenders +intendible +intendiment +intending +intendingly +intendit +intendment +intends +intenerate +intenerated +intenerating +inteneration +intenible +intens +intensate +intensation +intensative +intense +intensely +intenseness +intenser +intensest +intensify +intensification +intensifications +intensified +intensifier +intensifiers +intensifies +intensifying +intension +intensional +intensionally +intensity +intensities +intensitive +intensitometer +intensive +intensively +intensiveness +intensivenyess +intensives +intent +intentation +intented +intention +intentional +intentionalism +intentionality +intentionally +intentioned +intentionless +intentions +intentive +intentively +intentiveness +intently +intentness +intents +inter +interabang +interabsorption +interacademic +interacademically +interaccessory +interaccuse +interaccused +interaccusing +interacinar +interacinous +interacra +interact +interactant +interacted +interacting +interaction +interactional +interactionism +interactionist +interactions +interactive +interactively +interactivity +interacts +interadaptation +interadaption +interadditive +interadventual +interaffiliate +interaffiliated +interaffiliation +interagency +interagencies +interagent +interagglutinate +interagglutinated +interagglutinating +interagglutination +interagree +interagreed +interagreeing +interagreement +interalar +interall +interally +interalliance +interallied +interalveolar +interambulacra +interambulacral +interambulacrum +interamnian +interangular +interanimate +interanimated +interanimating +interannular +interantagonism +interantennal +interantennary +interapophysal +interapophyseal +interapplication +interarboration +interarch +interarcualis +interarytenoid +interarmy +interarrival +interarticular +interartistic +interassociate +interassociated +interassociation +interassure +interassured +interassuring +interasteroidal +interastral +interatomic +interatrial +interattrition +interaulic +interaural +interauricular +interavailability +interavailable +interaxal +interaxes +interaxial +interaxillary +interaxis +interbalance +interbalanced +interbalancing +interbanded +interbank +interbanking +interbastate +interbbred +interbed +interbedded +interbelligerent +interblend +interblended +interblending +interblent +interblock +interbody +interbonding +interborough +interbourse +interbrachial +interbrain +interbranch +interbranchial +interbreath +interbred +interbreed +interbreeding +interbreeds +interbrigade +interbring +interbronchial +interbrood +intercadence +intercadent +intercalar +intercalare +intercalary +intercalarily +intercalarium +intercalate +intercalated +intercalates +intercalating +intercalation +intercalations +intercalative +intercalatory +intercale +intercalm +intercanal +intercanalicular +intercapillary +intercardinal +intercarotid +intercarpal +intercarpellary +intercarrier +intercartilaginous +intercaste +intercatenated +intercausative +intercavernous +intercede +interceded +intercedent +interceder +intercedes +interceding +intercellular +intercellularly +intercensal +intercentra +intercentral +intercentrum +intercept +interceptable +intercepted +intercepter +intercepting +interception +interceptions +interceptive +interceptor +interceptors +interceptress +intercepts +intercerebral +intercess +intercession +intercessional +intercessionary +intercessionate +intercessionment +intercessions +intercessive +intercessor +intercessory +intercessorial +intercessors +interchaff +interchain +interchange +interchangeability +interchangeable +interchangeableness +interchangeably +interchanged +interchangement +interchanger +interchanges +interchanging +interchangings +interchannel +interchapter +intercharge +intercharged +intercharging +interchase +interchased +interchasing +intercheck +interchoke +interchoked +interchoking +interchondral +interchurch +intercident +intercidona +interciliary +intercilium +intercipient +intercircle +intercircled +intercircling +intercirculate +intercirculated +intercirculating +intercirculation +intercision +intercystic +intercity +intercitizenship +intercivic +intercivilization +interclash +interclasp +interclass +interclavicle +interclavicular +interclerical +interclose +intercloud +interclub +interclude +interclusion +intercoastal +intercoccygeal +intercoccygean +intercohesion +intercollege +intercollegian +intercollegiate +intercolline +intercolonial +intercolonially +intercolonization +intercolonize +intercolonized +intercolonizing +intercolumn +intercolumnal +intercolumnar +intercolumnation +intercolumniation +intercom +intercombat +intercombination +intercombine +intercombined +intercombining +intercome +intercommission +intercommissural +intercommon +intercommonable +intercommonage +intercommoned +intercommoner +intercommoning +intercommunal +intercommune +intercommuned +intercommuner +intercommunicability +intercommunicable +intercommunicate +intercommunicated +intercommunicates +intercommunicating +intercommunication +intercommunicational +intercommunications +intercommunicative +intercommunicator +intercommuning +intercommunion +intercommunional +intercommunity +intercommunities +intercompany +intercomparable +intercompare +intercompared +intercomparing +intercomparison +intercomplexity +intercomplimentary +intercoms +interconal +interconciliary +intercondenser +intercondylar +intercondylic +intercondyloid +interconfessional +interconfound +interconnect +interconnected +interconnectedness +interconnecting +interconnection +interconnections +interconnects +interconnexion +interconsonantal +intercontinental +intercontorted +intercontradiction +intercontradictory +interconversion +interconvert +interconvertibility +interconvertible +interconvertibly +intercooler +intercooling +intercoracoid +intercorporate +intercorpuscular +intercorrelate +intercorrelated +intercorrelating +intercorrelation +intercorrelations +intercortical +intercosmic +intercosmically +intercostal +intercostally +intercostobrachial +intercostohumeral +intercotylar +intercounty +intercouple +intercoupled +intercoupling +intercourse +intercoxal +intercranial +intercreate +intercreated +intercreating +intercreedal +intercrescence +intercrinal +intercrystalline +intercrystallization +intercrystallize +intercrop +intercropped +intercropping +intercross +intercrossed +intercrossing +intercrural +intercrust +intercultural +interculturally +interculture +intercupola +intercur +intercurl +intercurrence +intercurrent +intercurrently +intercursation +intercuspidal +intercut +intercutaneous +intercuts +intercutting +interdash +interdata +interdeal +interdealer +interdebate +interdebated +interdebating +interdenominational +interdenominationalism +interdental +interdentally +interdentil +interdepartmental +interdepartmentally +interdepend +interdependability +interdependable +interdependence +interdependency +interdependencies +interdependent +interdependently +interderivative +interdespise +interdestructive +interdestructively +interdestructiveness +interdetermination +interdetermine +interdetermined +interdetermining +interdevour +interdict +interdicted +interdicting +interdiction +interdictions +interdictive +interdictor +interdictory +interdicts +interdictum +interdifferentiate +interdifferentiated +interdifferentiating +interdifferentiation +interdiffuse +interdiffused +interdiffusiness +interdiffusing +interdiffusion +interdiffusive +interdiffusiveness +interdigital +interdigitally +interdigitate +interdigitated +interdigitating +interdigitation +interdine +interdiscal +interdisciplinary +interdispensation +interdistinguish +interdistrict +interdivision +interdome +interdorsal +interdrink +intereat +interelectrode +interelectrodic +interembrace +interembraced +interembracing +interempire +interemption +interenjoy +interentangle +interentangled +interentanglement +interentangling +interepidemic +interepimeral +interepithelial +interequinoctial +interess +interesse +interessee +interessor +interest +interested +interestedly +interestedness +interester +interesterification +interesting +interestingly +interestingness +interestless +interests +interestuarine +interexchange +interface +interfaced +interfacer +interfaces +interfacial +interfacing +interfactional +interfaith +interfamily +interfascicular +interfault +interfector +interfederation +interfemoral +interfenestral +interfenestration +interferant +interfere +interfered +interference +interferences +interferent +interferential +interferer +interferers +interferes +interfering +interferingly +interferingness +interferogram +interferometer +interferometers +interferometry +interferometric +interferometrically +interferometries +interferon +interferric +interfertile +interfertility +interfibrillar +interfibrillary +interfibrous +interfilamentar +interfilamentary +interfilamentous +interfilar +interfile +interfiled +interfiles +interfiling +interfilling +interfiltrate +interfiltrated +interfiltrating +interfiltration +interfinger +interfirm +interflange +interflashing +interflow +interfluence +interfluent +interfluminal +interfluous +interfluve +interfluvial +interflux +interfold +interfoliaceous +interfoliar +interfoliate +interfollicular +interforce +interframe +interfraternal +interfraternally +interfraternity +interfret +interfretted +interfriction +interfrontal +interfruitful +interfulgent +interfuse +interfused +interfusing +interfusion +intergalactic +interganglionic +intergatory +intergenerant +intergenerating +intergeneration +intergenerational +intergenerative +intergeneric +intergential +intergesture +intergilt +intergyral +interglacial +interglandular +interglyph +interglobular +intergonial +intergossip +intergossiped +intergossiping +intergossipped +intergossipping +intergovernmental +intergradation +intergradational +intergrade +intergraded +intergradient +intergrading +intergraft +intergranular +intergrapple +intergrappled +intergrappling +intergrave +intergroup +intergroupal +intergrow +intergrown +intergrowth +intergular +interhabitation +interhaemal +interhemal +interhemispheric +interhyal +interhybridize +interhybridized +interhybridizing +interhostile +interhuman +interieur +interim +interimist +interimistic +interimistical +interimistically +interimperial +interims +interincorporation +interindependence +interindicate +interindicated +interindicating +interindividual +interinfluence +interinfluenced +interinfluencing +interinhibition +interinhibitive +interinsert +interinsular +interinsurance +interinsurer +interinvolve +interinvolved +interinvolving +interionic +interior +interiorism +interiorist +interiority +interiorization +interiorize +interiorized +interiorizes +interiorizing +interiorly +interiorness +interiors +interirrigation +interisland +interj +interjacence +interjacency +interjacent +interjaculate +interjaculateded +interjaculating +interjaculatory +interjangle +interjealousy +interject +interjected +interjecting +interjection +interjectional +interjectionalise +interjectionalised +interjectionalising +interjectionalize +interjectionalized +interjectionalizing +interjectionally +interjectionary +interjectionize +interjections +interjectiveness +interjector +interjectory +interjectorily +interjectors +interjects +interjectural +interjoin +interjoinder +interjoist +interjudgment +interjugal +interjugular +interjunction +interkinesis +interkinetic +interknit +interknitted +interknitting +interknot +interknotted +interknotting +interknow +interknowledge +interlabial +interlaboratory +interlace +interlaced +interlacedly +interlacement +interlacer +interlacery +interlaces +interlacing +interlacustrine +interlay +interlaid +interlayer +interlayering +interlaying +interlain +interlays +interlake +interlamellar +interlamellation +interlaminar +interlaminate +interlaminated +interlaminating +interlamination +interlanguage +interlap +interlapped +interlapping +interlaps +interlapse +interlard +interlardation +interlarded +interlarding +interlardment +interlards +interlatitudinal +interlaudation +interleaf +interleague +interleave +interleaved +interleaver +interleaves +interleaving +interlibel +interlibeled +interlibelling +interlibrary +interlie +interligamentary +interligamentous +interlight +interlying +interlimitation +interline +interlineal +interlineally +interlinear +interlineary +interlinearily +interlinearly +interlineate +interlineated +interlineating +interlineation +interlineations +interlined +interlinement +interliner +interlines +interlingua +interlingual +interlinguist +interlinguistic +interlining +interlink +interlinkage +interlinked +interlinking +interlinks +interlisp +interloan +interlobar +interlobate +interlobular +interlocal +interlocally +interlocate +interlocated +interlocating +interlocation +interlock +interlocked +interlocker +interlocking +interlocks +interlocular +interloculli +interloculus +interlocus +interlocution +interlocutive +interlocutor +interlocutory +interlocutorily +interlocutors +interlocutress +interlocutresses +interlocutrice +interlocutrices +interlocutrix +interloli +interloop +interlope +interloped +interloper +interlopers +interlopes +interloping +interlot +interlotted +interlotting +interlucate +interlucation +interlucent +interlude +interluder +interludes +interludial +interluency +interlunar +interlunary +interlunation +intermachine +intermalar +intermalleolar +intermammary +intermammillary +intermandibular +intermanorial +intermarginal +intermarine +intermarry +intermarriage +intermarriageable +intermarriages +intermarried +intermarries +intermarrying +intermason +intermastoid +intermat +intermatch +intermatted +intermatting +intermaxilla +intermaxillar +intermaxillary +intermaze +intermazed +intermazing +intermean +intermeasurable +intermeasure +intermeasured +intermeasuring +intermeddle +intermeddled +intermeddlement +intermeddler +intermeddlesome +intermeddlesomeness +intermeddling +intermeddlingly +intermede +intermedia +intermediacy +intermediae +intermedial +intermediary +intermediaries +intermediate +intermediated +intermediately +intermediateness +intermediates +intermediating +intermediation +intermediator +intermediatory +intermedin +intermedious +intermedium +intermedius +intermeet +intermeeting +intermell +intermelt +intermembral +intermembranous +intermeningeal +intermenstrual +intermenstruum +interment +intermental +intermention +interments +intermercurial +intermesenterial +intermesenteric +intermesh +intermeshed +intermeshes +intermeshing +intermessage +intermessenger +intermet +intermetacarpal +intermetallic +intermetameric +intermetatarsal +intermew +intermewed +intermewer +intermezzi +intermezzo +intermezzos +intermiddle +intermigrate +intermigrated +intermigrating +intermigration +interminability +interminable +interminableness +interminably +interminant +interminate +interminated +intermination +intermine +intermined +intermingle +intermingled +intermingledom +interminglement +intermingles +intermingling +intermining +interminister +interministerial +interministerium +intermise +intermission +intermissions +intermissive +intermit +intermits +intermitted +intermittedly +intermittence +intermittency +intermittencies +intermittent +intermittently +intermitter +intermitting +intermittingly +intermittor +intermix +intermixable +intermixed +intermixedly +intermixes +intermixing +intermixt +intermixtly +intermixture +intermixtures +intermmet +intermobility +intermodification +intermodillion +intermodulation +intermodule +intermolar +intermolecular +intermolecularly +intermomentary +intermontane +intermorainic +intermotion +intermountain +intermundane +intermundial +intermundian +intermundium +intermunicipal +intermunicipality +intermural +intermure +intermuscular +intermuscularity +intermuscularly +intermutation +intermutual +intermutually +intermutule +intern +internal +internality +internalities +internalization +internalize +internalized +internalizes +internalizing +internally +internalness +internals +internarial +internasal +internat +internation +international +internationale +internationalisation +internationalise +internationalised +internationalising +internationalism +internationalist +internationalists +internationality +internationalization +internationalizations +internationalize +internationalized +internationalizes +internationalizing +internationally +internationals +internatl +interne +interneciary +internecinal +internecine +internecion +internecive +internect +internection +interned +internee +internees +internegative +internes +internescine +interneship +internet +internetted +internetwork +internetworking +internetworks +interneural +interneuron +interneuronal +interneuronic +internidal +interning +internist +internists +internity +internment +internments +internobasal +internodal +internode +internodes +internodia +internodial +internodian +internodium +internodular +interns +internship +internships +internuclear +internunce +internuncial +internuncially +internunciary +internunciatory +internunciess +internuncio +internuncios +internuncioship +internuncius +internuptial +internuptials +interobjective +interoceanic +interoceptive +interoceptor +interocular +interoffice +interolivary +interopercle +interopercular +interoperculum +interoptic +interorbital +interorbitally +interoscillate +interoscillated +interoscillating +interosculant +interosculate +interosculated +interosculating +interosculation +interosseal +interossei +interosseous +interosseus +interownership +interpage +interpalatine +interpale +interpalpebral +interpapillary +interparenchymal +interparental +interparenthetic +interparenthetical +interparenthetically +interparietal +interparietale +interparliament +interparliamentary +interparoxysmal +interparty +interpass +interpause +interpave +interpaved +interpaving +interpeal +interpectoral +interpeduncular +interpel +interpellant +interpellate +interpellated +interpellating +interpellation +interpellator +interpelled +interpelling +interpendent +interpenetrable +interpenetrant +interpenetrate +interpenetrated +interpenetrating +interpenetration +interpenetrative +interpenetratively +interpermeate +interpermeated +interpermeating +interpersonal +interpersonally +interpervade +interpervaded +interpervading +interpervasive +interpervasively +interpervasiveness +interpetaloid +interpetalous +interpetiolar +interpetiolary +interphalangeal +interphase +interphone +interphones +interpiece +interpilaster +interpilastering +interplace +interplacental +interplay +interplaying +interplays +interplait +interplanetary +interplant +interplanting +interplea +interplead +interpleaded +interpleader +interpleading +interpleads +interpled +interpledge +interpledged +interpledging +interpleural +interplical +interplicate +interplication +interplight +interpoint +interpol +interpolable +interpolant +interpolar +interpolary +interpolate +interpolated +interpolater +interpolates +interpolating +interpolation +interpolations +interpolative +interpolatively +interpolator +interpolatory +interpolators +interpole +interpolymer +interpolish +interpolity +interpolitical +interpollinate +interpollinated +interpollinating +interpone +interportal +interposable +interposal +interpose +interposed +interposer +interposers +interposes +interposing +interposingly +interposition +interpositions +interposure +interpour +interppled +interppoliesh +interprater +interpressure +interpret +interpretability +interpretable +interpretableness +interpretably +interpretament +interpretate +interpretation +interpretational +interpretations +interpretative +interpretatively +interpreted +interpreter +interpreters +interpretership +interpreting +interpretive +interpretively +interpretorial +interpretress +interprets +interprismatic +interprocess +interproduce +interproduced +interproducing +interprofessional +interprofessionally +interproglottidal +interproportional +interprotoplasmic +interprovincial +interproximal +interproximate +interpterygoid +interpubic +interpulmonary +interpunct +interpunction +interpunctuate +interpunctuation +interpupillary +interquarrel +interquarreled +interquarreling +interquarter +interrace +interracial +interracialism +interradial +interradially +interradiate +interradiated +interradiating +interradiation +interradii +interradium +interradius +interrailway +interramal +interramicorn +interramification +interran +interreact +interreceive +interreceived +interreceiving +interrecord +interred +interreflect +interreflection +interregal +interregency +interregent +interreges +interregimental +interregional +interregionally +interregna +interregnal +interregnum +interregnums +interreign +interrelate +interrelated +interrelatedly +interrelatedness +interrelates +interrelating +interrelation +interrelations +interrelationship +interrelationships +interreligious +interreligiously +interrena +interrenal +interrenalism +interrepellent +interrepulsion +interrer +interresist +interresistance +interresistibility +interresponsibility +interresponsible +interresponsive +interreticular +interreticulation +interrex +interrhyme +interrhymed +interrhyming +interright +interring +interriven +interroad +interrobang +interrog +interrogability +interrogable +interrogant +interrogate +interrogated +interrogatedness +interrogatee +interrogates +interrogating +interrogatingly +interrogation +interrogational +interrogations +interrogative +interrogatively +interrogator +interrogatory +interrogatories +interrogatorily +interrogators +interrogatrix +interrogee +interroom +interrule +interruled +interruling +interrun +interrunning +interrupt +interruptable +interrupted +interruptedly +interruptedness +interrupter +interrupters +interruptible +interrupting +interruptingly +interruption +interruptions +interruptive +interruptively +interruptor +interruptory +interrupts +inters +intersale +intersalute +intersaluted +intersaluting +interscapilium +interscapular +interscapulum +interscendent +interscene +interscholastic +interschool +interscience +interscribe +interscribed +interscribing +interscription +interseaboard +interseam +interseamed +intersecant +intersect +intersectant +intersected +intersecting +intersection +intersectional +intersections +intersector +intersects +intersegmental +interseminal +interseminate +interseminated +interseminating +intersentimental +interseptal +interseptum +intersert +intersertal +interservice +intersesamoid +intersession +intersessional +intersessions +interset +intersetting +intersex +intersexes +intersexual +intersexualism +intersexuality +intersexualities +intersexually +intershade +intershaded +intershading +intershifting +intershock +intershoot +intershooting +intershop +intershot +intersidereal +intersystem +intersystematic +intersystematical +intersystematically +intersituate +intersituated +intersituating +intersocial +intersocietal +intersociety +intersoil +intersole +intersoled +intersoling +intersolubility +intersoluble +intersomnial +intersomnious +intersonant +intersow +interspace +interspaced +interspacing +interspatial +interspatially +interspeaker +interspecial +interspecies +interspecific +interspeech +interspersal +intersperse +interspersed +interspersedly +intersperses +interspersing +interspersion +interspersions +interspheral +intersphere +interspicular +interspinal +interspinalis +interspinous +interspiral +interspiration +interspire +intersporal +intersprinkle +intersprinkled +intersprinkling +intersqueeze +intersqueezed +intersqueezing +intersshot +interstade +interstadial +interstage +interstaminal +interstapedial +interstate +interstates +interstation +interstellar +interstellary +intersterile +intersterility +intersternal +interstice +intersticed +interstices +intersticial +interstimulate +interstimulated +interstimulating +interstimulation +interstinctive +interstitial +interstitially +interstition +interstitious +interstitium +interstratify +interstratification +interstratified +interstratifying +interstreak +interstream +interstreet +interstrial +interstriation +interstrive +interstriven +interstriving +interstrove +interstructure +intersubjective +intersubjectively +intersubjectivity +intersubsistence +intersubstitution +intersuperciliary +intersusceptation +intertalk +intertangle +intertangled +intertanglement +intertangles +intertangling +intertarsal +intertask +interteam +intertear +intertentacular +intertergal +interterminal +interterritorial +intertessellation +intertestamental +intertex +intertexture +interthing +interthread +interthreaded +interthreading +interthronging +intertidal +intertidally +intertie +intertied +intertieing +interties +intertill +intertillage +intertinge +intertinged +intertinging +intertype +intertissue +intertissued +intertoll +intertone +intertongue +intertonic +intertouch +intertown +intertrabecular +intertrace +intertraced +intertracing +intertrade +intertraded +intertrading +intertraffic +intertrafficked +intertrafficking +intertragian +intertransformability +intertransformable +intertransmissible +intertransmission +intertranspicuous +intertransversal +intertransversalis +intertransversary +intertransverse +intertrappean +intertree +intertribal +intertriginous +intertriglyph +intertrigo +intertrinitarian +intertrochanteric +intertrochlear +intertropic +intertropical +intertropics +intertrude +intertuberal +intertubercular +intertubular +intertwin +intertwine +intertwined +intertwinement +intertwinements +intertwines +intertwining +intertwiningly +intertwist +intertwisted +intertwisting +intertwistingly +interungular +interungulate +interunion +interuniversity +interurban +interureteric +intervaginal +interval +intervale +intervaled +intervalic +intervaling +intervalled +intervalley +intervallic +intervalling +intervallum +intervalometer +intervals +intervalvular +intervary +intervariation +intervaried +intervarietal +intervarying +intervarsity +intervascular +intervein +interveinal +interveined +interveining +interveinous +intervenant +intervene +intervened +intervener +interveners +intervenes +intervenience +interveniency +intervenient +intervening +intervenium +intervenor +intervent +intervention +interventional +interventionism +interventionist +interventionists +interventions +interventive +interventor +interventral +interventralia +interventricular +intervenue +intervenular +interverbal +interversion +intervert +intervertebra +intervertebral +intervertebrally +interverting +intervesicular +interview +interviewable +interviewed +interviewee +interviewees +interviewer +interviewers +interviewing +interviews +intervillous +intervisibility +intervisible +intervisit +intervisitation +intervital +intervocal +intervocalic +intervocalically +intervolute +intervolution +intervolve +intervolved +intervolving +interwar +interwarred +interwarring +interweave +interweaved +interweavement +interweaver +interweaves +interweaving +interweavingly +interwed +interweld +interwhiff +interwhile +interwhistle +interwhistled +interwhistling +interwind +interwinded +interwinding +interwish +interword +interwork +interworked +interworking +interworks +interworld +interworry +interwound +interwove +interwoven +interwovenly +interwrap +interwrapped +interwrapping +interwreathe +interwreathed +interwreathing +interwrought +interwwrought +interxylary +interzygapophysial +interzonal +interzone +interzooecial +intestable +intestacy +intestacies +intestate +intestation +intestinal +intestinally +intestine +intestineness +intestines +intestiniform +intestinovesical +intexine +intext +intextine +intexture +inthral +inthrall +inthralled +inthralling +inthrallment +inthralls +inthralment +inthrals +inthrone +inthroned +inthrones +inthrong +inthroning +inthronistic +inthronizate +inthronization +inthronize +inthrow +inthrust +intially +intice +intil +intill +intima +intimacy +intimacies +intimado +intimados +intimae +intimal +intimas +intimate +intimated +intimately +intimateness +intimater +intimaters +intimates +intimating +intimation +intimations +intime +intimidate +intimidated +intimidates +intimidating +intimidation +intimidations +intimidator +intimidatory +intimidity +intimism +intimist +intimiste +intimity +intimous +intinct +intinction +intinctivity +intine +intines +intire +intisy +intitle +intitled +intitles +intitling +intitulation +intitule +intituled +intitules +intituling +intl +intnl +into +intoed +intolerability +intolerable +intolerableness +intolerably +intolerance +intolerancy +intolerant +intolerantly +intolerantness +intolerated +intolerating +intoleration +intollerably +intomb +intombed +intombing +intombment +intombs +intonable +intonaci +intonaco +intonacos +intonate +intonated +intonates +intonating +intonation +intonational +intonations +intonator +intone +intoned +intonement +intoner +intoners +intones +intoning +intoothed +intorsion +intort +intorted +intortillage +intorting +intortion +intorts +intortus +intourist +intower +intown +intoxation +intoxicable +intoxicant +intoxicantly +intoxicants +intoxicate +intoxicated +intoxicatedly +intoxicatedness +intoxicates +intoxicating +intoxicatingly +intoxication +intoxications +intoxicative +intoxicatively +intoxicator +intoxicators +intr +intra +intraabdominal +intraarterial +intraarterially +intrabiontic +intrabranchial +intrabred +intrabronchial +intrabuccal +intracalicular +intracanalicular +intracanonical +intracapsular +intracardiac +intracardial +intracardially +intracarpal +intracarpellary +intracartilaginous +intracellular +intracellularly +intracephalic +intracerebellar +intracerebral +intracerebrally +intracervical +intrachordal +intracistern +intracystic +intracity +intraclitelline +intracloacal +intracoastal +intracoelomic +intracolic +intracollegiate +intracommunication +intracompany +intracontinental +intracorporeal +intracorpuscular +intracortical +intracosmic +intracosmical +intracosmically +intracostal +intracranial +intracranially +intractability +intractable +intractableness +intractably +intractile +intracutaneous +intracutaneously +intrada +intradepartment +intradepartmental +intradermal +intradermally +intradermic +intradermically +intradermo +intradistrict +intradivisional +intrado +intrados +intradoses +intradoss +intraduodenal +intradural +intraecclesiastical +intraepiphyseal +intraepithelial +intrafactory +intrafascicular +intrafissural +intrafistular +intrafoliaceous +intraformational +intrafusal +intragalactic +intragantes +intragastric +intragemmal +intragyral +intraglacial +intraglandular +intraglobular +intragroup +intragroupal +intrahepatic +intrahyoid +intrail +intraimperial +intrait +intrajugular +intralamellar +intralaryngeal +intralaryngeally +intraleukocytic +intraligamentary +intraligamentous +intraliminal +intraline +intralingual +intralobar +intralobular +intralocular +intralogical +intralumbar +intramachine +intramammary +intramarginal +intramastoid +intramatrical +intramatrically +intramedullary +intramembranous +intrameningeal +intramental +intrametropolitan +intramyocardial +intramolecular +intramolecularly +intramontane +intramorainic +intramundane +intramural +intramuralism +intramurally +intramuscular +intramuscularly +intranarial +intranasal +intranatal +intranational +intraneous +intranet +intranetwork +intraneural +intranidal +intranquil +intranquillity +intrans +intranscalency +intranscalent +intransferable +intransferrable +intransformable +intransfusible +intransgressible +intransient +intransigeance +intransigeancy +intransigeant +intransigeantly +intransigence +intransigency +intransigent +intransigentism +intransigentist +intransigently +intransigents +intransitable +intransitive +intransitively +intransitiveness +intransitives +intransitivity +intransitu +intranslatable +intransmissible +intransmutability +intransmutable +intransparency +intransparent +intrant +intrants +intranuclear +intraoctave +intraocular +intraoffice +intraoral +intraorbital +intraorganization +intraossal +intraosseous +intraosteal +intraovarian +intrap +intrapair +intraparenchymatous +intraparietal +intraparochial +intraparty +intrapelvic +intrapericardiac +intrapericardial +intraperineal +intraperiosteal +intraperitoneal +intraperitoneally +intrapersonal +intrapetiolar +intraphilosophic +intrapial +intrapyretic +intraplacental +intraplant +intrapleural +intrapolar +intrapontine +intrapopulation +intraprocess +intraprocessor +intraprostatic +intraprotoplasmic +intrapsychic +intrapsychical +intrapsychically +intrapulmonary +intrarachidian +intrarectal +intrarelation +intrarenal +intraretinal +intrarhachidian +intraschool +intrascrotal +intrasegmental +intraselection +intrasellar +intraseminal +intraseptal +intraserous +intrashop +intrasynovial +intraspecies +intraspecific +intraspecifically +intraspinal +intraspinally +intrastate +intrastromal +intrasusception +intratarsal +intrate +intratelluric +intraterritorial +intratesticular +intrathecal +intrathyroid +intrathoracic +intratympanic +intratomic +intratonsillar +intratrabecular +intratracheal +intratracheally +intratropical +intratubal +intratubular +intrauterine +intravaginal +intravalvular +intravasation +intravascular +intravascularly +intravenous +intravenously +intraventricular +intraverbal +intraversable +intravertebral +intravertebrally +intravesical +intravital +intravitally +intravitam +intravitelline +intravitreous +intraxylary +intrazonal +intreasure +intreat +intreatable +intreated +intreating +intreats +intrench +intrenchant +intrenched +intrencher +intrenches +intrenching +intrenchment +intrepid +intrepidity +intrepidly +intrepidness +intricable +intricacy +intricacies +intricate +intricately +intricateness +intrication +intrigant +intrigante +intrigantes +intrigants +intrigaunt +intrigo +intriguant +intriguante +intrigue +intrigued +intrigueproof +intriguer +intriguery +intriguers +intrigues +intriguess +intriguing +intriguingly +intrince +intrine +intrinse +intrinsic +intrinsical +intrinsicality +intrinsically +intrinsicalness +intrinsicate +intro +introactive +introceptive +introconversion +introconvertibility +introconvertible +introd +introdden +introduce +introduced +introducee +introducement +introducer +introducers +introduces +introducible +introducing +introduct +introduction +introductions +introductive +introductively +introductor +introductory +introductorily +introductoriness +introductress +introfaction +introfy +introfied +introfier +introfies +introfying +introflex +introflexion +introgressant +introgression +introgressive +introinflection +introit +introits +introitus +introject +introjection +introjective +intromissibility +intromissible +intromission +intromissive +intromit +intromits +intromitted +intromittence +intromittent +intromitter +intromitting +intropression +intropulsive +intropunitive +introreception +introrsal +introrse +introrsely +intros +introscope +introsensible +introsentient +introspect +introspectable +introspected +introspectible +introspecting +introspection +introspectional +introspectionism +introspectionist +introspectionistic +introspections +introspective +introspectively +introspectiveness +introspectivism +introspectivist +introspector +introsuction +introsume +introsuscept +introsusception +introthoracic +introtraction +introvenient +introverse +introversibility +introversible +introversion +introversions +introversive +introversively +introvert +introverted +introvertedness +introverting +introvertive +introverts +introvision +introvolution +intrudance +intrude +intruded +intruder +intruders +intrudes +intruding +intrudingly +intrudress +intrunk +intrus +intruse +intrusion +intrusional +intrusionism +intrusionist +intrusions +intrusive +intrusively +intrusiveness +intruso +intrust +intrusted +intrusting +intrusts +intsv +intubate +intubated +intubates +intubating +intubation +intubationist +intubator +intubatting +intube +intue +intuent +intuicity +intuit +intuitable +intuited +intuiting +intuition +intuitional +intuitionalism +intuitionalist +intuitionally +intuitionism +intuitionist +intuitionistic +intuitionless +intuitions +intuitive +intuitively +intuitiveness +intuitivism +intuitivist +intuito +intuits +intumesce +intumesced +intumescence +intumescent +intumescing +intumulate +intune +inturbidate +inturgescence +inturn +inturned +inturning +inturns +intuse +intussuscept +intussusception +intussusceptive +intwine +intwined +intwinement +intwines +intwining +intwist +intwisted +intwisting +intwists +inukshuk +inula +inulaceous +inulase +inulases +inulin +inulins +inuloid +inumbrate +inumbration +inunct +inunction +inunctum +inunctuosity +inunctuous +inundable +inundant +inundate +inundated +inundates +inundating +inundation +inundations +inundator +inundatory +inunderstandable +inunderstanding +inurbane +inurbanely +inurbaneness +inurbanity +inure +inured +inuredness +inurement +inurements +inures +inuring +inurn +inurned +inurning +inurnment +inurns +inusitate +inusitateness +inusitation +inust +inustion +inutile +inutilely +inutility +inutilities +inutilized +inutterable +inv +invaccinate +invaccination +invadable +invade +invaded +invader +invaders +invades +invading +invaginable +invaginate +invaginated +invaginating +invagination +invalescence +invaletudinary +invalid +invalidate +invalidated +invalidates +invalidating +invalidation +invalidations +invalidator +invalidcy +invalided +invalidhood +invaliding +invalidish +invalidism +invalidity +invalidities +invalidly +invalidness +invalids +invalidship +invalorous +invaluable +invaluableness +invaluably +invalued +invar +invariability +invariable +invariableness +invariably +invariance +invariancy +invariant +invariantive +invariantively +invariantly +invariants +invaried +invars +invasion +invasionary +invasionist +invasions +invasive +invasiveness +invecked +invect +invected +invection +invective +invectively +invectiveness +invectives +invectivist +invector +inveigh +inveighed +inveigher +inveighing +inveighs +inveigle +inveigled +inveiglement +inveigler +inveiglers +inveigles +inveigling +inveil +invein +invendibility +invendible +invendibleness +inveneme +invenient +invenit +invent +inventable +inventary +invented +inventer +inventers +inventful +inventibility +inventible +inventibleness +inventing +invention +inventional +inventionless +inventions +inventive +inventively +inventiveness +inventor +inventory +inventoriable +inventorial +inventorially +inventoried +inventories +inventorying +inventors +inventress +inventresses +invents +inventurous +inveracious +inveracity +inveracities +inverebrate +inverisimilitude +inverity +inverities +inverminate +invermination +invernacular +inverness +invernesses +inversable +inversatile +inverse +inversed +inversedly +inversely +inverses +inversing +inversion +inversionist +inversions +inversive +inversor +invert +invertant +invertase +invertebracy +invertebral +invertebrata +invertebrate +invertebrated +invertebrateness +invertebrates +inverted +invertedly +invertend +inverter +inverters +invertibility +invertible +invertile +invertin +inverting +invertive +invertor +invertors +inverts +invest +investable +invested +investible +investient +investigable +investigatable +investigate +investigated +investigates +investigating +investigatingly +investigation +investigational +investigations +investigative +investigator +investigatory +investigatorial +investigators +investing +investion +investitive +investitor +investiture +investitures +investment +investments +investor +investors +invests +investure +inveteracy +inveterate +inveterately +inveterateness +inveteration +inviability +inviabilities +inviable +inviably +invict +invicted +invictive +invidia +invidious +invidiously +invidiousness +invigilance +invigilancy +invigilate +invigilated +invigilating +invigilation +invigilator +invigor +invigorant +invigorate +invigorated +invigorates +invigorating +invigoratingly +invigoratingness +invigoration +invigorations +invigorative +invigoratively +invigorator +invigour +invile +invillage +invinate +invination +invincibility +invincible +invincibleness +invincibly +inviolability +inviolable +inviolableness +inviolably +inviolacy +inviolate +inviolated +inviolately +inviolateness +invious +inviousness +invirile +invirility +invirtuate +inviscate +inviscation +inviscerate +inviscid +inviscidity +invised +invisibility +invisible +invisibleness +invisibly +invision +invitable +invital +invitant +invitation +invitational +invitations +invitatory +invite +invited +invitee +invitees +invitement +inviter +inviters +invites +invitiate +inviting +invitingly +invitingness +invitress +invitrifiable +invivid +invocable +invocant +invocate +invocated +invocates +invocating +invocation +invocational +invocations +invocative +invocator +invocatory +invoy +invoice +invoiced +invoices +invoicing +invoke +invoked +invoker +invokers +invokes +invoking +involatile +involatility +involucel +involucelate +involucelated +involucellate +involucellated +involucra +involucral +involucrate +involucre +involucred +involucres +involucriform +involucrum +involuntary +involuntarily +involuntariness +involute +involuted +involutedly +involutely +involutes +involuting +involution +involutional +involutionary +involutions +involutory +involutorial +involve +involved +involvedly +involvedness +involvement +involvements +involvent +involver +involvers +involves +involving +invt +invulgar +invulnerability +invulnerable +invulnerableness +invulnerably +invulnerate +invultuation +invultvation +inwale +inwall +inwalled +inwalling +inwalls +inwandering +inward +inwardly +inwardness +inwards +inweave +inweaved +inweaves +inweaving +inwedged +inweed +inweight +inwheel +inwick +inwind +inwinding +inwinds +inwit +inwith +inwood +inwork +inworks +inworn +inwound +inwove +inwoven +inwrap +inwrapment +inwrapped +inwrapping +inwraps +inwrapt +inwreathe +inwreathed +inwreathing +inwrit +inwritten +inwrought +io +yo +yob +yobbo +yobboes +yobbos +yobi +yobs +yocco +yochel +yock +yocked +yockel +yockernut +yocking +yocks +iocs +yod +iodal +iodamoeba +iodate +iodated +iodates +iodating +iodation +iodations +iode +yode +yodel +yodeled +yodeler +yodelers +yodeling +yodelist +yodelled +yodeller +yodellers +yodelling +yodels +yodh +iodhydrate +iodhydric +iodhydrin +yodhs +iodic +iodid +iodide +iodides +iodids +iodiferous +iodimetry +iodimetric +iodin +iodinate +iodinated +iodinates +iodinating +iodination +iodine +iodines +iodinium +iodinophil +iodinophile +iodinophilic +iodinophilous +iodins +iodyrite +iodisation +iodism +iodisms +iodite +iodization +iodize +iodized +iodizer +iodizers +iodizes +iodizing +yodle +yodled +yodler +yodlers +yodles +yodling +iodo +iodobehenate +iodobenzene +iodobromite +iodocasein +iodochlorid +iodochloride +iodochromate +iodocresol +iododerma +iodoethane +iodoform +iodoforms +iodogallicin +iodohydrate +iodohydric +iodohydrin +iodol +iodols +iodomercurate +iodomercuriate +iodomethane +iodometry +iodometric +iodometrical +iodometrically +iodonium +iodophor +iodophors +iodoprotein +iodopsin +iodopsins +iodoso +iodosobenzene +iodospongin +iodotannic +iodotherapy +iodothyrin +iodous +iodoxy +iodoxybenzene +yods +yoe +iof +yoga +yogas +yogasana +yogee +yogeeism +yogees +yogh +yoghourt +yoghourts +yoghs +yoghurt +yoghurts +yogi +yogic +yogin +yogini +yoginis +yogins +yogis +yogism +yogist +yogoite +yogurt +yogurts +yohimbe +yohimbenine +yohimbi +yohimbin +yohimbine +yohimbinization +yohimbinize +yoho +yohourt +yoi +yoy +yoick +yoicks +yoyo +yojan +yojana +yojuane +yok +yokage +yoke +yokeable +yokeableness +yokeage +yoked +yokefellow +yokel +yokeldom +yokeless +yokelish +yokelism +yokelry +yokels +yokemate +yokemates +yokemating +yoker +yokes +yokewise +yokewood +yoky +yoking +yokohama +yokozuna +yokozunas +yoks +yokuts +yolden +yoldia +yoldring +iolite +iolites +yolk +yolked +yolky +yolkier +yolkiest +yolkiness +yolkless +yolks +yom +yomer +yomim +yomin +yomud +ion +yon +yoncopin +yond +yonder +yondmost +yondward +ione +ioni +yoni +ionian +ionic +yonic +ionical +ionicism +ionicity +ionicities +ionicization +ionicize +ionics +ionidium +yonis +ionisable +ionisation +ionise +ionised +ioniser +ionises +ionising +ionism +ionist +ionium +ioniums +ionizable +ionization +ionizations +ionize +ionized +ionizer +ionizers +ionizes +ionizing +yonkalla +yonker +yonkers +yonner +yonnie +ionogen +ionogenic +ionomer +ionomers +ionone +ionones +ionopause +ionophore +ionornis +ionosphere +ionospheres +ionospheric +ionospherically +ionoxalis +ions +yonside +yont +iontophoresis +yook +yoop +ioparameters +yor +yore +yores +yoretime +york +yorker +yorkers +yorkish +yorkist +yorkshire +yorkshireism +yorkshireman +yorlin +iortn +yoruba +yoruban +ios +yosemite +ioskeha +yot +iota +iotacism +yotacism +iotacisms +iotacismus +iotacist +yotacize +iotas +yote +iotization +iotize +iotized +iotizing +iou +you +youd +youden +youdendrift +youdith +youff +youl +young +youngberry +youngberries +younger +youngers +youngest +younghearted +youngish +younglet +youngly +youngling +younglings +youngness +youngs +youngster +youngsters +youngstown +youngth +youngun +younker +younkers +youp +youpon +youpons +your +youre +yourn +yours +yoursel +yourself +yourselves +yourt +yous +youse +youstir +youth +youthen +youthened +youthening +youthens +youthes +youthful +youthfully +youthfullity +youthfulness +youthhead +youthheid +youthhood +youthy +youthily +youthiness +youthless +youthlessness +youthly +youthlike +youthlikeness +youths +youthsome +youthtide +youthwort +youve +youward +youwards +youze +yoven +yow +iowa +iowan +iowans +yowden +yowe +yowed +yowes +yowie +yowies +yowing +yowl +yowled +yowley +yowler +yowlers +yowling +yowlring +yowls +yows +iowt +yowt +yox +ipalnemohuani +ipecac +ipecacs +ipecacuanha +ipecacuanhic +yperite +yperites +iph +iphigenia +iphimedia +iphis +ipid +ipidae +ipil +ipilipil +ipl +ipm +ipocras +ypocras +ipomea +ipomoea +ipomoeas +ipomoein +yponomeuta +yponomeutid +yponomeutidae +ipr +iproniazid +ips +ipse +ipseand +ipsedixitish +ipsedixitism +ipsedixitist +ipseity +ipsilateral +ipsilaterally +ypsiliform +ypsiloid +ipso +ypurinan +iq +iqs +yquem +ir +yr +ira +iracund +iracundity +iracundulous +irade +irades +iran +irani +iranian +iranians +iranic +iranism +iranist +iranize +iraq +iraqi +iraqian +iraqis +irascent +irascibility +irascible +irascibleness +irascibly +irate +irately +irateness +irater +iratest +irbis +yrbk +irchin +ire +ired +ireful +irefully +irefulness +ireland +irelander +ireless +irena +irenarch +irene +irenic +irenica +irenical +irenically +irenicism +irenicist +irenicon +irenics +irenicum +ireos +ires +iresine +irfan +irgun +irgunist +irian +iriartea +iriarteaceae +iricism +iricize +irid +iridaceae +iridaceous +iridadenosis +iridal +iridalgia +iridate +iridauxesis +iridectome +iridectomy +iridectomies +iridectomise +iridectomised +iridectomising +iridectomize +iridectomized +iridectomizing +iridectropium +iridemia +iridencleisis +iridentropium +irideous +irideremia +irides +iridesce +iridescence +iridescences +iridescency +iridescent +iridescently +iridial +iridian +iridiate +iridic +iridical +iridin +iridine +iridiocyte +iridiophore +iridioplatinum +iridious +iridite +iridium +iridiums +iridization +iridize +iridized +iridizing +irido +iridoavulsion +iridocapsulitis +iridocele +iridoceratitic +iridochoroiditis +iridocyclitis +iridocyte +iridocoloboma +iridoconstrictor +iridodesis +iridodiagnosis +iridodialysis +iridodonesis +iridokinesia +iridoline +iridomalacia +iridomyrmex +iridomotor +iridoncus +iridoparalysis +iridophore +iridoplegia +iridoptosis +iridopupillary +iridorhexis +iridosclerotomy +iridosmine +iridosmium +iridotasis +iridotome +iridotomy +iridotomies +iridous +iring +iris +irisate +irisated +irisation +iriscope +irised +irises +irish +irisher +irishy +irishian +irishism +irishize +irishly +irishman +irishmen +irishness +irishry +irishwoman +irishwomen +irisin +irising +irislike +irisroot +iritic +iritis +iritises +irk +irked +irking +irks +irksome +irksomely +irksomeness +irma +iroha +irok +iroko +iron +ironback +ironbark +ironbarks +ironbound +ironbush +ironclad +ironclads +irone +ironed +ironer +ironers +irones +ironfisted +ironflower +ironhanded +ironhandedly +ironhandedness +ironhard +ironhead +ironheaded +ironheads +ironhearted +ironheartedly +ironheartedness +irony +ironic +ironical +ironically +ironicalness +ironice +ironies +ironing +ironings +ironiously +ironish +ironism +ironist +ironists +ironize +ironless +ironly +ironlike +ironmaker +ironmaking +ironman +ironmaster +ironmen +ironmonger +ironmongery +ironmongeries +ironmongering +ironness +ironnesses +irons +ironshod +ironshot +ironside +ironsided +ironsides +ironsmith +ironstone +ironstones +ironware +ironwares +ironweed +ironweeds +ironwood +ironwoods +ironwork +ironworked +ironworker +ironworkers +ironworking +ironworks +ironwort +iroquoian +iroquoians +iroquois +irous +irpe +irpex +irradiance +irradiancy +irradiant +irradiate +irradiated +irradiates +irradiating +irradiatingly +irradiation +irradiations +irradiative +irradiator +irradicable +irradicably +irradicate +irradicated +irrarefiable +irrate +irrationability +irrationable +irrationably +irrational +irrationalise +irrationalised +irrationalising +irrationalism +irrationalist +irrationalistic +irrationality +irrationalities +irrationalize +irrationalized +irrationalizing +irrationally +irrationalness +irrationals +irreal +irreality +irrealizable +irrebuttable +irreceptive +irreceptivity +irreciprocal +irreciprocity +irreclaimability +irreclaimable +irreclaimableness +irreclaimably +irreclaimed +irrecognition +irrecognizability +irrecognizable +irrecognizably +irrecognizant +irrecollection +irreconcilability +irreconcilable +irreconcilableness +irreconcilably +irreconcile +irreconciled +irreconcilement +irreconciliability +irreconciliable +irreconciliableness +irreconciliably +irreconciliation +irrecordable +irrecoverable +irrecoverableness +irrecoverably +irrecuperable +irrecurable +irrecusable +irrecusably +irred +irredeemability +irredeemable +irredeemableness +irredeemably +irredeemed +irredenta +irredential +irredentism +irredentist +irredentists +irredressibility +irredressible +irredressibly +irreducibility +irreducibilities +irreducible +irreducibleness +irreducibly +irreductibility +irreductible +irreduction +irreferable +irreflection +irreflective +irreflectively +irreflectiveness +irreflexive +irreformability +irreformable +irrefragability +irrefragable +irrefragableness +irrefragably +irrefrangibility +irrefrangible +irrefrangibleness +irrefrangibly +irrefusable +irrefutability +irrefutable +irrefutableness +irrefutably +irreg +irregardless +irregeneracy +irregenerate +irregeneration +irregular +irregularism +irregularist +irregularity +irregularities +irregularize +irregularly +irregularness +irregulars +irregulate +irregulated +irregulation +irregulous +irrejectable +irrelapsable +irrelate +irrelated +irrelation +irrelative +irrelatively +irrelativeness +irrelevance +irrelevances +irrelevancy +irrelevancies +irrelevant +irrelevantly +irreliability +irrelievable +irreligion +irreligionism +irreligionist +irreligionize +irreligiosity +irreligious +irreligiously +irreligiousness +irreluctant +irremeable +irremeably +irremediable +irremediableness +irremediably +irremediless +irrememberable +irremissibility +irremissible +irremissibleness +irremissibly +irremission +irremissive +irremittable +irremovability +irremovable +irremovableness +irremovably +irremunerable +irrenderable +irrenewable +irrenowned +irrenunciable +irrepair +irrepairable +irreparability +irreparable +irreparableness +irreparably +irrepassable +irrepatriable +irrepealability +irrepealable +irrepealableness +irrepealably +irrepentance +irrepentant +irrepentantly +irrepetant +irreplacable +irreplacably +irreplaceability +irreplaceable +irreplaceableness +irreplaceably +irrepleviable +irreplevisable +irreportable +irreprehensibility +irreprehensible +irreprehensibleness +irreprehensibly +irrepresentable +irrepresentableness +irrepressibility +irrepressible +irrepressibleness +irrepressibly +irrepressive +irreproachability +irreproachable +irreproachableness +irreproachably +irreproducibility +irreproducible +irreproductive +irreprovable +irreprovableness +irreprovably +irreption +irreptitious +irrepublican +irreputable +irresilience +irresiliency +irresilient +irresistable +irresistably +irresistance +irresistibility +irresistible +irresistibleness +irresistibly +irresistless +irresolubility +irresoluble +irresolubleness +irresolute +irresolutely +irresoluteness +irresolution +irresolvability +irresolvable +irresolvableness +irresolved +irresolvedly +irresonance +irresonant +irrespectability +irrespectable +irrespectful +irrespective +irrespectively +irrespirable +irrespondence +irresponsibility +irresponsibilities +irresponsible +irresponsibleness +irresponsibly +irresponsive +irresponsiveness +irrestrainable +irrestrainably +irrestrictive +irresultive +irresuscitable +irresuscitably +irretention +irretentive +irretentiveness +irreticence +irreticent +irretraceable +irretraceably +irretractable +irretractile +irretrievability +irretrievable +irretrievableness +irretrievably +irreturnable +irrevealable +irrevealably +irreverence +irreverences +irreverend +irreverendly +irreverent +irreverential +irreverentialism +irreverentially +irreverently +irreversibility +irreversible +irreversibleness +irreversibly +irrevertible +irreviewable +irrevisable +irrevocability +irrevocable +irrevocableness +irrevocably +irrevoluble +irrhation +irride +irridenta +irrigable +irrigably +irrigant +irrigate +irrigated +irrigates +irrigating +irrigation +irrigational +irrigationist +irrigations +irrigative +irrigator +irrigatory +irrigatorial +irrigators +irriguous +irriguousness +irrisible +irrision +irrisor +irrisory +irrisoridae +irritability +irritabilities +irritable +irritableness +irritably +irritament +irritancy +irritancies +irritant +irritants +irritate +irritated +irritatedly +irritates +irritating +irritatingly +irritation +irritations +irritative +irritativeness +irritator +irritatory +irrite +irritila +irritomotile +irritomotility +irrogate +irrorate +irrorated +irroration +irrotational +irrotationally +irrubrical +irrugate +irrumation +irrupt +irrupted +irruptible +irrupting +irruption +irruptions +irruptive +irruptively +irrupts +irs +yrs +irvin +irving +irvingesque +irvingiana +irvingism +irvingite +irwin +is +ys +isaac +isabel +isabelina +isabelita +isabelite +isabella +isabelle +isabelline +isabnormal +isaconitine +isacoustic +isadelphous +isadnormal +isadora +isagoge +isagoges +isagogic +isagogical +isagogically +isagogics +isagon +isaiah +isaian +isallobar +isallobaric +isallotherm +isamin +isamine +isander +isandrous +isanemone +isangoma +isanomal +isanomalous +isanthous +isapostolic +isaria +isarioid +isarithm +isarithms +isatate +isatic +isatid +isatide +isatin +isatine +isatines +isatinic +isatins +isatis +isatogen +isatogenic +isaurian +isauxesis +isauxetic +isawa +isazoxy +isba +isbas +iscariot +iscariotic +iscariotical +iscariotism +ischaemia +ischaemic +ischar +ischchia +ischemia +ischemias +ischemic +ischia +ischiac +ischiadic +ischiadicus +ischial +ischialgia +ischialgic +ischiatic +ischidrosis +ischioanal +ischiobulbar +ischiocapsular +ischiocaudal +ischiocavernosus +ischiocavernous +ischiocele +ischiocerite +ischiococcygeal +ischyodus +ischiofemoral +ischiofibular +ischioiliac +ischioneuralgia +ischioperineal +ischiopodite +ischiopubic +ischiopubis +ischiorectal +ischiorrhogic +ischiosacral +ischiotibial +ischiovaginal +ischiovertebral +ischium +ischocholia +ischuretic +ischury +ischuria +iscose +isdn +ise +ised +isegrim +isenergic +isenthalpic +isentrope +isentropic +isentropically +isepiptesial +isepiptesis +iserine +iserite +isethionate +isethionic +iseult +iseum +isfahan +ish +ishime +ishmael +ishmaelite +ishmaelitic +ishmaelitish +ishmaelitism +ishpingo +ishshakku +isiac +isiacal +isicle +isidae +isidia +isidiiferous +isidioid +isidiophorous +isidiose +isidium +isidoid +isidore +isidorian +isidoric +isinai +isindazole +ising +isinglass +isis +isize +isl +islay +islam +islamic +islamism +islamist +islamistic +islamite +islamitic +islamitish +islamization +islamize +island +islanded +islander +islanders +islandhood +islandy +islandic +islanding +islandish +islandless +islandlike +islandman +islandmen +islandology +islandologist +islandress +islandry +islands +isle +isled +isleless +isleman +isles +islesman +islesmen +islet +isleta +isleted +islets +isleward +isling +islot +isls +ism +ismaelian +ismaelism +ismaelite +ismaelitic +ismaelitical +ismaelitish +ismaili +ismailian +ismailite +ismal +ismatic +ismatical +ismaticalness +ismdom +ismy +isms +isn +isnad +isnardia +isnt +iso +isoabnormal +isoagglutination +isoagglutinative +isoagglutinin +isoagglutinogen +isoalantolactone +isoallyl +isoalloxazine +isoamarine +isoamid +isoamide +isoamyl +isoamylamine +isoamylene +isoamylethyl +isoamylidene +isoantibody +isoantigen +isoantigenic +isoantigenicity +isoapiole +isoasparagine +isoaurore +isobar +isobarbaloin +isobarbituric +isobare +isobares +isobaric +isobarism +isobarometric +isobars +isobase +isobath +isobathic +isobathytherm +isobathythermal +isobathythermic +isobaths +isobenzofuran +isobilateral +isobilianic +isobiogenetic +isoborneol +isobornyl +isobront +isobronton +isobutane +isobutene +isobutyl +isobutylene +isobutyraldehyde +isobutyrate +isobutyric +isobutyryl +isocamphor +isocamphoric +isocaproic +isocarbostyril +isocardia +isocardiidae +isocarpic +isocarpous +isocellular +isocephaly +isocephalic +isocephalism +isocephalous +isoceraunic +isocercal +isocercy +isochasm +isochasmic +isocheim +isocheimal +isocheimenal +isocheimic +isocheimonal +isocheims +isochela +isochimal +isochime +isochimenal +isochimes +isochlor +isochlorophyll +isochlorophyllin +isocholanic +isocholesterin +isocholesterol +isochor +isochore +isochores +isochoric +isochors +isochromatic +isochron +isochronal +isochronally +isochrone +isochrony +isochronic +isochronical +isochronism +isochronize +isochronized +isochronizing +isochronon +isochronous +isochronously +isochrons +isochroous +isocyanate +isocyanic +isocyanid +isocyanide +isocyanin +isocyanine +isocyano +isocyanogen +isocyanurate +isocyanuric +isocyclic +isocymene +isocinchomeronic +isocinchonine +isocytic +isocitric +isoclasite +isoclimatic +isoclinal +isoclinally +isocline +isoclines +isoclinic +isoclinically +isocodeine +isocola +isocolic +isocolon +isocoria +isocorybulbin +isocorybulbine +isocorydine +isocoumarin +isocracy +isocracies +isocrat +isocratic +isocreosol +isocrymal +isocryme +isocrymic +isocrotonic +isodactylism +isodactylous +isodef +isodiabatic +isodialuric +isodiametric +isodiametrical +isodiaphere +isodiazo +isodiazotate +isodimorphic +isodimorphism +isodimorphous +isodynamia +isodynamic +isodynamical +isodynamous +isodomic +isodomon +isodomous +isodomum +isodont +isodontous +isodose +isodrin +isodrome +isodrosotherm +isodulcite +isodurene +isoelastic +isoelectric +isoelectrically +isoelectronic +isoelectronically +isoelemicin +isoemodin +isoenergetic +isoenzymatic +isoenzyme +isoenzymic +isoerucic +isoetaceae +isoetales +isoetes +isoeugenol +isoflavone +isoflor +isogam +isogamete +isogametic +isogametism +isogamy +isogamic +isogamies +isogamous +isogen +isogeneic +isogenesis +isogenetic +isogeny +isogenic +isogenies +isogenotype +isogenotypic +isogenous +isogeotherm +isogeothermal +isogeothermic +isogynous +isogyre +isogloss +isoglossal +isoglosses +isognathism +isognathous +isogon +isogonal +isogonality +isogonally +isogonals +isogone +isogones +isogony +isogonic +isogonics +isogonies +isogoniostat +isogonism +isogons +isogradient +isograft +isogram +isograms +isograph +isography +isographic +isographical +isographically +isographs +isogriv +isogrivs +isohaline +isohalsine +isohel +isohels +isohemolysis +isohemopyrrole +isoheptane +isohesperidin +isohexyl +isohydric +isohydrocyanic +isohydrosorbic +isohyet +isohyetal +isohyets +isohume +isoimmune +isoimmunity +isoimmunization +isoimmunize +isoindazole +isoindigotin +isoindole +isoyohimbine +isoionone +isokeraunic +isokeraunographic +isokeraunophonic +isokontae +isokontan +isokurtic +isolability +isolable +isolapachol +isolatable +isolate +isolated +isolatedly +isolates +isolating +isolation +isolationalism +isolationalist +isolationalists +isolationism +isolationist +isolationists +isolations +isolative +isolator +isolators +isolde +isolead +isoleads +isolecithal +isolette +isoleucine +isolex +isolichenin +isoline +isolines +isolinolenic +isolysin +isolysis +isoln +isolog +isology +isologous +isologs +isologue +isologues +isoloma +isomagnetic +isomaltose +isomastigate +isomelamine +isomenthone +isomer +isomera +isomerase +isomere +isomery +isomeric +isomerical +isomerically +isomeride +isomerism +isomerization +isomerize +isomerized +isomerizing +isomeromorphism +isomerous +isomers +isometry +isometric +isometrical +isometrically +isometrics +isometries +isometrograph +isometropia +isomyaria +isomyarian +isomorph +isomorphic +isomorphically +isomorphism +isomorphisms +isomorphous +isomorphs +isoneph +isonephelic +isonergic +isoniazid +isonicotinic +isonym +isonymy +isonymic +isonitramine +isonitril +isonitrile +isonitro +isonitroso +isonomy +isonomic +isonomies +isonomous +isonuclear +isooctane +isooleic +isoosmosis +isopach +isopachous +isopag +isoparaffin +isopathy +isopectic +isopedin +isopedine +isopelletierin +isopelletierine +isopentane +isopentyl +isoperimeter +isoperimetry +isoperimetric +isoperimetrical +isopetalous +isophanal +isophane +isophasal +isophene +isophenomenal +isophylly +isophyllous +isophone +isophoria +isophorone +isophotal +isophote +isophotes +isophthalic +isophthalyl +isopycnal +isopycnic +isopicramic +isopiestic +isopiestically +isopilocarpine +isopyre +isopyromucic +isopyrrole +isoplere +isopleth +isoplethic +isopleths +isopleura +isopleural +isopleuran +isopleure +isopleurous +isopod +isopoda +isopodan +isopodans +isopodiform +isopodimorphous +isopodous +isopods +isopogonous +isopoly +isopolite +isopolity +isopolitical +isopor +isoporic +isoprenaline +isoprene +isoprenes +isoprenoid +isopropanol +isopropenyl +isopropyl +isopropylacetic +isopropylamine +isopropylideneacetone +isoproterenol +isopsephic +isopsephism +isoptera +isopterous +isoptic +isopulegone +isopurpurin +isoquercitrin +isoquinine +isoquinoline +isorcinol +isorhamnose +isorhythm +isorhythmic +isorhythmically +isorhodeose +isorithm +isorosindone +isorrhythmic +isorropic +isort +isosaccharic +isosaccharin +isoscele +isosceles +isoscope +isoseismal +isoseismic +isoseismical +isoseist +isoserine +isosmotic +isosmotically +isospin +isospins +isospondyli +isospondylous +isospore +isospory +isosporic +isospories +isosporous +isostacy +isostasy +isostasies +isostasist +isostatic +isostatical +isostatically +isostemony +isostemonous +isoster +isostere +isosteric +isosterism +isostrychnine +isostructural +isosuccinic +isosulphide +isosulphocyanate +isosulphocyanic +isosultam +isotac +isotach +isotachs +isotactic +isoteles +isotely +isoteniscope +isotere +isoteric +isotheral +isothere +isotheres +isotherm +isothermal +isothermally +isothermic +isothermical +isothermobath +isothermobathic +isothermobaths +isothermous +isotherms +isotherombrose +isothiocyanates +isothiocyanic +isothiocyano +isothujone +isotimal +isotimic +isotype +isotypes +isotypic +isotypical +isotome +isotomous +isotone +isotones +isotony +isotonia +isotonic +isotonically +isotonicity +isotope +isotopes +isotopy +isotopic +isotopically +isotopies +isotopism +isotrehalose +isotria +isotrimorphic +isotrimorphism +isotrimorphous +isotron +isotronic +isotrope +isotropy +isotropic +isotropies +isotropil +isotropism +isotropous +isovalerate +isovalerianate +isovalerianic +isovaleric +isovalerone +isovaline +isovanillic +isovoluminal +isoxanthine +isoxazine +isoxazole +isoxylene +isoxime +isozyme +isozymes +isozymic +isozooid +ispaghul +ispraynik +ispravnik +israel +israeli +israelis +israelite +israelites +israeliteship +israelitic +israelitish +israelitism +israelitize +issachar +issanguila +issedoi +issedones +issei +isseis +issite +issuable +issuably +issuance +issuances +issuant +issue +issued +issueless +issuer +issuers +issues +issuing +ist +istana +istanbul +isth +isthm +isthmal +isthmectomy +isthmectomies +isthmi +isthmia +isthmial +isthmian +isthmians +isthmiate +isthmic +isthmics +isthmist +isthmistic +isthmistical +isthmistics +isthmoid +isthmus +isthmuses +istiophorid +istiophoridae +istiophorus +istle +istles +istoke +istrian +istvaeones +isuret +isuretine +isuridae +isuroid +isurus +iswara +isz +it +yt +ita +itabirite +itacism +itacist +itacistic +itacolumite +itaconate +itaconic +itai +ital +itala +itali +italy +italian +italianate +italianately +italianation +italianesque +italianiron +italianish +italianism +italianist +italianity +italianization +italianize +italianizer +italianly +italians +italic +italical +italically +italican +italicanist +italici +italicism +italicization +italicize +italicized +italicizes +italicizing +italics +italiot +italiote +italite +italomania +italon +italophile +itamalate +itamalic +itatartaric +itatartrate +itauba +itaves +itch +itched +itcheoglan +itches +itchy +itchier +itchiest +itchiness +itching +itchingly +itchings +itchless +itchproof +itchreed +itchweed +itchwood +itcze +itd +itea +iteaceae +itel +itelmes +item +itemed +itemy +iteming +itemise +itemization +itemizations +itemize +itemized +itemizer +itemizers +itemizes +itemizing +items +iten +itenean +iter +iterable +iterance +iterances +iterancy +iterant +iterate +iterated +iterately +iterates +iterating +iteration +iterations +iterative +iteratively +iterativeness +iterator +iterators +iteroparity +iteroparous +iters +iterum +ithaca +ithacan +ithacensian +ithagine +ithaginis +ithand +ither +itherness +ithiel +ithyphallic +ithyphallus +ithyphyllous +ithomiid +ithomiidae +ithomiinae +itylus +itineracy +itinerancy +itinerant +itinerantly +itinerants +itinerary +itineraria +itinerarian +itineraries +itinerarium +itinerariums +itinerate +itinerated +itinerating +itineration +itinereraria +itinerite +itinerition +itineritious +itineritis +itineritive +itinerous +itys +itll +itmo +ito +itoism +itoist +itoland +itonama +itonaman +itonia +itonidid +itonididae +itoubou +its +itself +itsy +ytter +ytterbia +ytterbias +ytterbic +ytterbite +ytterbium +ytterbous +ytterite +ittria +yttria +yttrialite +yttrias +yttric +yttriferous +yttrious +yttrium +yttriums +yttrocerite +yttrocolumbite +yttrocrasite +yttrofluorite +yttrogummite +yttrotantalite +ituraean +iturite +itza +itzebu +yuan +yuans +yuapin +yuca +yucatec +yucatecan +yucateco +yucca +yuccas +yucch +yuch +yuchi +yuck +yucked +yuckel +yucker +yucky +yuckier +yuckiest +yucking +yuckle +yucks +iud +iuds +yuechi +yuft +yug +yuga +yugada +yugas +yugoslav +yugoslavia +yugoslavian +yugoslavians +yugoslavic +yugoslavs +yuh +yuit +yuk +yukaghir +yukata +yuke +yuki +yukian +yukked +yukkel +yukking +yukon +yuks +yulan +yulans +yule +yuleblock +yules +yuletide +yuletides +iulidan +iulus +yum +yuma +yuman +yummy +yummier +yummies +yummiest +yun +yunca +yuncan +yungan +yunker +yunnanese +yup +yupon +yupons +yuppie +yuquilla +yuquillas +yurak +iurant +yurok +yurt +yurta +yurts +yurucare +yurucarean +yurucari +yurujure +yuruk +yuruna +yurupary +yus +yusdrum +yustaga +yutu +iuus +yuzlik +yuzluk +iv +iva +ivan +ive +ivy +ivybells +ivyberry +ivyberries +ivied +ivies +ivyflower +ivylike +ivin +ivyweed +ivywood +ivywort +yvonne +ivory +ivorybill +ivoried +ivories +ivorylike +ivorine +ivoriness +ivorist +ivorytype +ivorywood +ivray +ivresse +iw +iwa +iwaiwa +iwbells +iwberry +ywca +iwearth +iwflower +iwis +ywis +iworth +iwound +iwurche +iwurthen +iwwood +iwwort +ix +ixia +ixiaceae +ixiama +ixias +ixil +ixion +ixionian +ixodes +ixodian +ixodic +ixodid +ixodidae +ixodids +ixora +ixtle +ixtles +izafat +izar +izard +izars +izba +izcateco +izchak +izdubar +izing +izle +izote +iztle +izumi +izvozchik +izzard +izzards +izzat +izzy +j +ja +jaalin +jaap +jab +jabalina +jabarite +jabbed +jabber +jabbered +jabberer +jabberers +jabbering +jabberingly +jabberment +jabbernowl +jabbers +jabberwock +jabberwocky +jabberwockian +jabbing +jabbingly +jabble +jabers +jabia +jabiru +jabirus +jaborandi +jaborandis +jaborin +jaborine +jabot +jaboticaba +jabots +jabs +jabul +jabules +jaburan +jacal +jacales +jacals +jacaltec +jacalteca +jacamar +jacamaralcyon +jacamars +jacameropine +jacamerops +jacami +jacamin +jacana +jacanas +jacanidae +jacaranda +jacarandas +jacarandi +jacare +jacate +jacatoo +jacchus +jacconet +jacconot +jacens +jacent +jacht +jacinth +jacinthe +jacinthes +jacinths +jacitara +jack +jackal +jackals +jackanapes +jackanapeses +jackanapish +jackaroo +jackarooed +jackarooing +jackaroos +jackash +jackass +jackassery +jackasses +jackassification +jackassism +jackassness +jackbird +jackboy +jackboot +jackbooted +jackboots +jackbox +jackdaw +jackdaws +jacked +jackeen +jackey +jacker +jackeroo +jackerooed +jackerooing +jackeroos +jackers +jacket +jacketed +jackety +jacketing +jacketless +jacketlike +jackets +jacketwise +jackfish +jackfishes +jackfruit +jackhammer +jackhammers +jackhead +jacky +jackyard +jackyarder +jackie +jackye +jackies +jacking +jackknife +jackknifed +jackknifes +jackknifing +jackknives +jackleg +jacklegs +jacklight +jacklighter +jackman +jackmen +jacknifed +jacknifing +jacknives +jacko +jackpile +jackpiling +jackplane +jackpot +jackpots +jackpudding +jackpuddinghood +jackrabbit +jackrod +jackroll +jackrolled +jackrolling +jackrolls +jacks +jacksaw +jackscrew +jackscrews +jackshaft +jackshay +jackshea +jackslave +jacksmelt +jacksmelts +jacksmith +jacksnipe +jacksnipes +jackson +jacksonia +jacksonian +jacksonite +jacksonville +jackstay +jackstays +jackstock +jackstone +jackstones +jackstraw +jackstraws +jacktan +jacktar +jackweed +jackwood +jacob +jacobaea +jacobaean +jacobean +jacoby +jacobian +jacobic +jacobin +jacobinia +jacobinic +jacobinical +jacobinically +jacobinism +jacobinization +jacobinize +jacobins +jacobite +jacobitely +jacobitiana +jacobitic +jacobitical +jacobitically +jacobitish +jacobitishly +jacobitism +jacobsite +jacobson +jacobus +jacobuses +jacolatt +jaconace +jaconet +jaconets +jacounce +jacquard +jacquards +jacqueline +jacquemart +jacqueminot +jacquerie +jacques +jactance +jactancy +jactant +jactation +jacteleg +jactitate +jactitated +jactitating +jactitation +jactivus +jactura +jacture +jactus +jacu +jacuaru +jaculate +jaculated +jaculates +jaculating +jaculation +jaculative +jaculator +jaculatory +jaculatorial +jaculiferous +jacunda +jacutinga +jad +jadded +jadder +jadding +jade +jaded +jadedly +jadedness +jadeite +jadeites +jadelike +jadery +jades +jadesheen +jadeship +jadestone +jady +jading +jadish +jadishly +jadishness +jaditic +jaegars +jaeger +jaegers +jag +jaga +jagamohan +jagannath +jagannatha +jagat +jagatai +jagataic +jagath +jageer +jager +jagers +jagg +jaggar +jaggary +jaggaries +jagged +jaggeder +jaggedest +jaggedly +jaggedness +jagger +jaggery +jaggeries +jaggers +jagghery +jaggheries +jaggy +jaggier +jaggiest +jagging +jaggs +jagheer +jagheerdar +jaghir +jaghirdar +jaghire +jaghiredar +jagir +jagirdar +jagla +jagless +jagong +jagra +jagras +jagrata +jags +jagua +jaguar +jaguarete +jaguarondi +jaguars +jaguarundi +jaguarundis +jaguey +jah +jahannan +jahve +jahveh +jahvism +jahvist +jahvistic +jai +jay +jayant +jaybird +jaybirds +jaycee +jaycees +jayesh +jaygee +jaygees +jayhawk +jayhawker +jail +jailage +jailbait +jailbird +jailbirds +jailbreak +jailbreaker +jailbreaks +jaildom +jailed +jailer +jaileress +jailering +jailers +jailership +jailhouse +jailhouses +jailyard +jailing +jailish +jailkeeper +jailless +jaillike +jailmate +jailor +jailoring +jailors +jails +jailward +jaime +jain +jaina +jainism +jainist +jaypie +jaypiet +jaipuri +jays +jayvee +jayvees +jaywalk +jaywalked +jaywalker +jaywalkers +jaywalking +jaywalks +jajman +jak +jakarta +jake +jakey +jakes +jakfruit +jako +jakob +jakos +jakun +jalalaean +jalap +jalapa +jalapeno +jalapenos +jalapic +jalapin +jalapins +jalaps +jalee +jalet +jalkar +jalloped +jalop +jalopy +jalopies +jaloppy +jaloppies +jalops +jalor +jalouse +jaloused +jalousie +jalousied +jalousies +jalousing +jalpaite +jalur +jam +jama +jamadar +jamaica +jamaican +jamaicans +jaman +jamb +jambalaya +jambart +jambarts +jambe +jambeau +jambeaux +jambed +jambee +jamber +jambes +jambiya +jambing +jambo +jamboy +jambolan +jambolana +jambon +jambone +jambonneau +jambool +jamboree +jamborees +jambos +jambosa +jambs +jambstone +jambul +jamdanee +jamdani +james +jamesian +jamesina +jameson +jamesonite +jamestown +jami +jamie +jamlike +jammed +jammedness +jammer +jammers +jammy +jamming +jamnia +jamnut +jamoke +jampacked +jampan +jampanee +jampani +jamrosade +jams +jamshid +jamtland +jamwood +jan +janapa +janapan +janapum +janders +jane +janeiro +janes +janet +jangada +jangar +janghey +jangkar +jangle +jangled +jangler +janglery +janglers +jangles +jangly +jangling +janice +janiceps +janiculan +janiculum +janiform +janisary +janisaries +janissary +janitor +janitorial +janitors +janitorship +janitress +janitresses +janitrix +janizary +janizarian +janizaries +jank +janker +jankers +jann +janner +jannock +janos +jansenism +jansenist +jansenistic +jansenistical +jansenize +jant +jantee +janthina +janthinidae +janty +jantu +janua +january +januaries +januarius +janus +januslike +jaob +jap +japaconin +japaconine +japaconitin +japaconitine +japan +japanee +japanese +japanesery +japanesy +japanesque +japanesquely +japanesquery +japanicize +japanism +japanization +japanize +japanized +japanizes +japanizing +japanned +japanner +japannery +japanners +japanning +japannish +japanolatry +japanology +japanologist +japanophile +japanophobe +japanophobia +japans +jape +japed +japer +japery +japeries +japers +japes +japetus +japheth +japhetic +japhetide +japhetite +japygid +japygidae +japygoid +japing +japingly +japish +japishly +japishness +japyx +japonaiserie +japonic +japonica +japonically +japonicas +japonicize +japonism +japonize +japonizer +jaqueline +jaquesian +jaquette +jaquima +jar +jara +jarabe +jaragua +jarana +jararaca +jararacussu +jarbird +jarble +jarbot +jarde +jardin +jardini +jardiniere +jardinieres +jardon +jared +jareed +jarfly +jarful +jarfuls +jarg +jargle +jargogle +jargon +jargonal +jargoned +jargoneer +jargonel +jargonelle +jargonels +jargoner +jargonesque +jargonic +jargoning +jargonisation +jargonise +jargonised +jargonish +jargonising +jargonist +jargonistic +jargonium +jargonization +jargonize +jargonized +jargonizer +jargonizing +jargonnelle +jargons +jargoon +jargoons +jarhead +jarina +jarinas +jark +jarkman +jarl +jarldom +jarldoms +jarless +jarlite +jarls +jarlship +jarmo +jarnut +jarool +jarosite +jarosites +jarovization +jarovize +jarovized +jarovizes +jarovizing +jarp +jarra +jarrah +jarrahs +jarred +jarret +jarry +jarring +jarringly +jarringness +jars +jarsful +jarvey +jarveys +jarvy +jarvie +jarvies +jarvis +jasey +jaseyed +jaseys +jasy +jasies +jasione +jasmin +jasminaceae +jasmine +jasmined +jasminelike +jasmines +jasminewood +jasmins +jasminum +jasmone +jason +jasp +jaspachate +jaspagate +jaspe +jasper +jasperated +jaspered +jaspery +jasperite +jasperize +jasperized +jasperizing +jasperoid +jaspers +jasperware +jaspidean +jaspideous +jaspilite +jaspilyte +jaspis +jaspoid +jasponyx +jaspopal +jass +jassid +jassidae +jassids +jassoid +jasz +jat +jataco +jataka +jatamansi +jateorhiza +jateorhizin +jateorhizine +jatha +jati +jatki +jatni +jato +jatoba +jatos +jatropha +jatrophic +jatrorrhizine +jatulian +jaudie +jauk +jauked +jauking +jauks +jaun +jaunce +jaunced +jaunces +jauncing +jaunder +jaunders +jaundice +jaundiced +jaundiceroot +jaundices +jaundicing +jauner +jaunt +jaunted +jaunty +jauntie +jauntier +jauntiest +jauntily +jauntiness +jaunting +jauntingly +jaunts +jaup +jauped +jauping +jaups +java +javahai +javali +javan +javanee +javanese +javanine +javas +javel +javelin +javelina +javelinas +javeline +javelined +javelineer +javelining +javelins +javelot +javer +javitero +jaw +jawab +jawan +jawans +jawbation +jawbone +jawboned +jawbones +jawboning +jawbreak +jawbreaker +jawbreakers +jawbreaking +jawbreakingly +jawcrusher +jawed +jawfall +jawfallen +jawfeet +jawfish +jawfishes +jawfoot +jawfooted +jawhole +jawy +jawing +jawless +jawlike +jawline +jawlines +jawn +jawp +jawrope +jaws +jawsmith +jawtwister +jazey +jazeys +jazeran +jazerant +jazy +jazies +jazyges +jazz +jazzbow +jazzed +jazzer +jazzers +jazzes +jazzy +jazzier +jazziest +jazzily +jazziness +jazzing +jazzist +jazzlike +jazzman +jazzmen +jcl +jct +jctn +jealous +jealouse +jealousy +jealousies +jealously +jealousness +jeames +jean +jeanette +jeany +jeanie +jeanne +jeannette +jeannie +jeanpaulia +jeans +jear +jebat +jebel +jebels +jebus +jebusi +jebusite +jebusitic +jebusitical +jebusitish +jecoral +jecorin +jecorize +jed +jedburgh +jedcock +jedding +jeddock +jee +jeed +jeeing +jeel +jeep +jeepers +jeepney +jeepneys +jeeps +jeer +jeered +jeerer +jeerers +jeery +jeering +jeeringly +jeerproof +jeers +jees +jeetee +jeewhillijers +jeewhillikens +jeez +jef +jefe +jefes +jeff +jeffery +jefferisite +jefferson +jeffersonia +jeffersonian +jeffersonianism +jeffersonians +jeffersonite +jeffie +jeffrey +jeg +jehad +jehads +jehoshaphat +jehovah +jehovic +jehovism +jehovist +jehovistic +jehu +jehup +jehus +jejuna +jejunal +jejunator +jejune +jejunectomy +jejunectomies +jejunely +jejuneness +jejunity +jejunities +jejunitis +jejunoduodenal +jejunoileitis +jejunostomy +jejunostomies +jejunotomy +jejunum +jejunums +jekyll +jelab +jelerang +jelib +jelick +jell +jellab +jellaba +jellabas +jelled +jelly +jellib +jellybean +jellybeans +jellica +jellico +jellydom +jellied +jelliedness +jellies +jellify +jellification +jellified +jellifies +jellifying +jellyfish +jellyfishes +jellying +jellyleaf +jellily +jellylike +jellylikeness +jelling +jellyroll +jello +jelloid +jells +jelotong +jelske +jelutong +jelutongs +jem +jemadar +jemadars +jembe +jemble +jemez +jemidar +jemidars +jemima +jemmy +jemmied +jemmies +jemmying +jemmily +jemminess +jen +jenequen +jenine +jenkin +jenna +jennerization +jennerize +jennet +jenneting +jennets +jenny +jennie +jennier +jennies +jennifer +jenoar +jenson +jentacular +jeofail +jeon +jeopard +jeoparded +jeoparder +jeopardy +jeopardied +jeopardies +jeopardying +jeoparding +jeopardious +jeopardise +jeopardised +jeopardising +jeopardize +jeopardized +jeopardizes +jeopardizing +jeopardous +jeopardously +jeopardousness +jeopards +jequerity +jequirity +jequirities +jer +jerahmeel +jerahmeelites +jerald +jerbil +jerboa +jerboas +jere +jereed +jereeds +jeremejevite +jeremy +jeremiad +jeremiads +jeremiah +jeremian +jeremianic +jeremias +jerez +jerfalcon +jerib +jerican +jericho +jerid +jerids +jerk +jerked +jerker +jerkers +jerky +jerkier +jerkies +jerkiest +jerkily +jerkin +jerkined +jerkiness +jerking +jerkingly +jerkings +jerkinhead +jerkins +jerkish +jerks +jerksome +jerkwater +jerl +jerm +jermonal +jermoonal +jernie +jeroboam +jeroboams +jerome +jeromian +jeronymite +jeropiga +jerque +jerqued +jerquer +jerquing +jerreed +jerreeds +jerry +jerrybuild +jerrybuilding +jerrybuilt +jerrican +jerrycan +jerricans +jerrycans +jerrid +jerrids +jerrie +jerries +jerryism +jersey +jerseyan +jerseyed +jerseyite +jerseyites +jerseyman +jerseys +jert +jerusalem +jervia +jervin +jervina +jervine +jesper +jess +jessakeed +jessamy +jessamies +jessamine +jessant +jesse +jessean +jessed +jesses +jessica +jessie +jessing +jessur +jest +jestbook +jested +jestee +jester +jesters +jestful +jesting +jestingly +jestings +jestingstock +jestmonger +jestproof +jests +jestwise +jestword +jesu +jesuate +jesuist +jesuit +jesuited +jesuitess +jesuitic +jesuitical +jesuitically +jesuitish +jesuitism +jesuitist +jesuitize +jesuitocracy +jesuitry +jesuitries +jesuits +jesus +jet +jetavator +jetbead +jetbeads +jete +jetes +jethro +jethronian +jetliner +jetliners +jeton +jetons +jetport +jetports +jets +jetsam +jetsams +jetsom +jetsoms +jetstream +jettage +jettatore +jettatura +jetteau +jetted +jetter +jetty +jettied +jetties +jettyhead +jettying +jettiness +jetting +jettingly +jettison +jettisonable +jettisoned +jettisoning +jettisons +jettywise +jetton +jettons +jettru +jetware +jeu +jeunesse +jeux +jew +jewbird +jewbush +jewdom +jewed +jewel +jeweled +jeweler +jewelers +jewelfish +jewelfishes +jewelhouse +jewely +jeweling +jewelled +jeweller +jewellery +jewellers +jewelless +jewelly +jewellike +jewelling +jewelry +jewelries +jewels +jewelsmith +jewelweed +jewelweeds +jewess +jewfish +jewfishes +jewhood +jewy +jewing +jewis +jewish +jewishly +jewishness +jewism +jewless +jewlike +jewling +jewry +jews +jewship +jewstone +jezail +jezails +jezebel +jezebelian +jezebelish +jezebels +jezekite +jeziah +jezreelite +jg +jger +jharal +jheel +jhool +jhow +jhuria +jhvh +ji +jianyun +jiao +jib +jibb +jibba +jibbah +jibbed +jibbeh +jibber +jibbers +jibby +jibbing +jibbings +jibbons +jibboom +jibbooms +jibbs +jibe +jibed +jiber +jibers +jibes +jibhead +jibi +jibing +jibingly +jibman +jibmen +jiboa +jiboya +jibs +jibstay +jicama +jicamas +jicaque +jicaquean +jicara +jicarilla +jiff +jiffy +jiffies +jiffle +jiffs +jig +jigaboo +jigaboos +jigamaree +jigged +jigger +jiggered +jiggerer +jiggerman +jiggermast +jiggers +jigget +jiggety +jiggy +jigginess +jigging +jiggish +jiggit +jiggle +jiggled +jiggler +jiggles +jiggly +jigglier +jiggliest +jiggling +jiggumbob +jiglike +jigman +jigmen +jigote +jigs +jigsaw +jigsawed +jigsawing +jigsawn +jigsaws +jihad +jihads +jikungu +jill +jillaroo +jillet +jillflirt +jilling +jillion +jillions +jills +jilt +jilted +jiltee +jilter +jilters +jilting +jiltish +jilts +jim +jimbang +jimberjaw +jimberjawed +jimbo +jimcrack +jimigaki +jiminy +jimjam +jimjams +jimjums +jimmer +jimmy +jimmied +jimmies +jimmying +jimminy +jimmyweed +jymold +jimp +jimper +jimpest +jimpy +jimply +jimpness +jimpricute +jimsedge +jimson +jimsonweed +jin +jina +jincamas +jincan +jinchao +jinete +jing +jingal +jingall +jingalls +jingals +jingbai +jingbang +jynginae +jyngine +jingko +jingkoes +jingle +jinglebob +jingled +jinglejangle +jingler +jinglers +jingles +jinglet +jingly +jinglier +jingliest +jingling +jinglingly +jingo +jingodom +jingoed +jingoes +jingoing +jingoish +jingoism +jingoisms +jingoist +jingoistic +jingoistically +jingoists +jingu +jinja +jinjili +jink +jinked +jinker +jinkers +jinket +jinking +jinkle +jinks +jinn +jinnee +jinnestan +jinni +jinny +jinnies +jinniyeh +jinniwink +jinnywink +jinns +jinricksha +jinrickshaw +jinriki +jinrikiman +jinrikimen +jinrikisha +jinrikishas +jinriksha +jins +jinsha +jinshang +jinsing +jinx +jynx +jinxed +jinxes +jinxing +jipijapa +jipijapas +jipper +jiqui +jirble +jirga +jirgah +jiri +jirkinet +jisheng +jism +jisms +jissom +jitendra +jiti +jitney +jitneyed +jitneying +jitneyman +jitneys +jitneur +jitneuse +jitro +jitter +jitterbug +jitterbugged +jitterbugger +jitterbugging +jitterbugs +jittered +jittery +jitteriness +jittering +jitters +jiujitsu +jiujitsus +jiujutsu +jiujutsus +jiva +jivaran +jivaro +jivaroan +jivatma +jive +jiveass +jived +jives +jiving +jixie +jizya +jizyah +jizzen +jms +jnana +jnanayoga +jnanamarga +jnanas +jnanashakti +jnanendriya +jnd +jnt +jo +joachim +joachimite +joan +joanna +joanne +joannes +joannite +joaquinite +job +jobade +jobarbe +jobation +jobbed +jobber +jobbery +jobberies +jobbernowl +jobbernowlism +jobbers +jobbet +jobbing +jobbish +jobble +jobe +jobholder +jobholders +jobless +joblessness +joblots +jobman +jobmaster +jobmen +jobmistress +jobmonger +jobname +jobnames +jobo +jobs +jobsite +jobsmith +jobson +jocant +jocasta +jocatory +jocelin +jocelyn +joceline +joch +jochen +jock +jockey +jockeydom +jockeyed +jockeying +jockeyish +jockeyism +jockeylike +jockeys +jockeyship +jocker +jockette +jockettes +jocko +jockos +jocks +jockstrap +jockstraps +jockteleg +jocooserie +jocoque +jocoqui +jocose +jocosely +jocoseness +jocoseriosity +jocoserious +jocosity +jocosities +jocote +jocteleg +jocu +jocular +jocularity +jocularities +jocularly +jocularness +joculator +joculatory +jocum +jocuma +jocund +jocundity +jocundities +jocundly +jocundness +jocundry +jocuno +jocunoity +jodel +jodelr +jodhpur +jodhpurs +jodo +joe +joebush +joey +joeyes +joeys +joel +joes +joewood +jog +jogged +jogger +joggers +jogging +joggle +joggled +joggler +jogglers +joggles +jogglety +jogglework +joggly +joggling +jogjakarta +jogs +jogtrot +jogtrottism +johan +johann +johanna +johannean +johannes +johannesburg +johannine +johannisberger +johannist +johannite +john +johnadreams +johnathan +johnboat +johnboats +johnian +johnin +johnny +johnnycake +johnnydom +johnnie +johnnies +johns +johnsmas +johnson +johnsonese +johnsonian +johnsoniana +johnsonianism +johnsonianly +johnsonism +johnstrupite +joy +joyance +joyances +joyancy +joyant +joyce +joycean +joie +joyed +joyful +joyfuller +joyfullest +joyfully +joyfulness +joyhop +joyhouse +joying +joyleaf +joyless +joylessly +joylessness +joylet +join +joinable +joinant +joinder +joinders +joined +joiner +joinered +joinery +joineries +joinering +joiners +joinhand +joining +joiningly +joinings +joins +joint +jointage +jointed +jointedly +jointedness +jointer +jointers +jointy +jointing +jointist +jointless +jointlessness +jointly +jointress +joints +jointure +jointured +jointureless +jointures +jointuress +jointuring +jointweed +jointwood +jointworm +joyous +joyously +joyousness +joypop +joypopped +joypopper +joypopping +joypops +joyproof +joyridden +joyride +joyrider +joyriders +joyrides +joyriding +joyrode +joys +joysome +joist +joisted +joystick +joysticks +joisting +joistless +joists +joyweed +jojoba +jojobas +joke +jokebook +joked +jokey +jokeless +jokelet +jokeproof +joker +jokers +jokes +jokesmith +jokesome +jokesomeness +jokester +jokesters +joky +jokier +jokiest +joking +jokingly +jokish +jokist +joktaleg +jokul +jole +joles +joll +jolleyman +jolly +jollied +jollier +jollyer +jollies +jolliest +jollify +jollification +jollifications +jollified +jollifies +jollifying +jollyhead +jollying +jollily +jolliment +jolliness +jollytail +jollity +jollities +jollitry +jollop +jolloped +joloano +jolt +jolted +jolter +jolterhead +jolterheaded +jolterheadedness +jolters +jolthead +joltheaded +jolty +joltier +joltiest +joltily +joltiness +jolting +joltingly +joltless +joltproof +jolts +jomon +jon +jonah +jonahesque +jonahism +jonahs +jonas +jonathan +jonathanization +jondla +jones +joneses +jonesian +jong +jonglem +jonglery +jongleur +jongleurs +joni +jonnick +jonnock +jonque +jonquil +jonquille +jonquils +jonsonian +jonval +jonvalization +jonvalize +jook +jookerie +joola +joom +joon +jophiel +joram +jorams +jordan +jordanian +jordanians +jordanite +jordanon +jordans +jorden +joree +jorge +jorist +jornada +jornadas +joropo +joropos +jorram +jorum +jorums +jos +jose +josefite +josey +joseite +joseph +josepha +josephine +josephinism +josephinite +josephism +josephite +josephs +josh +joshed +josher +joshers +joshes +joshi +joshing +joshua +josiah +josie +josip +joskin +joss +jossakeed +josser +josses +jostle +jostled +jostlement +jostler +jostlers +jostles +jostling +jot +jota +jotas +jotation +jotisaru +jotisi +jotnian +jots +jotted +jotter +jotters +jotty +jotting +jottings +jotunn +jotunnheim +joual +jouals +joubarb +joubert +joug +jough +jougs +jouisance +jouissance +jouk +jouked +joukery +joukerypawkery +jouking +jouks +joul +joule +joulean +joulemeter +joules +jounce +jounced +jounces +jouncy +jouncier +jounciest +jouncing +jour +journ +journal +journalary +journaled +journalese +journaling +journalise +journalised +journalish +journalising +journalism +journalist +journalistic +journalistically +journalists +journalization +journalize +journalized +journalizer +journalizes +journalizing +journalled +journalling +journals +journey +journeycake +journeyed +journeyer +journeyers +journeying +journeyings +journeyman +journeymen +journeys +journeywoman +journeywomen +journeywork +journeyworker +journo +jours +joust +jousted +jouster +jousters +jousting +jousts +joutes +jova +jove +jovy +jovial +jovialist +jovialistic +joviality +jovialize +jovialized +jovializing +jovially +jovialness +jovialty +jovialties +jovian +jovianly +jovicentric +jovicentrical +jovicentrically +jovilabe +joviniamish +jovinian +jovinianist +jovite +jow +jowar +jowari +jowars +jowed +jowel +jower +jowery +jowing +jowl +jowled +jowler +jowly +jowlier +jowliest +jowlish +jowlop +jowls +jowpy +jows +jowser +jowter +jozy +jr +js +jt +ju +juamave +juan +juang +juans +juba +jubarb +jubardy +jubartas +jubartes +jubas +jubate +jubbah +jubbahs +jubbe +jube +juberous +jubes +jubhah +jubhahs +jubilance +jubilancy +jubilant +jubilantly +jubilar +jubilarian +jubilate +jubilated +jubilates +jubilating +jubilatio +jubilation +jubilations +jubilatory +jubile +jubileal +jubilean +jubilee +jubilees +jubiles +jubili +jubilist +jubilization +jubilize +jubilus +jubus +juchart +juck +juckies +jucuna +jucundity +jud +judaeomancy +judaeophile +judaeophilism +judaeophobe +judaeophobia +judah +judahite +judaic +judaica +judaical +judaically +judaiser +judaism +judaist +judaistic +judaistically +judaization +judaize +judaizer +judas +judases +judaslike +judcock +judder +juddered +juddering +judders +juddock +jude +judean +judex +judge +judgeable +judged +judgeless +judgelike +judgement +judgemental +judgements +judger +judgers +judges +judgeship +judgeships +judging +judgingly +judgmatic +judgmatical +judgmatically +judgment +judgmental +judgments +judgmetic +judgship +judy +judica +judicable +judical +judicata +judicate +judicatio +judication +judicative +judicator +judicatory +judicatorial +judicatories +judicature +judicatures +judice +judices +judicia +judiciable +judicial +judicialis +judiciality +judicialize +judicialized +judicializing +judicially +judicialness +judiciary +judiciaries +judiciarily +judicious +judiciously +judiciousness +judicium +judith +judo +judogi +judoist +judoists +judoka +judokas +judophobia +judophobism +judos +jueces +juergen +juffer +jufti +jufts +jug +juga +jugal +jugale +jugatae +jugate +jugated +jugation +juger +jugerum +jugful +jugfuls +jugged +jugger +juggernaut +juggernautish +juggernauts +jugging +juggins +jugginses +juggle +juggled +jugglement +juggler +jugglery +juggleries +jugglers +juggles +juggling +jugglingly +jugglings +jughead +jugheads +juglandaceae +juglandaceous +juglandales +juglandin +juglans +juglar +juglone +jugoslav +jugs +jugsful +jugula +jugular +jugulares +jugulary +jugulars +jugulate +jugulated +jugulates +jugulating +jugulation +jugulum +jugum +jugums +jugurthine +juha +juyas +juice +juiced +juiceful +juicehead +juiceless +juicelessness +juicer +juicers +juices +juicy +juicier +juiciest +juicily +juiciness +juicing +juise +jujitsu +jujitsus +juju +jujube +jujubes +jujuism +jujuisms +jujuist +jujuists +jujus +jujutsu +jujutsus +juke +jukebox +jukeboxes +juked +jukes +juking +julaceous +jule +julep +juleps +jules +juletta +july +julia +julian +juliana +juliane +julianist +julianto +julid +julidae +julidan +julie +julien +julienite +julienne +juliennes +julies +juliet +juliett +julietta +julyflower +julio +juliott +julius +juloid +juloidea +juloidian +julole +julolidin +julolidine +julolin +juloline +julus +jumada +jumana +jumart +jumba +jumbal +jumbals +jumby +jumbie +jumble +jumbled +jumblement +jumbler +jumblers +jumbles +jumbly +jumbling +jumblingly +jumbo +jumboesque +jumboism +jumbos +jumbuck +jumbucks +jumelle +jument +jumentous +jumfru +jumillite +jumma +jump +jumpable +jumped +jumper +jumperism +jumpers +jumpy +jumpier +jumpiest +jumpily +jumpiness +jumping +jumpingly +jumpmaster +jumpness +jumpoff +jumpoffs +jumprock +jumprocks +jumps +jumpscrape +jumpseed +jumpsome +jumpsuit +jumpsuits +jun +junc +juncaceae +juncaceous +juncaginaceae +juncaginaceous +juncagineous +juncat +junciform +juncite +junco +juncoes +juncoides +juncos +juncous +junction +junctional +junctions +junctive +junctly +junctor +junctural +juncture +junctures +juncus +jundy +jundie +jundied +jundies +jundying +june +juneating +juneau +juneberry +junebud +junectomy +junefish +juneflower +jungermannia +jungermanniaceae +jungermanniaceous +jungermanniales +jungian +jungle +jungled +junglegym +jungles +jungleside +junglewards +junglewood +jungli +jungly +junglier +jungliest +juniata +junior +juniorate +juniority +juniors +juniorship +juniper +juniperaceae +junipers +juniperus +junius +junk +junkboard +junkdealer +junked +junker +junkerdom +junkerish +junkerism +junkers +junket +junketed +junketeer +junketeers +junketer +junketers +junketing +junkets +junketter +junky +junkyard +junkyards +junkie +junkier +junkies +junkiest +junking +junkman +junkmen +junks +juno +junoesque +junonia +junonian +junt +junta +juntas +junto +juntos +jupard +jupati +jupe +jupes +jupiter +jupon +jupons +jur +jura +jural +jurally +jurament +juramenta +juramentado +juramentados +juramental +juramentally +juramentum +jurane +jurant +jurants +jurara +jurare +jurassic +jurat +jurata +juration +jurative +jurator +juratory +juratorial +jurats +jure +jurel +jurels +jurevis +juri +jury +juridic +juridical +juridically +juridicial +juridicus +juries +juryless +juryman +jurymen +juring +juryrigged +juris +jurisconsult +jurisdiction +jurisdictional +jurisdictionalism +jurisdictionally +jurisdictions +jurisdictive +jurisp +jurisprude +jurisprudence +jurisprudent +jurisprudential +jurisprudentialist +jurisprudentially +jurist +juristic +juristical +juristically +jurists +jurywoman +jurywomen +juror +jurors +jurupaite +jus +juslik +juslted +jusquaboutisme +jusquaboutist +jussal +jussel +jusshell +jussi +jussiaea +jussiaean +jussieuan +jussion +jussive +jussives +jussory +just +justaucorps +justed +justen +juster +justers +justest +justice +justiced +justicehood +justiceless +justicelike +justicer +justices +justiceship +justiceweed +justicia +justiciability +justiciable +justicial +justiciar +justiciary +justiciaries +justiciaryship +justiciarship +justiciatus +justicier +justicies +justicing +justico +justicoat +justifably +justify +justifiability +justifiable +justifiableness +justifiably +justification +justifications +justificative +justificator +justificatory +justified +justifiedly +justifier +justifiers +justifies +justifying +justifyingly +justin +justina +justine +justing +justinian +justinianeus +justinianian +justinianist +justitia +justle +justled +justler +justles +justly +justling +justment +justments +justness +justnesses +justo +justs +justus +jut +jute +jutelike +jutes +jutic +jutish +jutka +jutlander +jutlandish +juts +jutted +jutty +juttied +jutties +juttying +jutting +juttingly +juturna +juv +juvavian +juvenal +juvenalian +juvenals +juvenate +juvenescence +juvenescent +juvenile +juvenilely +juvenileness +juveniles +juvenilia +juvenilify +juvenilism +juvenility +juvenilities +juvenilize +juvenocracy +juvenolatry +juvent +juventas +juventude +juverna +juvia +juvite +juwise +juxta +juxtalittoral +juxtamarine +juxtapyloric +juxtapose +juxtaposed +juxtaposes +juxtaposing +juxtaposit +juxtaposition +juxtapositional +juxtapositions +juxtapositive +juxtaspinal +juxtaterrestrial +juxtatropical +juza +jwahar +k +ka +kaaba +kaama +kaas +kaataplectic +kab +kabab +kababish +kababs +kabaya +kabayas +kabaka +kabakas +kabala +kabalas +kabar +kabaragoya +kabard +kabardian +kabars +kabassou +kabbala +kabbalah +kabbalahs +kabbalas +kabbeljaws +kabel +kabeljou +kabeljous +kaberu +kabiet +kabiki +kabikis +kabyle +kabirpanthi +kabistan +kabob +kabobs +kabonga +kabs +kabuki +kabukis +kabuli +kabuzuchi +kacha +kachari +kachcha +kachin +kachina +kachinas +kadaga +kadaya +kadayan +kadarite +kadder +kaddish +kaddishes +kaddishim +kadein +kadi +kadikane +kadine +kadis +kadischi +kadish +kadishim +kadmi +kados +kadsura +kadu +kae +kaempferol +kaes +kaf +kafa +kaferita +kaffeeklatsch +kaffiyeh +kaffiyehs +kaffir +kaffirs +kaffraria +kaffrarian +kafila +kafir +kafiri +kafirin +kafirs +kafiz +kafka +kafkaesque +kafta +kaftan +kaftans +kago +kagos +kagu +kagura +kagus +kaha +kahala +kahar +kahau +kahawai +kahikatea +kahili +kahu +kahuna +kahunas +kai +kay +kaiak +kayak +kayaker +kayakers +kaiaks +kayaks +kayan +kayasth +kayastha +kaibab +kaibartha +kaid +kaif +kaifs +kaik +kaikara +kaikawaka +kail +kayles +kailyard +kailyarder +kailyardism +kailyards +kails +kaimakam +kaiman +kaimo +kain +kainah +kainga +kaingin +kainyn +kainit +kainite +kainites +kainits +kainogenesis +kainozoic +kains +kainsi +kayo +kayoed +kayoes +kayoing +kayos +kairin +kairine +kairolin +kairoline +kairos +kairotic +kays +kaiser +kaiserdom +kaiserin +kaiserins +kaiserism +kaisers +kaisership +kaitaka +kaithi +kaivalya +kayvan +kayward +kaiwhiria +kaiwi +kaj +kajar +kajawah +kajeput +kajeputs +kajugaru +kaka +kakan +kakapo +kakapos +kakar +kakarali +kakaralli +kakariki +kakas +kakatoe +kakatoidae +kakawahie +kakemono +kakemonos +kaki +kakidrosis +kakis +kakistocracy +kakistocracies +kakistocratical +kakkak +kakke +kakogenic +kakorraphiaphobia +kakortokite +kakotopia +kal +kala +kalaazar +kalach +kaladana +kalam +kalamalo +kalamansanai +kalamian +kalamkari +kalams +kalan +kalanchoe +kalandariyah +kalang +kalapooian +kalashnikov +kalasie +kalathoi +kalathos +kaldani +kale +kaleege +kaleyard +kaleyards +kaleidescope +kaleidophon +kaleidophone +kaleidoscope +kaleidoscopes +kaleidoscopic +kaleidoscopical +kaleidoscopically +kalekah +kalema +kalend +kalendae +kalendar +kalendarial +kalends +kales +kalewife +kalewives +kali +kalian +kaliana +kalians +kaliborite +kalidium +kalif +kalifate +kalifates +kaliform +kalifs +kaligenous +kalimba +kalimbas +kalymmaukion +kalymmocyte +kalinga +kalinite +kaliophilite +kalipaya +kaliph +kaliphs +kalyptra +kalyptras +kalis +kalysis +kalispel +kalium +kaliums +kalkvis +kallah +kallege +kallidin +kallidins +kallilite +kallima +kallitype +kalmarian +kalmia +kalmias +kalmuck +kalmuk +kalo +kalogeros +kalokagathia +kalon +kalong +kalongs +kalpa +kalpak +kalpaks +kalpas +kalpis +kalsomine +kalsomined +kalsominer +kalsomining +kaltemail +kalumpang +kalumpit +kalunti +kalwar +kam +kama +kamaaina +kamaainas +kamachi +kamachile +kamacite +kamacites +kamahi +kamala +kamalas +kamaloka +kamanichile +kamansi +kamao +kamares +kamarezite +kamarupa +kamarupic +kamas +kamasin +kamass +kamassi +kamavachara +kamba +kambal +kamboh +kambou +kamchadal +kamchatkan +kame +kameel +kameeldoorn +kameelthorn +kamel +kamelaukia +kamelaukion +kamelaukions +kamelkia +kamerad +kames +kami +kamian +kamias +kamichi +kamiya +kamik +kamika +kamikaze +kamikazes +kamiks +kamis +kamleika +kammalan +kammererite +kammeu +kammina +kamperite +kampylite +kampong +kampongs +kampseen +kamptomorph +kamptulicon +kampuchea +kamseen +kamseens +kamsin +kamsins +kan +kana +kanae +kanaff +kanagi +kanaima +kanaka +kanamycin +kanamono +kanap +kanara +kanarese +kanari +kanas +kanat +kanauji +kanawari +kanawha +kanchil +kand +kande +kandelia +kandjar +kandol +kane +kaneelhart +kaneh +kanephore +kanephoros +kanes +kaneshite +kanesian +kang +kanga +kangayam +kangani +kangany +kangaroo +kangarooer +kangarooing +kangaroolike +kangaroos +kangla +kangli +kangri +kanyaw +kanji +kanjis +kankanai +kankedort +kankie +kankrej +kannada +kannen +kannu +kannume +kanone +kanoon +kanred +kans +kansa +kansan +kansans +kansas +kant +kantar +kantars +kantela +kantele +kanteles +kanteletar +kanten +kanthan +kantharoi +kantharos +kantian +kantianism +kantians +kantiara +kantism +kantist +kantry +kanuka +kanuri +kanwar +kanzu +kaoliang +kaoliangs +kaolin +kaolinate +kaoline +kaolines +kaolinic +kaolinisation +kaolinise +kaolinised +kaolinising +kaolinite +kaolinization +kaolinize +kaolinized +kaolinizing +kaolins +kaon +kaons +kapa +kapai +kapas +kapeika +kapelle +kapellmeister +kaph +kaphs +kapok +kapoks +kapote +kapp +kappa +kapparah +kappas +kappe +kappellmeister +kappie +kappland +kapuka +kapur +kaput +kaputt +karabagh +karabiner +karaburan +karacul +karagan +karaya +karaism +karaite +karaitism +karaka +karakatchan +karakul +karakule +karakuls +karakurt +karamojo +karamu +karanda +karaoke +karat +karatas +karate +karateist +karates +karats +karatto +karbi +karch +kareao +kareau +kareeta +karel +karela +karelian +karen +karewa +karez +karharbari +kari +karyaster +karyatid +karyenchyma +karinghota +karyochylema +karyochrome +karyocyte +karyogamy +karyogamic +karyokinesis +karyokinetic +karyolymph +karyolysidae +karyolysis +karyolysus +karyolitic +karyolytic +karyology +karyologic +karyological +karyologically +karyomere +karyomerite +karyomicrosome +karyomitoic +karyomitome +karyomiton +karyomitosis +karyomitotic +karyon +karyopyknosis +karyoplasm +karyoplasma +karyoplasmatic +karyoplasmic +karyorrhexis +karyoschisis +karyosystematics +karyosoma +karyosome +karyotin +karyotins +karyotype +karyotypic +karyotypical +karite +kariti +karl +karling +karluk +karma +karmadharaya +karmas +karmathian +karmic +karmouth +karn +karns +karo +karoo +karoos +karos +kaross +karosses +karou +karpas +karree +karren +karri +karroo +karroos +karrusel +karsha +karshuni +karst +karstenite +karstic +karsts +kart +kartel +karthli +karting +kartings +kartometer +kartos +karts +kartvel +kartvelian +karuna +karval +karvar +karwar +karwinskia +kas +kasa +kasbah +kasbeke +kascamiol +kaser +kasha +kashan +kashas +kasher +kashered +kashering +kashers +kashga +kashi +kashyapa +kashim +kashima +kashira +kashmir +kashmiri +kashmirian +kashmirs +kashoubish +kashrut +kashruth +kashruths +kashruts +kashube +kashubian +kasida +kasikumuk +kaska +kaskaskia +kasm +kasolite +kassabah +kassak +kassite +kassu +kastura +kasubian +kat +katabanian +katabases +katabasis +katabatic +katabella +katabolic +katabolically +katabolism +katabolite +katabolize +katabothra +katabothron +katachromasis +katacrotic +katacrotism +katagelophobia +katagenesis +katagenetic +katakana +katakanas +katakinesis +katakinetic +katakinetomer +katakinetomeric +katakiribori +katalase +katalyses +katalysis +katalyst +katalytic +katalyze +katalyzed +katalyzer +katalyzing +katamorphic +katamorphism +katana +kataphoresis +kataphoretic +kataphoric +kataphrenia +kataplasia +kataplectic +kataplexy +katar +katastate +katastatic +katat +katathermometer +katatype +katatonia +katatonic +katchina +katchung +katcina +kate +kath +katha +kathak +kathal +katharevusa +katharina +katharine +katharometer +katharses +katharsis +kathartic +kathemoglobin +kathenotheism +katherine +kathy +kathisma +kathismata +kathleen +kathodal +kathode +kathodes +kathodic +katholikoi +katholikos +katholikoses +kathopanishad +kathryn +katy +katydid +katydids +katie +katik +katinka +kation +kations +katipo +katipunan +katipuneros +katjepiering +katmon +katogle +katrina +katrine +katrinka +kats +katsunkel +katsup +katsuwonidae +katuka +katukina +katun +katurai +katzenjammer +kauch +kauravas +kauri +kaury +kauries +kauris +kava +kavaic +kavas +kavass +kavasses +kaver +kavi +kavika +kaw +kawaka +kawakawa +kawchodinne +kawika +kazachki +kazachok +kazak +kazatske +kazatski +kazatsky +kazatskies +kazi +kazoo +kazoos +kazuhiro +kb +kbar +kbps +kc +kcal +kea +keach +keacorn +keap +kearn +keas +keat +keats +keatsian +keawe +keb +kebab +kebabs +kebar +kebars +kebby +kebbie +kebbies +kebbock +kebbocks +kebbuck +kebbucks +kebyar +keblah +keblahs +kebob +kebobs +kechel +kechumaran +keck +kecked +kecky +kecking +keckle +keckled +keckles +keckling +kecks +kecksy +kecksies +ked +kedar +kedarite +keddah +keddahs +kedge +kedged +kedger +kedgeree +kedgerees +kedges +kedgy +kedging +kedjave +kedlock +kedushah +kedushshah +kee +keech +keef +keefs +keek +keeked +keeker +keekers +keeking +keeks +keel +keelage +keelages +keelback +keelbill +keelbird +keelblock +keelboat +keelboatman +keelboatmen +keelboats +keeldrag +keeled +keeler +keelfat +keelhale +keelhaled +keelhales +keelhaling +keelhaul +keelhauled +keelhauling +keelhauls +keelie +keeling +keelivine +keelless +keelman +keelrake +keels +keelson +keelsons +keelvat +keen +keena +keened +keener +keeners +keenest +keening +keenly +keenness +keennesses +keens +keep +keepable +keeper +keeperess +keepering +keeperless +keepers +keepership +keeping +keepings +keepnet +keeps +keepsake +keepsakes +keepsaky +keepworthy +keerie +keerogue +kees +keeshond +keeshonden +keeshonds +keeslip +keest +keester +keesters +keet +keets +keeve +keeves +keewatin +kef +keffel +keffiyeh +kefiatoid +kefifrel +kefir +kefiric +kefirs +kefs +kefti +keftian +keftiu +keg +kegeler +kegelers +kegful +keggmiengg +kegler +keglers +kegling +keglings +kegs +kehaya +kehillah +kehilloth +kehoeite +key +keyage +keyaki +keyboard +keyboarded +keyboarder +keyboarding +keyboards +keybutton +keid +keyed +keyhole +keyholes +keying +keyless +keylet +keilhauite +keylock +keyman +keymen +keymove +keynesian +keynesianism +keynote +keynoted +keynoter +keynoters +keynotes +keynoting +keypad +keypads +keypress +keypresses +keypunch +keypunched +keypuncher +keypunchers +keypunches +keypunching +keir +keirs +keys +keyseat +keyseater +keyserlick +keyset +keysets +keyslot +keysmith +keist +keister +keyster +keisters +keysters +keystone +keystoned +keystoner +keystones +keystroke +keystrokes +keita +keith +keitloa +keitloas +keyway +keyways +keywd +keyword +keywords +keywrd +kekchi +kekotene +kekuna +kelchin +kelchyn +keld +kelder +kele +kelebe +kelectome +keleh +kelek +kelep +kelia +kelima +kelyphite +kelk +kell +kella +kelleg +kellegk +kellet +kelly +kellia +kellick +kellies +kellion +kellys +kellock +kellupweed +keloid +keloidal +keloids +kelotomy +kelotomies +kelowna +kelp +kelped +kelper +kelpfish +kelpfishes +kelpy +kelpie +kelpies +kelping +kelps +kelpware +kelpwort +kelson +kelsons +kelt +kelter +kelters +kelty +keltic +keltics +keltie +keltoi +kelts +kelvin +kelvins +kemal +kemalism +kemalist +kemancha +kemb +kemelin +kemp +kempas +kemperyman +kempy +kempite +kemple +kemps +kempster +kempt +kemptken +kempts +ken +kenaf +kenafs +kenai +kenareh +kench +kenches +kend +kendal +kendy +kendir +kendyr +kendna +kendo +kendoist +kendos +kenelm +kenema +kenya +kenyan +kenyans +kenipsim +kenyte +kenlore +kenmark +kenmpy +kenn +kennebec +kennebecker +kennebunker +kenned +kennedy +kennedya +kennel +kenneled +kenneling +kennell +kennelled +kennelly +kennelling +kennelman +kennels +kenner +kennet +kenneth +kenny +kenning +kennings +kenningwort +kenno +keno +kenogenesis +kenogenetic +kenogenetically +kenogeny +kenophobia +kenos +kenosis +kenosises +kenotic +kenoticism +kenoticist +kenotism +kenotist +kenotoxin +kenotron +kenotrons +kens +kenscoff +kenseikai +kensington +kensitite +kenspac +kenspeck +kenspeckle +kenspeckled +kent +kentallenite +kente +kentia +kenticism +kentish +kentishman +kentle +kentledge +kenton +kentrogon +kentrolite +kentucky +kentuckian +kentuckians +keogenesis +keout +kep +kephalin +kephalins +kephir +kepi +kepis +keplerian +kepped +keppen +kepping +keps +kept +ker +keracele +keraci +keralite +keramic +keramics +kerana +keraphyllocele +keraphyllous +kerasin +kerasine +kerat +keratalgia +keratectacia +keratectasia +keratectomy +keratectomies +keraterpeton +keratin +keratinization +keratinize +keratinized +keratinizing +keratinoid +keratinophilic +keratinose +keratinous +keratins +keratitis +keratoangioma +keratocele +keratocentesis +keratocni +keratoconi +keratoconjunctivitis +keratoconus +keratocricoid +keratode +keratoderma +keratodermia +keratogenic +keratogenous +keratoglobus +keratoglossus +keratohelcosis +keratohyal +keratoid +keratoidea +keratoiritis +keratol +keratoleukoma +keratolysis +keratolytic +keratoma +keratomalacia +keratomas +keratomata +keratome +keratometer +keratometry +keratometric +keratomycosis +keratoncus +keratonyxis +keratonosus +keratophyr +keratophyre +keratoplasty +keratoplastic +keratoplasties +keratorrhexis +keratoscope +keratoscopy +keratose +keratoses +keratosic +keratosis +keratosropy +keratotic +keratotome +keratotomy +keratotomies +keratto +keraulophon +keraulophone +keraunia +keraunion +keraunograph +keraunography +keraunographic +keraunophobia +keraunophone +keraunophonic +keraunoscopy +keraunoscopia +kerb +kerbaya +kerbed +kerbing +kerbs +kerbstone +kerch +kercher +kerchief +kerchiefed +kerchiefs +kerchieft +kerchieves +kerchoo +kerchug +kerchunk +kerectomy +kerel +keres +keresan +kerewa +kerf +kerfed +kerfing +kerflap +kerflop +kerflummox +kerfs +kerfuffle +kerygma +kerygmata +kerygmatic +kerykeion +kerystic +kerystics +kerite +keryx +kerl +kerman +kermanji +kermanshah +kermes +kermesic +kermesite +kermess +kermesses +kermis +kermises +kern +kerne +kerned +kernel +kerneled +kerneling +kernella +kernelled +kernelless +kernelly +kernelling +kernels +kerner +kernes +kernetty +kerning +kernish +kernite +kernites +kernoi +kernos +kerns +kero +kerogen +kerogens +kerolite +keros +kerosene +kerosenes +kerosine +kerosines +kerplunk +kerri +kerry +kerria +kerrias +kerrie +kerries +kerrikerri +kerril +kerrite +kers +kersanne +kersantite +kersey +kerseymere +kerseynette +kerseys +kerslam +kerslosh +kersmash +kerugma +kerugmata +keruing +kerve +kerwham +kesar +keslep +kesse +kesslerman +kestrel +kestrelkestrels +kestrels +ket +keta +ketal +ketapang +ketatin +ketazine +ketch +ketchcraft +ketches +ketchy +ketchup +ketchups +ketembilla +keten +ketene +ketenes +kethib +kethibh +ketyl +ketimid +ketimide +ketimin +ketimine +ketine +ketipate +ketipic +ketmie +keto +ketogen +ketogenesis +ketogenetic +ketogenic +ketoheptose +ketohexose +ketoketene +ketol +ketole +ketolyses +ketolysis +ketolytic +ketonaemia +ketone +ketonemia +ketones +ketonic +ketonimid +ketonimide +ketonimin +ketonimine +ketonization +ketonize +ketonuria +ketose +ketoses +ketoside +ketosis +ketosteroid +ketosuccinic +ketotic +ketoxime +kette +ketty +ketting +kettle +kettlecase +kettledrum +kettledrummer +kettledrums +kettleful +kettlemaker +kettlemaking +kettler +kettles +kettrin +ketu +ketuba +ketubah +ketubahs +ketuboth +ketupa +ketway +keup +keuper +keurboom +kevalin +kevan +kevazingo +kevel +kevelhead +kevels +kever +kevil +kevils +kevin +kevyn +kevutzah +kevutzoth +keweenawan +keweenawite +kewpie +kex +kexes +kexy +kg +kgf +kgr +kha +khaddar +khaddars +khadi +khadis +khafajeh +khagiarite +khahoon +khaya +khayal +khaiki +khair +khaja +khajur +khakanship +khakham +khaki +khakied +khakilike +khakis +khalal +khalat +khaldian +khalif +khalifa +khalifas +khalifat +khalifate +khalifs +khalkha +khalsa +khalsah +khamal +khami +khamseen +khamseens +khamsin +khamsins +khamti +khan +khanate +khanates +khanda +khandait +khanga +khanjar +khanjee +khankah +khans +khansama +khansamah +khansaman +khanum +khar +kharaj +kharia +kharif +kharijite +kharoshthi +kharouba +kharroubah +khartoum +khartoumer +kharua +kharwa +kharwar +khasa +khasi +khass +khat +khatib +khatin +khatri +khats +khatti +khattish +khazar +khazarian +khazen +khazenim +khazens +kheda +khedah +khedahs +khedas +khediva +khedival +khedivate +khedive +khedives +khediviah +khedivial +khediviate +khella +khellin +khepesh +kherwari +kherwarian +khesari +khet +khevzur +khi +khidmatgar +khidmutgar +khila +khilat +khir +khirka +khirkah +khirkahs +khis +khitan +khitmatgar +khitmutgar +khivan +khlysti +khmer +khodja +khoja +khojah +khoka +khokani +khond +khorassan +khot +khotan +khotana +khowar +khrushchev +khu +khuai +khubber +khud +khula +khulda +khuskhus +khussak +khutba +khutbah +khutuktu +khuzi +khvat +khwarazmian +ki +ky +kiaat +kiabooca +kyabuka +kiack +kyack +kyacks +kyah +kyak +kiaki +kialee +kialkee +kiang +kyang +kiangan +kiangs +kyanise +kyanised +kyanises +kyanising +kyanite +kyanites +kyanization +kyanize +kyanized +kyanizes +kyanizing +kyanol +kyar +kyars +kyat +kyathoi +kyathos +kyats +kiaugh +kiaughs +kyaung +kibbeh +kibber +kibble +kibbled +kibbler +kibblerman +kibbles +kibbling +kibbutz +kibbutzim +kibbutznik +kibe +kibei +kybele +kibes +kiby +kibitka +kibitz +kibitzed +kibitzer +kibitzers +kibitzes +kibitzing +kibla +kiblah +kiblahs +kiblas +kibosh +kiboshed +kiboshes +kiboshing +kibsey +kichel +kick +kickable +kickapoo +kickback +kickbacks +kickball +kickboard +kickdown +kicked +kickee +kicker +kickers +kicky +kickier +kickiest +kicking +kickish +kickless +kickoff +kickoffs +kickout +kickplate +kicks +kickseys +kickshaw +kickshaws +kicksies +kicksorter +kickstand +kickstands +kicktail +kickup +kickups +kickwheel +kickxia +kid +kyd +kidang +kidcote +kidded +kidder +kidderminster +kidders +kiddy +kiddie +kiddier +kiddies +kidding +kiddingly +kiddish +kiddishness +kiddle +kiddo +kiddoes +kiddos +kiddush +kiddushes +kiddushin +kidhood +kidlet +kidlike +kidling +kidnap +kidnaped +kidnapee +kidnaper +kidnapers +kidnaping +kidnapped +kidnappee +kidnapper +kidnappers +kidnapping +kidnappings +kidnaps +kidney +kidneylike +kidneylipped +kidneyroot +kidneys +kidneywort +kids +kidskin +kidskins +kidsman +kidvid +kie +kye +kief +kiefekil +kieffer +kiefs +kieye +kiekie +kiel +kielbasa +kielbasas +kielbasi +kielbasy +kier +kieran +kiers +kieselguhr +kieselgur +kieserite +kiesselguhr +kiesselgur +kiesserite +kiester +kiesters +kiestless +kiev +kif +kifs +kiho +kiyas +kiyi +kikar +kikatsik +kikawaeo +kike +kyke +kikes +kiki +kikki +kyklopes +kyklops +kikoi +kikongo +kikori +kiku +kikuel +kikuyu +kikumon +kil +kyl +kiladja +kilah +kilampere +kilan +kilbrickenite +kildee +kilderkin +kyle +kileh +kiley +kileys +kilerg +kilhamite +kilhig +kiliare +kylie +kylies +kilij +kylikec +kylikes +kilim +kilims +kylin +kylite +kylix +kilkenny +kill +killable +killadar +killarney +killas +killbuck +killcalf +killcrop +killcu +killdee +killdeer +killdeers +killdees +killed +killeekillee +killeen +killer +killers +killese +killy +killick +killickinnic +killickinnick +killicks +killifish +killifishes +killig +killikinic +killikinick +killing +killingly +killingness +killings +killinite +killjoy +killjoys +killoch +killock +killocks +killogie +killow +kills +killweed +killwort +kilmarnock +kiln +kilned +kilneye +kilnhole +kilning +kilnman +kilnrib +kilns +kilnstick +kilntree +kilo +kylo +kiloampere +kilobar +kilobars +kilobit +kilobyte +kilobytes +kilobits +kiloblock +kilobuck +kilocalorie +kilocycle +kilocycles +kilocurie +kilodyne +kyloe +kilogauss +kilograin +kilogram +kilogramme +kilogrammetre +kilograms +kilohertz +kilohm +kilojoule +kiloline +kiloliter +kilolitre +kilolumen +kilom +kilomegacycle +kilometer +kilometers +kilometrage +kilometre +kilometric +kilometrical +kilomole +kilomoles +kilooersted +kiloparsec +kilopoise +kilopound +kilorad +kilorads +kilos +kilostere +kiloton +kilotons +kilovar +kilovolt +kilovoltage +kilovolts +kiloware +kilowatt +kilowatts +kiloword +kilp +kilt +kilted +kilter +kilters +kilty +kiltie +kilties +kilting +kiltings +kiltlike +kilts +kiluba +kiluck +kim +kymation +kymatology +kymbalon +kimbang +kimberly +kimberlin +kimberlite +kimbo +kimbundu +kimchee +kimchi +kimeridgian +kimigayo +kimmer +kimmeridge +kimmo +kimnel +kymnel +kymogram +kymograms +kymograph +kymography +kymographic +kimono +kimonoed +kimonos +kymric +kimura +kin +kina +kinabulu +kinaestheic +kinaesthesia +kinaesthesias +kinaesthesis +kinaesthetic +kinaesthetically +kinah +kinase +kinases +kinboot +kinbot +kinbote +kinch +kinchin +kinchinmort +kincob +kind +kindal +kinder +kindergarten +kindergartener +kindergartening +kindergartens +kindergartner +kindergartners +kinderhook +kindest +kindheart +kindhearted +kindheartedly +kindheartedness +kindjal +kindle +kindled +kindler +kindlers +kindles +kindlesome +kindless +kindlessly +kindly +kindlier +kindliest +kindlily +kindliness +kindling +kindlings +kindness +kindnesses +kindred +kindredless +kindredly +kindredness +kindreds +kindredship +kindrend +kinds +kine +kinema +kinemas +kinematic +kinematical +kinematically +kinematics +kinematograph +kinematographer +kinematography +kinematographic +kinematographical +kinematographically +kinemometer +kineplasty +kinepox +kines +kinesalgia +kinescope +kinescoped +kinescopes +kinescoping +kineses +kinesiatric +kinesiatrics +kinesic +kinesically +kinesics +kinesimeter +kinesiology +kinesiologic +kinesiological +kinesiologies +kinesiometer +kinesipathy +kinesis +kinesitherapy +kinesodic +kinestheses +kinesthesia +kinesthesias +kinesthesis +kinesthetic +kinesthetically +kinetic +kinetical +kinetically +kineticism +kineticist +kinetics +kinetin +kinetins +kinetochore +kinetogenesis +kinetogenetic +kinetogenetically +kinetogenic +kinetogram +kinetograph +kinetographer +kinetography +kinetographic +kinetomer +kinetomeric +kinetonema +kinetonucleus +kinetophobia +kinetophone +kinetophonograph +kinetoplast +kinetoplastic +kinetoscope +kinetoscopic +kinetosis +kinetosome +kinfolk +kinfolks +king +kingbird +kingbirds +kingbolt +kingbolts +kingcob +kingcraft +kingcup +kingcups +kingdom +kingdomed +kingdomful +kingdomless +kingdoms +kingdomship +kinged +kingfish +kingfisher +kingfishers +kingfishes +kinghead +kinghood +kinghoods +kinghorn +kinghunter +kinging +kingklip +kingless +kinglessness +kinglet +kinglets +kingly +kinglier +kingliest +kinglihood +kinglike +kinglily +kingliness +kingling +kingmaker +kingmaking +kingpiece +kingpin +kingpins +kingpost +kingposts +kingrow +kings +kingship +kingships +kingside +kingsides +kingsize +kingsman +kingsnake +kingston +kingu +kingweed +kingwood +kingwoods +kinhin +kinic +kinin +kininogen +kininogenic +kinins +kinipetu +kink +kinkable +kinkaider +kinkajou +kinkajous +kinkcough +kinked +kinker +kinkhab +kinkhaust +kinkhost +kinky +kinkier +kinkiest +kinkily +kinkiness +kinking +kinkle +kinkled +kinkly +kinks +kinksbush +kinless +kinnery +kinnikinic +kinnikinick +kinnikinnic +kinnikinnick +kinnikinnik +kinnor +kino +kinofluous +kinology +kinone +kinoo +kinoos +kinoplasm +kinoplasmic +kinorhyncha +kinos +kinospore +kinosternidae +kinosternon +kinot +kinotannic +kins +kinsen +kinsfolk +kinship +kinships +kinsman +kinsmanly +kinsmanship +kinsmen +kinspeople +kinswoman +kinswomen +kintar +kintyre +kintlage +kintra +kintry +kinura +kynurenic +kynurin +kynurine +kioea +kioko +kionectomy +kionectomies +kionotomy +kionotomies +kyoodle +kyoodled +kyoodling +kiosk +kiosks +kyoto +kiotome +kiotomy +kiotomies +kiowa +kioway +kiowan +kip +kipage +kipchak +kipe +kipfel +kyphoscoliosis +kyphoscoliotic +kyphoses +kyphosidae +kyphosis +kyphotic +kiplingese +kiplingism +kippage +kipped +kippeen +kippen +kipper +kippered +kipperer +kippering +kippers +kippy +kippin +kipping +kippur +kips +kipsey +kipskin +kipskins +kipuka +kiranti +kirby +kirbies +kirghiz +kirghizean +kiri +kyrial +kyriale +kyrie +kyrielle +kyries +kirigami +kirigamis +kirillitsa +kirimon +kyrine +kyriologic +kyrios +kirk +kirker +kirkyard +kirkify +kirking +kirkinhead +kirklike +kirkman +kirkmen +kirks +kirkton +kirktown +kirkward +kirman +kirmess +kirmesses +kirmew +kirn +kirned +kirning +kirns +kirombo +kirpan +kirsch +kirsches +kirschwasser +kirsen +kirsten +kirsty +kirtle +kirtled +kirtles +kirundi +kirve +kirver +kisaeng +kisan +kisang +kischen +kyschty +kyschtymite +kish +kishambala +kishen +kishy +kishka +kishkas +kishke +kishkes +kishon +kiskadee +kiskatom +kiskatomas +kiskitom +kiskitomas +kislev +kismat +kismats +kismet +kismetic +kismets +kisra +kiss +kissability +kissable +kissableness +kissably +kissage +kissar +kissed +kissel +kisser +kissers +kisses +kissy +kissing +kissingly +kissproof +kisswise +kist +kistful +kistfuls +kists +kistvaen +kiswa +kiswah +kiswahili +kit +kitab +kitabi +kitabis +kitalpha +kitamat +kitambilla +kitan +kitar +kitbag +kitcat +kitchen +kitchendom +kitchener +kitchenet +kitchenette +kitchenettes +kitchenful +kitcheny +kitchenless +kitchenmaid +kitchenman +kitchenry +kitchens +kitchenward +kitchenwards +kitchenware +kitchenwife +kitchie +kitching +kite +kyte +kited +kiteflier +kiteflying +kitelike +kitenge +kiter +kiters +kites +kytes +kith +kithara +kitharas +kithe +kythe +kithed +kythed +kithes +kythes +kithing +kything +kithless +kithlessness +kithogue +kiths +kiting +kitish +kitysol +kitkahaxki +kitkehahki +kitling +kitlings +kitlope +kitman +kitmudgar +kytoon +kits +kitsch +kitsches +kitschy +kittar +kittatinny +kitted +kittel +kitten +kittendom +kittened +kittenhearted +kittenhood +kittening +kittenish +kittenishly +kittenishness +kittenless +kittenlike +kittens +kittenship +kitter +kittereen +kitthoge +kitty +kittycorner +kittycornered +kittie +kitties +kitting +kittisol +kittysol +kittiwake +kittle +kittled +kittlepins +kittler +kittles +kittlest +kittly +kittling +kittlish +kittock +kittool +kittul +kitunahan +kyu +kyung +kyurin +kyurinish +kiutle +kiva +kivas +kiver +kivikivi +kivu +kiwach +kiwai +kiwanian +kiwanis +kiwi +kiwikiwi +kiwis +kizil +kizilbash +kjeldahl +kjeldahlization +kjeldahlize +kl +klaberjass +klafter +klaftern +klam +klamath +klan +klangfarbe +klanism +klans +klansman +klanswoman +klaprotholite +klaskino +klatch +klatches +klatsch +klatsches +klaudia +klaus +klavern +klaverns +klavier +klaxon +klaxons +kleagle +kleagles +klebsiella +kleeneboc +kleenebok +kleenex +kleig +kleinian +kleinite +kleistian +klendusic +klendusity +klendusive +klepht +klephtic +klephtism +klephts +kleptic +kleptistic +kleptomania +kleptomaniac +kleptomaniacal +kleptomaniacs +kleptomanist +kleptophobia +klesha +klezmer +klick +klicket +klieg +klikitat +kling +klingsor +klino +klip +klipbok +klipdachs +klipdas +klipfish +kliphaas +klippe +klippen +klipspringer +klismoi +klismos +klister +klystron +klystrons +kln +klockmannite +kloesse +klom +klondike +klondiker +klong +klongs +klooch +kloof +kloofs +klootch +klootchman +klop +klops +klosh +klosse +klowet +kluck +klucker +kludge +kludged +kludges +kludging +klunk +klutz +klutzes +klutzy +klutzier +klutziest +klutziness +kluxer +klva +km +kmel +kmet +kmole +kn +knab +knabble +knack +knackaway +knackebrod +knacked +knacker +knackery +knackeries +knackers +knacky +knackier +knackiest +knacking +knackish +knacks +knackwurst +knackwursts +knag +knagged +knaggy +knaggier +knaggiest +knaidel +knaidlach +knaydlach +knap +knapbottle +knape +knappan +knappe +knapped +knapper +knappers +knappy +knapping +knappish +knappishly +knapple +knaps +knapsack +knapsacked +knapsacking +knapsacks +knapscap +knapscull +knapweed +knapweeds +knar +knark +knarl +knarle +knarred +knarry +knars +knaster +knatch +knatte +knautia +knave +knavery +knaveries +knaves +knaveship +knavess +knavish +knavishly +knavishness +knaw +knawel +knawels +knead +kneadability +kneadable +kneaded +kneader +kneaders +kneading +kneadingly +kneads +knebelite +knee +kneebrush +kneecap +kneecapping +kneecappings +kneecaps +kneed +kneehole +kneeholes +kneeing +kneel +kneeled +kneeler +kneelers +kneelet +kneeling +kneelingly +kneels +kneepad +kneepads +kneepan +kneepans +kneepiece +knees +kneestone +kneiffia +kneippism +knell +knelled +knelling +knells +knelt +knesset +knet +knetch +knevel +knew +knez +knezi +kniaz +knyaz +kniazi +knyazi +knick +knicker +knickerbocker +knickerbockered +knickerbockers +knickered +knickers +knickknack +knickknackatory +knickknacked +knickknackery +knickknacket +knickknacky +knickknackish +knickknacks +knicknack +knickpoint +knife +knifeboard +knifed +knifeful +knifeless +knifelike +knifeman +knifeproof +knifer +kniferest +knifers +knifes +knifesmith +knifeway +knifing +knifings +knight +knightage +knighted +knightess +knighthead +knighthood +knighthoods +knightia +knighting +knightless +knightly +knightlihood +knightlike +knightliness +knightling +knights +knightship +knightswort +kniphofia +knipperdolling +knish +knishes +knysna +knisteneaux +knit +knitback +knitch +knits +knitster +knittable +knitted +knitter +knitters +knittie +knitting +knittings +knittle +knitwear +knitwears +knitweed +knitwork +knive +knived +knivey +knives +knob +knobbed +knobber +knobby +knobbier +knobbiest +knobbiness +knobbing +knobble +knobbled +knobbler +knobbly +knobblier +knobbliest +knobbling +knobkerry +knobkerrie +knoblike +knobs +knobstick +knobstone +knobular +knobweed +knobwood +knock +knockabout +knockaway +knockdown +knockdowns +knocked +knockemdown +knocker +knockers +knocking +knockings +knockless +knockoff +knockoffs +knockout +knockouts +knocks +knockstone +knockup +knockwurst +knockwursts +knoit +knoll +knolled +knoller +knollers +knolly +knolling +knolls +knop +knopite +knopped +knopper +knoppy +knoppie +knops +knopweed +knorhaan +knorhmn +knorr +knorria +knosp +knosped +knosps +knossian +knot +knotberry +knotgrass +knothead +knothole +knotholes +knothorn +knotless +knotlike +knotroot +knots +knotted +knotter +knotters +knotty +knottier +knottiest +knottily +knottiness +knotting +knotweed +knotweeds +knotwork +knotwort +knout +knouted +knouting +knouts +know +knowability +knowable +knowableness +knowe +knower +knowers +knoweth +knowhow +knowhows +knowing +knowinger +knowingest +knowingly +knowingness +knowings +knowledgable +knowledgableness +knowledgably +knowledge +knowledgeability +knowledgeable +knowledgeableness +knowledgeably +knowledged +knowledgeless +knowledgement +knowledging +known +knownothingism +knowns +knowperts +knows +knox +knoxian +knoxville +knoxvillite +knub +knubby +knubbier +knubbiest +knubbly +knublet +knuckle +knuckleball +knuckleballer +knucklebone +knucklebones +knuckled +knucklehead +knuckleheaded +knuckleheadedness +knuckleheads +knuckler +knucklers +knuckles +knucklesome +knuckly +knucklier +knuckliest +knuckling +knucks +knuclesome +knudsen +knuffe +knulling +knur +knurl +knurled +knurly +knurlier +knurliest +knurlin +knurling +knurls +knurry +knurs +knut +knute +knuth +knutty +ko +koa +koae +koala +koalas +koali +koan +koans +koas +koasati +kob +koban +kobang +kobellite +kobi +kobird +kobold +kobolds +kobong +kobu +kobus +koch +kochab +kochia +kochliarion +koda +kodagu +kodak +kodaked +kodaker +kodaking +kodakist +kodakked +kodakking +kodakry +kodashim +kodiak +kodkod +kodogu +kodro +kodurite +koeberlinia +koeberliniaceae +koeberliniaceous +koechlinite +koeksotenok +koel +koellia +koelreuteria +koels +koenenite +koeri +koff +koft +kofta +koftgar +koftgari +kogai +kogasin +koggelmannetje +kogia +kohathite +kohekohe +koheleth +kohemp +kohen +kohens +kohistani +kohl +kohlan +kohlrabi +kohlrabies +kohls +kohua +koi +koyan +koiari +koibal +koyemshi +koil +koila +koilanaglyphic +koilon +koilonychia +koimesis +koine +koines +koinon +koinonia +koipato +koitapu +kojang +kojiki +kojima +kojiri +kokako +kokam +kokama +kokan +kokanee +kokanees +kokerboom +kokia +kokil +kokila +kokio +koklas +koklass +koko +kokobeh +kokoon +kokoona +kokopu +kokoromiko +kokos +kokowai +kokra +koksaghyz +koksagyz +kokstad +koktaite +koku +kokum +kokumin +kokumingun +kol +kola +kolach +kolacky +kolami +kolarian +kolas +kolattam +koldaji +kolea +koleroga +kolhoz +kolhozes +kolhozy +koli +kolinski +kolinsky +kolinskies +kolis +kolkhos +kolkhoses +kolkhosy +kolkhoz +kolkhozes +kolkhozy +kolkhoznik +kolkka +kolkoz +kolkozes +kolkozy +kollast +kollaster +koller +kollergang +kolmogorov +kolo +kolobia +kolobion +kolobus +kolokolo +kolos +kolskite +kolsun +koltunna +koltunnor +koluschan +kolush +komarch +komati +komatik +komatiks +kombu +kome +komi +kominuter +komitadji +komitaji +kommandatura +kommetje +kommos +komondor +komondoroc +komondorock +komondorok +komondors +kompeni +kompow +komsomol +komtok +kon +kona +konak +konariot +konde +kondo +konfyt +kong +kongo +kongoese +kongolese +kongoni +kongsbergite +kongu +konia +koniaga +konyak +koniga +konilite +konimeter +koninckite +konini +koniology +koniophobia +koniscope +konjak +konkani +konohiki +konomihu +konrad +konseal +konstantin +konstantinos +kontakia +kontakion +koodoo +koodoos +kook +kooka +kookaburra +kookeree +kookery +kooky +kookie +kookier +kookiest +kookiness +kookri +kooks +koolah +koolau +kooletah +kooliman +koolokamba +koolooly +koombar +koomkie +koonti +koopbrief +koorajong +koorg +koorhmn +koorka +koosin +kootcha +kootchar +kootenay +kop +kopagmiut +kopec +kopeck +kopecks +kopek +kopeks +kopfring +koph +kophs +kopi +kopis +kopje +kopjes +kopophobia +koppa +koppas +koppen +koppie +koppies +koppite +koprino +kops +kor +kora +koradji +korah +korahite +korahitic +korai +korait +korakan +koran +korana +koranic +koranist +korari +kordax +kore +korea +korean +koreans +korec +koreci +koreish +koreishite +korero +koreshan +koreshanity +korfball +korhmn +kori +kory +koryak +korimako +korymboi +korymbos +korin +korma +kornephorus +kornerupine +kornskeppa +kornskeppur +korntonde +korntonder +korntunna +korntunnur +koroa +koromika +koromiko +korona +korova +korrel +korrigan +korrigum +kors +korsakoff +korsakow +korumburra +korun +koruna +korunas +koruny +korwa +korzec +kos +kosalan +koschei +kosha +koshare +kosher +koshered +koshering +koshers +kosimo +kosin +kosmokrator +koso +kosong +kosos +kosotoxin +koss +kossaean +kossean +kosteletzkya +koswite +kota +kotal +kotar +kotyle +kotylos +koto +kotoite +kotoko +kotos +kotow +kotowed +kotower +kotowers +kotowing +kotows +kotschubeite +kottaboi +kottabos +kottigite +kotuku +kotukutuku +kotwal +kotwalee +kotwali +kou +koulan +koulibiaca +koumis +koumys +koumises +koumyses +koumiss +koumyss +koumisses +koumysses +koungmiut +kouprey +koupreys +kouproh +kourbash +kouroi +kouros +kousin +koussin +kousso +koussos +kouza +kovil +kowagmiut +kowbird +kowhai +kowtow +kowtowed +kowtower +kowtowers +kowtowing +kowtows +kozo +kozuka +kpc +kph +kpuesi +kr +kra +kraal +kraaled +kraaling +kraals +kraft +krafts +krag +kragerite +krageroite +krait +kraits +kraken +krakens +krakowiak +kral +krama +krameria +krameriaceae +krameriaceous +kran +krang +krans +krantz +krantzite +krapfen +krapina +kras +krasis +krater +kraters +kratogen +kratogenic +kraunhia +kraurite +kraurosis +kraurotic +krausen +krausite +kraut +krauthead +krauts +krautweed +kravers +kreatic +krebs +kreese +kreil +kreis +kreistag +kreistle +kreitonite +kreittonite +kreitzman +krelos +kremersite +kremlin +kremlinology +kremlinologist +kremlinologists +kremlins +krems +kreng +krennerite +kreosote +krepi +krepis +kreplach +kreplech +kreutzer +kreutzers +kreuzer +kreuzers +kriegspiel +krieker +krigia +krill +krills +krimmer +krimmers +krina +kryokonite +kryolite +kryolites +kryolith +kryoliths +kriophoros +krypsis +kryptic +krypticism +kryptocyanine +kryptol +kryptomere +krypton +kryptonite +kryptons +kris +krises +krishna +krishnaism +krishnaist +krishnaite +krishnaitic +krispies +kriss +kristen +kristi +kristian +kristin +kristinaux +krisuvigite +kritarchy +krithia +kriton +kritrima +krivu +krna +krobyloi +krobylos +krocidolite +krocket +krohnkite +krome +kromeski +kromesky +kromogram +kromskop +krona +krone +kronen +kroner +kronion +kronor +kronos +kronur +kroo +kroon +krooni +kroons +krosa +krouchka +kroushka +krs +kru +krubi +krubis +krubut +krubuts +krugerism +krugerite +kruller +krullers +kruman +krumhorn +krummholz +krummhorn +krzysztof +ksar +kshatriya +kshatriyahood +ksi +kt +kthibh +kua +kuan +kuar +kuba +kubachi +kubanka +kubba +kubera +kubong +kubuklion +kuchean +kuchen +kuchens +kudize +kudo +kudos +kudrun +kudu +kudus +kudzu +kudzus +kue +kueh +kuehneola +kuei +kues +kuffieh +kufic +kufiyeh +kuge +kugel +kugelhof +kuhnia +kui +kuichua +kujawiak +kukang +kukeri +kuki +kukoline +kukri +kuku +kukui +kukulcan +kukupa +kukuruku +kula +kulack +kulah +kulaite +kulak +kulaki +kulakism +kulaks +kulan +kulanapan +kulang +kuldip +kuli +kulimit +kulkarni +kullaite +kullani +kulm +kulmet +kultur +kulturkampf +kulturkreis +kulturs +kuman +kumara +kumari +kumbaloi +kumbi +kumbuk +kumhar +kumyk +kumis +kumys +kumyses +kumiss +kumisses +kumkum +kummel +kummels +kummerbund +kumminost +kumni +kumquat +kumquats +kumrah +kumshaw +kunai +kunbi +kundalini +kundry +kuneste +kung +kunk +kunkur +kunmiut +kunwari +kunzite +kunzites +kuomintang +kupfernickel +kupfferite +kuphar +kupper +kurajong +kuranko +kurbash +kurbashed +kurbashes +kurbashing +kurchatovium +kurchicine +kurchine +kurd +kurdish +kurdistan +kurgan +kurgans +kuri +kurikata +kurilian +kurku +kurmburra +kurmi +kurn +kuroshio +kurrajong +kursaal +kursch +kurt +kurta +kurtas +kurtosis +kurtosises +kuru +kuruba +kurukh +kuruma +kurumaya +kurumba +kurung +kurus +kurvey +kurveyor +kusa +kusam +kusan +kusha +kushshu +kusimanse +kusimansel +kuskite +kuskos +kuskus +kuskwogmiut +kusso +kussos +kustenau +kusti +kusum +kutch +kutcha +kutchin +kutenai +kutta +kuttab +kuttar +kuttaur +kuvasz +kuvaszok +kuvera +kuwait +kv +kvah +kvar +kvarner +kvas +kvases +kvass +kvasses +kvetch +kvetched +kvetches +kvetching +kvint +kvinter +kvutza +kvutzah +kw +kwacha +kwachas +kwaiken +kwakiutl +kwamme +kwan +kwannon +kwanza +kwapa +kwarta +kwarterka +kwartje +kwashiorkor +kwatuma +kwaznku +kwazoku +kwela +kwhr +kwintra +l +la +laager +laagered +laagering +laagers +laang +lab +labaara +labadist +laban +labara +labaria +labarum +labarums +labba +labbella +labber +labby +labdacism +labdacismus +labdanum +labdanums +labefact +labefactation +labefaction +labefy +labefied +labefying +label +labeled +labeler +labelers +labeling +labella +labellate +labelled +labeller +labellers +labelling +labelloid +labellum +labels +labia +labial +labialisation +labialise +labialised +labialising +labialism +labialismus +labiality +labialization +labialize +labialized +labializing +labially +labials +labiatae +labiate +labiated +labiates +labiatiflorous +labibia +labidometer +labidophorous +labidura +labiduridae +labiella +labile +lability +labilities +labilization +labilize +labilized +labilizing +labioalveolar +labiocervical +labiodendal +labiodental +labioglossal +labioglossolaryngeal +labioglossopharyngeal +labiograph +labiogression +labioguttural +labiolingual +labiomancy +labiomental +labionasal +labiopalatal +labiopalatalize +labiopalatine +labiopharyngeal +labioplasty +labiose +labiotenaculum +labiovelar +labiovelarisation +labiovelarise +labiovelarised +labiovelarising +labiovelarization +labiovelarize +labiovelarized +labiovelarizing +labioversion +labyrinth +labyrinthal +labyrinthally +labyrinthed +labyrinthian +labyrinthibranch +labyrinthibranchiate +labyrinthibranchii +labyrinthic +labyrinthical +labyrinthically +labyrinthici +labyrinthiform +labyrinthine +labyrinthitis +labyrinthodon +labyrinthodont +labyrinthodonta +labyrinthodontian +labyrinthodontid +labyrinthodontoid +labyrinths +labyrinthula +labyrinthulidae +labis +labite +labium +lablab +labor +laborability +laborable +laborage +laborant +laboratory +laboratorial +laboratorially +laboratorian +laboratories +labordom +labored +laboredly +laboredness +laborer +laborers +labores +laboress +laborhood +laboring +laboringly +laborings +laborious +laboriously +laboriousness +laborism +laborist +laboristic +laborite +laborites +laborius +laborless +laborous +laborously +laborousness +labors +laborsaving +laborsome +laborsomely +laborsomeness +laboulbenia +laboulbeniaceae +laboulbeniaceous +laboulbeniales +labour +labourage +laboured +labouredly +labouredness +labourer +labourers +labouress +labouring +labouringly +labourism +labourist +labourite +labourless +labours +laboursaving +laboursome +laboursomely +labra +labrador +labradorean +labradorite +labradoritic +labral +labras +labredt +labret +labretifery +labrets +labrid +labridae +labrys +labroid +labroidea +labroids +labrosaurid +labrosauroid +labrosaurus +labrose +labrum +labrums +labrus +labrusca +labs +laburnum +laburnums +lac +lacatan +lacca +laccaic +laccainic +laccase +laccic +laccin +laccol +laccolite +laccolith +laccolithic +laccoliths +laccolitic +lace +lacebark +laced +lacedaemonian +laceflower +lacey +laceybark +laceier +laceiest +laceleaf +laceless +lacelike +lacemaker +lacemaking +laceman +lacemen +lacepiece +lacepod +lacer +lacerability +lacerable +lacerant +lacerate +lacerated +lacerately +lacerates +lacerating +laceration +lacerations +lacerative +lacery +lacerna +lacernae +lacernas +lacers +lacert +lacerta +lacertae +lacertian +lacertid +lacertidae +lacertids +lacertiform +lacertilia +lacertilian +lacertiloid +lacertine +lacertoid +lacertose +laces +lacet +lacetilian +lacewing +lacewings +lacewoman +lacewomen +lacewood +lacewoods +lacework +laceworker +laceworks +lache +lachenalia +laches +lachesis +lachnanthes +lachnosterna +lachryma +lachrymable +lachrymae +lachrymaeform +lachrymal +lachrymally +lachrymalness +lachrymary +lachrymation +lachrymator +lachrymatory +lachrymatories +lachrymiform +lachrymist +lachrymogenic +lachrymonasal +lachrymosal +lachrymose +lachrymosely +lachrymosity +lachrymous +lachsa +lacy +lacier +laciest +lacily +lacinaria +laciness +lacinesses +lacing +lacings +lacinia +laciniate +laciniated +laciniation +laciniform +laciniola +laciniolate +laciniose +lacinious +lacinula +lacinulas +lacinulate +lacinulose +lacis +lack +lackaday +lackadaisy +lackadaisic +lackadaisical +lackadaisicality +lackadaisically +lackadaisicalness +lackbrained +lackbrainedness +lacked +lackey +lackeydom +lackeyed +lackeying +lackeyism +lackeys +lackeyship +lacker +lackered +lackerer +lackering +lackers +lackies +lacking +lackland +lackluster +lacklusterness +lacklustre +lacklustrous +lacks +lacksense +lackwit +lackwitted +lackwittedly +lackwittedness +lacmoid +lacmus +lacoca +lacolith +laconian +laconic +laconica +laconical +laconically +laconicalness +laconicism +laconicness +laconics +laconicum +laconism +laconisms +laconize +laconized +laconizer +laconizing +lacosomatidae +lacquey +lacqueyed +lacqueying +lacqueys +lacquer +lacquered +lacquerer +lacquerers +lacquering +lacquerist +lacquers +lacquerwork +lacrym +lacrimal +lacrimals +lacrimation +lacrimator +lacrimatory +lacrimatories +lacroixite +lacrosse +lacrosser +lacrosses +lacs +lactagogue +lactalbumin +lactam +lactamide +lactams +lactant +lactarene +lactary +lactarine +lactarious +lactarium +lactarius +lactase +lactases +lactate +lactated +lactates +lactating +lactation +lactational +lactationally +lactations +lacteal +lacteally +lacteals +lactean +lactenin +lacteous +lactesce +lactescence +lactescency +lactescenle +lactescense +lactescent +lactic +lacticinia +lactid +lactide +lactiferous +lactiferousness +lactify +lactific +lactifical +lactification +lactified +lactifying +lactiflorous +lactifluous +lactiform +lactifuge +lactigenic +lactigenous +lactigerous +lactyl +lactim +lactimide +lactinate +lactivorous +lacto +lactobaccilli +lactobacilli +lactobacillus +lactobutyrometer +lactocele +lactochrome +lactocitrate +lactodensimeter +lactoflavin +lactogen +lactogenic +lactoglobulin +lactoid +lactol +lactometer +lactone +lactones +lactonic +lactonization +lactonize +lactonized +lactonizing +lactophosphate +lactoproteid +lactoprotein +lactoscope +lactose +lactoses +lactosid +lactoside +lactosuria +lactothermometer +lactotoxin +lactovegetarian +lactuca +lactucarium +lactucerin +lactucin +lactucol +lactucon +lacuna +lacunae +lacunal +lacunar +lacunary +lacunaria +lacunaris +lacunars +lacunas +lacunate +lacune +lacunes +lacunome +lacunose +lacunosis +lacunosity +lacunule +lacunulose +lacuscular +lacustral +lacustrian +lacustrine +lacwork +lad +ladakhi +ladakin +ladang +ladanigerous +ladanum +ladanums +ladder +laddered +laddery +laddering +ladderless +ladderlike +ladderman +laddermen +ladders +ladderway +ladderwise +laddess +laddie +laddies +laddikie +laddish +laddock +lade +laded +lademan +laden +ladened +ladening +ladens +lader +laders +lades +ladhood +lady +ladybird +ladybirds +ladybug +ladybugs +ladyclock +ladydom +ladies +ladyfern +ladify +ladyfy +ladified +ladifying +ladyfinger +ladyfingers +ladyfish +ladyfishes +ladyfly +ladyflies +ladyhood +ladyhoods +ladyish +ladyishly +ladyishness +ladyism +ladik +ladykiller +ladykin +ladykind +ladykins +ladyless +ladyly +ladylike +ladylikely +ladylikeness +ladyling +ladylintywhite +ladylove +ladyloves +ladin +lading +ladings +ladino +ladinos +ladypalm +ladypalms +ladysfinger +ladyship +ladyships +ladyslipper +ladysnow +ladytide +ladkin +ladle +ladled +ladleful +ladlefuls +ladler +ladlers +ladles +ladlewood +ladling +ladner +ladron +ladrone +ladrones +ladronism +ladronize +ladrons +lads +laelia +laemodipod +laemodipoda +laemodipodan +laemodipodiform +laemodipodous +laemoparalysis +laemostenosis +laen +laender +laeotropic +laeotropism +laeotropous +laertes +laestrygones +laet +laetation +laeti +laetic +laetrile +laevigate +laevigrada +laevo +laevoduction +laevogyrate +laevogyre +laevogyrous +laevolactic +laevorotation +laevorotatory +laevotartaric +laevoversion +laevulin +laevulose +lafayette +lafite +laft +lag +lagan +lagans +lagarto +lagen +lagena +lagenae +lagenaria +lagend +lagends +lagenian +lageniform +lageniporm +lager +lagered +lagering +lagers +lagerspetze +lagerstroemia +lagetta +lagetto +laggar +laggard +laggardism +laggardly +laggardness +laggards +lagged +laggen +lagger +laggers +laggin +lagging +laggingly +laggings +laggins +laglast +lagly +lagna +lagnappe +lagnappes +lagniappe +lagniappes +lagomyidae +lagomorph +lagomorpha +lagomorphic +lagomorphous +lagomrph +lagonite +lagoon +lagoonal +lagoons +lagoonside +lagophthalmos +lagophthalmus +lagopode +lagopodous +lagopous +lagopus +lagorchestes +lagostoma +lagostomus +lagothrix +lagrangian +lags +lagthing +lagting +laguna +lagunas +laguncularia +lagune +lagunero +lagunes +lagurus +lagwort +lah +lahar +lahnda +lahontan +lahore +lahuli +lai +lay +layabout +layabouts +layaway +layaways +laibach +layback +layboy +laic +laical +laicality +laically +laich +laichs +laicisation +laicise +laicised +laicises +laicising +laicism +laicisms +laicity +laicization +laicize +laicized +laicizer +laicizes +laicizing +laics +laid +laidly +laydown +layed +layer +layerage +layerages +layered +layery +layering +layerings +layers +layette +layettes +layfolk +laigh +laighs +layia +laying +laik +layland +laylight +layloc +laylock +layman +laymanship +laymen +lain +lainage +laine +layne +lainer +layner +layoff +layoffs +laiose +layout +layouts +layover +layovers +layperson +lair +lairage +laird +lairdess +lairdie +lairdly +lairdocracy +lairds +lairdship +laired +lairy +lairing +lairless +lairman +lairmen +layrock +lairs +lairstone +lays +laiser +layshaft +layship +laisse +laissez +laystall +laystow +lait +laitance +laitances +laith +laithe +laithly +laity +laities +layup +laius +laywoman +laywomen +lak +lakarpite +lakatan +lakatoi +lake +laked +lakefront +lakey +lakeland +lakelander +lakeless +lakelet +lakelike +lakemanship +lakeport +lakeports +laker +lakers +lakes +lakeshore +lakeside +lakesides +lakeward +lakeweed +lakh +lakhs +laky +lakie +lakier +lakiest +lakin +laking +lakings +lakish +lakishness +lakism +lakist +lakke +lakmus +lakota +laksa +lakshmi +lalang +lalapalooza +lalaqui +laliophobia +lall +lallan +lalland +lallands +lallans +lallapalooza +lallation +lalled +lally +lallygag +lallygagged +lallygagging +lallygags +lalling +lalls +lalo +laloneurosis +lalopathy +lalopathies +lalophobia +laloplegia +lam +lama +lamaic +lamaism +lamaist +lamaistic +lamaite +lamany +lamanism +lamanite +lamano +lamantin +lamarckia +lamarckian +lamarckianism +lamarckism +lamas +lamasary +lamasery +lamaseries +lamastery +lamb +lamba +lamback +lambadi +lambale +lambast +lambaste +lambasted +lambastes +lambasting +lambasts +lambda +lambdacism +lambdas +lambdiod +lambdoid +lambdoidal +lambeau +lambed +lambency +lambencies +lambent +lambently +lamber +lambers +lambert +lamberts +lambes +lambhood +lamby +lambie +lambies +lambiness +lambing +lambish +lambitive +lambkill +lambkills +lambkin +lambkins +lambly +lamblia +lambliasis +lamblike +lamblikeness +lambling +lamboy +lamboys +lambrequin +lambs +lambsdown +lambskin +lambskins +lambsuccory +lamda +lamdan +lamden +lame +lamebrain +lamebrained +lamebrains +lamed +lamedh +lamedhs +lamedlamella +lameds +lameduck +lamel +lamely +lamella +lamellae +lamellar +lamellary +lamellaria +lamellariidae +lamellarly +lamellas +lamellate +lamellated +lamellately +lamellation +lamellibranch +lamellibranchia +lamellibranchiata +lamellibranchiate +lamellicorn +lamellicornate +lamellicornes +lamellicornia +lamellicornous +lamelliferous +lamelliform +lamellirostral +lamellirostrate +lamellirostres +lamelloid +lamellose +lamellosity +lamellule +lameness +lamenesses +lament +lamentabile +lamentability +lamentable +lamentableness +lamentably +lamentation +lamentational +lamentations +lamentatory +lamented +lamentedly +lamenter +lamenters +lamentful +lamenting +lamentingly +lamentive +lamentory +laments +lamer +lames +lamest +lamester +lamestery +lameter +lametta +lamia +lamiaceae +lamiaceous +lamiae +lamias +lamiger +lamiid +lamiidae +lamiides +lamiinae +lamin +lamina +laminability +laminable +laminae +laminal +laminar +laminary +laminaria +laminariaceae +laminariaceous +laminariales +laminarian +laminarin +laminarioid +laminarite +laminas +laminate +laminated +laminates +laminating +lamination +laminator +laminboard +laminectomy +laming +lamington +laminiferous +laminiform +laminiplantar +laminiplantation +laminitis +laminose +laminous +lamish +lamista +lamister +lamisters +lamiter +lamium +lamm +lammas +lammastide +lammed +lammer +lammergeier +lammergeyer +lammergeir +lammy +lammie +lamming +lammock +lamna +lamnectomy +lamnid +lamnidae +lamnoid +lamp +lampad +lampadaire +lampadary +lampadaries +lampadedromy +lampadephore +lampadephoria +lampadist +lampadite +lampads +lampara +lampas +lampases +lampate +lampatia +lampblack +lampblacked +lampblacking +lamped +lamper +lampern +lampers +lamperses +lampf +lampfly +lampflower +lampful +lamphole +lampic +lamping +lampion +lampions +lampyrid +lampyridae +lampyrids +lampyrine +lampyris +lampist +lampistry +lampless +lamplet +lamplight +lamplighted +lamplighter +lamplit +lampmaker +lampmaking +lampman +lampmen +lampong +lampoon +lampooned +lampooner +lampoonery +lampooners +lampooning +lampoonist +lampoonists +lampoons +lamppost +lampposts +lamprey +lampreys +lamprel +lampret +lampridae +lampron +lamprophyre +lamprophyric +lamprophony +lamprophonia +lamprophonic +lamprotype +lamps +lampshade +lampshell +lampsilis +lampsilus +lampstand +lampwick +lampworker +lampworking +lams +lamsiekte +lamster +lamsters +lamus +lamut +lamziekte +lan +lana +lanai +lanais +lanameter +lanao +lanarkia +lanarkite +lanas +lanate +lanated +lanaz +lancashire +lancaster +lancasterian +lancastrian +lance +lanced +lancegay +lancegaye +lancejack +lancelet +lancelets +lancely +lancelike +lancelot +lanceman +lancemen +lanceolar +lanceolate +lanceolated +lanceolately +lanceolation +lancepesade +lancepod +lanceprisado +lanceproof +lancer +lancers +lances +lancet +lanceted +lanceteer +lancetfish +lancetfishes +lancets +lancewood +lanch +lancha +lanchara +lanciers +lanciferous +lanciform +lancinate +lancinated +lancinating +lancination +lancing +land +landage +landamman +landammann +landau +landaulet +landaulette +landaus +landblink +landbook +landdrost +landdrosten +lande +landed +lander +landers +landesite +landfall +landfalls +landfang +landfast +landfill +landfills +landflood +landfolk +landform +landforms +landgafol +landgate +landgates +landgravate +landgrave +landgraveship +landgravess +landgraviate +landgravine +landhold +landholder +landholders +landholdership +landholding +landholdings +landyard +landimere +landing +landings +landiron +landlady +landladydom +landladies +landladyhood +landladyish +landladyship +landleaper +landler +landlers +landless +landlessness +landlike +landline +landlock +landlocked +landlook +landlooker +landloper +landloping +landlord +landlordism +landlordly +landlordry +landlords +landlordship +landlouper +landlouping +landlubber +landlubberish +landlubberly +landlubbers +landlubbing +landman +landmark +landmarker +landmarks +landmass +landmasses +landmen +landmil +landmonger +landocracy +landocracies +landocrat +landolphia +landowner +landowners +landownership +landowning +landplane +landrace +landrail +landraker +landreeve +landright +lands +landsale +landsat +landscape +landscaped +landscaper +landscapers +landscapes +landscaping +landscapist +landshard +landshark +landship +landsick +landside +landsides +landskip +landskips +landsknecht +landsleit +landslid +landslidden +landslide +landslided +landslides +landsliding +landslip +landslips +landsmaal +landsman +landsmanleit +landsmanshaft +landsmanshaften +landsmen +landspout +landspringy +landsting +landstorm +landsturm +landswoman +landtrost +landuman +landway +landways +landwaiter +landward +landwards +landwash +landwehr +landwhin +landwire +landwrack +landwreck +lane +laney +lanely +lanes +lanesome +lanete +laneway +lang +langaha +langarai +langate +langauge +langbanite +langbeinite +langca +langeel +langel +langhian +langi +langiel +langite +langka +langlauf +langlaufer +langlaufers +langlaufs +langle +langley +langleys +lango +langobard +langobardic +langoon +langooty +langosta +langouste +langrage +langrages +langrel +langrels +langret +langridge +langsat +langsdorffia +langset +langsettle +langshan +langshans +langsyne +langsynes +langspiel +langspil +langteraloo +language +languaged +languageless +languages +languaging +langue +langued +languedoc +languedocian +languent +langues +languescent +languet +languets +languette +languid +languidly +languidness +languish +languished +languisher +languishers +languishes +languishing +languishingly +languishment +languor +languorment +languorous +languorously +languorousness +languors +langur +langurs +laniard +lanyard +laniards +lanyards +laniary +laniaries +laniariform +laniate +lanier +laniferous +lanific +lanifice +laniflorous +laniform +lanigerous +laniidae +laniiform +laniinae +lanioid +lanista +lanistae +lanital +lanitals +lanius +lank +lanker +lankest +lanket +lanky +lankier +lankiest +lankily +lankiness +lankish +lankly +lankness +lanknesses +lanner +lanneret +lannerets +lanners +lanny +lanolated +lanolin +lanoline +lanolines +lanolins +lanose +lanosity +lanosities +lansa +lansat +lansdowne +lanseh +lansfordite +lansing +lansknecht +lanson +lansquenet +lant +lantaca +lantaka +lantana +lantanas +lantanium +lantcha +lanterloo +lantern +lanterned +lanternfish +lanternfishes +lanternflower +lanterning +lanternist +lanternleaf +lanternlit +lanternman +lanterns +lanthana +lanthania +lanthanid +lanthanide +lanthanite +lanthanon +lanthanotidae +lanthanotus +lanthanum +lanthopin +lanthopine +lanthorn +lanthorns +lantum +lanuginose +lanuginous +lanuginousness +lanugo +lanugos +lanum +lanuvian +lanx +lanzknecht +lanzon +lao +laocoon +laodah +laodicean +laodiceanism +laos +laotian +laotians +lap +lapacho +lapachol +lapactic +lapageria +laparectomy +laparocele +laparocholecystotomy +laparocystectomy +laparocystotomy +laparocolectomy +laparocolostomy +laparocolotomy +laparocolpohysterotomy +laparocolpotomy +laparoelytrotomy +laparoenterostomy +laparoenterotomy +laparogastroscopy +laparogastrotomy +laparohepatotomy +laparohysterectomy +laparohysteropexy +laparohysterotomy +laparoileotomy +laparomyitis +laparomyomectomy +laparomyomotomy +laparonephrectomy +laparonephrotomy +laparorrhaphy +laparosalpingectomy +laparosalpingotomy +laparoscope +laparoscopy +laparosplenectomy +laparosplenotomy +laparostict +laparosticti +laparothoracoscopy +laparotome +laparotomy +laparotomies +laparotomist +laparotomize +laparotomized +laparotomizing +laparotrachelotomy +lapb +lapboard +lapboards +lapcock +lapdog +lapdogs +lapeirousia +lapel +lapeler +lapelled +lapels +lapful +lapfuls +lapicide +lapidary +lapidarian +lapidaries +lapidarist +lapidate +lapidated +lapidates +lapidating +lapidation +lapidator +lapideon +lapideous +lapides +lapidescence +lapidescent +lapidicolous +lapidify +lapidific +lapidifical +lapidification +lapidified +lapidifies +lapidifying +lapidist +lapidists +lapidity +lapidose +lapies +lapilli +lapilliform +lapillo +lapillus +lapin +lapinized +lapins +lapis +lapises +lapith +lapithae +lapithaean +laplacian +lapland +laplander +laplanders +laplandian +laplandic +laplandish +lapling +lapon +laportea +lapp +lappa +lappaceous +lappage +lapped +lapper +lappered +lappering +lappers +lappet +lappeted +lappethead +lappets +lappic +lappilli +lapping +lappish +lapponese +lapponian +lapps +lappula +lapputan +laps +lapsability +lapsable +lapsana +lapsation +lapse +lapsed +lapser +lapsers +lapses +lapsful +lapsi +lapsibility +lapsible +lapsided +lapsing +lapsingly +lapstone +lapstrake +lapstreak +lapstreaked +lapstreaker +lapsus +laptop +lapulapu +laputa +laputan +laputically +lapwing +lapwings +lapwork +laquais +laquear +laquearia +laquearian +laquei +laqueus +lar +laralia +laramide +laramie +larararia +lararia +lararium +larboard +larboards +larbolins +larbowlines +larcenable +larcener +larceners +larceny +larcenic +larcenies +larcenish +larcenist +larcenists +larcenous +larcenously +larcenousness +larch +larchen +larcher +larches +larcin +larcinry +lard +lardacein +lardaceous +larded +larder +larderellite +larderer +larderful +larderie +larderlike +larders +lardy +lardier +lardiest +lardiform +lardiner +larding +lardite +lardizabalaceae +lardizabalaceous +lardlike +lardon +lardons +lardoon +lardoons +lardry +lards +lardworm +lare +lareabell +larentiidae +lares +largamente +largando +large +largebrained +largehanded +largehearted +largeheartedly +largeheartedness +largely +largemouth +largemouthed +largen +largeness +largeour +largeous +larger +larges +largess +largesse +largesses +largest +larget +larghetto +larghettos +larghissimo +larghissimos +largy +largifical +largish +largishness +largition +largitional +largo +largos +lari +laria +lariat +lariated +lariating +lariats +larick +larid +laridae +laridine +larigo +larigot +lariid +lariidae +larikin +larin +larinae +larine +laryngal +laryngalgia +laryngeal +laryngeally +laryngean +laryngeating +laryngectomee +laryngectomy +laryngectomies +laryngectomize +laryngectomized +laryngectomizing +laryngemphraxis +laryngendoscope +larynges +laryngic +laryngismal +laryngismus +laryngitic +laryngitis +laryngitus +laryngocele +laryngocentesis +laryngofission +laryngofissure +laryngograph +laryngography +laryngology +laryngologic +laryngological +laryngologist +laryngometry +laryngoparalysis +laryngopathy +laryngopharyngeal +laryngopharynges +laryngopharyngitis +laryngopharynx +laryngopharynxes +laryngophony +laryngophthisis +laryngoplasty +laryngoplegia +laryngorrhagia +laryngorrhea +laryngoscleroma +laryngoscope +laryngoscopy +laryngoscopic +laryngoscopical +laryngoscopically +laryngoscopies +laryngoscopist +laryngospasm +laryngostasis +laryngostenosis +laryngostomy +laryngostroboscope +laryngotyphoid +laryngotome +laryngotomy +laryngotomies +laryngotracheal +laryngotracheitis +laryngotracheoscopy +laryngotracheotomy +laryngovestibulitis +larynx +larynxes +larithmic +larithmics +larix +larixin +lark +larked +larker +larkers +larky +larkier +larkiest +larkiness +larking +larkingly +larkish +larkishly +larkishness +larklike +larkling +larks +larksome +larksomes +larkspur +larkspurs +larlike +larmier +larmoyant +larn +larnakes +larnaudian +larnax +larnyx +laroid +laron +larree +larry +larries +larrigan +larrigans +larrikin +larrikinalian +larrikiness +larrikinism +larrikins +larriman +larrup +larruped +larruper +larrupers +larruping +larrups +lars +larsenite +larum +larums +larunda +larus +larva +larvacea +larvae +larval +larvalia +larvaria +larvarium +larvariums +larvas +larvate +larvated +larve +larvicidal +larvicide +larvicolous +larviform +larvigerous +larvikite +larviparous +larviposit +larviposition +larvivorous +larvule +las +lasa +lasagna +lasagnas +lasagne +lasagnes +lasarwort +lascar +lascaree +lascarine +lascars +laschety +lascivient +lasciviently +lascivious +lasciviously +lasciviousness +lase +lased +laser +laserdisk +laserdisks +laserjet +laserpitium +lasers +laserwort +lases +lash +lashed +lasher +lashers +lashes +lashing +lashingly +lashings +lashins +lashkar +lashkars +lashless +lashlight +lashlite +lashness +lashorn +lasi +lasianthous +lasing +lasiocampa +lasiocampid +lasiocampidae +lasiocampoidea +lasiocarpous +lasius +lask +lasket +lasking +laspeyresia +laspring +lasque +lass +lasses +lasset +lassie +lassiehood +lassieish +lassies +lassiky +lassitude +lassitudes +lasslorn +lasso +lassock +lassockie +lassoed +lassoer +lassoers +lassoes +lassoing +lassos +lassu +last +lastage +lasted +laster +lasters +lastex +lasty +lasting +lastingly +lastingness +lastings +lastjob +lastly +lastness +lastre +lasts +lastspring +lat +lata +latah +latakia +latakias +latania +latanier +latax +latch +latched +latcher +latches +latchet +latchets +latching +latchkey +latchkeys +latchless +latchman +latchmen +latchstring +latchstrings +late +latebra +latebricole +latecomer +latecomers +latecoming +lated +lateen +lateener +lateeners +lateenrigged +lateens +lately +lateliness +latemost +laten +latence +latency +latencies +latened +lateness +latenesses +latening +latens +latensify +latensification +latensified +latensifying +latent +latentize +latently +latentness +latents +later +latera +laterad +lateral +lateraled +lateraling +lateralis +laterality +lateralities +lateralization +lateralize +lateralized +lateralizing +laterally +laterals +lateran +latericeous +latericumbent +lateriflexion +laterifloral +lateriflorous +laterifolious +laterigradae +laterigrade +laterinerved +laterite +laterites +lateritic +lateritious +lateriversion +laterization +lateroabdominal +lateroanterior +laterocaudal +laterocervical +laterodeviation +laterodorsal +lateroduction +lateroflexion +lateromarginal +lateronuchal +lateroposition +lateroposterior +lateropulsion +laterostigmatal +laterostigmatic +laterotemporal +laterotorsion +lateroventral +lateroversion +latescence +latescent +latesome +latest +latests +lateward +latewhile +latewhiles +latewood +latewoods +latex +latexes +latexosis +lath +latham +lathe +lathed +lathee +latheman +lathen +lather +latherability +latherable +lathered +lathereeve +latherer +latherers +lathery +latherin +lathering +latheron +lathers +latherwort +lathes +lathesman +lathesmen +lathhouse +lathi +lathy +lathie +lathier +lathiest +lathing +lathings +lathyric +lathyrism +lathyritic +lathyrus +lathlike +lathraea +lathreeve +laths +lathwork +lathworks +lati +latian +latibule +latibulize +latices +laticifer +laticiferous +laticlave +laticostate +latidentate +latifolia +latifoliate +latifolious +latifundia +latifundian +latifundio +latifundium +latigo +latigoes +latigos +latimer +latimeria +latin +latinate +latiner +latinesque +latinian +latinic +latiniform +latinism +latinist +latinistic +latinistical +latinitaster +latinity +latinities +latinization +latinize +latinized +latinizer +latinizes +latinizing +latinless +latino +latinos +latins +latinus +lation +latipennate +latipennine +latiplantar +latirostral +latirostres +latirostrous +latirus +latisept +latiseptal +latiseptate +latish +latissimi +latissimus +latisternal +latitancy +latitant +latitat +latite +latitude +latitudes +latitudinal +latitudinally +latitudinary +latitudinarian +latitudinarianism +latitudinarianisn +latitudinarians +latitudinous +lative +latke +latomy +latomia +laton +latona +latonian +latooka +latosol +latosolic +latosols +latoun +latrant +latrate +latration +latrede +latreutic +latreutical +latria +latrial +latrially +latrian +latrias +latrididae +latrine +latrines +latris +latro +latrobe +latrobite +latrociny +latrocinium +latrodectus +latron +lats +latten +lattener +lattens +latter +latterkin +latterly +lattermath +lattermint +lattermost +latterness +lattice +latticed +latticeleaf +latticelike +lattices +latticewise +latticework +latticicini +latticing +latticinii +latticinio +lattin +lattins +latuka +latus +latvia +latvian +latvians +lauan +lauans +laubanite +laud +laudability +laudable +laudableness +laudably +laudanidine +laudanin +laudanine +laudanosine +laudanum +laudanums +laudation +laudative +laudator +laudatory +laudatorily +laudators +laude +lauded +lauder +lauderdale +lauders +laudes +laudian +laudianism +laudification +lauding +laudism +laudist +lauds +laugh +laughability +laughable +laughableness +laughably +laughed +laughee +laugher +laughers +laughful +laughy +laughing +laughingly +laughings +laughingstock +laughingstocks +laughs +laughsome +laughter +laughterful +laughterless +laughters +laughworthy +lauhala +lauia +laulau +laumonite +laumontite +laun +launce +launces +launch +launchable +launched +launcher +launchers +launches +launchful +launching +launchings +launchpad +launchplex +launchways +laund +launder +launderability +launderable +laundered +launderer +launderers +launderette +laundering +launderings +launders +laundress +laundresses +laundry +laundries +laundrymaid +laundryman +laundrymen +laundryowner +laundrywoman +laundrywomen +laundromat +laundromats +launeddas +laur +laura +lauraceae +lauraceous +laurae +lauraldehyde +lauras +laurate +laurdalite +laure +laureal +laureate +laureated +laureates +laureateship +laureateships +laureating +laureation +laurel +laureled +laureling +laurelled +laurellike +laurelling +laurels +laurelship +laurelwood +laurence +laurencia +laurent +laurentian +laurentide +laureole +laurestinus +laury +laurianne +lauric +laurie +lauryl +laurin +laurinoxylon +laurionite +laurite +laurocerasus +lauroyl +laurone +laurotetanine +laurus +laurustine +laurustinus +laurvikite +laus +lautarite +lautenclavicymbal +lauter +lautite +lautitious +lautu +lauwine +lauwines +lav +lava +lavable +lavabo +lavaboes +lavabos +lavacre +lavadero +lavage +lavages +lavalava +lavalavas +lavalier +lavaliere +lavalieres +lavaliers +lavalike +lavalliere +lavament +lavandera +lavanderas +lavandero +lavanderos +lavandin +lavandula +lavanga +lavant +lavaret +lavas +lavash +lavatera +lavatic +lavation +lavational +lavations +lavatory +lavatorial +lavatories +lavature +lave +laveche +laved +laveer +laveered +laveering +laveers +lavehr +lavement +lavender +lavendered +lavendering +lavenders +lavenite +laver +laverania +laveroc +laverock +laverocks +lavers +laverwort +laves +lavette +lavy +lavialite +lavic +laving +lavinia +lavish +lavished +lavisher +lavishers +lavishes +lavishest +lavishing +lavishingly +lavishly +lavishment +lavishness +lavolta +lavrock +lavrocks +lavroffite +lavrovite +law +lawabidingness +lawbook +lawbreak +lawbreaker +lawbreakers +lawbreaking +lawcourt +lawcraft +lawed +laweour +lawful +lawfully +lawfullness +lawfulness +lawgive +lawgiver +lawgivers +lawgiving +lawyer +lawyeress +lawyeresses +lawyery +lawyering +lawyerism +lawyerly +lawyerlike +lawyerling +lawyers +lawyership +lawine +lawines +lawing +lawings +lawish +lawk +lawks +lawlants +lawless +lawlessly +lawlessness +lawlike +lawmake +lawmaker +lawmakers +lawmaking +lawman +lawmen +lawmonger +lawn +lawned +lawner +lawny +lawnleaf +lawnlet +lawnlike +lawnmower +lawns +lawproof +lawrence +lawrencite +lawrencium +lawrie +lawrightman +lawrightmen +laws +lawson +lawsone +lawsoneve +lawsonia +lawsonite +lawsuit +lawsuiting +lawsuits +lawter +lawton +lawzy +lax +laxate +laxation +laxations +laxative +laxatively +laxativeness +laxatives +laxator +laxer +laxest +laxiflorous +laxifoliate +laxifolious +laxism +laxist +laxity +laxities +laxly +laxness +laxnesses +laz +lazar +lazaret +lazarets +lazarette +lazaretto +lazarettos +lazary +lazarist +lazarly +lazarlike +lazarole +lazarone +lazarous +lazars +lazarus +laze +lazed +lazes +lazy +lazyback +lazybed +lazybird +lazybone +lazybones +lazyboots +lazied +lazier +lazies +laziest +lazyhood +lazying +lazyish +lazylegs +lazily +laziness +lazinesses +lazing +lazyship +lazule +lazuli +lazuline +lazulis +lazulite +lazulites +lazulitic +lazurite +lazurites +lazzarone +lazzaroni +lb +lbf +lbinit +lbs +lbw +lc +lca +lcd +lcm +lconvert +lcsymbol +ld +ldg +ldinfo +le +lea +leach +leachability +leachable +leachate +leachates +leached +leacher +leachers +leaches +leachy +leachier +leachiest +leaching +leachman +leachmen +lead +leadable +leadableness +leadage +leadback +leaded +leaden +leadenhearted +leadenheartedness +leadenly +leadenness +leadenpated +leader +leaderess +leaderette +leaderless +leaders +leadership +leaderships +leadeth +leadhillite +leady +leadier +leadiest +leadin +leadiness +leading +leadingly +leadings +leadless +leadline +leadman +leadoff +leadoffs +leadout +leadplant +leadproof +leads +leadsman +leadsmen +leadstone +leadway +leadwood +leadwork +leadworks +leadwort +leadworts +leaf +leafage +leafages +leafbird +leafboy +leafcup +leafdom +leafed +leafen +leafer +leafery +leafgirl +leafhopper +leafhoppers +leafy +leafier +leafiest +leafiness +leafing +leafit +leafless +leaflessness +leaflet +leafleteer +leaflets +leaflike +leafmold +leafs +leafstalk +leafstalks +leafwood +leafwork +leafworm +leafworms +league +leagued +leaguelong +leaguer +leaguered +leaguerer +leaguering +leaguers +leagues +leaguing +leah +leak +leakage +leakages +leakance +leaked +leaker +leakers +leaky +leakier +leakiest +leakily +leakiness +leaking +leakless +leakproof +leaks +leal +lealand +leally +lealness +lealty +lealties +leam +leamer +lean +leander +leaned +leaner +leanest +leangle +leany +leaning +leanings +leanish +leanly +leanness +leannesses +leans +leant +leap +leapable +leaped +leaper +leapers +leapfrog +leapfrogged +leapfrogger +leapfrogging +leapfrogs +leapful +leaping +leapingly +leaps +leapt +lear +learchus +leary +learier +leariest +learn +learnable +learned +learnedly +learnedness +learner +learners +learnership +learning +learnings +learns +learnt +learoyd +lears +leas +leasable +lease +leaseback +leased +leasehold +leaseholder +leaseholders +leaseholding +leaseholds +leaseless +leaseman +leasemen +leasemonger +leaser +leasers +leases +leash +leashed +leashes +leashing +leashless +leasing +leasings +leasow +least +leasts +leastways +leastwise +leat +leath +leather +leatherback +leatherbark +leatherboard +leatherbush +leathercoat +leathercraft +leathered +leatherer +leatherette +leatherfish +leatherfishes +leatherflower +leatherhead +leathery +leatherine +leatheriness +leathering +leatherize +leatherjacket +leatherleaf +leatherleaves +leatherlike +leatherlikeness +leathermaker +leathermaking +leathern +leatherneck +leathernecks +leatheroid +leatherroot +leathers +leatherside +leatherstocking +leatherware +leatherwing +leatherwood +leatherwork +leatherworker +leatherworking +leathwake +leatman +leatmen +leave +leaved +leaveless +leavelooker +leaven +leavened +leavening +leavenish +leavenless +leavenous +leavens +leaver +leavers +leaverwood +leaves +leavetaking +leavy +leavier +leaviest +leaving +leavings +leawill +leban +lebanese +lebanon +lebban +lebbek +leben +lebens +lebensraum +lebes +lebhaft +lebistes +lebkuchen +lebrancho +lecama +lecaniid +lecaniinae +lecanine +lecanium +lecanomancer +lecanomancy +lecanomantic +lecanora +lecanoraceae +lecanoraceous +lecanoric +lecanorine +lecanoroid +lecanoscopy +lecanoscopic +lech +lechayim +lechayims +lechatelierite +leche +lechea +lecher +lechered +lecherer +lechery +lecheries +lechering +lecherous +lecherously +lecherousness +lechers +leches +lechosa +lechriodont +lechriodonta +lechuguilla +lechuguillas +lechwe +lecidea +lecideaceae +lecideaceous +lecideiform +lecideine +lecidioid +lecyth +lecithal +lecithalbumin +lecithality +lecythi +lecithic +lecythid +lecythidaceae +lecythidaceous +lecithin +lecithinase +lecithins +lecythis +lecithoblast +lecythoi +lecithoid +lecythoid +lecithoprotein +lecythus +leck +lecker +lecontite +lecotropal +lect +lectern +lecterns +lecthi +lectica +lection +lectionary +lectionaries +lections +lectisternium +lector +lectorate +lectorial +lectors +lectorship +lectotype +lectress +lectrice +lectual +lectuary +lecture +lectured +lecturee +lectureproof +lecturer +lecturers +lectures +lectureship +lectureships +lecturess +lecturette +lecturing +lecturn +led +leda +lede +leden +lederhosen +lederite +ledge +ledged +ledgeless +ledgeman +ledgement +ledger +ledgerdom +ledgered +ledgering +ledgers +ledges +ledget +ledgy +ledgier +ledgiest +ledging +ledgment +ledidae +ledol +leds +ledum +lee +leeangle +leeboard +leeboards +leech +leechcraft +leechdom +leecheater +leeched +leecher +leechery +leeches +leeching +leechkin +leechlike +leechman +leechwort +leed +leeds +leef +leefang +leefange +leeftail +leeful +leefully +leegatioen +leegte +leek +leeky +leekish +leeks +leelane +leelang +leep +leepit +leer +leered +leerfish +leery +leerier +leeriest +leerily +leeriness +leering +leeringly +leerish +leerness +leeroway +leers +leersia +lees +leese +leeser +leeshyy +leesing +leesome +leesomely +leet +leetle +leetman +leetmen +leets +leeway +leeways +leewan +leeward +leewardly +leewardmost +leewardness +leewards +leewill +lefsel +lefsen +left +lefter +leftest +lefty +lefties +leftish +leftism +leftisms +leftist +leftists +leftments +leftmost +leftness +leftover +leftovers +lefts +leftward +leftwardly +leftwards +leftwing +leftwinger +leg +legacy +legacies +legal +legalese +legaleses +legalise +legalised +legalises +legalising +legalism +legalisms +legalist +legalistic +legalistically +legalists +legality +legalities +legalization +legalizations +legalize +legalized +legalizes +legalizing +legally +legalness +legals +legantine +legantinelegatary +legatary +legate +legated +legatee +legatees +legates +legateship +legateships +legati +legatine +legating +legation +legationary +legations +legative +legato +legator +legatory +legatorial +legators +legatos +legature +legatus +legbar +lege +legend +legenda +legendary +legendarian +legendaries +legendarily +legendic +legendist +legendize +legendized +legendizing +legendless +legendry +legendrian +legendries +legends +leger +legerdemain +legerdemainist +legerete +legerity +legerities +legers +leges +legge +legged +legger +leggy +leggiadrous +leggier +leggiero +leggiest +leggin +legginess +legging +legginged +leggings +leggins +legharness +leghorn +leghorns +legibility +legibilities +legible +legibleness +legibly +legifer +legific +legion +legionary +legionaries +legioned +legioner +legionnaire +legionnaires +legionry +legions +legis +legislate +legislated +legislates +legislating +legislation +legislational +legislativ +legislative +legislatively +legislator +legislatorial +legislatorially +legislators +legislatorship +legislatress +legislatresses +legislatrices +legislatrix +legislatrixes +legislature +legislatures +legist +legister +legists +legit +legitim +legitimacy +legitimacies +legitimate +legitimated +legitimately +legitimateness +legitimating +legitimation +legitimatise +legitimatised +legitimatising +legitimatist +legitimatization +legitimatize +legitimatized +legitimatizing +legitime +legitimisation +legitimise +legitimised +legitimising +legitimism +legitimist +legitimistic +legitimity +legitimization +legitimizations +legitimize +legitimized +legitimizer +legitimizes +legitimizing +legitimum +legits +leglen +legless +leglessness +leglet +leglike +legman +legmen +legoa +legong +legpiece +legpull +legpuller +legpulling +legrete +legroom +legrooms +legrope +legs +legua +leguan +leguatia +leguleian +leguleious +legume +legumelin +legumen +legumes +legumin +leguminiform +leguminosae +leguminose +leguminous +legumins +legwork +legworks +lehay +lehayim +lehayims +lehi +lehmer +lehr +lehrbachite +lehrman +lehrmen +lehrs +lehrsman +lehrsmen +lehua +lehuas +lei +ley +leibnitzian +leibnitzianism +leicester +leyden +leif +leifite +leiger +leigh +leighton +leila +leyland +leimtype +leiocephalous +leiocome +leiodermatous +leiodermia +leiomyofibroma +leiomyoma +leiomyomas +leiomyomata +leiomyomatous +leiomyosarcoma +leiophyllous +leiophyllum +leiothrix +leiotrichan +leiotriches +leiotrichi +leiotrichy +leiotrichidae +leiotrichinae +leiotrichine +leiotrichous +leiotropic +leipoa +leipzig +leis +leys +leishmania +leishmanial +leishmaniasis +leishmanic +leishmanioid +leishmaniosis +leysing +leiss +leisten +leister +leistered +leisterer +leistering +leisters +leisurabe +leisurable +leisurably +leisure +leisured +leisureful +leisureless +leisurely +leisureliness +leisureness +leisures +leith +leitmotif +leitmotifs +leitmotiv +leitneria +leitneriaceae +leitneriaceous +leitneriales +lek +lekach +lekanai +lekane +lekha +lekythi +lekythoi +lekythos +lekythus +lekker +leks +lelia +lelwel +lemaireocereus +leman +lemanea +lemaneaceae +lemanry +lemans +leme +lemel +lemma +lemmas +lemmata +lemmatize +lemming +lemmings +lemmitis +lemmoblastic +lemmocyte +lemmon +lemmus +lemna +lemnaceae +lemnaceous +lemnad +lemnian +lemniscata +lemniscate +lemniscatic +lemnisci +lemniscus +lemnisnisci +lemogra +lemography +lemology +lemon +lemonade +lemonades +lemonado +lemonfish +lemonfishes +lemongrass +lemony +lemonias +lemoniidae +lemoniinae +lemonish +lemonlike +lemons +lemonweed +lemonwood +lemosi +lemovices +lempira +lempiras +lemuel +lemur +lemures +lemuria +lemurian +lemurid +lemuridae +lemuriform +lemurinae +lemurine +lemurlike +lemuroid +lemuroidea +lemuroids +lemurs +len +lena +lenad +lenaea +lenaean +lenaeum +lenaeus +lenape +lenard +lenca +lencan +lench +lencheon +lend +lendable +lended +lendee +lender +lenders +lending +lends +lendu +lene +lenes +leng +lenger +lengest +length +lengthen +lengthened +lengthener +lengtheners +lengthening +lengthens +lengther +lengthful +lengthy +lengthier +lengthiest +lengthily +lengthiness +lengthly +lengthman +lengths +lengthsman +lengthsmen +lengthsome +lengthsomeness +lengthways +lengthwise +leniate +lenience +leniences +leniency +leniencies +lenient +leniently +lenientness +lenify +lenin +leningrad +leninism +leninist +leninists +leninite +lenis +lenity +lenitic +lenities +lenition +lenitive +lenitively +lenitiveness +lenitives +lenitude +lenny +lennilite +lennoaceae +lennoaceous +lennow +leno +lenocinant +lenora +lenos +lens +lense +lensed +lenses +lensless +lenslike +lensman +lensmen +lent +lentamente +lentando +lenten +lententide +lenth +lenthways +lentibulariaceae +lentibulariaceous +lentic +lenticel +lenticellate +lenticels +lenticle +lenticonus +lenticula +lenticular +lenticulare +lenticularis +lenticularly +lenticulas +lenticulate +lenticulated +lenticulating +lenticulation +lenticule +lenticulostriate +lenticulothalamic +lentiform +lentigerous +lentigines +lentiginose +lentiginous +lentigo +lentil +lentile +lentilla +lentils +lentiner +lentisc +lentiscine +lentisco +lentiscus +lentisk +lentisks +lentissimo +lentitude +lentitudinous +lentner +lento +lentoid +lentor +lentos +lentous +lenvoi +lenvoy +lenzites +leo +leodicid +leon +leonard +leonardesque +leonardo +leonato +leoncito +leone +leones +leonese +leonhardite +leonid +leonine +leoninely +leonines +leonis +leonist +leonite +leonnoys +leonora +leonotis +leontiasis +leontocebus +leontocephalous +leontodon +leontopodium +leonurus +leopard +leoparde +leopardess +leopardine +leopardite +leopards +leopardskin +leopardwood +leopold +leopoldinia +leopoldite +leora +leos +leotard +leotards +lep +lepa +lepadid +lepadidae +lepadoid +lepage +lepal +lepanto +lepargylic +lepargyraea +lepas +lepcha +leper +leperdom +lepered +lepero +lepers +lepid +lepidene +lepidin +lepidine +lepidity +lepidium +lepidly +lepidoblastic +lepidodendraceae +lepidodendraceous +lepidodendrid +lepidodendrids +lepidodendroid +lepidodendroids +lepidodendron +lepidoid +lepidoidei +lepidolite +lepidomelane +lepidophyllous +lepidophyllum +lepidophyte +lepidophytic +lepidophloios +lepidoporphyrin +lepidopter +lepidoptera +lepidopteral +lepidopteran +lepidopterid +lepidopterist +lepidopterology +lepidopterological +lepidopterologist +lepidopteron +lepidopterous +lepidosauria +lepidosaurian +lepidoses +lepidosiren +lepidosirenidae +lepidosirenoid +lepidosis +lepidosperma +lepidospermae +lepidosphes +lepidostei +lepidosteoid +lepidosteus +lepidostrobus +lepidote +lepidotes +lepidotic +lepidotus +lepidurus +lepilemur +lepiota +lepisma +lepismatidae +lepismidae +lepismoid +lepisosteidae +lepisosteus +lepocyta +lepocyte +lepomis +leporicide +leporid +leporidae +leporide +leporids +leporiform +leporine +leporis +lepospondyli +lepospondylous +leposternidae +leposternon +lepothrix +leppy +lepra +lepralia +lepralian +lepre +leprechaun +leprechauns +lepry +lepric +leprid +leprine +leproid +leprology +leprologic +leprologist +leproma +lepromatous +leprosaria +leprosarium +leprosariums +leprose +leprosed +leprosery +leproseries +leprosy +leprosied +leprosies +leprosis +leprosity +leprotic +leprous +leprously +leprousness +lepsaria +lepta +leptamnium +leptandra +leptandrin +leptene +leptera +leptid +leptidae +leptiform +leptilon +leptynite +leptinolite +leptinotarsa +leptite +leptobos +leptocardia +leptocardian +leptocardii +leptocentric +leptocephalan +leptocephali +leptocephaly +leptocephalia +leptocephalic +leptocephalid +leptocephalidae +leptocephaloid +leptocephalous +leptocephalus +leptocercal +leptochlorite +leptochroa +leptochrous +leptoclase +leptodactyl +leptodactylidae +leptodactylous +leptodactylus +leptodermatous +leptodermous +leptodora +leptodoridae +leptoform +leptogenesis +leptokurtic +leptokurtosis +leptolepidae +leptolepis +leptolinae +leptology +leptomatic +leptome +leptomedusae +leptomedusan +leptomeningeal +leptomeninges +leptomeningitis +leptomeninx +leptometer +leptomonad +leptomonas +lepton +leptonecrosis +leptonema +leptonic +leptons +leptopellic +leptophyllous +leptophis +leptoprosope +leptoprosopy +leptoprosopic +leptoprosopous +leptoptilus +leptorchis +leptorrhin +leptorrhine +leptorrhiny +leptorrhinian +leptorrhinism +leptosyne +leptosomatic +leptosome +leptosomic +leptosperm +leptospermum +leptosphaeria +leptospira +leptospirae +leptospiral +leptospiras +leptospire +leptospirosis +leptosporangiate +leptostraca +leptostracan +leptostracous +leptostromataceae +leptotene +leptothrix +leptotyphlopidae +leptotyphlops +leptotrichia +leptus +lepus +lequear +ler +lere +lernaea +lernaeacea +lernaean +lernaeidae +lernaeiform +lernaeoid +lernaeoides +lerot +lerp +lerret +lerwa +les +lesath +lesbia +lesbian +lesbianism +lesbians +lesche +lese +lesed +lesgh +lesya +lesiy +lesion +lesional +lesions +leskea +leskeaceae +leskeaceous +lesleya +leslie +lespedeza +lesquerella +less +lessee +lessees +lesseeship +lessen +lessened +lessener +lessening +lessens +lesser +lesses +lessest +lessive +lessn +lessness +lesson +lessoned +lessoning +lessons +lessor +lessors +lest +leste +lester +lestiwarite +lestobioses +lestobiosis +lestobiotic +lestodon +lestosaurus +lestrad +lestrigon +lestrigonian +let +letch +letches +letchy +letdown +letdowns +lete +letgame +lethal +lethality +lethalities +lethalize +lethally +lethals +lethargy +lethargic +lethargical +lethargically +lethargicalness +lethargies +lethargise +lethargised +lethargising +lethargize +lethargized +lethargizing +lethargus +lethe +lethean +lethes +lethy +lethied +lethiferous +lethocerus +lethologica +letitia +leto +letoff +letorate +letrist +lets +lett +lettable +letted +letten +letter +lettercard +lettered +letterer +letterers +letteret +letterform +lettergae +lettergram +letterhead +letterheads +letterin +lettering +letterings +letterleaf +letterless +letterman +lettermen +lettern +letterpress +letters +letterset +letterspace +letterspaced +letterspacing +letterure +letterweight +letterwood +letty +lettic +lettice +lettiga +letting +lettish +lettrin +lettrure +lettsomite +lettuce +lettuces +letuare +letup +letups +leu +leucadendron +leucadian +leucaemia +leucaemic +leucaena +leucaethiop +leucaethiopes +leucaethiopic +leucaniline +leucanthous +leucaugite +leucaurin +leucemia +leucemias +leucemic +leucetta +leuch +leuchaemia +leuchemia +leuchtenbergite +leucic +leucichthys +leucifer +leuciferidae +leucyl +leucin +leucine +leucines +leucins +leucippus +leucism +leucite +leucites +leucitic +leucitis +leucitite +leucitohedron +leucitoid +leucitophyre +leuckartia +leuckartiidae +leuco +leucobasalt +leucoblast +leucoblastic +leucobryaceae +leucobryum +leucocarpous +leucochalcite +leucocholy +leucocholic +leucochroic +leucocyan +leucocidic +leucocidin +leucocism +leucocytal +leucocyte +leucocythaemia +leucocythaemic +leucocythemia +leucocythemic +leucocytic +leucocytoblast +leucocytogenesis +leucocytoid +leucocytolysin +leucocytolysis +leucocytolytic +leucocytology +leucocytometer +leucocytopenia +leucocytopenic +leucocytoplania +leucocytopoiesis +leucocytosis +leucocytotherapy +leucocytotic +leucocytozoon +leucocrate +leucocratic +leucocrinum +leucoderma +leucodermatous +leucodermia +leucodermic +leucoencephalitis +leucoethiop +leucogenic +leucoid +leucoindigo +leucoindigotin +leucojaceae +leucojum +leucoline +leucolytic +leucoma +leucomaine +leucomas +leucomatous +leucomelanic +leucomelanous +leucon +leucones +leuconoid +leuconostoc +leucopenia +leucopenic +leucophane +leucophanite +leucophyllous +leucophyre +leucophlegmacy +leucophoenicite +leucophore +leucopyrite +leucoplakia +leucoplakial +leucoplast +leucoplastid +leucopoiesis +leucopoietic +leucopus +leucoquinizarin +leucoryx +leucorrhea +leucorrheal +leucorrhoea +leucorrhoeal +leucosyenite +leucosis +leucosolenia +leucosoleniidae +leucospermous +leucosphenite +leucosphere +leucospheric +leucostasis +leucosticte +leucotactic +leucotaxin +leucotaxine +leucothea +leucothoe +leucotic +leucotome +leucotomy +leucotomies +leucotoxic +leucous +leucoxene +leud +leudes +leuds +leuk +leukaemia +leukaemic +leukemia +leukemias +leukemic +leukemics +leukemid +leukemoid +leukoblast +leukoblastic +leukocidic +leukocidin +leukocyte +leukocytes +leukocythemia +leukocytic +leukocytoblast +leukocytoid +leukocytopenia +leukocytosis +leukocytotic +leukoctyoid +leukoderma +leukodystrophy +leukoma +leukomas +leukon +leukons +leukopedesis +leukopenia +leukopenic +leukopoiesis +leukopoietic +leukorrhea +leukorrheal +leukorrhoea +leukorrhoeal +leukoses +leukosis +leukotaxin +leukotaxine +leukotic +leukotomy +leukotomies +leuma +leung +lev +leva +levade +levalloisian +levana +levance +levancy +levant +levanted +levanter +levantera +levanters +levantine +levanting +levanto +levants +levarterenol +levation +levator +levatores +levators +leve +leveche +levee +leveed +leveeing +levees +leveful +level +leveled +leveler +levelers +levelheaded +levelheadedly +levelheadedness +leveling +levelish +levelism +levelled +leveller +levellers +levellest +levelly +levelling +levelman +levelness +levels +leven +lever +leverage +leveraged +leverages +leveraging +levered +leverer +leveret +leverets +levering +leverlike +leverman +levers +leverwood +levesel +levet +levi +levy +leviable +leviathan +leviathans +leviation +levied +levier +leviers +levies +levigable +levigate +levigated +levigates +levigating +levigation +levigator +levying +levyist +levin +levyne +leviner +levining +levynite +levins +levir +levirate +levirates +leviratic +leviratical +leviration +levis +levisticum +levitant +levitate +levitated +levitates +levitating +levitation +levitational +levitations +levitative +levitator +levite +leviter +levity +levitical +leviticalism +leviticality +levitically +leviticalness +leviticism +leviticus +levities +levitism +levo +levoduction +levogyrate +levogyre +levogyrous +levoglucose +levolactic +levolimonene +levorotary +levorotation +levorotatory +levotartaric +levoversion +levulic +levulin +levulinic +levulins +levulose +levuloses +levulosuria +lew +lewanna +lewd +lewder +lewdest +lewdly +lewdness +lewdnesses +lewdster +lewie +lewing +lewis +lewises +lewisia +lewisian +lewisite +lewisites +lewisson +lewissons +lewist +lewnite +lewth +lewty +lex +lexeme +lexemic +lexia +lexic +lexica +lexical +lexicalic +lexicality +lexically +lexicog +lexicographer +lexicographers +lexicography +lexicographian +lexicographic +lexicographical +lexicographically +lexicographist +lexicology +lexicologic +lexicological +lexicologist +lexicon +lexiconist +lexiconize +lexicons +lexicostatistic +lexicostatistical +lexicostatistics +lexigraphy +lexigraphic +lexigraphical +lexigraphically +lexiphanes +lexiphanic +lexiphanicism +lexis +lexological +lezghian +lf +lg +lgth +lh +lhb +lhd +lherzite +lherzolite +lhiamba +lhota +li +ly +liability +liabilities +liable +liableness +liaise +liaised +liaises +liaising +liaison +liaisons +lyam +liamba +liana +lianas +lyance +liane +lianes +liang +liangle +liangs +lianoid +liar +liard +lyard +liards +liars +lyart +lias +lyas +lyase +lyases +liasing +liason +liassic +liatris +lib +libament +libaniferous +libanophorous +libanotophorous +libant +libard +libate +libated +libating +libation +libational +libationary +libationer +libations +libatory +libbard +libbed +libber +libbers +libbet +libby +libbing +libbra +libecchio +libeccio +libeccios +libel +libelant +libelants +libeled +libelee +libelees +libeler +libelers +libeling +libelist +libelists +libellant +libellary +libellate +libelled +libellee +libellees +libeller +libellers +libelling +libellist +libellous +libellously +libellula +libellulid +libellulidae +libelluloid +libelous +libelously +libels +liber +libera +liberal +liberalia +liberalisation +liberalise +liberalised +liberaliser +liberalising +liberalism +liberalist +liberalistic +liberalites +liberality +liberalities +liberalization +liberalizations +liberalize +liberalized +liberalizer +liberalizes +liberalizing +liberally +liberalness +liberals +liberate +liberated +liberates +liberating +liberation +liberationism +liberationist +liberationists +liberations +liberative +liberator +liberatory +liberators +liberatress +liberatrice +liberatrix +liberia +liberian +liberians +liberomotor +libers +libertarian +libertarianism +libertarians +libertas +liberty +liberticidal +liberticide +liberties +libertyless +libertinage +libertine +libertines +libertinism +liberum +libethenite +libget +libya +libyan +libyans +libidibi +libidinal +libidinally +libidinist +libidinization +libidinized +libidinizing +libidinosity +libidinous +libidinously +libidinousness +libido +libidos +libinit +libytheidae +libytheinae +libitina +libitum +libken +libkin +libocedrus +libr +libra +librae +librairie +libral +library +librarian +librarianess +librarians +librarianship +libraries +librarii +libraryless +librarious +librarius +libras +librate +librated +librates +librating +libration +librational +libratory +libre +libretti +librettist +librettists +libretto +librettos +libri +librid +libriform +libris +libroplast +libs +lyc +lycaena +lycaenid +lycaenidae +licania +lycanthrope +lycanthropy +lycanthropia +lycanthropic +lycanthropies +lycanthropist +lycanthropize +lycanthropous +licareol +licca +lice +lycea +lyceal +lycee +lycees +licence +licenceable +licenced +licencee +licencees +licencer +licencers +licences +licencing +licensable +license +licensed +licensee +licensees +licenseless +licenser +licensers +licenses +licensing +licensor +licensors +licensure +licentiate +licentiates +licentiateship +licentiation +licentious +licentiously +licentiousness +licet +lyceum +lyceums +lich +lych +licham +lichanos +lichee +lychee +lichees +lychees +lichen +lichenaceous +lichened +lichenes +licheny +lichenian +licheniasis +lichenic +lichenicolous +lichenification +licheniform +lichenin +lichening +lichenins +lichenise +lichenised +lichenising +lichenism +lichenist +lichenivorous +lichenization +lichenize +lichenized +lichenizing +lichenlike +lichenographer +lichenography +lichenographic +lichenographical +lichenographist +lichenoid +lichenology +lichenologic +lichenological +lichenologist +lichenopora +lichenoporidae +lichenose +lichenous +lichens +lichi +lichis +lychnic +lychnis +lychnises +lychnomancy +lichnophora +lichnophoridae +lychnoscope +lychnoscopic +licht +lichted +lichting +lichtly +lichts +lichwake +lycian +lycid +lycidae +lycine +licinian +licit +licitation +licitly +licitness +lycium +lick +licked +licker +lickerish +lickerishly +lickerishness +lickerous +lickers +lickety +licking +lickings +lickpenny +licks +lickspit +lickspits +lickspittle +lickspittling +lycodes +lycodidae +lycodoid +lycopene +lycopenes +lycoperdaceae +lycoperdaceous +lycoperdales +lycoperdoid +lycoperdon +lycopersicon +lycopin +lycopod +lycopode +lycopodiaceae +lycopodiaceous +lycopodiales +lycopodium +lycopods +lycopsida +lycopsis +lycopus +licorice +licorices +lycorine +licorn +licorne +licorous +lycosa +lycosid +lycosidae +licour +lyctid +lyctidae +lictor +lictorian +lictors +lyctus +licuala +licuri +licury +lycus +lid +lida +lidar +lidars +lidded +lidder +lidderon +lidding +lyddite +lyddites +lide +lidflower +lidgate +lidia +lydia +lydian +lidias +lidicker +lydite +lidless +lidlessly +lido +lidocaine +lidos +lids +lie +lye +liebenerite +lieberkuhn +liebfraumilch +liebgeaitor +liebig +liebigite +lieblich +liechtenstein +lied +lieder +liederkranz +lief +liefer +liefest +liefly +liefsome +liege +liegedom +liegeful +liegefully +liegeless +liegely +liegeman +liegemen +lieger +lieges +liegewoman +liegier +lien +lienable +lienal +lyencephala +lyencephalous +lienculi +lienculus +lienectomy +lienectomies +lienee +lienholder +lienic +lienitis +lienocele +lienogastric +lienointestinal +lienomalacia +lienomedullary +lienomyelogenous +lienopancreatic +lienor +lienorenal +lienotoxin +liens +lientery +lienteria +lienteric +lienteries +liepot +lieproof +lieprooflier +lieproofliest +lier +lyery +lierne +liernes +lierre +liers +lies +lyes +liesh +liespfund +liest +lieu +lieue +lieus +lieut +lieutenancy +lieutenancies +lieutenant +lieutenantry +lieutenants +lieutenantship +lievaart +lieve +liever +lievest +lievrite +lif +life +lifeblood +lifeboat +lifeboatman +lifeboatmen +lifeboats +lifebuoy +lifeday +lifedrop +lifeful +lifefully +lifefulness +lifeguard +lifeguards +lifehold +lifeholder +lifehood +lifey +lifeleaf +lifeless +lifelessly +lifelessness +lifelet +lifelike +lifelikeness +lifeline +lifelines +lifelong +lifemanship +lifen +lifer +liferent +liferented +liferenter +liferenting +liferentrix +liferoot +lifers +lifesaver +lifesavers +lifesaving +lifeskills +lifesome +lifesomely +lifesomeness +lifespan +lifespans +lifespring +lifestyle +lifestyles +lifetime +lifetimes +lifeway +lifeways +lifeward +lifework +lifeworks +lyfkie +liflod +lifo +lift +liftable +liftboy +lifted +lifter +lifters +lifting +liftless +liftman +liftmen +liftoff +liftoffs +lifts +lig +ligable +lygaeid +lygaeidae +ligament +ligamenta +ligamental +ligamentary +ligamentous +ligamentously +ligaments +ligamentta +ligamentum +ligan +ligand +ligands +ligans +ligas +ligase +ligases +ligate +ligated +ligates +ligating +ligation +ligations +ligative +ligator +ligatory +ligature +ligatured +ligatures +ligaturing +lige +ligeance +liger +lygeum +liggat +ligge +ligger +light +lightable +lightage +lightboard +lightboat +lightbrained +lighted +lighten +lightened +lightener +lighteners +lightening +lightens +lighter +lighterage +lightered +lighterful +lightering +lighterman +lightermen +lighters +lightest +lightface +lightfaced +lightfast +lightfastness +lightfingered +lightfoot +lightfooted +lightful +lightfully +lightfulness +lighthead +lightheaded +lightheadedly +lightheadedness +lighthearted +lightheartedly +lightheartedness +lighthouse +lighthouseman +lighthouses +lighty +lightyears +lighting +lightings +lightish +lightkeeper +lightless +lightlessness +lightly +lightman +lightmans +lightmanship +lightmen +lightmindedly +lightmindedness +lightmouthed +lightness +lightning +lightningbug +lightninged +lightninglike +lightningproof +lightnings +lightplane +lightproof +lightroom +lights +lightscot +lightship +lightships +lightsman +lightsmen +lightsome +lightsomely +lightsomeness +lighttight +lightwards +lightweight +lightweights +lightwood +lightwort +ligyda +ligydidae +ligitimized +ligitimizing +lignaloes +lignatile +ligne +ligneous +lignes +lignescent +lignicole +lignicoline +lignicolous +ligniferous +lignify +lignification +lignifications +lignified +lignifies +lignifying +ligniform +lignin +lignins +ligninsulphonate +ligniperdous +lignite +lignites +lignitic +lignitiferous +lignitize +lignivorous +lignocaine +lignocellulose +lignocellulosic +lignoceric +lignography +lignone +lignose +lignosity +lignosulfonate +lignosulphite +lignosulphonate +lignous +lignum +lignums +lygodium +lygosoma +ligroin +ligroine +ligroines +ligroins +ligula +ligulae +ligular +ligularia +ligulas +ligulate +ligulated +ligule +ligules +liguliflorae +liguliflorous +liguliform +ligulin +liguloid +liguorian +ligure +ligures +ligurian +ligurite +ligurition +ligurrition +lygus +ligusticum +ligustrin +ligustrum +lihyanite +liin +lying +lyingly +lyings +liyuan +lija +likability +likable +likableness +like +likeability +likeable +likeableness +liked +likeful +likehood +likely +likelier +likeliest +likelihead +likelihood +likelihoods +likeliness +likeminded +likemindedness +liken +lyken +likened +likeness +likenesses +likening +likens +liker +likerish +likerous +likers +likes +likesome +likest +likeways +lykewake +likewalk +likewise +likewisely +likewiseness +likin +liking +likingly +likings +likker +liknon +likuta +lila +lilac +lilaceous +lilacin +lilacky +lilacs +lilacthroat +lilactide +lilaeopsis +lilas +lilburne +lile +liles +lily +liliaceae +liliaceous +lilial +liliales +lilian +liliated +lilied +lilies +lilyfy +liliform +lilyhanded +liliiflorae +lilylike +lilith +lilium +lilywood +lilywort +lill +lilly +lillianite +lillibullero +lilliput +lilliputian +lilliputianize +lilliputians +lilliputs +lilt +lilted +lilting +liltingly +liltingness +lilts +lim +lym +lima +limace +limacea +limacel +limacelle +limaceous +limacidae +limaciform +limacina +limacine +limacines +limacinid +limacinidae +limacoid +limacon +limacons +limail +limaille +liman +limans +lymantria +lymantriid +lymantriidae +limas +limation +limawood +limax +limb +limba +limbal +limbas +limbat +limbate +limbation +limbec +limbeck +limbecks +limbed +limber +limbered +limberer +limberest +limberham +limbering +limberly +limberneck +limberness +limbers +limbi +limby +limbic +limbie +limbier +limbiest +limbiferous +limbing +limbless +limbmeal +limbo +limboinfantum +limbos +limbous +limbs +limbu +limburger +limburgite +limbus +limbuses +lime +limeade +limeades +limean +limeberry +limeberries +limebush +limed +limehouse +limey +limeys +limekiln +limekilns +limeless +limelight +limelighter +limelights +limelike +limeman +limen +limens +limequat +limer +limerick +limericks +limes +limestone +limestones +limesulfur +limesulphur +limetta +limettin +limewash +limewater +limewood +limewort +lymhpangiophlebitis +limy +limicolae +limicoline +limicolous +limidae +limier +limiest +limina +liminal +liminary +limine +liminess +liminesses +liming +limit +limitability +limitable +limitableness +limitably +limital +limitanean +limitary +limitarian +limitaries +limitate +limitation +limitational +limitations +limitative +limitatively +limited +limitedly +limitedness +limiteds +limiter +limiters +limites +limity +limiting +limitive +limitless +limitlessly +limitlessness +limitor +limitrophe +limits +limivorous +limli +limma +limmata +limmer +limmers +limmock +limmu +limn +lymnaea +lymnaean +lymnaeid +lymnaeidae +limnal +limnanth +limnanthaceae +limnanthaceous +limnanthemum +limnanthes +limned +limner +limnery +limners +limnetic +limnetis +limniad +limnic +limnimeter +limnimetric +limning +limnite +limnobiology +limnobiologic +limnobiological +limnobiologically +limnobios +limnobium +limnocnida +limnograph +limnology +limnologic +limnological +limnologically +limnologist +limnometer +limnophil +limnophile +limnophilid +limnophilidae +limnophilous +limnophobia +limnoplankton +limnorchis +limnoria +limnoriidae +limnorioid +limns +limo +limodorum +limoid +limoncillo +limoncito +limonene +limonenes +limoniad +limonin +limonite +limonites +limonitic +limonitization +limonium +limos +limosa +limose +limosella +limosi +limous +limousin +limousine +limousines +limp +limped +limper +limpers +limpest +limpet +limpets +lymph +lymphad +lymphadenectasia +lymphadenectasis +lymphadenia +lymphadenitis +lymphadenoid +lymphadenoma +lymphadenomas +lymphadenomata +lymphadenome +lymphadenopathy +lymphadenosis +lymphaemia +lymphagogue +lymphangeitis +lymphangial +lymphangiectasis +lymphangiectatic +lymphangiectodes +lymphangiitis +lymphangioendothelioma +lymphangiofibroma +lymphangiology +lymphangioma +lymphangiomas +lymphangiomata +lymphangiomatous +lymphangioplasty +lymphangiosarcoma +lymphangiotomy +lymphangitic +lymphangitides +lymphangitis +lymphatic +lymphatical +lymphatically +lymphation +lymphatism +lymphatitis +lymphatolysin +lymphatolysis +lymphatolytic +limphault +lymphectasia +lymphedema +lymphemia +lymphenteritis +lymphy +lymphoadenoma +lymphoblast +lymphoblastic +lymphoblastoma +lymphoblastosis +lymphocele +lymphocyst +lymphocystosis +lymphocyte +lymphocytes +lymphocythemia +lymphocytic +lymphocytoma +lymphocytomatosis +lymphocytosis +lymphocytotic +lymphocytotoxin +lymphodermia +lymphoduct +lymphoedema +lymphogenic +lymphogenous +lymphoglandula +lymphogranuloma +lymphogranulomas +lymphogranulomata +lymphogranulomatosis +lymphogranulomatous +lymphography +lymphographic +lymphoid +lymphoidectomy +lymphoidocyte +lymphology +lymphoma +lymphomas +lymphomata +lymphomatoid +lymphomatosis +lymphomatous +lymphomyxoma +lymphomonocyte +lymphopathy +lymphopenia +lymphopenial +lymphopoieses +lymphopoiesis +lymphopoietic +lymphoprotease +lymphorrhage +lymphorrhagia +lymphorrhagic +lymphorrhea +lymphosarcoma +lymphosarcomas +lymphosarcomatosis +lymphosarcomatous +lymphosporidiosis +lymphostasis +lymphotaxis +lymphotome +lymphotomy +lymphotoxemia +lymphotoxin +lymphotrophy +lymphotrophic +lymphous +lymphs +lymphuria +limpy +limpid +limpidity +limpidly +limpidness +limpily +limpin +limpiness +limping +limpingly +limpingness +limpish +limpkin +limpkins +limply +limpness +limpnesses +limps +limpsey +limpsy +limpwort +limsy +limu +limuli +limulid +limulidae +limuloid +limuloidea +limuloids +limulus +limurite +lin +lyn +lina +linable +linac +linaceae +linaceous +linacs +linaga +linage +linages +linalyl +linaloa +linaloe +linalol +linalols +linalool +linalools +linamarin +linanthus +linaria +linarite +lyncean +lynceus +linch +lynch +lynchable +linchbolt +lynched +lyncher +lynchers +lynches +linchet +lynchet +lynching +lynchings +linchpin +linchpinned +linchpins +lyncid +lyncine +lincloth +lincoln +lincolnesque +lincolnian +lincolniana +lincolnlike +lincomycin +lincrusta +lincture +linctus +lind +linda +lindabrides +lindackerite +lindane +lindanes +linden +lindens +linder +lindera +lindy +lindied +lindies +lindying +lindleyan +lindo +lindoite +lyndon +lindsay +lindsey +lindworm +line +linea +lineable +lineage +lineaged +lineages +lineal +lineality +lineally +lineament +lineamental +lineamentation +lineaments +lineameter +linear +lineary +linearifolius +linearisation +linearise +linearised +linearising +linearity +linearities +linearizable +linearization +linearize +linearized +linearizes +linearizing +linearly +lineas +lineate +lineated +lineation +lineatum +lineature +linebacker +linebackers +linebacking +linebred +linebreed +linebreeding +linecaster +linecasting +linecut +linecuts +lined +linefeed +linefeeds +liney +lineiform +lineless +linelet +linelike +lineman +linemen +linen +linendrapers +linene +linener +linenette +linenfold +lineny +linenize +linenizer +linenman +linens +linenumber +linenumbers +lineocircular +lineograph +lineolate +lineolated +lineprinter +liner +linerange +linerless +liners +lines +linesides +linesman +linesmen +linet +linetest +lynette +lineup +lineups +linewalker +linework +ling +linga +lingayat +lingala +lingam +lingams +lingas +lingberry +lingberries +lyngbyaceae +lyngbyeae +lingbird +lingcod +lingcods +linge +lingel +lingenberry +lingence +linger +lingered +lingerer +lingerers +lingerie +lingeries +lingering +lingeringly +lingers +linget +lingy +lingier +lingiest +lingism +lingle +lingo +lingoe +lingoes +lingonberry +lingonberries +lingot +lingoum +lings +lingster +lingtow +lingtowman +lingua +linguacious +linguaciousness +linguadental +linguae +linguaeform +lingual +linguale +lingualis +linguality +lingualize +lingually +linguals +linguanasal +linguata +linguatula +linguatulida +linguatulina +linguatuline +linguatuloid +linguet +linguidental +linguiform +linguine +linguines +linguini +linguinis +linguipotence +linguished +linguist +linguister +linguistic +linguistical +linguistically +linguistician +linguistics +linguistry +linguists +lingula +lingulae +lingulate +lingulated +lingulella +lingulid +lingulidae +linguliferous +linguliform +linguloid +linguodental +linguodistal +linguogingival +linguopalatal +linguopapillitis +linguoversion +lingwort +linha +linhay +liny +linie +linier +liniest +liniya +liniment +liniments +linin +lininess +lining +linings +linins +linyphia +linyphiid +linyphiidae +linitis +linja +linje +link +linkable +linkage +linkages +linkboy +linkboys +linked +linkedit +linkedited +linkediting +linkeditor +linkeditted +linkeditting +linkedness +linker +linkers +linky +linkier +linkiest +linking +linkman +linkmen +links +linksman +linksmen +linksmith +linkster +linkup +linkups +linkwork +linkworks +linley +linn +lynn +linnaea +linnaean +linnaeanism +linnaeite +linne +lynne +linneon +linnet +linnets +lynnette +lynnhaven +linns +lino +linocut +linocuts +linolate +linoleate +linoleic +linolein +linolenate +linolenic +linolenin +linoleum +linoleums +linolic +linolin +linometer +linon +linonophobia +linopteris +linos +linotype +linotyped +linotyper +linotypes +linotyping +linotypist +linous +linoxin +linoxyn +linpin +linquish +lins +linsang +linsangs +linseed +linseeds +linsey +linseys +linstock +linstocks +lint +lintel +linteled +linteling +lintelled +lintelling +lintels +linten +linter +lintern +linters +linty +lintie +lintier +lintiest +lintless +lintol +lintols +lintonite +lints +lintseed +lintwhite +linum +linums +linus +linwood +lynx +lynxes +lynxlike +lyocratic +liodermia +lyolysis +lyolytic +lyomeri +lyomerous +liomyofibroma +liomyoma +lion +lyon +lionced +lioncel +lionel +lyonese +lionesque +lioness +lionesses +lionet +lyonetia +lyonetiid +lyonetiidae +lionfish +lionfishes +lionheart +lionhearted +lionheartedly +lionheartedness +lionhood +lionisation +lionise +lionised +lioniser +lionisers +lionises +lionising +lionism +lionizable +lionization +lionize +lionized +lionizer +lionizers +lionizes +lionizing +lionly +lionlike +lyonnais +lyonnaise +lionne +lyonnesse +lionproof +lions +lionship +lyophil +lyophile +lyophiled +lyophilic +lyophilization +lyophilize +lyophilized +lyophilizer +lyophilizing +lyophobe +lyophobic +lyopoma +lyopomata +lyopomatous +liothrix +liotrichi +liotrichidae +liotrichine +lyotrope +lyotropic +lip +lipa +lipacidemia +lipaciduria +lipaemia +lipaemic +lipan +liparian +liparid +liparidae +liparididae +liparis +liparite +liparocele +liparoid +liparomphalus +liparous +lipase +lipases +lipectomy +lipectomies +lypemania +lipemia +lipemic +lyperosia +lipeurus +lipic +lipid +lipide +lipides +lipidic +lipids +lipin +lipins +lipless +liplet +liplike +lipoblast +lipoblastoma +lipobranchia +lipocaic +lipocardiac +lipocele +lipoceratous +lipocere +lipochondroma +lipochrome +lipochromic +lipochromogen +lipocyte +lipocytes +lipoclasis +lipoclastic +lipodystrophy +lipodystrophia +lipoferous +lipofibroma +lipogenesis +lipogenetic +lipogenic +lipogenous +lipogram +lipogrammatic +lipogrammatism +lipogrammatist +lipography +lipographic +lipohemia +lipoid +lipoidaemia +lipoidal +lipoidemia +lipoidic +lipoids +lipolyses +lipolysis +lipolitic +lipolytic +lipoma +lipomas +lipomata +lipomatosis +lipomatous +lipometabolic +lipometabolism +lipomyoma +lipomyxoma +lipomorph +lipopectic +lipopexia +lipophagic +lipophilic +lipophore +lipopod +lipopoda +lipopolysaccharide +lipoprotein +liposarcoma +liposis +liposoluble +liposome +lipostomy +lipothymy +lipothymia +lypothymia +lipothymial +lipothymic +lipotype +lipotyphla +lipotrophy +lipotrophic +lipotropy +lipotropic +lipotropin +lipotropism +lipovaccine +lipoxeny +lipoxenous +lipoxidase +lipped +lippen +lippened +lippening +lippens +lipper +lippered +lippering +lipperings +lippers +lippy +lippia +lippie +lippier +lippiest +lippiness +lipping +lippings +lippitude +lippitudo +lipread +lipreading +lips +lipsalve +lipsanographer +lipsanotheca +lipse +lipstick +lipsticks +lipuria +lipwork +liq +liquable +liquamen +liquate +liquated +liquates +liquating +liquation +liquefacient +liquefaction +liquefactions +liquefactive +liquefy +liquefiability +liquefiable +liquefied +liquefier +liquefiers +liquefies +liquefying +liquer +liquesce +liquescence +liquescency +liquescent +liquet +liqueur +liqueured +liqueuring +liqueurs +liquid +liquidable +liquidambar +liquidamber +liquidate +liquidated +liquidates +liquidating +liquidation +liquidations +liquidator +liquidators +liquidatorship +liquidy +liquidise +liquidised +liquidising +liquidity +liquidities +liquidization +liquidize +liquidized +liquidizer +liquidizes +liquidizing +liquidless +liquidly +liquidness +liquidogenic +liquidogenous +liquids +liquidus +liquify +liquified +liquifier +liquifiers +liquifies +liquifying +liquiform +liquor +liquored +liquorer +liquory +liquorice +liquoring +liquorish +liquorishly +liquorishness +liquorist +liquorless +liquors +lir +lira +lyra +lyraid +liras +lirate +lyrate +lyrated +lyrately +liration +lyraway +lire +lyre +lyrebird +lyrebirds +lyreflower +lirella +lirellate +lirelliform +lirelline +lirellous +lyreman +lyres +lyretail +lyric +lyrical +lyrically +lyricalness +lyrichord +lyricisation +lyricise +lyricised +lyricises +lyricising +lyricism +lyricisms +lyricist +lyricists +lyricization +lyricize +lyricized +lyricizes +lyricizing +lyricked +lyricking +lyrics +lyrid +lyriform +lirioddra +liriodendra +liriodendron +liriodendrons +liripipe +liripipes +liripoop +lyrism +lyrisms +lyrist +lyrists +liroconite +lirot +liroth +lyrurus +lis +lys +lisa +lysander +lysate +lysates +lisbon +lise +lyse +lysed +lysenkoism +lisere +lysergic +lyses +lisette +lish +lysidin +lysidine +lisiere +lysigenic +lysigenous +lysigenously +lysiloma +lysimachia +lysimachus +lysimeter +lysimetric +lysin +lysine +lysines +lysing +lysins +lysis +lysistrata +lisk +lisle +lisles +lysogen +lysogenesis +lysogenetic +lysogeny +lysogenic +lysogenicity +lysogenies +lysogenization +lysogenize +lysogens +lysol +lysolecithin +lysosomal +lysosomally +lysosome +lysosomes +lysozyme +lysozymes +lisp +lisped +lisper +lispers +lisping +lispingly +lispound +lisps +lispund +liss +lyssa +lissamphibia +lissamphibian +lyssas +lissencephala +lissencephalic +lissencephalous +lisses +lyssic +lissoflagellata +lissoflagellate +lissom +lissome +lissomely +lissomeness +lissomly +lissomness +lyssophobia +lissotrichan +lissotriches +lissotrichy +lissotrichous +list +listable +listed +listedness +listel +listels +listen +listenable +listened +listener +listeners +listenership +listening +listenings +listens +lister +listera +listerelloses +listerellosis +listeria +listerian +listeriases +listeriasis +listerine +listerioses +listeriosis +listerism +listerize +listers +listful +listy +listing +listings +listless +listlessly +listlessness +listred +lists +listwork +lisuarte +liszt +lit +litai +litaneutical +litany +litanies +litanywise +litarge +litas +litation +litatu +litch +litchi +litchis +lite +liter +literacy +literacies +literaehumaniores +literaily +literal +literalisation +literalise +literalised +literaliser +literalising +literalism +literalist +literalistic +literalistically +literality +literalities +literalization +literalize +literalized +literalizer +literalizing +literally +literalminded +literalmindedness +literalness +literals +literary +literarian +literaryism +literarily +literariness +literata +literate +literated +literately +literateness +literates +literati +literatim +literation +literatist +literato +literator +literatos +literature +literatured +literatures +literatus +lyterian +literose +literosity +liters +lites +lith +lithaemia +lithaemic +lithagogue +lithangiuria +lithanode +lithanthrax +litharge +litharges +lithate +lithatic +lithe +lythe +lithectasy +lithectomy +lithely +lithemia +lithemias +lithemic +litheness +lither +litherly +litherness +lithesome +lithesomeness +lithest +lithi +lithy +lithia +lithias +lithiasis +lithiastic +lithiate +lithic +lithically +lithifaction +lithify +lithification +lithified +lithifying +lithiophilite +lithite +lithium +lithiums +lithless +litho +lithobiid +lithobiidae +lithobioid +lithobius +lithocarpus +lithocenosis +lithochemistry +lithochromatic +lithochromatics +lithochromatography +lithochromatographic +lithochromy +lithochromic +lithochromography +lithocyst +lithocystotomy +lithoclase +lithoclast +lithoclasty +lithoclastic +lithoculture +lithodes +lithodesma +lithodialysis +lithodid +lithodidae +lithodomous +lithodomus +lithoed +lithofellic +lithofellinic +lithofracteur +lithofractor +lithog +lithogenesy +lithogenesis +lithogenetic +lithogeny +lithogenous +lithoglyph +lithoglypher +lithoglyphic +lithoglyptic +lithoglyptics +lithograph +lithographed +lithographer +lithographers +lithography +lithographic +lithographical +lithographically +lithographing +lithographize +lithographs +lithogravure +lithoid +lithoidal +lithoidite +lithoing +lithol +litholabe +litholapaxy +litholatry +litholatrous +litholysis +litholyte +litholytic +lithology +lithologic +lithological +lithologically +lithologist +lithomancy +lithomarge +lithometeor +lithometer +lithonephria +lithonephritis +lithonephrotomy +lithonephrotomies +lithontriptic +lithontriptist +lithontriptor +lithopaedion +lithopaedium +lithopedion +lithopedium +lithophagous +lithophane +lithophany +lithophanic +lithophyl +lithophile +lithophyll +lithophyllous +lithophilous +lithophysa +lithophysae +lithophysal +lithophyte +lithophytic +lithophytous +lithophone +lithophotography +lithophotogravure +lithophthisis +lithopone +lithoprint +lithoprinter +lithos +lithoscope +lithosere +lithosian +lithosiid +lithosiidae +lithosiinae +lithosis +lithosol +lithosols +lithosperm +lithospermon +lithospermous +lithospermum +lithosphere +lithospheric +lithotint +lithotype +lithotyped +lithotypy +lithotypic +lithotyping +lithotome +lithotomy +lithotomic +lithotomical +lithotomies +lithotomist +lithotomize +lithotomous +lithotony +lithotresis +lithotripsy +lithotriptor +lithotrite +lithotrity +lithotritic +lithotrities +lithotritist +lithotritor +lithous +lithoxyl +lithoxyle +lithoxylite +lythraceae +lythraceous +lythrum +lithsman +lithuania +lithuanian +lithuanians +lithuanic +lithuresis +lithuria +liti +lytic +lytically +liticontestation +lityerses +litigable +litigant +litigants +litigate +litigated +litigates +litigating +litigation +litigationist +litigations +litigator +litigatory +litigators +litigiosity +litigious +litigiously +litigiousness +litiopa +litiscontest +litiscontestation +litiscontestational +litmus +litmuses +litopterna +litoral +litorina +litorinidae +litorinoid +litotes +litra +litre +litres +lits +litsea +litster +lytta +lyttae +lyttas +litten +litter +litterateur +litterateurs +litteratim +litterbag +litterbug +litterbugs +littered +litterer +litterers +littery +littering +littermate +littermates +litters +little +littleleaf +littleneck +littlenecks +littleness +littler +littles +littlest +littlewale +littlin +littling +littlish +littoral +littorals +littorella +littrateur +littress +litu +lituate +litui +lituiform +lituite +lituites +lituitidae +lituitoid +lituola +lituoline +lituoloid +liturate +liturgy +liturgic +liturgical +liturgically +liturgician +liturgics +liturgies +liturgiology +liturgiological +liturgiologist +liturgism +liturgist +liturgistic +liturgistical +liturgists +liturgize +litus +lituus +litvak +litz +liukiu +liv +livability +livable +livableness +livably +live +liveability +liveable +liveableness +livebearer +liveborn +lived +livedo +liveyer +lively +livelier +liveliest +livelihead +livelihood +livelihoods +livelily +liveliness +livelong +liven +livened +livener +liveners +liveness +livenesses +livening +livens +liver +liverance +liverberry +liverberries +livered +liverhearted +liverheartedness +livery +liverydom +liveried +liveries +liveryless +liveryman +liverymen +livering +liverish +liverishness +liverleaf +liverleaves +liverless +liverpool +liverpudlian +livers +liverwort +liverworts +liverwurst +liverwursts +lives +livest +livestock +liveth +livetin +livetrap +livetrapped +livetrapping +livetraps +liveware +liveweight +livian +livid +lividity +lividities +lividly +lividness +livier +livyer +liviers +livyers +living +livingless +livingly +livingness +livings +livingstoneite +livish +livishly +livistona +livlihood +livonian +livor +livraison +livre +livres +liwan +lixive +lixivia +lixivial +lixiviate +lixiviated +lixiviating +lixiviation +lixiviator +lixivious +lixivium +lixiviums +lyxose +liz +liza +lizard +lizardfish +lizardfishes +lizardlike +lizards +lizardtail +lizary +lizzie +ll +llama +llamas +llanberisslate +llandeilo +llandovery +llanero +llano +llanos +llareta +llautu +llb +ller +lleu +llew +llyn +lloyd +lludd +lm +ln +lndg +lnr +lo +loa +loach +loaches +load +loadable +loadage +loaded +loadedness +loaden +loader +loaders +loadinfo +loading +loadings +loadless +loadpenny +loads +loadsome +loadspecs +loadstar +loadstars +loadstone +loadstones +loadum +loaf +loafed +loafer +loaferdom +loaferish +loafers +loafing +loafingly +loaflet +loafs +loaghtan +loaiasis +loam +loamed +loamy +loamier +loamiest +loamily +loaminess +loaming +loamless +loammi +loams +loan +loanable +loanblend +loaned +loaner +loaners +loange +loanin +loaning +loanings +loanmonger +loans +loanshark +loansharking +loanshift +loanword +loanwords +loasa +loasaceae +loasaceous +loath +loathe +loathed +loather +loathers +loathes +loathful +loathfully +loathfulness +loathy +loathing +loathingly +loathings +loathly +loathliness +loathness +loathsome +loathsomely +loathsomeness +loatuko +loave +loaves +lob +lobachevskian +lobal +lobale +lobar +lobaria +lobata +lobatae +lobate +lobated +lobately +lobation +lobations +lobbed +lobber +lobbers +lobby +lobbied +lobbyer +lobbyers +lobbies +lobbygow +lobbygows +lobbying +lobbyism +lobbyisms +lobbyist +lobbyists +lobbyman +lobbymen +lobbing +lobbish +lobcock +lobcokt +lobe +lobectomy +lobectomies +lobed +lobefin +lobefins +lobefoot +lobefooted +lobefoots +lobeless +lobelet +lobelia +lobeliaceae +lobeliaceous +lobelias +lobelin +lobeline +lobelines +lobellated +lobes +lobfig +lobi +lobiform +lobigerous +lobing +lobiped +loblolly +loblollies +lobo +lobola +lobolo +lobolos +lobopodium +lobos +lobosa +lobose +lobotomy +lobotomies +lobotomize +lobotomized +lobotomizing +lobs +lobscourse +lobscouse +lobscouser +lobsided +lobster +lobstering +lobsterish +lobsterlike +lobsterman +lobsterproof +lobsters +lobstick +lobsticks +lobtail +lobular +lobularia +lobularly +lobulate +lobulated +lobulation +lobule +lobules +lobulette +lobuli +lobulose +lobulous +lobulus +lobus +lobworm +lobworms +loc +loca +locable +local +locale +localed +locales +localing +localisable +localisation +localise +localised +localiser +localises +localising +localism +localisms +localist +localistic +localists +localite +localites +locality +localities +localizable +localization +localizations +localize +localized +localizer +localizes +localizing +localled +locally +localling +localness +locals +locanda +locarnist +locarnite +locarnize +locarno +locatable +locate +located +locater +locaters +locates +locating +locatio +location +locational +locationally +locations +locative +locatives +locator +locators +locatum +locellate +locellus +loch +lochaber +lochage +lochagus +lochan +loche +lochetic +lochi +lochy +lochia +lochial +lochiocyte +lochiocolpos +lochiometra +lochiometritis +lochiopyra +lochiorrhagia +lochiorrhea +lochioschesis +lochlin +lochometritis +lochoperitonitis +lochopyra +lochs +lochus +loci +lociation +lock +lockable +lockage +lockages +lockatong +lockbox +lockboxes +locked +locker +lockerman +lockermen +lockers +locket +lockets +lockfast +lockful +lockhole +locky +lockian +lockianism +lockyer +locking +lockings +lockjaw +lockjaws +lockless +locklet +lockmaker +lockmaking +lockman +locknut +locknuts +lockout +lockouts +lockpin +lockport +lockram +lockrams +lockrum +locks +locksman +locksmith +locksmithery +locksmithing +locksmiths +lockspit +lockstep +locksteps +lockstitch +lockup +lockups +lockwork +locn +loco +locodescriptive +locoed +locoes +locofoco +locofocoism +locofocos +locoing +locoism +locoisms +locoman +locomobile +locomobility +locomote +locomoted +locomotes +locomotility +locomoting +locomotion +locomotive +locomotively +locomotiveman +locomotivemen +locomotiveness +locomotives +locomotivity +locomotor +locomotory +locomutation +locos +locoweed +locoweeds +locrian +locrine +loculament +loculamentose +loculamentous +locular +loculate +loculated +loculation +locule +loculed +locules +loculi +loculicidal +loculicidally +loculose +loculous +loculus +locum +locums +locuplete +locupletely +locus +locusca +locust +locusta +locustae +locustal +locustberry +locustelle +locustid +locustidae +locusting +locustlike +locusts +locution +locutionary +locutions +locutor +locutory +locutoria +locutories +locutorium +locutorship +locuttoria +lod +loddigesia +lode +lodeman +lodemanage +loden +lodens +lodes +lodesman +lodesmen +lodestar +lodestars +lodestone +lodestuff +lodge +lodgeable +lodged +lodgeful +lodgeman +lodgement +lodgements +lodgepole +lodger +lodgerdom +lodgers +lodges +lodging +lodginghouse +lodgings +lodgment +lodgments +lodha +lodicula +lodicule +lodicules +lodoicea +lodowic +lodowick +lodur +loe +loed +loegria +loeil +loeing +loellingite +loess +loessal +loesses +loessial +loessic +loessland +loessoid +lof +lofstelle +loft +lofted +lofter +lofters +lofty +loftier +loftiest +loftily +loftiness +lofting +loftless +loftman +loftmen +lofts +loftsman +loftsmen +log +logan +loganberry +loganberries +logania +loganiaceae +loganiaceous +loganin +logans +logaoedic +logarithm +logarithmal +logarithmetic +logarithmetical +logarithmetically +logarithmic +logarithmical +logarithmically +logarithmomancy +logarithms +logbook +logbooks +logchip +logcock +loge +logeia +logeion +loges +logeum +loggat +loggats +logged +logger +loggerhead +loggerheaded +loggerheads +loggers +logget +loggets +loggy +loggia +loggias +loggie +loggier +loggiest +loggin +logginess +logging +loggings +loggish +loghead +logheaded +logy +logia +logic +logical +logicalist +logicality +logicalization +logicalize +logically +logicalness +logicaster +logician +logicianer +logicians +logicise +logicised +logicises +logicising +logicism +logicist +logicity +logicize +logicized +logicizes +logicizing +logicless +logics +logie +logier +logiest +logily +login +loginess +loginesses +logins +logion +logions +logis +logistic +logistical +logistically +logistician +logisticians +logistics +logium +logjam +logjams +loglet +loglike +loglog +logman +lognormal +lognormality +lognormally +logo +logocracy +logodaedaly +logodaedalus +logoes +logoff +logogogue +logogram +logogrammatic +logogrammatically +logograms +logograph +logographer +logography +logographic +logographical +logographically +logogriph +logogriphic +logoi +logolatry +logology +logomach +logomacher +logomachy +logomachic +logomachical +logomachies +logomachist +logomachize +logomachs +logomancy +logomania +logomaniac +logometer +logometric +logometrical +logometrically +logopaedics +logopedia +logopedic +logopedics +logophobia +logorrhea +logorrheic +logorrhoea +logos +logothete +logotype +logotypes +logotypy +logotypies +logout +logperch +logperches +logres +logria +logris +logroll +logrolled +logroller +logrolling +logrolls +logs +logship +logway +logways +logwise +logwood +logwoods +logwork +lohan +lohana +lohar +lohengrin +lohoch +lohock +loy +loyal +loyaler +loyalest +loyalism +loyalisms +loyalist +loyalists +loyalize +loyally +loyalness +loyalty +loyalties +loiasis +loyd +loimic +loimography +loimology +loin +loyn +loincloth +loinclothes +loincloths +loined +loinguard +loins +loyolism +loyolite +loir +lois +loiseleuria +loiter +loitered +loiterer +loiterers +loitering +loiteringly +loiteringness +loiters +loka +lokacara +lokao +lokaose +lokapala +loke +lokelani +loket +loki +lokiec +lokindra +lokman +lokshen +lola +loli +loliginidae +loligo +lolium +loll +lollapaloosa +lollapalooza +lollard +lollardy +lollardian +lollardism +lollardist +lollardize +lollardlike +lollardry +lolled +loller +lollers +lolly +lollies +lollygag +lollygagged +lollygagging +lollygags +lolling +lollingite +lollingly +lollipop +lollypop +lollipops +lollypops +lollop +lolloped +lollopy +lolloping +lollops +lolls +lollup +lolo +loma +lomastome +lomata +lomatine +lomatinous +lomatium +lombard +lombardeer +lombardesque +lombardian +lombardic +lomboy +lombrosian +loment +lomenta +lomentaceous +lomentaria +lomentariaceous +lomentlike +loments +lomentum +lomentums +lomilomi +lomita +lommock +lomonite +lomta +lonchocarpus +lonchopteridae +lond +londinensian +london +londoner +londoners +londonese +londonesque +londony +londonian +londonish +londonism +londonization +londonize +londres +lone +loneful +lonely +lonelier +loneliest +lonelihood +lonelily +loneliness +loneness +lonenesses +loner +loners +lonesome +lonesomely +lonesomeness +lonesomes +long +longa +longacre +longan +longanamous +longanimity +longanimities +longanimous +longans +longaville +longbeak +longbeard +longbill +longboat +longboats +longbow +longbowman +longbows +longcloth +longe +longear +longed +longee +longeing +longer +longeron +longerons +longers +longes +longest +longeval +longeve +longevity +longevities +longevous +longfelt +longfin +longful +longhair +longhaired +longhairs +longhand +longhands +longhead +longheaded +longheadedly +longheadedness +longheads +longhorn +longhorns +longhouse +longicaudal +longicaudate +longicone +longicorn +longicornia +longies +longyi +longilateral +longilingual +longiloquence +longiloquent +longimanous +longimetry +longimetric +longing +longingly +longingness +longings +longinian +longinquity +longipennate +longipennine +longirostral +longirostrate +longirostrine +longirostrines +longisection +longish +longitude +longitudes +longitudianl +longitudinal +longitudinally +longjaw +longjaws +longleaf +longleaves +longleg +longlegs +longly +longlick +longline +longliner +longlinerman +longlinermen +longlines +longmouthed +longneck +longness +longnesses +longnose +longobard +longobardi +longobardian +longobardic +longpod +longroot +longrun +longs +longshanks +longship +longships +longshore +longshoreman +longshoremen +longshoring +longshot +longshucks +longsighted +longsightedness +longsleever +longsome +longsomely +longsomeness +longspun +longspur +longspurs +longstanding +longsuffering +longtail +longtime +longtimer +longue +longues +longueur +longueurs +longulite +longus +longway +longways +longwall +longwise +longwood +longwool +longword +longwork +longwort +longworth +lonhyn +lonicera +lonk +lonouhard +lonquhard +lontar +loo +loob +looby +loobies +loobyish +loobily +looch +lood +looed +looey +looeys +loof +loofa +loofah +loofahs +loofas +loofie +loofness +loofs +looie +looies +looing +look +lookahead +lookdown +lookdowns +looked +lookee +looker +lookers +looky +looking +lookout +lookouts +looks +lookum +lookup +lookups +loom +loomed +loomer +loomery +loomfixer +looming +looms +loon +looney +loonery +loony +loonybin +loonier +loonies +looniest +looniness +loons +loop +loopback +loope +looped +looper +loopers +loopful +loophole +loopholed +loopholes +loopholing +loopy +loopier +loopiest +looping +loopist +looplet +looplike +loops +loord +loory +loos +loose +loosebox +loosed +looseleaf +loosely +loosemouthed +loosen +loosened +loosener +looseners +looseness +loosening +loosens +looser +looses +loosest +loosestrife +loosing +loosish +loot +lootable +looted +looten +looter +looters +lootie +lootiewallah +looting +loots +lootsman +lootsmans +loover +lop +lope +loped +lopeman +loper +lopers +lopes +lopeskonce +lopezia +lopheavy +lophiid +lophiidae +lophin +lophine +lophiodon +lophiodont +lophiodontidae +lophiodontoid +lophiola +lophiomyidae +lophiomyinae +lophiomys +lophiostomate +lophiostomous +lophobranch +lophobranchiate +lophobranchii +lophocalthrops +lophocercal +lophocome +lophocomi +lophodermium +lophodont +lophophytosis +lophophora +lophophoral +lophophore +lophophorinae +lophophorine +lophophorus +lophopoda +lophornis +lophortyx +lophostea +lophosteon +lophosteons +lophotriaene +lophotrichic +lophotrichous +lophura +loping +lopolith +loppard +lopped +lopper +loppered +loppering +loppers +loppet +loppy +loppier +loppiest +lopping +lops +lopseed +lopsided +lopsidedly +lopsidedness +lopstick +lopsticks +loq +loquacious +loquaciously +loquaciousness +loquacity +loquacities +loquat +loquats +loquence +loquency +loquent +loquently +loquitur +lor +lora +loral +loran +lorandite +lorans +loranskite +loranthaceae +loranthaceous +loranthus +lorarii +lorarius +lorate +lorcha +lord +lordan +lorded +lordy +lording +lordings +lordkin +lordless +lordlet +lordly +lordlier +lordliest +lordlike +lordlily +lordliness +lordling +lordlings +lordolatry +lordoma +lordomas +lordoses +lordosis +lordotic +lords +lordship +lordships +lordswike +lordwood +lore +loreal +lored +lorel +lorelei +loreless +loren +lorenzan +lorenzenite +lorenzo +lores +loretin +lorettine +lorettoite +lorgnette +lorgnettes +lorgnon +lorgnons +lori +lory +loric +lorica +loricae +loricarian +loricariidae +loricarioid +loricata +loricate +loricated +loricates +loricati +loricating +lorication +loricoid +lorien +lories +lorikeet +lorikeets +lorilet +lorimer +lorimers +loriner +loriners +loring +loriot +loris +lorises +lorisiform +lorius +lormery +lorn +lornness +lornnesses +loro +loros +lorraine +lorrainer +lorrainese +lorry +lorries +lorriker +lors +lorum +losable +losableness +losang +lose +losel +loselism +loselry +losels +losenger +loser +losers +loses +losh +losing +losingly +losings +loss +lossenite +losser +losses +lossful +lossy +lossier +lossiest +lossless +lossproof +lost +lostling +lostness +lostnesses +lot +lota +lotah +lotahs +lotan +lotas +lotase +lote +lotebush +lotewood +loth +lotharingian +lothario +lotharios +lothly +lothsome +lotic +lotiform +lotion +lotions +lotium +lotment +loto +lotong +lotophagi +lotophagous +lotophagously +lotor +lotos +lotoses +lotrite +lots +lotta +lotte +lotted +lotter +lottery +lotteries +lottie +lotting +lotto +lottos +lotuko +lotus +lotuses +lotusin +lotuslike +lou +louch +louche +louchettes +loud +louden +loudened +loudening +loudens +louder +loudering +loudest +loudish +loudishness +loudly +loudlier +loudliest +loudmouth +loudmouthed +loudmouths +loudness +loudnesses +loudspeak +loudspeaker +loudspeakers +loudspeaking +louey +lough +lougheen +loughs +louie +louies +louiqa +louis +louisa +louise +louisiana +louisianan +louisianans +louisianian +louisianians +louisine +louisville +louk +loukas +loukoum +loukoumi +loulu +loun +lounder +lounderer +lounge +lounged +lounger +loungers +lounges +loungy +lounging +loungingly +loup +loupcervier +loupcerviers +loupe +louped +loupen +loupes +louping +loups +lour +lourd +lourdy +lourdish +loured +loury +lourie +louring +louringly +louringness +lours +louse +louseberry +louseberries +loused +louses +lousewort +lousy +lousier +lousiest +lousily +lousiness +lousing +louster +lout +louted +louter +louther +louty +louting +loutish +loutishly +loutishness +loutre +loutrophoroi +loutrophoros +louts +louvar +louver +louvered +louvering +louvers +louverwork +louvre +louvred +louvres +lovability +lovable +lovableness +lovably +lovage +lovages +lovanenty +lovat +love +loveability +loveable +loveableness +loveably +lovebird +lovebirds +loved +loveday +lovee +loveflower +loveful +lovegrass +lovehood +lovey +lovelass +loveless +lovelessly +lovelessness +lovely +lovelier +lovelies +loveliest +lovelihead +lovelily +loveliness +loveling +lovelock +lovelocks +lovelorn +lovelornness +lovemaking +loveman +lovemans +lovemate +lovemonger +lovepot +loveproof +lover +loverdom +lovered +loverhood +lovery +lovering +loverless +loverly +loverlike +loverliness +lovers +lovership +loverwise +loves +lovesick +lovesickness +lovesome +lovesomely +lovesomeness +lovevine +lovevines +loveworth +loveworthy +lovier +loviers +loving +lovingkindness +lovingly +lovingness +low +lowa +lowable +lowan +lowance +lowball +lowbell +lowboy +lowboys +lowborn +lowbred +lowbrow +lowbrowism +lowbrows +lowdah +lowder +lowdown +lowdowns +lowe +lowed +loweite +lowell +lower +lowerable +lowercase +lowerclassman +lowerclassmen +lowered +lowerer +lowery +lowering +loweringly +loweringness +lowermost +lowers +lowes +lowest +lowy +lowigite +lowing +lowings +lowish +lowishly +lowishness +lowland +lowlander +lowlanders +lowlands +lowly +lowlier +lowliest +lowlife +lowlifer +lowlifes +lowlihead +lowlihood +lowlily +lowliness +lowman +lowmen +lowmost +lown +lowness +lownesses +lownly +lowry +lowrie +lows +lowse +lowsed +lowser +lowsest +lowsin +lowsing +lowth +lowville +lowwood +lox +loxed +loxes +loxia +loxic +loxiinae +loxing +loxoclase +loxocosm +loxodograph +loxodon +loxodont +loxodonta +loxodontous +loxodrome +loxodromy +loxodromic +loxodromical +loxodromically +loxodromics +loxodromism +loxolophodon +loxolophodont +loxomma +loxophthalmus +loxosoma +loxosomidae +loxotic +loxotomy +lozenge +lozenged +lozenger +lozenges +lozengeways +lozengewise +lozengy +lp +lpm +lr +lrecisianism +lrecl +ls +lsc +lst +lt +ltr +lu +luau +luaus +lub +luba +lubbard +lubber +lubbercock +lubberland +lubberly +lubberlike +lubberliness +lubbers +lube +lubes +lubra +lubric +lubrical +lubricant +lubricants +lubricate +lubricated +lubricates +lubricating +lubrication +lubricational +lubrications +lubricative +lubricator +lubricatory +lubricators +lubricious +lubriciously +lubriciousness +lubricity +lubricities +lubricous +lubrifaction +lubrify +lubrification +lubritory +lubritorian +lubritorium +luc +lucayan +lucan +lucania +lucanid +lucanidae +lucanus +lucarne +lucarnes +lucban +lucchese +luce +lucence +lucences +lucency +lucencies +lucent +lucentio +lucently +luceres +lucern +lucernal +lucernaria +lucernarian +lucernariidae +lucerne +lucernes +lucerns +luces +lucet +luchuan +lucy +lucia +lucian +luciana +lucible +lucid +lucida +lucidae +lucidity +lucidities +lucidly +lucidness +lucifee +lucifer +luciferase +luciferian +luciferidae +luciferin +luciferoid +luciferous +luciferously +luciferousness +lucifers +lucific +luciform +lucifugal +lucifugous +lucigen +lucile +lucilia +lucille +lucimeter +lucina +lucinacea +lucinda +lucinidae +lucinoid +lucite +lucius +lucivee +luck +lucked +lucken +luckful +lucky +luckie +luckier +luckies +luckiest +luckily +luckiness +lucking +luckless +lucklessly +lucklessness +luckly +lucknow +lucks +lucombe +lucration +lucrative +lucratively +lucrativeness +lucre +lucrece +lucres +lucretia +lucretian +lucretius +lucriferous +lucriferousness +lucrify +lucrific +lucrine +lucrous +lucrum +luctation +luctiferous +luctiferousness +luctual +lucubrate +lucubrated +lucubrates +lucubrating +lucubration +lucubrations +lucubrator +lucubratory +lucule +luculent +luculently +lucullan +lucullian +lucullite +lucuma +lucumia +lucumo +lucumony +lud +ludden +luddy +luddism +luddite +ludditism +ludefisk +ludgate +ludgathian +ludgatian +ludian +ludibry +ludibrious +ludicropathetic +ludicroserious +ludicrosity +ludicrosities +ludicrosplenetic +ludicrous +ludicrously +ludicrousness +ludification +ludlamite +ludlovian +ludlow +ludo +ludolphian +ludwig +ludwigite +lue +luella +lues +luetic +luetically +luetics +lufbery +lufberry +luff +luffa +luffas +luffed +luffer +luffing +luffs +lug +luganda +luge +luger +luges +luggage +luggageless +luggages +luggar +luggard +lugged +lugger +luggers +luggie +luggies +lugging +luggnagg +lughdoan +luging +lugmark +lugnas +lugs +lugsail +lugsails +lugsome +lugubriosity +lugubrious +lugubriously +lugubriousness +lugubrous +lugworm +lugworms +luhinga +lui +luian +luigi +luigini +luigino +luis +luiseno +luite +lujaurite +lujavrite +lujula +lukan +lukas +luke +lukely +lukemia +lukeness +luket +lukeward +lukewarm +lukewarmish +lukewarmly +lukewarmness +lukewarmth +lula +lulab +lulabim +lulabs +lulav +lulavim +lulavs +lull +lullaby +lullabied +lullabies +lullabying +lullay +lulled +luller +lully +lullian +lulliloo +lullilooed +lullilooing +lulling +lullingly +lulls +lulu +luluai +lulus +lum +lumachel +lumachella +lumachelle +lumbaginous +lumbago +lumbagos +lumbayao +lumbang +lumbar +lumbarization +lumbars +lumber +lumberdar +lumberdom +lumbered +lumberer +lumberers +lumberyard +lumberyards +lumbering +lumberingly +lumberingness +lumberjack +lumberjacket +lumberjacks +lumberless +lumberly +lumberman +lumbermen +lumbermill +lumbers +lumbersome +lumbocolostomy +lumbocolotomy +lumbocostal +lumbodynia +lumbodorsal +lumbosacral +lumbovertebral +lumbrical +lumbricales +lumbricalis +lumbricid +lumbricidae +lumbriciform +lumbricine +lumbricoid +lumbricosis +lumbricus +lumbrous +lumbus +lumen +lumenal +lumens +lumeter +lumina +luminaire +luminal +luminance +luminant +luminare +luminary +luminaria +luminaries +luminarious +luminarism +luminarist +luminate +lumination +luminative +luminator +lumine +lumined +luminesce +luminesced +luminescence +luminescent +luminesces +luminescing +luminiferous +luminificent +lumining +luminism +luminist +luministe +luminists +luminodynamism +luminodynamist +luminologist +luminometer +luminophor +luminophore +luminosity +luminosities +luminous +luminously +luminousness +lumisterol +lumme +lummy +lummox +lummoxes +lump +lumpectomy +lumped +lumpen +lumpenproletariat +lumpens +lumper +lumpers +lumpet +lumpfish +lumpfishes +lumpy +lumpier +lumpiest +lumpily +lumpiness +lumping +lumpingly +lumpish +lumpishly +lumpishness +lumpkin +lumpman +lumpmen +lumps +lumpsucker +lums +lumut +luna +lunacy +lunacies +lunambulism +lunar +lunare +lunary +lunaria +lunarian +lunarians +lunarist +lunarium +lunars +lunas +lunata +lunate +lunated +lunately +lunatellus +lunatic +lunatical +lunatically +lunatics +lunation +lunations +lunatize +lunatum +lunch +lunched +luncheon +luncheoner +luncheonette +luncheonettes +luncheonless +luncheons +luncher +lunchers +lunches +lunchhook +lunching +lunchless +lunchroom +lunchrooms +lunchtime +lunda +lundyfoot +lundinarium +lundress +lune +lunel +lunes +lunet +lunets +lunette +lunettes +lung +lungan +lungans +lunge +lunged +lungee +lungees +lungeous +lunger +lungers +lunges +lungfish +lungfishes +lungflower +lungful +lungi +lungy +lungie +lungyi +lungyis +lunging +lungis +lungless +lungmotor +lungoor +lungs +lungsick +lungworm +lungworms +lungwort +lungworts +luny +lunicurrent +lunier +lunies +luniest +luniform +lunyie +lunisolar +lunistice +lunistitial +lunitidal +lunk +lunka +lunker +lunkers +lunkhead +lunkheaded +lunkheads +lunks +lunn +lunoid +lunt +lunted +lunting +lunts +lunula +lunulae +lunular +lunularia +lunulate +lunulated +lunule +lunules +lunulet +lunulite +lunulites +luo +lupanar +lupanarian +lupanars +lupanin +lupanine +lupe +lupeol +lupeose +lupercal +lupercalia +lupercalian +luperci +lupetidin +lupetidine +lupicide +lupid +lupiform +lupin +lupinaster +lupine +lupines +lupinin +lupinine +lupinosis +lupinous +lupins +lupinus +lupis +lupoid +lupoma +lupous +lupulic +lupulin +lupuline +lupulinic +lupulinous +lupulins +lupulinum +lupulone +lupulus +lupus +lupuserythematosus +lupuses +lur +lura +luracan +lural +lurch +lurched +lurcher +lurchers +lurches +lurching +lurchingfully +lurchingly +lurchline +lurdan +lurdane +lurdanes +lurdanism +lurdans +lure +lured +lureful +lurement +lurer +lurers +lures +luresome +lurg +lurgworm +luri +lurid +luridity +luridly +luridness +luring +luringly +lurk +lurked +lurker +lurkers +lurky +lurking +lurkingly +lurkingness +lurks +lurry +lurrier +lurries +lusatian +luscinia +luscious +lusciously +lusciousness +luser +lush +lushai +lushburg +lushed +lushei +lusher +lushes +lushest +lushy +lushier +lushiest +lushing +lushly +lushness +lushnesses +lusiad +lusian +lusitania +lusitanian +lusk +lusky +lusory +lust +lusted +luster +lustered +lusterer +lustering +lusterless +lusterlessness +lusters +lusterware +lustful +lustfully +lustfulness +lusty +lustick +lustier +lustiest +lustihead +lustihood +lustily +lustiness +lusting +lustless +lustly +lustra +lustral +lustrant +lustrate +lustrated +lustrates +lustrating +lustration +lustrational +lustrative +lustratory +lustre +lustred +lustreless +lustres +lustreware +lustrical +lustrify +lustrification +lustrine +lustring +lustrings +lustrous +lustrously +lustrousness +lustrum +lustrums +lusts +lusus +lususes +lut +lutaceous +lutayo +lutany +lutanist +lutanists +lutao +lutarious +lutation +lute +lutea +luteal +lutecia +lutecium +luteciums +luted +luteic +lutein +luteinization +luteinize +luteinized +luteinizing +luteins +lutelet +lutemaker +lutemaking +lutenist +lutenists +luteo +luteocobaltic +luteofulvous +luteofuscescent +luteofuscous +luteolin +luteolins +luteolous +luteoma +luteorufescent +luteotrophic +luteotrophin +luteotropic +luteotropin +luteous +luteovirescent +luter +lutes +lutescent +lutestring +lutetia +lutetian +lutetium +lutetiums +luteum +luteway +lutfisk +luther +lutheran +lutheranic +lutheranism +lutheranize +lutheranizer +lutherans +lutherism +lutherist +luthern +lutherns +luthier +lutianid +lutianidae +lutianoid +lutianus +lutidin +lutidine +lutidinic +luting +lutings +lutist +lutists +lutjanidae +lutjanus +lutose +lutra +lutraria +lutreola +lutrin +lutrinae +lutrine +lutulence +lutulent +luvaridae +luvian +luvish +luwian +lux +luxate +luxated +luxates +luxating +luxation +luxations +luxe +luxembourg +luxemburg +luxemburger +luxemburgian +luxes +luxive +luxulianite +luxullianite +luxury +luxuria +luxuriance +luxuriancy +luxuriant +luxuriantly +luxuriantness +luxuriate +luxuriated +luxuriates +luxuriating +luxuriation +luxurient +luxuries +luxuriety +luxurious +luxuriously +luxuriousness +luxurist +luxurity +luxus +luzula +lv +lvalue +lvalues +lvov +lwl +lwm +lwo +lwop +lwp +lx +lxx +m +ma +maad +maam +maamselle +maana +maar +maars +maarten +maat +mab +maba +mabble +mabel +mabela +mabellona +mabi +mabyer +mabinogion +mabolo +mabuti +mac +macaasim +macaber +macabi +macaboy +macabre +macabrely +macabreness +macabresque +macaca +macaco +macacos +macacus +macadam +macadamer +macadamia +macadamise +macadamite +macadamization +macadamize +macadamized +macadamizer +macadamizes +macadamizing +macadams +macaglia +macague +macan +macana +macanese +macao +macaque +macaques +macaranga +macarani +macareus +macarism +macarize +macarized +macarizing +macaron +macaroni +macaronic +macaronical +macaronically +macaronicism +macaronics +macaronies +macaronis +macaronism +macaroon +macaroons +macartney +macassar +macassarese +macauco +macaviator +macaw +macaws +macbeth +maccabaeus +maccabaw +maccabaws +maccabean +maccabees +maccaboy +maccaboys +maccaroni +macchia +macchie +macchinetta +macclesfield +macco +maccoboy +maccoboys +maccus +macduff +mace +macebearer +maced +macedoine +macedon +macedonia +macedonian +macedonians +macedonic +macehead +macellum +maceman +macer +macerable +macerate +macerated +macerater +maceraters +macerates +macerating +maceration +macerative +macerator +macerators +macers +maces +macfarlane +macflecknoe +mach +machair +machaira +machairodont +machairodontidae +machairodontinae +machairodus +machan +machaon +machar +machecoled +macheer +machera +machete +machetes +machi +machiavel +machiavelian +machiavellian +machiavellianism +machiavellianly +machiavellians +machiavellic +machiavellism +machiavellist +machiavellistic +machicolate +machicolated +machicolating +machicolation +machicolations +machicoulis +machicui +machila +machilidae +machilis +machin +machina +machinability +machinable +machinal +machinament +machinate +machinated +machinating +machination +machinations +machinator +machine +machineable +machined +machineful +machineless +machinely +machinelike +machineman +machinemen +machinemonger +machiner +machinery +machineries +machines +machinify +machinification +machining +machinism +machinist +machinists +machinization +machinize +machinized +machinizing +machinoclast +machinofacture +machinotechnique +machinule +machismo +machismos +machmeter +macho +machogo +machopolyp +machos +machree +machrees +machs +machtpolitik +machzor +machzorim +machzors +macies +macigno +macilence +macilency +macilent +macing +macintosh +macintoshes +mack +mackaybean +mackallow +mackenboy +mackerel +mackereler +mackereling +mackerels +mackinaw +mackinawed +mackinaws +mackinboy +mackins +mackintosh +mackintoshed +mackintoshes +mackintoshite +mackle +mackled +mackles +macklike +mackling +macks +macle +macleaya +macled +macles +maclib +maclura +maclurea +maclurin +macmillanite +maco +macoma +macon +maconite +maconne +macquereau +macracanthorhynchus +macracanthrorhynchiasis +macradenous +macram +macrame +macrames +macrander +macrandre +macrandrous +macrauchene +macrauchenia +macraucheniid +macraucheniidae +macraucheniiform +macrauchenioid +macrencephaly +macrencephalic +macrencephalous +macrli +macro +macroaggregate +macroaggregated +macroanalysis +macroanalyst +macroanalytical +macrobacterium +macrobian +macrobiosis +macrobiote +macrobiotic +macrobiotically +macrobiotics +macrobiotus +macroblast +macrobrachia +macrocarpous +macrocentrinae +macrocentrus +macrocephali +macrocephaly +macrocephalia +macrocephalic +macrocephalism +macrocephalous +macrocephalus +macrochaeta +macrochaetae +macrocheilia +macrochelys +macrochemical +macrochemically +macrochemistry +macrochira +macrochiran +macrochires +macrochiria +macrochiroptera +macrochiropteran +macrocyst +macrocystis +macrocyte +macrocythemia +macrocytic +macrocytosis +macrocladous +macroclimate +macroclimatic +macroclimatically +macroclimatology +macrococcus +macrocoly +macroconidial +macroconidium +macroconjugant +macrocornea +macrocosm +macrocosmic +macrocosmical +macrocosmically +macrocosmology +macrocosmos +macrocosms +macrocrystalline +macrodactyl +macrodactyly +macrodactylia +macrodactylic +macrodactylism +macrodactylous +macrodiagonal +macrodomatic +macrodome +macrodont +macrodontia +macrodontic +macrodontism +macroeconomic +macroeconomics +macroelement +macroergate +macroevolution +macroevolutionary +macrofarad +macrofossil +macrogamete +macrogametocyte +macrogamy +macrogastria +macroglobulin +macroglobulinemia +macroglobulinemic +macroglossate +macroglossia +macrognathic +macrognathism +macrognathous +macrogonidium +macrograph +macrography +macrographic +macroinstruction +macrolecithal +macrolepidoptera +macrolepidopterous +macrolinguistic +macrolinguistically +macrolinguistics +macrolith +macrology +macromandibular +macromania +macromastia +macromazia +macromelia +macromeral +macromere +macromeric +macromerite +macromeritic +macromesentery +macrometeorology +macrometeorological +macrometer +macromethod +macromyelon +macromyelonal +macromole +macromolecular +macromolecule +macromolecules +macron +macrons +macronuclear +macronucleate +macronucleus +macronutrient +macropetalous +macrophage +macrophagic +macrophagocyte +macrophagus +macrophyllous +macrophysics +macrophyte +macrophytic +macrophoma +macrophotograph +macrophotography +macropia +macropygia +macropinacoid +macropinacoidal +macropyramid +macroplankton +macroplasia +macroplastia +macropleural +macropod +macropodia +macropodian +macropodidae +macropodinae +macropodine +macropodous +macroprism +macroprocessor +macroprosopia +macropsy +macropsia +macropteran +macroptery +macropterous +macroptic +macropus +macroreaction +macrorhamphosidae +macrorhamphosus +macrorhinia +macrorhinus +macros +macroscale +macroscelia +macroscelides +macroscian +macroscopic +macroscopical +macroscopically +macrosegment +macroseism +macroseismic +macroseismograph +macrosepalous +macroseptum +macrosymbiont +macrosmatic +macrosomatia +macrosomatous +macrosomia +macrospecies +macrosphere +macrosplanchnic +macrosporange +macrosporangium +macrospore +macrosporic +macrosporium +macrosporophyl +macrosporophyll +macrosporophore +macrostachya +macrostyle +macrostylospore +macrostylous +macrostomatous +macrostomia +macrostructural +macrostructure +macrothere +macrotheriidae +macrotherioid +macrotherium +macrotherm +macrotia +macrotin +macrotolagus +macrotome +macrotone +macrotous +macrourid +macrouridae +macrourus +macrozamia +macrozoogonidium +macrozoospore +macrura +macrural +macruran +macrurans +macruroid +macrurous +macs +mactation +mactra +mactridae +mactroid +macuca +macula +maculacy +maculae +macular +maculas +maculate +maculated +maculates +maculating +maculation +maculations +macule +maculed +macules +maculicole +maculicolous +maculiferous +maculing +maculocerebral +maculopapular +maculose +macumba +macupa +macupi +macushla +macusi +macuta +macute +mad +madafu +madagascan +madagascar +madagascarian +madagass +madam +madame +madames +madams +madapolam +madapolan +madapollam +madarosis +madarotic +madbrain +madbrained +madcap +madcaply +madcaps +madded +madden +maddened +maddening +maddeningly +maddeningness +maddens +madder +madderish +madders +madderwort +maddest +madding +maddingly +maddish +maddle +maddled +maddock +made +madecase +madefaction +madefy +madegassy +madeira +madeiran +madeiras +madeleine +madeline +madelon +mademoiselle +mademoiselles +madescent +madge +madhab +madhouse +madhouses +madhuca +madhva +madi +madia +madid +madidans +madiga +madison +madisterium +madly +madling +madman +madmen +madnep +madness +madnesses +mado +madoc +madonna +madonnahood +madonnaish +madonnalike +madonnas +madoqua +madotheca +madrague +madras +madrasah +madrases +madrasi +madrassah +madrasseh +madre +madreline +madreperl +madrepora +madreporacea +madreporacean +madreporal +madreporaria +madreporarian +madrepore +madreporian +madreporic +madreporiform +madreporite +madreporitic +madres +madrid +madrier +madrigal +madrigaler +madrigalesque +madrigaletto +madrigalian +madrigalist +madrigals +madrih +madril +madrilene +madrilenian +madroa +madrona +madronas +madrone +madrones +madrono +madronos +mads +madship +madstone +madtom +madurese +maduro +maduros +madweed +madwoman +madwomen +madwort +madworts +madzoon +madzoons +mae +maeander +maeandra +maeandrina +maeandrine +maeandriniform +maeandrinoid +maeandroid +maecenas +maecenasship +maed +maegbot +maegbote +maeing +maelstrom +maelstroms +maemacterion +maenad +maenades +maenadic +maenadically +maenadism +maenads +maenaite +maenalus +maenidae +maeonian +maeonides +maes +maestive +maestoso +maestosos +maestra +maestri +maestro +maestros +mafey +maffia +maffias +maffick +mafficked +mafficker +mafficking +mafficks +maffioso +maffle +maffler +mafflin +mafia +mafias +mafic +mafiosi +mafioso +mafoo +maftir +maftirs +mafura +mafurra +mag +maga +magadhi +magadis +magadize +magahi +magalensia +magani +magas +magasin +magazinable +magazinage +magazine +magazined +magazinelet +magaziner +magazines +magazinette +magaziny +magazining +magazinish +magazinism +magazinist +magbote +magdalen +magdalene +magdalenes +magdalenian +magdalens +magdaleon +mage +magellan +magellanian +magellanic +magenta +magentas +magerful +mages +magged +maggy +maggie +magging +maggiore +maggle +maggot +maggoty +maggotiness +maggotpie +maggotry +maggots +magh +maghi +maghrib +maghribi +maghzen +magi +magian +magianism +magyar +magyaran +magyarism +magyarization +magyarize +magyars +magic +magical +magicalize +magically +magicdom +magician +magicians +magicianship +magicked +magicking +magics +magilp +magilps +magindanao +magiric +magirics +magirist +magiristic +magirology +magirological +magirologist +magism +magister +magistery +magisterial +magisteriality +magisterially +magisterialness +magisteries +magisterium +magisters +magistracy +magistracies +magistral +magistrality +magistrally +magistrand +magistrant +magistrate +magistrates +magistrateship +magistratic +magistratical +magistratically +magistrative +magistrature +magistratus +maglemose +maglemosean +maglemosian +magma +magmas +magmata +magmatic +magmatism +magna +magnale +magnality +magnalium +magnanerie +magnanime +magnanimity +magnanimities +magnanimous +magnanimously +magnanimousness +magnascope +magnascopic +magnate +magnates +magnateship +magnecrystallic +magnelectric +magneoptic +magnes +magnesia +magnesial +magnesian +magnesias +magnesic +magnesioferrite +magnesite +magnesium +magnet +magneta +magnetic +magnetical +magnetically +magneticalness +magnetician +magnetics +magnetiferous +magnetify +magnetification +magnetimeter +magnetisation +magnetise +magnetised +magnetiser +magnetising +magnetism +magnetisms +magnetist +magnetite +magnetitic +magnetizability +magnetizable +magnetization +magnetize +magnetized +magnetizer +magnetizers +magnetizes +magnetizing +magneto +magnetobell +magnetochemical +magnetochemistry +magnetod +magnetodynamo +magnetoelectric +magnetoelectrical +magnetoelectricity +magnetofluiddynamic +magnetofluiddynamics +magnetofluidmechanic +magnetofluidmechanics +magnetogasdynamic +magnetogasdynamics +magnetogenerator +magnetogram +magnetograph +magnetographic +magnetohydrodynamic +magnetohydrodynamically +magnetohydrodynamics +magnetoid +magnetolysis +magnetomachine +magnetometer +magnetometers +magnetometry +magnetometric +magnetometrical +magnetometrically +magnetomotive +magnetomotivity +magnetomotor +magneton +magnetons +magnetooptic +magnetooptical +magnetooptically +magnetooptics +magnetopause +magnetophone +magnetophonograph +magnetoplasmadynamic +magnetoplasmadynamics +magnetoplumbite +magnetoprinter +magnetoresistance +magnetos +magnetoscope +magnetosphere +magnetospheric +magnetostatic +magnetostriction +magnetostrictive +magnetostrictively +magnetotelegraph +magnetotelephone +magnetotelephonic +magnetotherapy +magnetothermoelectricity +magnetotransmitter +magnetron +magnets +magnicaudate +magnicaudatous +magnify +magnifiable +magnific +magnifical +magnifically +magnificat +magnificate +magnification +magnifications +magnificative +magnifice +magnificence +magnificent +magnificently +magnificentness +magnifico +magnificoes +magnificos +magnified +magnifier +magnifiers +magnifies +magnifying +magnifique +magniloquence +magniloquent +magniloquently +magniloquy +magnipotence +magnipotent +magnirostrate +magnisonant +magnitude +magnitudes +magnitudinous +magnochromite +magnoferrite +magnolia +magnoliaceae +magnoliaceous +magnolias +magnon +magnum +magnums +magnus +magog +magot +magots +magpie +magpied +magpieish +magpies +magrim +mags +magsman +maguari +maguey +magueys +magus +mah +maha +mahayana +mahayanism +mahayanist +mahayanistic +mahajan +mahajun +mahal +mahala +mahalamat +mahaleb +mahaly +mahalla +mahant +mahar +maharaj +maharaja +maharajah +maharajahs +maharajas +maharajrana +maharana +maharanee +maharanees +maharani +maharanis +maharao +maharashtri +maharawal +maharawat +maharishi +maharishis +maharmah +maharshi +mahat +mahatma +mahatmaism +mahatmas +mahbub +mahdi +mahdian +mahdiship +mahdism +mahdist +mahesh +mahewu +mahi +mahican +mahimahi +mahjong +mahjongg +mahjonggs +mahjongs +mahlstick +mahmal +mahmoud +mahmudi +mahoe +mahoes +mahogany +mahoganies +mahoganize +mahogony +mahogonies +mahoitre +maholi +maholtine +mahomet +mahometan +mahometry +mahone +mahonia +mahonias +mahori +mahound +mahout +mahouts +mahra +mahran +mahratta +mahri +mahseer +mahsir +mahsur +mahu +mahua +mahuang +mahuangs +mahwa +mahzor +mahzorim +mahzors +may +maia +maya +mayaca +mayacaceae +mayacaceous +maiacca +mayan +mayance +mayans +maianthemum +mayapis +mayapple +mayapples +mayas +mayathan +maybe +mayberry +maybird +maybloom +maybush +maybushes +maycock +maid +maida +mayda +mayday +maydays +maidan +maidchild +maiden +maidenchild +maidenhair +maidenhairs +maidenhairtree +maidenhead +maidenheads +maidenhood +maidenish +maidenism +maidenly +maidenlike +maidenliness +maidens +maidenship +maidenweed +maidhead +maidhood +maidhoods +maidy +maidie +maidin +maidish +maidishness +maidism +maidkin +maidly +maidlike +maidling +maids +maidservant +maidservants +maidu +mayduke +mayed +maiefic +mayey +mayeye +mayence +mayer +mayest +maieutic +maieutical +maieutics +mayfair +mayfish +mayfishes +mayfly +mayflies +mayflower +mayflowers +mayfowl +maigre +mayhap +mayhappen +mayhaps +maihem +mayhem +mayhemmed +mayhemming +maihems +mayhems +maiid +maiidae +maying +mayings +mail +mailability +mailable +mailbag +mailbags +mailbox +mailboxes +mailcatcher +mailclad +mailcoach +maile +mailed +mailer +mailers +mailes +mailguard +mailie +maylike +mailing +mailings +maill +maille +maillechort +mailless +maillot +maillots +maills +mailman +mailmen +mailplane +mailpouch +mails +mailsack +mailwoman +mailwomen +maim +maimed +maimedly +maimedness +maimer +maimers +maiming +maimon +maimonidean +maimonist +maims +maimul +main +mainan +mainbrace +maine +mainferre +mainframe +mainframes +mainland +mainlander +mainlanders +mainlands +mainly +mainline +mainlined +mainliner +mainliners +mainlines +mainlining +mainmast +mainmasts +mainmortable +mainor +mainour +mainpast +mainpernable +mainpernor +mainpin +mainport +mainpost +mainprise +mainprised +mainprising +mainprisor +mainprize +mainprizer +mains +mainsail +mainsails +mainsheet +mainspring +mainsprings +mainstay +mainstays +mainstream +mainstreams +mainstreeter +mainstreetism +mainswear +mainsworn +maint +maynt +maintain +maintainability +maintainable +maintainableness +maintained +maintainer +maintainers +maintaining +maintainment +maintainor +maintains +maintenance +maintenances +maintenon +maintien +maintop +maintopman +maintopmast +maintopmen +maintops +maintopsail +mainward +mayo +maioid +maioidea +maioidean +maioli +maiolica +maiolicas +mayologist +maiongkong +mayonnaise +mayor +mayoral +mayorality +mayoralty +mayoralties +mayoress +mayoresses +mayors +mayorship +mayorships +mayoruna +maypole +maypoles +maypoling +maypop +maypops +maipure +mair +mairatour +maire +mairie +mairs +mays +maysin +maison +maisonette +maisonettes +maist +mayst +maister +maistres +maistry +maists +mayten +maytenus +maythe +maythes +maithili +maythorn +maithuna +maytide +maytime +maitlandite +maitre +maitreya +maitres +maitresse +maitrise +maius +mayvin +mayvins +mayweed +mayweeds +maywings +maywort +maize +maizebird +maizenic +maizer +maizes +maja +majagga +majagua +majaguas +majas +majesta +majestatic +majestatis +majesty +majestic +majestical +majestically +majesticalness +majesticness +majesties +majestious +majestyship +majeure +majidieh +majlis +majo +majolica +majolicas +majolist +majoon +major +majora +majorat +majorate +majoration +majorcan +majordomo +majordomos +majored +majorem +majorette +majorettes +majoring +majorism +majorist +majoristic +majoritarian +majoritarianism +majority +majorities +majorize +majors +majorship +majos +majusculae +majuscular +majuscule +majuscules +makable +makadoo +makah +makahiki +makale +makar +makara +makaraka +makari +makars +makassar +makatea +make +makeable +makebate +makebates +makedom +makefast +makefasts +makefile +makeless +maker +makeready +makeress +makers +makership +makes +makeshift +makeshifty +makeshiftiness +makeshiftness +makeshifts +makeup +makeups +makeweight +makework +makhorka +makhzan +makhzen +maki +makimono +makimonos +making +makings +makluk +mako +makomako +makonde +makopa +makos +makoua +makran +makroskelic +maksoorah +maku +makua +makuk +makuta +makutas +makutu +mal +mala +malaanonang +malabar +malabarese +malabathrum +malabsorption +malacanthid +malacanthidae +malacanthine +malacanthus +malacaton +malacca +malaccan +malaccident +malaceae +malaceous +malachi +malachite +malacia +malaclemys +malaclypse +malacobdella +malacocotylea +malacoderm +malacodermatidae +malacodermatous +malacodermidae +malacodermous +malacoid +malacolite +malacology +malacologic +malacological +malacologist +malacon +malacone +malacophyllous +malacophilous +malacophonous +malacopod +malacopoda +malacopodous +malacopterygian +malacopterygii +malacopterygious +malacoscolices +malacoscolicine +malacosoma +malacostraca +malacostracan +malacostracology +malacostracous +malacotic +malactic +maladapt +maladaptation +maladapted +maladaptive +maladdress +malade +malady +maladies +maladive +maladjust +maladjusted +maladjustive +maladjustment +maladjustments +maladminister +maladministered +maladministering +maladministers +maladministration +maladministrative +maladministrator +maladresse +maladroit +maladroitly +maladroitness +maladventure +malaga +malagash +malagasy +malagigi +malagma +malaguea +malaguena +malaguenas +malaguetta +malahack +malay +malaya +malayalam +malayalim +malayan +malayans +malayic +malayize +malayoid +malays +malaise +malaises +malaysia +malaysian +malaysians +malakin +malakon +malalignment +malam +malambo +malamute +malamutes +malander +malandered +malanders +malandrous +malanga +malapaho +malapert +malapertly +malapertness +malaperts +malapi +malapplication +malappointment +malapportioned +malapportionment +malappropriate +malappropriation +malaprop +malapropian +malapropish +malapropism +malapropisms +malapropoism +malapropos +malaprops +malapterurus +malar +malaria +malarial +malarian +malariaproof +malarias +malarin +malarioid +malariology +malariologist +malariotherapy +malarious +malarkey +malarkeys +malarky +malarkies +malaroma +malaromas +malarrangement +malars +malasapsap +malassimilation +malassociation +malate +malates +malathion +malati +malattress +malawi +malawians +malax +malaxable +malaxage +malaxate +malaxation +malaxator +malaxed +malaxerman +malaxermen +malaxing +malaxis +malbehavior +malbrouck +malchite +malchus +malcolm +malconceived +malconduct +malconformation +malconstruction +malcontent +malcontented +malcontentedly +malcontentedness +malcontentism +malcontently +malcontentment +malcontents +malconvenance +malcreated +malcultivation +maldeveloped +maldevelopment +maldigestion +maldirection +maldistribute +maldistribution +maldivian +maldocchio +maldonite +malduck +male +maleability +malease +maleate +maleates +maleberry +malebolge +malebolgian +malebolgic +malebranchism +malecite +maledicent +maledict +maledicted +maledicting +malediction +maledictions +maledictive +maledictory +maledicts +maleducation +malee +malefaction +malefactions +malefactor +malefactory +malefactors +malefactress +malefactresses +malefeazance +malefic +malefical +malefically +malefice +maleficence +maleficent +maleficently +maleficia +maleficial +maleficiate +maleficiation +maleficio +maleficium +maleic +maleinoid +maleinoidal +malella +malellae +malemiut +malemuit +malemuits +malemute +malemutes +maleness +malenesses +malengin +malengine +malentendu +maleo +maleos +maleruption +males +malesherbia +malesherbiaceae +malesherbiaceous +maletolt +maletote +malevolence +malevolency +malevolent +malevolently +malevolous +malexecution +malfeasance +malfeasant +malfeasantly +malfeasants +malfeasor +malfed +malformation +malformations +malformed +malfortune +malfunction +malfunctioned +malfunctioning +malfunctions +malgovernment +malgr +malgrace +malgrado +malgre +malguzar +malguzari +malheur +malhygiene +malhonest +mali +malic +malice +maliceful +maliceproof +malices +malicho +malicious +maliciously +maliciousness +malicorium +malidentification +malie +maliferous +maliform +malign +malignance +malignancy +malignancies +malignant +malignantly +malignation +maligned +maligner +maligners +malignify +malignified +malignifying +maligning +malignity +malignities +malignly +malignment +maligns +malihini +malihinis +malik +malikadna +malikala +malikana +maliki +malikite +malikzadi +malimprinted +malinche +maline +malines +malinfluence +malinger +malingered +malingerer +malingerers +malingery +malingering +malingers +malinke +malinois +malinowskite +malinstitution +malinstruction +malintent +malinvestment +malism +malison +malisons +malist +malistic +malitia +malkin +malkins +malkite +mall +malladrite +mallam +mallanders +mallangong +mallard +mallardite +mallards +malleability +malleabilization +malleable +malleableize +malleableized +malleableizing +malleableness +malleably +malleablize +malleablized +malleablizing +malleal +mallear +malleate +malleated +malleating +malleation +mallecho +malled +mallee +mallees +mallei +malleifera +malleiferous +malleiform +mallein +malleinization +malleinize +malleli +mallemaroking +mallemuck +mallender +mallenders +malleoincudal +malleolable +malleolar +malleoli +malleolus +mallet +malleted +malleting +mallets +malleus +malling +malloy +mallophaga +mallophagan +mallophagous +malloseismic +mallotus +mallow +mallows +mallowwort +malls +mallum +mallus +malm +malmag +malmaison +malmarsh +malmed +malmy +malmier +malmiest +malmignatte +malming +malmock +malms +malmsey +malmseys +malmstone +malnourished +malnourishment +malnutrite +malnutrition +malo +malobservance +malobservation +maloca +malocchio +maloccluded +malocclusion +malocclusions +malodor +malodorant +malodorous +malodorously +malodorousness +malodors +malodour +malojilla +malolactic +malonate +malonic +malonyl +malonylurea +malope +maloperation +malorganization +malorganized +malouah +malpais +malpighia +malpighiaceae +malpighiaceous +malpighian +malplaced +malpoise +malposed +malposition +malpractice +malpracticed +malpracticing +malpractioner +malpractitioner +malpraxis +malpresentation +malproportion +malproportioned +malpropriety +malpublication +malreasoning +malrotation +malshapen +malsworn +malt +malta +maltable +maltalent +maltase +maltases +malted +malteds +malter +maltese +maltha +malthas +malthe +malthene +malthite +malthouse +malthus +malthusian +malthusianism +malthusiast +malty +maltier +maltiest +maltine +maltiness +malting +maltman +malto +maltobiose +maltodextrin +maltodextrine +maltol +maltols +maltolte +maltose +maltoses +maltreat +maltreated +maltreating +maltreatment +maltreatments +maltreator +maltreats +malts +maltster +maltsters +malturned +maltworm +malum +malunion +malurinae +malurine +malurus +malus +malva +malvaceae +malvaceous +malval +malvales +malvasia +malvasian +malvasias +malvastrum +malversation +malverse +malvin +malvoisie +malvolition +malwa +mam +mama +mamaguy +mamaloi +mamamouchi +mamamu +mamas +mamba +mambas +mambo +mamboed +mamboes +mamboing +mambos +mambu +mamey +mameyes +mameys +mameliere +mamelon +mamelonation +mameluco +mameluke +mamelukes +mamercus +mamers +mamertine +mamie +mamies +mamilius +mamilla +mamillary +mamillate +mamillated +mamillation +mamlatdar +mamluk +mamluks +mamlutdar +mamma +mammae +mammal +mammalgia +mammalia +mammalian +mammalians +mammaliferous +mammality +mammalogy +mammalogical +mammalogist +mammalogists +mammals +mammary +mammas +mammate +mammati +mammatocumulus +mammatus +mammea +mammectomy +mammee +mammees +mammey +mammeys +mammer +mammered +mammering +mammers +mammet +mammets +mammy +mammie +mammies +mammifer +mammifera +mammiferous +mammiform +mammilate +mammilated +mammilla +mammillae +mammillaplasty +mammillar +mammillary +mammillaria +mammillate +mammillated +mammillation +mammilliform +mammilloid +mammilloplasty +mammin +mammitides +mammitis +mammock +mammocked +mammocks +mammodi +mammogen +mammogenic +mammogenically +mammogram +mammography +mammographic +mammographies +mammon +mammondom +mammoni +mammoniacal +mammonish +mammonism +mammonist +mammonistic +mammonite +mammonitish +mammonization +mammonize +mammonolatry +mammons +mammonteus +mammose +mammoth +mammothrept +mammoths +mammotomy +mammotropin +mammula +mammulae +mammular +mammut +mammutidae +mamo +mamona +mamoncillo +mamoncillos +mamoty +mampalon +mampara +mampus +mamry +mamsell +mamushi +mamzer +man +mana +manabozho +manace +manacing +manacle +manacled +manacles +manacling +manacus +manada +manage +manageability +manageable +manageableness +manageably +managed +managee +manageless +management +managemental +managements +manager +managerdom +manageress +managery +managerial +managerially +managers +managership +manages +managing +manaism +manak +manakin +manakins +manal +manana +mananas +manarvel +manas +manasic +manasquan +manasseh +manatee +manatees +manati +manatidae +manatine +manation +manatoid +manatus +manavel +manavelins +manavendra +manavilins +manavlins +manba +manbarklak +manbird +manbot +manbote +manbria +mancala +mancando +manche +manches +manchester +manchesterdom +manchesterism +manchesterist +manchestrian +manchet +manchets +manchette +manchild +manchineel +manchu +manchuria +manchurian +manchurians +manchus +mancinism +mancipable +mancipant +mancipare +mancipate +mancipation +mancipative +mancipatory +mancipee +mancipia +mancipium +manciple +manciples +mancipleship +mancipular +mancono +mancunian +mancus +mand +mandacaru +mandaean +mandaeism +mandaic +mandaite +mandala +mandalay +mandalas +mandalic +mandament +mandamus +mandamuse +mandamused +mandamuses +mandamusing +mandan +mandant +mandapa +mandar +mandarah +mandarin +mandarinate +mandarindom +mandarined +mandariness +mandarinic +mandarining +mandarinism +mandarinize +mandarins +mandarinship +mandat +mandatary +mandataries +mandate +mandated +mandatedness +mandatee +mandates +mandating +mandation +mandative +mandator +mandatory +mandatories +mandatorily +mandatoriness +mandators +mandats +mandatum +mande +mandelate +mandelic +manderelle +mandi +mandyai +mandyas +mandyases +mandible +mandibles +mandibula +mandibular +mandibulary +mandibulata +mandibulate +mandibulated +mandibuliform +mandibulohyoid +mandibulomaxillary +mandibulopharyngeal +mandibulosuspensorial +mandyi +mandil +mandilion +mandingan +mandingo +mandioca +mandiocas +mandir +mandlen +mandment +mandoer +mandola +mandolas +mandolin +mandoline +mandolinist +mandolinists +mandolins +mandolute +mandom +mandora +mandore +mandorla +mandorlas +mandorle +mandra +mandragora +mandragvn +mandrake +mandrakes +mandrel +mandrels +mandriarch +mandril +mandrill +mandrills +mandrils +mandrin +mandritta +mandruka +mands +mandua +manducable +manducate +manducated +manducating +manducation +manducatory +mane +maned +manege +maneges +maneh +manei +maney +maneless +manent +manequin +manerial +manes +manesheet +maness +manet +manetti +manettia +maneuver +maneuverability +maneuverable +maneuvered +maneuverer +maneuvering +maneuvers +maneuvrability +maneuvrable +maneuvre +maneuvred +maneuvring +manfish +manfred +manfreda +manful +manfully +manfulness +mang +manga +mangabey +mangabeira +mangabeys +mangabev +mangaby +mangabies +mangal +mangana +manganapatite +manganate +manganblende +manganbrucite +manganeisen +manganese +manganesian +manganesic +manganetic +manganhedenbergite +manganic +manganiferous +manganite +manganium +manganize +manganja +manganocalcite +manganocolumbite +manganophyllite +manganosiderite +manganosite +manganostibiite +manganotantalite +manganous +manganpectolite +mangar +mangbattu +mange +mangeao +mangey +mangeier +mangeiest +mangel +mangelin +mangels +mangelwurzel +manger +mangery +mangerite +mangers +manges +mangi +mangy +mangyan +mangier +mangiest +mangifera +mangily +manginess +mangle +mangled +mangleman +mangler +manglers +mangles +mangling +manglingly +mango +mangoes +mangold +mangolds +mangona +mangonel +mangonels +mangonism +mangonization +mangonize +mangoro +mangos +mangosteen +mangour +mangrass +mangrate +mangrove +mangroves +mangue +mangwe +manhaden +manhandle +manhandled +manhandler +manhandles +manhandling +manhattan +manhattanite +manhattanize +manhattans +manhead +manhole +manholes +manhood +manhoods +manhours +manhunt +manhunter +manhunting +manhunts +mani +many +mania +maniable +maniac +maniacal +maniacally +maniacs +maniaphobia +manias +manyatta +manyberry +manic +manically +manicaria +manicate +manichaean +manichaeanism +manichaeanize +manichaeism +manichaeist +manichee +manichord +manichordon +manicole +manicon +manicord +manicotti +manics +maniculatus +manicure +manicured +manicures +manicuring +manicurist +manicurists +manid +manidae +manie +manyema +manienie +maniere +manifer +manifest +manifesta +manifestable +manifestant +manifestation +manifestational +manifestationist +manifestations +manifestative +manifestatively +manifested +manifestedness +manifester +manifesting +manifestive +manifestly +manifestness +manifesto +manifestoed +manifestoes +manifestos +manifests +manify +manificum +manifold +manyfold +manifolded +manifolder +manifolding +manifoldly +manifoldness +manifolds +manifoldwise +maniform +manihot +manihots +manikin +manikinism +manikins +manila +manilas +manilio +manilla +manillas +manille +manilles +manyness +manini +manioc +manioca +maniocas +maniocs +maniple +maniples +manyplies +manipulability +manipulable +manipular +manipulary +manipulatability +manipulatable +manipulate +manipulated +manipulates +manipulating +manipulation +manipulational +manipulations +manipulative +manipulatively +manipulator +manipulatory +manipulators +manipuri +manyroot +manis +manysidedness +manism +manist +manistic +manit +manito +manitoba +manitoban +manitos +manitou +manitous +manitrunk +manitu +manitus +maniu +manius +maniva +manyways +manywhere +manywise +manjack +manjak +manjeet +manjel +manjeri +mank +mankeeper +manky +mankie +mankiller +mankilling +mankin +mankind +mankindly +manks +manless +manlessly +manlessness +manlet +manly +manlier +manliest +manlihood +manlike +manlikely +manlikeness +manlily +manliness +manling +manmade +mann +manna +mannaia +mannan +mannans +mannas +manned +mannequin +mannequins +manner +mannerable +mannered +manneredness +mannerhood +mannering +mannerism +mannerisms +mannerist +manneristic +manneristical +manneristically +mannerize +mannerless +mannerlessness +mannerly +mannerliness +manners +mannersome +manness +mannet +mannheimar +manny +mannide +mannie +manniferous +mannify +mannified +mannikin +mannikinism +mannikins +manning +mannire +mannish +mannishly +mannishness +mannitan +mannite +mannites +mannitic +mannitol +mannitols +mannitose +mannoheptite +mannoheptitol +mannoheptose +mannoketoheptose +mannonic +mannopus +mannosan +mannose +mannoses +mano +manobo +manoc +manoeuver +manoeuvered +manoeuvering +manoeuvre +manoeuvred +manoeuvreing +manoeuvrer +manoeuvring +manograph +manoir +manolis +manometer +manometers +manometry +manometric +manometrical +manometrically +manometries +manomin +manor +manorial +manorialism +manorialize +manors +manorship +manos +manoscope +manostat +manostatic +manpack +manpower +manpowers +manqu +manque +manquee +manqueller +manred +manrent +manroot +manrope +manropes +mans +mansard +mansarded +mansards +manscape +manse +manser +manservant +manses +manship +mansion +mansional +mansionary +mansioned +mansioneer +mansionry +mansions +manslayer +manslayers +manslaying +manslaughter +manslaughterer +manslaughtering +manslaughterous +manslaughters +manso +mansonry +manstealer +manstealing +manstopper +manstopping +mansuete +mansuetely +mansuetude +manswear +mansworn +mant +manta +mantal +mantapa +mantappeaux +mantas +manteau +manteaus +manteaux +manteel +mantegar +mantel +mantelet +mantelets +manteline +mantelletta +mantellone +mantellshelves +mantelpiece +mantelpieces +mantels +mantelshelf +manteltree +manter +mantes +mantevil +manty +mantic +mantically +manticism +manticora +manticore +mantid +mantidae +mantids +mantilla +mantillas +mantinean +mantis +mantises +mantisia +mantispa +mantispid +mantispidae +mantissa +mantissas +mantistic +mantle +mantled +mantlepiece +mantlepieces +mantlerock +mantles +mantlet +mantletree +mantlets +mantling +mantlings +manto +mantodea +mantoid +mantoidea +mantology +mantologist +manton +mantra +mantram +mantrap +mantraps +mantras +mantric +mantua +mantuamaker +mantuamaking +mantuan +mantuas +mantzu +manual +manualii +manualism +manualist +manualiter +manually +manuals +manuao +manuary +manubaliste +manubria +manubrial +manubriated +manubrium +manubriums +manucaption +manucaptor +manucapture +manucode +manucodia +manucodiata +manuduce +manuduct +manuduction +manuductive +manuductor +manuductory +manuel +manuever +manueverable +manuevered +manuevers +manuf +manufact +manufaction +manufactor +manufactory +manufactories +manufacturable +manufactural +manufacture +manufactured +manufacturer +manufacturers +manufactures +manufacturess +manufacturing +manuka +manul +manuma +manumea +manumisable +manumise +manumission +manumissions +manumissive +manumit +manumits +manumitted +manumitter +manumitting +manumotive +manuprisor +manurable +manurage +manurance +manure +manured +manureless +manurement +manurer +manurers +manures +manurial +manurially +manuring +manus +manuscript +manuscriptal +manuscription +manuscripts +manuscriptural +manusina +manustupration +manutagi +manutenency +manutergium +manvantara +manway +manward +manwards +manweed +manwise +manworth +manx +manxman +manxwoman +manzana +manzanilla +manzanillo +manzanita +manzas +manzil +mao +maoism +maoist +maoists +maomao +maori +maoridom +maoriland +maorilander +maoris +maormor +map +mapach +mapache +mapau +maphrian +mapland +maple +maplebush +mapleface +maplelike +maples +mapmaker +mapmakers +mapmaking +mapo +mappable +mapped +mappemonde +mappen +mapper +mappers +mappy +mappila +mapping +mappings +mappist +maps +mapuche +mapwise +maquahuitl +maquereau +maquette +maquettes +maqui +maquillage +maquiritare +maquis +maquisard +mar +mara +marabotin +marabou +marabous +marabout +maraboutism +marabouts +marabunta +marabuto +maraca +maracaibo +maracan +maracas +maracock +marae +maragato +marage +maraged +maraging +marah +maray +marais +marajuana +marakapas +maral +maranao +maranatha +marang +maranha +maranham +maranhao +maranon +maranta +marantaceae +marantaceous +marantas +marantic +marara +mararie +maras +marasca +marascas +maraschino +maraschinos +marasmic +marasmius +marasmoid +marasmous +marasmus +marasmuses +maratha +marathi +marathon +marathoner +marathonian +marathons +maratism +maratist +marattia +marattiaceae +marattiaceous +marattiales +maraud +marauded +marauder +marauders +marauding +marauds +maravedi +maravedis +maravi +marbelization +marbelize +marbelized +marbelizing +marble +marbled +marblehead +marbleheader +marblehearted +marbleization +marbleize +marbleized +marbleizer +marbleizes +marbleizing +marblelike +marbleness +marbler +marblers +marbles +marblewood +marbly +marblier +marbliest +marbling +marblings +marblish +marbrinus +marc +marcan +marcando +marcantant +marcasite +marcasitic +marcasitical +marcassin +marcatissimo +marcato +marcel +marceline +marcella +marcelled +marceller +marcellian +marcellianism +marcelling +marcello +marcels +marcescence +marcescent +marcgrave +marcgravia +marcgraviaceae +marcgraviaceous +march +marchand +marchantia +marchantiaceae +marchantiaceous +marchantiales +marched +marchen +marcher +marchers +marches +marchesa +marchese +marchesi +marchet +marchetti +marchetto +marching +marchioness +marchionesses +marchite +marchland +marchman +marchmen +marchmont +marchpane +marci +marcia +marcid +marcionism +marcionist +marcionite +marcionitic +marcionitish +marcionitism +marcite +marco +marcobrunner +marcomanni +marconi +marconigram +marconigraph +marconigraphy +marcor +marcos +marcosian +marcot +marcottage +marcs +mardi +mardy +mare +mareblob +mareca +marechal +marechale +marehan +marek +marekanite +maremma +maremmatic +maremme +maremmese +marengo +marennin +mareograph +mareotic +mareotid +mares +mareschal +marezzo +marfik +marfire +marg +marga +margay +margays +margarate +margarelon +margaret +margaric +margarin +margarine +margarins +margarita +margaritaceous +margaritae +margarite +margaritic +margaritiferous +margaritomancy +margarodes +margarodid +margarodinae +margarodite +margaropus +margarosanite +margaux +marge +marged +margeline +margent +margented +margenting +margents +margery +marges +margie +margin +marginability +marginal +marginalia +marginality +marginalize +marginally +marginals +marginate +marginated +marginating +margination +margined +marginella +marginellidae +marginelliform +marginicidal +marginiform +margining +marginirostral +marginoplasty +margins +margosa +margot +margravate +margrave +margravely +margraves +margravial +margraviate +margravine +marguerite +marguerites +margullie +marhala +marheshvan +mari +mary +maria +mariachi +mariachis +marialite +mariamman +marian +mariana +marianic +marianist +marianna +marianne +marianolatry +marianolatrist +marybud +marica +maricolous +mariculture +marid +marie +mariengroschen +maries +mariet +marigenous +marigold +marigolds +marigram +marigraph +marigraphic +marihuana +marijuana +marikina +maryknoll +maryland +marylander +marylanders +marylandian +marilyn +marilla +marymass +marimba +marimbaist +marimbas +marimonda +marina +marinade +marinaded +marinades +marinading +marinal +marinara +marinaras +marinas +marinate +marinated +marinates +marinating +marination +marine +marined +mariner +mariners +marinership +marines +marinheiro +marinist +marinorama +mario +mariola +mariolater +mariolatry +mariolatrous +mariology +marion +marionet +marionette +marionettes +mariou +mariposa +mariposan +mariposas +mariposite +maris +marys +marish +marishes +marishy +marishness +marysole +marist +marita +maritage +maritagium +marital +maritality +maritally +mariti +mariticidal +mariticide +maritimal +maritimate +maritime +maritimes +maritorious +mariupolite +marjoram +marjorams +marjorie +mark +marka +markab +markable +markaz +markazes +markdown +markdowns +markeb +marked +markedly +markedness +marker +markery +markers +market +marketability +marketable +marketableness +marketably +marketed +marketeer +marketeers +marketer +marketers +marketing +marketings +marketman +marketplace +marketplaces +markets +marketstead +marketwise +markfieldite +markgenossenschaft +markhoor +markhoors +markhor +markhors +marking +markingly +markings +markis +markka +markkaa +markkas +markland +markless +markman +markmen +markmoot +markmote +marko +marks +markshot +marksman +marksmanly +marksmanship +marksmen +markstone +markswoman +markswomen +markup +markups +markus +markweed +markworthy +marl +marla +marlaceous +marlacious +marlberry +marled +marlena +marler +marlet +marli +marly +marlier +marliest +marlin +marline +marlines +marlinespike +marlinespikes +marling +marlings +marlingspike +marlins +marlinspike +marlinsucker +marlite +marlites +marlitic +marllike +marlock +marlovian +marlowesque +marlowish +marlowism +marlpit +marls +marm +marmalade +marmalades +marmalady +marmar +marmaritin +marmarization +marmarize +marmarized +marmarizing +marmarosis +marmatite +marmelos +marmennill +marmink +marmion +marmit +marmite +marmites +marmolite +marmor +marmoraceous +marmorate +marmorated +marmoration +marmoreal +marmoreally +marmorean +marmoric +marmorize +marmosa +marmose +marmoset +marmosets +marmot +marmota +marmots +marnix +maro +marocain +marok +maronian +maronist +maronite +maroon +marooned +marooner +marooning +maroons +maroquin +maror +maros +marotte +marouflage +marpessa +marplot +marplotry +marplots +marprelate +marque +marquee +marquees +marques +marquesan +marquess +marquessate +marquesses +marqueterie +marquetry +marquis +marquisal +marquisate +marquisdom +marquise +marquises +marquisess +marquisette +marquisettes +marquisina +marquisotte +marquisship +marquito +marquois +marraine +marram +marrams +marranism +marranize +marrano +marred +marree +marrella +marrer +marrers +marry +marriable +marriage +marriageability +marriageable +marriageableness +marriageproof +marriages +married +marriedly +marrieds +marrier +marryer +marriers +marries +marrying +marrymuffe +marring +marrys +marrock +marron +marrons +marrot +marrow +marrowbone +marrowbones +marrowed +marrowfat +marrowy +marrowing +marrowish +marrowless +marrowlike +marrows +marrowsky +marrowskyer +marrube +marrubium +marrucinian +mars +marsala +marsdenia +marse +marseillais +marseillaise +marseille +marseilles +marses +marsh +marsha +marshal +marshalate +marshalcy +marshalcies +marshaled +marshaler +marshaless +marshaling +marshall +marshalled +marshaller +marshalling +marshalls +marshalman +marshalment +marshals +marshalsea +marshalship +marshbanker +marshberry +marshberries +marshbuck +marshes +marshfire +marshflower +marshy +marshier +marshiest +marshiness +marshite +marshland +marshlander +marshlands +marshlike +marshlocks +marshmallow +marshmallowy +marshmallows +marshman +marshmen +marshs +marshwort +marsi +marsian +marsilea +marsileaceae +marsileaceous +marsilia +marsiliaceae +marsipobranch +marsipobranchia +marsipobranchiata +marsipobranchiate +marsipobranchii +marsoon +marspiter +marssonia +marssonina +marsupia +marsupial +marsupialia +marsupialian +marsupialise +marsupialised +marsupialising +marsupialization +marsupialize +marsupialized +marsupializing +marsupials +marsupian +marsupiata +marsupiate +marsupium +mart +martaban +martagon +martagons +marted +martel +martele +marteline +martellate +martellato +martellement +martello +martellos +martemper +marten +marteniko +martenot +martens +martensite +martensitic +martensitically +martes +martext +martha +marty +martial +martialed +martialing +martialism +martialist +martialists +martiality +martialization +martialize +martialled +martially +martialling +martialness +martials +martian +martians +martiloge +martin +martyn +martinet +martineta +martinetish +martinetishness +martinetism +martinets +martinetship +martinez +marting +martingal +martingale +martingales +martini +martynia +martyniaceae +martyniaceous +martinico +martinis +martinism +martinist +martinmas +martinoe +martins +martyr +martyrdom +martyrdoms +martyred +martyrer +martyress +martyry +martyria +martyries +martyring +martyrisation +martyrise +martyrised +martyrish +martyrising +martyrium +martyrization +martyrize +martyrized +martyrizer +martyrizing +martyrly +martyrlike +martyrolatry +martyrologe +martyrology +martyrologic +martyrological +martyrologist +martyrologistic +martyrologium +martyrs +martyrship +martyrtyria +martite +martius +martlet +martlets +martnet +martrix +marts +martu +maru +marvel +marveled +marveling +marvelled +marvelling +marvellous +marvellously +marvellousness +marvelment +marvelous +marvelously +marvelousness +marvelry +marvels +marver +marvy +marvin +marwari +marwer +marx +marxian +marxianism +marxism +marxist +marxists +marzipan +marzipans +mas +masa +masai +masais +masanao +masanobu +masarid +masaridid +masarididae +masaridinae +masaris +masc +mascagnine +mascagnite +mascally +mascara +mascaras +mascaron +maschera +mascle +mascled +mascleless +mascon +mascons +mascot +mascotism +mascotry +mascots +mascotte +mascouten +mascularity +masculate +masculation +masculy +masculine +masculinely +masculineness +masculines +masculinism +masculinist +masculinity +masculinities +masculinization +masculinize +masculinized +masculinizing +masculist +masculofeminine +masculonucleus +masdeu +masdevallia +maselin +maser +masers +mash +masha +mashak +mashal +mashallah +masham +mashed +mashelton +masher +mashers +mashes +mashgiach +mashgiah +mashgichim +mashgihim +mashy +mashie +mashier +mashies +mashiest +mashiness +mashing +mashlam +mashlin +mashloch +mashlum +mashman +mashmen +mashona +mashpee +mashrebeeyah +mashrebeeyeh +mashru +masjid +masjids +mask +maskable +maskalonge +maskalonges +maskanonge +maskanonges +masked +maskeg +maskegon +maskegs +maskelynite +masker +maskery +maskers +maskette +maskflower +masking +maskings +maskinonge +maskinonges +maskins +masklike +maskmv +maskoi +maskoid +masks +maslin +masochism +masochist +masochistic +masochistically +masochists +mason +masoned +masoner +masonic +masonically +masoning +masonite +masonry +masonried +masonries +masonrying +masons +masonwork +masooka +masoola +masora +masorete +masoreth +masoretic +maspiter +masque +masquer +masquerade +masqueraded +masquerader +masqueraders +masquerades +masquerading +masquers +masques +mass +massa +massachuset +massachusetts +massacre +massacred +massacrer +massacrers +massacres +massacring +massacrous +massage +massaged +massager +massagers +massages +massageuse +massaging +massagist +massagists +massalia +massalian +massaranduba +massas +massasauga +masscult +masse +massebah +massecuite +massed +massedly +massedness +massekhoth +massel +masselgem +masser +masses +masseter +masseteric +masseterine +masseters +masseur +masseurs +masseuse +masseuses +massy +massicot +massicotite +massicots +massier +massiest +massif +massifs +massig +massily +massilia +massilian +massymore +massiness +massing +massive +massively +massiveness +massivity +masskanne +massless +masslessness +masslike +massmonger +massoy +massoola +massotherapy +massotherapist +massula +mast +mastaba +mastabah +mastabahs +mastabas +mastadenitis +mastadenoma +mastage +mastalgia +mastatrophy +mastatrophia +mastauxe +mastax +mastectomy +mastectomies +masted +master +masterable +masterate +masterdom +mastered +masterer +masterfast +masterful +masterfully +masterfulness +masterhood +mastery +masteries +mastering +masterings +masterless +masterlessness +masterly +masterlike +masterlily +masterliness +masterling +masterman +mastermen +mastermind +masterminded +masterminding +masterminds +masterous +masterpiece +masterpieces +masterproof +masters +mastership +mastersinger +mastersingers +masterstroke +masterwork +masterworks +masterwort +mastful +masthead +mastheaded +mastheading +mastheads +masthelcosis +masty +mastic +masticability +masticable +masticate +masticated +masticates +masticating +mastication +mastications +masticator +masticatory +masticatories +mastiche +mastiches +masticic +masticot +mastics +masticura +masticurous +mastiff +mastiffs +mastigamoeba +mastigate +mastigia +mastigium +mastigobranchia +mastigobranchial +mastigoneme +mastigophobia +mastigophora +mastigophoran +mastigophore +mastigophoric +mastigophorous +mastigopod +mastigopoda +mastigopodous +mastigote +mastigure +masting +mastitic +mastitides +mastitis +mastix +mastixes +mastless +mastlike +mastman +mastmen +mastocarcinoma +mastocarcinomas +mastocarcinomata +mastoccipital +mastochondroma +mastochondrosis +mastodynia +mastodon +mastodonic +mastodons +mastodonsaurian +mastodonsaurus +mastodont +mastodontic +mastodontidae +mastodontine +mastodontoid +mastoid +mastoidal +mastoidale +mastoideal +mastoidean +mastoidectomy +mastoidectomies +mastoideocentesis +mastoideosquamous +mastoiditis +mastoidohumeral +mastoidohumeralis +mastoidotomy +mastoids +mastology +mastological +mastologist +mastomenia +mastoncus +mastooccipital +mastoparietal +mastopathy +mastopathies +mastopexy +mastoplastia +mastorrhagia +mastoscirrhus +mastosquamose +mastotympanic +mastotomy +mastras +masts +masturbate +masturbated +masturbates +masturbatic +masturbating +masturbation +masturbational +masturbator +masturbatory +masturbators +mastwood +masu +masulipatam +masurium +masuriums +mat +matabele +matacan +matachin +matachina +matachinas +mataco +matadero +matador +matadors +mataeology +mataeological +mataeologue +mataeotechny +matagalpa +matagalpan +matagasse +matagory +matagouri +matai +matajuelo +matalan +matamata +matambala +matamoro +matanza +matapan +matapi +matar +matara +matasano +matatua +matawan +matax +matboard +match +matchable +matchableness +matchably +matchboard +matchboarding +matchbook +matchbooks +matchbox +matchboxes +matchcloth +matchcoat +matched +matcher +matchers +matches +matchet +matchy +matching +matchings +matchless +matchlessly +matchlessness +matchlock +matchlocks +matchmake +matchmaker +matchmakers +matchmaking +matchmark +matchotic +matchsafe +matchstalk +matchstick +matchwood +mate +mated +mategriffon +matehood +matey +mateyness +mateys +matelass +matelasse +mateley +mateless +matelessness +mately +matellasse +matelot +matelotage +matelote +matelotes +matelotte +matelow +matemilk +mater +materfamilias +materia +materiable +material +materialisation +materialise +materialised +materialiser +materialising +materialism +materialist +materialistic +materialistical +materialistically +materialists +materiality +materialities +materialization +materializations +materialize +materialized +materializee +materializer +materializes +materializing +materially +materialman +materialmen +materialness +materials +materiarian +materiate +materiation +materiel +materiels +maternal +maternalise +maternalised +maternalising +maternalism +maternalistic +maternality +maternalize +maternalized +maternalizing +maternally +maternalness +maternity +maternities +maternology +maters +mates +mateship +mateships +matezite +matfellon +matfelon +matgrass +math +matha +mathe +mathematic +mathematical +mathematically +mathematicals +mathematician +mathematicians +mathematicize +mathematics +mathematization +mathematize +mathemeg +mather +mathes +mathesis +mathetic +maths +mathurin +maty +matico +matie +maties +matilda +matildas +matildite +matin +matina +matinal +matindol +matinee +matinees +matiness +matinesses +mating +matings +matins +matipo +matka +matkah +matless +matlo +matlockite +matlow +matmaker +matmaking +matman +matoke +matra +matrace +matrah +matral +matralia +matranee +matrass +matrasses +matreed +matres +matriarch +matriarchal +matriarchalism +matriarchate +matriarchy +matriarchic +matriarchical +matriarchies +matriarchist +matriarchs +matric +matrical +matricaria +matrice +matrices +matricidal +matricide +matricides +matriclan +matriclinous +matricula +matriculable +matriculae +matriculant +matriculants +matricular +matriculate +matriculated +matriculates +matriculating +matriculation +matriculations +matriculator +matriculatory +matrigan +matriheritage +matriherital +matrilateral +matrilaterally +matriline +matrilineage +matrilineal +matrilineally +matrilinear +matrilinearism +matrilinearly +matriliny +matrilinies +matrilocal +matrilocality +matrimony +matrimonial +matrimonially +matrimonies +matrimonii +matrimonious +matrimoniously +matriotism +matripotestal +matris +matrisib +matrix +matrixes +matrixing +matroclinal +matrocliny +matroclinic +matroclinous +matroid +matron +matronage +matronal +matronalia +matronhood +matronymic +matronism +matronize +matronized +matronizing +matronly +matronlike +matronliness +matrons +matronship +matross +mats +matster +matsu +matsue +matsuri +matt +matta +mattamore +mattapony +mattaro +mattboard +matte +matted +mattedly +mattedness +matter +matterate +matterative +mattered +matterful +matterfulness +mattery +mattering +matterless +matters +mattes +matteuccia +matthaean +matthean +matthew +matthias +matthieu +matthiola +matti +matty +mattin +matting +mattings +mattins +mattock +mattocks +mattoid +mattoids +mattoir +mattrass +mattrasses +mattress +mattresses +matts +mattulla +maturable +maturant +maturate +maturated +maturates +maturating +maturation +maturational +maturations +maturative +mature +matured +maturely +maturement +matureness +maturer +matures +maturescence +maturescent +maturest +maturing +maturish +maturity +maturities +matutinal +matutinally +matutinary +matutine +matutinely +matweed +matza +matzah +matzahs +matzas +matzo +matzoh +matzohs +matzoon +matzoons +matzos +matzot +matzoth +mau +mauby +maucaco +maucauco +maucherite +maud +maudeline +maudle +maudlin +maudlinism +maudlinize +maudlinly +maudlinness +maudlinwort +mauger +maugh +maught +maugis +maugrabee +maugre +maukin +maul +maulana +maulawiyah +mauled +mauley +mauler +maulers +mauling +mauls +maulstick +maulvi +maumee +maumet +maumetry +maumetries +maumets +maun +maunch +maunche +maund +maunder +maundered +maunderer +maunderers +maundering +maunders +maundful +maundy +maundies +maunds +maunge +maungy +maunna +maupassant +mauquahog +maurandia +maureen +mauresque +mauretanian +mauri +maurice +mauricio +maurist +mauritania +mauritanian +mauritanians +mauritia +mauritian +mauser +mausole +mausolea +mausoleal +mausolean +mausoleum +mausoleums +maut +mauther +mauts +mauve +mauvein +mauveine +mauves +mauvette +mauvine +maux +maven +mavens +maverick +mavericks +mavie +mavies +mavin +mavins +mavis +mavises +mavortian +mavourneen +mavournin +mavrodaphne +maw +mawali +mawbound +mawed +mawger +mawing +mawk +mawky +mawkin +mawkingly +mawkish +mawkishly +mawkishness +mawks +mawmish +mawn +mawp +maws +mawseed +mawsie +mawworm +max +maxi +maxicoat +maxicoats +maxilla +maxillae +maxillar +maxillary +maxillaries +maxillas +maxilliferous +maxilliform +maxilliped +maxillipedary +maxillipede +maxillodental +maxillofacial +maxillojugal +maxillolabial +maxillomandibular +maxillopalatal +maxillopalatine +maxillopharyngeal +maxillopremaxillary +maxilloturbinal +maxillozygomatic +maxim +maxima +maximal +maximalism +maximalist +maximally +maximals +maximate +maximation +maximed +maximin +maximins +maximise +maximised +maximises +maximising +maximist +maximistic +maximite +maximites +maximization +maximize +maximized +maximizer +maximizers +maximizes +maximizing +maximon +maxims +maximum +maximumly +maximums +maximus +maxis +maxisingle +maxiskirt +maxixe +maxixes +maxwell +maxwells +maza +mazaedia +mazaedidia +mazaedium +mazagran +mazalgia +mazama +mazame +mazanderani +mazapilite +mazard +mazards +mazarine +mazatec +mazateco +mazda +mazdaism +mazdaist +mazdakean +mazdakite +mazdean +mazdoor +mazdur +maze +mazed +mazedly +mazedness +mazeful +mazel +mazelike +mazement +mazer +mazers +mazes +mazhabi +mazy +mazic +mazier +maziest +mazily +maziness +mazinesses +mazing +mazocacothesis +mazodynia +mazolysis +mazolytic +mazopathy +mazopathia +mazopathic +mazopexy +mazourka +mazourkas +mazovian +mazuca +mazuma +mazumas +mazur +mazurian +mazurka +mazurkas +mazut +mazzard +mazzards +mazzinian +mazzinianism +mazzinist +mb +mbaya +mbalolo +mbd +mbeuer +mbira +mbiras +mbori +mbps +mbuba +mbunda +mc +mccarthyism +mccoy +mcdonald +mcf +mcg +mcintosh +mckay +mcphail +md +mdewakanton +mdnt +mdse +me +mea +meable +meach +meaching +meacock +meacon +mead +meader +meadow +meadowbur +meadowed +meadower +meadowy +meadowing +meadowink +meadowland +meadowlands +meadowlark +meadowlarks +meadowless +meadows +meadowsweet +meadowsweets +meadowwort +meads +meadsman +meadsweet +meadwort +meager +meagerly +meagerness +meagre +meagrely +meagreness +meak +meaking +meal +mealable +mealberry +mealed +mealer +mealy +mealybug +mealybugs +mealie +mealier +mealies +mealiest +mealily +mealymouth +mealymouthed +mealymouthedly +mealymouthedness +mealiness +mealing +mealywing +mealless +mealman +mealmen +mealmonger +mealmouth +mealmouthed +mealock +mealproof +meals +mealtide +mealtime +mealtimes +mealworm +mealworms +mean +meander +meandered +meanderer +meanderers +meandering +meanderingly +meanders +meandrine +meandriniform +meandrite +meandrous +meandrously +meaned +meaner +meaners +meanest +meany +meanie +meanies +meaning +meaningful +meaningfully +meaningfulness +meaningless +meaninglessly +meaninglessness +meaningly +meaningness +meanings +meanish +meanless +meanly +meanness +meannesses +means +meanspirited +meanspiritedly +meanspiritedness +meant +meantes +meantime +meantimes +meantone +meanwhile +mear +mearstone +meas +mease +measle +measled +measledness +measles +measlesproof +measly +measlier +measliest +measondue +measurability +measurable +measurableness +measurably +measurage +measuration +measure +measured +measuredly +measuredness +measureless +measurelessly +measurelessness +measurely +measurement +measurements +measurer +measurers +measures +measuring +measuringworm +meat +meatal +meatball +meatballs +meatbird +meatcutter +meated +meath +meathe +meathead +meatheads +meathook +meathooks +meaty +meatic +meatier +meatiest +meatily +meatiness +meatless +meatman +meatmen +meatometer +meatorrhaphy +meatoscope +meatoscopy +meatotome +meatotomy +meats +meature +meatus +meatuses +meatworks +meaul +meaw +meazle +mebos +mebsuta +mecamylamine +mecaptera +mecate +mecati +mecca +meccan +meccano +meccas +meccawee +mech +mechael +mechanal +mechanality +mechanalize +mechanic +mechanical +mechanicalism +mechanicalist +mechanicality +mechanicalization +mechanicalize +mechanically +mechanicalness +mechanician +mechanicochemical +mechanicocorpuscular +mechanicointellectual +mechanicotherapy +mechanics +mechanism +mechanismic +mechanisms +mechanist +mechanistic +mechanistically +mechanists +mechanizable +mechanization +mechanizations +mechanize +mechanized +mechanizer +mechanizers +mechanizes +mechanizing +mechanochemical +mechanochemistry +mechanolater +mechanology +mechanomorphic +mechanomorphically +mechanomorphism +mechanophobia +mechanoreception +mechanoreceptive +mechanoreceptor +mechanotherapeutic +mechanotherapeutics +mechanotherapy +mechanotherapies +mechanotherapist +mechanotherapists +mechanotheraputic +mechanotheraputically +mechant +mechir +mechitaristican +mechitzah +mechitzoth +mechlin +mechoacan +meck +meckelectomy +meckelian +mecklenburgian +meclizine +mecodont +mecodonta +mecometer +mecometry +mecon +meconic +meconidium +meconin +meconioid +meconium +meconiums +meconology +meconophagism +meconophagist +mecoptera +mecopteran +mecopteron +mecopterous +mecrobeproof +mecum +mecums +mecurial +mecurialism +med +medaillon +medaka +medakas +medal +medaled +medalet +medaling +medalist +medalists +medalize +medallary +medalled +medallic +medallically +medalling +medallion +medallioned +medallioning +medallionist +medallions +medallist +medals +meddle +meddlecome +meddled +meddlement +meddler +meddlers +meddles +meddlesome +meddlesomely +meddlesomeness +meddling +meddlingly +mede +medea +medellin +medenagan +medeola +medevac +medevacs +media +mediacy +mediacid +mediacies +mediad +mediae +mediaeval +mediaevalism +mediaevalist +mediaevalize +mediaevally +medial +medialization +medialize +medialkaline +medially +medials +median +medianic +medianimic +medianimity +medianism +medianity +medianly +medians +mediant +mediants +mediary +medias +mediastina +mediastinal +mediastine +mediastinitis +mediastinotomy +mediastinum +mediate +mediated +mediately +mediateness +mediates +mediating +mediatingly +mediation +mediational +mediations +mediatisation +mediatise +mediatised +mediatising +mediative +mediatization +mediatize +mediatized +mediatizing +mediator +mediatory +mediatorial +mediatorialism +mediatorially +mediatorious +mediators +mediatorship +mediatress +mediatrice +mediatrices +mediatrix +mediatrixes +medic +medica +medicable +medicably +medicago +medicaid +medicaids +medical +medicalese +medically +medicals +medicament +medicamental +medicamentally +medicamentary +medicamentation +medicamentous +medicaments +medicant +medicare +medicares +medicaster +medicate +medicated +medicates +medicating +medication +medications +medicative +medicator +medicatory +medicean +medici +medicinable +medicinableness +medicinal +medicinally +medicinalness +medicinary +medicine +medicined +medicinelike +medicinemonger +mediciner +medicines +medicining +medick +medicks +medico +medicobotanical +medicochirurgic +medicochirurgical +medicodental +medicolegal +medicolegally +medicomania +medicomechanic +medicomechanical +medicommissure +medicomoral +medicophysical +medicophysics +medicopsychology +medicopsychological +medicos +medicostatistic +medicosurgical +medicotopographic +medicozoologic +medics +medidia +medidii +mediety +medieval +medievalism +medievalist +medievalistic +medievalists +medievalize +medievally +medievals +medifixed +mediglacial +medii +medille +medimn +medimno +medimnos +medimnus +medina +medine +medinilla +medino +medio +medioanterior +mediocarpal +medioccipital +mediocracy +mediocral +mediocre +mediocrely +mediocreness +mediocris +mediocrist +mediocrity +mediocrities +mediocubital +mediodepressed +mediodigital +mediodorsal +mediodorsally +mediofrontal +mediolateral +mediopalatal +mediopalatine +mediopassive +mediopectoral +medioperforate +mediopontine +medioposterior +mediosilicic +mediostapedial +mediotarsal +medioventral +medisance +medisect +medisection +medish +medism +meditabund +meditance +meditant +meditate +meditated +meditatedly +meditater +meditates +meditating +meditatingly +meditatio +meditation +meditationist +meditations +meditatist +meditative +meditatively +meditativeness +meditator +mediterrane +mediterranean +mediterraneanism +mediterraneanization +mediterraneanize +mediterraneous +medithorax +meditrinalia +meditullium +medium +mediumism +mediumistic +mediumization +mediumize +mediumly +mediums +mediumship +medius +medize +medizer +medjidie +medjidieh +medlar +medlars +medle +medley +medleyed +medleying +medleys +medlied +medoc +medregal +medrick +medrinacks +medrinacles +medrinaque +medscheat +medula +medulla +medullae +medullar +medullary +medullas +medullate +medullated +medullation +medullispinal +medullitis +medullization +medullose +medullous +medusa +medusae +medusaean +medusal +medusalike +medusan +medusans +medusas +medusiferous +medusiform +medusoid +medusoids +mee +meebos +meece +meech +meecher +meeching +meed +meedful +meedless +meeds +meehan +meek +meeken +meeker +meekest +meekhearted +meekheartedness +meekly +meekling +meekness +meeknesses +meekoceras +meeks +meer +meered +meerkat +meerschaum +meerschaums +meese +meet +meetable +meeten +meeter +meeterly +meeters +meeth +meethelp +meethelper +meeting +meetinger +meetinghouse +meetings +meetly +meetness +meetnesses +meets +meg +megaara +megabar +megabars +megabaud +megabit +megabyte +megabytes +megabits +megabuck +megabucks +megacephaly +megacephalia +megacephalic +megacephalous +megacerine +megaceros +megacerotine +megachile +megachilid +megachilidae +megachiroptera +megachiropteran +megachiropterous +megacycle +megacycles +megacity +megacolon +megacosm +megacoulomb +megacurie +megadeath +megadeaths +megadynamics +megadyne +megadynes +megadont +megadonty +megadontia +megadontic +megadontism +megadrili +megaera +megaerg +megafarad +megafog +megagamete +megagametophyte +megahertz +megahertzes +megajoule +megakaryoblast +megakaryocyte +megakaryocytic +megalactractus +megaladapis +megalaema +megalaemidae +megalania +megalecithal +megaleme +megalensian +megalerg +megalesia +megalesian +megalesthete +megalethoscope +megalichthyidae +megalichthys +megalith +megalithic +megaliths +megalobatrachus +megaloblast +megaloblastic +megalocardia +megalocarpous +megalocephaly +megalocephalia +megalocephalic +megalocephalous +megaloceros +megalochirous +megalocyte +megalocytosis +megalocornea +megalodactylia +megalodactylism +megalodactylous +megalodon +megalodont +megalodontia +megalodontidae +megaloenteron +megalogastria +megaloglossia +megalograph +megalography +megalohepatia +megalokaryocyte +megalomania +megalomaniac +megalomaniacal +megalomaniacally +megalomaniacs +megalomanic +megalomelia +megalonychidae +megalonyx +megalopa +megalopenis +megalophonic +megalophonous +megalophthalmus +megalopia +megalopic +megalopidae +megalopyge +megalopygidae +megalopinae +megalopine +megaloplastocyte +megalopolis +megalopolises +megalopolistic +megalopolitan +megalopolitanism +megalopore +megalops +megalopsia +megalopsychy +megaloptera +megalopteran +megalopterous +megalornis +megalornithidae +megalosaur +megalosaurian +megalosauridae +megalosauroid +megalosaurus +megaloscope +megaloscopy +megalosyndactyly +megalosphere +megalospheric +megalosplenia +megaloureter +megaluridae +megamastictora +megamastictoral +megamere +megameter +megametre +megampere +meganeura +meganthropus +meganucleus +megaparsec +megaphyllous +megaphyton +megaphone +megaphoned +megaphones +megaphonic +megaphonically +megaphoning +megaphotography +megaphotographic +megapod +megapode +megapodes +megapodidae +megapodiidae +megapodius +megapolis +megapolitan +megaprosopous +megaptera +megapterinae +megapterine +megara +megarad +megarensian +megarhinus +megarhyssa +megarian +megarianism +megaric +megaron +megarons +megasclere +megascleric +megasclerous +megasclerum +megascope +megascopic +megascopical +megascopically +megaseism +megaseismic +megaseme +megasynthetic +megasoma +megasporange +megasporangium +megaspore +megasporic +megasporogenesis +megasporophyll +megass +megasse +megasses +megathere +megatherian +megatheriidae +megatherine +megatherioid +megatherium +megatherm +megathermal +megathermic +megatheroid +megatype +megatypy +megaton +megatons +megatron +megavitamin +megavolt +megavolts +megawatt +megawatts +megaweber +megaword +megawords +megazooid +megazoospore +megbote +megerg +megger +meggy +megillah +megillahs +megilloth +megilp +megilph +megilphs +megilps +megmho +megnetosphere +megohm +megohmit +megohmmeter +megohms +megomit +megophthalmus +megotalc +megrel +megrez +megrim +megrimish +megrims +meguilp +mehalla +mehari +meharis +meharist +mehelya +mehitzah +mehitzoth +mehmandar +mehrdad +mehtar +mehtarship +meibomia +meibomian +meyerhofferite +meigomian +meiji +meikle +meikles +meile +meiler +mein +meindre +meiny +meinie +meinies +meio +meiobar +meiocene +meionite +meiophylly +meioses +meiosis +meiostemonous +meiotaxy +meiotic +meiotically +meisje +meissa +meistersinger +meith +meithei +meizoseismal +meizoseismic +mejorana +mekbuda +mekhitarist +mekilta +mekometer +mekong +mel +mela +melaconite +melada +meladiorite +melaena +melaenic +melagabbro +melagra +melagranite +melaleuca +melalgia +melam +melamdim +melamed +melamin +melamine +melamines +melammdim +melammed +melampyrin +melampyrite +melampyritol +melampyrum +melampod +melampode +melampodium +melampsora +melampsoraceae +melampus +melanaemia +melanaemic +melanagogal +melanagogue +melancholy +melancholia +melancholiac +melancholiacs +melancholian +melancholic +melancholically +melancholies +melancholyish +melancholily +melancholiness +melancholious +melancholiously +melancholiousness +melancholish +melancholist +melancholize +melancholomaniac +melanchthonian +melanconiaceae +melanconiaceous +melanconiales +melanconium +melanemia +melanemic +melanesia +melanesian +melanesians +melange +melanger +melanges +melangeur +melania +melanian +melanic +melanics +melaniferous +melaniidae +melanilin +melaniline +melanin +melanins +melanippe +melanippus +melanism +melanisms +melanist +melanistic +melanists +melanite +melanites +melanitic +melanization +melanize +melanized +melanizes +melanizing +melano +melanoblast +melanoblastic +melanoblastoma +melanocarcinoma +melanocerite +melanochroi +melanochroic +melanochroid +melanochroite +melanochroous +melanocyte +melanocomous +melanocrate +melanocratic +melanodendron +melanoderm +melanoderma +melanodermia +melanodermic +melanogaster +melanogen +melanogenesis +melanoi +melanoid +melanoidin +melanoids +melanoma +melanomas +melanomata +melanopathy +melanopathia +melanophore +melanoplakia +melanoplus +melanorrhagia +melanorrhea +melanorrhoea +melanosarcoma +melanosarcomatosis +melanoscope +melanose +melanosed +melanosis +melanosity +melanosome +melanospermous +melanotekite +melanotic +melanotype +melanotrichous +melanous +melanterite +melanthaceae +melanthaceous +melanthy +melanthium +melanure +melanurenic +melanuresis +melanuria +melanuric +melaphyre +melas +melasma +melasmic +melasses +melassigenic +melastoma +melastomaceae +melastomaceous +melastomad +melastome +melatonin +melatope +melaxuma +melba +melbourne +melburnian +melcarth +melch +melchite +melchizedek +melchora +meld +melded +melder +melders +melding +meldometer +meldrop +melds +mele +meleager +meleagridae +meleagrina +meleagrinae +meleagrine +meleagris +melebiose +melee +melees +melena +melene +melenic +meles +meletian +meletin +meletski +melezitase +melezitose +melia +meliaceae +meliaceous +meliadus +melian +melianthaceae +melianthaceous +melianthus +meliatin +melibiose +melic +melica +melicent +melicera +meliceric +meliceris +melicerous +melicerta +melicertidae +melichrous +melicitose +melicocca +melicoton +melicrate +melicraton +melicratory +melicratum +melilite +melilites +melilitite +melilot +melilots +melilotus +melinae +melinda +meline +melinis +melinite +melinites +meliola +melior +meliorability +meliorable +meliorant +meliorate +meliorated +meliorater +meliorates +meliorating +melioration +meliorations +meliorative +melioratively +meliorator +meliorism +meliorist +melioristic +meliority +meliphagan +meliphagidae +meliphagidan +meliphagous +meliphanite +melipona +meliponinae +meliponine +melis +melisma +melismas +melismata +melismatic +melismatics +melissa +melissyl +melissylic +melitaea +melitaemia +melitemia +melithaemia +melithemia +melitis +melitose +melitriose +melittology +melittologist +melituria +melituric +melkhout +mell +mellaginous +mellah +mellay +mellate +melled +melleous +meller +mellic +mellifera +melliferous +mellific +mellificate +mellification +mellifluate +mellifluence +mellifluent +mellifluently +mellifluous +mellifluously +mellifluousness +mellilita +mellilot +mellimide +melling +mellisonant +mellisugent +mellit +mellita +mellitate +mellite +mellitic +mellitum +mellitus +mellivora +mellivorinae +mellivorous +mellon +mellone +mellonides +mellophone +mellow +mellowed +mellower +mellowest +mellowy +mellowing +mellowly +mellowness +mellowphone +mellows +mells +mellsman +melocactus +melocoton +melocotoon +melodeon +melodeons +melody +melodia +melodial +melodially +melodias +melodic +melodica +melodical +melodically +melodicon +melodics +melodied +melodies +melodying +melodyless +melodiograph +melodion +melodious +melodiously +melodiousness +melodise +melodised +melodises +melodising +melodism +melodist +melodists +melodium +melodize +melodized +melodizer +melodizes +melodizing +melodractically +melodram +melodrama +melodramas +melodramatic +melodramatical +melodramatically +melodramaticism +melodramatics +melodramatise +melodramatised +melodramatising +melodramatist +melodramatists +melodramatization +melodramatize +melodrame +meloe +melogram +melogrammataceae +melograph +melographic +meloid +meloidae +meloids +melologue +melolontha +melolonthid +melolonthidae +melolonthidan +melolonthides +melolonthinae +melolonthine +melomame +melomane +melomania +melomaniac +melomanic +melon +meloncus +melonechinus +melongena +melongrower +melonist +melonite +melonites +melonlike +melonmonger +melonry +melons +melophone +melophonic +melophonist +melopiano +melopianos +meloplast +meloplasty +meloplastic +meloplasties +melopoeia +melopoeic +melos +melosa +melospiza +melote +melothria +melotragedy +melotragic +melotrope +melpell +melpomene +mels +melt +meltability +meltable +meltage +meltages +meltdown +meltdowns +melted +meltedness +melteigite +melter +melters +melteth +melting +meltingly +meltingness +meltith +melton +meltonian +meltons +melts +meltwater +melungeon +melursus +melvie +mem +member +membered +memberless +members +membership +memberships +membracid +membracidae +membracine +membral +membrally +membrana +membranaceous +membranaceously +membranal +membranate +membrane +membraned +membraneless +membranelike +membranella +membranelle +membraneous +membranes +membraniferous +membraniform +membranin +membranipora +membraniporidae +membranocalcareous +membranocartilaginous +membranocoriaceous +membranocorneous +membranogenic +membranoid +membranology +membranonervous +membranophone +membranophonic +membranosis +membranous +membranously +membranula +membranule +membrette +membretto +memento +mementoes +mementos +meminna +memnon +memnonian +memnonium +memo +memoir +memoire +memoirism +memoirist +memoirs +memorabile +memorabilia +memorability +memorable +memorableness +memorably +memoranda +memorandist +memorandize +memorandum +memorandums +memorate +memoration +memorative +memorda +memory +memoria +memorial +memorialisation +memorialise +memorialised +memorialiser +memorialising +memorialist +memorialization +memorializations +memorialize +memorialized +memorializer +memorializes +memorializing +memorially +memorials +memoried +memories +memoryless +memorylessness +memorious +memorise +memorist +memoriter +memorizable +memorization +memorize +memorized +memorizer +memorizers +memorizes +memorizing +memos +memphian +memphis +memphite +mems +memsahib +memsahibs +men +menaccanite +menaccanitic +menace +menaceable +menaced +menaceful +menacement +menacer +menacers +menaces +menacing +menacingly +menacme +menad +menadic +menadione +menads +menage +menagerie +menageries +menagerist +menages +menald +menangkabau +menaquinone +menarche +menarcheal +menarches +menarchial +menaspis +menat +mend +mendable +mendacious +mendaciously +mendaciousness +mendacity +mendacities +mendaite +mende +mended +mendee +mendel +mendelevium +mendelian +mendelianism +mendelianist +mendelyeevite +mendelism +mendelist +mendelize +mendelssohn +mendelssohnian +mendelssohnic +mender +menders +mendi +mendy +mendiant +mendicancy +mendicancies +mendicant +mendicantism +mendicants +mendicate +mendicated +mendicating +mendication +mendicity +mendigo +mendigos +mending +mendings +mendipite +mendment +mendole +mendozite +mends +mene +meneghinite +menehune +menelaus +menevian +menfolk +menfolks +menfra +meng +mengwe +menhaden +menhadens +menhir +menhirs +meny +menial +menialism +meniality +menially +menialness +menials +menialty +menyanthaceae +menyanthaceous +menyanthes +menic +menyie +menilite +meningeal +meninges +meningic +meningina +meningioma +meningism +meningismus +meningitic +meningitides +meningitis +meningitophobia +meningocele +meningocephalitis +meningocerebritis +meningococcal +meningococcemia +meningococci +meningococcic +meningococcocci +meningococcus +meningocortical +meningoencephalitic +meningoencephalitis +meningoencephalocele +meningomalacia +meningomyclitic +meningomyelitis +meningomyelocele +meningomyelorrhaphy +meningorachidian +meningoradicular +meningorhachidian +meningorrhagia +meningorrhea +meningorrhoea +meningosis +meningospinal +meningotyphoid +meninting +meninx +meniscal +meniscate +meniscectomy +menisci +menisciform +meniscitis +meniscocytosis +meniscoid +meniscoidal +meniscotheriidae +meniscotherium +meniscus +meniscuses +menise +menison +menisperm +menispermaceae +menispermaceous +menispermin +menispermine +menispermum +meniver +menkalinan +menkar +menkib +menkind +mennom +mennon +mennonist +mennonite +mennonites +mennuet +meno +menobranchidae +menobranchus +menognath +menognathous +menology +menologies +menologyes +menologium +menometastasis +menominee +menopausal +menopause +menopausic +menophania +menoplania +menopoma +menorah +menorahs +menorhyncha +menorhynchous +menorrhagy +menorrhagia +menorrhagic +menorrhea +menorrheic +menorrhoea +menorrhoeic +menoschesis +menoschetic +menosepsis +menostasia +menostasis +menostatic +menostaxis +menotyphla +menotyphlic +menow +menoxenia +mens +mensa +mensae +mensal +mensalize +mensas +mensch +menschen +mensches +mense +mensed +menseful +menseless +menservants +menses +menshevik +menshevism +menshevist +mensing +mensis +mensk +menstrua +menstrual +menstruant +menstruate +menstruated +menstruates +menstruating +menstruation +menstruations +menstrue +menstruoos +menstruosity +menstruous +menstruousness +menstruum +menstruums +mensual +mensurability +mensurable +mensurableness +mensurably +mensural +mensuralist +mensurate +mensuration +mensurational +mensurative +menswear +menswears +ment +menta +mentagra +mental +mentalis +mentalism +mentalist +mentalistic +mentalistically +mentalists +mentality +mentalities +mentalization +mentalize +mentally +mentary +mentation +mentery +mentha +menthaceae +menthaceous +menthadiene +menthan +menthane +menthe +menthene +menthenes +menthenol +menthenone +menthyl +menthol +mentholated +menthols +menthone +menticide +menticultural +menticulture +mentiferous +mentiform +mentigerous +mentimeter +mentimutation +mention +mentionability +mentionable +mentioned +mentioner +mentioners +mentioning +mentionless +mentions +mentis +mentoanterior +mentobregmatic +mentocondylial +mentohyoid +mentolabial +mentomeckelian +mentoniere +mentonniere +mentonnieres +mentoposterior +mentor +mentorial +mentorism +mentors +mentorship +mentum +mentzelia +menu +menuiserie +menuiseries +menuisier +menuisiers +menuki +menura +menurae +menuridae +menus +menzie +menziesia +meo +meow +meowed +meowing +meows +mepacrine +meperidine +mephisto +mephistophelean +mephistopheleanly +mephistopheles +mephistophelic +mephistophelistic +mephitic +mephitical +mephitically +mephitinae +mephitine +mephitis +mephitises +mephitism +meprobamate +meq +mer +merak +meralgia +meraline +merat +meratia +merbaby +merbromin +merc +mercal +mercantile +mercantilely +mercantilism +mercantilist +mercantilistic +mercantilists +mercantility +mercaptal +mercaptan +mercaptide +mercaptides +mercaptids +mercapto +mercaptol +mercaptole +mercaptopurine +mercat +mercator +mercatoria +mercatorial +mercature +merce +mercedarian +mercedes +mercedinus +mercedonius +mercement +mercenary +mercenarian +mercenaries +mercenarily +mercenariness +mercer +merceress +mercery +merceries +mercerization +mercerize +mercerized +mercerizer +mercerizes +mercerizing +mercers +mercership +merch +merchandy +merchandisability +merchandisable +merchandise +merchandised +merchandiser +merchandisers +merchandises +merchandising +merchandize +merchandized +merchandry +merchandrise +merchant +merchantability +merchantable +merchantableness +merchanted +merchanteer +merchanter +merchanthood +merchanting +merchantish +merchantly +merchantlike +merchantman +merchantmen +merchantry +merchantries +merchants +merchantship +merchet +merci +mercy +merciable +merciablely +merciably +mercian +mercies +mercify +merciful +mercifully +mercifulness +merciless +mercilessly +mercilessness +merciment +mercyproof +mercurate +mercuration +mercurean +mercury +mercurial +mercurialis +mercurialisation +mercurialise +mercurialised +mercurialising +mercurialism +mercurialist +mercuriality +mercurialization +mercurialize +mercurialized +mercurializing +mercurially +mercurialness +mercuriamines +mercuriammonium +mercurian +mercuriate +mercuric +mercurid +mercuride +mercuries +mercurify +mercurification +mercurified +mercurifying +mercurius +mercurization +mercurize +mercurized +mercurizing +mercurochrome +mercurophen +mercurous +merd +merdivorous +merdurinous +mere +mered +meredithian +merel +merely +merels +merenchyma +merenchymatous +merengue +merengued +merengues +merenguing +merer +meres +meresman +meresmen +merest +merestone +mereswine +meretrices +meretricious +meretriciously +meretriciousness +meretrix +merfold +merfolk +merganser +mergansers +merge +merged +mergence +mergences +merger +mergers +merges +mergh +merginae +merging +mergulus +mergus +meriah +mericarp +merice +merychippus +merycism +merycismus +merycoidodon +merycoidodontidae +merycopotamidae +merycopotamus +merida +meridian +meridians +meridie +meridiem +meridienne +meridion +meridionaceae +meridional +meridionality +meridionally +meril +meringue +meringued +meringues +meringuing +merino +merinos +meriones +meriquinoid +meriquinoidal +meriquinone +meriquinonic +meriquinonoid +merises +merisis +merism +merismatic +merismoid +merist +meristele +meristelic +meristem +meristematic +meristematically +meristems +meristic +meristically +meristogenous +merit +meritable +merited +meritedly +meritedness +meriter +meritful +meriting +meritless +meritlessness +meritmonger +meritmongery +meritmongering +meritocracy +meritocracies +meritocrat +meritocratic +meritory +meritorious +meritoriously +meritoriousness +merits +merk +merkhet +merkin +merks +merl +merle +merles +merlette +merligo +merlin +merling +merlins +merlion +merlon +merlons +merls +merlucciidae +merluccius +mermaid +mermaiden +mermaids +merman +mermen +mermis +mermithaner +mermithergate +mermithidae +mermithization +mermithized +mermithogyne +mermnad +mermnadae +mermother +mero +meroblastic +meroblastically +merocele +merocelic +merocerite +meroceritic +merocyte +merocrine +merocrystalline +merodach +merodus +merogamy +merogastrula +merogenesis +merogenetic +merogenic +merognathite +merogony +merogonic +merohedral +merohedric +merohedrism +meroistic +meroitic +meromyaria +meromyarian +meromyosin +meromorphic +merop +merope +meropes +meropia +meropias +meropic +meropidae +meropidan +meroplankton +meroplanktonic +meropodite +meropoditic +merops +merorganization +merorganize +meros +merosymmetry +merosymmetrical +merosystematic +merosomal +merosomata +merosomatous +merosome +merosthenic +merostomata +merostomatous +merostome +merostomous +merotomy +merotomize +merotropy +merotropism +merovingian +meroxene +merozoa +merozoite +merpeople +merry +merribauks +merribush +merrier +merriest +merril +merriless +merrily +merrimack +merrymake +merrymaker +merrymakers +merrymaking +merryman +merrymeeting +merrymen +merriment +merriness +merrythought +merrytrotter +merrywing +merrow +merrowes +merse +mersion +mertensia +merthiolate +merton +meruit +merula +meruline +merulioid +merulius +merv +mervail +merveileux +merveilleux +merwinite +merwoman +mes +mesa +mesabite +mesaconate +mesaconic +mesad +mesadenia +mesail +mesal +mesalike +mesally +mesalliance +mesalliances +mesameboid +mesange +mesaortitis +mesaraic +mesaraical +mesarch +mesarteritic +mesarteritis +mesartim +mesas +mesaticephal +mesaticephali +mesaticephaly +mesaticephalic +mesaticephalism +mesaticephalous +mesatipellic +mesatipelvic +mesatiskelic +mesaxonic +mescal +mescalero +mescaline +mescalism +mescals +meschant +meschantly +mesdames +mesdemoiselles +mese +mesectoderm +meseemed +meseems +mesel +mesela +meseled +meseledness +mesely +meselry +mesem +mesembryanthemaceae +mesembryanthemum +mesembryo +mesembryonic +mesencephala +mesencephalic +mesencephalon +mesencephalons +mesenchyma +mesenchymal +mesenchymatal +mesenchymatic +mesenchymatous +mesenchyme +mesendoderm +mesenna +mesentera +mesentery +mesenterial +mesenteric +mesenterical +mesenterically +mesenteries +mesenteriform +mesenteriolum +mesenteritic +mesenteritis +mesenterium +mesenteron +mesenteronic +mesentoderm +mesepimeral +mesepimeron +mesepisternal +mesepisternum +mesepithelial +mesepithelium +meseraic +mesethmoid +mesethmoidal +mesh +meshech +meshed +meshes +meshy +meshier +meshiest +meshing +meshrabiyeh +meshrebeeyeh +meshuga +meshugaas +meshugana +meshugga +meshuggaas +meshuggah +meshuggana +meshuggenah +meshummad +meshwork +meshworks +mesiad +mesial +mesially +mesian +mesic +mesically +mesilla +mesymnion +mesiobuccal +mesiocervical +mesioclusion +mesiodistal +mesiodistally +mesiogingival +mesioincisal +mesiolabial +mesiolingual +mesion +mesioocclusal +mesiopulpal +mesioversion +mesitae +mesites +mesitidae +mesityl +mesitylene +mesitylenic +mesitine +mesitite +mesivta +mesked +meslen +mesmerian +mesmeric +mesmerical +mesmerically +mesmerisation +mesmerise +mesmeriser +mesmerism +mesmerist +mesmerists +mesmerite +mesmerizability +mesmerizable +mesmerization +mesmerize +mesmerized +mesmerizee +mesmerizer +mesmerizers +mesmerizes +mesmerizing +mesmeromania +mesmeromaniac +mesnage +mesnality +mesnalty +mesnalties +mesne +meso +mesoappendiceal +mesoappendicitis +mesoappendix +mesoarial +mesoarium +mesobar +mesobenthos +mesoblast +mesoblastem +mesoblastema +mesoblastemic +mesoblastic +mesobranchial +mesobregmate +mesocadia +mesocaecal +mesocaecum +mesocardia +mesocardium +mesocarp +mesocarpic +mesocarps +mesocentrous +mesocephal +mesocephaly +mesocephalic +mesocephalism +mesocephalon +mesocephalous +mesochilium +mesochondrium +mesochroic +mesocoele +mesocoelia +mesocoelian +mesocoelic +mesocola +mesocolic +mesocolon +mesocolons +mesocoracoid +mesocranial +mesocranic +mesocratic +mesocuneiform +mesode +mesoderm +mesodermal +mesodermic +mesoderms +mesodesma +mesodesmatidae +mesodesmidae +mesodevonian +mesodevonic +mesodic +mesodisilicic +mesodont +mesodontic +mesodontism +mesoenatides +mesofurca +mesofurcal +mesogaster +mesogastral +mesogastric +mesogastrium +mesogyrate +mesoglea +mesogleal +mesogleas +mesogloea +mesogloeal +mesognathy +mesognathic +mesognathion +mesognathism +mesognathous +mesohepar +mesohippus +mesokurtic +mesolabe +mesole +mesolecithal +mesolimnion +mesolite +mesolithic +mesology +mesologic +mesological +mesomere +mesomeres +mesomeric +mesomerism +mesometeorology +mesometeorological +mesometral +mesometric +mesometrium +mesomyodi +mesomyodian +mesomyodous +mesomitosis +mesomorph +mesomorphy +mesomorphic +mesomorphism +mesomorphous +meson +mesonasal +mesonemertini +mesonephric +mesonephridium +mesonephritic +mesonephroi +mesonephros +mesonic +mesonychidae +mesonyx +mesonotal +mesonotum +mesons +mesoparapteral +mesoparapteron +mesopause +mesopeak +mesopectus +mesopelagic +mesoperiodic +mesopetalum +mesophil +mesophyl +mesophile +mesophilic +mesophyll +mesophyllic +mesophyllous +mesophyllum +mesophilous +mesophyls +mesophyte +mesophytic +mesophytism +mesophragm +mesophragma +mesophragmal +mesophryon +mesopic +mesoplankton +mesoplanktonic +mesoplast +mesoplastic +mesoplastra +mesoplastral +mesoplastron +mesopleura +mesopleural +mesopleuron +mesoplodon +mesoplodont +mesopodia +mesopodial +mesopodiale +mesopodialia +mesopodium +mesopotamia +mesopotamian +mesopotamic +mesoprescutal +mesoprescutum +mesoprosopic +mesopterygial +mesopterygium +mesopterygoid +mesorchial +mesorchium +mesore +mesorecta +mesorectal +mesorectta +mesorectum +mesorectums +mesoreodon +mesorhin +mesorhinal +mesorhine +mesorhiny +mesorhinian +mesorhinism +mesorhinium +mesorrhin +mesorrhinal +mesorrhine +mesorrhiny +mesorrhinian +mesorrhinism +mesorrhinium +mesosalpinx +mesosaur +mesosauria +mesosaurus +mesoscale +mesoscapula +mesoscapular +mesoscutal +mesoscutellar +mesoscutellum +mesoscutum +mesoseismal +mesoseme +mesosiderite +mesosigmoid +mesoskelic +mesosoma +mesosomata +mesosomatic +mesosome +mesosomes +mesosperm +mesosphere +mesospheric +mesospore +mesosporic +mesosporium +mesost +mesostasis +mesosterna +mesosternal +mesosternebra +mesosternebral +mesosternum +mesostethium +mesostyle +mesostylous +mesostoma +mesostomatidae +mesostomid +mesosuchia +mesosuchian +mesotaeniaceae +mesotaeniales +mesotarsal +mesotartaric +mesothelae +mesothelia +mesothelial +mesothelioma +mesothelium +mesotherm +mesothermal +mesothesis +mesothet +mesothetic +mesothetical +mesothoraces +mesothoracic +mesothoracotheca +mesothorax +mesothoraxes +mesothorium +mesotympanic +mesotype +mesotonic +mesotroch +mesotrocha +mesotrochal +mesotrochous +mesotron +mesotronic +mesotrons +mesotrophic +mesotropic +mesovaria +mesovarian +mesovarium +mesoventral +mesoventrally +mesoxalate +mesoxalic +mesoxalyl +mesozoa +mesozoan +mesozoic +mespil +mespilus +mespot +mesprise +mesquin +mesquit +mesquita +mesquite +mesquites +mesquits +mesropian +mess +message +messaged +messageer +messagery +messages +messaging +messalian +messaline +messan +messans +messapian +messe +messed +messeigneurs +messelite +messenger +messengers +messengership +messer +messes +messet +messy +messiah +messiahs +messiahship +messianic +messianically +messianism +messianist +messianize +messias +messidor +messier +messiest +messieurs +messily +messin +messines +messinese +messiness +messing +messire +messkit +messman +messmate +messmates +messmen +messor +messroom +messrs +messtin +messuage +messuages +mest +mestee +mestees +mesteno +mester +mesteso +mestesoes +mestesos +mestfull +mestino +mestinoes +mestinos +mestiza +mestizas +mestizo +mestizoes +mestizos +mestlen +mestome +mestranol +mesua +mesvinian +met +meta +metabases +metabasis +metabasite +metabatic +metabiology +metabiological +metabiosis +metabiotic +metabiotically +metabismuthic +metabisulphite +metabit +metabits +metabletic +metabola +metabole +metaboly +metabolia +metabolian +metabolic +metabolical +metabolically +metabolise +metabolised +metabolising +metabolism +metabolite +metabolites +metabolizability +metabolizable +metabolize +metabolized +metabolizes +metabolizing +metabolon +metabolous +metaborate +metaboric +metabranchial +metabrushite +metabular +metacapi +metacarpal +metacarpale +metacarpals +metacarpi +metacarpophalangeal +metacarpus +metacenter +metacentral +metacentre +metacentric +metacentricity +metacercaria +metacercarial +metacetone +metachemic +metachemical +metachemistry +metachlamydeae +metachlamydeous +metachromasis +metachromatic +metachromatin +metachromatinic +metachromatism +metachrome +metachronal +metachronism +metachronistic +metachrosis +metacyclic +metacymene +metacinnabar +metacinnabarite +metacircular +metacircularity +metacism +metacismus +metaclase +metacneme +metacoele +metacoelia +metaconal +metacone +metaconid +metaconule +metacoracoid +metacrasis +metacresol +metacryst +metacromial +metacromion +metad +metadiabase +metadiazine +metadiorite +metadiscoidal +metadromous +metae +metaethical +metaethics +metafemale +metafluidal +metaformaldehyde +metafulminuric +metagalactic +metagalaxy +metagalaxies +metagaster +metagastric +metagastrula +metage +metageitnion +metagelatin +metagelatine +metagenesis +metagenetic +metagenetically +metagenic +metageometer +metageometry +metageometrical +metages +metagnath +metagnathism +metagnathous +metagnomy +metagnostic +metagnosticism +metagram +metagrammatism +metagrammatize +metagraphy +metagraphic +metagrobolize +metahewettite +metahydroxide +metayage +metayer +metaigneous +metainfective +metairie +metakinesis +metakinetic +metal +metalammonium +metalanguage +metalaw +metalbearing +metalbumin +metalcraft +metaldehyde +metaled +metalepses +metalepsis +metaleptic +metaleptical +metaleptically +metaler +metaline +metalined +metaling +metalinguistic +metalinguistically +metalinguistics +metalise +metalised +metalises +metalising +metalism +metalist +metalists +metalization +metalize +metalized +metalizes +metalizing +metall +metallary +metalled +metalleity +metaller +metallic +metallical +metallically +metallicity +metallicize +metallicly +metallics +metallide +metallifacture +metalliferous +metallify +metallification +metalliform +metallik +metallike +metalline +metalling +metallisation +metallise +metallised +metallish +metallising +metallism +metallist +metallization +metallizations +metallize +metallized +metallizing +metallocene +metallochrome +metallochromy +metalloenzyme +metallogenetic +metallogeny +metallogenic +metallograph +metallographer +metallography +metallographic +metallographical +metallographically +metallographist +metalloid +metalloidal +metallometer +metallophobia +metallophone +metalloplastic +metallorganic +metallotherapeutic +metallotherapy +metallurgy +metallurgic +metallurgical +metallurgically +metallurgist +metallurgists +metalmark +metalmonger +metalogic +metalogical +metaloph +metalorganic +metaloscope +metaloscopy +metals +metalsmith +metaluminate +metaluminic +metalware +metalwork +metalworker +metalworkers +metalworking +metalworks +metamale +metamathematical +metamathematician +metamathematics +metamer +metameral +metamere +metameres +metamery +metameric +metamerically +metameride +metamerism +metamerization +metamerize +metamerized +metamerous +metamers +metamynodon +metamitosis +metamorphy +metamorphic +metamorphically +metamorphism +metamorphisms +metamorphize +metamorphopsy +metamorphopsia +metamorphosable +metamorphose +metamorphosed +metamorphoser +metamorphoses +metamorphosy +metamorphosian +metamorphosic +metamorphosical +metamorphosing +metamorphosis +metamorphostical +metamorphotic +metamorphous +metanalysis +metanauplius +metanemertini +metanephric +metanephritic +metanephroi +metanephron +metanephros +metanepionic +metanetwork +metanilic +metaniline +metanym +metanitroaniline +metanitrophenol +metanoia +metanomen +metanotal +metanotion +metanotions +metanotum +metantimonate +metantimonic +metantimonious +metantimonite +metantimonous +metaorganism +metaparapteral +metaparapteron +metapectic +metapectus +metapepsis +metapeptone +metaperiodic +metaph +metaphase +metaphenylene +metaphenylenediamin +metaphenylenediamine +metaphenomenal +metaphenomenon +metaphys +metaphyseal +metaphysic +metaphysical +metaphysically +metaphysician +metaphysicianism +metaphysicians +metaphysicist +metaphysicize +metaphysicous +metaphysics +metaphysis +metaphyte +metaphytic +metaphyton +metaphloem +metaphony +metaphonical +metaphonize +metaphor +metaphoric +metaphorical +metaphorically +metaphoricalness +metaphorist +metaphorize +metaphors +metaphosphate +metaphosphated +metaphosphating +metaphosphoric +metaphosphorous +metaphragm +metaphragma +metaphragmal +metaphrase +metaphrased +metaphrasing +metaphrasis +metaphrast +metaphrastic +metaphrastical +metaphrastically +metaplasia +metaplasis +metaplasm +metaplasmic +metaplast +metaplastic +metapleur +metapleura +metapleural +metapleure +metapleuron +metaplumbate +metaplumbic +metapneumonic +metapneustic +metapodia +metapodial +metapodiale +metapodium +metapolitic +metapolitical +metapolitician +metapolitics +metapophyseal +metapophysial +metapophysis +metapore +metapostscutellar +metapostscutellum +metaprescutal +metaprescutum +metaprotein +metapsychic +metapsychical +metapsychics +metapsychism +metapsychist +metapsychology +metapsychological +metapsychosis +metapterygial +metapterygium +metapterygoid +metarabic +metargon +metarhyolite +metarossite +metarsenic +metarsenious +metarsenite +metarule +metarules +metas +metasaccharinic +metascope +metascutal +metascutellar +metascutellum +metascutum +metasedimentary +metasequoia +metasilicate +metasilicic +metasymbol +metasyntactic +metasoma +metasomal +metasomasis +metasomatic +metasomatically +metasomatism +metasomatosis +metasome +metasperm +metaspermae +metaspermic +metaspermous +metastability +metastable +metastably +metastannate +metastannic +metastases +metastasis +metastasize +metastasized +metastasizes +metastasizing +metastatic +metastatical +metastatically +metasternal +metasternum +metasthenic +metastibnite +metastigmate +metastyle +metastoma +metastomata +metastome +metastrophe +metastrophic +metatantalic +metatarsal +metatarsale +metatarsally +metatarse +metatarsi +metatarsophalangeal +metatarsus +metatarsusi +metatatic +metatatical +metatatically +metataxic +metataxis +metate +metates +metathalamus +metatheology +metatheory +metatheria +metatherian +metatheses +metathesis +metathesise +metathesize +metathetic +metathetical +metathetically +metathoraces +metathoracic +metathorax +metathoraxes +metatype +metatypic +metatitanate +metatitanic +metatoluic +metatoluidine +metatracheal +metatroph +metatrophy +metatrophic +metatungstic +metaurus +metavanadate +metavanadic +metavariable +metavauxite +metavoltine +metaxenia +metaxylem +metaxylene +metaxite +metazoa +metazoal +metazoan +metazoans +metazoea +metazoic +metazoon +mete +metecorn +meted +metegritics +meteyard +metel +metely +metempiric +metempirical +metempirically +metempiricism +metempiricist +metempirics +metempsychic +metempsychosal +metempsychose +metempsychoses +metempsychosic +metempsychosical +metempsychosis +metempsychosize +metemptosis +metencephala +metencephalic +metencephalla +metencephalon +metencephalons +metensarcosis +metensomatosis +metenteron +metenteronic +meteogram +meteograph +meteor +meteorgraph +meteoric +meteorical +meteorically +meteoris +meteorism +meteorist +meteoristic +meteorital +meteorite +meteorites +meteoritic +meteoritical +meteoritics +meteorization +meteorize +meteorlike +meteorogram +meteorograph +meteorography +meteorographic +meteoroid +meteoroidal +meteoroids +meteorol +meteorolite +meteorolitic +meteorology +meteorologic +meteorological +meteorologically +meteorologist +meteorologists +meteoromancy +meteorometer +meteoropathologic +meteoroscope +meteoroscopy +meteorous +meteors +meteorscope +metepa +metepas +metepencephalic +metepencephalon +metepimeral +metepimeron +metepisternal +metepisternum +meter +meterable +meterage +meterages +metered +metergram +metering +meterless +meterman +meterological +meters +metership +meterstick +metes +metestick +metestrus +metewand +meth +methacrylate +methacrylic +methadon +methadone +methadons +methaemoglobin +methamphetamine +methanal +methanate +methanated +methanating +methane +methanes +methanoic +methanol +methanolic +methanolysis +methanols +methanometer +methantheline +methaqualone +metheglin +methemoglobin +methemoglobinemia +methemoglobinuria +methenamine +methene +methenyl +mether +methhead +methicillin +methid +methide +methyl +methylacetanilide +methylal +methylals +methylamine +methylaniline +methylanthracene +methylase +methylate +methylated +methylating +methylation +methylator +methylbenzene +methylcatechol +methylcholanthrene +methyldopa +methylene +methylenimine +methylenitan +methylethylacetic +methylglycine +methylglycocoll +methylglyoxal +methylheptenone +methylic +methylidyne +methylmalonic +methylnaphthalene +methylol +methylolurea +methylosis +methylotic +methylparaben +methylpentose +methylpentoses +methylphenidate +methylpropane +methyls +methylsulfanol +methyltrinitrobenzene +methine +methinks +methiodide +methionic +methionine +methyprylon +methysergide +metho +methobromide +method +methodaster +methodeutic +methody +methodic +methodical +methodically +methodicalness +methodics +methodise +methodised +methodiser +methodising +methodism +methodist +methodisty +methodistic +methodistically +methodists +methodization +methodize +methodized +methodizer +methodizes +methodizing +methodless +methodology +methodological +methodologically +methodologies +methodologist +methodologists +methods +methol +methomania +methone +methotrexate +methought +methoxamine +methoxy +methoxybenzene +methoxychlor +methoxide +methoxyflurane +methoxyl +methronic +meths +methuselah +metic +meticulosity +meticulous +meticulously +meticulousness +metier +metiers +metif +metin +meting +metis +metisse +metisses +metoac +metochy +metochous +metoestrous +metoestrum +metoestrus +metol +metonic +metonym +metonymy +metonymic +metonymical +metonymically +metonymies +metonymous +metonymously +metonyms +metopae +metope +metopes +metopias +metopic +metopion +metopism +metopoceros +metopomancy +metopon +metopons +metoposcopy +metoposcopic +metoposcopical +metoposcopist +metorganism +metosteal +metosteon +metostylous +metoxazine +metoxeny +metoxenous +metra +metralgia +metran +metranate +metranemia +metratonia +metrazol +metre +metrectasia +metrectatic +metrectomy +metrectopy +metrectopia +metrectopic +metrectotmy +metred +metregram +metreless +metreme +metres +metreship +metreta +metrete +metretes +metreza +metria +metric +metrical +metrically +metricate +metricated +metricates +metricating +metrication +metrician +metricise +metricised +metricising +metricism +metricist +metricity +metricize +metricized +metricizes +metricizing +metrics +metridium +metrify +metrification +metrified +metrifier +metrifies +metrifying +metring +metriocephalic +metrise +metrist +metrists +metritis +metritises +metrizable +metrization +metrize +metrized +metrizing +metro +metrocampsis +metrocarat +metrocarcinoma +metrocele +metrocystosis +metroclyst +metrocolpocele +metrocracy +metrocratic +metrodynia +metrofibroma +metrography +metrolymphangitis +metroliner +metroliners +metrology +metrological +metrologically +metrologies +metrologist +metrologue +metromalacia +metromalacoma +metromalacosis +metromania +metromaniac +metromaniacal +metrometer +metron +metroneuria +metronidazole +metronym +metronymy +metronymic +metronome +metronomes +metronomic +metronomical +metronomically +metroparalysis +metropathy +metropathia +metropathic +metroperitonitis +metrophlebitis +metrophotography +metropole +metropoleis +metropolic +metropolis +metropolises +metropolitan +metropolitanate +metropolitancy +metropolitanism +metropolitanize +metropolitanized +metropolitanship +metropolite +metropolitic +metropolitical +metropolitically +metroptosia +metroptosis +metroradioscope +metrorrhagia +metrorrhagic +metrorrhea +metrorrhexis +metrorthosis +metros +metrosalpingitis +metrosalpinx +metroscirrhus +metroscope +metroscopy +metrosideros +metrosynizesis +metrostaxis +metrostenosis +metrosteresis +metrostyle +metrotherapy +metrotherapist +metrotome +metrotometry +metrotomy +metroxylon +mets +mettar +mettle +mettled +mettles +mettlesome +mettlesomely +mettlesomeness +metump +metumps +metus +metusia +metwand +metze +meu +meubles +meum +meuni +meuniere +meurtriere +meuse +meute +mev +mew +meward +mewed +mewer +mewing +mewl +mewled +mewler +mewlers +mewling +mewls +mews +mexica +mexical +mexican +mexicanize +mexicans +mexico +mexitl +mexitli +mezail +mezair +mezcal +mezcaline +mezcals +mezentian +mezentism +mezentius +mezereon +mezereons +mezereum +mezereums +mezo +mezquit +mezquite +mezquites +mezquits +mezuza +mezuzah +mezuzahs +mezuzas +mezuzot +mezuzoth +mezzanine +mezzanines +mezzavoce +mezzo +mezzograph +mezzolith +mezzolithic +mezzos +mezzotint +mezzotinted +mezzotinter +mezzotinting +mezzotinto +mf +mfd +mfg +mfr +mg +mgal +mgd +mgr +mgt +mh +mhg +mho +mhometer +mhorr +mhos +mhz +mi +my +mia +mya +myacea +miacis +miae +myal +myalgia +myalgias +myalgic +myalia +myalism +myall +miami +miamia +mian +miao +miaotse +miaotze +miaou +miaoued +miaouing +miaous +miaow +miaowed +miaower +miaowing +miaows +miaplacidus +miargyrite +myaria +myarian +miarolitic +mias +miascite +myases +myasis +miaskite +miasm +miasma +miasmal +miasmas +miasmata +miasmatic +miasmatical +miasmatically +miasmatize +miasmatology +miasmatous +miasmic +miasmology +miasmous +miasms +myasthenia +myasthenic +miastor +myatony +myatonia +myatonic +myatrophy +miauer +miaul +miauled +miauler +miauling +miauls +miauw +miazine +mib +mibound +mibs +myc +mica +micaceous +micacious +micacite +micah +micas +micasization +micasize +micast +micasting +micasts +micate +mication +micawber +micawberish +micawberism +micawbers +mice +mycele +myceles +mycelia +mycelial +mycelian +mycelioid +mycelium +micell +micella +micellae +micellar +micellarly +micelle +micelles +micells +myceloid +mycenaean +miceplot +micerun +micesource +mycetes +mycetism +mycetocyte +mycetogenesis +mycetogenetic +mycetogenic +mycetogenous +mycetoid +mycetology +mycetological +mycetoma +mycetomas +mycetomata +mycetomatous +mycetome +mycetophagidae +mycetophagous +mycetophilid +mycetophilidae +mycetous +mycetozoa +mycetozoan +mycetozoon +michabo +michabou +michael +michaelites +michaelmas +michaelmastide +miche +micheal +miched +michel +michelangelesque +michelangelism +michelangelo +michelia +michelle +micher +michery +michiel +michigamea +michigan +michigander +michiganite +miching +michoacan +michoacano +micht +mick +mickey +mickeys +mickery +micky +mickies +mickle +micklemote +mickleness +mickler +mickles +micklest +micks +micmac +mico +mycobacteria +mycobacteriaceae +mycobacterial +mycobacterium +mycocecidium +mycocyte +mycoderm +mycoderma +mycodermatoid +mycodermatous +mycodermic +mycodermitis +mycodesmoid +mycodomatium +mycoflora +mycogastritis +mycogone +mycohaemia +mycohemia +mycoid +mycol +mycology +mycologic +mycological +mycologically +mycologies +mycologist +mycologists +mycologize +mycomycete +mycomycetes +mycomycetous +mycomycin +mycomyringitis +miconcave +miconia +mycophagy +mycophagist +mycophagous +mycophyte +mycoplana +mycoplasm +mycoplasma +mycoplasmal +mycoplasmic +mycoprotein +mycorhiza +mycorhizal +mycorrhiza +mycorrhizae +mycorrhizal +mycorrhizic +mycorrihizas +mycose +mycoses +mycosymbiosis +mycosin +mycosis +mycosozin +mycosphaerella +mycosphaerellaceae +mycostat +mycostatic +mycosterol +mycotic +mycotoxic +mycotoxin +mycotrophic +micra +micraco +micracoustic +micraesthete +micramock +micrampelis +micranatomy +micrander +micrandrous +micraner +micranthropos +micraster +micrencephaly +micrencephalia +micrencephalic +micrencephalous +micrencephalus +micrergate +micresthete +micrify +micrified +micrifies +micrifying +micro +microaerophile +microaerophilic +microammeter +microampere +microanalyses +microanalysis +microanalyst +microanalytic +microanalytical +microanatomy +microanatomical +microangstrom +microapparatus +microarchitects +microarchitecture +microarchitectures +microbacteria +microbacterium +microbacteteria +microbal +microbalance +microbar +microbarogram +microbarograph +microbars +microbattery +microbe +microbeam +microbeless +microbeproof +microbes +microbial +microbian +microbic +microbicidal +microbicide +microbiology +microbiologic +microbiological +microbiologically +microbiologies +microbiologist +microbiologists +microbion +microbiophobia +microbiosis +microbiota +microbiotic +microbious +microbism +microbium +microblast +microblephary +microblepharia +microblepharism +microbody +microbrachia +microbrachius +microburet +microburette +microburner +microbus +microbuses +microbusses +microcaltrop +microcamera +microcapsule +microcard +microcardia +microcardius +microcards +microcarpous +microcebus +microcellular +microcentrosome +microcentrum +microcephal +microcephali +microcephaly +microcephalia +microcephalic +microcephalism +microcephalous +microcephalus +microceratous +microchaeta +microchaetae +microcharacter +microcheilia +microcheiria +microchemic +microchemical +microchemically +microchemistry +microchip +microchiria +microchiroptera +microchiropteran +microchiropterous +microchromosome +microchronometer +microcycle +microcycles +microcinema +microcinematograph +microcinematography +microcinematographic +microcyprini +microcircuit +microcircuitry +microcirculation +microcirculatory +microcyst +microcyte +microcythemia +microcytic +microcytosis +microcitrus +microclastic +microclimate +microclimates +microclimatic +microclimatically +microclimatology +microclimatologic +microclimatological +microclimatologist +microcline +microcnemia +microcoat +micrococcal +micrococceae +micrococci +micrococcic +micrococcocci +micrococcus +microcode +microcoded +microcodes +microcoding +microcoleoptera +microcolon +microcolorimeter +microcolorimetry +microcolorimetric +microcolorimetrically +microcolumnar +microcombustion +microcomputer +microcomputers +microconidial +microconidium +microconjugant +microconodon +microconstituent +microcopy +microcopied +microcopies +microcopying +microcoria +microcos +microcosm +microcosmal +microcosmian +microcosmic +microcosmical +microcosmically +microcosmography +microcosmology +microcosmos +microcosms +microcosmus +microcoulomb +microcranous +microcryptocrystalline +microcrystal +microcrystalline +microcrystallinity +microcrystallogeny +microcrystallography +microcrystalloscopy +microcrith +microcultural +microculture +microcurie +microdactylia +microdactylism +microdactylous +microdensitometer +microdensitometry +microdensitometric +microdentism +microdentous +microdetection +microdetector +microdetermination +microdiactine +microdimensions +microdyne +microdissection +microdistillation +microdont +microdonty +microdontia +microdontic +microdontism +microdontous +microdose +microdot +microdrawing +microdrili +microdrive +microeconomic +microeconomics +microelectrode +microelectrolysis +microelectronic +microelectronically +microelectronics +microelectrophoresis +microelectrophoretic +microelectrophoretical +microelectrophoretically +microelectroscope +microelement +microencapsulate +microencapsulation +microenvironment +microenvironmental +microerg +microestimation +microeutaxitic +microevolution +microevolutionary +microexamination +microfarad +microfauna +microfaunal +microfelsite +microfelsitic +microfibril +microfibrillar +microfiche +microfiches +microfilaria +microfilarial +microfilm +microfilmable +microfilmed +microfilmer +microfilming +microfilms +microflora +microfloral +microfluidal +microfoliation +microform +microforms +microfossil +microfungal +microfungus +microfurnace +microgadus +microgalvanometer +microgamete +microgametocyte +microgametophyte +microgamy +microgamies +microgaster +microgastria +microgastrinae +microgastrine +microgauss +microgeology +microgeological +microgeologist +microgilbert +microgyne +microgyria +microglia +microglial +microglossia +micrognathia +micrognathic +micrognathous +microgonidial +microgonidium +microgram +microgramme +microgrammes +microgramming +micrograms +microgranite +microgranitic +microgranitoid +microgranular +microgranulitic +micrograph +micrographer +micrography +micrographic +micrographical +micrographically +micrographist +micrographs +micrograver +microgravimetric +microgroove +microgrooves +microhabitat +microhardness +microhenry +microhenries +microhenrys +microhepatia +microhymenoptera +microhymenopteron +microhistochemical +microhistology +microhm +microhmmeter +microhms +microimage +microinch +microinjection +microinstruction +microinstructions +microjoule +microjump +microjumps +microlambert +microlecithal +microlepidopter +microlepidoptera +microlepidopteran +microlepidopterist +microlepidopteron +microlepidopterous +microleukoblast +microlevel +microlite +microliter +microlith +microlithic +microlitic +micrology +micrologic +micrological +micrologically +micrologist +micrologue +microluces +microlux +microluxes +micromania +micromaniac +micromanipulation +micromanipulator +micromanipulators +micromanometer +micromastictora +micromazia +micromeasurement +micromechanics +micromeli +micromelia +micromelic +micromelus +micromembrane +micromeral +micromere +micromeria +micromeric +micromerism +micromeritic +micromeritics +micromesentery +micrometallographer +micrometallography +micrometallurgy +micrometeorite +micrometeoritic +micrometeorogram +micrometeorograph +micrometeoroid +micrometeorology +micrometeorological +micrometeorologist +micrometer +micrometers +micromethod +micrometry +micrometric +micrometrical +micrometrically +micromho +micromhos +micromicrocurie +micromicrofarad +micromicron +micromyelia +micromyeloblast +micromil +micromillimeter +micromineralogy +micromineralogical +microminiature +microminiaturization +microminiaturizations +microminiaturize +microminiaturized +microminiaturizing +micromodule +micromolar +micromole +micromorph +micromorphology +micromorphologic +micromorphological +micromorphologically +micromotion +micromotoscope +micron +micronemous +micronesia +micronesian +micronesians +micronization +micronize +micronometer +microns +micronuclear +micronucleate +micronuclei +micronucleus +micronutrient +microoperations +microorganic +microorganism +microorganismal +microorganisms +micropalaeontology +micropaleontology +micropaleontologic +micropaleontological +micropaleontologist +micropantograph +microparasite +microparasitic +micropathology +micropathological +micropathologies +micropathologist +micropegmatite +micropegmatitic +micropenis +microperthite +microperthitic +micropetalous +micropetrography +micropetrology +micropetrologist +microphage +microphagy +microphagocyte +microphagous +microphakia +microphallus +microphyll +microphyllous +microphysical +microphysically +microphysics +microphysiography +microphytal +microphyte +microphytic +microphytology +microphobia +microphone +microphones +microphonic +microphonics +microphoning +microphonism +microphonograph +microphot +microphotograph +microphotographed +microphotographer +microphotography +microphotographic +microphotographing +microphotographs +microphotometer +microphotometry +microphotometric +microphotometrically +microphotoscope +microphthalmia +microphthalmic +microphthalmos +microphthalmus +micropia +micropylar +micropyle +micropin +micropipet +micropipette +micropyrometer +microplakite +microplankton +microplastocyte +microplastometer +micropodal +micropodi +micropodia +micropodidae +micropodiformes +micropodous +micropoecilitic +micropoicilitic +micropoikilitic +micropolariscope +micropolarization +micropopulation +micropore +microporosity +microporous +microporphyritic +microprint +microprobe +microprocedure +microprocedures +microprocessing +microprocessor +microprocessors +microprogram +microprogrammable +microprogrammed +microprogrammer +microprogramming +microprograms +microprojection +microprojector +micropsy +micropsia +micropterygid +micropterygidae +micropterygious +micropterygoidea +micropterism +micropteryx +micropterous +micropterus +microptic +micropublisher +micropublishing +micropulsation +micropuncture +micropus +microradiograph +microradiography +microradiographic +microradiographical +microradiographically +microradiometer +microreaction +microreader +microrefractometer +microreproduction +microrhabdus +microrheometer +microrheometric +microrheometrical +microrhopias +micros +microsauria +microsaurian +microscale +microsclere +microsclerous +microsclerum +microscopal +microscope +microscopes +microscopy +microscopial +microscopic +microscopical +microscopically +microscopics +microscopid +microscopies +microscopist +microscopium +microscopize +microscopopy +microsec +microsecond +microseconds +microsection +microsegment +microseism +microseismic +microseismical +microseismicity +microseismograph +microseismology +microseismometer +microseismometry +microseismometrograph +microseme +microseptum +microsiemens +microsystems +microskirt +microsmatic +microsmatism +microsoftware +microsoma +microsomal +microsomatous +microsome +microsomia +microsomial +microsomic +microsommite +microsorex +microspace +microspacing +microspecies +microspectrophotometer +microspectrophotometry +microspectrophotometric +microspectrophotometrical +microspectrophotometrically +microspectroscope +microspectroscopy +microspectroscopic +microspermae +microspermous +microsphaera +microsphaeric +microsphere +microspheric +microspherical +microspherulitic +microsplanchnic +microsplenia +microsplenic +microsporange +microsporanggia +microsporangia +microsporangiate +microsporangium +microspore +microsporiasis +microsporic +microsporidia +microsporidian +microsporocyte +microsporogenesis +microsporon +microsporophyll +microsporophore +microsporosis +microsporous +microsporum +microstat +microstate +microstates +microstethoscope +microsthene +microsthenes +microsthenic +microstylis +microstylospore +microstylous +microstomatous +microstome +microstomia +microstomous +microstore +microstress +microstructural +microstructure +microsublimation +microsurgeon +microsurgeons +microsurgery +microsurgeries +microsurgical +microswitch +microtasimeter +microtechnic +microtechnique +microtektite +microtelephone +microtelephonic +microthelyphonida +microtheos +microtherm +microthermic +microthyriaceae +microthorax +microtia +microtinae +microtine +microtines +microtypal +microtype +microtypical +microtitration +microtome +microtomy +microtomic +microtomical +microtomist +microtonal +microtonality +microtonally +microtone +microtubular +microtubule +microtus +microvasculature +microvax +microvaxes +microvillar +microvillous +microvillus +microvolt +microvolume +microvolumetric +microwatt +microwave +microwaves +microweber +microword +microwords +microzyma +microzyme +microzymian +microzoa +microzoal +microzoan +microzoary +microzoaria +microzoarian +microzoic +microzone +microzooid +microzoology +microzoon +microzoospore +micrurgy +micrurgic +micrurgical +micrurgies +micrurgist +micrurus +mycteria +mycteric +mycterism +miction +myctodera +myctophid +myctophidae +myctophum +micturate +micturated +micturating +micturation +micturition +mid +midafternoon +mydaidae +midair +midairs +mydaleine +midas +mydatoxine +mydaus +midautumn +midaxillary +midband +midbody +midbrain +midbrains +midcarpal +midchannel +midcourse +midday +middays +midden +middens +middenstead +middes +middest +middy +middies +middle +middlebreaker +middlebrow +middlebrowism +middlebrows +middlebuster +middleclass +middled +middlehand +middleland +middleman +middlemanism +middlemanship +middlemen +middlemost +middleness +middler +middlers +middles +middlesail +middlesplitter +middletone +middleway +middlewards +middleweight +middleweights +middlewoman +middlewomen +middling +middlingish +middlingly +middlingness +middlings +middorsal +mide +mideast +mider +midevening +midewin +midewiwin +midfacial +midfield +midfielder +midfields +midforenoon +midfrontal +midgard +midge +midges +midget +midgety +midgets +midgy +midgut +midguts +midheaven +midi +midianite +midianitish +midicoat +mididae +midyear +midyears +midified +mydine +midinette +midinettes +midiron +midirons +midis +midiskirt +midland +midlander +midlandize +midlands +midlandward +midlatitude +midleg +midlegs +midlenting +midline +midlines +midmain +midmandibular +midmonth +midmonthly +midmonths +midmorn +midmorning +midmost +midmosts +midn +midnight +midnightly +midnights +midnoon +midnoons +midocean +midparent +midparentage +midparental +midpit +midpoint +midpoints +midrange +midranges +midrash +midrashic +midrashim +midrashoth +mydriasine +mydriasis +mydriatic +mydriatine +midrib +midribbed +midribs +midriff +midriffs +mids +midscale +midseason +midsection +midsemester +midsentence +midship +midshipman +midshipmanship +midshipmen +midshipmite +midships +midspace +midspaces +midspan +midst +midstead +midstyled +midstory +midstories +midstout +midstream +midstreet +midstroke +midsts +midsummer +midsummery +midsummerish +midsummers +midtap +midtarsal +midterm +midterms +midtown +midtowns +midvein +midventral +midverse +midway +midways +midward +midwatch +midwatches +midweek +midweekly +midweeks +midwest +midwestern +midwesterner +midwesterners +midwestward +midwife +midwifed +midwifery +midwiferies +midwifes +midwifing +midwinter +midwinterly +midwinters +midwintry +midwise +midwived +midwives +midwiving +myectomy +myectomize +myectopy +myectopia +miek +myel +myelalgia +myelapoplexy +myelasthenia +myelatrophy +myelauxe +myelemia +myelencephala +myelencephalic +myelencephalon +myelencephalons +myelencephalous +myelic +myelin +myelinate +myelinated +myelination +myeline +myelines +myelinic +myelinization +myelinogenesis +myelinogenetic +myelinogeny +myelins +myelitic +myelitides +myelitis +myeloblast +myeloblastic +myelobrachium +myelocele +myelocerebellar +myelocyst +myelocystic +myelocystocele +myelocyte +myelocythaemia +myelocythemia +myelocytic +myelocytosis +myelocoele +myelodiastasis +myeloencephalitis +myelofibrosis +myelofibrotic +myeloganglitis +myelogenesis +myelogenetic +myelogenic +myelogenous +myelogonium +myelography +myelographic +myelographically +myeloic +myeloid +myelolymphangioma +myelolymphocyte +myeloma +myelomalacia +myelomas +myelomata +myelomatoid +myelomatosis +myelomatous +myelomenia +myelomeningitis +myelomeningocele +myelomere +myelon +myelonal +myeloneuritis +myelonic +myeloparalysis +myelopathy +myelopathic +myelopetal +myelophthisis +myeloplast +myeloplastic +myeloplax +myeloplaxes +myeloplegia +myelopoiesis +myelopoietic +myeloproliferative +myelorrhagia +myelorrhaphy +myelosarcoma +myelosclerosis +myelosyphilis +myelosyphilosis +myelosyringosis +myelospasm +myelospongium +myelotherapy +myelozoa +myelozoan +mien +miens +myentasis +myenteric +myenteron +miersite +miescherian +myesthesia +miff +miffed +miffy +miffier +miffiest +miffiness +miffing +miffs +mig +myg +migale +mygale +mygalid +mygaloid +migg +miggle +miggles +miggs +might +mighted +mightful +mightfully +mightfulness +mighty +mightier +mightiest +mightyhearted +mightily +mightiness +mightyship +mightless +mightly +mightnt +mights +miglio +migmatite +migniard +migniardise +migniardize +mignon +mignonette +mignonettes +mignonne +mignonness +mignons +migonitis +migraine +migraines +migrainoid +migrainous +migrans +migrant +migrants +migrate +migrated +migrates +migrating +migration +migrational +migrationist +migrations +migrative +migrator +migratory +migratorial +migrators +migs +miguel +miharaite +mihrab +myiarchus +myiases +myiasis +myiferous +myiodesopsia +myiosis +myitis +mijakite +mijl +mijnheer +mijnheerl +mijnheers +mikado +mikadoate +mikadoism +mikados +mikael +mikania +mikasuki +mike +miked +mikey +mikes +miki +mikie +miking +mikir +mykiss +mikra +mikrkra +mikron +mikrons +mikvah +mikvahs +mikveh +mikvehs +mikvoth +mil +mila +milacre +miladi +milady +miladies +miladis +milage +milages +milammeter +milan +milanaise +milanese +milanion +mylar +milarite +milch +milched +milcher +milchy +milchig +milchigs +mild +milden +mildened +mildening +mildens +milder +mildest +mildew +mildewed +mildewer +mildewy +mildewing +mildewproof +mildews +mildful +mildfulness +mildhearted +mildheartedness +mildish +mildly +mildness +mildnesses +mildred +mile +mileage +mileages +miledh +mileometer +milepost +mileposts +miler +milers +miles +milesian +milesima +milesimo +milesimos +milesius +milestone +milestones +mileway +milfoil +milfoils +milha +milia +miliaceous +miliarenses +miliarensis +miliary +miliaria +miliarial +miliarias +miliarium +milice +milicent +milieu +milieus +milieux +myliobatid +myliobatidae +myliobatine +myliobatoid +miliola +milioliform +milioline +miliolite +miliolitic +milit +militancy +militant +militantly +militantness +militants +militar +military +militaries +militaryism +militarily +militaryment +militariness +militarisation +militarise +militarised +militarising +militarism +militarist +militaristic +militaristical +militaristically +militarists +militarization +militarize +militarized +militarizes +militarizing +militaster +militate +militated +militates +militating +militation +militia +militiaman +militiamen +militias +militiate +milium +miljee +milk +milkbush +milked +milken +milker +milkeress +milkers +milkfish +milkfishes +milkgrass +milkhouse +milky +milkier +milkiest +milkily +milkiness +milking +milkless +milklike +milkmaid +milkmaids +milkman +milkmen +milkness +milko +milks +milkshake +milkshed +milkshop +milksick +milksop +milksopism +milksoppery +milksoppy +milksoppiness +milksopping +milksoppish +milksoppishness +milksops +milkstone +milktoast +milkwagon +milkweed +milkweeds +milkwood +milkwoods +milkwort +milkworts +mill +milla +millable +millage +millages +millanare +millard +millboard +millcake +millclapper +millcourse +milldam +milldams +milldoll +mille +milled +millefeuille +millefiore +millefiori +millefleur +millefleurs +milleflorous +millefoliate +millenary +millenarian +millenarianism +millenaries +millenarist +millenia +millenist +millenium +millennia +millennial +millennialism +millennialist +millennialistic +millennially +millennian +millenniary +millenniarism +millennium +millenniums +milleped +millepede +millepeds +millepora +millepore +milleporiform +milleporine +milleporite +milleporous +millepunctate +miller +milleress +milleri +millering +millerism +millerite +millerole +millers +milles +millesimal +millesimally +millet +millets +millettia +millfeed +millful +millhouse +milly +milliad +milliammeter +milliamp +milliampere +milliamperemeter +milliamperes +milliangstrom +milliard +milliardaire +milliards +milliare +milliares +milliary +milliarium +millibar +millibarn +millibars +millicron +millicurie +millidegree +millie +millieme +milliemes +milliequivalent +millier +milliers +millifarad +millifold +milliform +milligal +milligals +milligrade +milligram +milligramage +milligramme +milligrams +millihenry +millihenries +millihenrys +millijoule +millilambert +millile +milliliter +milliliters +millilitre +milliluces +millilux +milliluxes +millime +millimes +millimeter +millimeters +millimetmhos +millimetre +millimetres +millimetric +millimho +millimhos +millimiccra +millimicra +millimicron +millimicrons +millimol +millimolar +millimole +millincost +milline +milliner +millinery +millinerial +millinering +milliners +millines +milling +millings +millingtonia +millinormal +millinormality +millioctave +millioersted +milliohm +milliohms +million +millionaire +millionairedom +millionaires +millionairess +millionairish +millionairism +millionary +millioned +millioner +millionfold +millionism +millionist +millionize +millionnaire +millionocracy +millions +millionth +millionths +milliped +millipede +millipedes +millipeds +milliphot +millipoise +milliradian +millirem +millirems +milliroentgen +millisec +millisecond +milliseconds +millisiemens +millistere +millite +millithrum +millivolt +millivoltmeter +millivolts +milliwatt +milliweber +millken +millman +millmen +millnia +millocracy +millocrat +millocratism +millosevichite +millowner +millpond +millponds +millpool +millpost +millrace +millraces +millrind +millrynd +millrun +millruns +mills +millsite +millstock +millstone +millstones +millstream +millstreams +milltail +millward +millwheel +millwork +millworker +millworks +millwright +millwrighting +millwrights +milner +milo +mylodei +mylodon +mylodont +mylodontidae +mylohyoid +mylohyoidean +mylohyoidei +mylohyoideus +milometer +mylonite +mylonites +mylonitic +milor +milord +milords +milos +milpa +milpas +milquetoast +milquetoasts +milreis +milrind +mils +milsey +milsie +milt +milted +milter +milters +milty +miltier +miltiest +milting +miltlike +milton +miltonia +miltonian +miltonic +miltonically +miltonism +miltonist +miltonize +miltos +milts +miltsick +miltwaste +milvago +milvinae +milvine +milvinous +milvus +milwaukee +milwell +milzbrand +mim +mym +mima +mimamsa +mymar +mymarid +mymaridae +mimbar +mimbars +mimble +mimbreno +mime +mimed +mimeo +mimeoed +mimeograph +mimeographed +mimeography +mimeographic +mimeographically +mimeographing +mimeographist +mimeographs +mimeoing +mimeos +mimer +mimers +mimes +mimesis +mimesises +mimester +mimetene +mimetesite +mimetic +mimetical +mimetically +mimetism +mimetite +mimetites +mimi +mimiambi +mimiambic +mimiambics +mimic +mimical +mimically +mimicism +mimicked +mimicker +mimickers +mimicking +mimicry +mimicries +mimics +mimidae +miminae +mimine +miming +miminypiminy +mimir +mimish +mimly +mimmation +mimmed +mimmest +mimming +mimmock +mimmocky +mimmocking +mimmood +mimmoud +mimmouthed +mimmouthedness +mimodrama +mimographer +mimography +mimologist +mimosa +mimosaceae +mimosaceous +mimosas +mimosis +mimosite +mimotannic +mimotype +mimotypic +mimp +mimpei +mimsey +mimsy +mimulus +mimus +mimusops +mimzy +min +mina +myna +minable +minacious +minaciously +minaciousness +minacity +minacities +minae +minaean +minah +mynah +minahassa +minahassan +minahassian +mynahs +minar +minaret +minareted +minarets +minargent +minas +mynas +minasragrite +minatnrial +minatory +minatorial +minatorially +minatories +minatorily +minauderie +minaway +minbar +minbu +mince +minced +mincemeat +mincer +mincers +minces +minchah +minchen +minchery +minchiate +mincy +mincier +minciers +minciest +mincing +mincingly +mincingness +mincio +mincopi +mincopie +mind +mindblower +minded +mindedly +mindedness +mindel +mindelian +minder +mindererus +minders +mindful +mindfully +mindfulness +minding +mindless +mindlessly +mindlessness +mindly +minds +mindsickness +mindsight +mine +mineable +mined +minefield +minelayer +minelayers +mineowner +miner +mineragraphy +mineragraphic +mineraiogic +mineral +mineralise +mineralised +mineralising +mineralist +mineralizable +mineralization +mineralize +mineralized +mineralizer +mineralizes +mineralizing +mineralocorticoid +mineralogy +mineralogic +mineralogical +mineralogically +mineralogies +mineralogist +mineralogists +mineralogize +mineraloid +minerals +minery +minerology +minerologist +miners +minerva +minerval +minervan +minervic +mines +minestra +minestrone +minesweeper +minesweepers +minesweeping +minette +minever +mineworker +ming +minge +mingelen +mingy +mingie +mingier +mingiest +minginess +mingle +mingleable +mingled +mingledly +minglement +mingler +minglers +mingles +mingling +minglingly +mingo +mingrelian +minguetite +mingwort +minhag +minhagic +minhagim +minhah +mynheer +mynheers +mini +miny +miniaceous +minyadidae +minyae +minyan +minyanim +minyans +miniard +minyas +miniate +miniated +miniating +miniator +miniatous +miniature +miniatured +miniatureness +miniatures +miniaturing +miniaturist +miniaturistic +miniaturists +miniaturization +miniaturizations +miniaturize +miniaturized +miniaturizes +miniaturizing +minibike +minibikes +minibus +minibuses +minibusses +minicab +minicabs +minicam +minicamera +minicar +minicars +minicomputer +minicomputers +miniconjou +minidisk +minidisks +minidress +minie +minienize +minify +minification +minified +minifies +minifying +minifloppy +minifloppies +miniken +minikin +minikinly +minikins +minilanguage +minim +minima +minimacid +minimal +minimalism +minimalist +minimalists +minimalkaline +minimally +minimals +minimax +minimaxes +miniment +minimetric +minimi +minimifidian +minimifidianism +minimis +minimisation +minimise +minimised +minimiser +minimises +minimising +minimism +minimistic +minimite +minimitude +minimization +minimizations +minimize +minimized +minimizer +minimizers +minimizes +minimizing +minims +minimum +minimums +minimus +minimuscular +mining +minings +minion +minionette +minionism +minionly +minions +minionship +minious +minipill +minis +miniscule +miniseries +minish +minished +minisher +minishes +minishing +minishment +miniskirt +miniskirted +miniskirts +ministate +ministates +minister +ministered +ministeriable +ministerial +ministerialism +ministerialist +ministeriality +ministerially +ministerialness +ministering +ministerium +ministers +ministership +ministrable +ministral +ministrant +ministrants +ministrate +ministration +ministrations +ministrative +ministrator +ministrer +ministress +ministry +ministries +ministryship +minisub +minitant +minitari +minitrack +minium +miniums +miniver +minivers +minivet +mink +minkery +minkfish +minkfishes +minkish +minkopi +minks +minneapolis +minnehaha +minnesinger +minnesingers +minnesong +minnesota +minnesotan +minnesotans +minnetaree +minny +minnie +minniebush +minnies +minning +minnow +minnows +mino +minoan +minoize +minometer +minor +minora +minorage +minorate +minoration +minorca +minorcan +minorcas +minored +minoress +minoring +minorist +minorite +minority +minorities +minors +minorship +minos +minot +minotaur +minow +mynpacht +mynpachtbrief +mins +minseito +minsitive +minster +minsteryard +minsters +minstrel +minstreless +minstrels +minstrelship +minstrelsy +mint +mintage +mintages +mintaka +mintbush +minted +minter +minters +minty +mintier +mintiest +minting +mintmaker +mintmaking +mintman +mintmark +mintmaster +mints +mintweed +minuend +minuends +minuet +minuetic +minuetish +minuets +minum +minunet +minus +minuscular +minuscule +minuscules +minuses +minutary +minutation +minute +minuted +minutely +minuteman +minutemen +minuteness +minuter +minutes +minutest +minuthesis +minutia +minutiae +minutial +minuting +minutiose +minutious +minutiously +minutissimic +minvend +minverite +minx +minxes +minxish +minxishly +minxishness +minxship +myoalbumin +myoalbumose +myoatrophy +myoblast +myoblastic +myoblasts +miocardia +myocardia +myocardiac +myocardial +myocardiogram +myocardiograph +myocarditic +myocarditis +myocardium +myocdia +myocele +myocellulitis +miocene +miocenic +myocyte +myoclonic +myoclonus +myocoel +myocoele +myocoelom +myocolpitis +myocomma +myocommata +myodegeneration +myodes +myodiastasis +myodynamia +myodynamic +myodynamics +myodynamiometer +myodynamometer +myoedema +myoelectric +myoendocarditis +myoenotomy +myoepicardial +myoepithelial +myofibril +myofibrilla +myofibrillar +myofibroma +myofilament +myogen +myogenesis +myogenetic +myogenic +myogenicity +myogenous +myoglobin +myoglobinuria +myoglobulin +myogram +myograph +myographer +myography +myographic +myographical +myographically +myographist +myographs +myohaematin +myohematin +myohemoglobin +myohemoglobinuria +miohippus +myoid +myoidema +myoinositol +myokymia +myokinesis +myolemma +myolipoma +myoliposis +myoliposmias +myolysis +miolithic +myology +myologic +myological +myologies +myologisral +myologist +myoma +myomalacia +myomancy +myomantic +myomas +myomata +myomatous +miombo +myomectomy +myomectomies +myomelanosis +myomere +myometritis +myometrium +myomohysterectomy +myomorph +myomorpha +myomorphic +myomotomy +myonema +myoneme +myoneural +myoneuralgia +myoneurasthenia +myoneure +myoneuroma +myoneurosis +myonosus +myopachynsis +myoparalysis +myoparesis +myopathy +myopathia +myopathic +myopathies +myope +myoperitonitis +myopes +myophan +myophysical +myophysics +myophore +myophorous +myopy +myopia +myopias +myopic +myopical +myopically +myopies +myoplasm +mioplasmia +myoplasty +myoplastic +myopolar +myoporaceae +myoporaceous +myoporad +myoporum +myoproteid +myoprotein +myoproteose +myops +myorrhaphy +myorrhexis +myosalpingitis +myosarcoma +myosarcomatous +myosclerosis +myoscope +myoscopes +myoseptum +mioses +myoses +myosin +myosynizesis +myosinogen +myosinose +myosins +miosis +myosis +myositic +myositis +myosote +myosotes +myosotis +myosotises +myospasm +myospasmia +myosurus +myosuture +myotacismus +myotalpa +myotalpinae +myotasis +myotenotomy +miothermic +myothermic +miotic +myotic +miotics +myotics +myotome +myotomes +myotomy +myotomic +myotomies +myotony +myotonia +myotonias +myotonic +myotonus +myotrophy +myowun +myoxidae +myoxine +myoxus +mips +miqra +miquelet +miquelets +mir +mira +myra +myrabalanus +mirabel +mirabell +mirabelle +mirabile +mirabilia +mirabiliary +mirabilis +mirabilite +mirable +myrabolam +mirac +mirach +miracicidia +miracidia +miracidial +miracidium +miracle +miracled +miraclemonger +miraclemongering +miracles +miracling +miraclist +miracular +miraculist +miraculize +miraculosity +miraculous +miraculously +miraculousness +mirador +miradors +mirage +mirages +miragy +mirak +miramolin +mirana +miranda +mirandous +miranha +miranhan +mirate +mirbane +myrcene +myrcia +mircrobicidal +mird +mirdaha +mirdha +mire +mired +mirepois +mirepoix +mires +miresnipe +mirex +mirexes +mirfak +miri +miry +myriacanthous +miryachit +myriacoulomb +myriad +myriaded +myriadfold +myriadly +myriads +myriadth +myriagram +myriagramme +myrialiter +myrialitre +miriam +myriameter +myriametre +miriamne +myrianida +myriapod +myriapoda +myriapodan +myriapodous +myriapods +myriarch +myriarchy +myriare +myrica +myricaceae +myricaceous +myricales +myricas +myricetin +myricyl +myricylic +myricin +myrick +mirid +miridae +myrientomata +mirier +miriest +mirific +mirifical +miriki +miriness +mirinesses +miring +myringa +myringectomy +myringitis +myringodectomy +myringodermatitis +myringomycosis +myringoplasty +myringotome +myringotomy +myriological +myriologist +myriologue +myriophyllite +myriophyllous +myriophyllum +myriopod +myriopoda +myriopodous +myriopods +myriorama +myrioscope +myriosporous +myriotheism +myriotheist +myriotrichia +myriotrichiaceae +myriotrichiaceous +mirish +myristate +myristic +myristica +myristicaceae +myristicaceous +myristicivora +myristicivorous +myristin +myristone +mirk +mirker +mirkest +mirky +mirkier +mirkiest +mirkily +mirkiness +mirkish +mirkly +mirkness +mirks +mirksome +mirled +mirly +mirligo +mirliton +mirlitons +myrmecia +myrmecobiinae +myrmecobiine +myrmecobine +myrmecobius +myrmecochory +myrmecochorous +myrmecoid +myrmecoidy +myrmecology +myrmecological +myrmecologist +myrmecophaga +myrmecophagidae +myrmecophagine +myrmecophagoid +myrmecophagous +myrmecophile +myrmecophily +myrmecophilism +myrmecophilous +myrmecophyte +myrmecophytic +myrmecophobic +myrmekite +myrmeleon +myrmeleonidae +myrmeleontidae +myrmica +myrmicid +myrmicidae +myrmicine +myrmicoid +myrmidon +myrmidonian +myrmidons +myrmotherine +miro +myrobalan +myron +myronate +myronic +myropolist +myrosin +myrosinase +myrothamnaceae +myrothamnaceous +myrothamnus +mirounga +myroxylon +myrrh +myrrhed +myrrhy +myrrhic +myrrhine +myrrhis +myrrhol +myrrhophore +myrrhs +mirror +mirrored +mirrory +mirroring +mirrorize +mirrorlike +mirrors +mirrorscope +mirs +myrsinaceae +myrsinaceous +myrsinad +myrsiphyllum +myrt +myrtaceae +myrtaceous +myrtal +myrtales +mirth +mirthful +mirthfully +mirthfulness +mirthless +mirthlessly +mirthlessness +mirths +mirthsome +mirthsomeness +myrtiform +myrtilus +myrtle +myrtleberry +myrtlelike +myrtles +myrtol +myrtus +mirv +mirvs +mirza +mirzas +mis +misaccent +misaccentuation +misaccept +misacception +misaccount +misaccused +misachievement +misacknowledge +misact +misacted +misacting +misacts +misadapt +misadaptation +misadapted +misadapting +misadapts +misadd +misadded +misadding +misaddress +misaddressed +misaddresses +misaddressing +misaddrest +misadds +misadjudicated +misadjust +misadjusted +misadjusting +misadjustment +misadjusts +misadmeasurement +misadminister +misadministration +misadressed +misadressing +misadrest +misadvantage +misadventure +misadventurer +misadventures +misadventurous +misadventurously +misadvertence +misadvice +misadvise +misadvised +misadvisedly +misadvisedness +misadvises +misadvising +misaffect +misaffected +misaffection +misaffirm +misagent +misagents +misaim +misaimed +misaiming +misaims +misalienate +misaligned +misalignment +misalignments +misallegation +misallege +misalleged +misalleging +misally +misalliance +misalliances +misallied +misallies +misallying +misallocation +misallot +misallotment +misallotted +misallotting +misallowance +misalphabetize +misalphabetized +misalphabetizes +misalphabetizing +misalter +misaltered +misaltering +misalters +misanalysis +misanalyze +misanalyzed +misanalyzely +misanalyzing +misandry +misanswer +misanthrope +misanthropes +misanthropi +misanthropy +misanthropia +misanthropic +misanthropical +misanthropically +misanthropies +misanthropism +misanthropist +misanthropists +misanthropize +misanthropos +misapparel +misappear +misappearance +misappellation +misappended +misapply +misapplicability +misapplication +misapplied +misapplier +misapplies +misapplying +misappoint +misappointment +misappraise +misappraised +misappraisement +misappraising +misappreciate +misappreciation +misappreciative +misapprehend +misapprehended +misapprehending +misapprehendingly +misapprehends +misapprehensible +misapprehension +misapprehensions +misapprehensive +misapprehensively +misapprehensiveness +misappropriate +misappropriated +misappropriately +misappropriates +misappropriating +misappropriation +misappropriations +misarchism +misarchist +misarray +misarrange +misarranged +misarrangement +misarrangements +misarranges +misarranging +misarticulate +misarticulated +misarticulating +misarticulation +misascribe +misascription +misasperse +misassay +misassayed +misassaying +misassays +misassent +misassert +misassertion +misassign +misassignment +misassociate +misassociation +misate +misatone +misatoned +misatones +misatoning +misattend +misattribute +misattribution +misaunter +misauthorization +misauthorize +misauthorized +misauthorizing +misaventeur +misaver +misaverred +misaverring +misavers +misaward +misawarded +misawarding +misawards +misbandage +misbaptize +misbear +misbecame +misbecome +misbecoming +misbecomingly +misbecomingness +misbede +misbefall +misbefallen +misbefitting +misbegan +misbeget +misbegetting +misbegin +misbeginning +misbegins +misbegot +misbegotten +misbegun +misbehave +misbehaved +misbehaver +misbehavers +misbehaves +misbehaving +misbehavior +misbehaviour +misbeholden +misbelief +misbeliefs +misbelieve +misbelieved +misbeliever +misbelieving +misbelievingly +misbelove +misbeseem +misbestow +misbestowal +misbestowed +misbestowing +misbestows +misbetide +misbias +misbiased +misbiases +misbiasing +misbiassed +misbiasses +misbiassing +misbill +misbilled +misbilling +misbills +misbind +misbinding +misbinds +misbirth +misbode +misboden +misborn +misbound +misbrand +misbranded +misbranding +misbrands +misbrew +misbuild +misbuilding +misbuilds +misbuilt +misbusy +misbuttoned +misc +miscal +miscalculate +miscalculated +miscalculates +miscalculating +miscalculation +miscalculations +miscalculator +miscall +miscalled +miscaller +miscalling +miscalls +miscanonize +miscarry +miscarriage +miscarriageable +miscarriages +miscarried +miscarries +miscarrying +miscast +miscasted +miscasting +miscasts +miscasualty +miscategorize +miscategorized +miscategorizing +misce +misceability +miscegenate +miscegenation +miscegenational +miscegenationist +miscegenations +miscegenator +miscegenetic +miscegenist +miscegine +miscellanarian +miscellane +miscellanea +miscellaneal +miscellaneity +miscellaneous +miscellaneously +miscellaneousness +miscellany +miscellanies +miscellanist +miscensure +miscensured +miscensuring +mischallenge +mischance +mischanceful +mischances +mischancy +mischanter +mischaracterization +mischaracterize +mischaracterized +mischaracterizing +mischarge +mischarged +mischarges +mischarging +mischief +mischiefful +mischiefs +mischieve +mischievous +mischievously +mischievousness +mischio +mischoice +mischoose +mischoosing +mischose +mischosen +mischristen +miscibility +miscibilities +miscible +miscipher +miscitation +miscite +miscited +miscites +misciting +misclaim +misclaimed +misclaiming +misclaims +misclass +misclassed +misclasses +misclassify +misclassification +misclassifications +misclassified +misclassifies +misclassifying +misclassing +miscognizable +miscognizant +miscoin +miscoinage +miscoined +miscoining +miscoins +miscollocation +miscolor +miscoloration +miscolored +miscoloring +miscolors +miscolour +miscomfort +miscommand +miscommit +miscommunicate +miscommunication +miscommunications +miscompare +miscomplacence +miscomplain +miscomplaint +miscompose +miscomprehend +miscomprehension +miscomputation +miscompute +miscomputed +miscomputing +misconceit +misconceive +misconceived +misconceiver +misconceives +misconceiving +misconception +misconceptions +misconclusion +miscondition +misconduct +misconducted +misconducting +misconfer +misconfidence +misconfident +misconfiguration +misconjecture +misconjectured +misconjecturing +misconjugate +misconjugated +misconjugating +misconjugation +misconjunction +misconnection +misconsecrate +misconsecrated +misconsequence +misconstitutional +misconstruable +misconstrual +misconstruct +misconstruction +misconstructions +misconstructive +misconstrue +misconstrued +misconstruer +misconstrues +misconstruing +miscontent +miscontinuance +misconvey +misconvenient +miscook +miscooked +miscookery +miscooking +miscooks +miscopy +miscopied +miscopies +miscopying +miscorrect +miscorrected +miscorrecting +miscorrection +miscounsel +miscounseled +miscounseling +miscounselled +miscounselling +miscount +miscounted +miscounting +miscounts +miscovet +miscreance +miscreancy +miscreant +miscreants +miscreate +miscreated +miscreating +miscreation +miscreative +miscreator +miscredit +miscredited +miscredulity +miscreed +miscript +miscrop +miscue +miscued +miscues +miscuing +miscultivated +misculture +miscurvature +miscut +miscuts +miscutting +misdate +misdated +misdateful +misdates +misdating +misdaub +misdeal +misdealer +misdealing +misdeals +misdealt +misdecide +misdecision +misdeclaration +misdeclare +misdeed +misdeeds +misdeem +misdeemed +misdeemful +misdeeming +misdeems +misdefine +misdefined +misdefines +misdefining +misdeformed +misdeliver +misdelivery +misdeliveries +misdemean +misdemeanant +misdemeaned +misdemeaning +misdemeanist +misdemeanor +misdemeanors +misdemeanour +misdentition +misdepart +misderivation +misderive +misderived +misderiving +misdescribe +misdescribed +misdescriber +misdescribing +misdescription +misdescriptive +misdesert +misdeserve +misdesignate +misdesire +misdetermine +misdevise +misdevoted +misdevotion +misdiagnose +misdiagnosed +misdiagnoses +misdiagnosing +misdiagnosis +misdiagrammed +misdictated +misdid +misdidived +misdiet +misdight +misdirect +misdirected +misdirecting +misdirection +misdirections +misdirects +misdispose +misdisposition +misdistinguish +misdistribute +misdistribution +misdived +misdivide +misdividing +misdivision +misdo +misdoer +misdoers +misdoes +misdoing +misdoings +misdone +misdoubt +misdoubted +misdoubtful +misdoubting +misdoubts +misdower +misdraw +misdrawing +misdrawn +misdraws +misdread +misdrew +misdrive +misdriven +misdrives +misdriving +misdrove +mise +misease +miseased +miseases +miseat +miseating +miseats +misecclesiastic +misedit +misedited +misediting +misedits +miseducate +miseducated +miseducates +miseducating +miseducation +miseducative +miseffect +mysel +myself +mysell +misemphasis +misemphasize +misemphasized +misemphasizing +misemploy +misemployed +misemploying +misemployment +misemploys +misencourage +misendeavor +misenforce +misengrave +misenite +misenjoy +misenrol +misenroll +misenrolled +misenrolling +misenrolls +misenrols +misenter +misentered +misentering +misenters +misentitle +misentreat +misentry +misentries +misenunciation +misenus +miser +miserabilia +miserabilism +miserabilist +miserabilistic +miserability +miserable +miserableness +miserably +miseration +miserdom +misere +miserected +miserere +misereres +miserhood +misery +misericord +misericorde +misericordia +miseries +miserism +miserly +miserliness +misers +mises +misesteem +misesteemed +misesteeming +misestimate +misestimated +misestimating +misestimation +misevaluate +misevaluation +misevent +misevents +misexample +misexecute +misexecution +misexpectation +misexpend +misexpenditure +misexplain +misexplained +misexplanation +misexplicate +misexplication +misexposition +misexpound +misexpress +misexpression +misexpressive +misfaith +misfaiths +misfall +misfare +misfashion +misfashioned +misfate +misfather +misfault +misfeasance +misfeasances +misfeasor +misfeasors +misfeature +misfeatured +misfeign +misfield +misfielded +misfielding +misfields +misfigure +misfile +misfiled +misfiles +misfiling +misfire +misfired +misfires +misfiring +misfit +misfits +misfitted +misfitting +misfocus +misfocused +misfocusing +misfocussed +misfocussing +misfond +misforgive +misform +misformation +misformed +misforming +misforms +misfortunate +misfortunately +misfortune +misfortuned +misfortuner +misfortunes +misframe +misframed +misframes +misframing +misgauge +misgauged +misgauges +misgauging +misgave +misgesture +misgye +misgive +misgiven +misgives +misgiving +misgivingly +misgivinglying +misgivings +misgo +misgotten +misgovern +misgovernance +misgoverned +misgoverning +misgovernment +misgovernor +misgoverns +misgracious +misgrade +misgraded +misgrading +misgraff +misgraffed +misgraft +misgrafted +misgrafting +misgrafts +misgrave +misgrew +misground +misgrounded +misgrow +misgrowing +misgrown +misgrows +misgrowth +misguage +misguaged +misguess +misguessed +misguesses +misguessing +misguggle +misguidance +misguide +misguided +misguidedly +misguidedness +misguider +misguiders +misguides +misguiding +misguidingly +misguise +mishandle +mishandled +mishandles +mishandling +mishanter +mishap +mishappen +mishaps +mishara +mishave +mishear +misheard +mishearing +mishears +mishikhwutmetunne +miships +mishit +mishits +mishitting +mishmash +mishmashes +mishmee +mishmi +mishmosh +mishmoshes +mishnah +mishnaic +mishnic +mishnical +mishongnovi +misy +mysian +mysid +mysidacea +mysidae +mysidean +misidentify +misidentification +misidentifications +misidentified +misidentifies +misidentifying +misima +misimagination +misimagine +misimpression +misimprove +misimproved +misimprovement +misimproving +misimputation +misimpute +misincensed +misincite +misinclination +misincline +misinfer +misinference +misinferred +misinferring +misinfers +misinflame +misinform +misinformant +misinformants +misinformation +misinformative +misinformed +misinformer +misinforming +misinforms +misingenuity +misinspired +misinstruct +misinstructed +misinstructing +misinstruction +misinstructions +misinstructive +misinstructs +misintelligence +misintelligible +misintend +misintention +misinter +misinterment +misinterpret +misinterpretable +misinterpretation +misinterpretations +misinterpreted +misinterpreter +misinterpreting +misinterprets +misinterred +misinterring +misinters +misintimation +misyoke +misyoked +misyokes +misyoking +misiones +mysis +misitemized +misjoin +misjoinder +misjoined +misjoining +misjoins +misjudge +misjudged +misjudgement +misjudger +misjudges +misjudging +misjudgingly +misjudgment +misjudgments +miskal +miskals +miskeep +miskeeping +miskeeps +misken +miskenning +miskept +misky +miskill +miskin +miskindle +misknew +misknow +misknowing +misknowledge +misknown +misknows +mislabel +mislabeled +mislabeling +mislabelled +mislabelling +mislabels +mislabor +mislabored +mislaboring +mislabors +mislay +mislaid +mislayer +mislayers +mislaying +mislain +mislays +mislanguage +mislead +misleadable +misleader +misleading +misleadingly +misleadingness +misleads +mislear +misleared +mislearn +mislearned +mislearning +mislearns +mislearnt +misled +misleered +mislen +mislest +misly +mislie +mislies +mislight +mislighted +mislighting +mislights +mislying +mislikable +mislike +misliked +misliken +mislikeness +misliker +mislikers +mislikes +misliking +mislikingly +mislin +mislippen +mislit +mislive +mislived +mislives +misliving +mislled +mislocate +mislocated +mislocating +mislocation +mislodge +mislodged +mislodges +mislodging +misluck +mismade +mismake +mismaking +mismanage +mismanageable +mismanaged +mismanagement +mismanager +mismanages +mismanaging +mismannered +mismanners +mismark +mismarked +mismarking +mismarks +mismarry +mismarriage +mismarriages +mismatch +mismatched +mismatches +mismatching +mismatchment +mismate +mismated +mismates +mismating +mismaze +mismean +mismeasure +mismeasured +mismeasurement +mismeasuring +mismeet +mismeeting +mismeets +mismenstruation +mismet +mismetre +misminded +mismingle +mismosh +mismoshes +mismotion +mismount +mismove +mismoved +mismoves +mismoving +misname +misnamed +misnames +misnaming +misnarrate +misnarrated +misnarrating +misnatured +misnavigate +misnavigated +misnavigating +misnavigation +misniac +misnomed +misnomer +misnomered +misnomers +misnumber +misnumbered +misnumbering +misnumbers +misnurture +misnutrition +miso +misobedience +misobey +misobservance +misobserve +misocainea +misocapnic +misocapnist +misocatholic +misoccupy +misoccupied +misoccupying +misogallic +misogamy +misogamic +misogamies +misogamist +misogamists +misogyne +misogyny +misogynic +misogynical +misogynies +misogynism +mysogynism +misogynist +misogynistic +misogynistical +misogynists +misogynous +misohellene +mysoid +misology +misologies +misologist +misomath +misoneism +misoneist +misoneistic +misopaedia +misopaedism +misopaedist +misopaterist +misopedia +misopedism +misopedist +mysophilia +mysophobia +misopinion +misopolemical +misorder +misordination +mysore +misorganization +misorganize +misorganized +misorganizing +misorient +misorientation +misos +misoscopist +misosopher +misosophy +misosophist +mysosophist +mysost +mysosts +misotheism +misotheist +misotheistic +misotyranny +misotramontanism +misoxene +misoxeny +mispackaged +mispacked +mispage +mispaged +mispages +mispagination +mispaging +mispay +mispaid +mispaying +mispaint +mispainted +mispainting +mispaints +misparse +misparsed +misparses +misparsing +mispart +misparted +misparting +misparts +mispassion +mispatch +mispatched +mispatches +mispatching +mispen +mispenned +mispenning +mispens +misperceive +misperceived +misperceiving +misperception +misperform +misperformance +mispersuade +misperuse +misphrase +misphrased +misphrasing +mispick +mispickel +misplace +misplaced +misplacement +misplaces +misplacing +misplay +misplayed +misplaying +misplays +misplant +misplanted +misplanting +misplants +misplead +mispleaded +mispleading +mispleads +misplease +mispled +mispoint +mispointed +mispointing +mispoints +mispoise +mispoised +mispoises +mispoising +mispolicy +misposition +mispossessed +mispractice +mispracticed +mispracticing +mispractise +mispractised +mispractising +mispraise +misprejudiced +mispresent +misprincipled +misprint +misprinted +misprinting +misprints +misprisal +misprise +misprised +mispriser +misprising +misprision +misprisions +misprizal +misprize +misprized +misprizer +misprizes +misprizing +misproceeding +misproduce +misproduced +misproducing +misprofess +misprofessor +mispronounce +mispronounced +mispronouncement +mispronouncer +mispronounces +mispronouncing +mispronunciation +mispronunciations +misproportion +misproportioned +misproportions +misproposal +mispropose +misproposed +misproposing +misproud +misprovide +misprovidence +misprovoke +misprovoked +misprovoking +mispublicized +mispublished +mispunch +mispunctuate +mispunctuated +mispunctuating +mispunctuation +mispurchase +mispurchased +mispurchasing +mispursuit +misput +misputting +misqualify +misqualified +misqualifying +misquality +misquotation +misquotations +misquote +misquoted +misquoter +misquotes +misquoting +misraise +misraised +misraises +misraising +misrate +misrated +misrates +misrating +misread +misreaded +misreader +misreading +misreads +misrealize +misreason +misreceive +misrecital +misrecite +misreckon +misreckoned +misreckoning +misrecognition +misrecognize +misrecollect +misrecollected +misrefer +misreference +misreferred +misreferring +misrefers +misreflect +misreform +misregulate +misregulated +misregulating +misrehearsal +misrehearse +misrehearsed +misrehearsing +misrelate +misrelated +misrelating +misrelation +misrely +misreliance +misrelied +misrelies +misreligion +misrelying +misremember +misremembered +misremembrance +misrender +misrendering +misrepeat +misreport +misreported +misreporter +misreporting +misreports +misreposed +misrepresent +misrepresentation +misrepresentations +misrepresentative +misrepresented +misrepresentee +misrepresenter +misrepresenting +misrepresents +misreprint +misrepute +misresemblance +misresolved +misresult +misreward +misrhyme +misrhymed +misrhymer +misrule +misruled +misruler +misrules +misruly +misruling +misrun +miss +missa +missable +missay +missaid +missayer +missaying +missays +missal +missals +missample +missampled +missampling +missang +missary +missatical +misscribed +misscribing +misscript +misseat +misseated +misseating +misseats +missed +misseem +missel +misseldin +missels +missemblance +missend +missending +missends +missense +missenses +missent +missentence +misserve +misservice +misses +misset +missetting +misshape +misshaped +misshapen +misshapenly +misshapenness +misshapes +misshaping +misship +misshipment +misshipped +misshipping +misshod +misshood +missy +missible +missies +missificate +missyish +missile +missileer +missileman +missilemen +missileproof +missilery +missiles +missyllabication +missyllabify +missyllabification +missyllabified +missyllabifying +missilry +missilries +missiness +missing +missingly +missiology +mission +missional +missionary +missionaries +missionaryship +missionarize +missioned +missioner +missioning +missionization +missionize +missionizer +missions +missis +missisauga +missises +missish +missishness +mississippi +mississippian +mississippians +missit +missive +missives +missmark +missment +missort +missorted +missorting +missorts +missound +missounded +missounding +missounds +missouri +missourian +missourianism +missourians +missourite +missout +missouts +misspace +misspaced +misspaces +misspacing +misspeak +misspeaking +misspeaks +misspeech +misspeed +misspell +misspelled +misspelling +misspellings +misspells +misspelt +misspend +misspender +misspending +misspends +misspent +misspoke +misspoken +misstay +misstart +misstarted +misstarting +misstarts +misstate +misstated +misstatement +misstatements +misstater +misstates +misstating +missteer +missteered +missteering +missteers +misstep +misstepping +missteps +misstyle +misstyled +misstyles +misstyling +misstop +misstopped +misstopping +misstops +missuade +missuggestion +missuit +missuited +missuiting +missuits +missummation +missung +missuppose +missupposed +missupposing +missus +missuses +mist +myst +mystacal +mystacial +mystacine +mystacinous +mystacocete +mystacoceti +mystagog +mystagogy +mystagogic +mystagogical +mystagogically +mystagogs +mystagogue +mistakable +mistakableness +mistakably +mistake +mistakeful +mistaken +mistakenly +mistakenness +mistakeproof +mistaker +mistakers +mistakes +mistaking +mistakingly +mistakion +mistal +mistassini +mistaste +mistaught +mystax +mistbow +mistbows +mistcoat +misteach +misteacher +misteaches +misteaching +misted +mistell +mistelling +mistemper +mistempered +mistend +mistended +mistendency +mistending +mistends +mister +mistered +mistery +mystery +mysterial +mysteriarch +mysteries +mistering +mysteriosophy +mysteriosophic +mysterious +mysteriously +mysteriousness +mysterize +misterm +mistermed +misterming +misterms +misters +mystes +mistetch +misteuk +mistfall +mistflower +mistful +misthink +misthinking +misthinks +misthought +misthread +misthrew +misthrift +misthrive +misthrow +misthrowing +misthrown +misthrows +misty +mistic +mystic +mystical +mysticality +mystically +mysticalness +mysticete +mysticeti +mysticetous +mysticise +mysticism +mysticisms +mysticity +mysticize +mysticized +mysticizing +mysticly +mistico +mystics +mistide +mistier +mistiest +mistify +mystify +mystific +mystifically +mystification +mystifications +mystificator +mystificatory +mystified +mystifiedly +mystifier +mystifiers +mystifies +mystifying +mystifyingly +mistigri +mistigris +mistyish +mistily +mistilled +mistime +mistimed +mistimes +mistiming +mistiness +misting +mistion +mistype +mistyped +mistypes +mistyping +mistypings +mystique +mystiques +mistitle +mistitled +mistitles +mistitling +mistle +mistless +mistletoe +mistletoes +mistold +mistone +mistonusk +mistook +mistouch +mistouched +mistouches +mistouching +mistrace +mistraced +mistraces +mistracing +mistradition +mistrain +mistral +mistrals +mistranscribe +mistranscribed +mistranscribing +mistranscript +mistranscription +mistranslate +mistranslated +mistranslates +mistranslating +mistranslation +mistreading +mistreat +mistreated +mistreating +mistreatment +mistreats +mistress +mistressdom +mistresses +mistresshood +mistressless +mistressly +mistry +mistrial +mistrials +mistrist +mistryst +mistrysted +mistrysting +mistrysts +mistrow +mistrust +mistrusted +mistruster +mistrustful +mistrustfully +mistrustfulness +mistrusting +mistrustingly +mistrustless +mistrusts +mists +mistune +mistuned +mistunes +mistuning +misture +misturn +mistutor +mistutored +mistutoring +mistutors +misunderstand +misunderstandable +misunderstander +misunderstanders +misunderstanding +misunderstandingly +misunderstandings +misunderstands +misunderstood +misunderstoodness +misunion +misunions +misura +misusage +misusages +misuse +misused +misuseful +misusement +misuser +misusers +misuses +misusing +misusurped +misvaluation +misvalue +misvalued +misvalues +misvaluing +misventure +misventurous +misviding +misvouch +misvouched +misway +miswandered +miswed +miswedded +misween +miswend +miswern +miswire +miswired +miswiring +miswisdom +miswish +miswoman +misword +misworded +miswording +miswords +misworship +misworshiped +misworshiper +misworshipper +miswrest +miswrit +miswrite +miswrites +miswriting +miswritten +miswrote +miswrought +miszealous +miszone +miszoned +miszoning +mit +mytacism +mitakshara +mitanni +mitannian +mitannish +mitapsis +mitch +mitchboard +mitchell +mitchella +mite +mitella +miteproof +miter +mitered +miterer +miterers +miterflower +mitergate +mitering +miters +miterwort +mites +myth +mithan +mither +mithers +mythic +mythical +mythicalism +mythicality +mythically +mythicalness +mythicise +mythicised +mythiciser +mythicising +mythicism +mythicist +mythicization +mythicize +mythicized +mythicizer +mythicizing +mythify +mythification +mythified +mythifier +mythifying +mythism +mythist +mythize +mythland +mythmaker +mythmaking +mythoclast +mythoclastic +mythogeneses +mythogenesis +mythogeny +mythogony +mythogonic +mythographer +mythography +mythographies +mythographist +mythogreen +mythoheroic +mythohistoric +mythoi +mythol +mythologema +mythologer +mythology +mythologian +mythologic +mythological +mythologically +mythologies +mythologise +mythologist +mythologists +mythologization +mythologize +mythologized +mythologizer +mythologizing +mythologue +mythomania +mythomaniac +mythometer +mythonomy +mythopastoral +mythopeic +mythopeist +mythopoeia +mythopoeic +mythopoeism +mythopoeist +mythopoem +mythopoesy +mythopoesis +mythopoet +mythopoetic +mythopoetical +mythopoetise +mythopoetised +mythopoetising +mythopoetize +mythopoetized +mythopoetizing +mythopoetry +mythos +mithra +mithraea +mithraeum +mithraic +mithraicism +mithraicist +mithraicize +mithraism +mithraist +mithraistic +mithraitic +mithraize +mithras +mithratic +mithriac +mithridate +mithridatic +mithridatise +mithridatised +mithridatising +mithridatism +mithridatize +mithridatized +mithridatizing +myths +mythus +mity +miticidal +miticide +miticides +mitier +mitiest +mitigable +mitigant +mitigate +mitigated +mitigatedly +mitigates +mitigating +mitigation +mitigative +mitigator +mitigatory +mitigators +mytilacea +mytilacean +mytilaceous +mytiliaspis +mytilid +mytilidae +mytiliform +mytiloid +mytilotoxine +mytilus +miting +mitis +mitises +mitochondria +mitochondrial +mitochondrion +mitogen +mitogenetic +mitogenic +mitogenicity +mitogens +mitokoromono +mitome +mitomycin +mitoses +mitosis +mitosome +mitotic +mitotically +mitra +mitraille +mitrailleur +mitrailleuse +mitral +mitrate +mitre +mitred +mitreflower +mitrer +mitres +mitrewort +mitridae +mitriform +mitring +mitsukurina +mitsukurinidae +mitsumata +mitsvah +mitsvahs +mitsvoth +mitt +mittatur +mittelhand +mittelmeer +mitten +mittened +mittenlike +mittens +mittent +mitty +mittimus +mittimuses +mittle +mitts +mitu +mitua +mitvoth +mitzvah +mitzvahs +mitzvoth +miurus +mix +myxa +mixability +mixable +mixableness +myxadenitis +myxadenoma +myxaemia +myxamoeba +myxangitis +myxasthenia +mixblood +mixe +mixed +myxedema +myxedemas +myxedematoid +myxedematous +myxedemic +mixedly +mixedness +myxemia +mixen +mixer +mixeress +mixers +mixes +mixhill +mixy +mixible +mixilineal +myxine +mixing +myxinidae +myxinoid +myxinoidei +mixite +myxo +myxobacteria +myxobacteriaceae +myxobacteriaceous +myxobacteriales +mixobarbaric +myxoblastoma +myxochondroma +myxochondrosarcoma +mixochromosome +myxocystoma +myxocyte +myxocytes +myxococcus +mixodectes +mixodectidae +myxoedema +myxoedemic +myxoenchondroma +myxofibroma +myxofibrosarcoma +myxoflagellate +myxogaster +myxogasteres +myxogastrales +myxogastres +myxogastric +myxogastrous +myxoglioma +myxoid +myxoinoma +mixolydian +myxolipoma +mixology +mixologies +mixologist +myxoma +myxomas +myxomata +myxomatosis +myxomatous +myxomycetales +myxomycete +myxomycetes +myxomycetous +myxomyoma +myxoneuroma +myxopapilloma +myxophyceae +myxophycean +myxophyta +myxophobia +mixoploid +mixoploidy +myxopod +myxopoda +myxopodan +myxopodia +myxopodium +myxopodous +myxopoiesis +myxorrhea +myxosarcoma +mixosaurus +myxospongiae +myxospongian +myxospongida +myxospore +myxosporidia +myxosporidian +myxosporidiida +myxosporium +myxosporous +myxothallophyta +myxotheca +mixotrophic +myxoviral +myxovirus +mixt +mixtec +mixtecan +mixtiform +mixtilineal +mixtilinear +mixtilion +mixtion +mixture +mixtures +mixup +mixups +mizar +mize +mizen +mizenmast +mizens +mizmaze +myzodendraceae +myzodendraceous +myzodendron +myzomyia +myzont +myzontes +myzostoma +myzostomata +myzostomatous +myzostome +myzostomid +myzostomida +myzostomidae +myzostomidan +myzostomous +mizpah +mizrach +mizrah +mizraim +mizzen +mizzenmast +mizzenmastman +mizzenmasts +mizzens +mizzentop +mizzentopman +mizzentopmen +mizzy +mizzle +mizzled +mizzler +mizzles +mizzly +mizzling +mizzonite +mk +mks +mkt +mktg +ml +mlange +mlechchha +mlx +mm +mmf +mmfd +mmmm +mn +mna +mnage +mnem +mneme +mnemic +mnemiopsis +mnemonic +mnemonical +mnemonicalist +mnemonically +mnemonicon +mnemonics +mnemonism +mnemonist +mnemonization +mnemonize +mnemonized +mnemonizing +mnemosyne +mnemotechny +mnemotechnic +mnemotechnical +mnemotechnics +mnemotechnist +mnesic +mnestic +mnevis +mniaceae +mniaceous +mnioid +mniotiltidae +mnium +mo +moa +moabite +moabitess +moabitic +moabitish +moan +moaned +moanful +moanfully +moanification +moaning +moaningly +moanless +moans +moaria +moarian +moas +moat +moated +moathill +moating +moatlike +moats +moattalite +mob +mobable +mobbable +mobbed +mobber +mobbers +mobby +mobbie +mobbing +mobbish +mobbishly +mobbishness +mobbism +mobbist +mobble +mobcap +mobcaps +mobed +mobil +mobile +mobiles +mobilia +mobilian +mobilianer +mobiliary +mobilisable +mobilisation +mobilise +mobilised +mobiliser +mobilises +mobilising +mobility +mobilities +mobilizable +mobilization +mobilizations +mobilize +mobilized +mobilizer +mobilizers +mobilizes +mobilizing +mobilometer +moble +moblike +mobocracy +mobocracies +mobocrat +mobocratic +mobocratical +mobocrats +mobolatry +mobproof +mobs +mobship +mobsman +mobsmen +mobster +mobsters +mobula +mobulidae +moc +moca +moccasin +moccasins +moccenigo +mocha +mochas +moche +mochel +mochy +mochica +mochila +mochilas +mochras +mochudi +mock +mockable +mockado +mockage +mockbird +mocked +mocker +mockery +mockeries +mockernut +mockers +mocketer +mockful +mockfully +mockground +mocking +mockingbird +mockingbirds +mockingly +mockingstock +mockish +mocks +mockup +mockups +mocmain +moco +mocoa +mocoan +mocock +mocomoco +mocuck +mod +modal +modalism +modalist +modalistic +modality +modalities +modalize +modally +modder +mode +model +modeled +modeler +modelers +modeless +modelessness +modeling +modelings +modelist +modelize +modelled +modeller +modellers +modelling +modelmaker +modelmaking +models +modem +modems +modena +modenese +moder +moderant +moderantism +moderantist +moderate +moderated +moderately +moderateness +moderates +moderating +moderation +moderationism +moderationist +moderations +moderatism +moderatist +moderato +moderator +moderatorial +moderators +moderatorship +moderatos +moderatrix +modern +moderne +moderner +modernest +modernicide +modernisation +modernise +modernised +moderniser +modernish +modernising +modernism +modernist +modernistic +modernists +modernity +modernities +modernizable +modernization +modernize +modernized +modernizer +modernizers +modernizes +modernizing +modernly +modernness +moderns +modes +modest +modester +modestest +modesty +modesties +modestly +modestness +modge +modi +mody +modiation +modica +modicity +modicum +modicums +modif +modify +modifiability +modifiable +modifiableness +modifiably +modificability +modificable +modificand +modification +modificationist +modifications +modificative +modificator +modificatory +modified +modifier +modifiers +modifies +modifying +modili +modillion +modiolar +modioli +modiolus +modish +modishly +modishness +modist +modiste +modistes +modistry +modius +modo +modoc +modred +mods +modula +modulability +modulant +modular +modularity +modularization +modularize +modularized +modularizes +modularizing +modularly +modulate +modulated +modulates +modulating +modulation +modulations +modulative +modulator +modulatory +modulators +module +modules +modulet +moduli +modulidae +modulize +modulo +modulus +modumite +modus +moe +moeble +moeck +moed +moehringia +moellon +moerithere +moeritherian +moeritheriidae +moeritherium +moet +moeurs +mofette +mofettes +moff +moffette +moffettes +moffle +mofussil +mofussilite +mog +mogador +mogadore +mogdad +moggan +mogged +moggy +moggies +mogging +moggio +moghan +moghul +mogigraphy +mogigraphia +mogigraphic +mogilalia +mogilalism +mogiphonia +mogitocia +mogo +mogographia +mogollon +mogos +mogote +mograbi +mogrebbin +mogs +moguey +mogul +moguls +mogulship +moguntine +moha +mohabat +mohair +mohairs +mohalim +mohammad +mohammed +mohammedan +mohammedanism +mohammedanization +mohammedanize +mohammedism +mohammedist +mohammedization +mohammedize +mohar +moharram +mohatra +mohave +mohawk +mohawkian +mohawkite +mohawks +mohegan +mohel +mohels +mohican +mohineyam +mohism +mohnseed +moho +mohock +mohockism +mohoohoo +mohos +mohr +mohrodendron +mohur +mohurs +mohwa +moi +moy +moya +moid +moider +moidore +moidores +moyen +moyenant +moyener +moyenless +moyenne +moier +moiest +moieter +moiety +moieties +moyite +moil +moyl +moile +moyle +moiled +moiley +moiler +moilers +moiles +moiling +moilingly +moils +moilsome +moineau +moingwena +moio +moyo +moir +moira +moirai +moire +moireed +moireing +moires +moirette +moise +moism +moison +moissanite +moist +moisten +moistened +moistener +moisteners +moistening +moistens +moister +moistest +moistful +moisty +moistify +moistiness +moistish +moistishness +moistless +moistly +moistness +moisture +moistureless +moistureproof +moistures +moisturize +moisturized +moisturizer +moisturizers +moisturizes +moisturizing +moit +moither +moity +moitier +moitiest +mojarra +mojarras +mojo +mojos +mokaddam +mokador +mokamoka +moke +mokes +moki +moky +mokihana +mokihi +moko +moksha +mokum +mol +mola +molal +molala +molality +molalities +molar +molary +molariform +molarimeter +molarity +molarities +molars +molas +molasse +molasses +molasseses +molassy +molassied +molave +mold +moldability +moldable +moldableness +moldasle +moldavian +moldavite +moldboard +moldboards +molded +molder +moldered +moldery +moldering +molders +moldy +moldier +moldiest +moldiness +molding +moldings +moldmade +moldproof +molds +moldwarp +moldwarps +mole +molebut +molecast +molecula +molecular +molecularist +molecularity +molecularly +molecule +molecules +molehead +moleheap +molehill +molehilly +molehillish +molehills +moleism +molelike +molendinar +molendinary +molengraaffite +moleproof +moler +moles +moleskin +moleskins +molest +molestation +molestations +molested +molester +molesters +molestful +molestfully +molestie +molesting +molestious +molests +molet +molewarp +molge +molgula +moly +molybdate +molybdena +molybdenic +molybdeniferous +molybdenite +molybdenous +molybdenum +molybdic +molybdite +molybdocardialgia +molybdocolic +molybdodyspepsia +molybdomancy +molybdomenite +molybdonosus +molybdoparesis +molybdophyllite +molybdosis +molybdous +molidae +moliere +molies +molify +molified +molifying +molilalia +molimen +moliminous +molinary +moline +molinet +moling +molinia +molinism +molinist +molinistic +molysite +molition +molka +moll +molla +mollah +mollahs +molland +mollberg +molle +molles +mollescence +mollescent +molleton +molly +mollichop +mollycoddle +mollycoddled +mollycoddler +mollycoddlers +mollycoddles +mollycoddling +mollycosset +mollycot +mollicrush +mollie +mollienisia +mollient +molliently +mollies +mollify +mollifiable +mollification +mollified +mollifiedly +mollifier +mollifiers +mollifies +mollifying +mollifyingly +mollifyingness +molligrant +molligrubs +mollyhawk +mollymawk +mollipilose +mollisiaceae +mollisiose +mollisol +mollities +mollitious +mollitude +molls +molluginaceae +mollugo +mollusc +mollusca +molluscan +molluscans +molluscicidal +molluscicide +molluscivorous +molluscoid +molluscoida +molluscoidal +molluscoidan +molluscoidea +molluscoidean +molluscous +molluscousness +molluscs +molluscum +mollusk +molluskan +mollusklike +mollusks +molman +molmen +molmutian +moloch +molochize +molochs +molochship +molocker +moloid +moloker +molompi +molosse +molosses +molossian +molossic +molossidae +molossine +molossoid +molossus +molothrus +molpe +molrooken +mols +molt +molted +molten +moltenly +molter +molters +molting +molto +molts +moltten +molucca +moluccan +moluccella +moluche +molvi +mom +mombin +momble +mombottu +mome +moment +momenta +momental +momentally +momentaneall +momentaneity +momentaneous +momentaneously +momentaneousness +momentany +momentary +momentarily +momentariness +momently +momento +momentoes +momentos +momentous +momentously +momentousness +moments +momentum +momentums +momes +momi +momiology +momish +momism +momisms +momist +momma +mommas +momme +mommer +mommet +mommy +mommies +momo +momordica +momotidae +momotinae +momotus +moms +momser +momus +momuses +momzer +mon +mona +monacan +monacanthid +monacanthidae +monacanthine +monacanthous +monacetin +monach +monacha +monachal +monachate +monachi +monachism +monachist +monachization +monachize +monacid +monacidic +monacids +monacillo +monacillos +monaco +monact +monactin +monactinal +monactine +monactinellid +monactinellidan +monad +monadal +monadelph +monadelphia +monadelphian +monadelphous +monades +monadic +monadical +monadically +monadiform +monadigerous +monadina +monadism +monadisms +monadistic +monadnock +monadology +monads +monaene +monal +monamide +monamine +monamniotic +monanday +monander +monandry +monandria +monandrian +monandric +monandries +monandrous +monanthous +monaphase +monapsal +monarch +monarchal +monarchally +monarchess +monarchy +monarchial +monarchian +monarchianism +monarchianist +monarchianistic +monarchic +monarchical +monarchically +monarchies +monarchism +monarchist +monarchistic +monarchists +monarchize +monarchized +monarchizer +monarchizing +monarchlike +monarcho +monarchomachic +monarchomachist +monarchs +monarda +monardas +monardella +monarthritis +monarticular +monas +monasa +monascidiae +monascidian +monase +monaster +monastery +monasterial +monasterially +monasteries +monastic +monastical +monastically +monasticism +monasticize +monastics +monatomic +monatomically +monatomicity +monatomism +monaul +monauli +monaulos +monaural +monaurally +monax +monaxial +monaxile +monaxon +monaxonial +monaxonic +monaxonida +monazine +monazite +monazites +monbuttu +monchiquite +monday +mondayish +mondayishness +mondayland +mondain +mondaine +mondays +monde +mondego +mondes +mondial +mondo +mondos +mondsee +mone +monecian +monecious +monedula +monegasque +money +moneyage +moneybag +moneybags +moneychanger +moneychangers +moneyed +moneyer +moneyers +moneyflower +moneygetting +moneygrub +moneygrubber +moneygrubbing +moneying +moneylender +moneylenders +moneylending +moneyless +moneylessness +moneymake +moneymaker +moneymakers +moneymaking +moneyman +moneymonger +moneymongering +moneyocracy +moneys +moneysaving +moneywise +moneywort +monel +monembryary +monembryony +monembryonic +moneme +monepic +monepiscopacy +monepiscopal +monepiscopus +moner +monera +moneral +moneran +monergic +monergism +monergist +monergistic +moneric +moneron +monerons +monerozoa +monerozoan +monerozoic +monerula +moneses +monesia +monest +monestrous +monetary +monetarily +monetarism +monetarist +monetarists +moneth +monetise +monetised +monetises +monetising +monetite +monetization +monetize +monetized +monetizes +monetizing +mong +mongcorn +mongeese +monger +mongered +mongerer +mongery +mongering +mongers +monghol +mongholian +mongibel +mongler +mongo +mongoe +mongoes +mongoyo +mongol +mongolia +mongolian +mongolianism +mongolians +mongolic +mongolioid +mongolish +mongolism +mongolization +mongolize +mongoloid +mongoloids +mongols +mongoose +mongooses +mongos +mongrel +mongreldom +mongrelisation +mongrelise +mongrelised +mongreliser +mongrelish +mongrelising +mongrelism +mongrelity +mongrelization +mongrelize +mongrelized +mongrelizing +mongrelly +mongrelness +mongrels +mongst +monheimite +mony +monial +monias +monic +monica +monicker +monickers +monie +monied +monier +monies +moniker +monikers +monilated +monilethrix +monilia +moniliaceae +moniliaceous +monilial +moniliales +moniliasis +monilicorn +moniliform +moniliformly +monilioid +moniment +monimia +monimiaceae +monimiaceous +monimolite +monimostylic +monish +monished +monisher +monishes +monishing +monishment +monism +monisms +monist +monistic +monistical +monistically +monists +monitary +monition +monitions +monitive +monitor +monitored +monitory +monitorial +monitorially +monitories +monitoring +monitorish +monitors +monitorship +monitress +monitrix +monk +monkbird +monkcraft +monkdom +monkey +monkeyboard +monkeyed +monkeyface +monkeyfy +monkeyfied +monkeyfying +monkeyflower +monkeyhood +monkeying +monkeyish +monkeyishly +monkeyishness +monkeyism +monkeylike +monkeynut +monkeypod +monkeypot +monkeyry +monkeyrony +monkeys +monkeyshine +monkeyshines +monkeytail +monkery +monkeries +monkeryies +monkess +monkfish +monkfishes +monkflower +monkhood +monkhoods +monkish +monkishly +monkishness +monkism +monkly +monklike +monkliness +monkmonger +monks +monkship +monkshood +monkshoods +monmouth +monmouthite +monny +monniker +monnion +mono +monoacetate +monoacetin +monoacid +monoacidic +monoacids +monoalphabetic +monoamid +monoamide +monoamin +monoamine +monoaminergic +monoamino +monoammonium +monoatomic +monoazo +monobacillary +monobase +monobasic +monobasicity +monobath +monoblastic +monoblepsia +monoblepsis +monobloc +monobranchiate +monobromacetone +monobromated +monobromide +monobrominated +monobromination +monobromized +monobromoacetanilide +monobromoacetone +monobutyrin +monocable +monocalcium +monocarbide +monocarbonate +monocarbonic +monocarboxylic +monocardian +monocarp +monocarpal +monocarpellary +monocarpian +monocarpic +monocarpous +monocarps +monocellular +monocentric +monocentrid +monocentridae +monocentris +monocentroid +monocephalous +monocerco +monocercous +monoceros +monocerous +monochasia +monochasial +monochasium +monochlamydeae +monochlamydeous +monochlor +monochloracetic +monochloranthracene +monochlorbenzene +monochloride +monochlorinated +monochlorination +monochloro +monochloroacetic +monochlorobenzene +monochloromethane +monochoanitic +monochord +monochordist +monochordize +monochroic +monochromasy +monochromat +monochromate +monochromatic +monochromatically +monochromaticity +monochromatism +monochromator +monochrome +monochromes +monochromy +monochromic +monochromical +monochromically +monochromist +monochromous +monochronic +monochronometer +monochronous +monocyanogen +monocycle +monocycly +monocyclic +monocyclica +monociliated +monocystic +monocystidae +monocystidea +monocystis +monocyte +monocytes +monocytic +monocytoid +monocytopoiesis +monocle +monocled +monocleid +monocleide +monocles +monoclinal +monoclinally +monocline +monoclinian +monoclinic +monoclinism +monoclinometric +monoclinous +monoclonal +monoclonius +monocoelia +monocoelian +monocoelic +monocondyla +monocondylar +monocondylian +monocondylic +monocondylous +monocoque +monocormic +monocot +monocotyl +monocotyledon +monocotyledones +monocotyledonous +monocotyledons +monocots +monocracy +monocrat +monocratic +monocratis +monocrats +monocrotic +monocrotism +monocular +monocularity +monocularly +monoculate +monocule +monoculist +monoculous +monocultural +monoculture +monoculus +monodactyl +monodactylate +monodactyle +monodactyly +monodactylism +monodactylous +monodelph +monodelphia +monodelphian +monodelphic +monodelphous +monodermic +monody +monodic +monodical +monodically +monodies +monodimetric +monodynamic +monodynamism +monodist +monodists +monodize +monodomous +monodon +monodont +monodonta +monodontal +monodram +monodrama +monodramatic +monodramatist +monodrame +monodromy +monodromic +monoecy +monoecia +monoecian +monoecies +monoecious +monoeciously +monoeciousness +monoecism +monoeidic +monoenergetic +monoester +monoestrous +monoethanolamine +monoethylamine +monofil +monofilament +monofilm +monofils +monoflagellate +monoformin +monofuel +monofuels +monogamy +monogamian +monogamic +monogamies +monogamik +monogamist +monogamistic +monogamists +monogamou +monogamous +monogamously +monogamousness +monoganglionic +monogastric +monogene +monogenea +monogenean +monogeneity +monogeneous +monogenesy +monogenesis +monogenesist +monogenetic +monogenetica +monogeny +monogenic +monogenically +monogenies +monogenism +monogenist +monogenistic +monogenous +monogerm +monogyny +monogynia +monogynic +monogynies +monogynious +monogynist +monogynoecial +monogynous +monoglycerid +monoglyceride +monoglot +monogoneutic +monogony +monogonoporic +monogonoporous +monogram +monogramed +monograming +monogramm +monogrammatic +monogrammatical +monogrammed +monogrammic +monogramming +monograms +monograph +monographed +monographer +monographers +monographes +monography +monographic +monographical +monographically +monographing +monographist +monographs +monograptid +monograptidae +monograptus +monohybrid +monohydrate +monohydrated +monohydric +monohydrogen +monohydroxy +monohull +monoicous +monoid +monoketone +monokini +monolayer +monolater +monolatry +monolatrist +monolatrous +monoline +monolingual +monolinguist +monoliteral +monolith +monolithal +monolithic +monolithically +monolithism +monoliths +monolobular +monolocular +monolog +monology +monologian +monologic +monological +monologies +monologist +monologists +monologize +monologized +monologizing +monologs +monologue +monologues +monologuist +monologuists +monomachy +monomachist +monomail +monomania +monomaniac +monomaniacal +monomaniacs +monomanias +monomark +monomastigate +monomeniscous +monomer +monomeric +monomerous +monomers +monometalism +monometalist +monometallic +monometallism +monometallist +monometer +monomethyl +monomethylamine +monomethylated +monomethylic +monometric +monometrical +monomya +monomial +monomials +monomyary +monomyaria +monomyarian +monomict +monomineral +monomineralic +monomolecular +monomolecularly +monomolybdate +monomorium +monomorphemic +monomorphic +monomorphism +monomorphous +mononaphthalene +mononch +mononchus +mononeural +monongahela +mononychous +mononym +mononymy +mononymic +mononymization +mononymize +mononitrate +mononitrated +mononitration +mononitride +mononitrobenzene +mononomial +mononomian +monont +mononuclear +mononucleated +mononucleoses +mononucleosis +mononucleotide +monoousian +monoousious +monoparental +monoparesis +monoparesthesia +monopathy +monopathic +monopectinate +monopersonal +monopersulfuric +monopersulphuric +monopetalae +monopetalous +monophagy +monophagia +monophagism +monophagous +monophase +monophasia +monophasic +monophylety +monophyletic +monophyleticism +monophyletism +monophylite +monophyllous +monophyodont +monophyodontism +monophysite +monophysitic +monophysitical +monophysitism +monophobia +monophoic +monophone +monophony +monophonic +monophonically +monophonies +monophonous +monophotal +monophote +monophthalmic +monophthalmus +monophthong +monophthongal +monophthongization +monophthongize +monophthongized +monophthongizing +monopylaea +monopylaria +monopylean +monopyrenous +monopitch +monoplace +monoplacula +monoplacular +monoplaculate +monoplane +monoplanes +monoplanist +monoplasmatic +monoplasric +monoplast +monoplastic +monoplegia +monoplegic +monoploid +monopneumoa +monopneumonian +monopneumonous +monopode +monopodes +monopody +monopodia +monopodial +monopodially +monopodic +monopodies +monopodium +monopodous +monopolar +monopolaric +monopolarity +monopole +monopoles +monopoly +monopolies +monopolylogist +monopolylogue +monopolisation +monopolise +monopolised +monopoliser +monopolising +monopolism +monopolist +monopolistic +monopolistically +monopolists +monopolitical +monopolizable +monopolization +monopolize +monopolized +monopolizer +monopolizes +monopolizing +monopoloid +monopolous +monopotassium +monoprionid +monoprionidian +monoprogrammed +monoprogramming +monopropellant +monoprotic +monopsychism +monopsony +monopsonistic +monoptera +monopteral +monopteridae +monopteroi +monopteroid +monopteron +monopteros +monopterous +monoptic +monoptical +monoptote +monoptotic +monopttera +monorail +monorailroad +monorails +monorailway +monorchid +monorchidism +monorchis +monorchism +monorganic +monorhyme +monorhymed +monorhina +monorhinal +monorhine +monorhinous +monorhythmic +monorime +monos +monosaccharide +monosaccharose +monoschemic +monoscope +monose +monosemy +monosemic +monosepalous +monoservice +monosexuality +monosexualities +monosilane +monosilicate +monosilicic +monosyllabic +monosyllabical +monosyllabically +monosyllabicity +monosyllabism +monosyllabize +monosyllable +monosyllables +monosyllogism +monosymmetry +monosymmetric +monosymmetrical +monosymmetrically +monosymptomatic +monosynaptic +monosynaptically +monosynthetic +monosiphonic +monosiphonous +monoski +monosodium +monosomatic +monosomatous +monosome +monosomes +monosomic +monospace +monosperm +monospermal +monospermy +monospermic +monospermous +monospherical +monospondylic +monosporangium +monospore +monospored +monosporiferous +monosporous +monostable +monostele +monostely +monostelic +monostelous +monostich +monostichic +monostichous +monostylous +monostomata +monostomatidae +monostomatous +monostome +monostomidae +monostomous +monostomum +monostromatic +monostrophe +monostrophic +monostrophics +monosubstituted +monosubstitution +monosulfone +monosulfonic +monosulphide +monosulphone +monosulphonic +monotelephone +monotelephonic +monotellurite +monotessaron +monothalama +monothalaman +monothalamian +monothalamic +monothalamous +monothecal +monotheism +monotheist +monotheistic +monotheistical +monotheistically +monotheists +monothelete +monotheletian +monotheletic +monotheletism +monothelious +monothelism +monothelite +monothelitic +monothelitism +monothetic +monotic +monotint +monotints +monotypal +monotype +monotypes +monotypic +monotypical +monotypous +monotocardia +monotocardiac +monotocardian +monotocous +monotomous +monotonal +monotone +monotones +monotony +monotonic +monotonical +monotonically +monotonicity +monotonies +monotonist +monotonize +monotonous +monotonously +monotonousness +monotremal +monotremata +monotremate +monotrematous +monotreme +monotremous +monotrichate +monotrichic +monotrichous +monotriglyph +monotriglyphic +monotrocha +monotrochal +monotrochian +monotrochous +monotron +monotropa +monotropaceae +monotropaceous +monotrophic +monotropy +monotropic +monotropically +monotropies +monotropsis +monoureide +monovalence +monovalency +monovalent +monovariant +monoverticillate +monovoltine +monovular +monoxenous +monoxide +monoxides +monoxyla +monoxyle +monoxylic +monoxylon +monoxylous +monoxime +monozygotic +monozygous +monozoa +monozoan +monozoic +monroe +monroeism +monroeist +monrolite +mons +monseigneur +monseignevr +monsia +monsieur +monsieurs +monsieurship +monsignor +monsignore +monsignori +monsignorial +monsignors +monsoni +monsoon +monsoonal +monsoonish +monsoonishly +monsoons +monspermy +monster +monstera +monsterhood +monsterlike +monsters +monstership +monstrance +monstrances +monstrate +monstration +monstrator +monstricide +monstriferous +monstrify +monstrification +monstrosity +monstrosities +monstrous +monstrously +monstrousness +mont +montabyn +montadale +montage +montaged +montages +montaging +montagnac +montagnais +montagnard +montagne +montague +montana +montanan +montanans +montanas +montane +montanes +montanic +montanin +montanism +montanist +montanistic +montanistical +montanite +montanize +montant +montanto +montargis +montauk +montbretia +monte +montebrasite +montegre +monteith +monteiths +montem +montenegrin +montepulciano +montera +monterey +montero +monteros +montes +montesco +montesinos +montessori +montessorian +montessorianism +montevideo +montezuma +montgolfier +montgolfiers +montgomery +montgomeryshire +month +monthly +monthlies +monthlong +monthon +months +monty +montia +monticellite +monticle +monticola +monticolae +monticoline +monticulate +monticule +monticuline +monticulipora +monticuliporidae +monticuliporidean +monticuliporoid +monticulose +monticulous +monticulus +montiform +montigeneous +montilla +montjoy +montjoye +montmartrite +montmorency +montmorillonite +montmorillonitic +montmorilonite +monton +montpelier +montrachet +montre +montreal +montroydite +montross +montu +monture +montuvio +monumbo +monument +monumental +monumentalise +monumentalised +monumentalising +monumentalism +monumentality +monumentalization +monumentalize +monumentalized +monumentalizing +monumentally +monumentary +monumented +monumenting +monumentless +monumentlike +monuments +monuron +monurons +monzodiorite +monzogabbro +monzonite +monzonitic +moo +mooachaht +moocah +mooch +moocha +mooched +moocher +moochers +mooches +mooching +moochulka +mood +mooder +moody +moodier +moodiest +moodily +moodiness +moodir +moodish +moodishly +moodishness +moodle +moods +mooed +mooing +mookhtar +mooktar +mool +moola +moolah +moolahs +moolas +mooley +mooleys +moolet +moolings +mools +moolum +moolvee +moolvi +moolvie +moon +moonack +moonal +moonbeam +moonbeams +moonbill +moonblind +moonblink +moonbow +moonbows +mooncalf +mooncalves +mooncreeper +moondog +moondown +moondrop +mooned +mooneye +mooneyes +mooner +moonery +moonet +moonface +moonfaced +moonfall +moonfish +moonfishes +moonflower +moong +moonglade +moonglow +moonhead +moony +moonie +moonier +mooniest +moonily +mooniness +mooning +moonish +moonishly +moonite +moonja +moonjah +moonless +moonlessness +moonlet +moonlets +moonlight +moonlighted +moonlighter +moonlighters +moonlighty +moonlighting +moonlights +moonlike +moonlikeness +moonling +moonlit +moonlitten +moonman +moonmen +moonpath +moonpenny +moonproof +moonquake +moonraker +moonraking +moonrat +moonrise +moonrises +moons +moonsail +moonsails +moonscape +moonscapes +moonseed +moonseeds +moonset +moonsets +moonshade +moonshee +moonshine +moonshined +moonshiner +moonshiners +moonshiny +moonshining +moonshot +moonshots +moonsick +moonsickness +moonsif +moonstone +moonstones +moonstricken +moonstruck +moontide +moonway +moonwalk +moonwalker +moonwalking +moonwalks +moonward +moonwards +moonwort +moonworts +moop +moor +moorage +moorages +moorball +moorband +moorberry +moorberries +moorbird +moorburn +moorburner +moorburning +moorcock +moore +moored +mooress +moorflower +moorfowl +moorfowls +moorhen +moorhens +moory +moorier +mooriest +mooring +moorings +moorish +moorishly +moorishness +moorland +moorlander +moorlands +moorman +moormen +moorn +moorpan +moorpunky +moors +moorship +moorsman +moorstone +moortetter +mooruk +moorup +moorwort +moorworts +moos +moosa +moose +mooseberry +mooseberries +moosebird +moosebush +moosecall +mooseflower +moosehood +moosey +moosemilk +moosemise +moosetongue +moosewob +moosewood +moost +moot +mootable +mootch +mooted +mooter +mooters +mooth +mooting +mootman +mootmen +mootness +moots +mootstead +mootsuddy +mootworthy +mop +mopan +mopane +mopani +mopboard +mopboards +mope +moped +mopeder +mopeders +mopeds +mopehawk +mopey +mopeier +mopeiest +moper +mopery +mopers +mopes +moph +mophead +mopheaded +mopheadedness +mopy +mopier +mopiest +moping +mopingly +mopish +mopishly +mopishness +mopla +moplah +mopoke +mopokes +mopped +mopper +moppers +moppet +moppets +moppy +mopping +mops +mopsey +mopsy +mopstick +mopus +mopuses +mopusses +moquelumnan +moquette +moquettes +moqui +mor +mora +morabit +moraceae +moraceous +morada +morae +moraea +moray +morainal +moraine +moraines +morainic +morays +moral +morale +moraler +morales +moralioralist +moralise +moralised +moralises +moralising +moralism +moralisms +moralist +moralistic +moralistically +moralists +morality +moralities +moralization +moralize +moralized +moralizer +moralizers +moralizes +moralizing +moralizingly +moraller +moralless +morally +moralness +morals +moran +moras +morass +morasses +morassy +morassic +morassweed +morat +morate +moration +moratory +moratoria +moratorium +moratoriums +morattoria +moravian +moravianism +moravianized +moravid +moravite +morbid +morbidezza +morbidity +morbidities +morbidize +morbidly +morbidness +morbiferal +morbiferous +morbify +morbific +morbifical +morbifically +morbility +morbillary +morbilli +morbilliform +morbillous +morbleu +morbose +morbus +morceau +morceaux +morcellate +morcellated +morcellating +morcellation +morcellement +morcha +morchella +morcote +mord +mordacious +mordaciously +mordacity +mordancy +mordancies +mordant +mordanted +mordanting +mordantly +mordants +mordecai +mordella +mordellid +mordellidae +mordelloid +mordenite +mordent +mordents +mordicant +mordicate +mordication +mordicative +mordieu +mordisheen +mordore +mordu +mordv +mordva +mordvin +mordvinian +more +moreen +moreens +morefold +moreish +morel +morella +morelle +morelles +morello +morellos +morels +morena +morencite +morendo +moreness +morenita +morenosite +moreote +moreover +morepeon +morepork +mores +moresco +moresque +moresques +morfond +morfound +morfounder +morfrey +morg +morga +morgay +morgan +morgana +morganatic +morganatical +morganatically +morganic +morganite +morganize +morgen +morgengift +morgens +morgenstern +morglay +morgue +morgues +morian +moribund +moribundity +moribundly +moric +morice +moriche +moriform +morigerate +morigeration +morigerous +morigerously +morigerousness +moriglio +morillon +morin +morinaceae +morinda +morindin +morindone +morinel +moringa +moringaceae +moringaceous +moringad +moringua +moringuid +moringuidae +moringuoid +morion +morions +moriori +moriscan +morisco +morish +morisonian +morisonianism +morkin +morling +morlop +mormaer +mormal +mormaor +mormaordom +mormaorship +mormyr +mormyre +mormyrian +mormyrid +mormyridae +mormyroid +mormyrus +mormo +mormon +mormondom +mormoness +mormonism +mormonist +mormonite +mormons +mormonweed +mormoops +mormorando +morn +mornay +morne +morned +mornette +morning +morningless +morningly +mornings +morningstar +morningtide +morningward +mornless +mornlike +morns +morntime +mornward +moro +moroc +morocain +moroccan +moroccans +morocco +moroccos +morocota +morology +morological +morologically +morologist +moromancy +moron +moroncy +morone +morones +morong +moronic +moronically +moronidae +moronism +moronisms +moronity +moronities +moronry +morons +moropus +moror +morosaurian +morosauroid +morosaurus +morose +morosely +moroseness +morosis +morosity +morosities +morosoph +moroxite +morph +morphactin +morphallaxes +morphallaxis +morphea +morphean +morpheme +morphemes +morphemic +morphemically +morphemics +morphetic +morpheus +morphew +morphgan +morphia +morphias +morphiate +morphic +morphically +morphin +morphinate +morphine +morphines +morphinic +morphinism +morphinist +morphinization +morphinize +morphinomania +morphinomaniac +morphins +morphiomania +morphiomaniac +morphism +morphisms +morphized +morphizing +morpho +morphogeneses +morphogenesis +morphogenetic +morphogenetically +morphogeny +morphogenic +morphographer +morphography +morphographic +morphographical +morphographist +morphol +morpholin +morpholine +morphology +morphologic +morphological +morphologically +morphologies +morphologist +morphologists +morpholoical +morphometry +morphometric +morphometrical +morphometrically +morphon +morphoneme +morphonemic +morphonemics +morphonomy +morphonomic +morphophyly +morphophoneme +morphophonemic +morphophonemically +morphophonemics +morphoplasm +morphoplasmic +morphos +morphoses +morphosis +morphotic +morphotonemic +morphotonemics +morphotropy +morphotropic +morphotropism +morphous +morphrey +morphs +morpion +morpunkee +morra +morral +morrenian +morrhua +morrhuate +morrhuin +morrhuine +morrice +morricer +morrion +morrions +morris +morrisean +morrises +morro +morros +morrow +morrowing +morrowless +morrowmass +morrows +morrowspeech +morrowtide +mors +morsal +morse +morsel +morseled +morseling +morselization +morselize +morselled +morselling +morsels +morsing +morsure +mort +mortacious +mortadella +mortal +mortalism +mortalist +mortality +mortalities +mortalize +mortalized +mortalizing +mortally +mortalness +mortals +mortalty +mortalwise +mortancestry +mortar +mortarboard +mortarboards +mortared +mortary +mortaring +mortarize +mortarless +mortarlike +mortars +mortarware +mortbell +mortcloth +mortem +mortersheen +mortgage +mortgageable +mortgaged +mortgagee +mortgagees +mortgager +mortgagers +mortgages +mortgaging +mortgagor +mortgagors +morth +morthwyrtha +mortice +morticed +morticer +mortices +mortician +morticians +morticing +mortier +mortiferous +mortiferously +mortiferousness +mortify +mortific +mortification +mortifications +mortified +mortifiedly +mortifiedness +mortifier +mortifies +mortifying +mortifyingly +mortimer +mortis +mortise +mortised +mortiser +mortisers +mortises +mortising +mortlake +mortling +mortmain +mortmainer +mortmains +morton +mortorio +mortress +mortreux +mortrewes +morts +mortuary +mortuarian +mortuaries +mortuous +morula +morulae +morular +morulas +morulation +morule +moruloid +morus +morvin +morw +morwong +mos +mosaic +mosaical +mosaically +mosaicism +mosaicist +mosaicity +mosaicked +mosaicking +mosaics +mosaism +mosaist +mosan +mosandrite +mosasaur +mosasauri +mosasauria +mosasaurian +mosasaurid +mosasauridae +mosasauroid +mosasaurus +mosatenan +moschate +moschatel +moschatelline +moschi +moschidae +moschiferous +moschinae +moschine +moschus +moscow +mose +mosey +moseyed +moseying +moseys +mosel +moselle +moses +mosesite +mosetena +mosette +mosgu +moshav +moshavim +mosk +moskeneer +mosker +mosks +moslem +moslemah +moslemic +moslemin +moslemism +moslemite +moslemize +moslems +moslings +mosoceca +mosocecum +mosque +mosquelet +mosques +mosquish +mosquital +mosquito +mosquitobill +mosquitocidal +mosquitocide +mosquitoey +mosquitoes +mosquitofish +mosquitofishes +mosquitoish +mosquitoproof +mosquitos +mosquittoey +moss +mossback +mossbacked +mossbacks +mossbanker +mossberry +mossbunker +mossed +mosser +mossery +mossers +mosses +mossful +mosshead +mosshorn +mossi +mossy +mossyback +mossie +mossier +mossiest +mossiness +mossing +mossless +mosslike +mosso +mosstrooper +mosstroopery +mosstrooping +mosswort +most +mostaccioli +mostdeal +moste +mostic +mosting +mostly +mostlike +mostlings +mostness +mostra +mosts +mostwhat +mosul +mosur +mot +mota +motacil +motacilla +motacillid +motacillidae +motacillinae +motacilline +motatory +motatorious +motazilite +mote +moted +motey +motel +moteless +motels +moter +motes +motet +motets +motettist +motetus +moth +mothball +mothballed +mothballing +mothballs +mothed +mother +motherboard +mothercraft +motherdom +mothered +motherer +motherers +motherfucker +mothergate +motherhood +motherhouse +mothery +motheriness +mothering +motherkin +motherkins +motherland +motherlands +motherless +motherlessness +motherly +motherlike +motherliness +motherling +mothers +mothership +mothersome +motherward +motherwise +motherwort +mothy +mothier +mothiest +mothless +mothlike +mothproof +mothproofed +mothproofer +mothproofing +moths +mothworm +motif +motific +motifs +motyka +motile +motiles +motility +motilities +motion +motionable +motional +motioned +motioner +motioners +motioning +motionless +motionlessly +motionlessness +motions +motitation +motivate +motivated +motivates +motivating +motivation +motivational +motivationally +motivations +motivative +motivator +motive +motived +motiveless +motivelessly +motivelessness +motiveness +motives +motivic +motiving +motivity +motivities +motivo +motley +motleyer +motleyest +motleyness +motleys +motlier +motliest +motmot +motmots +motocar +motocycle +motocross +motofacient +motograph +motographic +motomagnetic +moton +motoneuron +motophone +motor +motorable +motorbicycle +motorbike +motorbikes +motorboat +motorboater +motorboating +motorboatman +motorboats +motorbus +motorbuses +motorbusses +motorcab +motorcade +motorcades +motorcar +motorcars +motorcycle +motorcycled +motorcycler +motorcycles +motorcycling +motorcyclist +motorcyclists +motorcoach +motordom +motordrome +motored +motory +motorial +motoric +motorically +motoring +motorings +motorisation +motorise +motorised +motorises +motorising +motorism +motorist +motorists +motorium +motorization +motorize +motorized +motorizes +motorizing +motorless +motorman +motormen +motorneer +motorphobe +motorphobia +motorphobiac +motors +motorsailer +motorscooters +motorship +motorships +motortruck +motortrucks +motorway +motorways +motozintlec +motozintleca +motricity +mots +mott +motte +mottes +mottetto +motty +mottle +mottled +mottledness +mottlement +mottler +mottlers +mottles +mottling +motto +mottoed +mottoes +mottoless +mottolike +mottos +mottramite +motts +mou +mouch +moucharaby +moucharabies +mouchard +mouchardism +mouche +mouched +mouches +mouching +mouchoir +mouchoirs +mouchrabieh +moud +moudy +moudie +moudieman +moue +mouedhin +moues +moufflon +moufflons +mouflon +mouflons +mougeotia +mougeotiaceae +mought +mouill +mouillation +mouille +mouillure +moujik +moujiks +moul +moulage +moulages +mould +mouldboard +moulded +moulder +mouldered +mouldery +mouldering +moulders +mouldy +mouldier +mouldies +mouldiest +mouldiness +moulding +mouldings +mouldmade +moulds +mouldwarp +moule +mouly +moulin +moulinage +moulinet +moulins +moulleen +moulrush +mouls +moult +moulted +moulten +moulter +moulters +moulting +moults +moulvi +moun +mound +mounded +moundy +moundiness +mounding +moundlet +mounds +moundsman +moundsmen +moundwork +mounseer +mount +mountable +mountably +mountain +mountained +mountaineer +mountaineered +mountaineering +mountaineers +mountainer +mountainet +mountainette +mountainy +mountainless +mountainlike +mountainous +mountainously +mountainousness +mountains +mountainside +mountainsides +mountaintop +mountaintops +mountainward +mountainwards +mountance +mountant +mountebank +mountebanked +mountebankery +mountebankeries +mountebankish +mountebankism +mountebankly +mountebanks +mounted +mountee +mounter +mounters +mounty +mountie +mounties +mounting +mountingly +mountings +mountlet +mounts +mounture +moup +mourn +mourne +mourned +mourner +mourneress +mourners +mournful +mournfuller +mournfullest +mournfully +mournfulness +mourning +mourningly +mournings +mournival +mourns +mournsome +mouse +mousebane +mousebird +moused +mousee +mousees +mousefish +mousefishes +mousehawk +mousehole +mousehound +mousey +mouseion +mousekin +mouselet +mouselike +mouseling +mousemill +mousepox +mouseproof +mouser +mousery +mouseries +mousers +mouses +mouseship +mousetail +mousetrap +mousetrapped +mousetrapping +mousetraps +mouseweb +mousy +mousier +mousiest +mousily +mousiness +mousing +mousingly +mousings +mousle +mouslingly +mousme +mousmee +mousoni +mousquetaire +mousquetaires +moussaka +moussakas +mousse +mousseline +mousses +mousseux +moustache +moustached +moustaches +moustachial +moustachio +mousterian +moustoc +mout +moutan +moutarde +mouth +mouthable +mouthbreeder +mouthbrooder +mouthe +mouthed +mouther +mouthers +mouthes +mouthful +mouthfuls +mouthy +mouthier +mouthiest +mouthily +mouthiness +mouthing +mouthingly +mouthishly +mouthless +mouthlike +mouthpart +mouthparts +mouthpiece +mouthpieces +mouthpipe +mouthroot +mouths +mouthwash +mouthwashes +mouthwatering +mouthwise +moutler +moutlers +mouton +moutoneed +moutonnee +moutons +mouzah +mouzouna +movability +movable +movableness +movables +movably +movant +move +moveability +moveable +moveableness +moveables +moveably +moved +moveless +movelessly +movelessness +movement +movements +movent +mover +movers +moves +movie +moviedom +moviedoms +moviegoer +moviegoing +movieize +movieland +moviemaker +moviemakers +movies +moving +movingly +movingness +movings +mow +mowable +mowana +mowburn +mowburnt +mowch +mowcht +mowe +mowed +mower +mowers +mowha +mowhay +mowhawk +mowie +mowing +mowland +mown +mowra +mowrah +mows +mowse +mowstead +mowt +mowth +moxa +moxas +moxibustion +moxie +moxieberry +moxieberries +moxies +moxo +mozambican +mozambique +mozarab +mozarabian +mozarabic +mozart +mozartean +moze +mozemize +mozetta +mozettas +mozette +mozing +mozo +mozos +mozzarella +mozzetta +mozzettas +mozzette +mp +mpangwe +mpb +mpbs +mpg +mph +mphps +mpondo +mpret +mr +mrem +mridang +mridanga +mridangas +mrs +mru +ms +msalliance +msec +msg +msink +msl +msource +mss +mster +mt +mtd +mtg +mtge +mtier +mtn +mts +mtscmd +mtx +mu +muang +mubarat +mucago +mucaro +mucate +mucedin +mucedinaceous +mucedine +mucedineous +mucedinous +much +muchacha +muchacho +muchachos +muchel +muches +muchfold +muchly +muchness +muchnesses +muchwhat +mucic +mucid +mucidity +mucidities +mucidness +muciferous +mucific +muciform +mucigen +mucigenous +mucilage +mucilages +mucilaginous +mucilaginously +mucilaginousness +mucin +mucinogen +mucinoid +mucinolytic +mucinous +mucins +muciparous +mucivore +mucivorous +muck +muckamuck +mucked +muckender +mucker +muckerer +muckerish +muckerism +muckers +mucket +muckhill +muckhole +mucky +muckibus +muckier +muckiest +muckily +muckiness +mucking +muckite +muckle +muckles +muckluck +mucklucks +muckman +muckment +muckmidden +muckna +muckrake +muckraked +muckraker +muckrakers +muckrakes +muckraking +mucks +mucksy +mucksweat +muckthrift +muckweed +muckworm +muckworms +mucluc +muclucs +mucocele +mucocellulose +mucocellulosic +mucocutaneous +mucodermal +mucofibrous +mucoflocculent +mucoid +mucoidal +mucoids +mucolytic +mucomembranous +muconic +mucopolysaccharide +mucoprotein +mucopurulent +mucopus +mucor +mucoraceae +mucoraceous +mucorales +mucorine +mucorioid +mucormycosis +mucorrhea +mucorrhoea +mucors +mucosa +mucosae +mucosal +mucosanguineous +mucosas +mucose +mucoserous +mucosity +mucosities +mucosocalcareous +mucosogranular +mucosopurulent +mucososaccharine +mucous +mucousness +mucoviscidosis +mucoviscoidosis +mucro +mucronate +mucronated +mucronately +mucronation +mucrones +mucroniferous +mucroniform +mucronulate +mucronulatous +muculent +mucuna +mucus +mucuses +mucusin +mud +mudar +mudbank +mudcap +mudcapped +mudcapping +mudcaps +mudcat +mudd +mudde +mudded +mudden +mudder +mudders +muddy +muddybrained +muddybreast +muddied +muddier +muddies +muddiest +muddify +muddyheaded +muddying +muddily +muddiness +mudding +muddish +muddle +muddlebrained +muddled +muddledness +muddledom +muddlehead +muddleheaded +muddleheadedness +muddlement +muddleproof +muddler +muddlers +muddles +muddlesome +muddling +muddlingly +mudee +mudejar +mudfat +mudfish +mudfishes +mudflow +mudguard +mudguards +mudhead +mudhole +mudhook +mudhopper +mudir +mudiria +mudirieh +mudland +mudlark +mudlarker +mudlarks +mudless +mudminnow +mudminnows +mudpack +mudproof +mudpuppy +mudpuppies +mudra +mudras +mudrock +mudrocks +mudroom +mudrooms +muds +mudsill +mudsills +mudskipper +mudsling +mudslinger +mudslingers +mudslinging +mudspate +mudspringer +mudstain +mudstone +mudstones +mudsucker +mudtrack +mudweed +mudwort +mueddin +mueddins +muehlenbeckia +muenster +muensters +muermo +muesli +muette +muezzin +muezzins +mufasal +muff +muffed +muffer +muffet +muffetee +muffy +muffin +muffineer +muffing +muffins +muffish +muffishness +muffle +muffled +muffledly +muffleman +mufflemen +muffler +mufflers +muffles +mufflin +muffling +muffs +mufti +mufty +muftis +mug +muga +mugearite +mugful +mugg +muggar +muggars +mugged +mugger +muggered +muggery +muggering +muggers +mugget +muggy +muggier +muggiest +muggily +mugginess +mugging +muggings +muggins +muggish +muggles +muggletonian +muggletonianism +muggs +muggur +muggurs +mugho +mughopine +mughouse +mugience +mugiency +mugient +mugil +mugilidae +mugiliform +mugiloid +mugs +muguet +mugweed +mugwet +mugwort +mugworts +mugwump +mugwumpery +mugwumpian +mugwumpish +mugwumpism +mugwumps +muhammad +muhammadan +muhammadanism +muhammadi +muharram +muhlenbergia +muhly +muhlies +muid +muilla +muir +muirburn +muircock +muirfowl +muysca +muishond +muist +muyusa +mujeres +mujik +mujiks +mujtahid +mukade +mukden +mukhtar +mukluk +mukluks +mukri +muktar +muktatma +muktear +mukti +muktuk +mulada +muladi +mulaprakriti +mulatta +mulatto +mulattoes +mulattoism +mulattos +mulattress +mulberry +mulberries +mulch +mulched +mulcher +mulches +mulching +mulciber +mulcibirian +mulct +mulctable +mulctary +mulctation +mulctative +mulctatory +mulcted +mulcting +mulcts +mulctuary +mulder +mule +muleback +muled +mulefoot +mulefooted +muley +muleys +muleman +mulemen +mules +mulet +muleta +muletas +muleteer +muleteers +muletress +muletta +mulewort +mulga +muliebral +muliebria +muliebrile +muliebrity +muliebrous +mulier +mulierine +mulierly +mulierose +mulierosity +mulierty +muling +mulish +mulishly +mulishness +mulism +mulita +mulk +mull +mulla +mullah +mullahism +mullahs +mullar +mullas +mulled +mulley +mullein +mulleins +mulleys +mullen +mullenize +mullens +muller +mullerian +mullers +mullet +mulletry +mullets +mullid +mullidae +mulligan +mulligans +mulligatawny +mulligrubs +mulling +mullion +mullioned +mullioning +mullions +mullite +mullites +mullock +mullocker +mullocky +mullocks +mulloid +mulloway +mulls +mulm +mulmul +mulmull +mulse +mulsify +mult +multangle +multangula +multangular +multangularly +multangularness +multangulous +multangulum +multani +multanimous +multarticulate +multeity +multi +multiangular +multiareolate +multiarticular +multiarticulate +multiarticulated +multiaxial +multiaxially +multiband +multibirth +multibit +multibyte +multiblade +multibladed +multiblock +multibranched +multibranchiate +multibreak +multibus +multicamerate +multicapitate +multicapsular +multicarinate +multicarinated +multicast +multicasting +multicasts +multicelled +multicellular +multicellularity +multicentral +multicentrally +multicentric +multichannel +multichanneled +multichannelled +multicharge +multichord +multichrome +multicycle +multicide +multiciliate +multiciliated +multicylinder +multicylindered +multicipital +multicircuit +multicircuited +multicoccous +multicoil +multicollinearity +multicolor +multicolored +multicolorous +multicoloured +multicomponent +multicomputer +multiconductor +multiconstant +multicordate +multicore +multicorneal +multicostate +multicourse +multicrystalline +multics +multicultural +multicurie +multicuspid +multicuspidate +multicuspidated +multidentate +multidenticulate +multidenticulated +multidestination +multidigitate +multidimensional +multidimensionality +multidirectional +multidisciplinary +multidiscipline +multidisperse +multidrop +multiengine +multiengined +multiethnic +multiexhaust +multifaced +multifaceted +multifactor +multifactorial +multifactorially +multifamily +multifamilial +multifarious +multifariously +multifariousness +multiferous +multifetation +multifibered +multifibrous +multifid +multifidly +multifidous +multifidus +multifil +multifilament +multifistular +multifistulous +multiflagellate +multiflagellated +multiflash +multiflora +multiflorae +multifloras +multiflorous +multiflow +multiflue +multifocal +multifoil +multifoiled +multifold +multifoldness +multifoliate +multifoliolate +multifont +multiform +multiformed +multiformity +multiframe +multifunction +multifurcate +multiganglionic +multigap +multigerm +multigyrate +multigranular +multigranulate +multigranulated +multigraph +multigrapher +multigravida +multiguttulate +multihead +multihearth +multihop +multihued +multihull +multiinfection +multijet +multijugate +multijugous +multilaciniate +multilayer +multilayered +multilamellar +multilamellate +multilamellous +multilaminar +multilaminate +multilaminated +multilane +multilaned +multilateral +multilaterality +multilaterally +multileaving +multilevel +multileveled +multilighted +multilineal +multilinear +multilingual +multilingualism +multilingually +multilinguist +multilirate +multiliteral +multilith +multilobar +multilobate +multilobe +multilobed +multilobular +multilobulate +multilobulated +multilocation +multilocular +multiloculate +multiloculated +multiloquence +multiloquent +multiloquy +multiloquious +multiloquous +multimachine +multimacular +multimammate +multimarble +multimascular +multimedia +multimedial +multimegaton +multimetalic +multimetallic +multimetallism +multimetallist +multimeter +multimicrocomputer +multimillion +multimillionaire +multimillionaires +multimodal +multimodality +multimode +multimolecular +multimotor +multimotored +multinational +multinationals +multinervate +multinervose +multinodal +multinodate +multinode +multinodous +multinodular +multinomial +multinominal +multinominous +multinuclear +multinucleate +multinucleated +multinucleolar +multinucleolate +multinucleolated +multiovular +multiovulate +multiovulated +multipacket +multipara +multiparae +multiparient +multiparity +multiparous +multiparty +multipartisan +multipartite +multipass +multipath +multiped +multipede +multipeds +multiperforate +multiperforated +multipersonal +multiphase +multiphaser +multiphasic +multiphotography +multipying +multipinnate +multiplan +multiplane +multiplated +multiple +multiplepoinding +multiples +multiplet +multiplex +multiplexed +multiplexer +multiplexers +multiplexes +multiplexing +multiplexor +multiplexors +multiply +multipliable +multipliableness +multiplicability +multiplicable +multiplicand +multiplicands +multiplicate +multiplication +multiplicational +multiplications +multiplicative +multiplicatively +multiplicatives +multiplicator +multiplicious +multiplicity +multiplicities +multiplied +multiplier +multipliers +multiplies +multiplying +multipointed +multipolar +multipolarity +multipole +multiported +multipotent +multipresence +multipresent +multiprocess +multiprocessing +multiprocessor +multiprocessors +multiprogram +multiprogrammed +multiprogramming +multipronged +multipurpose +multiracial +multiracialism +multiradial +multiradiate +multiradiated +multiradical +multiradicate +multiradicular +multiramified +multiramose +multiramous +multirate +multireflex +multiregister +multiresin +multirole +multirooted +multirotation +multirotatory +multisaccate +multisacculate +multisacculated +multiscience +multiscreen +multiseated +multisect +multisection +multisector +multisegmental +multisegmentate +multisegmented +multisense +multisensory +multisensual +multiseptate +multiserial +multiserially +multiseriate +multiserver +multishot +multisiliquous +multisyllabic +multisyllability +multisyllable +multisystem +multisonant +multisonic +multisonorous +multisonorously +multisonorousness +multisonous +multispecies +multispeed +multispermous +multispicular +multispiculate +multispindle +multispindled +multispinous +multispiral +multispired +multistage +multistaminate +multistate +multistep +multistorey +multistory +multistoried +multistratified +multistratous +multistriate +multisulcate +multisulcated +multitagged +multitarian +multitask +multitasking +multitentacled +multitentaculate +multitester +multitheism +multitheist +multithread +multithreaded +multititular +multitoed +multitoned +multitube +multituberculata +multituberculate +multituberculated +multituberculy +multituberculism +multitubular +multitude +multitudes +multitudinal +multitudinary +multitudinism +multitudinist +multitudinistic +multitudinosity +multitudinous +multitudinously +multitudinousness +multiturn +multiuser +multivagant +multivalence +multivalency +multivalent +multivalued +multivalve +multivalved +multivalvular +multivane +multivariant +multivariate +multivariates +multivarious +multiversant +multiverse +multiversion +multiversity +multiversities +multivibrator +multiview +multiviewing +multivincular +multivious +multivitamin +multivitamins +multivocal +multivocality +multivocalness +multivoiced +multivolent +multivoltine +multivolume +multivolumed +multivorous +multiway +multiwall +multiword +multiwords +multo +multocular +multum +multungulate +multure +multurer +multures +mulvel +mum +mumble +mumblebee +mumbled +mumblement +mumbler +mumblers +mumbles +mumbletypeg +mumbling +mumblingly +mumblings +mumbo +mumbudget +mumchance +mume +mumhouse +mumjuma +mumm +mummed +mummer +mummery +mummeries +mummers +mummy +mummia +mummichog +mummick +mummydom +mummied +mummies +mummify +mummification +mummified +mummifies +mummifying +mummiform +mummyhood +mummying +mummylike +mumming +mumms +mumness +mump +mumped +mumper +mumpers +mumphead +mumping +mumpish +mumpishly +mumpishness +mumps +mumpsimus +mumruffin +mums +mumsy +mun +munandi +muncerian +munch +munchausen +munchausenism +munchausenize +munched +munchee +muncheel +muncher +munchers +munches +munchet +munchy +munchies +munching +muncupate +mund +munda +mundal +mundane +mundanely +mundaneness +mundanism +mundanity +mundari +mundation +mundatory +mundic +mundify +mundificant +mundification +mundified +mundifier +mundifying +mundil +mundivagant +mundle +mundungo +mundungos +mundungus +mundunugu +mung +munga +mungcorn +munge +mungey +munger +mungy +mungo +mungofa +mungoos +mungoose +mungooses +mungos +mungrel +munguba +munia +munic +munich +munychia +munychian +munychion +munichism +municipal +municipalise +municipalism +municipalist +municipality +municipalities +municipalization +municipalize +municipalized +municipalizer +municipalizing +municipally +municipia +municipium +munify +munific +munificence +munificency +munificent +munificently +munificentness +munifience +muniment +muniments +munite +munited +munity +muniting +munition +munitionary +munitioned +munitioneer +munitioner +munitioning +munitions +munj +munjeet +munjistin +munnion +munnions +munnopsidae +munnopsis +muns +munsee +munshi +munsif +munsiff +munster +munsters +munt +muntiacus +muntin +munting +muntingia +muntings +muntins +muntjac +muntjacs +muntjak +muntjaks +muntz +muon +muong +muonic +muonium +muons +muphrid +mura +muradiyah +muraena +muraenid +muraenidae +muraenids +muraenoid +murage +mural +muraled +muralist +muralists +murally +murals +muran +muranese +murarium +muras +murasakite +murat +muratorian +murchy +murciana +murdabad +murder +murdered +murderee +murderees +murderer +murderers +murderess +murderesses +murdering +murderingly +murderish +murderment +murderous +murderously +murderousness +murders +murdrum +mure +mured +murein +mureins +murenger +mures +murex +murexan +murexes +murexid +murexide +murga +murgavi +murgeon +muriate +muriated +muriates +muriatic +muricate +muricated +murices +muricid +muricidae +muriciform +muricine +muricoid +muriculate +murid +muridae +muridism +murids +muriel +muriform +muriformly +murillo +murinae +murine +murines +muring +murinus +murionitric +muriti +murium +murk +murker +murkest +murky +murkier +murkiest +murkily +murkiness +murkish +murkly +murkness +murks +murksome +murlack +murlain +murlemewes +murly +murlin +murlock +murmi +murmur +murmuration +murmurator +murmured +murmurer +murmurers +murmuring +murmuringly +murmurish +murmurless +murmurlessly +murmurous +murmurously +murmurs +murnival +muroid +muromontite +murph +murphy +murphied +murphies +murphying +murr +murra +murrah +murray +murraya +murrain +murrains +murral +murraro +murras +murre +murrey +murreys +murrelet +murrelets +murres +murrha +murrhas +murrhine +murrhuine +murry +murries +murrina +murrine +murrion +murrnong +murrs +murshid +murther +murthered +murtherer +murthering +murthers +murthy +murumuru +murut +muruxi +murva +murza +murzim +mus +musa +musaceae +musaceous +musaeus +musal +musales +musalmani +musang +musar +musard +musardry +musca +muscade +muscadel +muscadelle +muscadels +muscadet +muscadin +muscadine +muscadinia +muscae +muscalonge +muscardine +muscardinidae +muscardinus +muscari +muscariform +muscarine +muscarinic +muscaris +muscat +muscatel +muscatels +muscatorium +muscats +muscavada +muscavado +muschelkalk +musci +muscicapa +muscicapidae +muscicapine +muscicide +muscicole +muscicoline +muscicolous +muscid +muscidae +muscids +musciform +muscinae +muscle +musclebound +muscled +muscleless +musclelike +muscleman +musclemen +muscles +muscly +muscling +muscogee +muscoid +muscoidea +muscology +muscologic +muscological +muscologist +muscone +muscose +muscoseness +muscosity +muscot +muscovade +muscovadite +muscovado +muscovi +muscovy +muscovite +muscovites +muscovitic +muscovitization +muscovitize +muscovitized +muscow +musculamine +muscular +muscularity +muscularities +muscularize +muscularly +musculation +musculature +musculatures +muscule +musculi +musculin +musculoarterial +musculocellular +musculocutaneous +musculodermic +musculoelastic +musculofibrous +musculointestinal +musculoligamentous +musculomembranous +musculopallial +musculophrenic +musculoskeletal +musculospinal +musculospiral +musculotegumentary +musculotendinous +musculous +musculus +muse +mused +museful +musefully +musefulness +museist +museless +muselessness +muselike +museographer +museography +museographist +museology +museologist +muser +musery +musers +muses +muset +musette +musettes +museum +museumize +museums +musgu +mush +musha +mushaa +mushabbihite +mushed +musher +mushers +mushes +mushhead +mushheaded +mushheadedness +mushy +mushier +mushiest +mushily +mushiness +mushing +mushla +mushmelon +mushrebiyeh +mushroom +mushroomed +mushroomer +mushroomy +mushroomic +mushrooming +mushroomlike +mushrooms +mushru +mushrump +music +musica +musical +musicale +musicales +musicality +musicalization +musicalize +musically +musicalness +musicals +musicate +musician +musiciana +musicianer +musicianly +musicians +musicianship +musicker +musicless +musiclike +musicmonger +musico +musicoartistic +musicodramatic +musicofanatic +musicographer +musicography +musicology +musicological +musicologically +musicologies +musicologist +musicologists +musicologue +musicomania +musicomechanical +musicophile +musicophilosophical +musicophysical +musicophobia +musicopoetic +musicotherapy +musicotherapies +musicproof +musicry +musics +musie +musily +musimon +musing +musingly +musings +musion +musit +musive +musjid +musjids +musk +muskadel +muskallonge +muskallunge +muskat +musked +muskeg +muskeggy +muskegs +muskellunge +muskellunges +musket +musketade +musketeer +musketeers +musketlike +musketo +musketoon +musketproof +musketry +musketries +muskets +muskflower +muskgrass +muskhogean +musky +muskie +muskier +muskies +muskiest +muskified +muskily +muskiness +muskish +muskit +muskits +musklike +muskmelon +muskmelons +muskogean +muskogee +muskone +muskox +muskoxen +muskrat +muskrats +muskroot +musks +muskwaki +muskwood +muslim +muslims +muslin +muslined +muslinet +muslinette +muslins +musmon +musnud +muso +musophaga +musophagi +musophagidae +musophagine +musophobia +muspike +muspikes +musquash +musquashes +musquashroot +musquashweed +musquaspen +musquaw +musqueto +musrol +musroomed +muss +mussable +mussably +mussack +mussaenda +mussal +mussalchee +mussed +mussel +musselcracker +musseled +musseler +mussellim +mussels +musses +mussy +mussick +mussier +mussiest +mussily +mussiness +mussing +mussitate +mussitation +mussolini +mussuck +mussuk +mussulman +mussulmanic +mussulmanish +mussulmanism +mussulwoman +mussurana +must +mustache +mustached +mustaches +mustachial +mustachio +mustachioed +mustachios +mustafina +mustafuz +mustahfiz +mustang +mustanger +mustangs +mustard +mustarder +mustards +musted +mustee +mustees +mustela +mustelid +mustelidae +mustelin +musteline +mustelinous +musteloid +mustelus +muster +musterable +musterdevillers +mustered +musterer +musterial +mustering +mustermaster +musters +musth +musths +musty +mustier +musties +mustiest +mustify +mustily +mustiness +musting +mustnt +musts +mustulent +musumee +mut +muta +mutabilia +mutability +mutable +mutableness +mutably +mutafacient +mutage +mutagen +mutagenesis +mutagenetic +mutagenic +mutagenically +mutagenicity +mutagenicities +mutagens +mutandis +mutant +mutants +mutarotate +mutarotation +mutase +mutases +mutate +mutated +mutates +mutating +mutation +mutational +mutationally +mutationism +mutationist +mutations +mutatis +mutative +mutator +mutatory +mutawalli +mutawallis +mutazala +mutch +mutches +mutchkin +mutchkins +mute +muted +mutedly +mutedness +mutely +muteness +mutenesses +muter +mutes +mutesarif +mutescence +mutessarif +mutessarifat +mutest +muth +muthmannite +muthmassel +mutic +muticate +muticous +mutilate +mutilated +mutilates +mutilating +mutilation +mutilations +mutilative +mutilator +mutilatory +mutilators +mutilla +mutillid +mutillidae +mutilous +mutinado +mutine +mutined +mutineer +mutineered +mutineering +mutineers +mutines +muting +mutiny +mutinied +mutinies +mutinying +mutining +mutinize +mutinous +mutinously +mutinousness +mutisia +mutisiaceae +mutism +mutisms +mutist +mutistic +mutive +mutivity +mutoscope +mutoscopic +muts +mutsje +mutsuddy +mutt +mutten +mutter +muttered +mutterer +mutterers +muttering +mutteringly +mutters +mutton +muttonbird +muttonchop +muttonchops +muttonfish +muttonfishes +muttonhead +muttonheaded +muttonheadedness +muttonhood +muttony +muttonmonger +muttons +muttonwood +mutts +mutual +mutualisation +mutualise +mutualised +mutualising +mutualism +mutualist +mutualistic +mutuality +mutualities +mutualization +mutualize +mutualized +mutualizing +mutually +mutualness +mutuals +mutuant +mutuary +mutuate +mutuatitious +mutuel +mutuels +mutular +mutulary +mutule +mutules +mutus +mutuum +mutwalli +muumuu +muumuus +muvule +mux +muzarab +muzhik +muzhiks +muzjik +muzjiks +muzo +muzoona +muzz +muzzy +muzzier +muzziest +muzzily +muzziness +muzzle +muzzled +muzzleloader +muzzleloading +muzzler +muzzlers +muzzles +muzzlewood +muzzling +mv +mw +mwa +mwalimu +mxd +mzee +mzungu +n +na +naa +naam +naaman +naassenes +nab +nabak +nabal +nabalism +nabalite +nabalitic +nabaloi +nabalus +nabataean +nabatean +nabathaean +nabathean +nabathite +nabbed +nabber +nabby +nabbing +nabbuk +nabcheat +nabis +nabk +nabla +nablas +nable +nablus +nabob +nabobery +naboberies +nabobess +nabobesses +nabobical +nabobically +nabobish +nabobishly +nabobism +nabobisms +nabobry +nabobrynabobs +nabobs +nabobship +naboth +nabothian +nabs +nabu +nacarat +nacarine +nace +nacelle +nacelles +nach +nachani +nachas +nache +nachitoch +nachitoches +nacho +nachschlag +nachtmml +nachus +nacionalista +nacket +nacre +nacred +nacreous +nacreousness +nacres +nacry +nacrine +nacrite +nacrous +nad +nada +nadder +nadeem +nadir +nadiral +nadirs +nadorite +nae +naebody +naegait +naegate +naegates +nael +naemorhedinae +naemorhedine +naemorhedus +naether +naething +naethings +naevi +naevoid +naevus +naf +nag +naga +nagaika +nagami +nagana +naganas +nagara +nagari +nagasaki +nagatelite +nagel +naggar +nagged +nagger +naggers +naggy +naggier +naggiest +naggin +nagging +naggingly +naggingness +naggish +naggle +naggly +naght +nagyagite +naging +nagkassar +nagmaal +nagman +nagnag +nagnail +nagor +nags +nagsman +nagster +nagual +nagualism +nagualist +nahanarvali +nahane +nahani +naharvali +nahoor +nahor +nahua +nahuan +nahuatl +nahuatlac +nahuatlan +nahuatleca +nahuatlecan +nahuatls +nahum +nay +naiad +naiadaceae +naiadaceous +naiadales +naiades +naiads +naiant +nayar +nayarit +nayarita +naias +nayaur +naib +naid +naif +naifly +naifs +naig +naigie +naigue +naik +nail +nailbin +nailbrush +nailed +nailer +naileress +nailery +nailers +nailfile +nailfold +nailfolds +nailhead +nailheads +naily +nailing +nailless +naillike +nailprint +nailproof +nailrod +nails +nailset +nailsets +nailshop +nailsick +nailsickness +nailsmith +nailwort +naim +nain +nainsel +nainsell +nainsook +nainsooks +naio +naipkin +naique +nair +naira +nairy +nairobi +nais +nays +naysay +naysayer +naysaying +naish +naiskoi +naiskos +naissance +naissant +naither +naitly +naive +naively +naiveness +naiver +naives +naivest +naivete +naivetes +naivety +naiveties +naivetivet +naivite +nayward +nayword +naja +nak +nake +naked +nakeder +nakedest +nakedish +nakedize +nakedly +nakedness +nakedweed +nakedwood +naker +nakhlite +nakhod +nakhoda +nakir +nako +nakomgilisala +nakong +nakoo +nakula +nale +naled +naleds +nalita +nallah +nalorphine +naloxone +naloxones +nam +nama +namability +namable +namaycush +namaqua +namaquan +namare +namaste +namatio +namaz +namazlik +namban +nambe +namby +namda +name +nameability +nameable +nameboard +named +nameless +namelessless +namelessly +namelessness +namely +nameling +nameplate +nameplates +namer +namers +names +namesake +namesakes +nametape +naming +namma +nammad +nammo +nan +nana +nanaimo +nanako +nanander +nanas +nanawood +nance +nances +nancy +nanda +nandi +nandin +nandina +nandine +nandins +nandow +nandu +nanduti +nane +nanes +nanga +nangca +nanger +nangka +nanigo +nanism +nanisms +nanitic +nanization +nankeen +nankeens +nankin +nanking +nankingese +nankins +nanmu +nannander +nannandrium +nannandrous +nannette +nanny +nannyberry +nannyberries +nannybush +nannie +nannies +nanninose +nannofossil +nannoplankton +nannoplanktonic +nanocephaly +nanocephalia +nanocephalic +nanocephalism +nanocephalous +nanocephalus +nanocurie +nanocuries +nanogram +nanograms +nanoid +nanoinstruction +nanoinstructions +nanomelia +nanomelous +nanomelus +nanometer +nanometre +nanoplankton +nanoprogram +nanoprogramming +nanosec +nanosecond +nanoseconds +nanosoma +nanosomia +nanosomus +nanostore +nanostores +nanowatt +nanowatts +nanoword +nanpie +nansomia +nant +nanticoke +nantle +nantokite +nants +nantz +naoi +naology +naological +naometry +naomi +naos +naosaurus +naoto +nap +napa +napaea +napaean +napal +napalm +napalmed +napalming +napalms +nape +napead +napecrest +napellus +naperer +napery +naperies +napes +naphtali +naphtha +naphthacene +naphthalate +naphthalene +naphthaleneacetic +naphthalenesulphonic +naphthalenic +naphthalenoid +naphthalic +naphthalidine +naphthalin +naphthaline +naphthalise +naphthalised +naphthalising +naphthalization +naphthalize +naphthalized +naphthalizing +naphthalol +naphthamine +naphthanthracene +naphthas +naphthene +naphthenic +naphthyl +naphthylamine +naphthylaminesulphonic +naphthylene +naphthylic +naphthinduline +naphthionate +naphtho +naphthoic +naphthol +naphtholate +naphtholize +naphthols +naphtholsulphonate +naphtholsulphonic +naphthoquinone +naphthoresorcinol +naphthosalol +naphthous +naphthoxide +naphtol +naphtols +napier +napierian +napiform +napkin +napkined +napkining +napkins +naples +napless +naplessness +napoleon +napoleonana +napoleonic +napoleonically +napoleonism +napoleonist +napoleonistic +napoleonite +napoleonize +napoleons +napoo +napooh +nappa +nappe +napped +napper +nappers +nappes +nappy +nappie +nappier +nappies +nappiest +nappiness +napping +nappishness +naprapath +naprapathy +napron +naps +napthionic +napu +nar +narc +narcaciontes +narcaciontidae +narcein +narceine +narceines +narceins +narciscissi +narcism +narcisms +narciss +narcissan +narcissi +narcissine +narcissism +narcissist +narcissistic +narcissistically +narcissists +narcissus +narcissuses +narcist +narcistic +narcists +narco +narcoanalysis +narcoanesthesia +narcobatidae +narcobatoidea +narcobatus +narcohypnia +narcohypnoses +narcohypnosis +narcohypnotic +narcolepsy +narcolepsies +narcoleptic +narcoma +narcomania +narcomaniac +narcomaniacal +narcomas +narcomata +narcomatous +narcomedusae +narcomedusan +narcos +narcose +narcoses +narcosynthesis +narcosis +narcostimulant +narcotherapy +narcotherapies +narcotherapist +narcotia +narcotic +narcotical +narcotically +narcoticalness +narcoticism +narcoticness +narcotics +narcotin +narcotina +narcotine +narcotinic +narcotisation +narcotise +narcotised +narcotising +narcotism +narcotist +narcotization +narcotize +narcotized +narcotizes +narcotizing +narcous +narcs +nard +nardine +nardoo +nards +nardu +nardus +nare +naren +narendra +nares +naresh +narghile +narghiles +nargil +nargile +nargileh +nargilehs +nargiles +nary +narial +naric +narica +naricorn +nariform +narine +naringenin +naringin +naris +nark +narked +narky +narking +narks +narr +narra +narraganset +narrante +narras +narratable +narrate +narrated +narrater +narraters +narrates +narrating +narratio +narration +narrational +narrations +narrative +narratively +narratives +narrator +narratory +narrators +narratress +narratrix +narrawood +narrishkeit +narrow +narrowcast +narrowed +narrower +narrowest +narrowhearted +narrowheartedness +narrowy +narrowing +narrowingness +narrowish +narrowly +narrowness +narrows +narsarsukite +narsinga +narthecal +narthecium +narthex +narthexes +narw +narwal +narwals +narwhal +narwhale +narwhales +narwhalian +narwhals +nasa +nasab +nasal +nasalis +nasalise +nasalised +nasalises +nasalising +nasalism +nasality +nasalities +nasalization +nasalize +nasalized +nasalizes +nasalizing +nasally +nasals +nasalward +nasalwards +nasard +nasat +nasaump +nascan +nascapi +nascence +nascences +nascency +nascencies +nascent +nasch +nasciturus +naseberry +naseberries +nasethmoid +nash +nashgab +nashgob +nashim +nashira +nashua +nashville +nasi +nasial +nasicorn +nasicornia +nasicornous +nasiei +nasiform +nasilabial +nasillate +nasillation +nasioalveolar +nasiobregmatic +nasioinial +nasiomental +nasion +nasions +nasitis +naskhi +naso +nasoalveola +nasoantral +nasobasilar +nasobronchial +nasobuccal +nasoccipital +nasociliary +nasoethmoidal +nasofrontal +nasolabial +nasolachrymal +nasolacrimal +nasology +nasological +nasologist +nasomalar +nasomaxillary +nasonite +nasoorbital +nasopalatal +nasopalatine +nasopharyngeal +nasopharynges +nasopharyngitis +nasopharynx +nasopharynxes +nasoprognathic +nasoprognathism +nasorostral +nasoscope +nasoseptal +nasosinuitis +nasosinusitis +nasosubnasal +nasoturbinal +nasrol +nassa +nassau +nassellaria +nassellarian +nassidae +nassology +nast +nastaliq +nasty +nastic +nastier +nastiest +nastika +nastily +nastiness +nasturtion +nasturtium +nasturtiums +nasua +nasus +nasute +nasuteness +nasutiform +nasutus +nat +natability +nataka +natal +natale +natalia +natalian +natalie +natalism +natalist +natality +natalitial +natalities +natally +nataloin +natals +natant +natantly +nataraja +natation +natational +natations +natator +natatores +natatory +natatoria +natatorial +natatorious +natatorium +natatoriums +natch +natchbone +natchez +natchezan +natchitoches +natchnee +nate +nates +nathan +nathanael +nathaniel +nathe +natheless +nathemo +nather +nathless +natica +naticidae +naticiform +naticine +natick +naticoid +natiform +natimortality +nation +national +nationaliser +nationalism +nationalist +nationalistic +nationalistically +nationalists +nationality +nationalities +nationalization +nationalizations +nationalize +nationalized +nationalizer +nationalizes +nationalizing +nationally +nationalness +nationals +nationalty +nationhood +nationless +nations +nationwide +native +natively +nativeness +natives +nativism +nativisms +nativist +nativistic +nativists +nativity +nativities +nativus +natl +nato +natr +natraj +natricinae +natricine +natrium +natriums +natriuresis +natriuretic +natrix +natrochalcite +natrojarosite +natrolite +natron +natrons +natt +natter +nattered +natteredness +nattering +natterjack +natters +natty +nattier +nattiest +nattily +nattiness +nattle +nattock +nattoria +natu +natuary +natura +naturae +natural +naturale +naturalesque +naturalia +naturalisation +naturalise +naturaliser +naturalism +naturalist +naturalistic +naturalistically +naturalists +naturality +naturalization +naturalizations +naturalize +naturalized +naturalizer +naturalizes +naturalizing +naturally +naturalness +naturals +naturata +nature +naturecraft +natured +naturedly +naturel +naturelike +natureliked +naturellement +natureopathy +natures +naturing +naturism +naturist +naturistic +naturistically +naturize +naturopath +naturopathy +naturopathic +naturopathist +natus +nauch +nauclerus +naucorid +naucrar +naucrary +naufrage +naufragous +naugahyde +nauger +naught +naughty +naughtier +naughtiest +naughtily +naughtiness +naughts +naujaite +naukrar +naulage +naulum +naumacay +naumachy +naumachia +naumachiae +naumachias +naumachies +naumannite +naumburgia +naumk +naumkeag +naumkeager +naunt +nauntle +naupathia +nauplial +naupliform +nauplii +naupliiform +nauplioid +nauplius +nauplplii +naur +nauropometer +nauscopy +nausea +nauseam +nauseant +nauseants +nauseaproof +nauseas +nauseate +nauseated +nauseates +nauseating +nauseatingly +nauseation +nauseous +nauseously +nauseousness +nauset +nauseum +nausity +naut +nautch +nautches +nauther +nautic +nautica +nautical +nauticality +nautically +nauticals +nautics +nautiform +nautilacea +nautilacean +nautili +nautilicone +nautiliform +nautilite +nautiloid +nautiloidea +nautiloidean +nautilus +nautiluses +nautophone +nav +navagium +navaho +navahoes +navahos +navaid +navaids +navajo +navajos +naval +navalese +navalism +navalist +navalistic +navalistically +navally +navar +navarch +navarchy +navarho +navarin +navarrese +navarrian +navars +nave +navel +naveled +navely +navellike +navels +navelwort +naveness +naves +navet +naveta +navete +navety +navette +navettes +navew +navi +navy +navicella +navicert +navicerts +navicula +naviculaceae +naviculaeform +navicular +naviculare +naviculoid +navies +naviform +navig +navigability +navigable +navigableness +navigably +navigant +navigate +navigated +navigates +navigating +navigation +navigational +navigationally +navigator +navigators +navigerous +navipendular +navipendulum +navis +navite +navvy +navvies +naw +nawab +nawabs +nawabship +nawies +nawle +nawob +nawt +nazarate +nazard +nazarean +nazarene +nazarenes +nazarenism +nazareth +nazarite +nazariteship +nazaritic +nazaritish +nazaritism +nazdrowie +naze +nazeranna +nazerini +nazi +nazify +nazification +nazified +nazifies +nazifying +naziism +nazim +nazir +nazirate +nazirite +naziritic +nazis +nazism +nb +nbg +nco +nd +ndoderm +ne +nea +neaf +neakes +neal +neallotype +neanderthal +neanderthaler +neanderthaloid +neanderthals +neanic +neanthropic +neap +neaped +neapolitan +neapolitans +neaps +near +nearable +nearabout +nearabouts +nearaivays +nearaway +nearaways +nearby +nearctic +nearctica +neared +nearer +nearest +nearing +nearish +nearly +nearlier +nearliest +nearmost +nearness +nearnesses +nears +nearshore +nearside +nearsight +nearsighted +nearsightedly +nearsightedness +nearthrosis +neascus +neat +neaten +neatened +neatening +neatens +neater +neatest +neath +neatherd +neatherdess +neatherds +neathmost +neatify +neatly +neatness +neatnesses +neats +neavil +neb +neback +nebaioth +nebalia +nebaliacea +nebalian +nebaliidae +nebalioid +nebbed +nebby +nebbish +nebbishes +nebbuck +nebbuk +nebel +nebelist +nebenkern +nebiim +nebraska +nebraskan +nebraskans +nebris +nebrodi +nebs +nebuchadnezzar +nebula +nebulae +nebular +nebularization +nebularize +nebulas +nebulated +nebulation +nebule +nebulescent +nebuly +nebuliferous +nebulisation +nebulise +nebulised +nebuliser +nebulises +nebulising +nebulite +nebulium +nebulization +nebulize +nebulized +nebulizer +nebulizers +nebulizes +nebulizing +nebulon +nebulose +nebulosity +nebulosities +nebulosus +nebulous +nebulously +nebulousness +necation +necator +necessar +necessary +necessarian +necessarianism +necessaries +necessarily +necessariness +necessarium +necessarius +necesse +necessism +necessist +necessitarian +necessitarianism +necessitate +necessitated +necessitatedly +necessitates +necessitating +necessitatingly +necessitation +necessitative +necessity +necessities +necessitous +necessitously +necessitousness +necessitude +necessitudo +necia +neck +neckar +neckatee +neckband +neckbands +neckcloth +necked +neckenger +necker +neckercher +neckerchief +neckerchiefs +neckerchieves +neckful +neckguard +necking +neckinger +neckings +neckyoke +necklace +necklaced +necklaces +necklaceweed +neckless +necklet +necklike +neckline +necklines +neckmold +neckmould +neckpiece +necks +neckstock +necktie +necktieless +neckties +neckward +neckwear +neckwears +neckweed +necraemia +necrectomy +necremia +necro +necrobacillary +necrobacillosis +necrobiosis +necrobiotic +necrogenic +necrogenous +necrographer +necrolatry +necrology +necrologic +necrological +necrologically +necrologies +necrologist +necrologue +necromancer +necromancers +necromancy +necromancing +necromania +necromantic +necromantical +necromantically +necromimesis +necromorphous +necronite +necropathy +necrophaga +necrophagan +necrophagy +necrophagia +necrophagous +necrophil +necrophile +necrophily +necrophilia +necrophiliac +necrophilic +necrophilism +necrophilistic +necrophilous +necrophobia +necrophobic +necrophorus +necropoleis +necropoles +necropoli +necropolis +necropolises +necropolitan +necropsy +necropsied +necropsies +necropsying +necroscopy +necroscopic +necroscopical +necrose +necrosed +necroses +necrosing +necrosis +necrotic +necrotically +necrotype +necrotypic +necrotise +necrotised +necrotising +necrotization +necrotize +necrotized +necrotizing +necrotomy +necrotomic +necrotomies +necrotomist +nectandra +nectar +nectareal +nectarean +nectared +nectareous +nectareously +nectareousness +nectary +nectarial +nectarian +nectaried +nectaries +nectariferous +nectarin +nectarine +nectarines +nectarinia +nectariniidae +nectarious +nectarise +nectarised +nectarising +nectarium +nectarivorous +nectarize +nectarized +nectarizing +nectarlike +nectarous +nectars +nectiferous +nectocalyces +nectocalycine +nectocalyx +necton +nectonema +nectophore +nectopod +nectria +nectriaceous +nectrioidaceae +nectron +necturidae +necturus +ned +nedder +neddy +neddies +nederlands +nee +neebor +neebour +need +needed +needer +needers +needfire +needful +needfully +needfulness +needfuls +needgates +needham +needy +needier +neediest +needily +neediness +needing +needle +needlebill +needlebook +needlebush +needlecase +needlecord +needlecraft +needled +needlefish +needlefishes +needleful +needlefuls +needlelike +needlemaker +needlemaking +needleman +needlemen +needlemonger +needlepoint +needlepoints +needleproof +needler +needlers +needles +needless +needlessly +needlessness +needlestone +needlewoman +needlewomen +needlewood +needlework +needleworked +needleworker +needly +needling +needlings +needment +needments +needn +neednt +needs +needsly +needsome +neeger +neela +neeld +neele +neelghan +neem +neemba +neems +neencephala +neencephalic +neencephalon +neencephalons +neengatu +neep +neepour +neeps +neer +neese +neet +neetup +neeze +nef +nefandous +nefandousness +nefarious +nefariously +nefariousness +nefas +nefast +nefastus +neffy +neftgil +neg +negara +negate +negated +negatedness +negater +negaters +negates +negating +negation +negational +negationalist +negationist +negations +negativate +negative +negatived +negatively +negativeness +negativer +negatives +negativing +negativism +negativist +negativistic +negativity +negaton +negatons +negator +negatory +negators +negatron +negatrons +neger +neginoth +neglect +neglectable +neglected +neglectedly +neglectedness +neglecter +neglectful +neglectfully +neglectfulness +neglecting +neglectingly +neglection +neglective +neglectively +neglector +neglectproof +neglects +neglig +neglige +negligee +negligees +negligence +negligency +negligent +negligentia +negligently +negliges +negligibility +negligible +negligibleness +negligibly +negoce +negotiability +negotiable +negotiables +negotiably +negotiant +negotiants +negotiate +negotiated +negotiates +negotiating +negotiation +negotiations +negotiator +negotiatory +negotiators +negotiatress +negotiatrix +negotiatrixes +negotious +negqtiator +negress +negrillo +negrine +negrita +negritian +negritic +negritize +negrito +negritoid +negritude +negro +negrodom +negroes +negrofy +negrohead +negrohood +negroid +negroidal +negroids +negroish +negroism +negroization +negroize +negrolike +negroloid +negrophil +negrophile +negrophilism +negrophilist +negrophobe +negrophobia +negrophobiac +negrophobist +negros +negrotic +negundo +negus +neguses +nehantic +nehemiah +nehiloth +nehru +nei +neyanda +neif +neifs +neigh +neighbor +neighbored +neighborer +neighboress +neighborhood +neighborhoods +neighboring +neighborless +neighborly +neighborlike +neighborlikeness +neighborliness +neighbors +neighborship +neighborstained +neighbour +neighboured +neighbourer +neighbouress +neighbourhood +neighbouring +neighbourless +neighbourly +neighbourlike +neighbourliness +neighbours +neighbourship +neighed +neigher +neighing +neighs +neil +neilah +neillia +nein +neiper +neisseria +neisserieae +neist +neither +nejd +nejdi +nek +nekkar +nekton +nektonic +nektons +nelken +nell +nelly +nellie +nelson +nelsonite +nelsons +nelumbian +nelumbium +nelumbo +nelumbonaceae +nelumbos +nema +nemaline +nemalion +nemalionaceae +nemalionales +nemalite +nemas +nemastomaceae +nematelmia +nematelminth +nematelminthes +nemathece +nemathecia +nemathecial +nemathecium +nemathelmia +nemathelminth +nemathelminthes +nematic +nematicidal +nematicide +nematoblast +nematoblastic +nematocera +nematoceran +nematocerous +nematocidal +nematocide +nematocyst +nematocystic +nematoda +nematode +nematodes +nematodiasis +nematogen +nematogene +nematogenic +nematogenous +nematognath +nematognathi +nematognathous +nematogone +nematogonous +nematoid +nematoidea +nematoidean +nematology +nematological +nematologist +nematomorpha +nematophyton +nematospora +nematozooid +nembutal +nembutsu +nemean +nemertea +nemertean +nemertian +nemertid +nemertina +nemertine +nemertinea +nemertinean +nemertini +nemertoid +nemeses +nemesia +nemesic +nemesis +nemichthyidae +nemichthys +nemine +nemo +nemocera +nemoceran +nemocerous +nemopanthus +nemophila +nemophily +nemophilist +nemophilous +nemoral +nemorensian +nemoricole +nemoricoline +nemoricolous +nemos +nempne +nenarche +nene +nenes +nengahiba +nenta +nenuphar +neo +neoacademic +neoanthropic +neoarctic +neoarsphenamine +neobalaena +neobeckia +neoblastic +neobotany +neobotanist +neocene +neoceratodus +neocerotic +neochristianity +neocyanine +neocyte +neocytosis +neoclassic +neoclassical +neoclassically +neoclassicism +neoclassicist +neoclassicists +neocolonial +neocolonialism +neocolonialist +neocolonialists +neocolonially +neocomian +neoconcretist +neoconservative +neoconstructivism +neoconstructivist +neocortex +neocortical +neocosmic +neocracy +neocriticism +neocubism +neocubist +neodadaism +neodadaist +neodamode +neodidymium +neodymium +neodiprion +neoexpressionism +neoexpressionist +neofabraea +neofascism +neofetal +neofetus +neofiber +neoformation +neoformative +neogaea +neogaean +neogamy +neogamous +neogene +neogenesis +neogenetic +neognathae +neognathic +neognathous +neogrammarian +neogrammatical +neographic +neohexane +neohipparion +neoholmia +neoholmium +neoimpressionism +neoimpressionist +neoytterbium +neolalia +neolater +neolatry +neolith +neolithic +neoliths +neology +neologian +neologianism +neologic +neological +neologically +neologies +neologise +neologised +neologising +neologism +neologisms +neologist +neologistic +neologistical +neologization +neologize +neologized +neologizing +neomedievalism +neomenia +neomenian +neomeniidae +neomycin +neomycins +neomylodon +neomiracle +neomodal +neomorph +neomorpha +neomorphic +neomorphism +neomorphs +neon +neonatal +neonatally +neonate +neonates +neonatology +neonatus +neoned +neoneds +neonychium +neonomian +neonomianism +neons +neontology +neoologist +neoorthodox +neoorthodoxy +neopagan +neopaganism +neopaganize +neopaleozoic +neopallial +neopallium +neoparaffin +neophilism +neophilological +neophilologist +neophyte +neophytes +neophytic +neophytish +neophytism +neophobia +neophobic +neophrastic +neophron +neopieris +neopine +neoplasia +neoplasm +neoplasma +neoplasmata +neoplasms +neoplasty +neoplastic +neoplasticism +neoplasticist +neoplasties +neoplatonic +neoplatonician +neoplatonism +neoplatonist +neoprene +neoprenes +neorama +neorealism +neornithes +neornithic +neosalvarsan +neosorex +neosporidia +neossin +neossine +neossology +neossoptile +neostigmine +neostyle +neostyled +neostyling +neostriatum +neoteinia +neoteinic +neoteny +neotenia +neotenic +neotenies +neotenous +neoteric +neoterical +neoterically +neoterics +neoterism +neoterist +neoteristic +neoterize +neoterized +neoterizing +neothalamus +neotype +neotypes +neotoma +neotraditionalism +neotraditionalist +neotragus +neotremata +neotropic +neotropical +neovitalism +neovolcanic +neowashingtonia +neoza +neozoic +nep +nepa +nepal +nepalese +nepali +nepenthaceae +nepenthaceous +nepenthe +nepenthean +nepenthes +neper +neperian +nepeta +nephalism +nephalist +nephalistic +nephanalysis +nephele +nepheligenous +nepheline +nephelinic +nephelinite +nephelinitic +nephelinitoid +nephelite +nephelium +nephelognosy +nepheloid +nephelometer +nephelometry +nephelometric +nephelometrical +nephelometrically +nephelorometer +nepheloscope +nephesh +nephew +nephews +nephewship +nephila +nephilim +nephilinae +nephionic +nephite +nephogram +nephograph +nephology +nephological +nephologist +nephometer +nephophobia +nephoscope +nephphridia +nephradenoma +nephralgia +nephralgic +nephrapostasis +nephratonia +nephrauxe +nephrectasia +nephrectasis +nephrectomy +nephrectomies +nephrectomise +nephrectomised +nephrectomising +nephrectomize +nephrectomized +nephrectomizing +nephrelcosis +nephremia +nephremphraxis +nephria +nephric +nephridia +nephridial +nephridiopore +nephridium +nephrism +nephrisms +nephrite +nephrites +nephritic +nephritical +nephritides +nephritis +nephritises +nephroabdominal +nephrocardiac +nephrocele +nephrocystitis +nephrocystosis +nephrocyte +nephrocoele +nephrocolic +nephrocolopexy +nephrocoloptosis +nephrodinic +nephrodium +nephroerysipelas +nephrogastric +nephrogenetic +nephrogenic +nephrogenous +nephrogonaduct +nephrohydrosis +nephrohypertrophy +nephroid +nephrolepis +nephrolysin +nephrolysis +nephrolith +nephrolithic +nephrolithosis +nephrolithotomy +nephrolithotomies +nephrolytic +nephrology +nephrologist +nephromalacia +nephromegaly +nephromere +nephron +nephroncus +nephrons +nephroparalysis +nephropathy +nephropathic +nephropexy +nephrophthisis +nephropyelitis +nephropyeloplasty +nephropyosis +nephropore +nephrops +nephropsidae +nephroptosia +nephroptosis +nephrorrhagia +nephrorrhaphy +nephros +nephrosclerosis +nephrosis +nephrostoma +nephrostome +nephrostomy +nephrostomial +nephrostomous +nephrotic +nephrotyphoid +nephrotyphus +nephrotome +nephrotomy +nephrotomies +nephrotomise +nephrotomize +nephrotoxic +nephrotoxicity +nephrotoxin +nephrotuberculosis +nephrozymosis +nepidae +nepionic +nepit +nepman +nepmen +nepotal +nepote +nepotic +nepotious +nepotism +nepotisms +nepotist +nepotistic +nepotistical +nepotistically +nepotists +nepouite +nepquite +neptune +neptunean +neptunian +neptunism +neptunist +neptunium +neral +nerd +nerds +nere +nereid +nereidae +nereidean +nereides +nereidiform +nereidiformia +nereidous +nereids +nereis +nereite +nereocystis +neri +nerine +nerita +nerite +neritic +neritidae +neritina +neritjc +neritoid +nerium +nerka +neroic +nerol +neroli +nerolis +nerols +neronian +neronic +neronize +nerterology +nerthridae +nerthrus +nerts +nertz +nerval +nervate +nervation +nervature +nerve +nerved +nerveless +nervelessly +nervelessness +nervelet +nerveproof +nerver +nerveroot +nerves +nervy +nervid +nerviduct +nervier +nerviest +nervii +nervily +nervimotion +nervimotor +nervimuscular +nervine +nervines +nerviness +nerving +nervings +nervish +nervism +nervomuscular +nervosa +nervosanguineous +nervose +nervosism +nervosity +nervosities +nervous +nervously +nervousness +nervular +nervule +nervules +nervulet +nervulose +nervuration +nervure +nervures +nervus +nescience +nescient +nescients +nese +nesh +neshly +neshness +nesiot +nesiote +neskhi +neslave +neslia +nesogaea +nesogaean +nesokia +nesonetta +nesosilicate +nesotragus +nespelim +nesquehonite +ness +nessberry +nesselrode +nesses +nesslerise +nesslerised +nesslerising +nesslerization +nesslerize +nesslerized +nesslerizing +nessus +nest +nestable +nestage +nested +nester +nesters +nestful +nesty +nestiatria +nesting +nestings +nestitherapy +nestle +nestled +nestler +nestlers +nestles +nestlike +nestling +nestlings +nestor +nestorian +nestorianism +nestorianize +nestorianizer +nestorine +nestors +nests +net +netball +netbraider +netbush +netcha +netchilik +nete +neter +netful +neth +netheist +nether +netherlander +netherlandian +netherlandic +netherlandish +netherlands +nethermore +nethermost +netherstock +netherstone +netherward +netherwards +netherworld +nethinim +neti +netkeeper +netleaf +netless +netlike +netmaker +netmaking +netman +netmen +netminder +netmonger +netop +netops +nets +netsman +netsuke +netsukes +nett +nettable +nettably +nettapus +netted +netter +netters +netty +nettie +nettier +nettiest +netting +nettings +nettion +nettle +nettlebed +nettlebird +nettled +nettlefire +nettlefish +nettlefoot +nettlelike +nettlemonger +nettler +nettlers +nettles +nettlesome +nettlewort +nettly +nettlier +nettliest +nettling +netts +netwise +network +networked +networking +networks +neudeckian +neugkroschen +neugroschen +neuk +neum +neuma +neumatic +neumatizce +neumatize +neume +neumes +neumic +neums +neurad +neuradynamia +neural +neurale +neuralgy +neuralgia +neuralgiac +neuralgias +neuralgic +neuralgiform +neuralist +neurally +neuraminidase +neurapophyseal +neurapophysial +neurapophysis +neurarthropathy +neurasthenia +neurasthenias +neurasthenic +neurasthenical +neurasthenically +neurasthenics +neurataxy +neurataxia +neuration +neuratrophy +neuratrophia +neuratrophic +neuraxial +neuraxis +neuraxitis +neuraxon +neuraxone +neuraxons +neurectasy +neurectasia +neurectasis +neurectome +neurectomy +neurectomic +neurectopy +neurectopia +neurenteric +neurepithelium +neurergic +neurexairesis +neurhypnology +neurhypnotist +neuriatry +neuric +neuridine +neurilema +neurilematic +neurilemma +neurilemmal +neurilemmatic +neurilemmatous +neurilemmitis +neurility +neurin +neurine +neurinoma +neurinomas +neurinomata +neurypnology +neurypnological +neurypnologist +neurism +neuristor +neurite +neuritic +neuritics +neuritides +neuritis +neuritises +neuroactive +neuroanatomy +neuroanatomic +neuroanatomical +neuroanatomist +neuroanotomy +neurobiology +neurobiological +neurobiologist +neurobiotactic +neurobiotaxis +neuroblast +neuroblastic +neuroblastoma +neurocanal +neurocardiac +neurocele +neurocelian +neurocental +neurocentral +neurocentrum +neurochemical +neurochemist +neurochemistry +neurochitin +neurochondrite +neurochord +neurochorioretinitis +neurocirculator +neurocirculatory +neurocyte +neurocity +neurocytoma +neuroclonic +neurocoel +neurocoele +neurocoelian +neurocrine +neurocrinism +neurodegenerative +neurodendrite +neurodendron +neurodermatitis +neurodermatosis +neurodermitis +neurodiagnosis +neurodynamic +neurodynia +neuroelectricity +neuroembryology +neuroembryological +neuroendocrine +neuroendocrinology +neuroepidermal +neuroepithelial +neuroepithelium +neurofibril +neurofibrilla +neurofibrillae +neurofibrillar +neurofibrillary +neurofibroma +neurofibromatosis +neurofil +neuroganglion +neurogastralgia +neurogastric +neurogenesis +neurogenetic +neurogenic +neurogenically +neurogenous +neuroglandular +neuroglia +neurogliac +neuroglial +neurogliar +neuroglic +neuroglioma +neurogliosis +neurogram +neurogrammic +neurography +neurographic +neurohypnology +neurohypnotic +neurohypnotism +neurohypophyseal +neurohypophysial +neurohypophysis +neurohistology +neurohormonal +neurohormone +neurohumor +neurohumoral +neuroid +neurokeratin +neurokyme +neurol +neurolemma +neuroleptanalgesia +neuroleptanalgesic +neuroleptic +neuroleptoanalgesia +neurolymph +neurolysis +neurolite +neurolytic +neurology +neurologic +neurological +neurologically +neurologies +neurologist +neurologists +neurologize +neurologized +neuroma +neuromalacia +neuromalakia +neuromas +neuromast +neuromastic +neuromata +neuromatosis +neuromatous +neuromere +neuromerism +neuromerous +neuromyelitis +neuromyic +neuromimesis +neuromimetic +neuromotor +neuromuscular +neuromusculature +neuron +neuronal +neurone +neurones +neuronic +neuronym +neuronymy +neuronism +neuronist +neuronophagy +neuronophagia +neurons +neuroparalysis +neuroparalytic +neuropath +neuropathy +neuropathic +neuropathical +neuropathically +neuropathist +neuropathology +neuropathological +neuropathologist +neurope +neurophagy +neuropharmacology +neuropharmacologic +neuropharmacological +neuropharmacologist +neurophil +neurophile +neurophilic +neurophysiology +neurophysiologic +neurophysiological +neurophysiologically +neurophysiologist +neuropil +neuropile +neuroplasm +neuroplasmatic +neuroplasmic +neuroplasty +neuroplexus +neuropod +neuropodial +neuropodium +neuropodous +neuropore +neuropsychiatry +neuropsychiatric +neuropsychiatrically +neuropsychiatrist +neuropsychic +neuropsychical +neuropsychology +neuropsychological +neuropsychologist +neuropsychopathy +neuropsychopathic +neuropsychosis +neuropter +neuroptera +neuropteran +neuropteris +neuropterist +neuropteroid +neuropteroidea +neuropterology +neuropterological +neuropteron +neuropterous +neuroretinitis +neurorrhaphy +neurorthoptera +neurorthopteran +neurorthopterous +neurosal +neurosarcoma +neuroscience +neuroscientist +neurosclerosis +neurosecretion +neurosecretory +neurosensory +neuroses +neurosynapse +neurosyphilis +neurosis +neuroskeletal +neuroskeleton +neurosome +neurospasm +neurospast +neurospongium +neurospora +neurosthenia +neurosurgeon +neurosurgery +neurosurgeries +neurosurgical +neurosuture +neurotendinous +neurotension +neurotherapeutics +neurotherapy +neurotherapist +neurothlipsis +neurotic +neurotically +neuroticism +neuroticize +neurotics +neurotization +neurotome +neurotomy +neurotomical +neurotomist +neurotomize +neurotonic +neurotoxia +neurotoxic +neurotoxicity +neurotoxin +neurotransmission +neurotransmitter +neurotransmitters +neurotripsy +neurotrophy +neurotrophic +neurotropy +neurotropic +neurotropism +neurovaccination +neurovaccine +neurovascular +neurovisceral +neurual +neurula +neustic +neuston +neustonic +neustons +neustrian +neut +neuter +neutercane +neuterdom +neutered +neutering +neuterly +neuterlike +neuterness +neuters +neutral +neutralise +neutralism +neutralist +neutralistic +neutralists +neutrality +neutralities +neutralization +neutralizations +neutralize +neutralized +neutralizer +neutralizers +neutralizes +neutralizing +neutrally +neutralness +neutrals +neutretto +neutrettos +neutria +neutrino +neutrinos +neutroceptive +neutroceptor +neutroclusion +neutrodyne +neutrologistic +neutron +neutrons +neutropassive +neutropenia +neutrophil +neutrophile +neutrophilia +neutrophilic +neutrophilous +neutrophils +neutrosphere +nevada +nevadan +nevadans +nevadians +nevadite +nevat +neve +nevel +nevell +neven +never +neverland +nevermass +nevermind +nevermore +neverness +neverthelater +nevertheless +neves +nevi +nevyanskite +neville +nevo +nevoy +nevoid +nevome +nevus +new +newar +newari +newark +newberyite +newborn +newbornness +newborns +newburg +newcal +newcastle +newcome +newcomer +newcomers +newel +newels +newelty +newer +newest +newfangle +newfangled +newfangledism +newfangledly +newfangledness +newfanglement +newfangleness +newfashioned +newfish +newfound +newfoundland +newfoundlander +newgate +newground +newichawanoc +newing +newings +newish +newlandite +newly +newlight +newline +newlines +newlings +newlins +newlywed +newlyweds +newmanism +newmanite +newmanize +newmarket +newmown +newness +newnesses +newport +news +newsagent +newsbeat +newsbill +newsboard +newsboat +newsboy +newsboys +newsbreak +newscast +newscaster +newscasters +newscasting +newscasts +newsdealer +newsdealers +newsful +newsgirl +newsgirls +newsgroup +newshawk +newshen +newshound +newsy +newsier +newsies +newsiest +newsiness +newsless +newslessness +newsletter +newsletters +newsmagazine +newsman +newsmanmen +newsmen +newsmonger +newsmongery +newsmongering +newspaper +newspaperdom +newspaperese +newspapery +newspaperish +newspaperized +newspaperman +newspapermen +newspapers +newspaperwoman +newspaperwomen +newspeak +newspeaks +newsprint +newsreader +newsreel +newsreels +newsroom +newsrooms +newssheet +newsstand +newsstands +newstand +newstands +newsteller +newsvendor +newsweek +newswoman +newswomen +newsworthy +newsworthiness +newswriter +newswriting +newt +newtake +newton +newtonian +newtonianism +newtonic +newtonist +newtonite +newtons +newts +nexal +next +nextdoor +nextly +nextness +nexum +nexus +nexuses +ng +ngai +ngaio +ngapi +ngoko +ngoma +nguyen +ngwee +nhan +nheengatu +ni +ny +niacin +niacinamide +niacins +niagara +niagaran +niagra +nyaya +niais +niaiserie +nyala +nialamide +nyalas +niall +nyamwezi +nyanja +niantic +nyanza +nias +nyas +niasese +niata +nib +nibbana +nibbed +nibber +nibby +nibbing +nibble +nybble +nibbled +nibbler +nibblers +nibbles +nybbles +nibbling +nibblingly +nybblize +nibelung +niblic +niblick +niblicks +niblike +nibong +nibs +nibsome +nibung +nicaean +nicaragua +nicaraguan +nicaraguans +nicarao +niccolic +niccoliferous +niccolite +niccolo +niccolous +nice +niceish +nicely +niceling +nicene +niceness +nicenesses +nicenian +nicenist +nicer +nicesome +nicest +nicety +niceties +nicetish +nichael +niche +niched +nichelino +nicher +niches +nichevo +nichil +niching +nicholas +nichrome +nicht +nychthemer +nychthemeral +nychthemeron +nichts +nici +nick +nickar +nicked +nickey +nickeys +nickel +nickelage +nickelbloom +nickeled +nyckelharpa +nickelic +nickeliferous +nickeline +nickeling +nickelise +nickelised +nickelising +nickelization +nickelize +nickelized +nickelizing +nickelled +nickellike +nickelling +nickelodeon +nickelodeons +nickelous +nickels +nickeltype +nicker +nickered +nickery +nickering +nickerpecker +nickers +nicky +nickie +nickieben +nicking +nickle +nickles +nicknack +nicknacks +nickname +nicknameable +nicknamed +nicknamee +nicknameless +nicknamer +nicknames +nicknaming +nickneven +nickpoint +nickpot +nicks +nickstick +nickum +nicobar +nicobarese +nicodemite +nicodemus +nicol +nicolayite +nicolaitan +nicolaitanism +nicolas +nicolette +nicolo +nicols +nicomachean +nicotia +nicotian +nicotiana +nicotianin +nicotic +nicotin +nicotina +nicotinamide +nicotine +nicotinean +nicotined +nicotineless +nicotines +nicotinian +nicotinic +nicotinise +nicotinised +nicotinising +nicotinism +nicotinize +nicotinized +nicotinizing +nicotins +nicotism +nicotize +nyctaginaceae +nyctaginaceous +nyctaginia +nyctalgia +nyctalope +nyctalopy +nyctalopia +nyctalopic +nyctalops +nyctanthes +nictate +nictated +nictates +nictating +nictation +nyctea +nyctereutes +nycteribiid +nycteribiidae +nycteridae +nycterine +nycteris +nycticorax +nyctimene +nyctinasty +nyctinastic +nyctipelagic +nyctipithecinae +nyctipithecine +nyctipithecus +nictitant +nictitate +nictitated +nictitates +nictitating +nictitation +nyctitropic +nyctitropism +nyctophobia +nycturia +nid +nidal +nidamental +nidana +nidary +nidation +nidatory +nidder +niddering +niddick +niddicock +niddle +nide +nided +nidering +niderings +nides +nidge +nidget +nidgety +nidgets +nidi +nydia +nidicolous +nidify +nidificant +nidificate +nidificated +nidificating +nidification +nidificational +nidified +nidifier +nidifies +nidifying +nidifugous +niding +nidiot +nidology +nidologist +nidor +nidorose +nidorosity +nidorous +nidorulent +nidudi +nidulant +nidularia +nidulariaceae +nidulariaceous +nidulariales +nidulate +nidulation +niduli +nidulus +nidus +niduses +nye +niece +nieceless +nieces +nieceship +niellated +nielled +nielli +niellist +niellists +niello +nielloed +nielloing +niellos +niels +nielsen +niepa +nierembergia +niersteiner +nies +nieshout +nyet +nietzsche +nietzschean +nietzscheanism +nietzscheism +nieve +nieves +nieveta +nievling +nife +nifesima +niff +niffer +niffered +niffering +niffers +nific +nifle +niflheim +nifling +nifty +niftier +nifties +niftiest +niftiness +nig +nigel +nigella +nigeria +nigerian +nigerians +niggard +niggarded +niggarding +niggardise +niggardised +niggardising +niggardize +niggardized +niggardizing +niggardly +niggardliness +niggardling +niggardness +niggards +nigged +nigger +niggerdom +niggered +niggerfish +niggerfishes +niggergoose +niggerhead +niggery +niggerish +niggerism +niggerling +niggers +niggertoe +niggerweed +nigget +nigging +niggle +niggled +niggler +nigglers +niggles +niggly +niggling +nigglingly +nigglings +niggot +niggra +niggun +nigh +nighed +nigher +nighest +nighhand +nighing +nighish +nighly +nighness +nighnesses +nighs +night +nightcap +nightcapped +nightcaps +nightchurr +nightclothes +nightclub +nightclubber +nightclubs +nightcrawler +nightcrawlers +nightdress +nighted +nighter +nightery +nighters +nightertale +nightfall +nightfalls +nightfish +nightflit +nightfowl +nightgale +nightglass +nightglow +nightgown +nightgowns +nighthawk +nighthawks +nighty +nightie +nighties +nightime +nighting +nightingale +nightingales +nightingalize +nightish +nightjar +nightjars +nightless +nightlessness +nightly +nightlife +nightlike +nightlong +nightman +nightmare +nightmares +nightmary +nightmarish +nightmarishly +nightmarishness +nightmen +nightrider +nightriders +nightriding +nights +nightshade +nightshades +nightshine +nightshirt +nightshirts +nightside +nightspot +nightspots +nightstand +nightstands +nightstick +nightstock +nightstool +nighttide +nighttime +nighttimes +nightwake +nightwalk +nightwalker +nightwalkers +nightwalking +nightward +nightwards +nightwear +nightwork +nightworker +nignay +nignye +nigori +nigranilin +nigraniline +nigre +nigrescence +nigrescent +nigresceous +nigrescite +nigricant +nigrify +nigrification +nigrified +nigrifies +nigrifying +nigrine +nigritian +nigrities +nigritude +nigritudinous +nigromancer +nigrosin +nigrosine +nigrosins +nigrous +nigua +nihal +nihil +nihilianism +nihilianistic +nihilify +nihilification +nihilism +nihilisms +nihilist +nihilistic +nihilistically +nihilists +nihility +nihilitic +nihilities +nihilobstat +nihils +nihilum +niyama +niyanda +niyoga +nijholt +nijinsky +nikau +nike +nikeno +nikethamide +nikko +nikkud +nikkudim +niklesite +nikolai +nikon +nil +nylast +nile +nilgai +nilgais +nilgau +nylgau +nilgaus +nilghai +nylghai +nilghais +nylghais +nilghau +nylghau +nilghaus +nylghaus +nill +nilled +nilling +nills +nilometer +nilometric +nylon +nylons +niloscope +nilot +nilotic +nilous +nilpotent +nils +nim +nimb +nimbated +nimbed +nimbi +nimbiferous +nimbification +nimble +nimblebrained +nimbleness +nimbler +nimblest +nimblewit +nimbly +nimbose +nimbosity +nimbostratus +nimbus +nimbused +nimbuses +nimiety +nimieties +nymil +niminy +nimious +nimkish +nimmed +nimmer +nimming +nymph +nympha +nymphae +nymphaea +nymphaeaceae +nymphaeaceous +nymphaeum +nymphal +nymphalid +nymphalidae +nymphalinae +nymphaline +nympheal +nymphean +nymphet +nymphets +nymphette +nympheum +nymphic +nymphical +nymphid +nymphine +nymphipara +nymphiparous +nymphish +nymphitis +nymphly +nymphlike +nymphlin +nympho +nymphoides +nympholepsy +nympholepsia +nympholepsies +nympholept +nympholeptic +nymphomania +nymphomaniac +nymphomaniacal +nymphomaniacs +nymphon +nymphonacea +nymphos +nymphosis +nymphotomy +nymphs +nymphwise +nimrod +nimrodian +nimrodic +nimrodical +nimrodize +nimrods +nims +nimshi +nymss +nina +nincom +nincompoop +nincompoopery +nincompoophood +nincompoopish +nincompoops +nincum +nine +ninebark +ninebarks +ninefold +nineholes +ninepegs +ninepence +ninepences +ninepenny +ninepennies +ninepin +ninepins +nines +ninescore +nineted +nineteen +nineteenfold +nineteens +nineteenth +nineteenthly +nineteenths +ninety +nineties +ninetieth +ninetieths +ninetyfold +ninetyish +ninetyknot +ninevite +ninevitical +ninevitish +ning +ningle +ningpo +ninhydrin +ninja +ninny +ninnies +ninnyhammer +ninnyish +ninnyism +ninnyship +ninnywatch +ninon +ninons +ninos +ninox +ninth +ninthly +ninths +nintu +ninut +niobate +niobe +niobean +niobic +niobid +niobite +niobium +niobiums +niobous +niog +nyoro +niota +nip +nipa +nipas +nipcheese +niphablepsia +nyphomania +niphotyphlosis +nipissing +nipmuc +nipmuck +nipped +nipper +nipperkin +nippers +nippy +nippier +nippiest +nippily +nippiness +nipping +nippingly +nippitate +nippitaty +nippitato +nippitatum +nipple +nippled +nippleless +nipples +nipplewort +nippling +nippon +nipponese +nipponism +nipponium +nipponize +nips +nipter +niquiran +niris +nirles +nirls +nirmanakaya +nyroca +nirvana +nirvanas +nirvanic +nis +nisaean +nisan +nisberry +nisei +niseis +nishada +nishiki +nisi +nisnas +nispero +nisqualli +nyssa +nyssaceae +nisse +nist +nystagmic +nystagmus +nystatin +nisus +nit +nitch +nitchevo +nitchie +nitchies +nitella +nitency +nitent +nitently +niter +niterbush +nitered +nitery +nitering +niters +nither +nithing +nitid +nitidous +nitidulid +nitidulidae +nitinol +nito +niton +nitons +nitos +nitpick +nitpicked +nitpicker +nitpickers +nitpicking +nitpicks +nitramin +nitramine +nitramino +nitranilic +nitraniline +nitrate +nitrated +nitrates +nitratine +nitrating +nitration +nitrator +nitrators +nitre +nitred +nitres +nitrian +nitriary +nitriaries +nitric +nitrid +nitridation +nitride +nitrides +nitriding +nitridization +nitridize +nitrids +nitrifaction +nitriferous +nitrify +nitrifiable +nitrification +nitrified +nitrifier +nitrifies +nitrifying +nitril +nitryl +nytril +nitrile +nitriles +nitrils +nitriot +nitriry +nitrite +nitrites +nitritoid +nitro +nitroalizarin +nitroamine +nitroanilin +nitroaniline +nitrobacter +nitrobacteria +nitrobacteriaceae +nitrobacterieae +nitrobacterium +nitrobarite +nitrobenzene +nitrobenzol +nitrobenzole +nitrocalcite +nitrocellulose +nitrocellulosic +nitrochloroform +nitrocotton +nitroform +nitrofuran +nitrogelatin +nitrogelatine +nitrogen +nitrogenate +nitrogenation +nitrogenic +nitrogenisation +nitrogenise +nitrogenised +nitrogenising +nitrogenization +nitrogenize +nitrogenized +nitrogenizing +nitrogenous +nitrogens +nitroglycerin +nitroglycerine +nitroglucose +nitrohydrochloric +nitrolamine +nitrolic +nitrolim +nitrolime +nitromagnesite +nitromannite +nitromannitol +nitromersol +nitrometer +nitromethane +nitrometric +nitromuriate +nitromuriatic +nitronaphthalene +nitroparaffin +nitrophenol +nitrophile +nitrophilous +nitrophyte +nitrophytic +nitroprussiate +nitroprussic +nitroprusside +nitros +nitrosamin +nitrosamine +nitrosate +nitrosify +nitrosification +nitrosyl +nitrosyls +nitrosylsulfuric +nitrosylsulphuric +nitrosite +nitroso +nitrosoamine +nitrosobacteria +nitrosobacterium +nitrosochloride +nitrosococcus +nitrosomonas +nitrososulphuric +nitrostarch +nitrosulphate +nitrosulphonic +nitrosulphuric +nitrotoluene +nitrotoluol +nitrotrichloromethane +nitrous +nitroxyl +nits +nitta +nitter +nitty +nittier +nittiest +nitwit +nitwits +nitwitted +nitzschia +nitzschiaceae +niuan +niue +nival +nivation +niveau +nivellate +nivellation +nivellator +nivellization +nivenite +niveous +nivernaise +nivicolous +nivosity +nix +nixe +nixed +nixer +nixes +nixy +nixie +nixies +nixing +nyxis +nixon +nixtamal +nizam +nizamat +nizamate +nizamates +nizams +nizamut +nizey +nizy +nj +njave +nl +nm +nnethermore +no +noa +noachian +noachic +noachical +noachite +noah +noahic +noam +noance +nob +nobackspace +nobatch +nobber +nobby +nobbier +nobbiest +nobbily +nobble +nobbled +nobbler +nobblers +nobbles +nobbling +nobbut +nobel +nobelist +nobelists +nobelium +nobeliums +nobiliary +nobilify +nobilitate +nobilitation +nobility +nobilities +nobis +noble +nobled +noblehearted +nobleheartedly +nobleheartedness +nobley +nobleman +noblemanly +noblemem +noblemen +nobleness +nobler +nobles +noblesse +noblesses +noblest +noblewoman +noblewomen +nobly +noblify +nobling +nobody +nobodyd +nobodies +nobodyness +nobs +nobut +nocake +nocardia +nocardiosis +nocence +nocent +nocerite +nocht +nociassociation +nociceptive +nociceptor +nociperception +nociperceptive +nocive +nock +nocked +nockerl +nocket +nocking +nocks +nocktat +noconfirm +noctambulant +noctambulate +noctambulation +noctambule +noctambulism +noctambulist +noctambulistic +noctambulous +nocten +noctidial +noctidiurnal +noctiferous +noctiflorous +noctilio +noctilionidae +noctiluca +noctilucae +noctilucal +noctilucan +noctilucence +noctilucent +noctilucidae +noctilucin +noctilucine +noctilucous +noctiluminous +noctiluscence +noctimania +noctipotent +noctis +noctivagant +noctivagation +noctivagous +noctograph +noctovision +noctua +noctuae +noctuid +noctuidae +noctuideous +noctuidous +noctuids +noctuiform +noctule +noctules +noctuoid +nocturia +nocturn +nocturnal +nocturnality +nocturnally +nocturne +nocturnes +nocturns +nocuity +nocument +nocumentum +nocuous +nocuously +nocuousness +nod +nodal +nodality +nodalities +nodally +nodated +nodded +nodder +nodders +noddi +noddy +noddies +nodding +noddingly +noddle +noddlebone +noddled +noddles +noddling +node +noded +nodes +nodi +nodiak +nodical +nodicorn +nodiferous +nodiflorous +nodiform +nodosaria +nodosarian +nodosariform +nodosarine +nodosaur +nodose +nodosity +nodosities +nodous +nods +nodular +nodulate +nodulated +nodulation +nodule +noduled +nodules +noduli +nodulize +nodulized +nodulizing +nodulose +nodulous +nodulus +nodus +noebcd +noecho +noegenesis +noegenetic +noel +noels +noematachograph +noematachometer +noematachometic +noematical +noemi +noerror +noes +noesis +noesises +noetian +noetic +noetics +noex +noexecute +nofile +nog +nogada +nogai +nogaku +nogal +nogg +nogged +noggen +noggin +nogging +noggings +noggins +noggs +noghead +nogheaded +nogs +noh +nohex +nohow +nohuntsik +noy +noyade +noyaded +noyades +noyading +noyance +noyant +noyau +noibwood +noyful +noil +noilage +noiler +noily +noils +noint +nointment +noyous +noir +noire +noires +noisance +noise +noised +noiseful +noisefully +noisefulness +noiseless +noiselessly +noiselessness +noisemake +noisemaker +noisemakers +noisemaking +noiseproof +noises +noisette +noisy +noisier +noisiest +noisily +noisiness +noising +noisome +noisomely +noisomeness +noix +nokta +nol +nolascan +nold +nolition +noll +nolle +nolleity +nollepros +nolo +nolos +nolt +nom +noma +nomad +nomade +nomades +nomadian +nomadic +nomadical +nomadically +nomadidae +nomadise +nomadism +nomadisms +nomadization +nomadize +nomads +nomancy +nomap +nomarch +nomarchy +nomarchies +nomarchs +nomarthra +nomarthral +nomas +nombles +nombril +nombrils +nome +nomeidae +nomen +nomenclate +nomenclative +nomenclator +nomenclatory +nomenclatorial +nomenclatorship +nomenclatural +nomenclature +nomenclatures +nomenclaturist +nomes +nomeus +nomial +nomic +nomina +nominable +nominal +nominalism +nominalist +nominalistic +nominalistical +nominalistically +nominality +nominalize +nominalized +nominalizing +nominally +nominalness +nominals +nominate +nominated +nominately +nominates +nominating +nomination +nominations +nominatival +nominative +nominatively +nominatives +nominator +nominators +nominatrix +nominature +nomine +nominee +nomineeism +nominees +nominy +nomism +nomisma +nomismata +nomisms +nomistic +nomnem +nomocanon +nomocracy +nomogeny +nomogenist +nomogenous +nomogram +nomograms +nomograph +nomographer +nomography +nomographic +nomographical +nomographically +nomographies +nomoi +nomology +nomological +nomologies +nomologist +nomopelmous +nomophylax +nomophyllous +nomos +nomotheism +nomothete +nomothetes +nomothetic +nomothetical +noms +non +nona +nonabandonment +nonabatable +nonabdication +nonabdicative +nonabiding +nonabidingly +nonabidingness +nonability +nonabjuration +nonabjuratory +nonabjurer +nonabolition +nonabortive +nonabortively +nonabortiveness +nonabrasive +nonabrasively +nonabrasiveness +nonabridgable +nonabridgment +nonabrogable +nonabsentation +nonabsolute +nonabsolutely +nonabsoluteness +nonabsolution +nonabsolutist +nonabsolutistic +nonabsolutistically +nonabsorbability +nonabsorbable +nonabsorbency +nonabsorbent +nonabsorbents +nonabsorbing +nonabsorption +nonabsorptive +nonabstainer +nonabstainers +nonabstaining +nonabstemious +nonabstemiously +nonabstemiousness +nonabstention +nonabstract +nonabstracted +nonabstractedly +nonabstractedness +nonabstractly +nonabstractness +nonabusive +nonabusively +nonabusiveness +nonacademic +nonacademical +nonacademically +nonacademicalness +nonacademics +nonaccedence +nonacceding +nonacceleration +nonaccelerative +nonacceleratory +nonaccent +nonaccented +nonaccenting +nonaccentual +nonaccentually +nonacceptance +nonacceptant +nonacceptation +nonaccepted +nonaccess +nonaccession +nonaccessory +nonaccessories +nonaccidental +nonaccidentally +nonaccidentalness +nonaccommodable +nonaccommodably +nonaccommodating +nonaccommodatingly +nonaccommodatingness +nonaccompanying +nonaccompaniment +nonaccomplishment +nonaccord +nonaccordant +nonaccordantly +nonaccredited +nonaccretion +nonaccretive +nonaccrued +nonaccruing +nonacculturated +nonaccumulating +nonaccumulation +nonaccumulative +nonaccumulatively +nonaccumulativeness +nonaccusing +nonachievement +nonacid +nonacidic +nonacidity +nonacids +nonacknowledgment +nonacosane +nonacoustic +nonacoustical +nonacoustically +nonacquaintance +nonacquaintanceship +nonacquiescence +nonacquiescent +nonacquiescently +nonacquiescing +nonacquisitive +nonacquisitively +nonacquisitiveness +nonacquittal +nonact +nonactinic +nonactinically +nonaction +nonactionable +nonactionably +nonactivation +nonactivator +nonactive +nonactives +nonactivity +nonactivities +nonactual +nonactuality +nonactualities +nonactualness +nonacuity +nonaculeate +nonaculeated +nonacute +nonacutely +nonacuteness +nonadaptability +nonadaptable +nonadaptableness +nonadaptabness +nonadaptation +nonadaptational +nonadapter +nonadapting +nonadaptive +nonadaptor +nonaddict +nonaddicted +nonaddicting +nonaddictive +nonadditive +nonadditivity +nonaddress +nonaddresser +nonadecane +nonadept +nonadeptly +nonadeptness +nonadherence +nonadherent +nonadhering +nonadhesion +nonadhesive +nonadhesively +nonadhesiveness +nonadjacency +nonadjacencies +nonadjacent +nonadjacently +nonadjectival +nonadjectivally +nonadjectively +nonadjoining +nonadjournment +nonadjudicated +nonadjudication +nonadjudicative +nonadjudicatively +nonadjunctive +nonadjunctively +nonadjustability +nonadjustable +nonadjustably +nonadjuster +nonadjustive +nonadjustment +nonadjustor +nonadministrable +nonadministrant +nonadministrative +nonadministratively +nonadmiring +nonadmissibility +nonadmissible +nonadmissibleness +nonadmissibly +nonadmission +nonadmissions +nonadmissive +nonadmitted +nonadmittedly +nonadoptable +nonadopter +nonadoption +nonadorantes +nonadorner +nonadorning +nonadornment +nonadult +nonadults +nonadvancement +nonadvantageous +nonadvantageously +nonadvantageousness +nonadventitious +nonadventitiously +nonadventitiousness +nonadventurous +nonadventurously +nonadventurousness +nonadverbial +nonadverbially +nonadvertence +nonadvertency +nonadvocacy +nonadvocate +nonaerated +nonaerating +nonaerobiotic +nonaesthetic +nonaesthetical +nonaesthetically +nonaffectation +nonaffecting +nonaffectingly +nonaffection +nonaffective +nonaffiliated +nonaffiliating +nonaffiliation +nonaffilliated +nonaffinity +nonaffinities +nonaffinitive +nonaffirmance +nonaffirmation +nonage +nonagenary +nonagenarian +nonagenarians +nonagenaries +nonagency +nonagent +nonages +nonagesimal +nonagglomerative +nonagglutinant +nonagglutinating +nonagglutinative +nonagglutinator +nonaggression +nonaggressive +nonagon +nonagons +nonagrarian +nonagreeable +nonagreement +nonagricultural +nonahydrate +nonaid +nonair +nonalarmist +nonalcohol +nonalcoholic +nonalgebraic +nonalgebraical +nonalgebraically +nonalien +nonalienating +nonalienation +nonalignable +nonaligned +nonalignment +nonalined +nonalinement +nonalkaloid +nonalkaloidal +nonallegation +nonallegiance +nonallegoric +nonallegorical +nonallegorically +nonallelic +nonallergenic +nonalliterated +nonalliterative +nonalliteratively +nonalliterativeness +nonallotment +nonalluvial +nonalphabetic +nonalphabetical +nonalphabetically +nonalternating +nonaltruistic +nonaltruistically +nonaluminous +nonamalgamable +nonamazedness +nonamazement +nonambiguity +nonambiguities +nonambiguous +nonambitious +nonambitiously +nonambitiousness +nonambulaties +nonambulatory +nonamenability +nonamenable +nonamenableness +nonamenably +nonamendable +nonamendment +nonamino +nonamorous +nonamorously +nonamorousness +nonamotion +nonamphibian +nonamphibious +nonamphibiously +nonamphibiousness +nonamputation +nonanachronistic +nonanachronistically +nonanachronous +nonanachronously +nonanaemic +nonanalytic +nonanalytical +nonanalytically +nonanalyzable +nonanalyzed +nonanalogy +nonanalogic +nonanalogical +nonanalogically +nonanalogicalness +nonanalogous +nonanalogously +nonanalogousness +nonanaphoric +nonanaphthene +nonanarchic +nonanarchical +nonanarchically +nonanarchistic +nonanatomic +nonanatomical +nonanatomically +nonancestral +nonancestrally +nonane +nonanemic +nonanesthetic +nonanesthetized +nonangelic +nonangling +nonanguished +nonanimal +nonanimality +nonanimate +nonanimated +nonanimating +nonanimatingly +nonanimation +nonannexable +nonannexation +nonannihilability +nonannihilable +nonannouncement +nonannuitant +nonannulment +nonanoic +nonanonymity +nonanonymousness +nonanswer +nonantagonistic +nonantagonistically +nonanticipation +nonanticipative +nonanticipatively +nonanticipatory +nonanticipatorily +nonantigenic +nonaphasiac +nonaphasic +nonaphetic +nonaphoristic +nonaphoristically +nonapologetic +nonapologetical +nonapologetically +nonapostatizing +nonapostolic +nonapostolical +nonapostolically +nonapparent +nonapparently +nonapparentness +nonapparitional +nonappealability +nonappealable +nonappealing +nonappealingly +nonappealingness +nonappearance +nonappearances +nonappearer +nonappearing +nonappeasability +nonappeasable +nonappeasing +nonappellate +nonappendance +nonappendant +nonappendence +nonappendent +nonappendicular +nonapply +nonapplicability +nonapplicable +nonapplicableness +nonapplicabness +nonapplication +nonapplicative +nonapplicatory +nonappointive +nonappointment +nonapportionable +nonapportionment +nonapposable +nonappraisal +nonappreciation +nonappreciative +nonappreciatively +nonappreciativeness +nonapprehensibility +nonapprehensible +nonapprehension +nonapprehensive +nonapproachability +nonapproachable +nonapproachableness +nonapproachabness +nonappropriable +nonappropriation +nonappropriative +nonapproval +nonaquatic +nonaqueous +nonarbitrable +nonarbitrary +nonarbitrarily +nonarbitrariness +nonarching +nonarchitectonic +nonarchitectural +nonarchitecturally +nonarcing +nonarcking +nonargentiferous +nonarguable +nonargumentative +nonargumentatively +nonargumentativeness +nonary +nonaries +nonaristocratic +nonaristocratical +nonaristocratically +nonarithmetic +nonarithmetical +nonarithmetically +nonarmament +nonarmigerous +nonaromatic +nonaromatically +nonarraignment +nonarresting +nonarrival +nonarrogance +nonarrogancy +nonarsenic +nonarsenical +nonarterial +nonartesian +nonarticulate +nonarticulated +nonarticulately +nonarticulateness +nonarticulation +nonarticulative +nonartistic +nonartistical +nonartistically +nonas +nonasbestine +nonascendance +nonascendancy +nonascendant +nonascendantly +nonascendence +nonascendency +nonascendent +nonascendently +nonascertainable +nonascertainableness +nonascertainably +nonascertaining +nonascertainment +nonascetic +nonascetical +nonascetically +nonasceticism +nonascription +nonaseptic +nonaseptically +nonaspersion +nonasphalt +nonaspirate +nonaspirated +nonaspirating +nonaspiratory +nonaspiring +nonassault +nonassent +nonassentation +nonassented +nonassenting +nonassertion +nonassertive +nonassertively +nonassertiveness +nonassessability +nonassessable +nonassessment +nonassignability +nonassignabilty +nonassignable +nonassignably +nonassigned +nonassignment +nonassimilability +nonassimilable +nonassimilating +nonassimilation +nonassimilative +nonassimilatory +nonassistance +nonassistant +nonassister +nonassistive +nonassociability +nonassociable +nonassociation +nonassociational +nonassociative +nonassociatively +nonassonance +nonassonant +nonassortment +nonassumed +nonassumption +nonassumptive +nonassurance +nonasthmatic +nonasthmatically +nonastonishment +nonastral +nonastringency +nonastringent +nonastringently +nonastronomic +nonastronomical +nonastronomically +nonatheistic +nonatheistical +nonatheistically +nonathlete +nonathletic +nonathletically +nonatmospheric +nonatmospherical +nonatmospherically +nonatomic +nonatomical +nonatomically +nonatonement +nonatrophic +nonatrophied +nonattached +nonattachment +nonattacking +nonattainability +nonattainable +nonattainment +nonattendance +nonattendant +nonattention +nonattestation +nonattribution +nonattributive +nonattributively +nonattributiveness +nonaudibility +nonaudible +nonaudibleness +nonaudibly +nonaugmentative +nonauricular +nonauriferous +nonauthentic +nonauthentical +nonauthenticated +nonauthentication +nonauthenticity +nonauthoritative +nonauthoritatively +nonauthoritativeness +nonautobiographical +nonautobiographically +nonautomated +nonautomatic +nonautomatically +nonautomotive +nonautonomous +nonautonomously +nonautonomousness +nonavailability +nonavoidable +nonavoidableness +nonavoidably +nonavoidance +nonaxiomatic +nonaxiomatical +nonaxiomatically +nonazotized +nonbachelor +nonbacterial +nonbacterially +nonbailable +nonballoting +nonbanishment +nonbank +nonbankable +nonbarbarian +nonbarbaric +nonbarbarous +nonbarbarously +nonbarbarousness +nonbaronial +nonbase +nonbasement +nonbasic +nonbasing +nonbathing +nonbearded +nonbearing +nonbeatific +nonbeatifically +nonbeauty +nonbeauties +nonbeing +nonbeings +nonbelief +nonbeliever +nonbelievers +nonbelieving +nonbelievingly +nonbelligerency +nonbelligerent +nonbelligerents +nonbending +nonbeneficed +nonbeneficence +nonbeneficent +nonbeneficently +nonbeneficial +nonbeneficially +nonbeneficialness +nonbenevolence +nonbenevolent +nonbenevolently +nonbetrayal +nonbeverage +nonbiased +nonbibulous +nonbibulously +nonbibulousness +nonbigoted +nonbigotedly +nonbilabiate +nonbilious +nonbiliously +nonbiliousness +nonbillable +nonbinding +nonbindingly +nonbindingness +nonbinomial +nonbiodegradable +nonbiographical +nonbiographically +nonbiological +nonbiologically +nonbiting +nonbitter +nonbituminous +nonblack +nonblamable +nonblamableness +nonblamably +nonblameful +nonblamefully +nonblamefulness +nonblameless +nonblank +nonblasphemy +nonblasphemies +nonblasphemous +nonblasphemously +nonblasphemousness +nonbleach +nonbleeding +nonblended +nonblending +nonblinding +nonblindingly +nonblockaded +nonblocking +nonblooded +nonblooming +nonblundering +nonblunderingly +nonboaster +nonboasting +nonboastingly +nonbodily +nonboding +nonbodingly +nonboiling +nonbook +nonbookish +nonbookishly +nonbookishness +nonbooks +nonborrower +nonborrowing +nonbotanic +nonbotanical +nonbotanically +nonbourgeois +nonbranded +nonbreach +nonbreaching +nonbreakable +nonbreeder +nonbreeding +nonbristled +nonbromidic +nonbroody +nonbroodiness +nonbrooding +nonbrowser +nonbrowsing +nonbrutal +nonbrutally +nonbudding +nonbuying +nonbulbaceous +nonbulbar +nonbulbiferous +nonbulbous +nonbulkhead +nonbuoyancy +nonbuoyant +nonbuoyantly +nonburdensome +nonburdensomely +nonburdensomeness +nonbureaucratic +nonbureaucratically +nonburgage +nonburgess +nonburnable +nonburning +nonbursting +nonbusy +nonbusily +nonbusiness +nonbusyness +nonbuttressed +noncabinet +noncadenced +noncadent +noncaffeine +noncaffeinic +noncaking +noncalcarea +noncalcareous +noncalcified +noncalculable +noncalculably +noncalculating +noncalculative +noncallability +noncallable +noncaloric +noncalumniating +noncalumnious +noncancelable +noncancellable +noncancellation +noncancerous +noncandescence +noncandescent +noncandescently +noncandidate +noncannibalistic +noncannibalistically +noncannonical +noncanonical +noncanonization +noncanvassing +noncapillary +noncapillaries +noncapillarity +noncapital +noncapitalist +noncapitalistic +noncapitalistically +noncapitalized +noncapitulation +noncapricious +noncapriciously +noncapriciousness +noncapsizable +noncaptious +noncaptiously +noncaptiousness +noncapture +noncarbohydrate +noncarbolic +noncarbon +noncarbonate +noncarbonated +noncareer +noncarnivorous +noncarnivorously +noncarnivorousness +noncarrier +noncartelized +noncash +noncaste +noncastigating +noncastigation +noncasual +noncasuistic +noncasuistical +noncasuistically +noncataclysmal +noncataclysmic +noncatalytic +noncatalytically +noncataloguer +noncatarrhal +noncatastrophic +noncatechistic +noncatechistical +noncatechizable +noncategorical +noncategorically +noncategoricalness +noncathartic +noncathartical +noncathedral +noncatholicity +noncausable +noncausal +noncausality +noncausally +noncausation +noncausative +noncausatively +noncausativeness +noncaustic +noncaustically +nonce +noncelebration +noncelestial +noncelestially +noncellular +noncellulosic +noncellulous +noncensored +noncensorious +noncensoriously +noncensoriousness +noncensurable +noncensurableness +noncensurably +noncensus +noncentral +noncentrally +noncereal +noncerebral +nonceremonial +nonceremonially +nonceremonious +nonceremoniously +nonceremoniousness +noncertain +noncertainty +noncertainties +noncertification +noncertified +noncertitude +nonces +nonchafing +nonchalance +nonchalant +nonchalantly +nonchalantness +nonchalky +nonchallenger +nonchallenging +nonchampion +nonchangeable +nonchangeableness +nonchangeably +nonchanging +nonchanneled +nonchannelized +nonchaotic +nonchaotically +noncharacteristic +noncharacteristically +noncharacterized +nonchargeable +noncharismatic +noncharitable +noncharitableness +noncharitably +nonchastisement +nonchastity +nonchemical +nonchemist +nonchimeric +nonchimerical +nonchimerically +nonchivalric +nonchivalrous +nonchivalrously +nonchivalrousness +nonchokable +nonchokebore +noncholeric +nonchromatic +nonchromatically +nonchromosomal +nonchronic +nonchronical +nonchronically +nonchronological +nonchurch +nonchurched +nonchurchgoer +nonchurchgoing +noncyclic +noncyclical +noncyclically +nonciliate +nonciliated +noncircuit +noncircuital +noncircuited +noncircuitous +noncircuitously +noncircuitousness +noncircular +noncircularly +noncirculating +noncirculation +noncirculatory +noncircumscribed +noncircumscriptive +noncircumspect +noncircumspectly +noncircumspectness +noncircumstantial +noncircumstantially +noncircumvallated +noncitable +noncitation +nonciteable +noncitizen +noncivilian +noncivilizable +noncivilized +nonclaim +nonclaimable +nonclamorous +nonclamorously +nonclarifiable +nonclarification +nonclarified +nonclassable +nonclassic +nonclassical +nonclassicality +nonclassically +nonclassifiable +nonclassification +nonclassified +nonclastic +nonclearance +noncleistogamic +noncleistogamous +nonclergyable +nonclerical +nonclerically +nonclerics +nonclimactic +nonclimactical +nonclimbable +nonclimbing +nonclinging +nonclinical +nonclinically +noncloistered +nonclose +nonclosely +nonclosure +nonclotting +noncoagulability +noncoagulable +noncoagulating +noncoagulation +noncoagulative +noncoalescence +noncoalescent +noncoalescing +noncock +noncodified +noncoercible +noncoercion +noncoercive +noncoercively +noncoerciveness +noncogency +noncogent +noncogently +noncognate +noncognition +noncognitive +noncognizable +noncognizably +noncognizance +noncognizant +noncognizantly +noncohabitation +noncoherence +noncoherency +noncoherent +noncoherently +noncohesion +noncohesive +noncohesively +noncohesiveness +noncoinage +noncoincidence +noncoincident +noncoincidental +noncoincidentally +noncoking +noncollaboration +noncollaborative +noncollapsable +noncollapsibility +noncollapsible +noncollectable +noncollectible +noncollection +noncollective +noncollectively +noncollectivistic +noncollegiate +noncollinear +noncolloid +noncolloidal +noncollusion +noncollusive +noncollusively +noncollusiveness +noncolonial +noncolonially +noncolorability +noncolorable +noncolorableness +noncolorably +noncoloring +noncom +noncombat +noncombatant +noncombatants +noncombative +noncombination +noncombinative +noncombining +noncombustibility +noncombustible +noncombustibles +noncombustion +noncombustive +noncome +noncomic +noncomical +noncomicality +noncomically +noncomicalness +noncoming +noncommemoration +noncommemorational +noncommemorative +noncommemoratively +noncommemoratory +noncommencement +noncommendable +noncommendableness +noncommendably +noncommendatory +noncommensurable +noncommercial +noncommerciality +noncommercially +noncommiseration +noncommiserative +noncommiseratively +noncommissioned +noncommitally +noncommitment +noncommittal +noncommittalism +noncommittally +noncommittalness +noncommitted +noncommodious +noncommodiously +noncommodiousness +noncommonable +noncommorancy +noncommunal +noncommunally +noncommunicability +noncommunicable +noncommunicableness +noncommunicant +noncommunicating +noncommunication +noncommunicative +noncommunicatively +noncommunicativeness +noncommunion +noncommunist +noncommunistic +noncommunistical +noncommunistically +noncommunists +noncommutative +noncompearance +noncompensable +noncompensating +noncompensation +noncompensative +noncompensatory +noncompetency +noncompetent +noncompetently +noncompeting +noncompetitive +noncompetitively +noncompetitiveness +noncomplacence +noncomplacency +noncomplacencies +noncomplacent +noncomplacently +noncomplaisance +noncomplaisant +noncomplaisantly +noncompletion +noncompliance +noncompliant +noncomplicity +noncomplicities +noncomplying +noncompos +noncomposes +noncomposite +noncompositely +noncompositeness +noncomposure +noncompound +noncompoundable +noncompounder +noncomprehendible +noncomprehending +noncomprehendingly +noncomprehensible +noncomprehensiblely +noncomprehension +noncomprehensive +noncomprehensively +noncomprehensiveness +noncompressibility +noncompressible +noncompression +noncompressive +noncompressively +noncompromised +noncompromising +noncompulsion +noncompulsive +noncompulsively +noncompulsory +noncompulsorily +noncompulsoriness +noncomputation +noncoms +noncon +nonconcealment +nonconceiving +nonconcentrated +nonconcentratiness +nonconcentration +nonconcentrative +nonconcentrativeness +nonconcentric +nonconcentrical +nonconcentrically +nonconcentricity +nonconception +nonconceptual +nonconceptually +nonconcern +nonconcession +nonconcessive +nonconciliating +nonconciliatory +nonconcision +nonconcludency +nonconcludent +nonconcluding +nonconclusion +nonconclusive +nonconclusively +nonconclusiveness +nonconcordant +nonconcordantly +nonconcur +nonconcurred +nonconcurrence +nonconcurrency +nonconcurrent +nonconcurrently +nonconcurring +noncondemnation +noncondensable +noncondensation +noncondensed +noncondensibility +noncondensible +noncondensing +noncondescending +noncondescendingly +noncondescendingness +noncondescension +noncondiment +noncondimental +nonconditional +nonconditioned +noncondonation +nonconduciness +nonconducive +nonconduciveness +nonconductibility +nonconductible +nonconducting +nonconduction +nonconductive +nonconductor +nonconductors +nonconfederate +nonconfederation +nonconferrable +nonconfession +nonconficient +nonconfidence +nonconfident +nonconfidential +nonconfidentiality +nonconfidentially +nonconfidentialness +nonconfidently +nonconfiding +nonconfined +nonconfinement +nonconfining +nonconfirmation +nonconfirmative +nonconfirmatory +nonconfirming +nonconfiscable +nonconfiscation +nonconfiscatory +nonconfitent +nonconflicting +nonconflictive +nonconform +nonconformability +nonconformable +nonconformably +nonconformance +nonconformer +nonconformest +nonconforming +nonconformism +nonconformist +nonconformistical +nonconformistically +nonconformists +nonconformitant +nonconformity +nonconfrontation +nonconfutation +noncongealing +noncongenital +noncongestion +noncongestive +noncongratulatory +noncongregative +noncongruence +noncongruency +noncongruent +noncongruently +noncongruity +noncongruities +noncongruous +noncongruously +noncongruousness +nonconjecturable +nonconjecturably +nonconjectural +nonconjugal +nonconjugality +nonconjugally +nonconjugate +nonconjugation +nonconjunction +nonconjunctive +nonconjunctively +nonconnection +nonconnective +nonconnectively +nonconnectivity +nonconnivance +nonconnivence +nonconnotative +nonconnotatively +nonconnubial +nonconnubiality +nonconnubially +nonconscientious +nonconscientiously +nonconscientiousness +nonconscious +nonconsciously +nonconsciousness +nonconscriptable +nonconscription +nonconsecration +nonconsecutive +nonconsecutively +nonconsecutiveness +nonconsent +nonconsenting +nonconsequence +nonconsequent +nonconsequential +nonconsequentiality +nonconsequentially +nonconsequentialness +nonconservation +nonconservational +nonconservative +nonconserving +nonconsideration +nonconsignment +nonconsistorial +nonconsolable +nonconsolidation +nonconsoling +nonconsolingly +nonconsonance +nonconsonant +nonconsorting +nonconspirator +nonconspiratorial +nonconspiring +nonconstant +nonconstituent +nonconstituted +nonconstitutional +nonconstraining +nonconstraint +nonconstricted +nonconstricting +nonconstrictive +nonconstruability +nonconstruable +nonconstruction +nonconstructive +nonconstructively +nonconstructiveness +nonconsular +nonconsultative +nonconsultatory +nonconsumable +nonconsuming +nonconsummation +nonconsumption +nonconsumptive +nonconsumptively +nonconsumptiveness +noncontact +noncontagion +noncontagionist +noncontagious +noncontagiously +noncontagiousness +noncontaminable +noncontamination +noncontaminative +noncontemplative +noncontemplatively +noncontemplativeness +noncontemporaneous +noncontemporaneously +noncontemporaneousness +noncontemporary +noncontemporaries +noncontemptibility +noncontemptible +noncontemptibleness +noncontemptibly +noncontemptuous +noncontemptuously +noncontemptuousness +noncontending +noncontent +noncontention +noncontentious +noncontentiously +nonconterminal +nonconterminous +nonconterminously +noncontestable +noncontestation +noncontextual +noncontextually +noncontiguity +noncontiguities +noncontiguous +noncontiguously +noncontiguousness +noncontinence +noncontinency +noncontinental +noncontingency +noncontingent +noncontingently +noncontinuable +noncontinuably +noncontinuance +noncontinuation +noncontinuity +noncontinuous +noncontinuously +noncontinuousness +noncontraband +noncontrabands +noncontraction +noncontractual +noncontradiction +noncontradictory +noncontradictories +noncontrariety +noncontrarieties +noncontrastable +noncontrastive +noncontributable +noncontributing +noncontribution +noncontributive +noncontributively +noncontributiveness +noncontributor +noncontributory +noncontributories +noncontrivance +noncontrollable +noncontrollablely +noncontrollably +noncontrolled +noncontrolling +noncontroversial +noncontroversially +noncontumacious +noncontumaciously +noncontumaciousness +nonconvective +nonconvectively +nonconveyance +nonconvenable +nonconventional +nonconventionally +nonconvergence +nonconvergency +nonconvergent +nonconvergently +nonconverging +nonconversable +nonconversableness +nonconversably +nonconversance +nonconversancy +nonconversant +nonconversantly +nonconversational +nonconversationally +nonconversion +nonconvertibility +nonconvertible +nonconvertibleness +nonconvertibly +nonconviction +nonconvivial +nonconviviality +nonconvivially +noncooperating +noncooperation +noncooperationist +noncooperative +noncooperator +noncoordinating +noncoordination +noncopying +noncoplanar +noncoring +noncorporate +noncorporately +noncorporation +noncorporative +noncorporeal +noncorporeality +noncorpuscular +noncorrection +noncorrectional +noncorrective +noncorrectively +noncorrelating +noncorrelation +noncorrelative +noncorrelatively +noncorrespondence +noncorrespondent +noncorresponding +noncorrespondingly +noncorroborating +noncorroboration +noncorroborative +noncorroboratively +noncorroboratory +noncorrodible +noncorroding +noncorrosive +noncorrosively +noncorrosiveness +noncorrupt +noncorrupter +noncorruptibility +noncorruptible +noncorruptibleness +noncorruptibly +noncorruption +noncorruptive +noncorruptly +noncorruptness +noncortical +noncortically +noncosmic +noncosmically +noncosmopolitan +noncosmopolitanism +noncosmopolite +noncosmopolitism +noncostraight +noncotyledonal +noncotyledonary +noncotyledonous +noncottager +noncounteractive +noncounterfeit +noncounty +noncovetous +noncovetously +noncovetousness +noncranking +noncreation +noncreative +noncreatively +noncreativeness +noncreativity +noncredence +noncredent +noncredibility +noncredible +noncredibleness +noncredibly +noncredit +noncreditable +noncreditableness +noncreditably +noncreditor +noncredulous +noncredulously +noncredulousness +noncreeping +noncrenate +noncrenated +noncretaceous +noncriminal +noncriminality +noncriminally +noncrinoid +noncryptic +noncryptical +noncryptically +noncrystalline +noncrystallizable +noncrystallized +noncrystallizing +noncritical +noncritically +noncriticalness +noncriticizing +noncrossover +noncrucial +noncrucially +noncruciform +noncruciformly +noncrusading +noncrushability +noncrushable +noncrustaceous +nonculminating +nonculmination +nonculpability +nonculpable +nonculpableness +nonculpably +noncultivability +noncultivable +noncultivatable +noncultivated +noncultivation +noncultural +nonculturally +nonculture +noncultured +noncumbrous +noncumbrously +noncumbrousness +noncumulative +noncumulatively +noncurantist +noncurative +noncuratively +noncurativeness +noncurdling +noncuriosity +noncurious +noncuriously +noncuriousness +noncurling +noncurrency +noncurrent +noncurrently +noncursive +noncursively +noncurtailing +noncurtailment +noncuspidate +noncuspidated +noncustodial +noncustomary +noncustomarily +noncutting +nonda +nondairy +nondamageable +nondamaging +nondamagingly +nondamnation +nondancer +nondangerous +nondangerously +nondangerousness +nondark +nondatival +nondeadly +nondeaf +nondeafened +nondeafening +nondeafeningly +nondeafly +nondeafness +nondealer +nondebatable +nondebater +nondebating +nondebilitating +nondebilitation +nondebilitative +nondebtor +nondecadence +nondecadency +nondecadent +nondecayed +nondecaying +nondecalcification +nondecalcified +nondecane +nondecasyllabic +nondecasyllable +nondecatoic +nondeceit +nondeceivable +nondeceiving +nondeceleration +nondeception +nondeceptive +nondeceptively +nondeceptiveness +nondeciduata +nondeciduate +nondeciduous +nondeciduously +nondeciduousness +nondecision +nondecisive +nondecisively +nondecisiveness +nondeclamatory +nondeclarant +nondeclaration +nondeclarative +nondeclaratively +nondeclaratory +nondeclarer +nondeclivitous +nondecomposition +nondecorated +nondecoration +nondecorative +nondecorous +nondecorously +nondecorousness +nondecreasing +nondedication +nondedicative +nondedicatory +nondeducible +nondeductibility +nondeductible +nondeduction +nondeductive +nondeductively +nondeep +nondefalcation +nondefamatory +nondefaulting +nondefeasance +nondefeasibility +nondefeasible +nondefeasibleness +nondefeasibness +nondefeat +nondefecting +nondefection +nondefective +nondefectively +nondefectiveness +nondefector +nondefendant +nondefense +nondefensibility +nondefensible +nondefensibleness +nondefensibly +nondefensive +nondefensively +nondefensiveness +nondeferable +nondeference +nondeferent +nondeferential +nondeferentially +nondeferrable +nondefiance +nondefiant +nondefiantly +nondefiantness +nondeficiency +nondeficiencies +nondeficient +nondeficiently +nondefilement +nondefiling +nondefinability +nondefinable +nondefinably +nondefined +nondefiner +nondefining +nondefinite +nondefinitely +nondefiniteness +nondefinition +nondefinitive +nondefinitively +nondefinitiveness +nondeflation +nondeflationary +nondeflected +nondeflection +nondeflective +nondeforestation +nondeformation +nondeformed +nondeformity +nondeformities +nondefunct +nondegeneracy +nondegeneracies +nondegenerate +nondegenerately +nondegenerateness +nondegeneration +nondegenerative +nondegerming +nondegradation +nondegrading +nondegreased +nondehiscent +nondeist +nondeistic +nondeistical +nondeistically +nondelegable +nondelegate +nondelegation +nondeleterious +nondeleteriously +nondeleteriousness +nondeliberate +nondeliberately +nondeliberateness +nondeliberation +nondelicate +nondelicately +nondelicateness +nondelineation +nondelineative +nondelinquent +nondeliquescence +nondeliquescent +nondelirious +nondeliriously +nondeliriousness +nondeliverance +nondelivery +nondeliveries +nondeluded +nondeluding +nondelusive +nondemand +nondemanding +nondemise +nondemobilization +nondemocracy +nondemocracies +nondemocratic +nondemocratical +nondemocratically +nondemolition +nondemonstrability +nondemonstrable +nondemonstrableness +nondemonstrably +nondemonstration +nondemonstrative +nondemonstratively +nondemonstrativeness +nondendroid +nondendroidal +nondenial +nondenominational +nondenominationalism +nondenominationally +nondenotative +nondenotatively +nondense +nondenseness +nondensity +nondenumerable +nondenunciating +nondenunciation +nondenunciative +nondenunciatory +nondeodorant +nondeodorizing +nondepartmental +nondepartmentally +nondeparture +nondependability +nondependable +nondependableness +nondependably +nondependance +nondependancy +nondependancies +nondependence +nondependency +nondependencies +nondependent +nondepletion +nondepletive +nondepletory +nondeportation +nondeported +nondeposition +nondepositor +nondepravation +nondepraved +nondepravity +nondepravities +nondeprecating +nondeprecatingly +nondeprecative +nondeprecatively +nondeprecatory +nondeprecatorily +nondepreciable +nondepreciating +nondepreciation +nondepreciative +nondepreciatively +nondepreciatory +nondepressed +nondepressing +nondepressingly +nondepression +nondepressive +nondepressively +nondeprivable +nondeprivation +nonderelict +nonderisible +nonderisive +nonderivability +nonderivable +nonderivative +nonderivatively +nonderogation +nonderogative +nonderogatively +nonderogatory +nonderogatorily +nonderogatoriness +nondescribable +nondescript +nondescriptive +nondescriptively +nondescriptiveness +nondescriptly +nondesecration +nondesignate +nondesignative +nondesigned +nondesire +nondesirous +nondesistance +nondesistence +nondesisting +nondespotic +nondespotically +nondesquamative +nondestruction +nondestructive +nondestructively +nondestructiveness +nondesulfurization +nondesulfurized +nondesulphurized +nondetachability +nondetachable +nondetachment +nondetailed +nondetention +nondeterioration +nondeterminable +nondeterminacy +nondeterminant +nondeterminate +nondeterminately +nondetermination +nondeterminative +nondeterminatively +nondeterminativeness +nondeterminism +nondeterminist +nondeterministic +nondeterministically +nondeterrent +nondetest +nondetinet +nondetonating +nondetractive +nondetractively +nondetractory +nondetrimental +nondetrimentally +nondevelopable +nondeveloping +nondevelopment +nondevelopmental +nondevelopmentally +nondeviant +nondeviating +nondeviation +nondevious +nondeviously +nondeviousness +nondevotional +nondevotionally +nondevout +nondevoutly +nondevoutness +nondexterity +nondexterous +nondexterously +nondexterousness +nondextrous +nondiabetic +nondiabolic +nondiabolical +nondiabolically +nondiabolicalness +nondiagnosis +nondiagonal +nondiagonally +nondiagrammatic +nondiagrammatical +nondiagrammatically +nondialectal +nondialectally +nondialectic +nondialectical +nondialectically +nondialyzing +nondiametral +nondiametrally +nondiapausing +nondiaphanous +nondiaphanously +nondiaphanousness +nondiastasic +nondiastatic +nondiathermanous +nondiazotizable +nondichogamy +nondichogamic +nondichogamous +nondichotomous +nondichotomously +nondictation +nondictatorial +nondictatorially +nondictatorialness +nondictionary +nondidactic +nondidactically +nondietetic +nondietetically +nondieting +nondifferentation +nondifferentiable +nondifferentiation +nondifficult +nondiffidence +nondiffident +nondiffidently +nondiffractive +nondiffractively +nondiffractiveness +nondiffuse +nondiffused +nondiffusible +nondiffusibleness +nondiffusibly +nondiffusing +nondiffusion +nondigestibility +nondigestible +nondigestibleness +nondigestibly +nondigesting +nondigestion +nondigestive +nondilapidated +nondilatability +nondilatable +nondilation +nondiligence +nondiligent +nondiligently +nondilution +nondimensioned +nondiminishing +nondynamic +nondynamical +nondynamically +nondynastic +nondynastical +nondynastically +nondiocesan +nondiphtherial +nondiphtheric +nondiphtheritic +nondiphthongal +nondiplomacy +nondiplomatic +nondiplomatically +nondipterous +nondirection +nondirectional +nondirective +nondirigibility +nondirigible +nondisagreement +nondisappearing +nondisarmament +nondisastrous +nondisastrously +nondisastrousness +nondisbursable +nondisbursed +nondisbursement +nondiscerning +nondiscernment +nondischarging +nondisciplinable +nondisciplinary +nondisciplined +nondisciplining +nondisclaim +nondisclosure +nondiscontinuance +nondiscordant +nondiscountable +nondiscoverable +nondiscovery +nondiscoveries +nondiscretionary +nondiscriminating +nondiscriminatingly +nondiscrimination +nondiscriminative +nondiscriminatively +nondiscriminatory +nondiscursive +nondiscursively +nondiscursiveness +nondiscussion +nondiseased +nondisestablishment +nondisfigurement +nondisfranchised +nondisguised +nondisingenuous +nondisingenuously +nondisingenuousness +nondisintegrating +nondisintegration +nondisinterested +nondisjunct +nondisjunction +nondisjunctional +nondisjunctive +nondisjunctively +nondismemberment +nondismissal +nondisparaging +nondisparate +nondisparately +nondisparateness +nondisparity +nondisparities +nondispensable +nondispensation +nondispensational +nondispensible +nondyspeptic +nondyspeptical +nondyspeptically +nondispersal +nondispersion +nondispersive +nondisposable +nondisposal +nondisposed +nondisputatious +nondisputatiously +nondisputatiousness +nondisqualifying +nondisrupting +nondisruptingly +nondisruptive +nondissent +nondissenting +nondissidence +nondissident +nondissipated +nondissipatedly +nondissipatedness +nondissipative +nondissolution +nondissolving +nondistant +nondistillable +nondistillation +nondistinctive +nondistinguishable +nondistinguishableness +nondistinguishably +nondistinguished +nondistinguishing +nondistorted +nondistortedly +nondistortedness +nondistorting +nondistortingly +nondistortion +nondistortive +nondistracted +nondistractedly +nondistracting +nondistractingly +nondistractive +nondistribution +nondistributional +nondistributive +nondistributively +nondistributiveness +nondisturbance +nondisturbing +nondivergence +nondivergency +nondivergencies +nondivergent +nondivergently +nondiverging +nondiversification +nondividing +nondivinity +nondivinities +nondivisibility +nondivisible +nondivisiblity +nondivision +nondivisional +nondivisive +nondivisively +nondivisiveness +nondivorce +nondivorced +nondivulgence +nondivulging +nondo +nondoctrinaire +nondoctrinal +nondoctrinally +nondocumental +nondocumentary +nondocumentaries +nondogmatic +nondogmatical +nondogmatically +nondoing +nondomestic +nondomestically +nondomesticated +nondomesticating +nondominance +nondominant +nondominating +nondomination +nondomineering +nondonation +nondormant +nondoubtable +nondoubter +nondoubting +nondoubtingly +nondramatic +nondramatically +nondrying +nondrinkable +nondrinker +nondrinkers +nondrinking +nondriver +nondropsical +nondropsically +nondruidic +nondruidical +nondualism +nondualistic +nondualistically +nonduality +nonductile +nonductility +nondumping +nonduplicating +nonduplication +nonduplicative +nonduplicity +nondurability +nondurable +nondurableness +nondurably +nondutiable +none +noneager +noneagerly +noneagerness +nonearning +noneastern +noneatable +nonebullience +nonebulliency +nonebullient +nonebulliently +noneccentric +noneccentrically +nonecclesiastic +nonecclesiastical +nonecclesiastically +nonechoic +noneclectic +noneclectically +noneclipsed +noneclipsing +nonecliptic +nonecliptical +nonecliptically +nonecompense +noneconomy +noneconomic +noneconomical +noneconomically +noneconomies +nonecstatic +nonecstatically +nonecumenic +nonecumenical +nonedibility +nonedible +nonedibleness +nonedibness +nonedified +noneditor +noneditorial +noneditorially +noneducable +noneducated +noneducation +noneducational +noneducationally +noneducative +noneducatory +noneffective +noneffervescent +noneffervescently +noneffete +noneffetely +noneffeteness +nonefficacy +nonefficacious +nonefficaciously +nonefficiency +nonefficient +nonefficiently +noneffusion +noneffusive +noneffusively +noneffusiveness +nonego +nonegocentric +nonegoistic +nonegoistical +nonegoistically +nonegos +nonegotistic +nonegotistical +nonegotistically +nonegregious +nonegregiously +nonegregiousness +noneidetic +nonejaculatory +nonejecting +nonejection +nonejective +nonelaborate +nonelaborately +nonelaborateness +nonelaborating +nonelaborative +nonelastic +nonelastically +nonelasticity +nonelect +nonelection +nonelective +nonelectively +nonelectiveness +nonelector +nonelectric +nonelectrical +nonelectrically +nonelectrification +nonelectrified +nonelectrized +nonelectrocution +nonelectrolyte +nonelectrolytic +noneleemosynary +nonelemental +nonelementally +nonelementary +nonelevating +nonelevation +nonelicited +noneligibility +noneligible +noneligibly +nonelimination +noneliminative +noneliminatory +nonelite +nonelliptic +nonelliptical +nonelliptically +nonelongation +nonelopement +noneloquence +noneloquent +noneloquently +nonelucidating +nonelucidation +nonelucidative +nonelusive +nonelusively +nonelusiveness +nonemanant +nonemanating +nonemancipation +nonemancipative +nonembarkation +nonembellished +nonembellishing +nonembellishment +nonembezzlement +nonembryonal +nonembryonic +nonembryonically +nonemendable +nonemendation +nonemergence +nonemergent +nonemigrant +nonemigration +nonemission +nonemotional +nonemotionalism +nonemotionally +nonemotive +nonemotively +nonemotiveness +nonempathic +nonempathically +nonemphatic +nonemphatical +nonempiric +nonempirical +nonempirically +nonempiricism +nonemploying +nonemployment +nonempty +nonemulation +nonemulative +nonemulous +nonemulously +nonemulousness +nonenactment +nonencyclopaedic +nonencyclopedic +nonencyclopedical +nonenclosure +nonencroachment +nonendemic +nonendorsement +nonendowment +nonendurable +nonendurance +nonenduring +nonene +nonenemy +nonenemies +nonenergetic +nonenergetically +nonenergic +nonenervating +nonenforceability +nonenforceable +nonenforced +nonenforcedly +nonenforcement +nonenforcing +nonengagement +nonengineering +nonengrossing +nonengrossingly +nonenigmatic +nonenigmatical +nonenigmatically +nonenlightened +nonenlightening +nonenrolled +nonent +nonentailed +nonenteric +nonenterprising +nonentertaining +nonentertainment +nonenthusiastic +nonenthusiastically +nonenticing +nonenticingly +nonentitative +nonentity +nonentities +nonentityism +nonentitive +nonentitize +nonentomologic +nonentomological +nonentrant +nonentreating +nonentreatingly +nonentres +nonentresse +nonentry +nonentries +nonenumerated +nonenumerative +nonenunciation +nonenunciative +nonenunciatory +nonenviable +nonenviableness +nonenviably +nonenvious +nonenviously +nonenviousness +nonenvironmental +nonenvironmentally +nonenzymic +nonephemeral +nonephemerally +nonepic +nonepical +nonepically +nonepicurean +nonepigrammatic +nonepigrammatically +nonepileptic +nonepiscopal +nonepiscopalian +nonepiscopally +nonepisodic +nonepisodical +nonepisodically +nonepithelial +nonepochal +nonequability +nonequable +nonequableness +nonequably +nonequal +nonequalization +nonequalized +nonequalizing +nonequals +nonequation +nonequatorial +nonequatorially +nonequestrian +nonequilateral +nonequilaterally +nonequilibrium +nonequitable +nonequitably +nonequivalence +nonequivalency +nonequivalent +nonequivalently +nonequivalents +nonequivocal +nonequivocally +nonequivocating +noneradicable +noneradicative +nonerasure +nonerecting +nonerection +noneroded +nonerodent +noneroding +nonerosive +nonerotic +nonerotically +nonerrant +nonerrantly +nonerratic +nonerratically +nonerroneous +nonerroneously +nonerroneousness +nonerudite +noneruditely +noneruditeness +nonerudition +noneruption +noneruptive +nones +nonescape +nonesoteric +nonesoterically +nonespionage +nonespousal +nonessential +nonessentials +nonestablishment +nonesthetic +nonesthetical +nonesthetically +nonestimable +nonestimableness +nonestimably +nonesuch +nonesuches +nonesurient +nonesuriently +nonet +noneternal +noneternally +noneternalness +noneternity +nonetheless +nonethereal +nonethereality +nonethereally +nonetherealness +nonethic +nonethical +nonethically +nonethicalness +nonethyl +nonethnic +nonethnical +nonethnically +nonethnologic +nonethnological +nonethnologically +nonetto +noneugenic +noneugenical +noneugenically +noneuphonious +noneuphoniously +noneuphoniousness +nonevacuation +nonevadable +nonevadible +nonevading +nonevadingly +nonevaluation +nonevanescent +nonevanescently +nonevangelic +nonevangelical +nonevangelically +nonevaporable +nonevaporating +nonevaporation +nonevaporative +nonevasion +nonevasive +nonevasively +nonevasiveness +nonevent +nonevents +noneviction +nonevident +nonevidential +nonevil +nonevilly +nonevilness +nonevincible +nonevincive +nonevocative +nonevolutional +nonevolutionally +nonevolutionary +nonevolutionist +nonevolving +nonexactable +nonexacting +nonexactingly +nonexactingness +nonexaction +nonexaggerated +nonexaggeratedly +nonexaggerating +nonexaggeration +nonexaggerative +nonexaggeratory +nonexamination +nonexcavation +nonexcepted +nonexcepting +nonexceptional +nonexceptionally +nonexcerptible +nonexcessive +nonexcessively +nonexcessiveness +nonexchangeability +nonexchangeable +nonexcitable +nonexcitableness +nonexcitably +nonexcitative +nonexcitatory +nonexciting +nonexclamatory +nonexclusion +nonexclusive +nonexcommunicable +nonexculpable +nonexculpation +nonexculpatory +nonexcusable +nonexcusableness +nonexcusably +nonexecutable +nonexecution +nonexecutive +nonexemplary +nonexemplification +nonexemplificatior +nonexempt +nonexemption +nonexercisable +nonexercise +nonexerciser +nonexertion +nonexertive +nonexhausted +nonexhaustible +nonexhaustive +nonexhaustively +nonexhaustiveness +nonexhibition +nonexhibitionism +nonexhibitionistic +nonexhibitive +nonexhortation +nonexhortative +nonexhortatory +nonexigent +nonexigently +nonexistence +nonexistent +nonexistential +nonexistentialism +nonexistentially +nonexisting +nonexoneration +nonexotic +nonexotically +nonexpanded +nonexpanding +nonexpansibility +nonexpansible +nonexpansile +nonexpansion +nonexpansive +nonexpansively +nonexpansiveness +nonexpectant +nonexpectantly +nonexpectation +nonexpedience +nonexpediency +nonexpedient +nonexpediential +nonexpediently +nonexpeditious +nonexpeditiously +nonexpeditiousness +nonexpendable +nonexperience +nonexperienced +nonexperiential +nonexperientially +nonexperimental +nonexperimentally +nonexpert +nonexpiable +nonexpiation +nonexpiatory +nonexpiration +nonexpiry +nonexpiries +nonexpiring +nonexplainable +nonexplanative +nonexplanatory +nonexplicable +nonexplicative +nonexploitation +nonexplorative +nonexploratory +nonexplosive +nonexplosively +nonexplosiveness +nonexplosives +nonexponential +nonexponentially +nonexponible +nonexportable +nonexportation +nonexposure +nonexpressionistic +nonexpressive +nonexpressively +nonexpressiveness +nonexpulsion +nonexpulsive +nonextant +nonextempore +nonextended +nonextendible +nonextendibleness +nonextensibility +nonextensible +nonextensibleness +nonextensibness +nonextensile +nonextension +nonextensional +nonextensive +nonextensively +nonextensiveness +nonextenuating +nonextenuatingly +nonextenuative +nonextenuatory +nonexteriority +nonextermination +nonexterminative +nonexterminatory +nonexternal +nonexternality +nonexternalized +nonexternally +nonextinct +nonextinction +nonextinguishable +nonextinguished +nonextortion +nonextortive +nonextractable +nonextracted +nonextractible +nonextraction +nonextractive +nonextraditable +nonextradition +nonextraneous +nonextraneously +nonextraneousness +nonextreme +nonextricable +nonextricably +nonextrication +nonextrinsic +nonextrinsical +nonextrinsically +nonextrusive +nonexuberance +nonexuberancy +nonexuding +nonexultant +nonexultantly +nonexultation +nonfabulous +nonfacetious +nonfacetiously +nonfacetiousness +nonfacial +nonfacility +nonfacing +nonfact +nonfactious +nonfactiously +nonfactiousness +nonfactitious +nonfactitiously +nonfactitiousness +nonfactory +nonfactual +nonfactually +nonfacultative +nonfaculty +nonfaddist +nonfading +nonfailure +nonfallacious +nonfallaciously +nonfallaciousness +nonfalse +nonfaltering +nonfalteringly +nonfamily +nonfamilial +nonfamiliar +nonfamiliarly +nonfamilies +nonfamous +nonfanatic +nonfanatical +nonfanatically +nonfanciful +nonfantasy +nonfantasies +nonfarcical +nonfarcicality +nonfarcically +nonfarcicalness +nonfarm +nonfascist +nonfascists +nonfashionable +nonfashionableness +nonfashionably +nonfastidious +nonfastidiously +nonfastidiousness +nonfat +nonfatal +nonfatalistic +nonfatality +nonfatalities +nonfatally +nonfatalness +nonfatigable +nonfatty +nonfaulty +nonfavorable +nonfavorableness +nonfavorably +nonfavored +nonfavorite +nonfealty +nonfealties +nonfeasance +nonfeasibility +nonfeasible +nonfeasibleness +nonfeasibly +nonfeasor +nonfeatured +nonfebrile +nonfecund +nonfecundity +nonfederal +nonfederated +nonfeeble +nonfeebleness +nonfeebly +nonfeeding +nonfeeling +nonfeelingly +nonfeldspathic +nonfelicity +nonfelicitous +nonfelicitously +nonfelicitousness +nonfelony +nonfelonious +nonfeloniously +nonfeloniousness +nonfenestrated +nonfermentability +nonfermentable +nonfermentation +nonfermentative +nonfermented +nonfermenting +nonferocious +nonferociously +nonferociousness +nonferocity +nonferrous +nonfertile +nonfertility +nonfervent +nonfervently +nonferventness +nonfervid +nonfervidly +nonfervidness +nonfestive +nonfestively +nonfestiveness +nonfeudal +nonfeudally +nonfeverish +nonfeverishly +nonfeverishness +nonfeverous +nonfeverously +nonfibrous +nonfiction +nonfictional +nonfictionally +nonfictitious +nonfictitiously +nonfictitiousness +nonfictive +nonfictively +nonfidelity +nonfiduciary +nonfiduciaries +nonfighter +nonfigurative +nonfiguratively +nonfigurativeness +nonfilamentous +nonfilial +nonfilter +nonfilterable +nonfimbriate +nonfimbriated +nonfinancial +nonfinancially +nonfinding +nonfinishing +nonfinite +nonfinitely +nonfiniteness +nonfireproof +nonfiscal +nonfiscally +nonfisherman +nonfishermen +nonfissile +nonfissility +nonfissionable +nonfixation +nonflagellate +nonflagellated +nonflagitious +nonflagitiously +nonflagitiousness +nonflagrance +nonflagrancy +nonflagrant +nonflagrantly +nonflaky +nonflakily +nonflakiness +nonflammability +nonflammable +nonflammatory +nonflatulence +nonflatulency +nonflatulent +nonflatulently +nonflawed +nonflexibility +nonflexible +nonflexibleness +nonflexibly +nonflyable +nonflying +nonflirtatious +nonflirtatiously +nonflirtatiousness +nonfloatation +nonfloating +nonfloatingly +nonfloriferous +nonflowering +nonflowing +nonfluctuating +nonfluctuation +nonfluency +nonfluent +nonfluently +nonfluentness +nonfluid +nonfluidic +nonfluidity +nonfluidly +nonfluids +nonfluorescence +nonfluorescent +nonflux +nonfocal +nonfollowing +nonfood +nonforbearance +nonforbearing +nonforbearingly +nonforeclosing +nonforeclosure +nonforeign +nonforeigness +nonforeignness +nonforeknowledge +nonforensic +nonforensically +nonforest +nonforested +nonforfeitable +nonforfeiting +nonforfeiture +nonforfeitures +nonforgiving +nonform +nonformal +nonformalism +nonformalistic +nonformally +nonformalness +nonformation +nonformative +nonformatively +nonformidability +nonformidable +nonformidableness +nonformidably +nonforming +nonformulation +nonfortifiable +nonfortification +nonfortifying +nonfortuitous +nonfortuitously +nonfortuitousness +nonfossiliferous +nonfouling +nonfragile +nonfragilely +nonfragileness +nonfragility +nonfragmented +nonfragrant +nonfrangibility +nonfrangible +nonfrat +nonfraternal +nonfraternally +nonfraternity +nonfrauder +nonfraudulence +nonfraudulency +nonfraudulent +nonfraudulently +nonfreedom +nonfreeman +nonfreemen +nonfreezable +nonfreeze +nonfreezing +nonfrenetic +nonfrenetically +nonfrequence +nonfrequency +nonfrequent +nonfrequently +nonfricative +nonfriction +nonfrigid +nonfrigidity +nonfrigidly +nonfrigidness +nonfrosted +nonfrosting +nonfrugal +nonfrugality +nonfrugally +nonfrugalness +nonfruition +nonfrustration +nonfugitive +nonfugitively +nonfugitiveness +nonfulfillment +nonfulminating +nonfunctional +nonfunctionally +nonfunctioning +nonfundable +nonfundamental +nonfundamentalist +nonfundamentally +nonfunded +nonfungible +nonfuroid +nonfused +nonfusibility +nonfusible +nonfusion +nonfutile +nonfuturistic +nonfuturity +nonfuturition +nong +nongalactic +nongalvanized +nongame +nonganglionic +nongangrenous +nongarrulity +nongarrulous +nongarrulously +nongarrulousness +nongas +nongaseness +nongaseous +nongaseousness +nongases +nongassy +nongelatinizing +nongelatinous +nongelatinously +nongelatinousness +nongelling +nongenealogic +nongenealogical +nongenealogically +nongeneralized +nongenerating +nongenerative +nongeneric +nongenerical +nongenerically +nongenetic +nongenetical +nongenetically +nongentile +nongenuine +nongenuinely +nongenuineness +nongeographic +nongeographical +nongeographically +nongeologic +nongeological +nongeologically +nongeometric +nongeometrical +nongeometrically +nongermane +nongerminal +nongerminating +nongermination +nongerminative +nongerundial +nongerundive +nongerundively +nongestic +nongestical +nongilded +nongildsman +nongilled +nongymnast +nongipsy +nongypsy +nonglacial +nonglacially +nonglandered +nonglandular +nonglandulous +nonglare +nonglazed +nonglobular +nonglobularly +nonglucose +nonglucosidal +nonglucosidic +nonglutenous +nongod +nongold +nongolfer +nongospel +nongovernance +nongovernment +nongovernmental +nongraceful +nongracefully +nongracefulness +nongraciosity +nongracious +nongraciously +nongraciousness +nongraduate +nongraduated +nongraduation +nongray +nongrain +nongrained +nongrammatical +nongranular +nongranulated +nongraphic +nongraphical +nongraphically +nongraphicalness +nongraphitic +nongrass +nongratification +nongratifying +nongratifyingly +nongratuitous +nongratuitously +nongratuitousness +nongraven +nongravitation +nongravitational +nongravitationally +nongravitative +nongravity +nongravities +nongreasy +nongreen +nongregarious +nongregariously +nongregariousness +nongrey +nongremial +nongrieved +nongrieving +nongrievous +nongrievously +nongrievousness +nongrooming +nongrounded +nongrounding +nonguarantee +nonguaranty +nonguaranties +nonguard +nonguidable +nonguidance +nonguilt +nonguilts +nonguttural +nongutturally +nongutturalness +nonhabitability +nonhabitable +nonhabitableness +nonhabitably +nonhabitation +nonhabitual +nonhabitually +nonhabitualness +nonhabituating +nonhackneyed +nonhalation +nonhallucinated +nonhallucination +nonhallucinatory +nonhandicap +nonhardenable +nonhardy +nonharmony +nonharmonic +nonharmonies +nonharmonious +nonharmoniously +nonharmoniousness +nonhazardous +nonhazardously +nonhazardousness +nonheading +nonhearer +nonheathen +nonheathens +nonhectic +nonhectically +nonhedonic +nonhedonically +nonhedonistic +nonhedonistically +nonheinous +nonheinously +nonheinousness +nonhematic +nonhemophilic +nonhepatic +nonhereditability +nonhereditable +nonhereditably +nonhereditary +nonhereditarily +nonhereditariness +nonheretical +nonheretically +nonheritability +nonheritable +nonheritably +nonheritor +nonhero +nonheroes +nonheroic +nonheroical +nonheroically +nonheroicalness +nonheroicness +nonhesitant +nonhesitantly +nonheuristic +nonhydrated +nonhydraulic +nonhydrogenous +nonhydrolyzable +nonhydrophobic +nonhierarchic +nonhierarchical +nonhierarchically +nonhieratic +nonhieratical +nonhieratically +nonhygrometric +nonhygroscopic +nonhygroscopically +nonhyperbolic +nonhyperbolical +nonhyperbolically +nonhypnotic +nonhypnotically +nonhypostatic +nonhypostatical +nonhypostatically +nonhistone +nonhistoric +nonhistorical +nonhistorically +nonhistoricalness +nonhistrionic +nonhistrionical +nonhistrionically +nonhistrionicalness +nonhomaloidal +nonhomiletic +nonhomogeneity +nonhomogeneous +nonhomogeneously +nonhomogeneousness +nonhomogenous +nonhomologous +nonhostile +nonhostilely +nonhostility +nonhouseholder +nonhousekeeping +nonhubristic +nonhuman +nonhumaness +nonhumanist +nonhumanistic +nonhumanized +nonhumanness +nonhumorous +nonhumorously +nonhumorousness +nonhumus +nonhunting +nonya +nonic +noniconoclastic +noniconoclastically +nonideal +nonidealist +nonidealistic +nonidealistically +nonideational +nonideationally +nonidempotent +nonidentical +nonidentification +nonidentity +nonidentities +nonideologic +nonideological +nonideologically +nonidyllic +nonidyllically +nonidiomatic +nonidiomatical +nonidiomatically +nonidiomaticalness +nonidolatrous +nonidolatrously +nonidolatrousness +nonigneous +nonignitability +nonignitable +nonignitibility +nonignitible +nonignominious +nonignominiously +nonignominiousness +nonignorant +nonignorantly +nonyielding +nonyl +nonylene +nonylenic +nonylic +nonillative +nonillatively +nonillion +nonillionth +nonilluminant +nonilluminating +nonilluminatingly +nonillumination +nonilluminative +nonillusional +nonillusive +nonillusively +nonillusiveness +nonillustration +nonillustrative +nonillustratively +nonimaginary +nonimaginarily +nonimaginariness +nonimaginational +nonimbricate +nonimbricated +nonimbricately +nonimbricating +nonimbricative +nonimitability +nonimitable +nonimitating +nonimitation +nonimitational +nonimitative +nonimitatively +nonimitativeness +nonimmanence +nonimmanency +nonimmanent +nonimmanently +nonimmateriality +nonimmersion +nonimmigrant +nonimmigration +nonimmune +nonimmunity +nonimmunities +nonimmunization +nonimmunized +nonimpact +nonimpacted +nonimpairment +nonimpartation +nonimpartment +nonimpatience +nonimpeachability +nonimpeachable +nonimpeachment +nonimpedimental +nonimpedimentary +nonimperative +nonimperatively +nonimperativeness +nonimperial +nonimperialistic +nonimperialistically +nonimperially +nonimperialness +nonimperious +nonimperiously +nonimperiousness +nonimplement +nonimplemental +nonimplication +nonimplicative +nonimplicatively +nonimportation +nonimporting +nonimposition +nonimpregnated +nonimpressionability +nonimpressionable +nonimpressionableness +nonimpressionabness +nonimpressionist +nonimpressionistic +nonimprovement +nonimpulsive +nonimpulsively +nonimpulsiveness +nonimputability +nonimputable +nonimputableness +nonimputably +nonimputation +nonimputative +nonimputatively +nonimputativeness +nonincandescence +nonincandescent +nonincandescently +nonincarnate +nonincarnated +nonincestuous +nonincestuously +nonincestuousness +nonincident +nonincidental +nonincidentally +nonincitement +noninclinable +noninclination +noninclinational +noninclinatory +noninclusion +noninclusive +noninclusively +noninclusiveness +nonincorporated +nonincorporative +nonincreasable +nonincrease +nonincreasing +nonincriminating +nonincrimination +nonincriminatory +nonincrusting +nonindependent +nonindependently +nonindexed +nonindictable +nonindictment +nonindigenous +nonindividual +nonindividualistic +nonindividuality +nonindividualities +noninduced +noninducible +noninductive +noninductively +noninductivity +nonindulgence +nonindulgent +nonindulgently +nonindurated +nonindurative +nonindustrial +nonindustrialization +nonindustrially +nonindustrious +nonindustriously +nonindustriousness +noninert +noninertial +noninertly +noninertness +noninfallibilist +noninfallibility +noninfallible +noninfallibleness +noninfallibly +noninfantry +noninfected +noninfecting +noninfection +noninfectious +noninfectiously +noninfectiousness +noninferable +noninferably +noninferential +noninferentially +noninfinite +noninfinitely +noninfiniteness +noninflammability +noninflammable +noninflammableness +noninflammably +noninflammatory +noninflation +noninflationary +noninflected +noninflectional +noninflectionally +noninfluence +noninfluential +noninfluentially +noninformational +noninformative +noninformatively +noninformativeness +noninfraction +noninfusibility +noninfusible +noninfusibleness +noninfusibness +noninhabitability +noninhabitable +noninhabitance +noninhabitancy +noninhabitancies +noninhabitant +noninherence +noninherent +noninherently +noninheritability +noninheritable +noninheritableness +noninheritabness +noninherited +noninhibitive +noninhibitory +noninitial +noninitially +noninjury +noninjuries +noninjurious +noninjuriously +noninjuriousness +noninoculation +noninoculative +noninquiring +noninquiringly +noninsect +noninsertion +noninsistence +noninsistency +noninsistencies +noninsistent +noninspissating +noninstinctive +noninstinctively +noninstinctual +noninstinctually +noninstitution +noninstitutional +noninstitutionally +noninstruction +noninstructional +noninstructionally +noninstructive +noninstructively +noninstructiveness +noninstructress +noninstrumental +noninstrumentalistic +noninstrumentally +noninsular +noninsularity +noninsurance +nonintegrable +nonintegration +nonintegrity +nonintellectual +nonintellectually +nonintellectualness +nonintellectuals +nonintelligence +nonintelligent +nonintelligently +nonintent +nonintention +noninteracting +noninteractive +nonintercepting +noninterceptive +noninterchangeability +noninterchangeable +noninterchangeableness +noninterchangeably +nonintercourse +noninterdependence +noninterdependency +noninterdependent +noninterdependently +noninterfaced +noninterference +noninterferer +noninterfering +noninterferingly +noninterleaved +nonintermission +nonintermittence +nonintermittent +nonintermittently +nonintermittentness +noninternational +noninternationally +noninterpolating +noninterpolation +noninterpolative +noninterposition +noninterpretability +noninterpretable +noninterpretational +noninterpretative +noninterpretively +noninterpretiveness +noninterrupted +noninterruptedly +noninterruptedness +noninterruption +noninterruptive +nonintersecting +nonintersectional +nonintersector +nonintervention +noninterventional +noninterventionalist +noninterventionist +noninterventionists +nonintimidation +nonintoxicant +nonintoxicants +nonintoxicating +nonintoxicatingly +nonintoxicative +nonintrospective +nonintrospectively +nonintrospectiveness +nonintroversive +nonintroversively +nonintroversiveness +nonintroverted +nonintrovertedly +nonintrovertedness +nonintrusion +nonintrusionism +nonintrusionist +nonintrusive +nonintuitive +nonintuitively +nonintuitiveness +noninvasive +noninverted +noninverting +noninvidious +noninvidiously +noninvidiousness +noninvincibility +noninvincible +noninvincibleness +noninvincibly +noninvolved +noninvolvement +noniodized +nonion +nonionic +nonionized +nonionizing +nonirate +nonirately +nonirenic +nonirenical +noniridescence +noniridescent +noniridescently +nonironic +nonironical +nonironically +nonironicalness +nonirradiated +nonirrational +nonirrationally +nonirrationalness +nonirreparable +nonirrevocability +nonirrevocable +nonirrevocableness +nonirrevocably +nonirrigable +nonirrigated +nonirrigating +nonirrigation +nonirritability +nonirritable +nonirritableness +nonirritably +nonirritancy +nonirritant +nonirritating +nonisobaric +nonisoelastic +nonisolable +nonisotropic +nonisotropous +nonissuable +nonissuably +nonius +nonjoinder +nonjournalistic +nonjournalistically +nonjudgmental +nonjudicable +nonjudicative +nonjudicatory +nonjudicatories +nonjudiciable +nonjudicial +nonjudicially +nonjurable +nonjurancy +nonjurant +nonjurantism +nonjuress +nonjury +nonjuridic +nonjuridical +nonjuridically +nonjuries +nonjurying +nonjuring +nonjurist +nonjuristic +nonjuristical +nonjuristically +nonjuror +nonjurorism +nonjurors +nonkinetic +nonknowledge +nonknowledgeable +nonkosher +nonlabeling +nonlabelling +nonlacteal +nonlacteally +nonlacteous +nonlactescent +nonlactic +nonlayered +nonlaying +nonlaminable +nonlaminated +nonlaminating +nonlaminative +nonlanguage +nonlarcenous +nonlawyer +nonleaded +nonleaking +nonlegal +nonlegato +nonlegislative +nonlegislatively +nonlegitimacy +nonlegitimate +nonlegume +nonleguminous +nonlepidopteral +nonlepidopteran +nonlepidopterous +nonleprous +nonleprously +nonlethal +nonlethally +nonlethargic +nonlethargical +nonlethargically +nonlevel +nonleviable +nonlevulose +nonly +nonliability +nonliabilities +nonliable +nonlibelous +nonlibelously +nonliberal +nonliberalism +nonliberation +nonlibidinous +nonlibidinously +nonlibidinousness +nonlicensable +nonlicensed +nonlicentiate +nonlicentious +nonlicentiously +nonlicentiousness +nonlicet +nonlicit +nonlicking +nonlife +nonlimitation +nonlimitative +nonlimiting +nonlymphatic +nonlineal +nonlinear +nonlinearity +nonlinearities +nonlinearly +nonlinguistic +nonlinkage +nonlipoidal +nonliquefiable +nonliquefying +nonliquid +nonliquidating +nonliquidation +nonliquidly +nonlyric +nonlyrical +nonlyrically +nonlyricalness +nonlyricism +nonlister +nonlisting +nonliteracy +nonliteral +nonliterality +nonliterally +nonliteralness +nonliterary +nonliterarily +nonliterariness +nonliterate +nonlitigated +nonlitigation +nonlitigious +nonlitigiously +nonlitigiousness +nonliturgic +nonliturgical +nonliturgically +nonlive +nonlives +nonliving +nonlixiviated +nonlixiviation +nonlocal +nonlocalizable +nonlocalized +nonlocally +nonlocals +nonlocation +nonlogic +nonlogical +nonlogicality +nonlogically +nonlogicalness +nonlogistic +nonlogistical +nonloyal +nonloyally +nonloyalty +nonloyalties +nonlosable +nonloser +nonlover +nonloving +nonloxodromic +nonloxodromical +nonlubricant +nonlubricating +nonlubricious +nonlubriciously +nonlubriciousness +nonlucid +nonlucidity +nonlucidly +nonlucidness +nonlucrative +nonlucratively +nonlucrativeness +nonlugubrious +nonlugubriously +nonlugubriousness +nonluminescence +nonluminescent +nonluminosity +nonluminous +nonluminously +nonluminousness +nonluster +nonlustrous +nonlustrously +nonlustrousness +nonmagnetic +nonmagnetical +nonmagnetically +nonmagnetizable +nonmagnetized +nonmailable +nonmaintenance +nonmajority +nonmajorities +nonmakeup +nonmalarial +nonmalarian +nonmalarious +nonmalicious +nonmaliciously +nonmaliciousness +nonmalignance +nonmalignancy +nonmalignant +nonmalignantly +nonmalignity +nonmalleability +nonmalleable +nonmalleableness +nonmalleabness +nonmammalian +nonman +nonmanagement +nonmandatory +nonmandatories +nonmanifest +nonmanifestation +nonmanifestly +nonmanifestness +nonmanila +nonmanipulative +nonmanipulatory +nonmannered +nonmanneristic +nonmannite +nonmanual +nonmanually +nonmanufacture +nonmanufactured +nonmanufacturing +nonmarine +nonmarital +nonmaritally +nonmaritime +nonmarket +nonmarketability +nonmarketable +nonmarriage +nonmarriageability +nonmarriageable +nonmarriageableness +nonmarriageabness +nonmarrying +nonmartial +nonmartially +nonmartialness +nonmarveling +nonmasculine +nonmasculinely +nonmasculineness +nonmasculinity +nonmaskable +nonmason +nonmastery +nonmasteries +nonmatching +nonmaterial +nonmaterialistic +nonmaterialistically +nonmateriality +nonmaternal +nonmaternally +nonmathematic +nonmathematical +nonmathematically +nonmathematician +nonmatrimonial +nonmatrimonially +nonmatter +nonmaturation +nonmaturative +nonmature +nonmaturely +nonmatureness +nonmaturity +nonmeasurability +nonmeasurable +nonmeasurableness +nonmeasurably +nonmechanical +nonmechanically +nonmechanicalness +nonmechanistic +nonmediation +nonmediative +nonmedicable +nonmedical +nonmedically +nonmedicative +nonmedicinal +nonmedicinally +nonmeditative +nonmeditatively +nonmeditativeness +nonmedullated +nonmelodic +nonmelodically +nonmelodious +nonmelodiously +nonmelodiousness +nonmelodramatic +nonmelodramatically +nonmelting +nonmember +nonmembers +nonmembership +nonmen +nonmenacing +nonmendicancy +nonmendicant +nonmenial +nonmenially +nonmental +nonmentally +nonmercantile +nonmercearies +nonmercenary +nonmercenaries +nonmerchantable +nonmeritorious +nonmetal +nonmetallic +nonmetalliferous +nonmetallurgic +nonmetallurgical +nonmetallurgically +nonmetals +nonmetamorphic +nonmetamorphoses +nonmetamorphosis +nonmetamorphous +nonmetaphysical +nonmetaphysically +nonmetaphoric +nonmetaphorical +nonmetaphorically +nonmeteoric +nonmeteorically +nonmeteorologic +nonmeteorological +nonmeteorologically +nonmethodic +nonmethodical +nonmethodically +nonmethodicalness +nonmetric +nonmetrical +nonmetrically +nonmetropolitan +nonmicrobic +nonmicroprogrammed +nonmicroscopic +nonmicroscopical +nonmicroscopically +nonmigrant +nonmigrating +nonmigration +nonmigratory +nonmilitancy +nonmilitant +nonmilitantly +nonmilitants +nonmilitary +nonmilitarily +nonmillionaire +nonmimetic +nonmimetically +nonmineral +nonmineralogical +nonmineralogically +nonminimal +nonministerial +nonministerially +nonministration +nonmyopic +nonmyopically +nonmiraculous +nonmiraculously +nonmiraculousness +nonmischievous +nonmischievously +nonmischievousness +nonmiscibility +nonmiscible +nonmissionary +nonmissionaries +nonmystic +nonmystical +nonmystically +nonmysticalness +nonmysticism +nonmythical +nonmythically +nonmythologic +nonmythological +nonmythologically +nonmitigation +nonmitigative +nonmitigatory +nonmobile +nonmobility +nonmodal +nonmodally +nonmoderate +nonmoderately +nonmoderateness +nonmodern +nonmodernistic +nonmodernly +nonmodernness +nonmodificative +nonmodificatory +nonmodifying +nonmolar +nonmolecular +nonmomentary +nonmomentariness +nonmonarchal +nonmonarchally +nonmonarchial +nonmonarchic +nonmonarchical +nonmonarchically +nonmonarchist +nonmonarchistic +nonmonastic +nonmonastically +nonmoney +nonmonetary +nonmonist +nonmonistic +nonmonistically +nonmonogamous +nonmonogamously +nonmonopolistic +nonmonotheistic +nonmorainic +nonmoral +nonmorality +nonmortal +nonmortally +nonmotile +nonmotility +nonmotion +nonmotivated +nonmotivation +nonmotivational +nonmotoring +nonmotorist +nonmountainous +nonmountainously +nonmoveability +nonmoveable +nonmoveableness +nonmoveably +nonmucilaginous +nonmucous +nonmulched +nonmultiple +nonmultiplication +nonmultiplicational +nonmultiplicative +nonmultiplicatively +nonmunicipal +nonmunicipally +nonmuscular +nonmuscularly +nonmusical +nonmusically +nonmusicalness +nonmussable +nonmutability +nonmutable +nonmutableness +nonmutably +nonmutational +nonmutationally +nonmutative +nonmutinous +nonmutinously +nonmutinousness +nonmutual +nonmutuality +nonmutually +nonnant +nonnarcism +nonnarcissism +nonnarcissistic +nonnarcotic +nonnarration +nonnarrative +nonnasal +nonnasality +nonnasally +nonnat +nonnational +nonnationalism +nonnationalistic +nonnationalistically +nonnationalization +nonnationally +nonnative +nonnatively +nonnativeness +nonnatives +nonnatty +nonnattily +nonnattiness +nonnatural +nonnaturalism +nonnaturalist +nonnaturalistic +nonnaturality +nonnaturally +nonnaturalness +nonnaturals +nonnautical +nonnautically +nonnaval +nonnavigability +nonnavigable +nonnavigableness +nonnavigably +nonnavigation +nonnebular +nonnebulous +nonnebulously +nonnebulousness +nonnecessary +nonnecessity +nonnecessities +nonnecessitous +nonnecessitously +nonnecessitousness +nonnegation +nonnegative +nonnegativism +nonnegativistic +nonnegativity +nonnegligence +nonnegligent +nonnegligently +nonnegligibility +nonnegligible +nonnegligibleness +nonnegligibly +nonnegotiability +nonnegotiable +nonnegotiation +nonnephritic +nonnervous +nonnervously +nonnervousness +nonnescience +nonnescient +nonneural +nonneurotic +nonneutral +nonneutrality +nonneutrally +nonny +nonnicotinic +nonnihilism +nonnihilist +nonnihilistic +nonnitric +nonnitrogenized +nonnitrogenous +nonnitrous +nonnobility +nonnoble +nonnocturnal +nonnocturnally +nonnomad +nonnomadic +nonnomadically +nonnominalistic +nonnomination +nonnormal +nonnormality +nonnormally +nonnormalness +nonnotable +nonnotableness +nonnotably +nonnotational +nonnotification +nonnotional +nonnoumenal +nonnoumenally +nonnourishing +nonnourishment +nonnuclear +nonnucleated +nonnullification +nonnumeral +nonnumeric +nonnumerical +nonnutrient +nonnutriment +nonnutritious +nonnutritiously +nonnutritiousness +nonnutritive +nonnutritively +nonnutritiveness +nonobedience +nonobedient +nonobediently +nonobese +nonobjectification +nonobjection +nonobjective +nonobjectivism +nonobjectivist +nonobjectivistic +nonobjectivity +nonobligated +nonobligatory +nonobligatorily +nonobscurity +nonobscurities +nonobservable +nonobservably +nonobservance +nonobservant +nonobservantly +nonobservation +nonobservational +nonobserving +nonobservingly +nonobsession +nonobsessional +nonobsessive +nonobsessively +nonobsessiveness +nonobstetric +nonobstetrical +nonobstetrically +nonobstructive +nonobstructively +nonobstructiveness +nonobvious +nonobviously +nonobviousness +nonoccidental +nonoccidentally +nonocclusion +nonocclusive +nonoccult +nonocculting +nonoccupance +nonoccupancy +nonoccupant +nonoccupation +nonoccupational +nonoccurrence +nonodoriferous +nonodoriferously +nonodoriferousness +nonodorous +nonodorously +nonodorousness +nonoecumenic +nonoecumenical +nonoffender +nonoffensive +nonoffensively +nonoffensiveness +nonofficeholder +nonofficeholding +nonofficial +nonofficially +nonofficinal +nonogenarian +nonoic +nonoily +nonolfactory +nonolfactories +nonoligarchic +nonoligarchical +nonomad +nonomissible +nonomission +nononerous +nononerously +nononerousness +nonopacity +nonopacities +nonopaque +nonopening +nonoperable +nonoperatic +nonoperatically +nonoperating +nonoperational +nonoperative +nonopinionaness +nonopinionated +nonopinionatedness +nonopinionative +nonopinionatively +nonopinionativeness +nonopposable +nonopposal +nonopposing +nonopposition +nonoppression +nonoppressive +nonoppressively +nonoppressiveness +nonopprobrious +nonopprobriously +nonopprobriousness +nonoptic +nonoptical +nonoptically +nonoptimistic +nonoptimistical +nonoptimistically +nonoptional +nonoptionally +nonoral +nonorally +nonorchestral +nonorchestrally +nonordained +nonordered +nonordination +nonorganic +nonorganically +nonorganization +nonorientable +nonoriental +nonorientation +nonoriginal +nonoriginally +nonornamental +nonornamentality +nonornamentally +nonorthodox +nonorthodoxly +nonorthogonal +nonorthogonality +nonorthographic +nonorthographical +nonorthographically +nonoscine +nonosmotic +nonosmotically +nonostensible +nonostensibly +nonostensive +nonostensively +nonostentation +nonoutlawry +nonoutlawries +nonoutrage +nonoverhead +nonoverlapping +nonowner +nonowners +nonowning +nonoxidating +nonoxidation +nonoxidative +nonoxidizable +nonoxidization +nonoxidizing +nonoxygenated +nonoxygenous +nonpacifiable +nonpacific +nonpacifical +nonpacifically +nonpacification +nonpacificatory +nonpacifist +nonpacifistic +nonpagan +nonpaganish +nonpagans +nonpaid +nonpayer +nonpaying +nonpayment +nonpainter +nonpalatability +nonpalatable +nonpalatableness +nonpalatably +nonpalatal +nonpalatalization +nonpalliation +nonpalliative +nonpalliatively +nonpalpability +nonpalpable +nonpalpably +nonpantheistic +nonpantheistical +nonpantheistically +nonpapal +nonpapist +nonpapistic +nonpapistical +nonpar +nonparabolic +nonparabolical +nonparabolically +nonparadoxical +nonparadoxically +nonparadoxicalness +nonparalyses +nonparalysis +nonparalytic +nonparallel +nonparallelism +nonparametric +nonparasitic +nonparasitical +nonparasitically +nonparasitism +nonpardoning +nonpareil +nonpareils +nonparent +nonparental +nonparentally +nonpariello +nonparishioner +nonparity +nonparliamentary +nonparlor +nonparochial +nonparochially +nonparous +nonparty +nonpartial +nonpartiality +nonpartialities +nonpartially +nonpartible +nonparticipant +nonparticipating +nonparticipation +nonpartisan +nonpartisanism +nonpartisans +nonpartisanship +nonpartizan +nonpartner +nonpassenger +nonpasserine +nonpassible +nonpassionate +nonpassionately +nonpassionateness +nonpastoral +nonpastorally +nonpatentability +nonpatentable +nonpatented +nonpatently +nonpaternal +nonpaternally +nonpathogenic +nonpathologic +nonpathological +nonpathologically +nonpatriotic +nonpatriotically +nonpatterned +nonpause +nonpeak +nonpeaked +nonpearlitic +nonpecuniary +nonpedagogic +nonpedagogical +nonpedagogically +nonpedestrian +nonpedigree +nonpedigreed +nonpejorative +nonpejoratively +nonpelagic +nonpeltast +nonpenal +nonpenalized +nonpendant +nonpendency +nonpendent +nonpendently +nonpending +nonpenetrability +nonpenetrable +nonpenetrably +nonpenetrating +nonpenetration +nonpenitent +nonpensionable +nonpensioner +nonperceivable +nonperceivably +nonperceiving +nonperceptibility +nonperceptible +nonperceptibleness +nonperceptibly +nonperception +nonperceptional +nonperceptive +nonperceptively +nonperceptiveness +nonperceptivity +nonperceptual +nonpercipience +nonpercipiency +nonpercipient +nonpercussive +nonperfected +nonperfectibility +nonperfectible +nonperfection +nonperforate +nonperforated +nonperforating +nonperformance +nonperformer +nonperforming +nonperilous +nonperilously +nonperiodic +nonperiodical +nonperiodically +nonperishable +nonperishables +nonperishing +nonperjured +nonperjury +nonperjuries +nonpermanence +nonpermanency +nonpermanent +nonpermanently +nonpermeability +nonpermeable +nonpermeation +nonpermeative +nonpermissibility +nonpermissible +nonpermissibly +nonpermission +nonpermissive +nonpermissively +nonpermissiveness +nonpermitted +nonperpendicular +nonperpendicularity +nonperpendicularly +nonperpetration +nonperpetual +nonperpetually +nonperpetuance +nonperpetuation +nonperpetuity +nonperpetuities +nonpersecuting +nonpersecution +nonpersecutive +nonpersecutory +nonperseverance +nonperseverant +nonpersevering +nonpersistence +nonpersistency +nonpersistent +nonpersistently +nonpersisting +nonperson +nonpersonal +nonpersonally +nonpersonification +nonperspective +nonpersuadable +nonpersuasible +nonpersuasive +nonpersuasively +nonpersuasiveness +nonpertinence +nonpertinency +nonpertinent +nonpertinently +nonperturbable +nonperturbing +nonperverse +nonperversely +nonperverseness +nonperversion +nonperversity +nonperversities +nonperversive +nonperverted +nonpervertedly +nonpervertible +nonpessimistic +nonpessimistically +nonpestilent +nonpestilential +nonpestilently +nonphagocytic +nonpharmaceutic +nonpharmaceutical +nonpharmaceutically +nonphenolic +nonphenomenal +nonphenomenally +nonphilanthropic +nonphilanthropical +nonphilologic +nonphilological +nonphilosophy +nonphilosophic +nonphilosophical +nonphilosophically +nonphilosophies +nonphysical +nonphysically +nonphysiologic +nonphysiological +nonphysiologically +nonphobic +nonphonemic +nonphonemically +nonphonetic +nonphonetical +nonphonetically +nonphosphatic +nonphosphorized +nonphosphorous +nonphotobiotic +nonphotographic +nonphotographical +nonphotographically +nonphrenetic +nonphrenetically +nonpickable +nonpictorial +nonpictorially +nonpigmented +nonpinaceous +nonpyogenic +nonpyritiferous +nonplacental +nonplacet +nonplanar +nonplane +nonplanetary +nonplantowning +nonplastic +nonplasticity +nonplate +nonplated +nonplatitudinous +nonplatitudinously +nonplausibility +nonplausible +nonplausibleness +nonplausibly +nonpleadable +nonpleading +nonpleadingly +nonpliability +nonpliable +nonpliableness +nonpliably +nonpliancy +nonpliant +nonpliantly +nonpliantness +nonpluralistic +nonplurality +nonpluralities +nonplus +nonplusation +nonplused +nonpluses +nonplushed +nonplusing +nonplussation +nonplussed +nonplusses +nonplussing +nonplutocratic +nonplutocratical +nonpneumatic +nonpneumatically +nonpoet +nonpoetic +nonpoisonous +nonpoisonously +nonpoisonousness +nonpolar +nonpolarity +nonpolarizable +nonpolarizing +nonpolemic +nonpolemical +nonpolemically +nonpolitical +nonpolitically +nonpolluted +nonpolluting +nonponderability +nonponderable +nonponderosity +nonponderous +nonponderously +nonponderousness +nonpopery +nonpopular +nonpopularity +nonpopularly +nonpopulous +nonpopulously +nonpopulousness +nonporness +nonpornographic +nonporous +nonporousness +nonporphyritic +nonport +nonportability +nonportable +nonportentous +nonportentously +nonportentousness +nonportrayable +nonportrayal +nonpositive +nonpositivistic +nonpossessed +nonpossession +nonpossessive +nonpossessively +nonpossessiveness +nonpossessory +nonpossible +nonpossibly +nonposthumous +nonpostponement +nonpotable +nonpotential +nonpower +nonpracticability +nonpracticable +nonpracticableness +nonpracticably +nonpractical +nonpracticality +nonpractically +nonpracticalness +nonpractice +nonpracticed +nonpraedial +nonpragmatic +nonpragmatical +nonpragmatically +nonpreaching +nonprecedent +nonprecedential +nonprecious +nonpreciously +nonpreciousness +nonprecipitation +nonprecipitative +nonpredatory +nonpredatorily +nonpredatoriness +nonpredestination +nonpredicative +nonpredicatively +nonpredictable +nonpredictive +nonpreferability +nonpreferable +nonpreferableness +nonpreferably +nonpreference +nonpreferential +nonpreferentialism +nonpreferentially +nonpreformed +nonpregnant +nonprehensile +nonprejudiced +nonprejudicial +nonprejudicially +nonprelatic +nonprelatical +nonpremium +nonprepayment +nonpreparation +nonpreparative +nonpreparatory +nonpreparedness +nonprepositional +nonprepositionally +nonpresbyter +nonprescient +nonpresciently +nonprescribed +nonprescriber +nonprescription +nonprescriptive +nonpresence +nonpresentability +nonpresentable +nonpresentableness +nonpresentably +nonpresentation +nonpresentational +nonpreservable +nonpreservation +nonpreservative +nonpresidential +nonpress +nonpressing +nonpressure +nonpresumptive +nonpresumptively +nonprevalence +nonprevalent +nonprevalently +nonpreventable +nonpreventible +nonprevention +nonpreventive +nonpreventively +nonpreventiveness +nonpriestly +nonprimitive +nonprimitively +nonprimitiveness +nonprincipiate +nonprincipled +nonprintable +nonprinting +nonprivileged +nonprivity +nonprivities +nonprobability +nonprobabilities +nonprobable +nonprobably +nonprobation +nonprobative +nonprobatory +nonproblematic +nonproblematical +nonproblematically +nonprocedural +nonprocedurally +nonprocessional +nonprocreation +nonprocreative +nonprocurable +nonprocuration +nonprocurement +nonproducer +nonproducible +nonproducing +nonproduction +nonproductive +nonproductively +nonproductiveness +nonproductivity +nonprofane +nonprofanely +nonprofaneness +nonprofanity +nonprofanities +nonprofessed +nonprofession +nonprofessional +nonprofessionalism +nonprofessionally +nonprofessorial +nonprofessorially +nonproficience +nonproficiency +nonproficient +nonprofit +nonprofitability +nonprofitable +nonprofitablely +nonprofitableness +nonprofiteering +nonprognostication +nonprognosticative +nonprogrammable +nonprogrammer +nonprogressive +nonprogressively +nonprogressiveness +nonprohibitable +nonprohibition +nonprohibitive +nonprohibitively +nonprohibitory +nonprohibitorily +nonprojecting +nonprojection +nonprojective +nonprojectively +nonproletarian +nonproletariat +nonproliferation +nonproliferous +nonprolific +nonprolificacy +nonprolifically +nonprolificness +nonprolifiness +nonprolix +nonprolixity +nonprolixly +nonprolixness +nonprolongation +nonprominence +nonprominent +nonprominently +nonpromiscuous +nonpromiscuously +nonpromiscuousness +nonpromissory +nonpromotion +nonpromotive +nonpromulgation +nonpronunciation +nonpropagable +nonpropagandist +nonpropagandistic +nonpropagation +nonpropagative +nonpropellent +nonprophetic +nonprophetical +nonprophetically +nonpropitiable +nonpropitiation +nonpropitiative +nonproportionable +nonproportional +nonproportionally +nonproportionate +nonproportionately +nonproportionateness +nonproportioned +nonproprietary +nonproprietaries +nonpropriety +nonproprietor +nonprorogation +nonpros +nonprosaic +nonprosaically +nonprosaicness +nonproscription +nonproscriptive +nonproscriptively +nonprosecution +nonprospect +nonprosperity +nonprosperous +nonprosperously +nonprosperousness +nonprossed +nonprosses +nonprossing +nonprotecting +nonprotection +nonprotective +nonprotectively +nonproteid +nonprotein +nonproteinaceous +nonprotestation +nonprotesting +nonprotractile +nonprotractility +nonprotraction +nonprotrusion +nonprotrusive +nonprotrusively +nonprotrusiveness +nonprotuberance +nonprotuberancy +nonprotuberancies +nonprotuberant +nonprotuberantly +nonprovable +nonproven +nonprovided +nonprovident +nonprovidential +nonprovidentially +nonprovidently +nonprovider +nonprovincial +nonprovincially +nonprovisional +nonprovisionally +nonprovisionary +nonprovocation +nonprovocative +nonprovocatively +nonprovocativeness +nonproximity +nonprudence +nonprudent +nonprudential +nonprudentially +nonprudently +nonpsychiatric +nonpsychic +nonpsychical +nonpsychically +nonpsychoanalytic +nonpsychoanalytical +nonpsychoanalytically +nonpsychologic +nonpsychological +nonpsychologically +nonpsychopathic +nonpsychopathically +nonpsychotic +nonpublic +nonpublication +nonpublicity +nonpublishable +nonpueblo +nonpuerile +nonpuerilely +nonpuerility +nonpuerilities +nonpulmonary +nonpulsating +nonpulsation +nonpulsative +nonpumpable +nonpunctual +nonpunctually +nonpunctualness +nonpunctuating +nonpunctuation +nonpuncturable +nonpungency +nonpungent +nonpungently +nonpunishable +nonpunishing +nonpunishment +nonpunitive +nonpunitory +nonpurchasability +nonpurchasable +nonpurchase +nonpurchaser +nonpurgation +nonpurgative +nonpurgatively +nonpurgatorial +nonpurification +nonpurifying +nonpuristic +nonpurposive +nonpurposively +nonpurposiveness +nonpursuance +nonpursuant +nonpursuantly +nonpursuit +nonpurulence +nonpurulent +nonpurulently +nonpurveyance +nonputrescence +nonputrescent +nonputrescible +nonputting +nonqualification +nonqualifying +nonqualitative +nonqualitatively +nonquality +nonqualities +nonquantitative +nonquantitatively +nonquantitativeness +nonquota +nonrabbinical +nonracial +nonracially +nonradiable +nonradiance +nonradiancy +nonradiant +nonradiantly +nonradiating +nonradiation +nonradiative +nonradical +nonradically +nonradicalness +nonradicness +nonradioactive +nonrayed +nonrailroader +nonraisable +nonraiseable +nonraised +nonrandom +nonrandomly +nonrandomness +nonranging +nonrapport +nonratability +nonratable +nonratableness +nonratably +nonrateability +nonrateable +nonrateableness +nonrateably +nonrated +nonratification +nonratifying +nonrational +nonrationalism +nonrationalist +nonrationalistic +nonrationalistical +nonrationalistically +nonrationality +nonrationalization +nonrationalized +nonrationally +nonrationalness +nonreaction +nonreactionary +nonreactionaries +nonreactive +nonreactor +nonreadability +nonreadable +nonreadableness +nonreadably +nonreader +nonreaders +nonreading +nonrealism +nonrealist +nonrealistic +nonrealistically +nonreality +nonrealities +nonrealizable +nonrealization +nonrealizing +nonreasonability +nonreasonable +nonreasonableness +nonreasonably +nonreasoner +nonreasoning +nonrebel +nonrebellion +nonrebellious +nonrebelliously +nonrebelliousness +nonrecalcitrance +nonrecalcitrancy +nonrecalcitrant +nonreceipt +nonreceivable +nonreceiving +nonrecent +nonreception +nonreceptive +nonreceptively +nonreceptiveness +nonreceptivity +nonrecess +nonrecession +nonrecessive +nonrecipience +nonrecipiency +nonrecipient +nonreciprocal +nonreciprocally +nonreciprocals +nonreciprocating +nonreciprocity +nonrecision +nonrecital +nonrecitation +nonrecitative +nonreclaimable +nonreclamation +nonrecluse +nonreclusive +nonrecognition +nonrecognized +nonrecoil +nonrecoiling +nonrecollection +nonrecollective +nonrecombinant +nonrecommendation +nonreconcilability +nonreconcilable +nonreconcilableness +nonreconcilably +nonreconciliation +nonrecourse +nonrecoverable +nonrecovery +nonrectangular +nonrectangularity +nonrectangularly +nonrectifiable +nonrectified +nonrecuperatiness +nonrecuperation +nonrecuperative +nonrecuperativeness +nonrecuperatory +nonrecurent +nonrecurently +nonrecurrent +nonrecurring +nonredeemable +nonredemptible +nonredemption +nonredemptive +nonredressing +nonreduced +nonreducibility +nonreducible +nonreducibly +nonreducing +nonreduction +nonreductional +nonreductive +nonreference +nonrefillable +nonrefined +nonrefinement +nonreflected +nonreflecting +nonreflection +nonreflective +nonreflectively +nonreflectiveness +nonreflector +nonreformation +nonreformational +nonrefracting +nonrefraction +nonrefractional +nonrefractive +nonrefractively +nonrefractiveness +nonrefrigerant +nonrefueling +nonrefuelling +nonrefundable +nonrefutal +nonrefutation +nonregardance +nonregarding +nonregenerate +nonregenerating +nonregeneration +nonregenerative +nonregeneratively +nonregent +nonregimental +nonregimented +nonregistered +nonregistrability +nonregistrable +nonregistration +nonregression +nonregressive +nonregressively +nonregulation +nonregulative +nonregulatory +nonrehabilitation +nonreigning +nonreimbursement +nonreinforcement +nonreinstatement +nonrejection +nonrejoinder +nonrelapsed +nonrelated +nonrelatiness +nonrelation +nonrelational +nonrelative +nonrelatively +nonrelativeness +nonrelativistic +nonrelativistically +nonrelativity +nonrelaxation +nonrelease +nonrelenting +nonreliability +nonreliable +nonreliableness +nonreliably +nonreliance +nonrelieving +nonreligion +nonreligious +nonreligiously +nonreligiousness +nonrelinquishment +nonremanie +nonremedy +nonremediability +nonremediable +nonremediably +nonremedial +nonremedially +nonremedies +nonremembrance +nonremissible +nonremission +nonremittable +nonremittably +nonremittal +nonremonstrance +nonremonstrant +nonremovable +nonremuneration +nonremunerative +nonremuneratively +nonrendition +nonrenewable +nonrenewal +nonrenouncing +nonrenunciation +nonrepayable +nonrepaying +nonrepair +nonrepairable +nonreparable +nonreparation +nonrepatriable +nonrepatriation +nonrepealable +nonrepealing +nonrepeat +nonrepeated +nonrepeater +nonrepellence +nonrepellency +nonrepellent +nonrepeller +nonrepentance +nonrepentant +nonrepentantly +nonrepetition +nonrepetitious +nonrepetitiously +nonrepetitiousness +nonrepetitive +nonrepetitively +nonreplaceable +nonreplacement +nonreplicate +nonreplicated +nonreplication +nonreportable +nonreprehensibility +nonreprehensible +nonreprehensibleness +nonreprehensibly +nonrepresentable +nonrepresentation +nonrepresentational +nonrepresentationalism +nonrepresentationist +nonrepresentative +nonrepresentatively +nonrepresentativeness +nonrepressed +nonrepressible +nonrepressibleness +nonrepressibly +nonrepression +nonrepressive +nonreprisal +nonreproducible +nonreproduction +nonreproductive +nonreproductively +nonreproductiveness +nonrepublican +nonrepudiable +nonrepudiation +nonrepudiative +nonreputable +nonreputably +nonrequirable +nonrequirement +nonrequisite +nonrequisitely +nonrequisiteness +nonrequisition +nonrequital +nonrescissible +nonrescission +nonrescissory +nonrescue +nonresemblance +nonreservable +nonreservation +nonreserve +nonresidence +nonresidency +nonresident +nonresidental +nonresidenter +nonresidential +nonresidentiary +nonresidentor +nonresidents +nonresidual +nonresignation +nonresilience +nonresiliency +nonresilient +nonresiliently +nonresinifiable +nonresistance +nonresistant +nonresistants +nonresister +nonresistibility +nonresistible +nonresisting +nonresistive +nonresistively +nonresistiveness +nonresolution +nonresolvability +nonresolvable +nonresolvableness +nonresolvably +nonresolvabness +nonresonant +nonresonantly +nonrespectability +nonrespectabilities +nonrespectable +nonrespectableness +nonrespectably +nonrespirable +nonresponsibility +nonresponsibilities +nonresponsible +nonresponsibleness +nonresponsibly +nonresponsive +nonresponsively +nonrestitution +nonrestoration +nonrestorative +nonrestrained +nonrestraint +nonrestricted +nonrestrictedly +nonrestricting +nonrestriction +nonrestrictive +nonrestrictively +nonresumption +nonresurrection +nonresurrectional +nonresuscitable +nonresuscitation +nonresuscitative +nonretail +nonretainable +nonretainment +nonretaliation +nonretardation +nonretardative +nonretardatory +nonretarded +nonretardment +nonretention +nonretentive +nonretentively +nonretentiveness +nonreticence +nonreticent +nonreticently +nonretinal +nonretired +nonretirement +nonretiring +nonretraceable +nonretractation +nonretractile +nonretractility +nonretraction +nonretrenchment +nonretroactive +nonretroactively +nonretroactivity +nonreturn +nonreturnable +nonrevaluation +nonrevealing +nonrevelation +nonrevenge +nonrevenger +nonrevenue +nonreverence +nonreverent +nonreverential +nonreverentially +nonreverently +nonreverse +nonreversed +nonreversibility +nonreversible +nonreversibleness +nonreversibly +nonreversing +nonreversion +nonrevertible +nonrevertive +nonreviewable +nonrevision +nonrevival +nonrevivalist +nonrevocability +nonrevocable +nonrevocably +nonrevocation +nonrevokable +nonrevolting +nonrevoltingly +nonrevolution +nonrevolutionary +nonrevolutionaries +nonrevolving +nonrhetorical +nonrhetorically +nonrheumatic +nonrhyme +nonrhymed +nonrhyming +nonrhythm +nonrhythmic +nonrhythmical +nonrhythmically +nonriding +nonrigid +nonrigidity +nonrioter +nonrioting +nonriparian +nonritualistic +nonritualistically +nonrival +nonrivals +nonroyal +nonroyalist +nonroyally +nonroyalty +nonromantic +nonromantically +nonromanticism +nonrotatable +nonrotating +nonrotation +nonrotational +nonrotative +nonround +nonrousing +nonroutine +nonrubber +nonrudimental +nonrudimentary +nonrudimentarily +nonrudimentariness +nonruinable +nonruinous +nonruinously +nonruinousness +nonruling +nonruminant +nonruminantia +nonruminating +nonruminatingly +nonrumination +nonruminative +nonrun +nonrupturable +nonrupture +nonrural +nonrurally +nonrustable +nonrustic +nonrustically +nonsabbatic +nonsaccharin +nonsaccharine +nonsaccharinity +nonsacerdotal +nonsacerdotally +nonsacramental +nonsacred +nonsacredly +nonsacredness +nonsacrifice +nonsacrificial +nonsacrificing +nonsacrilegious +nonsacrilegiously +nonsacrilegiousness +nonsailor +nonsalability +nonsalable +nonsalably +nonsalaried +nonsale +nonsaleability +nonsaleable +nonsaleably +nonsaline +nonsalinity +nonsalubrious +nonsalubriously +nonsalubriousness +nonsalutary +nonsalutarily +nonsalutariness +nonsalutation +nonsalvageable +nonsalvation +nonsanative +nonsancties +nonsanctification +nonsanctimony +nonsanctimonious +nonsanctimoniously +nonsanctimoniousness +nonsanction +nonsanctity +nonsanctities +nonsane +nonsanely +nonsaneness +nonsanguine +nonsanguinely +nonsanguineness +nonsanity +nonsaponifiable +nonsaponification +nonsaporific +nonsatiability +nonsatiable +nonsatiation +nonsatire +nonsatiric +nonsatirical +nonsatirically +nonsatiricalness +nonsatirizing +nonsatisfaction +nonsatisfying +nonsaturated +nonsaturation +nonsaving +nonsawing +nonscalding +nonscaling +nonscandalous +nonscandalously +nonscarcity +nonscarcities +nonscented +nonscheduled +nonschematic +nonschematically +nonschematized +nonschismatic +nonschismatical +nonschizophrenic +nonscholar +nonscholarly +nonscholastic +nonscholastical +nonscholastically +nonschooling +nonsciatic +nonscience +nonscientific +nonscientifically +nonscientist +nonscoring +nonscraping +nonscriptural +nonscripturalist +nonscrutiny +nonscrutinies +nonsculptural +nonsculpturally +nonsculptured +nonseasonable +nonseasonableness +nonseasonably +nonseasonal +nonseasonally +nonseasoned +nonsecession +nonsecessional +nonsecluded +nonsecludedly +nonsecludedness +nonseclusion +nonseclusive +nonseclusively +nonseclusiveness +nonsecrecy +nonsecrecies +nonsecret +nonsecretarial +nonsecretion +nonsecretionary +nonsecretive +nonsecretively +nonsecretly +nonsecretor +nonsecretory +nonsecretories +nonsectarian +nonsectional +nonsectionally +nonsectorial +nonsecular +nonsecurity +nonsecurities +nonsedentary +nonsedentarily +nonsedentariness +nonsedimentable +nonseditious +nonseditiously +nonseditiousness +nonsegmental +nonsegmentally +nonsegmentary +nonsegmentation +nonsegmented +nonsegregable +nonsegregated +nonsegregation +nonsegregative +nonseismic +nonseizure +nonselected +nonselection +nonselective +nonself +nonselfregarding +nonselling +nonsemantic +nonsemantically +nonseminal +nonsenatorial +nonsensate +nonsensation +nonsensationalistic +nonsense +nonsenses +nonsensibility +nonsensible +nonsensibleness +nonsensibly +nonsensic +nonsensical +nonsensicality +nonsensically +nonsensicalness +nonsensify +nonsensification +nonsensitive +nonsensitively +nonsensitiveness +nonsensitivity +nonsensitivities +nonsensitization +nonsensitized +nonsensitizing +nonsensory +nonsensorial +nonsensual +nonsensualistic +nonsensuality +nonsensually +nonsensuous +nonsensuously +nonsensuousness +nonsentence +nonsententious +nonsententiously +nonsententiousness +nonsentience +nonsentiency +nonsentient +nonsentiently +nonseparability +nonseparable +nonseparableness +nonseparably +nonseparating +nonseparation +nonseparatist +nonseparative +nonseptate +nonseptic +nonsequacious +nonsequaciously +nonsequaciousness +nonsequacity +nonsequent +nonsequential +nonsequentially +nonsequestered +nonsequestration +nonseraphic +nonseraphical +nonseraphically +nonserial +nonseriality +nonserially +nonseriate +nonseriately +nonserif +nonserious +nonseriously +nonseriousness +nonserous +nonserviceability +nonserviceable +nonserviceableness +nonserviceably +nonserviential +nonservile +nonservilely +nonservileness +nonsetter +nonsetting +nonsettlement +nonseverable +nonseverance +nonseverity +nonseverities +nonsexist +nonsexists +nonsexlinked +nonsexual +nonsexually +nonshaft +nonsharing +nonshatter +nonshattering +nonshedder +nonshedding +nonshipper +nonshipping +nonshredding +nonshrinkable +nonshrinking +nonshrinkingly +nonsibilance +nonsibilancy +nonsibilant +nonsibilantly +nonsiccative +nonsidereal +nonsignable +nonsignatory +nonsignatories +nonsignature +nonsignificance +nonsignificancy +nonsignificant +nonsignificantly +nonsignification +nonsignificative +nonsilicate +nonsilicated +nonsiliceous +nonsilicious +nonsyllabic +nonsyllabicness +nonsyllogistic +nonsyllogistical +nonsyllogistically +nonsyllogizing +nonsilver +nonsymbiotic +nonsymbiotical +nonsymbiotically +nonsymbolic +nonsymbolical +nonsymbolically +nonsymbolicalness +nonsimilar +nonsimilarity +nonsimilarly +nonsimilitude +nonsymmetry +nonsymmetrical +nonsymmetries +nonsympathetic +nonsympathetically +nonsympathy +nonsympathies +nonsympathizer +nonsympathizing +nonsympathizingly +nonsymphonic +nonsymphonically +nonsymphonious +nonsymphoniously +nonsymphoniousness +nonsimplicity +nonsimplification +nonsymptomatic +nonsimular +nonsimulate +nonsimulation +nonsimulative +nonsync +nonsynchronal +nonsynchronic +nonsynchronical +nonsynchronically +nonsynchronous +nonsynchronously +nonsynchronousness +nonsyncopation +nonsyndicate +nonsyndicated +nonsyndication +nonsine +nonsynesthetic +nonsinging +nonsingle +nonsingleness +nonsingular +nonsingularity +nonsingularities +nonsinkable +nonsynodic +nonsynodical +nonsynodically +nonsynonymous +nonsynonymously +nonsynoptic +nonsynoptical +nonsynoptically +nonsyntactic +nonsyntactical +nonsyntactically +nonsyntheses +nonsynthesis +nonsynthesized +nonsynthetic +nonsynthetical +nonsynthetically +nonsyntonic +nonsyntonical +nonsyntonically +nonsinusoidal +nonsiphonage +nonsystem +nonsystematic +nonsystematical +nonsystematically +nonsister +nonsitter +nonsitting +nonsked +nonskeds +nonskeletal +nonskeletally +nonskeptic +nonskeptical +nonskid +nonskidding +nonskier +nonskiers +nonskilled +nonskipping +nonslanderous +nonslaveholding +nonslip +nonslippery +nonslipping +nonsludging +nonsmoker +nonsmokers +nonsmoking +nonsmutting +nonsober +nonsobering +nonsoberly +nonsoberness +nonsobriety +nonsociability +nonsociable +nonsociableness +nonsociably +nonsocial +nonsocialist +nonsocialistic +nonsociality +nonsocially +nonsocialness +nonsocietal +nonsociety +nonsociological +nonsolar +nonsoldier +nonsolicitation +nonsolicitous +nonsolicitously +nonsolicitousness +nonsolid +nonsolidarity +nonsolidification +nonsolidified +nonsolidifying +nonsolidly +nonsolids +nonsoluable +nonsoluble +nonsolubleness +nonsolubly +nonsolution +nonsolvability +nonsolvable +nonsolvableness +nonsolvency +nonsolvent +nonsonant +nonsophistic +nonsophistical +nonsophistically +nonsophisticalness +nonsoporific +nonsovereign +nonsovereignly +nonspacious +nonspaciously +nonspaciousness +nonspalling +nonsparing +nonsparking +nonsparkling +nonspatial +nonspatiality +nonspatially +nonspeaker +nonspeaking +nonspecial +nonspecialist +nonspecialists +nonspecialized +nonspecializing +nonspecially +nonspecie +nonspecifiable +nonspecific +nonspecifically +nonspecification +nonspecificity +nonspecified +nonspecious +nonspeciously +nonspeciousness +nonspectacular +nonspectacularly +nonspectral +nonspectrality +nonspectrally +nonspeculation +nonspeculative +nonspeculatively +nonspeculativeness +nonspeculatory +nonspheral +nonspheric +nonspherical +nonsphericality +nonspherically +nonspill +nonspillable +nonspinal +nonspiny +nonspinning +nonspinose +nonspinosely +nonspinosity +nonspiral +nonspirit +nonspirited +nonspiritedly +nonspiritedness +nonspiritous +nonspiritual +nonspirituality +nonspiritually +nonspiritualness +nonspirituness +nonspirituous +nonspirituousness +nonspontaneous +nonspontaneously +nonspontaneousness +nonspored +nonsporeformer +nonsporeforming +nonsporting +nonsportingly +nonspottable +nonsprouting +nonspurious +nonspuriously +nonspuriousness +nonstabile +nonstability +nonstable +nonstableness +nonstably +nonstainable +nonstainer +nonstaining +nonstampable +nonstandard +nonstandardization +nonstandardized +nonstanzaic +nonstaple +nonstarch +nonstarter +nonstarting +nonstatement +nonstatic +nonstationary +nonstationaries +nonstatistic +nonstatistical +nonstatistically +nonstative +nonstatutable +nonstatutory +nonstellar +nonstereotyped +nonstereotypic +nonstereotypical +nonsterile +nonsterilely +nonsterility +nonsterilization +nonsteroid +nonsteroidal +nonstick +nonsticky +nonstylization +nonstylized +nonstimulable +nonstimulant +nonstimulating +nonstimulation +nonstimulative +nonstyptic +nonstyptical +nonstipticity +nonstipulation +nonstock +nonstoical +nonstoically +nonstoicalness +nonstooping +nonstop +nonstorable +nonstorage +nonstowed +nonstrategic +nonstrategical +nonstrategically +nonstratified +nonstress +nonstretchable +nonstretchy +nonstriated +nonstrictness +nonstrictured +nonstriker +nonstrikers +nonstriking +nonstringent +nonstriped +nonstrophic +nonstructural +nonstructurally +nonstructure +nonstructured +nonstudent +nonstudy +nonstudied +nonstudious +nonstudiously +nonstudiousness +nonstultification +nonsubconscious +nonsubconsciously +nonsubconsciousness +nonsubject +nonsubjected +nonsubjectification +nonsubjection +nonsubjective +nonsubjectively +nonsubjectiveness +nonsubjectivity +nonsubjugable +nonsubjugation +nonsublimation +nonsubliminal +nonsubliminally +nonsubmerged +nonsubmergence +nonsubmergibility +nonsubmergible +nonsubmersible +nonsubmissible +nonsubmission +nonsubmissive +nonsubmissively +nonsubmissiveness +nonsubordinate +nonsubordinating +nonsubordination +nonsubscriber +nonsubscribers +nonsubscribing +nonsubscripted +nonsubscription +nonsubsidy +nonsubsidiary +nonsubsidiaries +nonsubsididies +nonsubsidies +nonsubsiding +nonsubsistence +nonsubsistent +nonsubstantial +nonsubstantialism +nonsubstantialist +nonsubstantiality +nonsubstantially +nonsubstantialness +nonsubstantiation +nonsubstantival +nonsubstantivally +nonsubstantive +nonsubstantively +nonsubstantiveness +nonsubstituted +nonsubstitution +nonsubstitutional +nonsubstitutionally +nonsubstitutionary +nonsubstitutive +nonsubtile +nonsubtilely +nonsubtileness +nonsubtility +nonsubtle +nonsubtleness +nonsubtlety +nonsubtleties +nonsubtly +nonsubtraction +nonsubtractive +nonsubtractively +nonsuburban +nonsubversion +nonsubversive +nonsubversively +nonsubversiveness +nonsuccess +nonsuccessful +nonsuccessfully +nonsuccession +nonsuccessional +nonsuccessionally +nonsuccessive +nonsuccessively +nonsuccessiveness +nonsuccor +nonsuccour +nonsuch +nonsuches +nonsuction +nonsuctorial +nonsudsing +nonsufferable +nonsufferableness +nonsufferably +nonsufferance +nonsuffrage +nonsugar +nonsugars +nonsuggestible +nonsuggestion +nonsuggestive +nonsuggestively +nonsuggestiveness +nonsuit +nonsuited +nonsuiting +nonsuits +nonsulfurous +nonsulphurous +nonsummons +nonsupervision +nonsupplemental +nonsupplementally +nonsupplementary +nonsupplicating +nonsupplication +nonsupport +nonsupportability +nonsupportable +nonsupportableness +nonsupportably +nonsupporter +nonsupporting +nonsupposed +nonsupposing +nonsuppositional +nonsuppositionally +nonsuppositive +nonsuppositively +nonsuppressed +nonsuppression +nonsuppressive +nonsuppressively +nonsuppressiveness +nonsuppurative +nonsupression +nonsurface +nonsurgical +nonsurgically +nonsurrealistic +nonsurrealistically +nonsurrender +nonsurvival +nonsurvivor +nonsusceptibility +nonsusceptible +nonsusceptibleness +nonsusceptibly +nonsusceptiness +nonsusceptive +nonsusceptiveness +nonsusceptivity +nonsuspect +nonsuspended +nonsuspension +nonsuspensive +nonsuspensively +nonsuspensiveness +nonsustainable +nonsustained +nonsustaining +nonsustenance +nonswearer +nonswearing +nonsweating +nonswimmer +nonswimming +nontabular +nontabularly +nontabulated +nontactic +nontactical +nontactically +nontactile +nontactility +nontalented +nontalkative +nontalkatively +nontalkativeness +nontan +nontangental +nontangential +nontangentially +nontangible +nontangibleness +nontangibly +nontannic +nontannin +nontanning +nontarget +nontariff +nontarnishable +nontarnished +nontarnishing +nontarred +nontautological +nontautologically +nontautomeric +nontautomerizable +nontax +nontaxability +nontaxable +nontaxableness +nontaxably +nontaxation +nontaxer +nontaxes +nontaxonomic +nontaxonomical +nontaxonomically +nonteachability +nonteachable +nonteachableness +nonteachably +nonteacher +nonteaching +nontechnical +nontechnically +nontechnicalness +nontechnologic +nontechnological +nontechnologically +nonteetotaler +nonteetotalist +nontelegraphic +nontelegraphical +nontelegraphically +nonteleological +nonteleologically +nontelepathic +nontelepathically +nontelephonic +nontelephonically +nontelescopic +nontelescoping +nontelic +nontemperable +nontemperamental +nontemperamentally +nontemperate +nontemperately +nontemperateness +nontempered +nontemporal +nontemporally +nontemporary +nontemporarily +nontemporariness +nontemporizing +nontemporizingly +nontemptation +nontenability +nontenable +nontenableness +nontenably +nontenant +nontenantable +nontensile +nontensility +nontentative +nontentatively +nontentativeness +nontenure +nontenured +nontenurial +nontenurially +nonterm +nonterminability +nonterminable +nonterminableness +nonterminably +nonterminal +nonterminally +nonterminals +nonterminating +nontermination +nonterminative +nonterminatively +nonterminous +nonterrestrial +nonterritorial +nonterritoriality +nonterritorially +nontestable +nontestamentary +nontesting +nontextual +nontextually +nontextural +nontexturally +nontheatric +nontheatrical +nontheatrically +nontheistic +nontheistical +nontheistically +nonthematic +nonthematically +nontheocratic +nontheocratical +nontheocratically +nontheologic +nontheological +nontheologically +nontheoretic +nontheoretical +nontheoretically +nontheosophic +nontheosophical +nontheosophically +nontherapeutic +nontherapeutical +nontherapeutically +nonthermal +nonthermally +nonthermoplastic +nonthinker +nonthinking +nonthoracic +nonthoroughfare +nonthreaded +nonthreatening +nonthreateningly +nontidal +nontillable +nontimbered +nontinted +nontyphoidal +nontypical +nontypically +nontypicalness +nontypographic +nontypographical +nontypographically +nontyrannic +nontyrannical +nontyrannically +nontyrannicalness +nontyrannous +nontyrannously +nontyrannousness +nontitaniferous +nontitle +nontitled +nontitular +nontitularly +nontolerable +nontolerableness +nontolerably +nontolerance +nontolerant +nontolerantly +nontolerated +nontoleration +nontolerative +nontonality +nontoned +nontonic +nontopographical +nontortuous +nontortuously +nontotalitarian +nontourist +nontoxic +nontoxically +nontraceability +nontraceable +nontraceableness +nontraceably +nontractability +nontractable +nontractableness +nontractably +nontraction +nontrade +nontrader +nontrading +nontradition +nontraditional +nontraditionalist +nontraditionalistic +nontraditionally +nontraditionary +nontragedy +nontragedies +nontragic +nontragical +nontragically +nontragicalness +nontrailing +nontrained +nontraining +nontraitorous +nontraitorously +nontraitorousness +nontranscribing +nontranscription +nontranscriptive +nontransferability +nontransferable +nontransference +nontransferential +nontransformation +nontransforming +nontransgression +nontransgressive +nontransgressively +nontransience +nontransiency +nontransient +nontransiently +nontransientness +nontransitional +nontransitionally +nontransitive +nontransitively +nontransitiveness +nontranslocation +nontranslucency +nontranslucent +nontransmission +nontransmittal +nontransmittance +nontransmittible +nontransparence +nontransparency +nontransparent +nontransparently +nontransparentness +nontransportability +nontransportable +nontransportation +nontransposable +nontransposing +nontransposition +nontraveler +nontraveling +nontraveller +nontravelling +nontraversable +nontreasonable +nontreasonableness +nontreasonably +nontreatable +nontreated +nontreaty +nontreaties +nontreatment +nontrespass +nontrial +nontribal +nontribally +nontribesman +nontribesmen +nontributary +nontrier +nontrigonometric +nontrigonometrical +nontrigonometrically +nontrivial +nontriviality +nontronite +nontropic +nontropical +nontropically +nontroubling +nontruancy +nontruant +nontrump +nontrunked +nontrust +nontrusting +nontruth +nontruths +nontubercular +nontubercularly +nontuberculous +nontubular +nontumorous +nontumultuous +nontumultuously +nontumultuousness +nontuned +nonturbinate +nonturbinated +nontutorial +nontutorially +nonubiquitary +nonubiquitous +nonubiquitously +nonubiquitousness +nonulcerous +nonulcerously +nonulcerousness +nonultrafilterable +nonumbilical +nonumbilicate +nonumbrellaed +nonunanimous +nonunanimously +nonunanimousness +nonuncial +nonundergraduate +nonunderstandable +nonunderstanding +nonunderstandingly +nonunderstood +nonundulant +nonundulate +nonundulating +nonundulatory +nonunification +nonunified +nonuniform +nonuniformist +nonuniformitarian +nonuniformity +nonuniformities +nonuniformly +nonunion +nonunionism +nonunionist +nonunions +nonunique +nonuniquely +nonuniqueness +nonunison +nonunitable +nonunitarian +nonuniteable +nonunited +nonunity +nonuniting +nonuniversal +nonuniversalist +nonuniversality +nonuniversally +nonuniversity +nonuniversities +nonupholstered +nonuple +nonuples +nonuplet +nonuplicate +nonupright +nonuprightly +nonuprightness +nonurban +nonurbanite +nonurgent +nonurgently +nonusable +nonusage +nonuse +nonuseable +nonuser +nonusers +nonuses +nonusing +nonusurious +nonusuriously +nonusuriousness +nonusurping +nonusurpingly +nonuterine +nonutile +nonutilitarian +nonutility +nonutilities +nonutilization +nonutilized +nonutterance +nonvacancy +nonvacancies +nonvacant +nonvacantly +nonvaccination +nonvacillating +nonvacillation +nonvacua +nonvacuous +nonvacuously +nonvacuousness +nonvacuum +nonvacuums +nonvaginal +nonvagrancy +nonvagrancies +nonvagrant +nonvagrantly +nonvagrantness +nonvalent +nonvalid +nonvalidation +nonvalidity +nonvalidities +nonvalidly +nonvalidness +nonvalorous +nonvalorously +nonvalorousness +nonvaluable +nonvaluation +nonvalue +nonvalued +nonvalve +nonvanishing +nonvaporosity +nonvaporous +nonvaporously +nonvaporousness +nonvariability +nonvariable +nonvariableness +nonvariably +nonvariance +nonvariant +nonvariation +nonvaried +nonvariety +nonvarieties +nonvarious +nonvariously +nonvariousness +nonvascular +nonvascularly +nonvasculose +nonvasculous +nonvassal +nonvector +nonvegetable +nonvegetation +nonvegetative +nonvegetatively +nonvegetativeness +nonvegetive +nonvehement +nonvehemently +nonvenal +nonvenally +nonvendibility +nonvendible +nonvendibleness +nonvendibly +nonvenereal +nonvenomous +nonvenomously +nonvenomousness +nonvenous +nonvenously +nonvenousness +nonventilation +nonventilative +nonveracious +nonveraciously +nonveraciousness +nonveracity +nonverbal +nonverbalized +nonverbally +nonverbosity +nonverdict +nonverifiable +nonverification +nonveritable +nonveritableness +nonveritably +nonverminous +nonverminously +nonverminousness +nonvernacular +nonversatility +nonvertebral +nonvertebrate +nonvertical +nonverticality +nonvertically +nonverticalness +nonvesicular +nonvesicularly +nonvesting +nonvesture +nonveteran +nonveterinary +nonveterinaries +nonvexatious +nonvexatiously +nonvexatiousness +nonviability +nonviable +nonvibratile +nonvibrating +nonvibration +nonvibrator +nonvibratory +nonvicarious +nonvicariously +nonvicariousness +nonvictory +nonvictories +nonvigilance +nonvigilant +nonvigilantly +nonvigilantness +nonvillager +nonvillainous +nonvillainously +nonvillainousness +nonvindicable +nonvindication +nonvinosity +nonvinous +nonvintage +nonviolability +nonviolable +nonviolableness +nonviolably +nonviolation +nonviolative +nonviolence +nonviolent +nonviolently +nonviral +nonvirginal +nonvirginally +nonvirile +nonvirility +nonvirtue +nonvirtuous +nonvirtuously +nonvirtuousness +nonvirulent +nonvirulently +nonviruliferous +nonvisaed +nonvisceral +nonviscid +nonviscidity +nonviscidly +nonviscidness +nonviscous +nonviscously +nonviscousness +nonvisibility +nonvisibilities +nonvisible +nonvisibly +nonvisional +nonvisionary +nonvisitation +nonvisiting +nonvisual +nonvisualized +nonvisually +nonvital +nonvitality +nonvitalized +nonvitally +nonvitalness +nonvitiation +nonvitreous +nonvitrified +nonvitriolic +nonvituperative +nonvituperatively +nonviviparity +nonviviparous +nonviviparously +nonviviparousness +nonvocable +nonvocal +nonvocalic +nonvocality +nonvocalization +nonvocally +nonvocalness +nonvocational +nonvocationally +nonvoice +nonvoid +nonvoidable +nonvolant +nonvolatile +nonvolatileness +nonvolatility +nonvolatilizable +nonvolatilized +nonvolatiness +nonvolcanic +nonvolition +nonvolitional +nonvolubility +nonvoluble +nonvolubleness +nonvolubly +nonvoluntary +nonvortical +nonvortically +nonvoter +nonvoters +nonvoting +nonvulcanizable +nonvulcanized +nonvulgarity +nonvulgarities +nonvulval +nonvulvar +nonvvacua +nonwaiver +nonwalking +nonwar +nonwarrantable +nonwarrantably +nonwarranted +nonwashable +nonwasting +nonwatertight +nonwavering +nonwaxing +nonweakness +nonwelcome +nonwelcoming +nonwestern +nonwetted +nonwhite +nonwhites +nonwinged +nonwithering +nonwonder +nonwondering +nonwoody +nonworker +nonworkers +nonworking +nonworship +nonwoven +nonwrinkleable +nonwrite +nonzealous +nonzealously +nonzealousness +nonzebra +nonzero +nonzodiacal +nonzonal +nonzonally +nonzonate +nonzonated +nonzoologic +nonzoological +nonzoologically +noo +noodle +noodled +noodledom +noodlehead +noodleism +noodles +noodling +nook +nooked +nookery +nookeries +nooky +nookie +nookier +nookies +nookiest +nooking +nooklet +nooklike +nooks +noology +noological +noologist +noometry +noon +noonday +noondays +nooned +noonflower +nooning +noonings +noonish +noonlight +noonlit +noonmeat +noons +noonstead +noontide +noontides +noontime +noontimes +noonwards +noop +nooscopic +noose +noosed +nooser +noosers +nooses +noosing +noosphere +nootka +nopal +nopalea +nopalry +nopals +nope +nopinene +nor +nora +noradrenalin +noradrenaline +noradrenergic +norah +norard +norate +noration +norbergite +norbert +norbertine +norcamphane +nordcaper +nordenfelt +nordenskioldine +nordhausen +nordic +nordicism +nordicist +nordicity +nordicization +nordicize +nordmarkite +nore +noreast +noreaster +norelin +norepinephrine +norfolk +norfolkian +norgine +nori +noria +norias +noric +norice +norie +norimon +norit +norite +norites +noritic +norito +nork +norkyn +norland +norlander +norlandism +norlands +norleucine +norm +norma +normal +normalacy +normalcy +normalcies +normalisation +normalise +normalised +normalising +normalism +normalist +normality +normalities +normalizable +normalization +normalizations +normalize +normalized +normalizer +normalizes +normalizing +normally +normalness +normals +norman +normandy +normanesque +normanish +normanism +normanist +normanization +normanize +normanizer +normanly +normannic +normans +normated +normative +normatively +normativeness +normed +normless +normoblast +normoblastic +normocyte +normocytic +normotensive +normothermia +normothermic +norms +norn +norna +nornicotine +nornorwest +noropianic +norpinic +norry +norridgewock +norroy +norroway +norse +norsel +norseland +norseled +norseler +norseling +norselled +norselling +norseman +norsemen +norsk +nortelry +north +northbound +northcountryman +northeast +northeaster +northeasterly +northeastern +northeasterner +northeasternmost +northeasters +northeastward +northeastwardly +northeastwards +northen +northeners +norther +northered +northering +northerly +northerlies +northerliness +northern +northerner +northerners +northernize +northernly +northernmost +northernness +northerns +northers +northest +northfieldite +northing +northings +northland +northlander +northlight +northman +northmost +northness +norths +northumber +northumbrian +northupite +northward +northwardly +northwards +northwest +northwester +northwesterly +northwestern +northwesterner +northwestward +northwestwardly +northwestwards +nortriptyline +norumbega +norway +norward +norwards +norwegian +norwegians +norweyan +norwest +norwester +norwestward +nos +nosairi +nosairian +nosarian +nose +nosean +noseanite +nosebag +nosebags +noseband +nosebanded +nosebands +nosebleed +nosebleeds +nosebone +noseburn +nosed +nosedive +nosegay +nosegaylike +nosegays +noseherb +nosehole +nosey +noseless +noselessly +noselessness +noselike +noselite +nosema +nosematidae +noseover +nosepiece +nosepinch +noser +noses +nosesmart +nosethirl +nosetiology +nosewards +nosewheel +nosewing +nosewise +nosewort +nosh +noshed +nosher +noshers +noshes +noshing +nosy +nosier +nosiest +nosig +nosily +nosine +nosiness +nosinesses +nosing +nosings +nosism +nosite +nosochthonography +nosocomial +nosocomium +nosogenesis +nosogenetic +nosogeny +nosogenic +nosogeography +nosogeographic +nosogeographical +nosographer +nosography +nosographic +nosographical +nosographically +nosographies +nosohaemia +nosohemia +nosology +nosologic +nosological +nosologically +nosologies +nosologist +nosomania +nosomycosis +nosonomy +nosophyte +nosophobia +nosopoetic +nosopoietic +nosotaxy +nosotrophy +nossel +nostalgy +nostalgia +nostalgic +nostalgically +nostalgies +noster +nostic +nostoc +nostocaceae +nostocaceous +nostochine +nostocs +nostology +nostologic +nostomania +nostomanic +nostradamus +nostrificate +nostrification +nostril +nostriled +nostrility +nostrilled +nostrils +nostrilsome +nostrum +nostrummonger +nostrummongery +nostrummongership +nostrums +nosu +not +nota +notabene +notabilia +notability +notabilities +notable +notableness +notables +notably +notacanthid +notacanthidae +notacanthoid +notacanthous +notacanthus +notaeal +notaeum +notal +notalgia +notalgic +notalia +notan +notanduda +notandum +notandums +notanencephalia +notary +notarial +notarially +notariate +notaries +notarikon +notaryship +notarization +notarizations +notarize +notarized +notarizes +notarizing +notate +notated +notates +notating +notation +notational +notations +notative +notator +notaulix +notch +notchback +notchboard +notched +notchel +notcher +notchers +notches +notchful +notchy +notching +notchweed +notchwing +notchwort +note +notebook +notebooks +notecase +notecases +noted +notedly +notedness +notehead +noteholder +notekin +notelaea +noteless +notelessly +notelessness +notelet +noteman +notemigge +notemugge +notencephalocele +notencephalus +notepad +notepads +notepaper +noter +noters +noterse +notes +notewise +noteworthy +noteworthily +noteworthiness +nothal +notharctid +notharctidae +notharctus +nother +nothing +nothingarian +nothingarianism +nothingism +nothingist +nothingize +nothingless +nothingly +nothingness +nothingology +nothings +nothofagus +notholaena +nothosaur +nothosauri +nothosaurian +nothosauridae +nothosaurus +nothous +nothus +noticable +notice +noticeabili +noticeability +noticeable +noticeableness +noticeably +noticed +noticer +notices +noticing +notidani +notidanian +notidanid +notidanidae +notidanidan +notidanoid +notidanus +notify +notifiable +notification +notificational +notifications +notified +notifyee +notifier +notifiers +notifies +notifying +noting +notion +notionable +notional +notionalist +notionality +notionally +notionalness +notionary +notionate +notioned +notionist +notionless +notions +notiosorex +notist +notitia +notition +notkerian +notocentrous +notocentrum +notochord +notochordal +notocord +notodontian +notodontid +notodontidae +notodontoid +notogaea +notogaeal +notogaean +notogaeic +notoire +notommatid +notommatidae +notonecta +notonectal +notonectid +notonectidae +notopodial +notopodium +notopterid +notopteridae +notopteroid +notopterus +notorhynchus +notorhizal +notoryctes +notoriety +notorieties +notorious +notoriously +notoriousness +notornis +notostraca +notothere +nototherium +nototrema +nototribe +notoungulate +notour +notourly +notre +notropis +nots +notself +nottoway +notturni +notturno +notum +notungulata +notungulate +notus +notwithstanding +nou +nouche +nougat +nougatine +nougats +nought +noughty +noughtily +noughtiness +noughtly +noughts +nouille +nouilles +nould +noumea +noumeaite +noumeite +noumena +noumenal +noumenalism +noumenalist +noumenality +noumenalize +noumenally +noumenism +noumenon +noumenona +noummos +noun +nounal +nounally +nounize +nounless +nouns +noup +nourice +nourish +nourishable +nourished +nourisher +nourishers +nourishes +nourishing +nourishingly +nourishment +nourishments +nouriture +nous +nousel +nouses +nouther +nouveau +nouveaute +nouveautes +nouveaux +nouvelle +nouvelles +nov +nova +novaculite +novae +novale +novalia +novalike +novanglian +novanglican +novantique +novarsenobenzene +novas +novate +novatian +novatianism +novatianist +novation +novations +novative +novator +novatory +novatrix +novcic +noveboracensis +novel +novela +novelant +novelcraft +noveldom +novelese +novelesque +novelet +noveletist +novelette +noveletter +novelettes +noveletty +novelettish +novelettist +novelisation +novelise +novelised +novelises +novelish +novelising +novelism +novelist +novelistic +novelistically +novelists +novelivelle +novelization +novelizations +novelize +novelized +novelizes +novelizing +novella +novellae +novellas +novelle +novelless +novelly +novellike +novelmongering +novelness +novelry +novels +novelty +novelties +novelwright +novem +novemarticulate +november +novemberish +novembers +novemcostate +novemdecillion +novemdecillionth +novemdigitate +novemfid +novemlobate +novemnervate +novemperfoliate +novena +novenae +novenary +novenas +novendial +novene +novennial +novercal +noverify +noverint +novial +novice +novicehood +novicelike +novicery +novices +noviceship +noviciate +novillada +novillero +novillo +novilunar +novity +novitial +novitiate +novitiates +novitiateship +novitiation +novitious +novo +novobiocin +novocain +novocaine +novodamus +novorolsky +novum +novus +now +nowaday +nowadays +noway +noways +nowanights +nowch +nowder +nowed +nowel +nowhat +nowhen +nowhence +nowhere +nowhereness +nowheres +nowhit +nowhither +nowy +nowise +nowness +nowroze +nows +nowt +nowthe +nowther +nowtherd +nowts +nox +noxa +noxal +noxally +noxial +noxious +noxiously +noxiousness +nozi +nozzle +nozzler +nozzles +np +npeel +npfx +nr +nrarucu +nritta +ns +nsec +nt +nth +nu +nuadu +nuagism +nuagist +nuance +nuanced +nuances +nuancing +nub +nuba +nubby +nubbier +nubbiest +nubbin +nubbiness +nubbins +nubble +nubbled +nubbles +nubbly +nubblier +nubbliest +nubbliness +nubbling +nubecula +nubeculae +nubia +nubian +nubias +nubiferous +nubiform +nubigenous +nubilate +nubilation +nubile +nubility +nubilities +nubilose +nubilous +nubilum +nubs +nucal +nucament +nucamentaceous +nucellar +nucelli +nucellus +nucha +nuchae +nuchal +nuchale +nuchalgia +nuchals +nuciculture +nuciferous +nuciform +nucin +nucivorous +nucleal +nucleant +nuclear +nucleary +nuclease +nucleases +nucleate +nucleated +nucleates +nucleating +nucleation +nucleations +nucleator +nucleators +nucleclei +nuclei +nucleic +nucleiferous +nucleiform +nuclein +nucleinase +nucleins +nucleization +nucleize +nucleli +nucleoalbumin +nucleoalbuminuria +nucleocapsid +nucleofugal +nucleohyaloplasm +nucleohyaloplasma +nucleohistone +nucleoid +nucleoidioplasma +nucleolar +nucleolate +nucleolated +nucleole +nucleoles +nucleoli +nucleolini +nucleolinus +nucleolysis +nucleolocentrosome +nucleoloid +nucleolus +nucleomicrosome +nucleon +nucleone +nucleonic +nucleonics +nucleons +nucleopetal +nucleophile +nucleophilic +nucleophilically +nucleophilicity +nucleoplasm +nucleoplasmatic +nucleoplasmic +nucleoprotein +nucleosid +nucleosidase +nucleoside +nucleosynthesis +nucleotidase +nucleotide +nucleotides +nucleus +nucleuses +nuclide +nuclides +nuclidic +nucula +nuculacea +nuculane +nuculania +nuculanium +nucule +nuculid +nuculidae +nuculiform +nuculoid +nuda +nudate +nudation +nudd +nuddy +nuddle +nude +nudely +nudeness +nudenesses +nudens +nuder +nudes +nudest +nudge +nudged +nudger +nudgers +nudges +nudging +nudibranch +nudibranchia +nudibranchian +nudibranchiate +nudicaudate +nudicaul +nudicaulous +nudie +nudies +nudifier +nudiflorous +nudiped +nudish +nudism +nudisms +nudist +nudists +nuditarian +nudity +nudities +nudnick +nudnicks +nudnik +nudniks +nudophobia +nudum +nudzh +nugacious +nugaciousness +nugacity +nugacities +nugae +nugament +nugator +nugatory +nugatorily +nugatoriness +nuggar +nugget +nuggety +nuggets +nugify +nugilogue +nugumiut +nuisance +nuisancer +nuisances +nuisome +nuke +nukes +nukuhivan +nul +null +nullable +nullah +nullahs +nullary +nullbiety +nulled +nullibicity +nullibiety +nullibility +nullibiquitous +nullibist +nullify +nullification +nullificationist +nullifications +nullificator +nullifidian +nullifidianism +nullified +nullifier +nullifiers +nullifies +nullifying +nulling +nullipara +nulliparae +nulliparity +nulliparous +nullipennate +nullipennes +nulliplex +nullipore +nulliporous +nullism +nullisome +nullisomic +nullity +nullities +nulliverse +nullo +nullos +nulls +nullum +nullus +num +numa +numac +numantine +numb +numbat +numbed +numbedness +number +numberable +numbered +numberer +numberers +numberful +numbering +numberings +numberless +numberlessness +numberous +numberplate +numbers +numbersome +numbest +numbfish +numbfishes +numbing +numbingly +numble +numbles +numbly +numbness +numbnesses +numbs +numbskull +numda +numdah +numen +numenius +numerable +numerableness +numerably +numeracy +numeral +numerally +numerals +numerant +numerary +numerate +numerated +numerates +numerating +numeration +numerations +numerative +numerator +numerators +numeric +numerical +numerically +numericalness +numerics +numerist +numero +numerology +numerological +numerologist +numerologists +numeros +numerose +numerosity +numerous +numerously +numerousness +numida +numidae +numidian +numididae +numidinae +numina +numine +numinism +numinous +numinouses +numinously +numinousness +numis +numismatic +numismatical +numismatically +numismatician +numismatics +numismatist +numismatists +numismatography +numismatology +numismatologist +nummary +nummi +nummiform +nummular +nummulary +nummularia +nummulated +nummulation +nummuline +nummulinidae +nummulite +nummulites +nummulitic +nummulitidae +nummulitoid +nummuloidal +nummus +numnah +nump +numps +numskull +numskulled +numskulledness +numskullery +numskullism +numskulls +numud +nun +nunatak +nunataks +nunation +nunbird +nunc +nunce +nunch +nunchaku +nuncheon +nunchion +nunciate +nunciative +nunciatory +nunciature +nuncio +nuncios +nuncioship +nuncius +nuncle +nuncles +nuncupate +nuncupated +nuncupating +nuncupation +nuncupative +nuncupatively +nuncupatory +nundinal +nundination +nundine +nunhood +nunki +nunky +nunks +nunlet +nunlike +nunnari +nunnated +nunnation +nunned +nunnery +nunneries +nunni +nunnify +nunning +nunnish +nunnishness +nunquam +nunry +nuns +nunship +nunting +nuntius +nupe +nuphar +nupson +nuptial +nuptiality +nuptialize +nuptially +nuptials +nuque +nuragh +nuraghe +nuraghes +nuraghi +nurhag +nurl +nurled +nurly +nurling +nurls +nurry +nursable +nurse +nursed +nursedom +nursegirl +nursehound +nursekeeper +nursekin +nurselet +nurselike +nurseling +nursemaid +nursemaids +nurser +nursery +nurserydom +nurseries +nurseryful +nurserymaid +nurserymaids +nurseryman +nurserymen +nursers +nurses +nursetender +nursy +nursing +nursingly +nursings +nursle +nursling +nurslings +nurturable +nurtural +nurturance +nurturant +nurture +nurtured +nurtureless +nurturer +nurturers +nurtures +nurtureship +nurturing +nus +nusairis +nusakan +nusfiah +nut +nutant +nutarian +nutate +nutated +nutates +nutating +nutation +nutational +nutations +nutbreaker +nutbrown +nutcake +nutcase +nutcrack +nutcracker +nutcrackery +nutcrackers +nutgall +nutgalls +nutgrass +nutgrasses +nuthatch +nuthatches +nuthook +nuthouse +nuthouses +nutjobber +nutlet +nutlets +nutlike +nutmeat +nutmeats +nutmeg +nutmegged +nutmeggy +nutmegs +nutpecker +nutpick +nutpicks +nutramin +nutria +nutrias +nutrice +nutricial +nutricism +nutriculture +nutrient +nutrients +nutrify +nutrilite +nutriment +nutrimental +nutriments +nutritial +nutrition +nutritional +nutritionally +nutritionary +nutritionist +nutritionists +nutritious +nutritiously +nutritiousness +nutritive +nutritively +nutritiveness +nutritory +nutriture +nuts +nutsedge +nutsedges +nutseed +nutshell +nutshells +nutsy +nuttallia +nuttalliasis +nuttalliosis +nutted +nutter +nuttery +nutters +nutty +nuttier +nuttiest +nuttily +nuttiness +nutting +nuttish +nuttishness +nutwood +nutwoods +nuzzer +nuzzerana +nuzzle +nuzzled +nuzzler +nuzzlers +nuzzles +nuzzling +nv +o +oad +oadal +oaf +oafdom +oafish +oafishly +oafishness +oafs +oak +oakberry +oakboy +oaken +oakenshaw +oakesia +oaky +oakland +oaklet +oaklike +oakling +oakmoss +oakmosses +oaks +oaktongue +oakum +oakums +oakweb +oakwood +oam +oannes +oar +oarage +oarcock +oared +oarfish +oarfishes +oarhole +oary +oarial +oarialgia +oaric +oaring +oariocele +oariopathy +oariopathic +oariotomy +oaritic +oaritis +oarium +oarless +oarlike +oarlock +oarlocks +oarlop +oarman +oarrowheaded +oars +oarsman +oarsmanship +oarsmen +oarswoman +oarswomen +oarweed +oasal +oasean +oases +oasis +oasitic +oast +oasthouse +oasts +oat +oatbin +oatcake +oatcakes +oatear +oaten +oatenmeal +oater +oaters +oatfowl +oath +oathay +oathed +oathful +oathlet +oaths +oathworthy +oaty +oatland +oatlike +oatmeal +oatmeals +oats +oatseed +oaves +ob +oba +obadiah +obambulate +obambulation +obambulatory +oban +obarne +obarni +obb +obbenite +obbligati +obbligato +obbligatos +obclavate +obclude +obcompressed +obconic +obconical +obcordate +obcordiform +obcuneate +obdeltoid +obdiplostemony +obdiplostemonous +obdormition +obdt +obduce +obduction +obduracy +obduracies +obdurate +obdurated +obdurately +obdurateness +obdurating +obduration +obdure +obe +obeah +obeahism +obeahisms +obeahs +obeche +obedience +obediences +obediency +obedient +obediential +obedientially +obedientialness +obedientiar +obedientiary +obedientiaries +obediently +obey +obeyable +obeyance +obeyed +obeyeo +obeyer +obeyers +obeying +obeyingly +obeys +obeisance +obeisances +obeisant +obeisantly +obeish +obeism +obeli +obelia +obeliac +obelial +obelias +obelion +obeliscal +obeliscar +obelise +obelised +obelises +obelising +obelisk +obelisked +obelisking +obeliskoid +obelisks +obelism +obelisms +obelize +obelized +obelizes +obelizing +obelus +oberon +obes +obese +obesely +obeseness +obesity +obesities +obex +obfirm +obfuscable +obfuscate +obfuscated +obfuscates +obfuscating +obfuscation +obfuscator +obfuscatory +obfuscators +obfuscity +obfuscous +obfusk +obi +obia +obias +obidicut +obiism +obiisms +obiit +obis +obispo +obit +obital +obiter +obits +obitual +obituary +obituarian +obituaries +obituarily +obituarist +obituarize +obj +object +objectable +objectant +objectation +objectative +objected +objectee +objecter +objecthood +objectify +objectification +objectified +objectifying +objecting +objection +objectionability +objectionable +objectionableness +objectionably +objectional +objectioner +objectionist +objections +objectival +objectivate +objectivated +objectivating +objectivation +objective +objectively +objectiveness +objectives +objectivism +objectivist +objectivistic +objectivity +objectivize +objectivized +objectivizing +objectization +objectize +objectized +objectizing +objectless +objectlessly +objectlessness +objector +objectors +objects +objecttification +objet +objicient +objranging +objscan +objuration +objure +objurgate +objurgated +objurgates +objurgating +objurgation +objurgations +objurgative +objurgatively +objurgator +objurgatory +objurgatorily +objurgatrix +obl +oblanceolate +oblast +oblasti +oblasts +oblat +oblata +oblate +oblated +oblately +oblateness +oblates +oblating +oblatio +oblation +oblational +oblationary +oblations +oblatory +oblectate +oblectation +obley +obli +oblicque +obligability +obligable +obligancy +obligant +obligate +obligated +obligately +obligates +obligati +obligating +obligation +obligational +obligationary +obligations +obligative +obligativeness +obligato +obligator +obligatory +obligatorily +obligatoriness +obligatos +obligatum +oblige +obliged +obligedly +obligedness +obligee +obligees +obligement +obliger +obligers +obliges +obliging +obligingly +obligingness +obligistic +obligor +obligors +obliquangular +obliquate +obliquation +oblique +obliqued +obliquely +obliqueness +obliques +obliquing +obliquity +obliquities +obliquitous +obliquus +obliterable +obliterate +obliterated +obliterates +obliterating +obliteration +obliterations +obliterative +obliterator +obliterators +oblivescence +oblivial +obliviality +oblivion +oblivionate +oblivionist +oblivionize +oblivions +oblivious +obliviously +obliviousness +obliviscence +obliviscible +oblocution +oblocutor +oblong +oblongata +oblongatae +oblongatal +oblongatas +oblongated +oblongish +oblongitude +oblongitudinal +oblongly +oblongness +oblongs +obloquy +obloquial +obloquies +obloquious +obmit +obmutescence +obmutescent +obnebulate +obnounce +obnounced +obnouncing +obnoxiety +obnoxious +obnoxiously +obnoxiousness +obnubilate +obnubilation +obnunciation +oboe +oboes +oboist +oboists +obol +obolary +obolaria +obole +oboles +obolet +oboli +obolos +obols +obolus +obomegoid +obongo +oboormition +obouracy +oboval +obovate +obovoid +obpyramidal +obpyriform +obrazil +obreption +obreptitious +obreptitiously +obrien +obrize +obrogate +obrogated +obrogating +obrogation +obrotund +obs +obscene +obscenely +obsceneness +obscener +obscenest +obscenity +obscenities +obscura +obscurancy +obscurant +obscurantic +obscuranticism +obscurantism +obscurantist +obscurantists +obscuras +obscuration +obscurative +obscuratory +obscure +obscured +obscuredly +obscurely +obscurement +obscureness +obscurer +obscurers +obscures +obscurest +obscuring +obscurism +obscurist +obscurity +obscurities +obsecrate +obsecrated +obsecrating +obsecration +obsecrationary +obsecratory +obsede +obsequeence +obsequence +obsequent +obsequy +obsequial +obsequience +obsequies +obsequiosity +obsequious +obsequiously +obsequiousness +obsequity +obsequium +observability +observable +observableness +observably +observance +observances +observancy +observanda +observandum +observant +observantine +observantist +observantly +observantness +observatin +observation +observational +observationalism +observationally +observations +observative +observator +observatory +observatorial +observatories +observe +observed +observedly +observer +observers +observership +observes +observing +observingly +obsess +obsessed +obsesses +obsessing +obsessingly +obsession +obsessional +obsessionally +obsessionist +obsessions +obsessive +obsessively +obsessiveness +obsessor +obsessors +obside +obsidian +obsidianite +obsidians +obsidional +obsidionary +obsidious +obsign +obsignate +obsignation +obsignatory +obsolesc +obsolesce +obsolesced +obsolescence +obsolescent +obsolescently +obsolescing +obsolete +obsoleted +obsoletely +obsoleteness +obsoletes +obsoleting +obsoletion +obsoletism +obstacle +obstacles +obstancy +obstant +obstante +obstet +obstetric +obstetrical +obstetrically +obstetricate +obstetricated +obstetricating +obstetrication +obstetricy +obstetrician +obstetricians +obstetricies +obstetrics +obstetrist +obstetrix +obstinacy +obstinacies +obstinacious +obstinance +obstinancy +obstinant +obstinate +obstinately +obstinateness +obstination +obstinative +obstipant +obstipate +obstipated +obstipation +obstreperate +obstreperosity +obstreperous +obstreperously +obstreperousness +obstriction +obstringe +obstruct +obstructant +obstructed +obstructedly +obstructer +obstructers +obstructing +obstructingly +obstruction +obstructionism +obstructionist +obstructionistic +obstructionists +obstructions +obstructive +obstructively +obstructiveness +obstructivism +obstructivity +obstructor +obstructors +obstructs +obstruent +obstruse +obstruxit +obstupefy +obtain +obtainability +obtainable +obtainableness +obtainably +obtainal +obtainance +obtained +obtainer +obtainers +obtaining +obtainment +obtains +obtect +obtected +obtemper +obtemperate +obtend +obtenebrate +obtenebration +obtent +obtention +obtest +obtestation +obtested +obtesting +obtests +obtrect +obtriangular +obtrude +obtruded +obtruder +obtruders +obtrudes +obtruding +obtruncate +obtruncation +obtruncator +obtrusion +obtrusionist +obtrusions +obtrusive +obtrusively +obtrusiveness +obtund +obtunded +obtundent +obtunder +obtunding +obtundity +obtunds +obturate +obturated +obturates +obturating +obturation +obturator +obturatory +obturbinate +obtusangular +obtuse +obtusely +obtuseness +obtuser +obtusest +obtusifid +obtusifolious +obtusilingual +obtusilobous +obtusion +obtusipennate +obtusirostrate +obtusish +obtusity +obumbrant +obumbrate +obumbrated +obumbrating +obumbration +obus +obv +obvallate +obvelation +obvention +obversant +obverse +obversely +obverses +obversion +obvert +obverted +obvertend +obverting +obverts +obviable +obviate +obviated +obviates +obviating +obviation +obviations +obviative +obviator +obviators +obvious +obviously +obviousness +obvolute +obvoluted +obvolution +obvolutive +obvolve +obvolvent +oc +oca +ocarina +ocarinas +ocas +occamy +occamism +occamist +occamistic +occamite +occas +occasion +occasionable +occasional +occasionalism +occasionalist +occasionalistic +occasionality +occasionally +occasionalness +occasionary +occasionate +occasioned +occasioner +occasioning +occasionings +occasionless +occasions +occasive +occident +occidental +occidentalism +occidentalist +occidentality +occidentalization +occidentalize +occidentally +occidentals +occidents +occiduous +occipiputs +occipita +occipital +occipitalis +occipitally +occipitoanterior +occipitoatlantal +occipitoatloid +occipitoaxial +occipitoaxoid +occipitobasilar +occipitobregmatic +occipitocalcarine +occipitocervical +occipitofacial +occipitofrontal +occipitofrontalis +occipitohyoid +occipitoiliac +occipitomastoid +occipitomental +occipitonasal +occipitonuchal +occipitootic +occipitoparietal +occipitoposterior +occipitoscapular +occipitosphenoid +occipitosphenoidal +occipitotemporal +occipitothalamic +occiput +occiputs +occision +occitone +occlude +occluded +occludent +occludes +occluding +occlusal +occluse +occlusion +occlusions +occlusive +occlusiveness +occlusocervical +occlusocervically +occlusogingival +occlusometer +occlusor +occult +occultate +occultation +occulted +occulter +occulters +occulting +occultism +occultist +occultists +occultly +occultness +occults +occupable +occupance +occupancy +occupancies +occupant +occupants +occupation +occupational +occupationalist +occupationally +occupationless +occupations +occupative +occupy +occupiable +occupied +occupier +occupiers +occupies +occupying +occur +occurred +occurrence +occurrences +occurrent +occurring +occurrit +occurs +occurse +occursive +ocean +oceanarium +oceanaut +oceanauts +oceaned +oceanet +oceanfront +oceanful +oceangoing +oceania +oceanian +oceanic +oceanican +oceanicity +oceanid +oceanity +oceanlike +oceanog +oceanographer +oceanographers +oceanography +oceanographic +oceanographical +oceanographically +oceanographist +oceanology +oceanologic +oceanological +oceanologically +oceanologist +oceanologists +oceanophyte +oceanous +oceans +oceanside +oceanus +oceanways +oceanward +oceanwards +oceanwise +ocellana +ocellar +ocellary +ocellate +ocellated +ocellation +ocelli +ocellicyst +ocellicystic +ocelliferous +ocelliform +ocelligerous +ocellus +oceloid +ocelot +ocelots +och +ochava +ochavo +ocher +ochered +ochery +ochering +ocherish +ocherous +ochers +ochidore +ochymy +ochlesis +ochlesitic +ochletic +ochlocracy +ochlocrat +ochlocratic +ochlocratical +ochlocratically +ochlomania +ochlophobia +ochlophobist +ochna +ochnaceae +ochnaceous +ochone +ochophobia +ochotona +ochotonidae +ochozoma +ochraceous +ochrana +ochratoxin +ochre +ochrea +ochreae +ochreate +ochred +ochreish +ochreous +ochres +ochry +ochring +ochro +ochrocarpous +ochrogaster +ochroid +ochroleucous +ochrolite +ochroma +ochronosis +ochronosus +ochronotic +ochrous +ocht +ocydrome +ocydromine +ocydromus +ocimum +ocypete +ocypoda +ocypodan +ocypode +ocypodian +ocypodidae +ocypodoid +ocyroe +ocyroidae +ocyte +ock +ocker +ockster +oclock +ocneria +oconnell +oconnor +ocote +ocotea +ocotillo +ocotillos +ocque +ocracy +ocrea +ocreaceous +ocreae +ocreatae +ocreate +ocreated +oct +octachloride +octachord +octachordal +octachronous +octacnemus +octacolic +octactinal +octactine +octactiniae +octactinian +octad +octadecahydrate +octadecane +octadecanoic +octadecyl +octadic +octadrachm +octadrachma +octads +octaechos +octaemera +octaemeron +octaeteric +octaeterid +octaeteris +octagon +octagonal +octagonally +octagons +octahedra +octahedral +octahedrally +octahedric +octahedrical +octahedrite +octahedroid +octahedron +octahedrons +octahedrous +octahydrate +octahydrated +octakishexahedron +octal +octamerism +octamerous +octameter +octan +octanaphthene +octandria +octandrian +octandrious +octane +octanes +octangle +octangles +octangular +octangularness +octanol +octans +octant +octantal +octants +octapeptide +octapla +octaploid +octaploidy +octaploidic +octapody +octapodic +octarch +octarchy +octarchies +octary +octarius +octaroon +octarticulate +octasemic +octastich +octastichon +octastichous +octastyle +octastylos +octastrophic +octateuch +octaval +octavalent +octavaria +octavarium +octavd +octave +octaves +octavia +octavian +octavic +octavina +octavius +octavo +octavos +octdra +octect +octects +octenary +octene +octennial +octennially +octet +octets +octette +octettes +octic +octyl +octile +octylene +octillion +octillions +octillionth +octyls +octine +octyne +octingentenary +octoad +octoalloy +octoate +octobass +october +octobers +octobrachiate +octobrist +octocentenary +octocentennial +octochord +octocoralla +octocorallan +octocorallia +octocoralline +octocotyloid +octodactyl +octodactyle +octodactylous +octode +octodecillion +octodecillions +octodecillionth +octodecimal +octodecimo +octodecimos +octodentate +octodianome +octodon +octodont +octodontidae +octodontinae +octoechos +octofid +octofoil +octofoiled +octogamy +octogenary +octogenarian +octogenarianism +octogenarians +octogenaries +octogild +octogynia +octogynian +octogynious +octogynous +octoglot +octohedral +octoic +octoid +octoyl +octolateral +octolocular +octomeral +octomerous +octometer +octonal +octonare +octonary +octonarian +octonaries +octonarius +octonematous +octonion +octonocular +octoon +octopartite +octopean +octoped +octopede +octopetalous +octophyllous +octophthalmous +octopi +octopine +octoploid +octoploidy +octoploidic +octopod +octopoda +octopodan +octopodes +octopodous +octopods +octopolar +octopus +octopuses +octoradial +octoradiate +octoradiated +octoreme +octoroon +octoroons +octose +octosepalous +octosyllabic +octosyllable +octospermous +octospore +octosporous +octostichous +octothorp +octothorpe +octothorpes +octovalent +octroi +octroy +octrois +octuor +octuple +octupled +octuples +octuplet +octuplets +octuplex +octuply +octuplicate +octuplication +octupling +ocuby +ocular +oculary +ocularist +ocularly +oculars +oculate +oculated +oculauditory +oculi +oculiferous +oculiform +oculigerous +oculina +oculinid +oculinidae +oculinoid +oculist +oculistic +oculists +oculli +oculocephalic +oculofacial +oculofrontal +oculomotor +oculomotory +oculonasal +oculopalpebral +oculopupillary +oculospinal +oculozygomatic +oculus +ocurred +od +oda +odacidae +odacoid +odal +odalborn +odalisk +odalisks +odalisque +odaller +odalman +odalwoman +odax +odd +oddball +oddballs +odder +oddest +oddfellow +oddish +oddity +oddities +oddlegs +oddly +oddman +oddment +oddments +oddness +oddnesses +odds +oddsbud +oddside +oddsman +ode +odea +odel +odelet +odell +odelsthing +odelsting +odeon +odeons +odes +odessa +odeum +odible +odic +odically +odiferous +odyl +odyle +odyles +odylic +odylism +odylist +odylization +odylize +odyls +odin +odynerus +odinian +odinic +odinism +odinist +odinite +odinitic +odiometer +odious +odiously +odiousness +odyssean +odyssey +odysseys +odysseus +odist +odium +odiumproof +odiums +odling +odobenidae +odobenus +odocoileus +odograph +odographs +odology +odometer +odometers +odometry +odometrical +odometries +odonata +odonate +odonates +odonnell +odontagra +odontalgia +odontalgic +odontaspidae +odontaspididae +odontaspis +odontatrophy +odontatrophia +odontexesis +odontiasis +odontic +odontist +odontitis +odontoblast +odontoblastic +odontocele +odontocete +odontoceti +odontocetous +odontochirurgic +odontoclasis +odontoclast +odontodynia +odontogen +odontogenesis +odontogeny +odontogenic +odontoglossae +odontoglossal +odontoglossate +odontoglossum +odontognathae +odontognathic +odontognathous +odontograph +odontography +odontographic +odontohyperesthesia +odontoid +odontoids +odontolcae +odontolcate +odontolcous +odontolite +odontolith +odontology +odontological +odontologist +odontoloxia +odontoma +odontomous +odontonecrosis +odontoneuralgia +odontonosology +odontopathy +odontophobia +odontophoral +odontophoran +odontophore +odontophoridae +odontophorinae +odontophorine +odontophorous +odontophorus +odontoplast +odontoplerosis +odontopteris +odontopteryx +odontorhynchous +odontormae +odontornithes +odontornithic +odontorrhagia +odontorthosis +odontoschism +odontoscope +odontosyllis +odontosis +odontostomatous +odontostomous +odontotechny +odontotherapy +odontotherapia +odontotomy +odontotormae +odontotrypy +odontotripsis +odoom +odophone +odor +odorable +odorant +odorants +odorate +odorator +odored +odorful +odoriferant +odoriferosity +odoriferous +odoriferously +odoriferousness +odorific +odorimeter +odorimetry +odoriphor +odoriphore +odorivector +odorization +odorize +odorized +odorizer +odorizes +odorizing +odorless +odorlessly +odorlessness +odorometer +odorosity +odorous +odorously +odorousness +odorproof +odors +odostemon +odour +odoured +odourful +odourless +odours +ods +odso +odum +odwyer +odz +odzookers +odzooks +oe +oecanthus +oeci +oecist +oecodomic +oecodomical +oecoid +oecology +oecological +oecologies +oeconomic +oeconomus +oecoparasite +oecoparasitism +oecophobia +oecumenian +oecumenic +oecumenical +oecumenicalism +oecumenicity +oecus +oedema +oedemas +oedemata +oedematous +oedemerid +oedemeridae +oedicnemine +oedicnemus +oedipal +oedipally +oedipean +oedipus +oedipuses +oedogoniaceae +oedogoniaceous +oedogoniales +oedogonium +oeillade +oeillades +oeillet +oekist +oelet +oenanthaldehyde +oenanthate +oenanthe +oenanthic +oenanthyl +oenanthylate +oenanthylic +oenanthol +oenanthole +oenin +oenocarpus +oenochoae +oenochoe +oenocyte +oenocytic +oenolic +oenolin +oenology +oenological +oenologies +oenologist +oenomancy +oenomania +oenomaus +oenomel +oenomels +oenometer +oenone +oenophile +oenophiles +oenophilist +oenophobist +oenopoetic +oenothera +oenotheraceae +oenotheraceous +oenotrian +oer +oerlikon +oersted +oersteds +oes +oesogi +oesophagal +oesophageal +oesophagean +oesophagi +oesophagism +oesophagismus +oesophagitis +oesophagostomiasis +oesophagostomum +oesophagus +oestradiol +oestrelata +oestrian +oestriasis +oestrid +oestridae +oestrin +oestrins +oestriol +oestriols +oestrogen +oestroid +oestrone +oestrones +oestrous +oestrual +oestruate +oestruation +oestrum +oestrums +oestrus +oestruses +oeuvre +oeuvres +of +ofay +ofays +ofer +off +offal +offaling +offals +offbeat +offbeats +offbreak +offcast +offcasts +offcolour +offcome +offcut +offed +offence +offenceless +offencelessly +offences +offend +offendable +offendant +offended +offendedly +offendedness +offender +offenders +offendible +offending +offendress +offends +offense +offenseful +offenseless +offenselessly +offenselessness +offenseproof +offenses +offensible +offension +offensive +offensively +offensiveness +offensives +offer +offerable +offered +offeree +offerer +offerers +offering +offerings +offeror +offerors +offers +offertory +offertorial +offertories +offgoing +offgrade +offhand +offhanded +offhandedly +offhandedness +offic +officaries +office +officeholder +officeholders +officeless +officemate +officer +officerage +officered +officeress +officerhood +officerial +officering +officerism +officerless +officers +officership +offices +official +officialdom +officialese +officialisation +officialism +officiality +officialities +officialization +officialize +officialized +officializing +officially +officials +officialty +officiant +officiants +officiary +officiate +officiated +officiates +officiating +officiation +officiator +officina +officinal +officinally +officio +officious +officiously +officiousness +offing +offings +offish +offishly +offishness +offlap +offlet +offlicence +offline +offload +offloaded +offloading +offloads +offlook +offpay +offprint +offprinted +offprinting +offprints +offpspring +offs +offsaddle +offscape +offscour +offscourer +offscouring +offscourings +offscreen +offscum +offset +offsets +offsetting +offshoot +offshoots +offshore +offside +offsider +offspring +offsprings +offstage +offtake +offtype +offtrack +offuscate +offuscation +offward +offwards +oficina +oflete +ofo +oft +often +oftener +oftenest +oftenness +oftens +oftentime +oftentimes +ofter +oftest +ofthink +oftly +oftness +ofttime +ofttimes +oftwhiles +og +ogaire +ogallala +ogam +ogamic +ogams +ogboni +ogcocephalidae +ogcocephalus +ogdoad +ogdoads +ogdoas +ogee +ogeed +ogees +ogenesis +ogenetic +ogganition +ogham +oghamic +oghamist +oghamists +oghams +oghuz +ogygia +ogygian +ogival +ogive +ogived +ogives +oglala +ogle +ogled +ogler +oglers +ogles +ogling +ogmic +ogonium +ogor +ogpu +ogre +ogreish +ogreishly +ogreism +ogreisms +ogres +ogress +ogresses +ogrish +ogrishly +ogrism +ogrisms +ogtiern +ogum +oh +ohare +ohed +ohelo +ohia +ohias +ohing +ohio +ohioan +ohioans +ohm +ohmage +ohmages +ohmic +ohmically +ohmmeter +ohmmeters +ohms +oho +ohoy +ohone +ohs +ohv +oy +oyana +oyapock +oicks +oidia +oidioid +oidiomycosis +oidiomycotic +oidium +oidwlfe +oie +oyelet +oyer +oyers +oyes +oyesses +oyez +oii +oik +oikology +oikomania +oikophobia +oikoplast +oiks +oil +oilberry +oilberries +oilbird +oilbirds +oilcake +oilcamp +oilcamps +oilcan +oilcans +oilcase +oilcloth +oilcloths +oilcoat +oilcup +oilcups +oildom +oiled +oiler +oilery +oilers +oylet +oilfield +oilfired +oilfish +oilfishes +oilheating +oilhole +oilholes +oily +oilier +oiliest +oiligarchy +oilyish +oilily +oiliness +oilinesses +oiling +oilish +oilless +oillessness +oillet +oillike +oilman +oilmen +oilmonger +oilmongery +oilometer +oilpaper +oilpapers +oilproof +oilproofing +oils +oilseed +oilseeds +oilskin +oilskinned +oilskins +oilstock +oilstone +oilstoned +oilstones +oilstoning +oilstove +oiltight +oiltightness +oilway +oilways +oilwell +oime +oink +oinked +oinking +oinks +oinochoai +oinochoe +oinochoes +oinochoi +oinology +oinologies +oinomancy +oinomania +oinomel +oinomels +oint +ointment +ointments +oireachtas +oisin +oisivity +oyster +oysterage +oysterbird +oystercatcher +oystered +oysterer +oysterers +oysterfish +oysterfishes +oystergreen +oysterhood +oysterhouse +oysteries +oystering +oysterish +oysterishness +oysterlike +oysterling +oysterman +oystermen +oysterous +oysterroot +oysters +oysterseed +oystershell +oysterwife +oysterwoman +oysterwomen +oitava +oiticica +oiticicas +ojibwa +ojibway +ojibwas +ok +oka +okay +okayed +okaying +okays +okanagan +okapi +okapia +okapis +okas +oke +okee +okeh +okehs +okey +okeydoke +okeydokey +okenite +oker +okes +oket +oki +okia +okie +okimono +okinagan +okinawa +oklafalaya +oklahannali +oklahoma +oklahoman +oklahomans +okolehao +okoniosis +okonite +okoume +okra +okras +okro +okroog +okrug +okruzi +okshoofd +okta +oktastylos +okthabah +okuari +okupukupu +ol +ola +olacaceae +olacaceous +olacad +olaf +olam +olamic +olax +olcha +olchi +old +olden +oldenburg +oldened +oldening +older +oldermost +olders +oldest +oldfangled +oldfangledness +oldfieldia +oldhamia +oldhamite +oldhearted +oldy +oldie +oldies +oldish +oldland +oldness +oldnesses +olds +oldsmobile +oldster +oldsters +oldstyle +oldstyles +oldwench +oldwife +oldwives +ole +olea +oleaceae +oleaceous +oleacina +oleacinidae +oleaginous +oleaginously +oleaginousness +oleana +oleander +oleanders +oleandomycin +oleandrin +oleandrine +oleary +olearia +olease +oleaster +oleasters +oleate +oleates +olecranal +olecranarthritis +olecranial +olecranian +olecranoid +olecranon +olefiant +olefin +olefine +olefines +olefinic +olefins +oleg +oleic +oleiferous +olein +oleine +oleines +oleins +olena +olenellidian +olenellus +olenid +olenidae +olenidian +olent +olenus +oleo +oleocalcareous +oleocellosis +oleocyst +oleoduct +oleograph +oleographer +oleography +oleographic +oleoyl +oleomargaric +oleomargarin +oleomargarine +oleometer +oleoptene +oleorefractometer +oleoresin +oleoresinous +oleoresins +oleos +oleosaccharum +oleose +oleosity +oleostearate +oleostearin +oleostearine +oleothorax +oleous +olepy +oleraceae +oleraceous +olericultural +olericulturally +olericulture +olericulturist +oleron +oles +olethreutes +olethreutid +olethreutidae +oleum +oleums +olfact +olfactable +olfacty +olfactible +olfaction +olfactive +olfactology +olfactometer +olfactometry +olfactometric +olfactophobia +olfactor +olfactoreceptor +olfactory +olfactories +olfactorily +olga +oliban +olibanum +olibanums +olibene +olycook +olid +oligacanthous +oligaemia +oligandrous +oliganthous +oligarch +oligarchal +oligarchy +oligarchic +oligarchical +oligarchically +oligarchies +oligarchism +oligarchist +oligarchize +oligarchs +oligemia +oligidic +oligidria +oligist +oligistic +oligistical +oligocarpous +oligocene +oligochaeta +oligochaete +oligochaetous +oligochete +oligochylia +oligocholia +oligochrome +oligochromemia +oligochronometer +oligocystic +oligocythemia +oligocythemic +oligoclase +oligoclasite +oligodactylia +oligodendroglia +oligodendroglioma +oligodynamic +oligodipsia +oligodontous +oligogalactia +oligohemia +oligohydramnios +oligolactia +oligomenorrhea +oligomer +oligomery +oligomeric +oligomerization +oligomerous +oligomers +oligometochia +oligometochic +oligomycin +oligomyodae +oligomyodian +oligomyoid +oligonephria +oligonephric +oligonephrous +oligonite +oligonucleotide +oligopepsia +oligopetalous +oligophagy +oligophagous +oligophyllous +oligophosphaturia +oligophrenia +oligophrenic +oligopyrene +oligoplasmia +oligopnea +oligopoly +oligopolist +oligopolistic +oligoprothesy +oligoprothetic +oligopsychia +oligopsony +oligopsonistic +oligorhizous +oligosaccharide +oligosepalous +oligosialia +oligosideric +oligosiderite +oligosyllabic +oligosyllable +oligosynthetic +oligosite +oligospermia +oligospermous +oligostemonous +oligotokeus +oligotokous +oligotrichia +oligotrophy +oligotrophic +oligotropic +oliguresia +oliguresis +oliguretic +oliguria +olykoek +olympia +olympiad +olympiadic +olympiads +olympian +olympianism +olympianize +olympianly +olympians +olympianwise +olympic +olympicly +olympicness +olympics +olympieion +olympionic +olympus +olinia +oliniaceae +oliniaceous +olynthiac +olynthian +olynthus +olio +olios +oliphant +oliprance +olitory +oliva +olivaceous +olivary +olivaster +olive +olivean +olived +olivella +oliveness +olivenite +oliver +oliverian +oliverman +olivermen +oliversmith +olives +olivescent +olivesheen +olivet +olivetan +olivette +olivewood +olivia +olividae +olivier +oliviferous +oliviform +olivil +olivile +olivilin +olivine +olivinefels +olivines +olivinic +olivinite +olivinitic +olla +ollamh +ollapod +ollas +ollav +ollenite +ollie +ollock +olluck +olm +olneya +olof +ology +ological +ologies +ologist +ologistic +ologists +olograph +olographic +ololiuqui +olomao +olona +olonets +olonetsian +olonetsish +olor +oloroso +olp +olpae +olpe +olpes +olpidiaster +olpidium +olson +oltonde +oltunna +om +omadhaun +omagra +omagua +omaha +omahas +omalgia +oman +omander +omani +omao +omar +omarthritis +omasa +omasitis +omasum +omber +ombers +ombre +ombrellino +ombrellinos +ombres +ombrette +ombrifuge +ombrograph +ombrographic +ombrology +ombrological +ombrometer +ombrometric +ombrophil +ombrophile +ombrophily +ombrophilic +ombrophilous +ombrophyte +ombrophobe +ombrophoby +ombrophobous +ombudsman +ombudsmanship +ombudsmen +ombudsperson +omega +omegas +omegoid +omelet +omelets +omelette +omelettes +omelie +omen +omened +omening +omenology +omens +omenta +omental +omentectomy +omentitis +omentocele +omentofixation +omentopexy +omentoplasty +omentorrhaphy +omentosplenopexy +omentotomy +omentulum +omentum +omentums +omentuta +omer +omers +omicron +omicrons +omikron +omikrons +omina +ominate +ominous +ominously +ominousness +omissible +omission +omissions +omissive +omissively +omissus +omit +omitis +omits +omittable +omittance +omitted +omitter +omitting +omlah +ommastrephes +ommastrephidae +ommatea +ommateal +ommateum +ommatidia +ommatidial +ommatidium +ommatitidia +ommatophore +ommatophorous +ommetaphobia +ommiad +ommiades +omneity +omnes +omni +omniactive +omniactuality +omniana +omniarch +omniarchs +omnibearing +omnibenevolence +omnibenevolent +omnibus +omnibuses +omnibusman +omnicausality +omnicompetence +omnicompetent +omnicorporeal +omnicredulity +omnicredulous +omnidenominational +omnidirectional +omnidistance +omnierudite +omniessence +omnifacial +omnifarious +omnifariously +omnifariousness +omniferous +omnify +omnific +omnificence +omnificent +omnifidel +omnified +omnifying +omnifocal +omniform +omniformal +omniformity +omnigenous +omnigerent +omnigraph +omnihuman +omnihumanity +omnilegent +omnilingual +omniloquent +omnilucent +omnimental +omnimeter +omnimode +omnimodous +omninescience +omninescient +omniparent +omniparient +omniparity +omniparous +omnipatient +omnipercipience +omnipercipiency +omnipercipient +omniperfect +omnipotence +omnipotency +omnipotent +omnipotentiality +omnipotently +omnipregnant +omnipresence +omnipresent +omnipresently +omniprevalence +omniprevalent +omniproduction +omniprudence +omniprudent +omnirange +omniregency +omniregent +omnirepresentative +omnirepresentativeness +omnirevealing +omniscience +omnisciency +omniscient +omnisciently +omniscope +omniscribent +omniscriptive +omnisentience +omnisentient +omnisignificance +omnisignificant +omnispective +omnist +omnisufficiency +omnisufficient +omnitemporal +omnitenent +omnitolerant +omnitonal +omnitonality +omnitonic +omnitude +omnium +omnivagant +omnivalence +omnivalent +omnivalous +omnivarious +omnividence +omnivident +omnivision +omnivolent +omnivora +omnivoracious +omnivoracity +omnivorant +omnivore +omnivores +omnivorism +omnivorous +omnivorously +omnivorousness +omodynia +omohyoid +omoideum +omophagy +omophagia +omophagic +omophagies +omophagist +omophagous +omophoria +omophorion +omoplate +omoplatoscopy +omostegite +omosternal +omosternum +omphacy +omphacine +omphacite +omphalectomy +omphali +omphalic +omphalism +omphalitis +omphalocele +omphalode +omphalodia +omphalodium +omphalogenous +omphaloid +omphaloma +omphalomesaraic +omphalomesenteric +omphaloncus +omphalopagus +omphalophlebitis +omphalopsychic +omphalopsychite +omphalorrhagia +omphalorrhea +omphalorrhexis +omphalos +omphalosite +omphaloskepsis +omphalospinous +omphalotomy +omphalotripsy +omphalus +omrah +oms +on +ona +onager +onagers +onaggri +onagra +onagraceae +onagraceous +onagri +onan +onanism +onanisms +onanist +onanistic +onanists +onboard +onca +once +oncer +onces +oncet +oncetta +onchidiidae +onchidium +onchocerca +onchocerciasis +onchocercosis +oncia +oncidium +oncidiums +oncin +oncogenesis +oncogenic +oncogenicity +oncograph +oncography +oncology +oncologic +oncological +oncologies +oncologist +oncome +oncometer +oncometry +oncometric +oncoming +oncomings +oncorhynchus +oncoses +oncosimeter +oncosis +oncosphere +oncost +oncostman +oncotic +oncotomy +ondagram +ondagraph +ondameter +ondascope +ondatra +ondy +ondine +onding +ondogram +ondograms +ondograph +ondoyant +ondometer +ondoscope +ondule +one +oneanother +oneberry +onefold +onefoldness +onegite +onehearted +onehood +onehow +oneida +oneidas +oneyer +oneill +oneiric +oneirocrit +oneirocritic +oneirocritical +oneirocritically +oneirocriticism +oneirocritics +oneirodynia +oneirology +oneirologist +oneiromancer +oneiromancy +oneiroscopy +oneiroscopic +oneiroscopist +oneirotic +oneism +onement +oneness +onenesses +oner +onerary +onerate +onerative +onery +onerier +oneriest +onerose +onerosity +onerosities +onerous +onerously +onerousness +ones +oneself +onesigned +onethe +onetime +oneupmanship +onewhere +onfall +onflemed +onflow +onflowing +ongaro +ongoing +onhanger +oni +ony +onycha +onychatrophia +onychauxis +onychia +onychin +onychite +onychitis +onychium +onychogryposis +onychoid +onycholysis +onychomalacia +onychomancy +onychomycosis +onychonosus +onychopathy +onychopathic +onychopathology +onychophagy +onychophagia +onychophagist +onychophyma +onychophora +onychophoran +onychophorous +onychoptosis +onychorrhexis +onychoschizia +onychosis +onychotrophy +onicolo +onym +onymal +onymancy +onymatic +onymy +onymity +onymize +onymous +oniomania +oniomaniac +onion +onionet +oniony +onionized +onionlike +onionpeel +onions +onionskin +onionskins +onirotic +oniscidae +onisciform +oniscoid +oniscoidea +oniscoidean +oniscus +onium +onyx +onyxes +onyxis +onyxitis +onker +onkilonite +onkos +onlay +onlaid +onlaying +onlap +onlepy +onless +only +onliest +online +onliness +onlook +onlooker +onlookers +onlooking +onmarch +onmun +ono +onobrychis +onocentaur +onoclea +onocrotal +onofrite +onohippidium +onolatry +onomancy +onomantia +onomasiology +onomasiological +onomastic +onomastical +onomasticon +onomastics +onomatology +onomatologic +onomatological +onomatologically +onomatologist +onomatomancy +onomatomania +onomatop +onomatope +onomatophobia +onomatopy +onomatoplasm +onomatopoeia +onomatopoeial +onomatopoeian +onomatopoeic +onomatopoeical +onomatopoeically +onomatopoesy +onomatopoesis +onomatopoetic +onomatopoetically +onomatopoieses +onomatopoiesis +onomatous +onomomancy +onondaga +onondagan +onondagas +ononis +onopordon +onosmodium +onotogenic +onrush +onrushes +onrushing +ons +onset +onsets +onsetter +onsetting +onshore +onside +onsight +onslaught +onslaughts +onstage +onstand +onstanding +onstead +onsweep +onsweeping +ont +ontal +ontarian +ontaric +ontario +ontic +ontically +onto +ontocycle +ontocyclic +ontogenal +ontogeneses +ontogenesis +ontogenetic +ontogenetical +ontogenetically +ontogeny +ontogenic +ontogenically +ontogenies +ontogenist +ontography +ontology +ontologic +ontological +ontologically +ontologies +ontologise +ontologised +ontologising +ontologism +ontologist +ontologistic +ontologize +ontosophy +onus +onuses +onwaiting +onward +onwardly +onwardness +onwards +onza +ooangium +oobit +ooblast +ooblastic +oocyesis +oocyst +oocystaceae +oocystaceous +oocystic +oocystis +oocysts +oocyte +oocytes +oodles +oodlins +ooecia +ooecial +ooecium +oof +oofbird +oofy +oofier +oofiest +oofless +ooftish +oogamete +oogametes +oogamy +oogamies +oogamous +oogenesis +oogenetic +oogeny +oogenies +ooglea +oogloea +oogone +oogonia +oogonial +oogoninia +oogoniophore +oogonium +oogoniums +oograph +ooh +oohed +oohing +oohs +ooid +ooidal +ookinesis +ookinete +ookinetic +oolachan +oolachans +oolak +oolakan +oolemma +oolite +oolites +oolith +ooliths +oolitic +oolly +oollies +oology +oologic +oological +oologically +oologies +oologist +oologists +oologize +oolong +oolongs +oomancy +oomantia +oometer +oometry +oometric +oomiac +oomiack +oomiacks +oomiacs +oomiak +oomiaks +oomycete +oomycetes +oomycetous +oompah +oomph +oomphs +oons +oont +oooo +oopack +oopak +oophyte +oophytes +oophytic +oophoralgia +oophorauxe +oophore +oophorectomy +oophorectomies +oophorectomize +oophorectomized +oophorectomizing +oophoreocele +oophorhysterectomy +oophoric +oophoridia +oophoridium +oophoridiums +oophoritis +oophorocele +oophorocystectomy +oophoroepilepsy +oophoroma +oophoromalacia +oophoromania +oophoron +oophoropexy +oophororrhaphy +oophorosalpingectomy +oophorostomy +oophorotomy +ooplasm +ooplasmic +ooplast +oopod +oopodal +ooporphyrin +oops +oopuhue +oorali +ooralis +oord +oory +oorial +oorie +oos +ooscope +ooscopy +oose +oosperm +oosperms +oosphere +oospheres +oosporange +oosporangia +oosporangium +oospore +oosporeae +oospores +oosporic +oosporiferous +oosporous +oostegite +oostegitic +oosterbeek +oot +ootheca +oothecae +oothecal +ootid +ootids +ootype +ootocoid +ootocoidea +ootocoidean +ootocous +oots +ootwith +oouassa +ooze +oozed +oozes +oozy +oozier +ooziest +oozily +ooziness +oozinesses +oozing +oozoa +oozoid +oozooid +op +opa +opacate +opacify +opacification +opacified +opacifier +opacifies +opacifying +opacimeter +opacite +opacity +opacities +opacous +opacousness +opacus +opah +opahs +opai +opaion +opal +opaled +opaleye +opalesce +opalesced +opalescence +opalescent +opalesces +opalescing +opalesque +opalina +opaline +opalines +opalinid +opalinidae +opalinine +opalish +opalize +opalized +opalizing +opaloid +opalotype +opals +opaque +opaqued +opaquely +opaqueness +opaquer +opaques +opaquest +opaquing +opata +opcode +opdalite +ope +opec +oped +opedeldoc +opegrapha +opeidoscope +opelet +opelu +open +openability +openable +openairish +openairness +openband +openbeak +openbill +opencast +openchain +opencircuit +opencut +opened +openendedness +opener +openers +openest +openhanded +openhandedly +openhandedness +openhead +openhearted +openheartedly +openheartedness +opening +openings +openly +openmouthed +openmouthedly +openmouthedness +openness +opennesses +opens +openside +openwork +openworks +opera +operabily +operability +operabilities +operable +operably +operae +operagoer +operalogue +operameter +operance +operancy +operand +operandi +operands +operant +operantis +operantly +operants +operary +operas +operatable +operate +operated +operatee +operates +operatic +operatical +operatically +operatics +operating +operation +operational +operationalism +operationalist +operationalistic +operationally +operationism +operationist +operations +operative +operatively +operativeness +operatives +operativity +operatize +operator +operatory +operators +operatrices +operatrix +opercele +operceles +opercle +opercled +opercula +opercular +operculata +operculate +operculated +opercule +opercules +operculiferous +operculiform +operculigenous +operculigerous +operculum +operculums +operetta +operettas +operette +operettist +operla +operon +operons +operose +operosely +operoseness +operosity +opes +ophelia +ophelimity +ophian +ophiasis +ophic +ophicalcite +ophicephalidae +ophicephaloid +ophicephalus +ophichthyidae +ophichthyoid +ophicleide +ophicleidean +ophicleidist +ophidia +ophidian +ophidians +ophidiidae +ophidiobatrachia +ophidioid +ophidiomania +ophidion +ophidiophobia +ophidious +ophidium +ophidology +ophidologist +ophiobatrachia +ophiobolus +ophioglossaceae +ophioglossaceous +ophioglossales +ophioglossum +ophiography +ophioid +ophiolater +ophiolatry +ophiolatrous +ophiolite +ophiolitic +ophiology +ophiologic +ophiological +ophiologist +ophiomancy +ophiomorph +ophiomorpha +ophiomorphic +ophiomorphous +ophion +ophionid +ophioninae +ophionine +ophiophagous +ophiophagus +ophiophilism +ophiophilist +ophiophobe +ophiophoby +ophiophobia +ophiopluteus +ophiosaurus +ophiostaphyle +ophiouride +ophir +ophis +ophisaurus +ophism +ophite +ophites +ophitic +ophitism +ophiuchid +ophiuchus +ophiucus +ophiuran +ophiurid +ophiurida +ophiuroid +ophiuroidea +ophiuroidean +ophresiophobia +ophryon +ophrys +ophthalaiater +ophthalitis +ophthalm +ophthalmagra +ophthalmalgia +ophthalmalgic +ophthalmatrophia +ophthalmectomy +ophthalmencephalon +ophthalmetrical +ophthalmy +ophthalmia +ophthalmiac +ophthalmiater +ophthalmiatrics +ophthalmic +ophthalmious +ophthalmist +ophthalmite +ophthalmitic +ophthalmitis +ophthalmoblennorrhea +ophthalmocarcinoma +ophthalmocele +ophthalmocopia +ophthalmodiagnosis +ophthalmodiastimeter +ophthalmodynamometer +ophthalmodynia +ophthalmography +ophthalmol +ophthalmoleucoscope +ophthalmolith +ophthalmology +ophthalmologic +ophthalmological +ophthalmologically +ophthalmologies +ophthalmologist +ophthalmologists +ophthalmomalacia +ophthalmometer +ophthalmometry +ophthalmometric +ophthalmometrical +ophthalmomycosis +ophthalmomyositis +ophthalmomyotomy +ophthalmoneuritis +ophthalmopathy +ophthalmophlebotomy +ophthalmophore +ophthalmophorous +ophthalmophthisis +ophthalmoplasty +ophthalmoplegia +ophthalmoplegic +ophthalmopod +ophthalmoptosis +ophthalmorrhagia +ophthalmorrhea +ophthalmorrhexis +ophthalmosaurus +ophthalmoscope +ophthalmoscopes +ophthalmoscopy +ophthalmoscopic +ophthalmoscopical +ophthalmoscopies +ophthalmoscopist +ophthalmostasis +ophthalmostat +ophthalmostatometer +ophthalmothermometer +ophthalmotomy +ophthalmotonometer +ophthalmotonometry +ophthalmotrope +ophthalmotropometer +opiane +opianic +opianyl +opiate +opiated +opiateproof +opiates +opiatic +opiating +opiconsivia +opifex +opifice +opificer +opiism +opilia +opiliaceae +opiliaceous +opiliones +opilionina +opilionine +opilonea +opimian +opinability +opinable +opinably +opinant +opination +opinative +opinatively +opinator +opine +opined +opiner +opiners +opines +oping +opiniaster +opiniastre +opiniastrety +opiniastrous +opiniate +opiniated +opiniatedly +opiniater +opiniative +opiniatively +opiniativeness +opiniatre +opiniatreness +opiniatrety +opinicus +opinicuses +opining +opinion +opinionable +opinionaire +opinional +opinionate +opinionated +opinionatedly +opinionatedness +opinionately +opinionative +opinionatively +opinionativeness +opinioned +opinionedness +opinionist +opinions +opiomania +opiomaniac +opiophagy +opiophagism +opiparous +opisometer +opisthenar +opisthion +opisthobranch +opisthobranchia +opisthobranchiate +opisthocoelia +opisthocoelian +opisthocoelous +opisthocome +opisthocomi +opisthocomidae +opisthocomine +opisthocomous +opisthodetic +opisthodome +opisthodomos +opisthodomoses +opisthodomus +opisthodont +opisthogastric +opisthogyrate +opisthogyrous +opisthoglyph +opisthoglypha +opisthoglyphic +opisthoglyphous +opisthoglossa +opisthoglossal +opisthoglossate +opisthognathidae +opisthognathism +opisthognathous +opisthograph +opisthographal +opisthography +opisthographic +opisthographical +opisthoparia +opisthoparian +opisthophagic +opisthoporeia +opisthorchiasis +opisthorchis +opisthosomal +opisthothelae +opisthotic +opisthotonic +opisthotonoid +opisthotonos +opisthotonus +opium +opiumism +opiumisms +opiums +opobalsam +opobalsamum +opodeldoc +opodidymus +opodymus +opopanax +opoponax +oporto +opossum +opossums +opotherapy +opp +oppian +oppida +oppidan +oppidans +oppidum +oppignerate +oppignorate +oppilant +oppilate +oppilated +oppilates +oppilating +oppilation +oppilative +opplete +oppletion +oppone +opponency +opponens +opponent +opponents +opportune +opportuneless +opportunely +opportuneness +opportunism +opportunist +opportunistic +opportunistically +opportunists +opportunity +opportunities +opposability +opposabilities +opposable +opposal +oppose +opposed +opposeless +opposer +opposers +opposes +opposing +opposingly +opposit +opposite +oppositely +oppositeness +opposites +oppositiflorous +oppositifolious +opposition +oppositional +oppositionary +oppositionism +oppositionist +oppositionists +oppositionless +oppositions +oppositious +oppositipetalous +oppositipinnate +oppositipolar +oppositisepalous +oppositive +oppositively +oppositiveness +oppossum +opposure +oppress +oppressed +oppresses +oppressible +oppressing +oppression +oppressionist +oppressive +oppressively +oppressiveness +oppressor +oppressors +opprobry +opprobriate +opprobriated +opprobriating +opprobrious +opprobriously +opprobriousness +opprobrium +opprobriums +oppugn +oppugnacy +oppugnance +oppugnancy +oppugnant +oppugnate +oppugnation +oppugned +oppugner +oppugners +oppugning +oppugns +ops +opsy +opsigamy +opsimath +opsimathy +opsin +opsins +opsiometer +opsisform +opsistype +opsonia +opsonic +opsoniferous +opsonify +opsonification +opsonified +opsonifies +opsonifying +opsonin +opsonins +opsonist +opsonium +opsonization +opsonize +opsonized +opsonizes +opsonizing +opsonogen +opsonoid +opsonology +opsonometry +opsonophilia +opsonophilic +opsonophoric +opsonotherapy +opt +optable +optableness +optably +optant +optate +optation +optative +optatively +optatives +opted +opthalmic +opthalmology +opthalmologic +opthalmophorium +opthalmoplegy +opthalmoscopy +opthalmothermometer +optic +optical +optically +optician +opticians +opticism +opticist +opticists +opticity +opticly +opticochemical +opticociliary +opticon +opticopapillary +opticopupillary +optics +optigraph +optima +optimacy +optimal +optimality +optimally +optimate +optimates +optime +optimes +optimeter +optimise +optimised +optimises +optimising +optimism +optimisms +optimist +optimistic +optimistical +optimistically +optimisticalness +optimists +optimity +optimization +optimizations +optimize +optimized +optimizer +optimizers +optimizes +optimizing +optimum +optimums +opting +option +optional +optionality +optionalize +optionally +optionals +optionary +optioned +optionee +optionees +optioning +optionor +options +optive +optoacoustic +optoblast +optoelectronic +optogram +optography +optoisolate +optokinetic +optology +optological +optologist +optomeninx +optometer +optometry +optometric +optometrical +optometries +optometrist +optometrists +optophone +optotechnics +optotype +opts +opulaster +opulence +opulences +opulency +opulencies +opulent +opulently +opulus +opuntia +opuntiaceae +opuntiales +opuntias +opuntioid +opus +opuscle +opuscula +opuscular +opuscule +opuscules +opusculum +opuses +oquassa +oquassas +or +ora +orabassu +orach +orache +oraches +oracy +oracle +oracler +oracles +oracula +oracular +oracularity +oracularly +oracularness +oraculate +oraculous +oraculously +oraculousness +oraculum +orad +orae +orage +oragious +oraison +orakzai +oral +orale +oraler +oralism +oralist +orality +oralities +oralization +oralize +orally +oralogy +oralogist +orals +orang +orange +orangeade +orangeades +orangeado +orangeat +orangeberry +orangeberries +orangebird +orangey +orangeish +orangeism +orangeist +orangeleaf +orangeman +orangeness +oranger +orangery +orangeries +orangeroot +oranges +orangewoman +orangewood +orangy +orangier +orangiest +oranginess +orangish +orangism +orangist +orangite +orangize +orangoutan +orangoutang +orangs +orangutan +orangutang +orangutans +orans +orant +orante +orantes +oraon +orary +oraria +orarian +orarion +orarium +oras +orate +orated +orates +orating +oration +orational +orationer +orations +orator +oratory +oratorial +oratorially +oratorian +oratorianism +oratorianize +oratoric +oratorical +oratorically +oratories +oratorio +oratorios +oratorium +oratorize +oratorlike +orators +oratorship +oratress +oratresses +oratrices +oratrix +orb +orbate +orbation +orbed +orbell +orby +orbic +orbical +orbicella +orbicle +orbicular +orbiculares +orbicularis +orbicularity +orbicularly +orbicularness +orbiculate +orbiculated +orbiculately +orbiculation +orbiculatocordate +orbiculatoelliptical +orbiculoidea +orbific +orbilian +orbilius +orbing +orbit +orbital +orbitale +orbitally +orbitals +orbitar +orbitary +orbite +orbited +orbitelar +orbitelariae +orbitelarian +orbitele +orbitelous +orbiter +orbiters +orbity +orbiting +orbitofrontal +orbitoides +orbitolina +orbitolite +orbitolites +orbitomalar +orbitomaxillary +orbitonasal +orbitopalpebral +orbitosphenoid +orbitosphenoidal +orbitostat +orbitotomy +orbitozygomatic +orbits +orbitude +orbless +orblet +orblike +orbs +orbulina +orc +orca +orcadian +orcanet +orcanette +orcas +orcein +orceins +orch +orchamus +orchanet +orchard +orcharding +orchardist +orchardists +orchardman +orchardmen +orchards +orchat +orchectomy +orcheitis +orchel +orchella +orchen +orchesis +orchesography +orchester +orchestia +orchestian +orchestic +orchestiid +orchestiidae +orchestra +orchestral +orchestraless +orchestrally +orchestras +orchestrate +orchestrated +orchestrater +orchestrates +orchestrating +orchestration +orchestrational +orchestrations +orchestrator +orchestrators +orchestre +orchestrelle +orchestric +orchestrina +orchestrion +orchialgia +orchic +orchichorea +orchid +orchidaceae +orchidacean +orchidaceous +orchidales +orchidalgia +orchidean +orchidectomy +orchidectomies +orchideous +orchideously +orchidist +orchiditis +orchidocele +orchidocelioplasty +orchidology +orchidologist +orchidomania +orchidopexy +orchidoplasty +orchidoptosis +orchidorrhaphy +orchidotherapy +orchidotomy +orchidotomies +orchids +orchiectomy +orchiectomies +orchiencephaloma +orchiepididymitis +orchil +orchilytic +orchilla +orchils +orchiocatabasis +orchiocele +orchiodynia +orchiomyeloma +orchioncus +orchioneuralgia +orchiopexy +orchioplasty +orchiorrhaphy +orchioscheocele +orchioscirrhus +orchiotomy +orchis +orchises +orchitic +orchitis +orchitises +orchotomy +orchotomies +orcin +orcine +orcinol +orcinols +orcins +orcinus +orcs +ord +ordain +ordainable +ordained +ordainer +ordainers +ordaining +ordainment +ordains +ordalian +ordalium +ordanchite +ordeal +ordeals +ordene +order +orderable +ordered +orderedness +orderer +orderers +ordering +orderings +orderless +orderlessness +orderly +orderlies +orderliness +orders +ordinability +ordinable +ordinaire +ordinal +ordinally +ordinals +ordinance +ordinances +ordinand +ordinands +ordinant +ordinar +ordinary +ordinariate +ordinarier +ordinaries +ordinariest +ordinarily +ordinariness +ordinaryship +ordinarius +ordinate +ordinated +ordinately +ordinates +ordinating +ordination +ordinations +ordinative +ordinatomaculate +ordinator +ordinee +ordines +ordn +ordnance +ordnances +ordo +ordonnance +ordonnances +ordonnant +ordos +ordosite +ordovian +ordovices +ordovician +ordu +ordure +ordures +ordurous +ordurousness +ore +oread +oreads +oreamnos +oreas +orecchion +orectic +orective +ored +oregano +oreganos +oregon +oregoni +oregonian +oregonians +oreide +oreides +oreilet +oreiller +oreillet +oreillette +orejon +orellin +oreman +oremus +orenda +orendite +oreocarya +oreodon +oreodont +oreodontidae +oreodontine +oreodontoid +oreodoxa +oreography +oreophasinae +oreophasine +oreophasis +oreopithecus +oreortyx +oreotragine +oreotragus +oreotrochilus +ores +oreshoot +orestean +oresteia +orestes +oretic +oreweed +orewood +orexin +orexis +orf +orfe +orfevrerie +orfgild +orfray +orfrays +org +orgal +orgament +orgamy +organ +organa +organal +organbird +organdy +organdie +organdies +organella +organellae +organelle +organelles +organer +organette +organy +organic +organical +organically +organicalness +organicism +organicismal +organicist +organicistic +organicity +organics +organify +organific +organifier +organing +organisability +organisable +organisation +organisational +organisationally +organise +organised +organises +organising +organism +organismal +organismic +organismically +organisms +organist +organistic +organistrum +organists +organistship +organity +organizability +organizable +organization +organizational +organizationally +organizationist +organizations +organizatory +organize +organized +organizer +organizers +organizes +organizing +organless +organoantimony +organoarsenic +organobismuth +organoboron +organochlorine +organochordium +organogel +organogen +organogenesis +organogenetic +organogenetically +organogeny +organogenic +organogenist +organogold +organography +organographic +organographical +organographies +organographist +organoid +organoiron +organolead +organoleptic +organoleptically +organolithium +organology +organologic +organological +organologist +organomagnesium +organomercury +organomercurial +organometallic +organon +organonym +organonymal +organonymy +organonymic +organonyn +organonomy +organonomic +organons +organopathy +organophil +organophile +organophyly +organophilic +organophone +organophonic +organophosphate +organophosphorous +organophosphorus +organoplastic +organoscopy +organosilicon +organosiloxane +organosilver +organosodium +organosol +organotherapeutics +organotherapy +organotin +organotrophic +organotropy +organotropic +organotropically +organotropism +organozinc +organry +organs +organule +organum +organums +organza +organzas +organzine +organzined +orgasm +orgasmic +orgasms +orgastic +orgeat +orgeats +orgy +orgia +orgiac +orgiacs +orgiasm +orgiast +orgiastic +orgiastical +orgiastically +orgic +orgies +orgyia +orgone +orgue +orgueil +orguil +orguinette +orgulous +orgulously +orhamwood +ory +orians +orias +oribatid +oribatidae +oribatids +oribi +oribis +orichalc +orichalceous +orichalch +orichalcum +oricycle +oriconic +orycterope +orycteropodidae +orycteropus +oryctics +oryctognosy +oryctognostic +oryctognostical +oryctognostically +oryctolagus +oryctology +oryctologic +oryctologist +oriel +oriels +oriency +orient +oriental +orientalia +orientalism +orientalist +orientality +orientalization +orientalize +orientalized +orientalizing +orientally +orientalogy +orientals +orientate +orientated +orientates +orientating +orientation +orientational +orientationally +orientations +orientative +orientator +oriented +orienteering +orienter +orienting +orientite +orientization +orientize +oriently +orientness +orients +orifacial +orifice +orifices +orificial +oriflamb +oriflamme +oriform +orig +origami +origamis +origan +origanized +origans +origanum +origanums +origenian +origenic +origenical +origenism +origenist +origenistic +origenize +origin +originable +original +originalist +originality +originalities +originally +originalness +originals +originant +originary +originarily +originate +originated +originates +originating +origination +originative +originatively +originator +originators +originatress +origines +originist +origins +orignal +orihyperbola +orihon +oriya +orillion +orillon +orinasal +orinasality +orinasally +orinasals +oriole +orioles +oriolidae +oriolus +orion +oriskanian +orismology +orismologic +orismological +orison +orisons +orisphere +oryssid +oryssidae +oryssus +oristic +oryx +oryxes +oryza +oryzanin +oryzanine +oryzenin +oryzivorous +oryzomys +oryzopsis +oryzorictes +oryzorictinae +orkey +orkhon +orkneyan +orl +orlage +orlando +orle +orlean +orleanism +orleanist +orleanistic +orleans +orles +orlet +orleways +orlewise +orly +orlo +orlon +orlop +orlops +orlos +ormazd +ormer +ormers +ormolu +ormolus +ormond +ormuzine +orna +ornament +ornamental +ornamentalism +ornamentalist +ornamentality +ornamentalize +ornamentally +ornamentary +ornamentation +ornamentations +ornamented +ornamenter +ornamenting +ornamentist +ornaments +ornary +ornate +ornately +ornateness +ornation +ornature +ornery +ornerier +orneriest +ornerily +orneriness +ornes +ornify +ornis +orniscopy +orniscopic +orniscopist +ornith +ornithes +ornithic +ornithichnite +ornithine +ornithischia +ornithischian +ornithivorous +ornithobiography +ornithobiographical +ornithocephalic +ornithocephalidae +ornithocephalous +ornithocephalus +ornithocoprolite +ornithocopros +ornithodelph +ornithodelphia +ornithodelphian +ornithodelphic +ornithodelphous +ornithodoros +ornithogaea +ornithogaean +ornithogalum +ornithogeographic +ornithogeographical +ornithography +ornithoid +ornithol +ornitholestes +ornitholite +ornitholitic +ornithology +ornithologic +ornithological +ornithologically +ornithologist +ornithologists +ornithomancy +ornithomania +ornithomantia +ornithomantic +ornithomantist +ornithomimid +ornithomimidae +ornithomimus +ornithomyzous +ornithomorph +ornithomorphic +ornithon +ornithopappi +ornithophile +ornithophily +ornithophilist +ornithophilite +ornithophilous +ornithophobia +ornithopod +ornithopoda +ornithopter +ornithoptera +ornithopteris +ornithorhynchidae +ornithorhynchous +ornithorhynchus +ornithosaur +ornithosauria +ornithosaurian +ornithoscelida +ornithoscelidan +ornithoscopy +ornithoscopic +ornithoscopist +ornithoses +ornithosis +ornithotic +ornithotomy +ornithotomical +ornithotomist +ornithotrophy +ornithurae +ornithuric +ornithurous +ornithvrous +ornoite +oroanal +orobanchaceae +orobanchaceous +orobanche +orobancheous +orobathymetric +orobatoidea +orocentral +orochon +orocratic +orodiagnosis +orogen +orogenesy +orogenesis +orogenetic +orogeny +orogenic +orogenies +oroggaphical +orograph +orography +orographic +orographical +orographically +oroheliograph +orohydrography +orohydrographic +orohydrographical +orohippus +oroide +oroides +orolingual +orology +orological +orologies +orologist +orometer +orometers +orometry +orometric +oromo +oronasal +oronasally +oronoco +oronoko +oronooko +orontium +oropharyngeal +oropharynges +oropharynx +oropharynxes +orotherapy +orotinan +orotund +orotundity +orotunds +orphan +orphanage +orphanages +orphancy +orphandom +orphaned +orphange +orphanhood +orphaning +orphanism +orphanize +orphanry +orphans +orphanship +orpharion +orphean +orpheist +orpheon +orpheonist +orpheum +orpheus +orphic +orphical +orphically +orphicism +orphism +orphize +orphrey +orphreyed +orphreys +orpiment +orpiments +orpin +orpinc +orpine +orpines +orpington +orpins +orpit +orra +orrery +orreriec +orreries +orrhoid +orrhology +orrhotherapy +orrice +orrices +orris +orrises +orrisroot +orrow +ors +orsede +orsedue +orseille +orseilline +orsel +orselle +orseller +orsellic +orsellinate +orsellinic +orson +ort +ortalid +ortalidae +ortalidian +ortalis +ortanique +orterde +ortet +orth +orthagoriscus +orthal +orthant +orthantimonic +ortheris +orthian +orthic +orthicon +orthiconoscope +orthicons +orthid +orthidae +orthis +orthite +orthitic +ortho +orthoarsenite +orthoaxis +orthobenzoquinone +orthobiosis +orthoborate +orthobrachycephalic +orthocarbonic +orthocarpous +orthocarpus +orthocenter +orthocentre +orthocentric +orthocephaly +orthocephalic +orthocephalous +orthoceracone +orthoceran +orthoceras +orthoceratidae +orthoceratite +orthoceratitic +orthoceratoid +orthochlorite +orthochromatic +orthochromatize +orthocym +orthocymene +orthoclase +orthoclasite +orthoclastic +orthocoumaric +orthocresol +orthodiaene +orthodiagonal +orthodiagram +orthodiagraph +orthodiagraphy +orthodiagraphic +orthodiazin +orthodiazine +orthodolichocephalic +orthodomatic +orthodome +orthodontia +orthodontic +orthodontics +orthodontist +orthodontists +orthodox +orthodoxal +orthodoxality +orthodoxally +orthodoxes +orthodoxy +orthodoxian +orthodoxical +orthodoxically +orthodoxicalness +orthodoxies +orthodoxism +orthodoxist +orthodoxly +orthodoxness +orthodromy +orthodromic +orthodromics +orthoepy +orthoepic +orthoepical +orthoepically +orthoepies +orthoepist +orthoepistic +orthoepists +orthoformic +orthogamy +orthogamous +orthoganal +orthogenesis +orthogenetic +orthogenetically +orthogenic +orthognathy +orthognathic +orthognathism +orthognathous +orthognathus +orthogneiss +orthogonal +orthogonality +orthogonalization +orthogonalize +orthogonalized +orthogonalizing +orthogonally +orthogonial +orthograde +orthogranite +orthograph +orthographer +orthography +orthographic +orthographical +orthographically +orthographies +orthographise +orthographised +orthographising +orthographist +orthographize +orthographized +orthographizing +orthohydrogen +orthologer +orthology +orthologian +orthological +orthometopic +orthometry +orthometric +orthomolecular +orthomorphic +orthonectida +orthonitroaniline +orthonormal +orthonormality +orthopaedy +orthopaedia +orthopaedic +orthopaedically +orthopaedics +orthopaedist +orthopath +orthopathy +orthopathic +orthopathically +orthopedy +orthopedia +orthopedic +orthopedical +orthopedically +orthopedics +orthopedist +orthopedists +orthophenylene +orthophyre +orthophyric +orthophony +orthophonic +orthophoria +orthophoric +orthophosphate +orthophosphoric +orthopinacoid +orthopinacoidal +orthopyramid +orthopyroxene +orthoplasy +orthoplastic +orthoplumbate +orthopnea +orthopneic +orthopnoea +orthopnoeic +orthopod +orthopoda +orthopraxy +orthopraxia +orthopraxis +orthoprism +orthopsychiatry +orthopsychiatric +orthopsychiatrical +orthopsychiatrist +orthopter +orthoptera +orthopteral +orthopteran +orthopterist +orthopteroid +orthopteroidea +orthopterology +orthopterological +orthopterologist +orthopteron +orthopterous +orthoptetera +orthoptic +orthoptics +orthoquinone +orthorhombic +orthorrhapha +orthorrhaphy +orthorrhaphous +orthoscope +orthoscopic +orthose +orthoselection +orthosemidin +orthosemidine +orthosilicate +orthosilicic +orthosymmetry +orthosymmetric +orthosymmetrical +orthosymmetrically +orthosis +orthosite +orthosomatic +orthospermous +orthostat +orthostatai +orthostates +orthostati +orthostatic +orthostichy +orthostichies +orthostichous +orthostyle +orthosubstituted +orthotactic +orthotectic +orthotic +orthotics +orthotype +orthotypous +orthotist +orthotolidin +orthotolidine +orthotoluic +orthotoluidin +orthotoluidine +orthotomic +orthotomous +orthotone +orthotonesis +orthotonic +orthotonus +orthotropal +orthotropy +orthotropic +orthotropically +orthotropism +orthotropous +orthovanadate +orthovanadic +orthoveratraldehyde +orthoveratric +orthoxazin +orthoxazine +orthoxylene +orthron +orthros +ortiga +ortygan +ortygian +ortyginae +ortygine +ortive +ortyx +ortman +ortol +ortolan +ortolans +ortrud +orts +ortstaler +ortstein +orunchun +orvet +orvietan +orvietite +orvieto +orville +orwell +orwellian +os +osage +osages +osaka +osamin +osamine +osar +osazone +osc +oscan +oscar +oscarella +oscarellidae +oscars +oscella +oscheal +oscheitis +oscheocarcinoma +oscheocele +oscheolith +oscheoma +oscheoncus +oscheoplasty +oschophoria +oscillance +oscillancy +oscillant +oscillaria +oscillariaceae +oscillariaceous +oscillate +oscillated +oscillates +oscillating +oscillation +oscillational +oscillations +oscillative +oscillatively +oscillator +oscillatory +oscillatoria +oscillatoriaceae +oscillatoriaceous +oscillatorian +oscillators +oscillogram +oscillograph +oscillography +oscillographic +oscillographically +oscillographies +oscillometer +oscillometry +oscillometric +oscillometries +oscilloscope +oscilloscopes +oscilloscopic +oscilloscopically +oscin +oscine +oscines +oscinian +oscinidae +oscinine +oscinis +oscitance +oscitancy +oscitancies +oscitant +oscitantly +oscitate +oscitation +oscnode +oscula +osculable +osculant +oscular +oscularity +osculate +osculated +osculates +osculating +osculation +osculations +osculatory +osculatories +osculatrix +osculatrixes +oscule +oscules +osculiferous +osculum +oscurantist +oscurrantist +ose +osela +osella +oselle +oses +oshac +oshea +osi +osiandrian +oside +osier +osiered +osiery +osieries +osierlike +osiers +osirian +osiride +osiridean +osirify +osirification +osiris +osirism +oskar +oslo +osmanie +osmanli +osmanthus +osmate +osmateria +osmaterium +osmatic +osmatism +osmazomatic +osmazomatous +osmazome +osmeridae +osmerus +osmesis +osmeteria +osmeterium +osmetic +osmiamic +osmic +osmics +osmidrosis +osmin +osmina +osmious +osmiridium +osmite +osmium +osmiums +osmodysphoria +osmogene +osmograph +osmol +osmolagnia +osmolal +osmolality +osmolar +osmolarity +osmology +osmols +osmometer +osmometry +osmometric +osmometrically +osmond +osmondite +osmophobia +osmophore +osmoregulation +osmoregulatory +osmorhiza +osmoscope +osmose +osmosed +osmoses +osmosing +osmosis +osmotactic +osmotaxis +osmotherapy +osmotic +osmotically +osmous +osmund +osmunda +osmundaceae +osmundaceous +osmundas +osmundine +osmunds +osnaburg +osnaburgs +osnappar +osoberry +osoberries +osone +osophy +osophies +osophone +osotriazine +osotriazole +osperm +osphere +osphyalgia +osphyalgic +osphyarthritis +osphyitis +osphyocele +osphyomelitis +osphradia +osphradial +osphradium +osphresiolagnia +osphresiology +osphresiologic +osphresiologist +osphresiometer +osphresiometry +osphresiophilia +osphresis +osphretic +osphromenidae +ospore +osprey +ospreys +ossa +ossal +ossarium +ossature +osse +ossea +ossein +osseins +osselet +ossements +osseoalbuminoid +osseoaponeurotic +osseocartilaginous +osseofibrous +osseomucoid +osseous +osseously +osset +osseter +ossetian +ossetic +ossetine +ossetish +ossia +ossian +ossianesque +ossianic +ossianism +ossianize +ossicle +ossicles +ossicula +ossicular +ossiculate +ossiculated +ossicule +ossiculectomy +ossiculotomy +ossiculum +ossiferous +ossify +ossific +ossification +ossifications +ossificatory +ossified +ossifier +ossifiers +ossifies +ossifying +ossifluence +ossifluent +ossiform +ossifrage +ossifrangent +ossypite +ossivorous +ossuary +ossuaries +ossuarium +ostalgia +ostara +ostariophysan +ostariophyseae +ostariophysi +ostariophysial +ostariophysous +ostarthritis +osteal +ostealgia +osteanabrosis +osteanagenesis +ostearthritis +ostearthrotomy +ostectomy +ostectomies +osteectomy +osteectomies +osteectopy +osteectopia +osteichthyes +ostein +osteitic +osteitides +osteitis +ostemia +ostempyesis +ostend +ostensibility +ostensibilities +ostensible +ostensibly +ostension +ostensive +ostensively +ostensory +ostensoria +ostensories +ostensorium +ostensorsoria +ostent +ostentate +ostentation +ostentatious +ostentatiously +ostentatiousness +ostentive +ostentous +osteoaneurysm +osteoarthritic +osteoarthritis +osteoarthropathy +osteoarthrotomy +osteoblast +osteoblastic +osteoblastoma +osteocachetic +osteocarcinoma +osteocartilaginous +osteocele +osteocephaloma +osteochondritis +osteochondrofibroma +osteochondroma +osteochondromatous +osteochondropathy +osteochondrophyte +osteochondrosarcoma +osteochondrous +osteocystoma +osteocyte +osteoclasia +osteoclasis +osteoclast +osteoclasty +osteoclastic +osteocolla +osteocomma +osteocranium +osteodentin +osteodentinal +osteodentine +osteoderm +osteodermal +osteodermatous +osteodermia +osteodermis +osteodermous +osteodiastasis +osteodynia +osteodystrophy +osteoencephaloma +osteoenchondroma +osteoepiphysis +osteofibroma +osteofibrous +osteogangrene +osteogen +osteogenesis +osteogenetic +osteogeny +osteogenic +osteogenist +osteogenous +osteoglossid +osteoglossidae +osteoglossoid +osteoglossum +osteographer +osteography +osteohalisteresis +osteoid +osteoids +osteolepidae +osteolepis +osteolysis +osteolite +osteolytic +osteologer +osteology +osteologic +osteological +osteologically +osteologies +osteologist +osteoma +osteomalacia +osteomalacial +osteomalacic +osteomancy +osteomanty +osteomas +osteomata +osteomatoid +osteome +osteomere +osteometry +osteometric +osteometrical +osteomyelitis +osteoncus +osteonecrosis +osteoneuralgia +osteopaedion +osteopath +osteopathy +osteopathic +osteopathically +osteopathies +osteopathist +osteopaths +osteopedion +osteoperiosteal +osteoperiostitis +osteopetrosis +osteophage +osteophagia +osteophyma +osteophyte +osteophytic +osteophlebitis +osteophone +osteophony +osteophore +osteoplaque +osteoplast +osteoplasty +osteoplastic +osteoplasties +osteoporosis +osteoporotic +osteorrhaphy +osteosarcoma +osteosarcomatous +osteoscleroses +osteosclerosis +osteosclerotic +osteoscope +osteosynovitis +osteosynthesis +osteosis +osteosteatoma +osteostixis +osteostomatous +osteostomous +osteostracan +osteostraci +osteosuture +osteothrombosis +osteotome +osteotomy +osteotomies +osteotomist +osteotribe +osteotrite +osteotrophy +osteotrophic +osteria +ostertagia +ostia +ostyak +ostial +ostiary +ostiaries +ostiarius +ostiate +ostic +ostinato +ostinatos +ostiolar +ostiolate +ostiole +ostioles +ostitis +ostium +ostler +ostleress +ostlerie +ostlers +ostmannic +ostmark +ostmarks +ostmen +ostomatid +ostomy +ostomies +ostoses +ostosis +ostosises +ostraca +ostracea +ostracean +ostraceous +ostraciidae +ostracine +ostracioid +ostracion +ostracise +ostracism +ostracite +ostracizable +ostracization +ostracize +ostracized +ostracizer +ostracizes +ostracizing +ostracod +ostracoda +ostracodan +ostracode +ostracoderm +ostracodermi +ostracodous +ostracods +ostracoid +ostracoidea +ostracon +ostracophore +ostracophori +ostracophorous +ostracum +ostraeacea +ostraite +ostrca +ostrea +ostreaceous +ostreger +ostreicultural +ostreiculture +ostreiculturist +ostreidae +ostreiform +ostreodynamometer +ostreoid +ostreophage +ostreophagist +ostreophagous +ostrya +ostrich +ostriches +ostrichlike +ostringer +ostrogoth +ostrogothian +ostrogothic +ostsis +ostsises +osullivan +oswald +oswegan +oswego +ot +otacoustic +otacousticon +otacust +otaheitan +otalgy +otalgia +otalgias +otalgic +otalgies +otary +otaria +otarian +otaries +otariidae +otariinae +otariine +otarine +otarioid +otate +otc +otectomy +otelcosis +otello +othaematoma +othake +othelcosis +othello +othematoma +othematomata +othemorrhea +otheoscope +other +otherdom +otherest +othergates +otherguess +otherguise +otherhow +otherism +otherist +otherness +others +othersome +othertime +othertimes +otherways +otherwards +otherwhence +otherwhere +otherwhereness +otherwheres +otherwhile +otherwhiles +otherwhither +otherwise +otherwiseness +otherworld +otherworldly +otherworldliness +otherworldness +othygroma +othin +othinism +othman +othmany +othonna +otyak +otiant +otiatry +otiatric +otiatrics +otic +oticodinia +otidae +otides +otidia +otididae +otidiform +otidine +otidiphaps +otidium +otiorhynchid +otiorhynchidae +otiorhynchinae +otiose +otiosely +otioseness +otiosity +otiosities +otis +otitic +otitides +otitis +otium +otkon +oto +otoantritis +otoblennorrhea +otocariasis +otocephaly +otocephalic +otocerebritis +otocyon +otocyst +otocystic +otocysts +otocleisis +otoconia +otoconial +otoconite +otoconium +otocrane +otocranial +otocranic +otocranium +otodynia +otodynic +otoencephalitis +otogenic +otogenous +otogyps +otography +otographical +otohemineurasthenia +otolaryngology +otolaryngologic +otolaryngological +otolaryngologies +otolaryngologist +otolaryngologists +otolite +otolith +otolithic +otolithidae +otoliths +otolithus +otolitic +otology +otologic +otological +otologically +otologies +otologist +otomaco +otomassage +otomi +otomian +otomyces +otomycosis +otomitlan +otomucormycosis +otonecrectomy +otoneuralgia +otoneurasthenia +otoneurology +otopathy +otopathic +otopathicetc +otopharyngeal +otophone +otopiesis +otopyorrhea +otopyosis +otoplasty +otoplastic +otopolypus +otorhinolaryngology +otorhinolaryngologic +otorhinolaryngologist +otorrhagia +otorrhea +otorrhoea +otosalpinx +otosclerosis +otoscope +otoscopes +otoscopy +otoscopic +otoscopies +otosis +otosphenal +otosteal +otosteon +ototoi +ototomy +ototoxic +otozoum +ottajanite +ottar +ottars +ottava +ottavarima +ottavas +ottave +ottavino +ottawa +ottawas +otter +otterer +otterhound +otters +ottetto +ottinger +ottingkar +otto +ottoman +ottomanean +ottomanic +ottomanism +ottomanization +ottomanize +ottomanlike +ottomans +ottomite +ottos +ottrelife +ottrelite +ottroye +ottweilian +otuquian +oturia +otus +otxi +ouabain +ouabains +ouabaio +ouabe +ouachitite +ouakari +ouananiche +ouanga +oubliance +oubliet +oubliette +oubliettes +ouch +ouches +oud +oudemian +oudenarde +oudenodon +oudenodont +ouds +ouenite +ouf +oufought +ough +ought +oughted +oughting +oughtlings +oughtlins +oughtness +oughtnt +oughts +oui +ouyezd +ouija +ouistiti +ouistitis +oukia +oulap +ounce +ounces +oundy +ounding +ounds +ouph +ouphe +ouphes +ouphish +ouphs +our +ourali +ourang +ourangs +ouranophobia +ouranos +ourari +ouraris +ourebi +ourebis +ouricury +ourie +ourn +ouroub +ourouparia +ours +oursel +ourself +oursels +ourselves +ousel +ousels +ousia +oust +ousted +oustee +ouster +ousters +ousting +oustiti +ousts +out +outact +outacted +outacting +outacts +outadd +outadded +outadding +outadds +outadmiral +outagami +outage +outages +outambush +outarde +outargue +outargued +outargues +outarguing +outas +outasight +outask +outasked +outasking +outasks +outate +outawe +outawed +outawing +outbabble +outbabbled +outbabbling +outback +outbacker +outbacks +outbade +outbake +outbaked +outbakes +outbaking +outbalance +outbalanced +outbalances +outbalancing +outban +outbanned +outbanning +outbanter +outbar +outbargain +outbargained +outbargaining +outbargains +outbark +outbarked +outbarking +outbarks +outbarred +outbarring +outbarter +outbat +outbatted +outbatter +outbatting +outbawl +outbawled +outbawling +outbawls +outbbled +outbbred +outbeam +outbeamed +outbeaming +outbeams +outbear +outbearing +outbeg +outbeggar +outbegged +outbegging +outbegs +outbelch +outbellow +outbend +outbending +outbent +outbetter +outby +outbid +outbidden +outbidder +outbidding +outbids +outbye +outbirth +outblacken +outblaze +outblazed +outblazes +outblazing +outbleat +outbleated +outbleating +outbleats +outbled +outbleed +outbleeding +outbless +outblessed +outblesses +outblessing +outblew +outbloom +outbloomed +outblooming +outblooms +outblossom +outblot +outblotted +outblotting +outblow +outblowing +outblown +outbluff +outbluffed +outbluffing +outbluffs +outblunder +outblush +outblushed +outblushes +outblushing +outbluster +outboard +outboards +outboast +outboasted +outboasting +outboasts +outbolting +outbond +outbook +outbore +outborn +outborne +outborough +outbound +outboundaries +outbounds +outbow +outbowed +outbowl +outbox +outboxed +outboxes +outboxing +outbrag +outbragged +outbragging +outbrags +outbray +outbraid +outbranch +outbranching +outbrave +outbraved +outbraves +outbraving +outbrazen +outbreak +outbreaker +outbreaking +outbreaks +outbreath +outbreathe +outbreathed +outbreather +outbreathing +outbred +outbreed +outbreeding +outbreeds +outbribe +outbribed +outbribes +outbribing +outbridge +outbridged +outbridging +outbring +outbringing +outbrother +outbrought +outbud +outbudded +outbudding +outbuy +outbuild +outbuilding +outbuildings +outbuilds +outbuilt +outbulge +outbulged +outbulging +outbulk +outbully +outbullied +outbullies +outbullying +outburn +outburned +outburning +outburns +outburnt +outburst +outbursts +outbustle +outbustled +outbustling +outbuzz +outcame +outcant +outcaper +outcapered +outcapering +outcapers +outcarol +outcaroled +outcaroling +outcarry +outcase +outcast +outcaste +outcasted +outcastes +outcasting +outcastness +outcasts +outcatch +outcatches +outcatching +outcaught +outcavil +outcaviled +outcaviling +outcavilled +outcavilling +outcavils +outcept +outchamber +outcharm +outcharmed +outcharming +outcharms +outchase +outchased +outchasing +outchatter +outcheat +outcheated +outcheating +outcheats +outchid +outchidden +outchide +outchided +outchides +outchiding +outcity +outcities +outclamor +outclass +outclassed +outclasses +outclassing +outclerk +outclimb +outclimbed +outclimbing +outclimbs +outclomb +outcome +outcomer +outcomes +outcoming +outcompass +outcompete +outcomplete +outcompliment +outcook +outcooked +outcooking +outcooks +outcorner +outcountry +outcourt +outcrawl +outcrawled +outcrawling +outcrawls +outcreep +outcreeping +outcrept +outcry +outcricket +outcried +outcrier +outcries +outcrying +outcrop +outcropped +outcropper +outcropping +outcroppings +outcrops +outcross +outcrossed +outcrosses +outcrossing +outcrow +outcrowd +outcrowed +outcrowing +outcrows +outcull +outcure +outcured +outcuring +outcurse +outcursed +outcurses +outcursing +outcurve +outcurved +outcurves +outcurving +outcut +outcutting +outdaciousness +outdance +outdanced +outdances +outdancing +outdare +outdared +outdares +outdaring +outdate +outdated +outdatedness +outdates +outdating +outdazzle +outdazzled +outdazzling +outdespatch +outdevil +outdeviled +outdeviling +outdid +outdispatch +outdistance +outdistanced +outdistances +outdistancing +outdistrict +outdo +outdodge +outdodged +outdodges +outdodging +outdoer +outdoers +outdoes +outdoing +outdone +outdoor +outdoorness +outdoors +outdoorsy +outdoorsman +outdoorsmanship +outdoorsmen +outdraft +outdragon +outdrank +outdraught +outdraw +outdrawing +outdrawn +outdraws +outdream +outdreamed +outdreaming +outdreams +outdreamt +outdress +outdressed +outdresses +outdressing +outdrew +outdrink +outdrinking +outdrinks +outdrive +outdriven +outdrives +outdriving +outdrop +outdropped +outdropping +outdrops +outdrove +outdrunk +outdure +outdwell +outdweller +outdwelling +outdwelt +outeat +outeate +outeaten +outeating +outeats +outecho +outechoed +outechoes +outechoing +outechos +outed +outedge +outedged +outedging +outeye +outeyed +outen +outequivocate +outequivocated +outequivocating +outer +outercoat +outerly +outermost +outerness +outers +outerwear +outfable +outfabled +outfables +outfabling +outface +outfaced +outfaces +outfacing +outfall +outfalls +outfame +outfamed +outfaming +outfangthief +outfast +outfasted +outfasting +outfasts +outfawn +outfawned +outfawning +outfawns +outfeast +outfeasted +outfeasting +outfeasts +outfeat +outfed +outfeed +outfeeding +outfeel +outfeeling +outfeels +outfelt +outfence +outfenced +outfencing +outferret +outffed +outfiction +outfield +outfielded +outfielder +outfielders +outfielding +outfields +outfieldsman +outfieldsmen +outfight +outfighter +outfighting +outfights +outfigure +outfigured +outfiguring +outfind +outfinding +outfinds +outfire +outfired +outfires +outfiring +outfish +outfit +outfits +outfitted +outfitter +outfitters +outfitting +outfittings +outflame +outflamed +outflaming +outflank +outflanked +outflanker +outflanking +outflanks +outflare +outflared +outflaring +outflash +outflatter +outfled +outflee +outfleeing +outflew +outfly +outflies +outflying +outfling +outflinging +outfloat +outflourish +outflow +outflowed +outflowing +outflown +outflows +outflue +outflung +outflunky +outflush +outflux +outfold +outfool +outfooled +outfooling +outfools +outfoot +outfooted +outfooting +outfoots +outform +outfort +outforth +outfought +outfound +outfox +outfoxed +outfoxes +outfoxing +outfreeman +outfront +outfroth +outfrown +outfrowned +outfrowning +outfrowns +outgabble +outgabbled +outgabbling +outgain +outgained +outgaining +outgains +outgallop +outgamble +outgambled +outgambling +outgame +outgamed +outgaming +outgang +outgarment +outgarth +outgas +outgassed +outgasses +outgassing +outgate +outgauge +outgave +outgaze +outgazed +outgazing +outgeneral +outgeneraled +outgeneraling +outgeneralled +outgeneralling +outgive +outgiven +outgives +outgiving +outglad +outglare +outglared +outglares +outglaring +outgleam +outglitter +outgloom +outglow +outglowed +outglowing +outglows +outgnaw +outgnawed +outgnawing +outgnawn +outgnaws +outgo +outgoer +outgoes +outgoing +outgoingness +outgoings +outgone +outgreen +outgrew +outgrin +outgrinned +outgrinning +outgrins +outground +outgroup +outgroups +outgrow +outgrowing +outgrown +outgrows +outgrowth +outgrowths +outguard +outguess +outguessed +outguesses +outguessing +outguide +outguided +outguides +outguiding +outgun +outgunned +outgunning +outguns +outgush +outgushes +outgushing +outhammer +outhasten +outhaul +outhauler +outhauls +outhear +outheard +outhearing +outhears +outheart +outhector +outheel +outher +outhymn +outhyperbolize +outhyperbolized +outhyperbolizing +outhire +outhired +outhiring +outhiss +outhit +outhits +outhitting +outhold +outhorn +outhorror +outhouse +outhouses +outhousing +outhowl +outhowled +outhowling +outhowls +outhue +outhumor +outhumored +outhumoring +outhumors +outhunt +outhurl +outhut +outyard +outyell +outyelled +outyelling +outyells +outyelp +outyelped +outyelping +outyelps +outyield +outyielded +outyielding +outyields +outimage +outing +outings +outinvent +outish +outissue +outissued +outissuing +outjazz +outjest +outjet +outjetted +outjetting +outjinx +outjinxed +outjinxes +outjinxing +outjockey +outjourney +outjourneyed +outjourneying +outjuggle +outjuggled +outjuggling +outjump +outjumped +outjumping +outjumps +outjut +outjuts +outjutted +outjutting +outkeep +outkeeper +outkeeping +outkeeps +outkept +outkick +outkicked +outkicking +outkicks +outkill +outking +outkiss +outkissed +outkisses +outkissing +outkitchen +outknave +outknee +outlabor +outlay +outlaid +outlaying +outlain +outlays +outlance +outlanced +outlancing +outland +outlander +outlandish +outlandishly +outlandishlike +outlandishness +outlands +outlash +outlast +outlasted +outlasting +outlasts +outlaugh +outlaughed +outlaughing +outlaughs +outlaunch +outlaw +outlawed +outlawing +outlawry +outlawries +outlaws +outlead +outleading +outlean +outleap +outleaped +outleaping +outleaps +outleapt +outlearn +outlearned +outlearning +outlearns +outlearnt +outled +outlegend +outlength +outlengthen +outler +outlet +outlets +outly +outlie +outlier +outliers +outlies +outligger +outlighten +outlying +outlimb +outlimn +outline +outlinear +outlined +outlineless +outliner +outlines +outlinger +outlining +outlip +outlipped +outlipping +outlive +outlived +outliver +outlivers +outlives +outliving +outlled +outlodging +outlook +outlooker +outlooks +outlope +outlord +outlot +outlove +outloved +outloves +outloving +outlung +outluster +outmagic +outmalaprop +outmalapropped +outmalapropping +outman +outmaneuver +outmaneuvered +outmaneuvering +outmaneuvers +outmanned +outmanning +outmanoeuvered +outmanoeuvering +outmanoeuvre +outmans +outmantle +outmarch +outmarched +outmarches +outmarching +outmarry +outmarriage +outmarried +outmarrying +outmaster +outmatch +outmatched +outmatches +outmatching +outmate +outmated +outmating +outmeasure +outmeasured +outmeasuring +outmen +outmerchant +outmiracle +outmode +outmoded +outmodes +outmoding +outmost +outmount +outmouth +outmove +outmoved +outmoves +outmoving +outname +outness +outnight +outnoise +outnook +outnumber +outnumbered +outnumbering +outnumbers +outoffice +outoven +outpace +outpaced +outpaces +outpacing +outpage +outpay +outpayment +outpaint +outpainted +outpainting +outpaints +outparagon +outparamour +outparish +outpart +outparts +outpass +outpassed +outpasses +outpassing +outpassion +outpath +outpatient +outpatients +outpeal +outpeep +outpeer +outpension +outpensioner +outpeople +outpeopled +outpeopling +outperform +outperformed +outperforming +outperforms +outpick +outpicket +outpipe +outpiped +outpiping +outpitch +outpity +outpitied +outpities +outpitying +outplace +outplay +outplayed +outplaying +outplays +outplan +outplanned +outplanning +outplans +outplease +outpleased +outpleasing +outplod +outplodded +outplodding +outplods +outplot +outplotted +outplotting +outpocketing +outpoint +outpointed +outpointing +outpoints +outpoise +outpoison +outpoll +outpolled +outpolling +outpolls +outpomp +outpop +outpopped +outpopping +outpopulate +outpopulated +outpopulating +outporch +outport +outporter +outportion +outports +outpost +outposts +outpouching +outpour +outpoured +outpourer +outpouring +outpourings +outpours +outpractice +outpracticed +outpracticing +outpray +outprayed +outpraying +outprays +outpraise +outpraised +outpraising +outpreach +outpreen +outpreened +outpreening +outpreens +outpress +outpressed +outpresses +outpressing +outpry +outprice +outpriced +outprices +outpricing +outpried +outprying +outprodigy +outproduce +outproduced +outproduces +outproducing +outpromise +outpromised +outpromising +outpull +outpulled +outpulling +outpulls +outpupil +outpurl +outpurse +outpursue +outpursued +outpursuing +outpush +outpushed +outpushes +outpushing +output +outputs +outputted +outputter +outputting +outquaff +outquarters +outqueen +outquery +outqueried +outquerying +outquestion +outquibble +outquibbled +outquibbling +outquibled +outquibling +outquote +outquoted +outquotes +outquoting +outr +outrace +outraced +outraces +outracing +outrage +outraged +outragely +outrageous +outrageously +outrageousness +outrageproof +outrager +outrages +outraging +outray +outrail +outraise +outraised +outraises +outraising +outrake +outran +outrance +outrances +outrang +outrange +outranged +outranges +outranging +outrank +outranked +outranking +outranks +outrant +outrap +outrapped +outrapping +outrate +outrated +outrating +outraught +outrave +outraved +outraves +outraving +outraze +outre +outreach +outreached +outreaches +outreaching +outread +outreading +outreads +outreason +outreasoned +outreasoning +outreasons +outreckon +outrecuidance +outredden +outrede +outreign +outrelief +outremer +outreness +outrhyme +outrhymed +outrhyming +outrib +outribbed +outribbing +outrick +outridden +outride +outrider +outriders +outrides +outriding +outrig +outrigged +outrigger +outriggered +outriggerless +outriggers +outrigging +outright +outrightly +outrightness +outring +outringing +outrings +outrival +outrivaled +outrivaling +outrivalled +outrivalling +outrivals +outrive +outroad +outroar +outroared +outroaring +outroars +outrock +outrocked +outrocking +outrocks +outrode +outrogue +outrogued +outroguing +outroyal +outroll +outrolled +outrolling +outrolls +outromance +outromanced +outromancing +outroop +outrooper +outroot +outrooted +outrooting +outroots +outrove +outroved +outroving +outrow +outrun +outrung +outrunner +outrunning +outruns +outrush +outrushes +outs +outsay +outsaid +outsaying +outsail +outsailed +outsailing +outsails +outsaint +outsally +outsallied +outsallying +outsang +outsat +outsatisfy +outsatisfied +outsatisfying +outsavor +outsavored +outsavoring +outsavors +outsaw +outscape +outscent +outscold +outscolded +outscolding +outscolds +outscore +outscored +outscores +outscoring +outscorn +outscorned +outscorning +outscorns +outscour +outscouring +outscout +outscream +outsea +outseam +outsearch +outsee +outseeing +outseek +outseeking +outseen +outsees +outsell +outselling +outsells +outsend +outsentinel +outsentry +outsentries +outsert +outserts +outservant +outserve +outserved +outserves +outserving +outset +outsets +outsetting +outsettlement +outsettler +outshadow +outshake +outshame +outshamed +outshames +outshaming +outshape +outshaped +outshaping +outsharp +outsharpen +outsheathe +outshift +outshifts +outshine +outshined +outshiner +outshines +outshining +outshone +outshoot +outshooting +outshoots +outshot +outshoulder +outshout +outshouted +outshouting +outshouts +outshove +outshoved +outshoving +outshow +outshowed +outshower +outshown +outshriek +outshrill +outshut +outside +outsided +outsidedness +outsideness +outsider +outsiderness +outsiders +outsides +outsift +outsigh +outsight +outsights +outsin +outsing +outsinging +outsings +outsinned +outsinning +outsins +outsit +outsits +outsitting +outsize +outsized +outsizes +outskill +outskip +outskipped +outskipping +outskirmish +outskirmisher +outskirt +outskirter +outskirts +outslander +outslang +outsleep +outsleeping +outsleeps +outslept +outslick +outslid +outslide +outsling +outslink +outslip +outsmart +outsmarted +outsmarting +outsmarts +outsmell +outsmile +outsmiled +outsmiles +outsmiling +outsmoke +outsmoked +outsmokes +outsmoking +outsnatch +outsnore +outsnored +outsnores +outsnoring +outsoar +outsoared +outsoaring +outsoars +outsold +outsole +outsoler +outsoles +outsonet +outsonnet +outsophisticate +outsophisticated +outsophisticating +outsought +outsound +outspan +outspanned +outspanning +outspans +outsparkle +outsparkled +outsparkling +outsparspied +outsparspying +outsparspinned +outsparspinning +outsparsprued +outsparspruing +outspat +outspeak +outspeaker +outspeaking +outspeaks +outsped +outspeech +outspeed +outspell +outspelled +outspelling +outspells +outspelt +outspend +outspending +outspends +outspent +outspy +outspied +outspying +outspill +outspin +outspinned +outspinning +outspirit +outspit +outsplendor +outspoke +outspoken +outspokenly +outspokenness +outsport +outspout +outsprang +outspread +outspreading +outspreads +outspring +outsprint +outsprue +outsprued +outspruing +outspue +outspurn +outspurt +outstagger +outstay +outstaid +outstayed +outstaying +outstair +outstays +outstand +outstander +outstanding +outstandingly +outstandingness +outstandings +outstands +outstank +outstare +outstared +outstares +outstaring +outstart +outstarted +outstarter +outstarting +outstartle +outstartled +outstartling +outstarts +outstate +outstated +outstater +outstates +outstating +outstation +outstations +outstatistic +outstature +outstatured +outstaturing +outsteal +outstealing +outsteam +outsteer +outsteered +outsteering +outsteers +outstep +outstepped +outstepping +outsting +outstinging +outstink +outstole +outstolen +outstood +outstorm +outstrain +outstream +outstreet +outstretch +outstretched +outstretcher +outstretches +outstretching +outstridden +outstride +outstriding +outstrike +outstrip +outstripped +outstripping +outstrips +outstrive +outstriven +outstriving +outstrode +outstroke +outstrove +outstruck +outstrut +outstrutted +outstrutting +outstudent +outstudy +outstudied +outstudies +outstudying +outstung +outstunt +outstunted +outstunting +outstunts +outsubtle +outsuck +outsucken +outsuffer +outsuitor +outsulk +outsulked +outsulking +outsulks +outsum +outsummed +outsumming +outsung +outsuperstition +outswagger +outswam +outsware +outswarm +outswear +outswearing +outswears +outsweep +outsweeping +outsweepings +outsweeten +outswell +outswift +outswim +outswimming +outswims +outswindle +outswindled +outswindling +outswing +outswinger +outswinging +outswirl +outswore +outsworn +outswum +outswung +outtake +outtaken +outtakes +outtalent +outtalk +outtalked +outtalking +outtalks +outtask +outtasked +outtasking +outtasks +outtaste +outtear +outtearing +outtease +outteased +outteasing +outtell +outtelling +outtells +outthank +outthanked +outthanking +outthanks +outthieve +outthieved +outthieving +outthink +outthinking +outthinks +outthought +outthreaten +outthrew +outthrob +outthrobbed +outthrobbing +outthrobs +outthrough +outthrow +outthrowing +outthrown +outthrows +outthrust +outthruster +outthrusting +outthunder +outthwack +outtinkle +outtinkled +outtinkling +outtyrannize +outtyrannized +outtyrannizing +outtire +outtired +outtiring +outtoil +outtold +outtongue +outtongued +outtonguing +outtop +outtopped +outtopping +outtore +outtorn +outtower +outtowered +outtowering +outtowers +outtrade +outtraded +outtrades +outtrading +outtrail +outtravel +outtraveled +outtraveling +outtrick +outtricked +outtricking +outtricks +outtrot +outtrots +outtrotted +outtrotting +outtrump +outtrumped +outtrumping +outtrumps +outttore +outttorn +outturn +outturned +outturns +outtwine +outusure +outvalue +outvalued +outvalues +outvaluing +outvanish +outvaunt +outvaunted +outvaunting +outvaunts +outvelvet +outvenom +outvictor +outvie +outvied +outvier +outvigil +outvying +outvillage +outvillain +outvociferate +outvociferated +outvociferating +outvoyage +outvoyaged +outvoyaging +outvoice +outvoiced +outvoices +outvoicing +outvote +outvoted +outvoter +outvotes +outvoting +outway +outwait +outwaited +outwaiting +outwaits +outwake +outwale +outwalk +outwalked +outwalking +outwalks +outwall +outwallop +outwander +outwar +outwarble +outwarbled +outwarbling +outward +outwardly +outwardmost +outwardness +outwards +outwardsoutwarred +outwarring +outwars +outwash +outwashes +outwaste +outwasted +outwastes +outwasting +outwatch +outwatched +outwatches +outwatching +outwater +outwave +outwaved +outwaving +outwealth +outweapon +outweaponed +outwear +outweary +outwearied +outwearies +outwearying +outwearing +outwears +outweave +outweaving +outweed +outweep +outweeping +outweeps +outweigh +outweighed +outweighing +outweighs +outweight +outwell +outwent +outwept +outwhirl +outwhirled +outwhirling +outwhirls +outwick +outwiggle +outwiggled +outwiggling +outwile +outwiled +outwiles +outwiling +outwill +outwilled +outwilling +outwills +outwin +outwind +outwinded +outwinding +outwindow +outwinds +outwing +outwish +outwished +outwishes +outwishing +outwit +outwith +outwits +outwittal +outwitted +outwitter +outwitting +outwoe +outwoman +outwood +outword +outwore +outwork +outworked +outworker +outworkers +outworking +outworks +outworld +outworn +outworth +outwove +outwoven +outwrangle +outwrangled +outwrangling +outwrench +outwrest +outwrestle +outwrestled +outwrestling +outwriggle +outwriggled +outwriggling +outwring +outwringing +outwrit +outwrite +outwrites +outwriting +outwritten +outwrote +outwrought +outwrung +outwwept +outwwove +outwwoven +outzany +ouvert +ouverte +ouvrage +ouvre +ouvrier +ouvriere +ouze +ouzel +ouzels +ouzo +ouzos +ova +ovaherero +oval +ovalbumen +ovalbumin +ovalescent +ovaliform +ovalish +ovality +ovalities +ovalization +ovalize +ovally +ovalness +ovalnesses +ovaloid +ovals +ovalwise +ovambo +ovampo +ovangangela +ovant +ovary +ovaria +ovarial +ovarian +ovariectomy +ovariectomize +ovariectomized +ovariectomizing +ovaries +ovarin +ovarioabdominal +ovariocele +ovariocentesis +ovariocyesis +ovariodysneuria +ovariohysterectomy +ovariole +ovarioles +ovariolumbar +ovariorrhexis +ovariosalpingectomy +ovariosteresis +ovariostomy +ovariotomy +ovariotomies +ovariotomist +ovariotomize +ovariotubal +ovarious +ovaritides +ovaritis +ovarium +ovate +ovateconical +ovated +ovately +ovation +ovational +ovationary +ovations +ovatoacuminate +ovatocylindraceous +ovatoconical +ovatocordate +ovatodeltoid +ovatoellipsoidal +ovatoglobose +ovatolanceolate +ovatooblong +ovatoorbicular +ovatopyriform +ovatoquadrangular +ovatorotundate +ovatoserrate +ovatotriangular +ovey +oven +ovenbird +ovenbirds +ovendry +ovened +ovenful +ovening +ovenly +ovenlike +ovenman +ovenmen +ovenpeel +ovens +ovensman +ovenstone +ovenware +ovenwares +ovenwise +ovenwood +over +overability +overable +overably +overabound +overabounded +overabounding +overabounds +overabsorb +overabsorption +overabstain +overabstemious +overabstemiously +overabstemiousness +overabundance +overabundant +overabundantly +overabuse +overabused +overabusing +overabusive +overabusively +overabusiveness +overaccelerate +overaccelerated +overaccelerating +overacceleration +overaccentuate +overaccentuated +overaccentuating +overaccentuation +overaccumulate +overaccumulated +overaccumulating +overaccumulation +overaccuracy +overaccurate +overaccurately +overachieve +overachieved +overachiever +overachieving +overacidity +overact +overacted +overacting +overaction +overactivate +overactivated +overactivating +overactive +overactiveness +overactivity +overacts +overacute +overacutely +overacuteness +overaddiction +overadorn +overadorned +overadornment +overadvance +overadvanced +overadvancing +overadvice +overaffect +overaffected +overaffirm +overaffirmation +overaffirmative +overaffirmatively +overaffirmativeness +overafflict +overaffliction +overage +overageness +overages +overaggravate +overaggravated +overaggravating +overaggravation +overaggressive +overaggressively +overaggressiveness +overagitate +overagitated +overagitating +overagitation +overagonize +overalcoholize +overalcoholized +overalcoholizing +overall +overalled +overallegiance +overallegorize +overallegorized +overallegorizing +overalls +overambitioned +overambitious +overambitiously +overambitiousness +overambling +overanalysis +overanalytical +overanalytically +overanalyze +overanalyzed +overanalyzely +overanalyzes +overanalyzing +overangelic +overangry +overanimated +overanimatedly +overanimation +overannotate +overannotated +overannotating +overanswer +overanxiety +overanxious +overanxiously +overanxiousness +overappareled +overapplaud +overappraisal +overappraise +overappraised +overappraising +overappreciation +overappreciative +overappreciatively +overappreciativeness +overapprehended +overapprehension +overapprehensive +overapprehensively +overapprehensiveness +overapt +overaptly +overaptness +overarch +overarched +overarches +overarching +overargue +overargued +overarguing +overargumentative +overargumentatively +overargumentativeness +overarm +overartificial +overartificiality +overartificially +overassail +overassert +overassertion +overassertive +overassertively +overassertiveness +overassess +overassessment +overassume +overassumed +overassuming +overassumption +overassumptive +overassumptively +overassured +overassuredly +overassuredness +overate +overattached +overattachment +overattention +overattentive +overattentively +overattentiveness +overattenuate +overattenuated +overattenuating +overawe +overawed +overawes +overawful +overawing +overawn +overawning +overbade +overbait +overbake +overbaked +overbakes +overbaking +overbalance +overbalanced +overbalances +overbalancing +overballast +overbalm +overbanded +overbandy +overbank +overbanked +overbar +overbarish +overbark +overbarren +overbarrenness +overbase +overbaseness +overbashful +overbashfully +overbashfulness +overbattle +overbbore +overbborne +overbbred +overbear +overbearance +overbearer +overbearing +overbearingly +overbearingness +overbears +overbeat +overbeating +overbeetling +overbelief +overbend +overbepatched +overberg +overbet +overbets +overbetted +overbetting +overby +overbias +overbid +overbidden +overbidding +overbide +overbids +overbig +overbigness +overbill +overbillow +overbit +overbite +overbites +overbitten +overbitter +overbitterly +overbitterness +overblack +overblame +overblamed +overblaming +overblanch +overblaze +overbleach +overblessed +overblessedness +overblew +overblind +overblindly +overblithe +overbloom +overblouse +overblow +overblowing +overblown +overblows +overboard +overboast +overboastful +overboastfully +overboastfulness +overbody +overbodice +overboding +overboil +overbold +overboldly +overboldness +overbook +overbooked +overbooking +overbookish +overbookishly +overbookishness +overbooks +overbooming +overboot +overbore +overborn +overborne +overborrow +overbought +overbound +overbounteous +overbounteously +overbounteousness +overbow +overbowed +overbowl +overbrace +overbraced +overbracing +overbrag +overbragged +overbragging +overbray +overbrained +overbrake +overbraked +overbraking +overbranch +overbravado +overbrave +overbravely +overbraveness +overbravery +overbreak +overbreakage +overbreathe +overbred +overbreed +overbreeding +overbribe +overbridge +overbright +overbrightly +overbrightness +overbrilliance +overbrilliancy +overbrilliant +overbrilliantly +overbrim +overbrimmed +overbrimming +overbrimmingly +overbroaden +overbroil +overbrood +overbrow +overbrown +overbrowse +overbrowsed +overbrowsing +overbrush +overbrutal +overbrutality +overbrutalities +overbrutalization +overbrutalize +overbrutalized +overbrutalizing +overbrutally +overbubbling +overbuy +overbuying +overbuild +overbuilding +overbuilt +overbuys +overbulk +overbulky +overbulkily +overbulkiness +overbumptious +overbumptiously +overbumptiousness +overburden +overburdened +overburdening +overburdeningly +overburdens +overburdensome +overburn +overburned +overburningly +overburnt +overburst +overburthen +overbusy +overbusily +overbusiness +overbusyness +overcalculate +overcalculation +overcall +overcalled +overcalling +overcalls +overcame +overcanny +overcanopy +overcap +overcapability +overcapable +overcapably +overcapacity +overcapacities +overcape +overcapitalisation +overcapitalise +overcapitalised +overcapitalising +overcapitalization +overcapitalize +overcapitalized +overcapitalizes +overcapitalizing +overcaptious +overcaptiously +overcaptiousness +overcard +overcare +overcareful +overcarefully +overcarefulness +overcareless +overcarelessly +overcarelessness +overcaring +overcarking +overcarry +overcarrying +overcast +overcasting +overcasts +overcasual +overcasually +overcasualness +overcasuistical +overcatch +overcaustic +overcaustically +overcausticity +overcaution +overcautious +overcautiously +overcautiousness +overcensor +overcensorious +overcensoriously +overcensoriousness +overcentralization +overcentralize +overcentralized +overcentralizing +overcerebral +overcertify +overcertification +overcertified +overcertifying +overchafe +overchafed +overchafing +overchannel +overchant +overcharge +overcharged +overchargement +overcharger +overcharges +overcharging +overcharitable +overcharitableness +overcharitably +overcharity +overchase +overchased +overchasing +overcheap +overcheaply +overcheapness +overcheck +overcherish +overcherished +overchidden +overchief +overchildish +overchildishly +overchildishness +overchill +overchlorinate +overchoke +overchrome +overchurch +overcirculate +overcircumspect +overcircumspection +overcivil +overcivility +overcivilization +overcivilize +overcivilized +overcivilizing +overcivilly +overclaim +overclamor +overclasp +overclean +overcleanly +overcleanness +overcleave +overclemency +overclement +overclever +overcleverly +overcleverness +overclimb +overclinical +overclinically +overclinicalness +overcloak +overclog +overclogged +overclogging +overcloy +overclose +overclosely +overcloseness +overclothe +overclothes +overcloud +overclouded +overclouding +overclouds +overcluster +overclutter +overcoached +overcoat +overcoated +overcoating +overcoats +overcoy +overcoil +overcoyly +overcoyness +overcold +overcoldly +overcollar +overcolor +overcoloration +overcoloring +overcolour +overcomable +overcome +overcomer +overcomes +overcoming +overcomingly +overcommand +overcommend +overcommendation +overcommercialization +overcommercialize +overcommercialized +overcommercializing +overcommit +overcommitment +overcommon +overcommonly +overcommonness +overcommunicative +overcompensate +overcompensated +overcompensates +overcompensating +overcompensation +overcompensations +overcompensatory +overcompensators +overcompetition +overcompetitive +overcompetitively +overcompetitiveness +overcomplacence +overcomplacency +overcomplacent +overcomplacently +overcomplete +overcomplex +overcomplexity +overcompliant +overcomplicate +overcomplicated +overcomplicating +overcompound +overconcentrate +overconcentrated +overconcentrating +overconcentration +overconcern +overconcerned +overcondensation +overcondense +overcondensed +overcondensing +overconfidence +overconfident +overconfidently +overconfiding +overconfute +overconquer +overconscientious +overconscientiously +overconscientiousness +overconscious +overconsciously +overconsciousness +overconservatism +overconservative +overconservatively +overconservativeness +overconsiderate +overconsiderately +overconsiderateness +overconsideration +overconstant +overconstantly +overconstantness +overconsume +overconsumed +overconsuming +overconsumption +overcontented +overcontentedly +overcontentedness +overcontentious +overcontentiously +overcontentiousness +overcontentment +overcontract +overcontraction +overcontribute +overcontributed +overcontributing +overcontribution +overcontrite +overcontritely +overcontriteness +overcontrol +overcontrolled +overcontrolling +overcook +overcooked +overcooking +overcooks +overcool +overcooled +overcooling +overcoolly +overcoolness +overcools +overcopious +overcopiously +overcopiousness +overcorned +overcorrect +overcorrection +overcorrupt +overcorruption +overcorruptly +overcostly +overcostliness +overcount +overcourteous +overcourteously +overcourteousness +overcourtesy +overcover +overcovetous +overcovetously +overcovetousness +overcow +overcram +overcramme +overcrammed +overcrammi +overcramming +overcrams +overcredit +overcredulity +overcredulous +overcredulously +overcredulousness +overcreed +overcreep +overcry +overcritical +overcritically +overcriticalness +overcriticism +overcriticize +overcriticized +overcriticizing +overcrop +overcropped +overcropping +overcrops +overcross +overcrossing +overcrow +overcrowd +overcrowded +overcrowdedly +overcrowdedness +overcrowding +overcrowds +overcrown +overcrust +overcull +overcultivate +overcultivated +overcultivating +overcultivation +overculture +overcultured +overcumber +overcunning +overcunningly +overcunningness +overcup +overcured +overcuriosity +overcurious +overcuriously +overcuriousness +overcurl +overcurrency +overcurrent +overcurtain +overcustom +overcut +overcutter +overcutting +overdainty +overdaintily +overdaintiness +overdamn +overdance +overdangle +overdare +overdared +overdares +overdaring +overdaringly +overdarken +overdash +overdated +overdazed +overdazzle +overdazzled +overdazzling +overdeal +overdear +overdearly +overdearness +overdebate +overdebated +overdebating +overdebilitate +overdebilitated +overdebilitating +overdecadence +overdecadent +overdecadently +overdeck +overdecked +overdecking +overdecks +overdecorate +overdecorated +overdecorates +overdecorating +overdecoration +overdecorative +overdecoratively +overdecorativeness +overdedicate +overdedicated +overdedicating +overdedication +overdeeming +overdeep +overdeepen +overdeeply +overdefensive +overdefensively +overdefensiveness +overdeferential +overdeferentially +overdefiant +overdefiantly +overdefiantness +overdefined +overdeliberate +overdeliberated +overdeliberately +overdeliberateness +overdeliberating +overdeliberation +overdelicacy +overdelicate +overdelicately +overdelicateness +overdelicious +overdeliciously +overdeliciousness +overdelighted +overdelightedly +overdemand +overdemandiness +overdemandingly +overdemandingness +overdemocracy +overdemonstrative +overden +overdenunciation +overdependence +overdependent +overdepress +overdepressive +overdepressively +overdepressiveness +overderide +overderided +overderiding +overderisive +overderisively +overderisiveness +overdescant +overdescribe +overdescribed +overdescribing +overdescriptive +overdescriptively +overdescriptiveness +overdesire +overdesirous +overdesirously +overdesirousness +overdestructive +overdestructively +overdestructiveness +overdetailed +overdetermination +overdetermined +overdevelop +overdeveloped +overdeveloping +overdevelopment +overdevelops +overdevoted +overdevotedly +overdevotedness +overdevotion +overdevout +overdevoutness +overdid +overdye +overdyed +overdyeing +overdyer +overdyes +overdiffuse +overdiffused +overdiffusely +overdiffuseness +overdiffusing +overdiffusingly +overdiffusingness +overdiffusion +overdigest +overdignify +overdignified +overdignifiedly +overdignifiedness +overdignifying +overdignity +overdying +overdilate +overdilated +overdilating +overdilation +overdiligence +overdiligent +overdiligently +overdiligentness +overdilute +overdiluted +overdiluting +overdilution +overdischarge +overdiscipline +overdisciplined +overdisciplining +overdiscount +overdiscourage +overdiscouraged +overdiscouragement +overdiscouraging +overdiscreet +overdiscreetly +overdiscreetness +overdiscriminating +overdiscriminatingly +overdiscrimination +overdiscuss +overdistance +overdistant +overdistantly +overdistantness +overdistempered +overdistend +overdistension +overdistention +overdistort +overdistortion +overdistrait +overdistraught +overdiverse +overdiversely +overdiverseness +overdiversify +overdiversification +overdiversified +overdiversifies +overdiversifying +overdiversity +overdo +overdoctrinaire +overdoctrinize +overdoer +overdoers +overdoes +overdogmatic +overdogmatical +overdogmatically +overdogmaticalness +overdogmatism +overdoing +overdome +overdomesticate +overdomesticated +overdomesticating +overdominance +overdominant +overdominate +overdominated +overdominating +overdone +overdoor +overdosage +overdose +overdosed +overdoses +overdosing +overdoubt +overdoze +overdozed +overdozing +overdraft +overdrafts +overdrain +overdrainage +overdramatic +overdramatically +overdramatize +overdramatized +overdramatizes +overdramatizing +overdrank +overdrape +overdrapery +overdraught +overdraw +overdrawer +overdrawing +overdrawn +overdraws +overdream +overdredge +overdredged +overdredging +overdrench +overdress +overdressed +overdresses +overdressing +overdrew +overdry +overdried +overdrifted +overdrily +overdriness +overdrink +overdrinking +overdrinks +overdrip +overdrive +overdriven +overdrives +overdriving +overdroop +overdrove +overdrowsed +overdrunk +overdubbed +overdue +overdunged +overdure +overdust +overeager +overeagerly +overeagerness +overearly +overearnest +overearnestly +overearnestness +overeasy +overeasily +overeasiness +overeat +overeate +overeaten +overeater +overeating +overeats +overed +overedge +overedit +overeditorialize +overeditorialized +overeditorializing +overeducate +overeducated +overeducates +overeducating +overeducation +overeducative +overeducatively +overeffort +overeffusive +overeffusively +overeffusiveness +overegg +overeye +overeyebrowed +overeyed +overeying +overelaborate +overelaborated +overelaborately +overelaborateness +overelaborates +overelaborating +overelaboration +overelate +overelated +overelating +overelegance +overelegancy +overelegant +overelegantly +overelegantness +overelliptical +overelliptically +overembellish +overembellished +overembellishes +overembellishing +overembellishment +overembroider +overemotional +overemotionality +overemotionalize +overemotionalized +overemotionalizing +overemotionally +overemotionalness +overemphasis +overemphasize +overemphasized +overemphasizes +overemphasizing +overemphatic +overemphatical +overemphatically +overemphaticalness +overemphaticness +overempired +overempirical +overempirically +overemploy +overemployment +overempty +overemptiness +overemulate +overemulated +overemulating +overemulation +overenter +overenthusiasm +overenthusiastic +overenthusiastically +overentreat +overentry +overenvious +overenviously +overenviousness +overequal +overequip +overest +overesteem +overestimate +overestimated +overestimates +overestimating +overestimation +overestimations +overexacting +overexaggerate +overexaggerated +overexaggerating +overexcelling +overexcitability +overexcitable +overexcitably +overexcite +overexcited +overexcitement +overexcites +overexciting +overexercise +overexercised +overexercises +overexercising +overexert +overexerted +overexertedly +overexertedness +overexerting +overexertion +overexerts +overexpand +overexpanded +overexpanding +overexpands +overexpansion +overexpansive +overexpansively +overexpansiveness +overexpect +overexpectant +overexpectantly +overexpectantness +overexpend +overexpenditure +overexpert +overexplain +overexplanation +overexplicit +overexploited +overexpose +overexposed +overexposes +overexposing +overexposure +overexpress +overexpressive +overexpressively +overexpressiveness +overexquisite +overexquisitely +overextend +overextended +overextending +overextends +overextension +overextensive +overextreme +overexuberance +overexuberant +overexuberantly +overexuberantness +overface +overfacile +overfacilely +overfacility +overfactious +overfactiously +overfactiousness +overfactitious +overfag +overfagged +overfagging +overfaint +overfaintly +overfaintness +overfaith +overfaithful +overfaithfully +overfaithfulness +overfall +overfallen +overfalling +overfamed +overfamiliar +overfamiliarity +overfamiliarly +overfamous +overfancy +overfanciful +overfancifully +overfancifulness +overfar +overfast +overfastidious +overfastidiously +overfastidiousness +overfasting +overfat +overfatigue +overfatigued +overfatigues +overfatiguing +overfatness +overfatten +overfault +overfavor +overfavorable +overfavorableness +overfavorably +overfear +overfeared +overfearful +overfearfully +overfearfulness +overfearing +overfears +overfeast +overfeatured +overfed +overfee +overfeed +overfeeding +overfeeds +overfeel +overfell +overfellowly +overfellowlike +overfelon +overfeminine +overfemininely +overfemininity +overfeminize +overfeminized +overfeminizing +overfertile +overfertility +overfervent +overfervently +overferventness +overfestoon +overfew +overfierce +overfiercely +overfierceness +overfile +overfill +overfilled +overfilling +overfills +overfilm +overfilter +overfine +overfinished +overfish +overfished +overfishes +overfishing +overfit +overfix +overflap +overflat +overflatly +overflatness +overflatten +overflavor +overfleece +overfleshed +overflew +overflexion +overfly +overflies +overflight +overflights +overflying +overfling +overfloat +overflog +overflogged +overflogging +overflood +overflorid +overfloridly +overfloridness +overflour +overflourish +overflow +overflowable +overflowed +overflower +overflowing +overflowingly +overflowingness +overflown +overflows +overfluency +overfluent +overfluently +overfluentness +overflush +overflutter +overfold +overfond +overfondle +overfondled +overfondly +overfondling +overfondness +overfoolish +overfoolishly +overfoolishness +overfoot +overforce +overforced +overforcing +overforged +overformalize +overformalized +overformalizing +overformed +overforward +overforwardly +overforwardness +overfought +overfoul +overfoully +overfoulness +overfragile +overfragmented +overfrail +overfrailly +overfrailness +overfrailty +overfranchised +overfrank +overfrankly +overfrankness +overfraught +overfree +overfreedom +overfreely +overfreight +overfreighted +overfrequency +overfrequent +overfrequently +overfret +overfrieze +overfrighted +overfrighten +overfroth +overfrown +overfrozen +overfrugal +overfrugality +overfrugally +overfruited +overfruitful +overfruitfully +overfruitfulness +overfrustration +overfull +overfullness +overfunctioning +overfurnish +overfurnished +overfurnishes +overfurnishing +overgaiter +overgalled +overgamble +overgambled +overgambling +overgang +overgarment +overgarnish +overgarrison +overgaze +overgeneral +overgeneralization +overgeneralize +overgeneralized +overgeneralizes +overgeneralizing +overgenerally +overgenerosity +overgenerous +overgenerously +overgenerousness +overgenial +overgeniality +overgenially +overgenialness +overgentle +overgently +overgesticulate +overgesticulated +overgesticulating +overgesticulation +overgesticulative +overgesticulatively +overgesticulativeness +overget +overgetting +overgifted +overgild +overgilded +overgilding +overgilds +overgilt +overgilted +overgird +overgirded +overgirding +overgirdle +overgirds +overgirt +overgive +overglad +overgladly +overglance +overglanced +overglancing +overglass +overglaze +overglazed +overglazes +overglazing +overglide +overglint +overgloom +overgloomy +overgloomily +overgloominess +overglorious +overgloss +overglut +overgo +overgoad +overgoaded +overgoading +overgoads +overgod +overgodly +overgodliness +overgoing +overgone +overgood +overgorge +overgorged +overgot +overgotten +overgovern +overgovernment +overgown +overgrace +overgracious +overgraciously +overgraciousness +overgrade +overgraded +overgrading +overgraduated +overgrain +overgrainer +overgrasping +overgrateful +overgratefully +overgratefulness +overgratify +overgratification +overgratified +overgratifying +overgratitude +overgraze +overgrazed +overgrazes +overgrazing +overgreasy +overgreasiness +overgreat +overgreatly +overgreatness +overgreed +overgreedy +overgreedily +overgreediness +overgrew +overgrieve +overgrieved +overgrieving +overgrievous +overgrievously +overgrievousness +overgrind +overgross +overgrossly +overgrossness +overground +overgrow +overgrowing +overgrown +overgrows +overgrowth +overguilty +overgun +overhail +overhair +overhale +overhalf +overhand +overhanded +overhandicap +overhandicapped +overhandicapping +overhanding +overhandle +overhandled +overhandling +overhands +overhang +overhanging +overhangs +overhappy +overhappily +overhappiness +overharass +overharassment +overhard +overharden +overhardy +overhardness +overharsh +overharshly +overharshness +overhaste +overhasten +overhasty +overhastily +overhastiness +overhate +overhated +overhates +overhating +overhatted +overhaughty +overhaughtily +overhaughtiness +overhaul +overhauled +overhauler +overhauling +overhauls +overhead +overheady +overheadiness +overheadman +overheads +overheap +overheaped +overheaping +overheaps +overhear +overheard +overhearer +overhearing +overhears +overhearty +overheartily +overheartiness +overheat +overheated +overheatedly +overheating +overheats +overheave +overheavy +overheavily +overheaviness +overheight +overheighten +overheinous +overheld +overhelp +overhelpful +overhelpfully +overhelpfulness +overhie +overhigh +overhighly +overhill +overhip +overhysterical +overhit +overhold +overholding +overholds +overholy +overholiness +overhollow +overhomely +overhomeliness +overhonest +overhonesty +overhonestly +overhonestness +overhonor +overhope +overhoped +overhopes +overhoping +overhorse +overhostile +overhostilely +overhostility +overhot +overhotly +overhour +overhouse +overhover +overhuge +overhugely +overhugeness +overhuman +overhumane +overhumanity +overhumanize +overhumanized +overhumanizing +overhumble +overhumbleness +overhumbly +overhung +overhunt +overhunted +overhunting +overhunts +overhurl +overhurry +overhurried +overhurriedly +overhurrying +overhusk +overidden +overidealism +overidealistic +overidealize +overidealized +overidealizing +overidentify +overidentified +overidentifying +overidle +overidleness +overidly +overidness +overidolatrous +overidolatrously +overidolatrousness +overyear +overillustrate +overillustrated +overillustrating +overillustration +overillustrative +overillustratively +overimaginative +overimaginatively +overimaginativeness +overimitate +overimitated +overimitating +overimitation +overimitative +overimitatively +overimitativeness +overimmunize +overimmunized +overimmunizing +overimport +overimportance +overimportation +overimpose +overimposed +overimposing +overimpress +overimpressed +overimpresses +overimpressibility +overimpressible +overimpressibly +overimpressing +overimpressionability +overimpressionable +overimpressionableness +overimpressionably +overinclinable +overinclination +overincline +overinclined +overinclines +overinclining +overinclusive +overincrust +overincurious +overindividualism +overindividualistic +overindividualistically +overindividualization +overindulge +overindulged +overindulgence +overindulgent +overindulgently +overindulges +overindulging +overindustrialism +overindustrialization +overindustrialize +overindustrialized +overindustrializes +overindustrializing +overinflate +overinflated +overinflates +overinflating +overinflation +overinflationary +overinflative +overinfluence +overinfluenced +overinfluencing +overinfluential +overinform +overing +overinhibit +overinhibited +overink +overinsist +overinsistence +overinsistency +overinsistencies +overinsistent +overinsistently +overinsolence +overinsolent +overinsolently +overinstruct +overinstruction +overinstructive +overinstructively +overinstructiveness +overinsurance +overinsure +overinsured +overinsures +overinsuring +overintellectual +overintellectualism +overintellectuality +overintellectualization +overintellectualize +overintellectualized +overintellectualizing +overintellectually +overintellectualness +overintense +overintensely +overintenseness +overintensify +overintensification +overintensified +overintensifying +overintensity +overinterest +overinterested +overinterestedly +overinterestedness +overinterference +overinventoried +overinvest +overinvested +overinvesting +overinvestment +overinvests +overinvolve +overinvolved +overinvolving +overiodize +overiodized +overiodizing +overyoung +overyouthful +overirrigate +overirrigated +overirrigating +overirrigation +overissue +overissued +overissues +overissuing +overitching +overjacket +overjade +overjaded +overjading +overjawed +overjealous +overjealously +overjealousness +overjob +overjocular +overjocularity +overjocularly +overjoy +overjoyed +overjoyful +overjoyfully +overjoyfulness +overjoying +overjoyous +overjoyously +overjoyousness +overjoys +overjudge +overjudging +overjudgment +overjudicious +overjudiciously +overjudiciousness +overjump +overjust +overjutting +overkeen +overkeenly +overkeenness +overkeep +overkick +overkill +overkilled +overkilling +overkills +overkind +overkindly +overkindness +overking +overknavery +overknee +overknow +overknowing +overlabor +overlabored +overlaboring +overlabour +overlaboured +overlabouring +overlace +overlactate +overlactated +overlactating +overlactation +overlade +overladed +overladen +overlades +overlading +overlay +overlaid +overlayed +overlayer +overlaying +overlain +overlays +overland +overlander +overlands +overlaness +overlanguaged +overlap +overlapped +overlapping +overlaps +overlard +overlarge +overlargely +overlargeness +overlascivious +overlasciviously +overlasciviousness +overlash +overlast +overlate +overlateness +overlather +overlaud +overlaudation +overlaudatory +overlaugh +overlaunch +overlave +overlavish +overlavishly +overlavishness +overlax +overlaxative +overlaxly +overlaxness +overlead +overleaf +overlean +overleap +overleaped +overleaping +overleaps +overleapt +overlearn +overlearned +overlearnedly +overlearnedness +overleather +overleave +overleaven +overleer +overleg +overlegislate +overlegislated +overlegislating +overlegislation +overleisured +overlength +overlet +overlets +overlettered +overletting +overlewd +overlewdly +overlewdness +overly +overliberal +overliberality +overliberalization +overliberalize +overliberalized +overliberalizing +overliberally +overlicentious +overlicentiously +overlicentiousness +overlick +overlie +overlier +overlies +overlift +overlight +overlighted +overlightheaded +overlightly +overlightness +overlightsome +overliing +overlying +overliking +overlimit +overline +overling +overlinger +overlinked +overlip +overlipping +overlisted +overlisten +overliterary +overliterarily +overliterariness +overlittle +overlive +overlived +overlively +overliveliness +overliver +overlives +overliving +overload +overloaded +overloading +overloads +overloan +overloath +overlock +overlocker +overlofty +overloftily +overloftiness +overlogical +overlogicality +overlogically +overlogicalness +overloyal +overloyally +overloyalty +overloyalties +overlong +overlook +overlooked +overlooker +overlooking +overlooks +overloose +overloosely +overlooseness +overlord +overlorded +overlording +overlords +overlordship +overloud +overloudly +overloudness +overloup +overlove +overloved +overlover +overloves +overloving +overlow +overlowness +overlubricate +overlubricated +overlubricating +overlubricatio +overlubrication +overluscious +overlusciously +overlusciousness +overlush +overlushly +overlushness +overlusty +overlustiness +overluxuriance +overluxuriancy +overluxuriant +overluxuriantly +overluxurious +overluxuriously +overluxuriousness +overmagnetic +overmagnetically +overmagnify +overmagnification +overmagnified +overmagnifies +overmagnifying +overmagnitude +overmajority +overmalapert +overman +overmanage +overmanaged +overmanaging +overmany +overmanned +overmanning +overmans +overmantel +overmantle +overmarch +overmark +overmarking +overmarl +overmask +overmast +overmaster +overmastered +overmasterful +overmasterfully +overmasterfulness +overmastering +overmasteringly +overmasters +overmatch +overmatched +overmatches +overmatching +overmatter +overmature +overmaturely +overmatureness +overmaturity +overmean +overmeanly +overmeanness +overmeasure +overmeddle +overmeddled +overmeddling +overmeek +overmeekly +overmeekness +overmellow +overmellowly +overmellowness +overmelodied +overmelodious +overmelodiously +overmelodiousness +overmelt +overmelted +overmelting +overmelts +overmen +overmerciful +overmercifully +overmercifulness +overmerit +overmerry +overmerrily +overmerriment +overmerriness +overmeticulous +overmeticulousness +overmettled +overmickle +overmighty +overmild +overmilitaristic +overmilitaristically +overmill +overmind +overminute +overminutely +overminuteness +overmystify +overmystification +overmystified +overmystifying +overmitigate +overmitigated +overmitigating +overmix +overmixed +overmixes +overmixing +overmobilize +overmobilized +overmobilizing +overmoccasin +overmodernization +overmodernize +overmodernized +overmodernizing +overmodest +overmodesty +overmodestly +overmodify +overmodification +overmodified +overmodifies +overmodifying +overmodulation +overmoist +overmoisten +overmoisture +overmonopolize +overmonopolized +overmonopolizing +overmoral +overmoralistic +overmoralize +overmoralized +overmoralizing +overmoralizingly +overmorally +overmore +overmortgage +overmortgaged +overmortgaging +overmoss +overmost +overmotor +overmount +overmounts +overmourn +overmournful +overmournfully +overmournfulness +overmuch +overmuches +overmuchness +overmultiply +overmultiplication +overmultiplied +overmultiplying +overmultitude +overmuse +overname +overnarrow +overnarrowly +overnarrowness +overnationalization +overnationalize +overnationalized +overnationalizing +overnear +overnearness +overneat +overneatly +overneatness +overneglect +overneglectful +overneglectfully +overneglectfulness +overnegligence +overnegligent +overnegligently +overnegligentness +overnervous +overnervously +overnervousness +overness +overnet +overneutralization +overneutralize +overneutralized +overneutralizer +overneutralizing +overnew +overnice +overnicely +overniceness +overnicety +overniceties +overnigh +overnight +overnighter +overnighters +overnimble +overnipping +overnoble +overnobleness +overnobly +overnoise +overnormal +overnormality +overnormalization +overnormalize +overnormalized +overnormalizing +overnormally +overnotable +overnourish +overnourishingly +overnourishment +overnoveled +overnumber +overnumerous +overnumerously +overnumerousness +overnurse +overnursed +overnursing +overobedience +overobedient +overobediently +overobese +overobesely +overobeseness +overobesity +overobject +overobjectify +overobjectification +overobjectified +overobjectifying +overoblige +overobsequious +overobsequiously +overobsequiousness +overoffend +overoffensive +overoffensively +overoffensiveness +overofficered +overofficious +overofficiously +overofficiousness +overoptimism +overoptimist +overoptimistic +overoptimistically +overorder +overorganization +overorganize +overorganized +overorganizing +overornament +overornamental +overornamentality +overornamentally +overornamentation +overornamented +overoxidization +overoxidize +overoxidized +overoxidizing +overpack +overpay +overpaid +overpaying +overpayment +overpained +overpainful +overpainfully +overpainfulness +overpaint +overpays +overpamper +overpark +overpart +overparted +overparty +overpartial +overpartiality +overpartially +overpartialness +overparticular +overparticularity +overparticularly +overparticularness +overpass +overpassed +overpasses +overpassing +overpassionate +overpassionately +overpassionateness +overpast +overpatient +overpatriotic +overpatriotically +overpatriotism +overpeer +overpenalization +overpenalize +overpenalized +overpenalizing +overpending +overpensive +overpensively +overpensiveness +overpeople +overpeopled +overpeopling +overpepper +overperemptory +overperemptorily +overperemptoriness +overpermissive +overpermissiveness +overpersecute +overpersecuted +overpersecuting +overpersuade +overpersuaded +overpersuading +overpersuasion +overpert +overpessimism +overpessimistic +overpessimistically +overpet +overphilosophize +overphilosophized +overphilosophizing +overphysic +overpick +overpictorialize +overpictorialized +overpictorializing +overpicture +overpinching +overpious +overpiousness +overpitch +overpitched +overpiteous +overpiteously +overpiteousness +overplace +overplaced +overplacement +overplay +overplayed +overplaying +overplain +overplainly +overplainness +overplays +overplant +overplausible +overplausibleness +overplausibly +overplease +overpleased +overpleasing +overplenitude +overplenteous +overplenteously +overplenteousness +overplenty +overplentiful +overplentifully +overplentifulness +overply +overplied +overplies +overplying +overplot +overplow +overplumb +overplume +overplump +overplumpness +overplus +overpluses +overpoeticize +overpoeticized +overpoeticizing +overpointed +overpoise +overpole +overpolemical +overpolemically +overpolemicalness +overpolice +overpoliced +overpolicing +overpolish +overpolitic +overpolitical +overpolitically +overpollinate +overpollinated +overpollinating +overponderous +overponderously +overponderousness +overpopular +overpopularity +overpopularly +overpopulate +overpopulated +overpopulates +overpopulating +overpopulation +overpopulous +overpopulously +overpopulousness +overpositive +overpositively +overpositiveness +overpossess +overpost +overpot +overpotency +overpotent +overpotential +overpotently +overpotentness +overpour +overpower +overpowered +overpowerful +overpowerfully +overpowerfulness +overpowering +overpoweringly +overpoweringness +overpowers +overpractice +overpracticed +overpracticing +overpray +overpraise +overpraised +overpraises +overpraising +overpratice +overpraticed +overpraticing +overpreach +overprecise +overprecisely +overpreciseness +overprecision +overpreface +overpregnant +overpreoccupation +overpreoccupy +overpreoccupied +overpreoccupying +overpress +overpressure +overpresumption +overpresumptive +overpresumptively +overpresumptiveness +overpresumptuous +overpresumptuously +overpresumptuousness +overprice +overpriced +overprices +overpricing +overprick +overpride +overprint +overprinted +overprinting +overprints +overprize +overprized +overprizer +overprizing +overprocrastination +overproduce +overproduced +overproduces +overproducing +overproduction +overproductive +overproficiency +overproficient +overproficiently +overprofusion +overprolific +overprolifically +overprolificness +overprolix +overprolixity +overprolixly +overprolixness +overprominence +overprominent +overprominently +overprominentness +overpromise +overpromised +overpromising +overprompt +overpromptly +overpromptness +overprone +overproneness +overproness +overpronounce +overpronounced +overpronouncing +overpronunciation +overproof +overproportion +overproportionate +overproportionated +overproportionately +overproportioned +overprosperity +overprosperous +overprosperously +overprosperousness +overprotect +overprotected +overprotecting +overprotection +overprotective +overprotects +overprotract +overprotraction +overproud +overproudly +overproudness +overprove +overproved +overprovender +overprovide +overprovided +overprovident +overprovidently +overprovidentness +overproviding +overproving +overprovision +overprovocation +overprovoke +overprovoked +overprovoking +overprune +overpruned +overpruning +overpsychologize +overpsychologized +overpsychologizing +overpublic +overpublicity +overpublicize +overpublicized +overpublicizing +overpuff +overpuissant +overpuissantly +overpunish +overpunishment +overpurchase +overpurchased +overpurchasing +overput +overqualify +overqualification +overqualified +overqualifying +overquantity +overquarter +overquell +overquick +overquickly +overquiet +overquietly +overquietness +overrace +overrack +overrake +overraked +overraking +overran +overraness +overrange +overrank +overrankness +overrapture +overrapturize +overrash +overrashly +overrashness +overrate +overrated +overrates +overrating +overrational +overrationalization +overrationalize +overrationalized +overrationalizing +overrationally +overraught +overravish +overreach +overreached +overreacher +overreachers +overreaches +overreaching +overreachingly +overreachingness +overreact +overreacted +overreacting +overreaction +overreactions +overreactive +overreacts +overread +overreader +overready +overreadily +overreadiness +overreading +overrealism +overrealistic +overrealistically +overreckon +overreckoning +overrecord +overreduce +overreduced +overreducing +overreduction +overrefine +overrefined +overrefinement +overrefines +overrefining +overreflection +overreflective +overreflectively +overreflectiveness +overregiment +overregimentation +overregister +overregistration +overregular +overregularity +overregularly +overregulate +overregulated +overregulating +overregulation +overrelax +overreliance +overreliant +overreligion +overreligiosity +overreligious +overreligiously +overreligiousness +overremiss +overremissly +overremissness +overrennet +overrent +overreplete +overrepletion +overrepresent +overrepresentation +overrepresentative +overrepresentatively +overrepresentativeness +overrepresented +overrepress +overreprimand +overreserved +overreservedly +overreservedness +overresist +overresolute +overresolutely +overresoluteness +overrestore +overrestrain +overrestraint +overrestrict +overrestriction +overretention +overreward +overrich +overriches +overrichly +overrichness +overrid +overridden +override +overrider +overrides +overriding +overrife +overrigged +overright +overrighteous +overrighteously +overrighteousness +overrigid +overrigidity +overrigidly +overrigidness +overrigorous +overrigorously +overrigorousness +overrim +overriot +overripe +overripely +overripen +overripeness +overrise +overrisen +overrising +overroast +overroasted +overroasting +overroasts +overrode +overroyal +overroll +overromanticize +overromanticized +overromanticizing +overroof +overrooted +overrose +overrough +overroughly +overroughness +overrude +overrudely +overrudeness +overruff +overruffed +overruffing +overruffs +overrule +overruled +overruler +overrules +overruling +overrulingly +overrun +overrunner +overrunning +overrunningly +overruns +overrush +overrusset +overrust +overs +oversacrificial +oversacrificially +oversacrificialness +oversad +oversadly +oversadness +oversay +oversaid +oversail +oversale +oversales +oversaliva +oversalt +oversalted +oversalty +oversalting +oversalts +oversand +oversanded +oversanguine +oversanguinely +oversanguineness +oversapless +oversate +oversated +oversatiety +oversating +oversatisfy +oversaturate +oversaturated +oversaturating +oversaturation +oversauce +oversaucy +oversauciness +oversave +oversaved +oversaves +oversaving +oversaw +overscare +overscatter +overscented +oversceptical +oversceptically +overscepticalness +overscepticism +overscore +overscored +overscoring +overscour +overscratch +overscrawl +overscream +overscribble +overscrub +overscrubbed +overscrubbing +overscruple +overscrupled +overscrupling +overscrupulosity +overscrupulous +overscrupulously +overscrupulousness +overscurf +overscutched +oversea +overseal +overseam +overseamer +oversearch +overseas +overseason +overseasoned +overseated +oversecrete +oversecreted +oversecreting +oversecretion +oversecure +oversecured +oversecurely +oversecuring +oversecurity +oversedation +oversee +overseed +overseeded +overseeding +overseeds +overseeing +overseen +overseer +overseerism +overseers +overseership +oversees +overseethe +overseing +oversell +overselling +oversells +oversend +oversensibility +oversensible +oversensibleness +oversensibly +oversensitive +oversensitively +oversensitiveness +oversensitivity +oversensitize +oversensitized +oversensitizing +oversententious +oversentimental +oversentimentalism +oversentimentality +oversentimentalize +oversentimentalized +oversentimentalizing +oversentimentally +overserene +overserenely +overserenity +overserious +overseriously +overseriousness +overservice +overservile +overservilely +overservileness +overservility +overset +oversets +oversetter +oversetting +oversettle +oversettled +oversettlement +oversettling +oversevere +overseverely +oversevereness +overseverity +oversew +oversewed +oversewing +oversewn +oversews +oversexed +overshade +overshaded +overshading +overshadow +overshadowed +overshadower +overshadowing +overshadowingly +overshadowment +overshadows +overshake +oversharp +oversharpness +overshave +oversheet +overshelving +overshepherd +overshine +overshined +overshining +overshirt +overshoe +overshoes +overshone +overshoot +overshooting +overshoots +overshort +overshorten +overshortly +overshortness +overshot +overshots +overshoulder +overshowered +overshrink +overshroud +oversick +overside +oversides +oversight +oversights +oversigned +oversile +oversilence +oversilent +oversilently +oversilentness +oversilver +oversimple +oversimpleness +oversimply +oversimplicity +oversimplify +oversimplification +oversimplifications +oversimplified +oversimplifies +oversimplifying +oversystematic +oversystematically +oversystematicalness +oversystematize +oversystematized +oversystematizing +oversize +oversized +oversizes +oversizing +overskeptical +overskeptically +overskepticalness +overskeptticism +overskim +overskip +overskipper +overskirt +overslack +overslander +overslaugh +overslaughed +overslaughing +overslavish +overslavishly +overslavishness +oversleep +oversleeping +oversleeps +oversleeve +overslept +overslid +overslidden +overslide +oversliding +overslight +overslip +overslipped +overslipping +overslips +overslipt +overslop +overslope +overslow +overslowly +overslowness +overslur +oversmall +oversman +oversmite +oversmitten +oversmoke +oversmooth +oversmoothly +oversmoothness +oversness +oversnow +oversoak +oversoaked +oversoaking +oversoaks +oversoap +oversoar +oversocial +oversocialize +oversocialized +oversocializing +oversocially +oversock +oversoft +oversoften +oversoftly +oversoftness +oversold +oversolemn +oversolemnity +oversolemnly +oversolemnness +oversolicitous +oversolicitously +oversolicitousness +oversolidify +oversolidification +oversolidified +oversolidifying +oversoon +oversoothing +oversoothingly +oversophisticated +oversophistication +oversorrow +oversorrowed +oversorrowful +oversorrowfully +oversorrowfulness +oversot +oversoul +oversouls +oversound +oversour +oversourly +oversourness +oversow +oversowed +oversowing +oversown +overspacious +overspaciously +overspaciousness +overspan +overspangled +overspanned +overspanning +oversparing +oversparingly +oversparingness +oversparred +overspatter +overspeak +overspeaking +overspecialization +overspecialize +overspecialized +overspecializes +overspecializing +overspeculate +overspeculated +overspeculating +overspeculation +overspeculative +overspeculatively +overspeculativeness +overspeech +overspeed +overspeedy +overspeedily +overspeediness +overspend +overspender +overspending +overspends +overspent +overspice +overspiced +overspicing +overspill +overspilled +overspilling +overspilt +overspin +overspins +oversplash +overspoke +overspoken +overspread +overspreading +overspreads +overspring +oversprinkle +oversprung +overspun +oversqueak +oversqueamish +oversqueamishly +oversqueamishness +oversshot +overstaff +overstay +overstayal +overstaid +overstayed +overstaying +overstain +overstays +overstale +overstalely +overstaleness +overstalled +overstand +overstanding +overstarch +overstaring +overstate +overstated +overstately +overstatement +overstatements +overstates +overstating +oversteadfast +oversteadfastly +oversteadfastness +oversteady +oversteadily +oversteadiness +oversteer +overstep +overstepped +overstepping +oversteps +overstiff +overstiffen +overstiffly +overstiffness +overstifle +overstimulate +overstimulated +overstimulates +overstimulating +overstimulation +overstimulative +overstimulatively +overstimulativeness +overstir +overstirred +overstirring +overstirs +overstitch +overstock +overstocked +overstocking +overstocks +overstood +overstoop +overstoping +overstore +overstored +overstory +overstoring +overstout +overstoutly +overstoutness +overstowage +overstowed +overstraight +overstraighten +overstraightly +overstraightness +overstrain +overstrained +overstraining +overstrait +overstraiten +overstraitly +overstraitness +overstream +overstrength +overstrengthen +overstress +overstressed +overstretch +overstretched +overstretches +overstretching +overstrew +overstrewed +overstrewing +overstrewn +overstricken +overstrict +overstrictly +overstrictness +overstridden +overstride +overstridence +overstridency +overstrident +overstridently +overstridentness +overstriding +overstrike +overstrikes +overstriking +overstring +overstringing +overstrive +overstriven +overstriving +overstrode +overstrong +overstrongly +overstrongness +overstrove +overstruck +overstrung +overstud +overstudy +overstudied +overstudying +overstudious +overstudiously +overstudiousness +overstuff +overstuffed +oversublime +oversubscribe +oversubscribed +oversubscriber +oversubscribes +oversubscribing +oversubscription +oversubtile +oversubtle +oversubtlety +oversubtleties +oversubtly +oversufficiency +oversufficient +oversufficiently +oversum +oversup +oversuperstitious +oversuperstitiously +oversuperstitiousness +oversupped +oversupping +oversupply +oversupplied +oversupplies +oversupplying +oversups +oversure +oversured +oversurely +oversureness +oversurety +oversurge +oversuring +oversurviving +oversusceptibility +oversusceptible +oversusceptibleness +oversusceptibly +oversuspicious +oversuspiciously +oversuspiciousness +oversway +overswarm +overswarming +overswarth +oversweated +oversweep +oversweet +oversweeten +oversweetly +oversweetness +overswell +overswelled +overswelling +overswift +overswim +overswimmer +overswing +overswinging +overswirling +overswollen +overt +overtakable +overtake +overtaken +overtaker +overtakers +overtakes +overtaking +overtalk +overtalkative +overtalkatively +overtalkativeness +overtalker +overtame +overtamely +overtameness +overtapped +overtare +overtariff +overtarry +overtart +overtartly +overtartness +overtask +overtasked +overtasking +overtasks +overtaught +overtax +overtaxation +overtaxed +overtaxes +overtaxing +overteach +overteaching +overtechnical +overtechnicality +overtechnically +overtedious +overtediously +overtediousness +overteem +overtell +overtelling +overtempt +overtenacious +overtenaciously +overtenaciousness +overtenacity +overtender +overtenderly +overtenderness +overtense +overtensely +overtenseness +overtension +overterrible +overtest +overtheatrical +overtheatrically +overtheatricalness +overtheorization +overtheorize +overtheorized +overtheorizing +overthick +overthickly +overthickness +overthin +overthink +overthinly +overthinness +overthought +overthoughtful +overthoughtfully +overthoughtfulness +overthrew +overthrifty +overthriftily +overthriftiness +overthrong +overthrow +overthrowable +overthrowal +overthrower +overthrowers +overthrowing +overthrown +overthrows +overthrust +overthwart +overthwartarchaic +overthwartly +overthwartness +overthwartways +overthwartwise +overtide +overtight +overtightly +overtightness +overtill +overtilt +overtimbered +overtime +overtimed +overtimer +overtimes +overtimid +overtimidity +overtimidly +overtimidness +overtiming +overtimorous +overtimorously +overtimorousness +overtinsel +overtinseled +overtinseling +overtint +overtip +overtype +overtyped +overtipple +overtippled +overtippling +overtire +overtired +overtiredness +overtires +overtiring +overtitle +overtly +overtness +overtoe +overtoil +overtoiled +overtoiling +overtoils +overtoise +overtold +overtolerance +overtolerant +overtolerantly +overtone +overtones +overtongued +overtook +overtop +overtopped +overtopping +overtopple +overtops +overtorture +overtortured +overtorturing +overtower +overtrace +overtrack +overtrade +overtraded +overtrader +overtrading +overtrailed +overtrain +overtrained +overtraining +overtrains +overtrample +overtravel +overtread +overtreading +overtreatment +overtrick +overtrim +overtrimme +overtrimmed +overtrimming +overtrims +overtrod +overtrodden +overtrouble +overtroubled +overtroubling +overtrue +overtruly +overtrump +overtrust +overtrustful +overtrustfully +overtrustfulness +overtrusting +overtruthful +overtruthfully +overtruthfulness +overtumble +overture +overtured +overtures +overturing +overturn +overturnable +overturned +overturner +overturning +overturns +overtutor +overtwine +overtwist +overuberous +overunionize +overunionized +overunionizing +overunsuitable +overurbanization +overurbanize +overurbanized +overurbanizing +overurge +overurged +overurges +overurging +overuse +overused +overuses +overusing +overusual +overusually +overvaliant +overvaliantly +overvaliantness +overvaluable +overvaluableness +overvaluably +overvaluation +overvalue +overvalued +overvalues +overvaluing +overvary +overvariation +overvaried +overvariety +overvarying +overvault +overvehemence +overvehement +overvehemently +overvehementness +overveil +overventilate +overventilated +overventilating +overventilation +overventuresome +overventurous +overventurously +overventurousness +overview +overviews +overvigorous +overvigorously +overvigorousness +overviolent +overviolently +overviolentness +overvoltage +overvote +overvoted +overvotes +overvoting +overwade +overwages +overway +overwake +overwalk +overwander +overward +overwary +overwarily +overwariness +overwarm +overwarmed +overwarming +overwarms +overwart +overwash +overwasted +overwatch +overwatcher +overwater +overwave +overweak +overweakly +overweakness +overwealth +overwealthy +overweaponed +overwear +overweary +overwearied +overwearying +overwearing +overwears +overweather +overweave +overweb +overween +overweened +overweener +overweening +overweeningly +overweeningness +overweens +overweep +overweigh +overweighed +overweighing +overweighs +overweight +overweightage +overweighted +overweighting +overwell +overwelt +overwend +overwent +overwet +overwetness +overwets +overwetted +overwetting +overwheel +overwhelm +overwhelmed +overwhelmer +overwhelming +overwhelmingly +overwhelmingness +overwhelms +overwhip +overwhipped +overwhipping +overwhirl +overwhisper +overwide +overwidely +overwideness +overwild +overwildly +overwildness +overwily +overwilily +overwilling +overwillingly +overwillingness +overwin +overwind +overwinding +overwinds +overwing +overwinning +overwinter +overwintered +overwintering +overwiped +overwisdom +overwise +overwisely +overwithered +overwoman +overwomanize +overwomanly +overwon +overwood +overwooded +overwoody +overword +overwords +overwore +overwork +overworked +overworking +overworks +overworld +overworn +overworry +overworship +overwound +overwove +overwoven +overwrap +overwrest +overwrested +overwrestle +overwrite +overwrites +overwriting +overwritten +overwrote +overwroth +overwrought +overwwrought +overzeal +overzealous +overzealously +overzealousness +overzeals +ovest +ovewound +ovibos +ovibovinae +ovibovine +ovicapsular +ovicapsule +ovicell +ovicellular +ovicidal +ovicide +ovicides +ovicyst +ovicystic +ovicular +oviculated +oviculum +ovid +ovidae +ovidian +oviducal +oviduct +oviductal +oviducts +oviferous +ovification +oviform +ovigenesis +ovigenetic +ovigenic +ovigenous +oviger +ovigerm +ovigerous +ovile +ovillus +ovinae +ovine +ovines +ovinia +ovipara +oviparal +oviparity +oviparous +oviparously +oviparousness +oviposit +oviposited +ovipositing +oviposition +ovipositional +ovipositor +oviposits +ovis +ovisac +ovisaclike +ovisacs +oviscapt +ovism +ovispermary +ovispermiduct +ovist +ovistic +ovivorous +ovocyte +ovoelliptic +ovoflavin +ovogenesis +ovogenetic +ovogenous +ovoglobulin +ovogonium +ovoid +ovoidal +ovoids +ovolemma +ovoli +ovolytic +ovolo +ovology +ovological +ovologist +ovolos +ovomucoid +ovonic +ovonics +ovopyriform +ovoplasm +ovoplasmic +ovorhomboid +ovorhomboidal +ovotesticular +ovotestis +ovovitellin +ovovivipara +ovoviviparism +ovoviviparity +ovoviviparous +ovoviviparously +ovoviviparousness +ovula +ovular +ovulary +ovularian +ovulate +ovulated +ovulates +ovulating +ovulation +ovulations +ovulatory +ovule +ovules +ovuliferous +ovuligerous +ovulist +ovulite +ovulum +ovum +ow +owd +owe +owed +owelty +owen +owenia +owenian +owenism +owenist +owenite +owenize +ower +owerance +owerby +owercome +owergang +owerloup +owertaen +owerword +owes +owght +owhere +owyheeite +owing +owk +owl +owldom +owler +owlery +owleries +owlet +owlets +owlglass +owlhead +owly +owling +owlish +owlishly +owlishness +owlism +owllight +owllike +owls +owlspiegle +own +ownable +owned +owner +ownerless +owners +ownership +ownerships +ownhood +owning +ownness +owns +ownself +ownwayish +owrecome +owregane +owrehip +owrelay +owse +owsen +owser +owt +owtchah +ox +oxacid +oxacillin +oxadiazole +oxalacetate +oxalacetic +oxalaemia +oxalaldehyde +oxalamid +oxalamide +oxalan +oxalate +oxalated +oxalates +oxalating +oxalato +oxaldehyde +oxalemia +oxalic +oxalidaceae +oxalidaceous +oxalyl +oxalylurea +oxalis +oxalises +oxalite +oxaloacetate +oxaloacetic +oxalodiacetic +oxalonitril +oxalonitrile +oxaluramid +oxaluramide +oxalurate +oxaluria +oxaluric +oxamate +oxamethane +oxamic +oxamid +oxamide +oxamidin +oxamidine +oxammite +oxan +oxanate +oxane +oxanic +oxanilate +oxanilic +oxanilide +oxazin +oxazine +oxazines +oxazole +oxbane +oxberry +oxberries +oxbird +oxbiter +oxblood +oxbloods +oxboy +oxbow +oxbows +oxbrake +oxcart +oxcarts +oxcheek +oxdiacetic +oxdiazole +oxea +oxeate +oxeye +oxeyes +oxen +oxeote +oxer +oxes +oxetone +oxfly +oxford +oxfordian +oxfordism +oxfordist +oxfords +oxgall +oxgang +oxgate +oxgoad +oxharrow +oxhead +oxheal +oxheart +oxhearts +oxherd +oxhide +oxhoft +oxhorn +oxhouse +oxhuvud +oxy +oxyacanthin +oxyacanthine +oxyacanthous +oxyacetylene +oxyacid +oxyacids +oxyaena +oxyaenidae +oxyaldehyde +oxyamine +oxyanthracene +oxyanthraquinone +oxyaphia +oxyaster +oxyazo +oxybapha +oxybaphon +oxybaphus +oxybenzaldehyde +oxybenzene +oxybenzyl +oxybenzoic +oxyberberine +oxyblepsia +oxybromide +oxybutyria +oxybutyric +oxycalcium +oxycalorimeter +oxycamphor +oxycaproic +oxycarbonate +oxycellulose +oxycephaly +oxycephalic +oxycephalism +oxycephalous +oxychlorate +oxychloric +oxychlorid +oxychloride +oxychlorine +oxycholesterol +oxychromatic +oxychromatin +oxychromatinic +oxycyanide +oxycinnamic +oxycobaltammine +oxycoccus +oxycopaivic +oxycoumarin +oxycrate +oxid +oxidability +oxidable +oxydactyl +oxidant +oxidants +oxidase +oxydase +oxidases +oxidasic +oxydasic +oxidate +oxidated +oxidates +oxidating +oxidation +oxydation +oxidational +oxidations +oxidative +oxidatively +oxidator +oxide +oxydendrum +oxides +oxydiact +oxidic +oxidimetry +oxidimetric +oxidise +oxidised +oxidiser +oxidisers +oxidises +oxidising +oxidizability +oxidizable +oxidization +oxidizations +oxidize +oxidized +oxidizement +oxidizer +oxidizers +oxidizes +oxidizing +oxidoreductase +oxidoreduction +oxids +oxidulated +oxyesthesia +oxyether +oxyethyl +oxyfatty +oxyfluoride +oxygas +oxygen +oxygenant +oxygenase +oxygenate +oxygenated +oxygenates +oxygenating +oxygenation +oxygenator +oxygenerator +oxygenic +oxygenicity +oxygenium +oxygenizable +oxygenization +oxygenize +oxygenized +oxygenizement +oxygenizer +oxygenizing +oxygenless +oxygenous +oxygens +oxygeusia +oxygnathous +oxygon +oxygonal +oxygonial +oxyhaematin +oxyhaemoglobin +oxyhalide +oxyhaloid +oxyhematin +oxyhemocyanin +oxyhemoglobin +oxyhexactine +oxyhexaster +oxyhydrate +oxyhydric +oxyhydrogen +oxyiodide +oxyketone +oxyl +oxylabracidae +oxylabrax +oxyluciferin +oxyluminescence +oxyluminescent +oxim +oxymandelic +oximate +oximation +oxime +oxymel +oximes +oximeter +oxymethylene +oximetry +oximetric +oxymomora +oxymora +oxymoron +oxymoronic +oxims +oxymuriate +oxymuriatic +oxynaphthoic +oxynaphtoquinone +oxynarcotine +oxindole +oxyneurin +oxyneurine +oxynitrate +oxyntic +oxyophitic +oxyopy +oxyopia +oxyopidae +oxyosphresia +oxypetalous +oxyphenyl +oxyphenol +oxyphil +oxyphile +oxyphiles +oxyphilic +oxyphyllous +oxyphilous +oxyphils +oxyphyte +oxyphony +oxyphonia +oxyphosphate +oxyphthalic +oxypycnos +oxypicric +oxypolis +oxyproline +oxypropionic +oxypurine +oxyquinaseptol +oxyquinoline +oxyquinone +oxyrhynch +oxyrhynchid +oxyrhynchous +oxyrhynchus +oxyrhine +oxyrhinous +oxyrrhyncha +oxyrrhynchid +oxysalicylic +oxysalt +oxysalts +oxysome +oxysomes +oxystearic +oxystomata +oxystomatous +oxystome +oxysulfid +oxysulfide +oxysulphate +oxysulphid +oxysulphide +oxyterpene +oxytetracycline +oxytylotate +oxytylote +oxytocia +oxytocic +oxytocics +oxytocin +oxytocins +oxytocous +oxytoluene +oxytoluic +oxytone +oxytones +oxytonesis +oxytonic +oxytonical +oxytonize +oxytricha +oxytropis +oxyuriasis +oxyuricide +oxyurid +oxyuridae +oxyurous +oxywelding +oxland +oxlike +oxlip +oxlips +oxman +oxmanship +oxoindoline +oxonian +oxonic +oxonium +oxonolatry +oxozone +oxozonide +oxozonides +oxpecker +oxpeckers +oxphony +oxreim +oxshoe +oxskin +oxtail +oxtails +oxter +oxters +oxtongue +oxtongues +oxwort +oz +ozaena +ozan +ozark +ozarkite +ozena +ozias +ozobrome +ozocerite +ozoena +ozokerit +ozokerite +ozonate +ozonation +ozonator +ozone +ozoned +ozoner +ozones +ozonic +ozonid +ozonide +ozonides +ozoniferous +ozonify +ozonification +ozonise +ozonised +ozonises +ozonising +ozonium +ozonization +ozonize +ozonized +ozonizer +ozonizers +ozonizes +ozonizing +ozonolysis +ozonometer +ozonometry +ozonoscope +ozonoscopic +ozonosphere +ozonospheric +ozonous +ozophen +ozophene +ozostomia +ozotype +ozs +p +pa +paal +paaneleinrg +paar +paaraphimosis +paas +paauw +paawkier +paba +pabalum +pabble +pablo +pablum +pabouch +pabular +pabulary +pabulation +pabulatory +pabulous +pabulum +pabulums +pac +paca +pacable +pacaguara +pacay +pacaya +pacane +pacas +pacate +pacately +pacation +pacative +paccanarist +paccha +pacchionian +paccioli +pace +paceboard +paced +pacemake +pacemaker +pacemakers +pacemaking +pacer +pacers +paces +pacesetter +pacesetters +pacesetting +paceway +pacha +pachadom +pachadoms +pachak +pachalic +pachalics +pachanga +pachas +pachyacria +pachyaemia +pachyblepharon +pachycarpous +pachycephal +pachycephaly +pachycephalia +pachycephalic +pachycephalous +pachychilia +pachychymia +pachycholia +pachycladous +pachydactyl +pachydactyly +pachydactylous +pachyderm +pachyderma +pachydermal +pachydermata +pachydermateous +pachydermatocele +pachydermatoid +pachydermatosis +pachydermatous +pachydermatously +pachydermia +pachydermial +pachydermic +pachydermoid +pachydermous +pachyderms +pachyemia +pachyglossal +pachyglossate +pachyglossia +pachyglossous +pachyhaemia +pachyhaemic +pachyhaemous +pachyhematous +pachyhemia +pachyhymenia +pachyhymenic +pachylophus +pachylosis +pachyma +pachymenia +pachymenic +pachymeningitic +pachymeningitis +pachymeninx +pachymeter +pachynathous +pachynema +pachinko +pachynsis +pachyntic +pachyodont +pachyotia +pachyotous +pachyperitonitis +pachyphyllous +pachypleuritic +pachypod +pachypodous +pachypterous +pachyrhynchous +pachyrhizus +pachysalpingitis +pachysandra +pachysandras +pachysaurian +pachisi +pachisis +pachysomia +pachysomous +pachystichous +pachystima +pachytene +pachytylus +pachytrichous +pachyvaginitis +pachnolite +pachometer +pachomian +pachons +pachouli +pachoulis +pacht +pachuco +pachucos +pacify +pacifiable +pacific +pacifica +pacifical +pacifically +pacificate +pacificated +pacificating +pacification +pacificator +pacificatory +pacificism +pacificist +pacificistic +pacificistically +pacificity +pacifico +pacificos +pacified +pacifier +pacifiers +pacifies +pacifying +pacifyingly +pacifism +pacifisms +pacifist +pacifistic +pacifistically +pacifists +pacing +pacinian +pacinko +pack +packability +packable +package +packaged +packager +packagers +packages +packaging +packagings +packall +packboard +packbuilder +packcloth +packed +packer +packery +packeries +packers +packet +packeted +packeting +packets +packhorse +packhorses +packhouse +packing +packinghouse +packings +packless +packly +packmaker +packmaking +packman +packmanship +packmen +packness +packnesses +packplane +packrat +packs +packsack +packsacks +packsaddle +packsaddles +packstaff +packstaves +packthread +packthreaded +packthreads +packtong +packtrain +packway +packwall +packwaller +packware +packwax +packwaxes +paco +pacolet +pacos +pacota +pacouryuva +pacquet +pacs +pact +pacta +paction +pactional +pactionally +pactions +pactolian +pactolus +pacts +pactum +pacu +pad +padang +padasha +padauk +padauks +padcloth +padcluoth +padda +padded +padder +paddy +paddybird +paddies +paddyism +paddymelon +padding +paddings +paddywack +paddywatch +paddywhack +paddle +paddleball +paddleboard +paddleboat +paddlecock +paddled +paddlefish +paddlefishes +paddlefoot +paddlelike +paddler +paddlers +paddles +paddlewood +paddling +paddlings +paddock +paddocked +paddocking +paddockride +paddocks +paddockstone +paddockstool +paddoing +padeye +padeyes +padelion +padella +pademelon +padesoy +padfoot +padge +padige +padina +padishah +padishahs +padle +padles +padlike +padlock +padlocked +padlocking +padlocks +padmasana +padmelon +padnag +padnags +padou +padouk +padouks +padpiece +padraic +padraig +padre +padres +padri +padrino +padroadist +padroado +padrona +padrone +padrones +padroni +padronism +pads +padsaw +padshah +padshahs +padstone +padtree +paduan +paduanism +paduasoy +paduasoys +padus +paean +paeanism +paeanisms +paeanize +paeanized +paeanizing +paeans +paedagogy +paedagogic +paedagogism +paedagogue +paedarchy +paedatrophy +paedatrophia +paederast +paederasty +paederastic +paederastically +paedeutics +paediatry +paediatric +paediatrician +paediatrics +paedobaptism +paedobaptist +paedogenesis +paedogenetic +paedogenic +paedology +paedological +paedologist +paedometer +paedometrical +paedomorphic +paedomorphism +paedomorphosis +paedonymy +paedonymic +paedophilia +paedopsychologist +paedotribe +paedotrophy +paedotrophic +paedotrophist +paegel +paegle +paelignian +paella +paellas +paenula +paenulae +paenulas +paeon +paeony +paeonia +paeoniaceae +paeonian +paeonic +paeonin +paeons +paeounlae +paepae +paesano +paetrick +paga +pagador +pagan +paganalia +paganalian +pagandom +pagandoms +paganic +paganical +paganically +paganisation +paganise +paganised +paganiser +paganises +paganish +paganishly +paganising +paganism +paganisms +paganist +paganistic +paganists +paganity +paganization +paganize +paganized +paganizer +paganizes +paganizing +paganly +paganry +pagans +pagatpat +page +pageant +pageanted +pageanteer +pageantic +pageantry +pageantries +pageants +pageboy +pageboys +paged +pagedom +pageful +pagehood +pageless +pagelike +pager +pagers +pages +pageship +pagesize +paggle +pagina +paginae +paginal +paginary +paginate +paginated +paginates +paginating +pagination +pagine +paging +pagiopod +pagiopoda +pagne +pagnes +pagod +pagoda +pagodalike +pagodas +pagodite +pagods +pagoscope +pagrus +paguma +pagurian +pagurians +pagurid +paguridae +paguridea +pagurids +pagurine +pagurinea +paguroid +paguroidea +pagurus +pagus +pah +paha +pahachroma +pahareen +pahari +paharia +pahautea +pahi +pahlavi +pahlavis +pahlevi +pahmi +paho +pahoehoe +pahos +pahouin +pahutan +pay +payability +payable +payableness +payably +payagua +payaguan +payback +paybox +paiche +paycheck +paychecks +paycheque +paycheques +paiconeca +paid +payday +paydays +paideia +paideutic +paideutics +paidle +paidology +paidological +paidologist +paidonosology +payed +payee +payees +payen +payeny +payer +payers +payess +paigle +payyetan +paying +paijama +paik +paiked +paiker +paiking +paiks +pail +pailette +pailful +pailfuls +paillard +paillasse +pailles +paillette +pailletted +paillettes +paillon +paillons +payload +payloads +pailolo +pailoo +pailou +pailow +pails +pailsful +paimaneh +paymaster +paymasters +paymastership +payment +payments +paymistress +pain +painch +painches +paindemaine +paine +pained +painful +painfuller +painfullest +painfully +painfulness +payni +paynim +paynimhood +paynimry +paynimrie +paynims +paining +painingly +paynize +painkiller +painkillers +painkilling +painless +painlessly +painlessness +painproof +pains +painstaker +painstaking +painstakingly +painstakingness +painsworthy +paint +paintability +paintable +paintableness +paintably +paintbox +paintbrush +paintbrushes +painted +paintedness +painter +painterish +painterly +painterlike +painterliness +painters +paintership +painty +paintier +paintiest +paintiness +painting +paintingness +paintings +paintless +paintpot +paintproof +paintress +paintry +paintrix +paintroot +paints +painture +paiock +paiocke +payoff +payoffs +payola +payolas +payong +payor +payors +payout +paip +pair +paired +pairedness +pairer +pairial +pairing +pairings +pairle +pairmasts +pairment +payroll +payrolls +pairs +pairt +pairwise +pais +pays +paisa +paysage +paysagist +paisan +paisanite +paysanne +paisano +paisanos +paisans +paisas +paise +paisley +paisleys +payt +paytamine +paiute +paiwari +paized +paizing +pajahuello +pajama +pajamaed +pajamahs +pajamas +pajaroello +pajero +pajock +pajonism +pakawa +pakawan +pakchoi +pakeha +pakhpuluk +pakhtun +pakistan +pakistani +pakistanis +paktong +pal +pala +palabra +palabras +palace +palaced +palacelike +palaceous +palaces +palaceward +palacewards +palach +palacsinta +paladin +paladins +palaeanthropic +palaearctic +palaeechini +palaeechinoid +palaeechinoidea +palaeechinoidean +palaeentomology +palaeethnology +palaeethnologic +palaeethnological +palaeethnologist +palaeeudyptes +palaeic +palaeichthyan +palaeichthyes +palaeichthyic +palaemon +palaemonid +palaemonidae +palaemonoid +palaeoalchemical +palaeoanthropic +palaeoanthropography +palaeoanthropology +palaeoanthropus +palaeoatavism +palaeoatavistic +palaeobiogeography +palaeobiology +palaeobiologic +palaeobiological +palaeobiologist +palaeobotany +palaeobotanic +palaeobotanical +palaeobotanically +palaeobotanist +palaeocarida +palaeoceanography +palaeocene +palaeochorology +palaeocyclic +palaeoclimatic +palaeoclimatology +palaeoclimatologic +palaeoclimatological +palaeoclimatologist +palaeoconcha +palaeocosmic +palaeocosmology +palaeocrinoidea +palaeocrystal +palaeocrystallic +palaeocrystalline +palaeocrystic +palaeodendrology +palaeodendrologic +palaeodendrological +palaeodendrologically +palaeodendrologist +palaeodictyoptera +palaeodictyopteran +palaeodictyopteron +palaeodictyopterous +palaeoecology +palaeoecologic +palaeoecological +palaeoecologist +palaeoencephala +palaeoencephalon +palaeoentomology +palaeoentomologic +palaeoentomological +palaeoentomologist +palaeoeremology +palaeoethnic +palaeoethnobotany +palaeoethnology +palaeoethnologic +palaeoethnological +palaeoethnologist +palaeofauna +palaeogaea +palaeogaean +palaeogene +palaeogenesis +palaeogenetic +palaeogeography +palaeogeographic +palaeogeographical +palaeogeographically +palaeoglaciology +palaeoglyph +palaeognathae +palaeognathic +palaeognathous +palaeograph +palaeographer +palaeography +palaeographic +palaeographical +palaeographically +palaeographist +palaeoherpetology +palaeoherpetologist +palaeohydrography +palaeohistology +palaeolatry +palaeolimnology +palaeolith +palaeolithy +palaeolithic +palaeolithical +palaeolithist +palaeolithoid +palaeology +palaeological +palaeologist +palaeomagnetism +palaeomastodon +palaeometallic +palaeometeorology +palaeometeorological +palaeonemertea +palaeonemertean +palaeonemertine +palaeonemertinea +palaeonemertini +palaeoniscid +palaeoniscidae +palaeoniscoid +palaeoniscum +palaeoniscus +palaeontography +palaeontographic +palaeontographical +palaeontol +palaeontology +palaeontologic +palaeontological +palaeontologically +palaeontologies +palaeontologist +palaeopathology +palaeopedology +palaeophile +palaeophilist +palaeophis +palaeophysiography +palaeophysiology +palaeophytic +palaeophytology +palaeophytological +palaeophytologist +palaeoplain +palaeopotamology +palaeopsychic +palaeopsychology +palaeopsychological +palaeoptychology +palaeornis +palaeornithinae +palaeornithine +palaeornithology +palaeornithological +palaeosaur +palaeosaurus +palaeosophy +palaeospondylus +palaeostyly +palaeostylic +palaeostraca +palaeostracan +palaeostriatal +palaeostriatum +palaeotechnic +palaeothalamus +palaeothentes +palaeothentidae +palaeothere +palaeotherian +palaeotheriidae +palaeotheriodont +palaeotherioid +palaeotherium +palaeotheroid +palaeotype +palaeotypic +palaeotypical +palaeotypically +palaeotypography +palaeotypographic +palaeotypographical +palaeotypographist +palaeotropical +palaeovolcanic +palaeozoic +palaeozoology +palaeozoologic +palaeozoological +palaeozoologist +palaestra +palaestrae +palaestral +palaestras +palaestrian +palaestric +palaestrics +palaetiology +palaetiological +palaetiologist +palafitte +palagonite +palagonitic +palay +palayan +palaic +palaihnihan +palaiotype +palais +palaiste +palaite +palaka +palala +palama +palamae +palamate +palame +palamedea +palamedean +palamedeidae +palamite +palamitism +palampore +palander +palank +palanka +palankeen +palankeened +palankeener +palankeening +palankeeningly +palanquin +palanquined +palanquiner +palanquining +palanquiningly +palanquins +palapala +palapalai +palapteryx +palaquium +palar +palas +palatability +palatable +palatableness +palatably +palatal +palatalism +palatality +palatalization +palatalize +palatalized +palatally +palatals +palate +palated +palateful +palatefulness +palateless +palatelike +palates +palatia +palatial +palatially +palatialness +palatian +palatic +palatinal +palatinate +palatinates +palatine +palatines +palatineship +palatinian +palatinite +palation +palatist +palatitis +palatium +palative +palatization +palatize +palatoalveolar +palatodental +palatoglossal +palatoglossus +palatognathous +palatogram +palatograph +palatography +palatomaxillary +palatometer +palatonasal +palatopharyngeal +palatopharyngeus +palatoplasty +palatoplegia +palatopterygoid +palatoquadrate +palatorrhaphy +palatoschisis +palatua +palau +palaung +palaver +palavered +palaverer +palavering +palaverist +palaverment +palaverous +palavers +palazzi +palazzo +palberry +palch +pale +palea +paleaceous +paleae +paleal +paleanthropic +palearctic +paleate +palebelly +palebreast +palebuck +palechinoid +paled +paledness +paleencephala +paleencephalon +paleencephalons +paleentomology +paleethnographer +paleethnology +paleethnologic +paleethnological +paleethnologist +paleface +palefaces +palegold +palehearted +paleichthyology +paleichthyologic +paleichthyologist +paleiform +palely +paleman +paleness +palenesses +palenque +paleoalchemical +paleoandesite +paleoanthropic +paleoanthropography +paleoanthropology +paleoanthropological +paleoanthropologist +paleoanthropus +paleoatavism +paleoatavistic +paleobiogeography +paleobiology +paleobiologic +paleobiological +paleobiologist +paleobotany +paleobotanic +paleobotanical +paleobotanically +paleobotanist +paleoceanography +paleocene +paleochorology +paleochorologist +paleocyclic +paleoclimatic +paleoclimatology +paleoclimatologic +paleoclimatological +paleoclimatologist +paleoconcha +paleocosmic +paleocosmology +paleocrystal +paleocrystallic +paleocrystalline +paleocrystic +paleodendrology +paleodendrologic +paleodendrological +paleodendrologically +paleodendrologist +paleodentrologist +paleoecology +paleoecologic +paleoecological +paleoecologist +paleoencephalon +paleoentomologic +paleoentomological +paleoentomologist +paleoeremology +paleoethnic +paleoethnography +paleoethnology +paleoethnologic +paleoethnological +paleoethnologist +paleofauna +paleog +paleogene +paleogenesis +paleogenetic +paleogeography +paleogeographic +paleogeographical +paleogeographically +paleogeologic +paleoglaciology +paleoglaciologist +paleoglyph +paleograph +paleographer +paleographers +paleography +paleographic +paleographical +paleographically +paleographist +paleoherpetology +paleoherpetologist +paleohydrography +paleohistology +paleoichthyology +paleoytterbium +paleokinetic +paleola +paleolate +paleolatry +paleolimnology +paleolith +paleolithy +paleolithic +paleolithical +paleolithist +paleolithoid +paleology +paleological +paleologist +paleomagnetic +paleomagnetically +paleomagnetism +paleomagnetist +paleomammalogy +paleomammology +paleomammologist +paleometallic +paleometeorology +paleometeorological +paleometeorologist +paleon +paleontography +paleontographic +paleontographical +paleontol +paleontology +paleontologic +paleontological +paleontologically +paleontologies +paleontologist +paleontologists +paleopathology +paleopathologic +paleopathological +paleopathologist +paleopedology +paleophysiography +paleophysiology +paleophysiologist +paleophytic +paleophytology +paleophytological +paleophytologist +paleopicrite +paleoplain +paleopotamology +paleopotamoloy +paleopsychic +paleopsychology +paleopsychological +paleornithology +paleornithological +paleornithologist +paleostyly +paleostylic +paleostriatal +paleostriatum +paleotechnic +paleothalamus +paleothermal +paleothermic +paleotropical +paleovolcanic +paleozoic +paleozoology +paleozoologic +paleozoological +paleozoologist +paler +palermitan +palermo +paleron +pales +palesman +palest +palestine +palestinian +palestinians +palestra +palestrae +palestral +palestras +palestrian +palestric +palet +paletiology +paletot +paletots +palets +palette +palettelike +palettes +paletz +palew +paleways +palewise +palfgeys +palfrey +palfreyed +palfreys +palfrenier +palfry +palgat +pali +paly +palicourea +palier +paliest +palification +paliform +paligorskite +palikar +palikarism +palikars +palikinesia +palila +palilalia +palilia +palilicium +palillogia +palilogetic +palilogy +palimbacchic +palimbacchius +palimony +palimpsest +palimpsestic +palimpsests +palimpset +palinal +palindrome +palindromes +palindromic +palindromical +palindromically +palindromist +paling +palingenesy +palingenesia +palingenesian +palingenesis +palingenesist +palingenetic +palingenetically +palingeny +palingenic +palingenist +palings +palinode +palinoded +palinodes +palinody +palinodial +palinodic +palinodist +palynology +palynologic +palynological +palynologically +palynologist +palynomorph +palinopic +palinurid +palinuridae +palinuroid +palinurus +paliphrasia +palirrhea +palis +palisade +palisaded +palisades +palisading +palisado +palisadoed +palisadoes +palisadoing +palisander +palisfy +palish +palisse +palistrophia +paliurus +palkee +palki +pall +palla +palladammin +palladammine +palladia +palladian +palladianism +palladic +palladiferous +palladinize +palladinized +palladinizing +palladion +palladious +palladium +palladiumize +palladiumized +palladiumizing +palladiums +palladize +palladized +palladizing +palladodiammine +palladosammine +palladous +pallae +pallah +pallall +pallanesthesia +pallar +pallas +pallasite +pallbearer +pallbearers +palled +pallescence +pallescent +pallesthesia +pallet +palleting +palletization +palletize +palletized +palletizer +palletizing +pallets +pallette +pallettes +pallholder +palli +pally +pallia +pallial +palliament +palliard +palliasse +palliata +palliate +palliated +palliates +palliating +palliation +palliations +palliative +palliatively +palliator +palliatory +pallid +pallidiflorous +pallidipalpate +palliditarsate +pallidity +pallidiventrate +pallidly +pallidness +pallier +pallies +palliest +palliyan +palliness +palling +palliobranchiata +palliobranchiate +palliocardiac +pallioessexite +pallion +palliopedal +palliostratus +palliser +pallium +palliums +pallograph +pallographic +pallometric +pallone +pallor +pallors +palls +pallu +palluites +pallwise +palm +palma +palmaceae +palmaceous +palmad +palmae +palmanesthesia +palmar +palmary +palmarian +palmaris +palmate +palmated +palmately +palmatifid +palmatiform +palmatilobate +palmatilobed +palmation +palmatiparted +palmatipartite +palmatisect +palmatisected +palmature +palmchrist +palmcrist +palmed +palmella +palmellaceae +palmellaceous +palmelloid +palmer +palmery +palmeries +palmerin +palmerite +palmers +palmerworm +palmesthesia +palmette +palmettes +palmetto +palmettoes +palmettos +palmetum +palmful +palmy +palmic +palmicoleus +palmicolous +palmier +palmiest +palmiferous +palmification +palmiform +palmigrade +palmilla +palmillo +palmilobate +palmilobated +palmilobed +palmin +palminervate +palminerved +palming +palmiped +palmipedes +palmipes +palmira +palmyra +palmyras +palmyrene +palmyrenian +palmist +palmiste +palmister +palmistry +palmists +palmitate +palmite +palmitic +palmitin +palmitine +palmitinic +palmitins +palmito +palmitoleic +palmitone +palmitos +palmiveined +palmivorous +palmlike +palmo +palmodic +palmoscopy +palmospasmus +palms +palmula +palmus +palmwise +palmwood +palolo +palolos +paloma +palombino +palometa +palomino +palominos +palooka +palookas +palosapis +palour +palouser +paloverde +palp +palpability +palpable +palpableness +palpably +palpacle +palpal +palpate +palpated +palpates +palpating +palpation +palpations +palpator +palpatory +palpators +palpebra +palpebrae +palpebral +palpebrate +palpebration +palpebritis +palped +palpi +palpicorn +palpicornia +palpifer +palpiferous +palpiform +palpiger +palpigerous +palpitant +palpitate +palpitated +palpitates +palpitating +palpitatingly +palpitation +palpitations +palpless +palpocil +palpon +palps +palpulus +palpus +pals +palsgraf +palsgrave +palsgravine +palsy +palsied +palsies +palsify +palsification +palsying +palsylike +palsywort +palstaff +palstave +palster +palt +palta +palter +paltered +palterer +palterers +paltering +palterly +palters +paltock +paltry +paltrier +paltriest +paltrily +paltriness +paludal +paludament +paludamenta +paludamentum +palude +paludial +paludian +paludic +paludicella +paludicolae +paludicole +paludicoline +paludicolous +paludiferous +paludina +paludinal +paludine +paludinous +paludism +paludisms +paludose +paludous +paludrin +paludrine +palule +paluli +palulus +palus +palustral +palustrian +palustrine +pam +pamaceous +pamaquin +pamaquine +pambanmanche +pamela +pament +pameroon +pamhy +pamir +pamiri +pamirian +pamlico +pamment +pampa +pampanga +pampangan +pampango +pampanito +pampas +pampean +pampeans +pamper +pampered +pamperedly +pamperedness +pamperer +pamperers +pampering +pamperize +pampero +pamperos +pampers +pamphagous +pampharmacon +pamphiliidae +pamphilius +pamphysic +pamphysical +pamphysicism +pamphlet +pamphletage +pamphletary +pamphleteer +pamphleteers +pamphleter +pamphletful +pamphletic +pamphletical +pamphletize +pamphletized +pamphletizing +pamphlets +pamphletwise +pamphrey +pampilion +pampination +pampiniform +pampinocele +pamplegia +pampootee +pampootie +pampre +pamprodactyl +pamprodactylism +pamprodactylous +pampsychism +pampsychist +pams +pamunkey +pan +panabase +panace +panacea +panacean +panaceas +panaceist +panache +panached +panaches +panachure +panada +panadas +panade +panaesthesia +panaesthetic +panagia +panagiarion +panayan +panayano +panak +panaka +panama +panamaian +panaman +panamanian +panamanians +panamano +panamas +panamic +panamint +panamist +panapospory +panarchy +panarchic +panary +panaris +panaritium +panarteritis +panarthritis +panatela +panatelas +panatella +panatellas +panathenaea +panathenaean +panathenaic +panatrope +panatrophy +panatrophic +panautomorphic +panax +panbabylonian +panbabylonism +panboeotian +pancake +pancaked +pancakes +pancaking +pancarditis +panchayat +panchayet +panchama +panchart +panchax +panchaxes +pancheon +panchion +panchreston +panchromatic +panchromatism +panchromatization +panchromatize +panchway +pancyclopedic +panclastic +panclastite +panconciliatory +pancosmic +pancosmism +pancosmist +pancratia +pancratian +pancratiast +pancratiastic +pancratic +pancratical +pancratically +pancration +pancratism +pancratist +pancratium +pancreas +pancreases +pancreatalgia +pancreatectomy +pancreatectomize +pancreatectomized +pancreatemphraxis +pancreathelcosis +pancreatic +pancreaticoduodenal +pancreaticoduodenostomy +pancreaticogastrostomy +pancreaticosplenic +pancreatin +pancreatism +pancreatitic +pancreatitis +pancreatization +pancreatize +pancreatoduodenectomy +pancreatoenterostomy +pancreatogenic +pancreatogenous +pancreatoid +pancreatolipase +pancreatolith +pancreatomy +pancreatoncus +pancreatopathy +pancreatorrhagia +pancreatotomy +pancreatotomies +pancreectomy +pancreozymin +panctia +pand +panda +pandal +pandan +pandanaceae +pandanaceous +pandanales +pandani +pandanus +pandanuses +pandar +pandaram +pandarctos +pandaric +pandarus +pandas +pandation +pandava +pandean +pandect +pandectist +pandects +pandemy +pandemia +pandemian +pandemic +pandemicity +pandemics +pandemoniac +pandemoniacal +pandemonian +pandemonic +pandemonism +pandemonium +pandemos +pandenominational +pander +panderage +pandered +panderer +panderers +panderess +pandering +panderism +panderize +panderly +panderma +pandermite +panderous +panders +pandership +pandestruction +pandy +pandiabolism +pandybat +pandiculation +pandied +pandies +pandying +pandion +pandionidae +pandit +pandita +pandits +pandle +pandlewhew +pandoor +pandoors +pandora +pandoras +pandore +pandorea +pandores +pandoridae +pandorina +pandosto +pandour +pandoura +pandours +pandowdy +pandowdies +pandrop +pandura +panduras +pandurate +pandurated +pandure +panduriform +pane +panecclesiastical +paned +panegyre +panegyry +panegyric +panegyrica +panegyrical +panegyrically +panegyricize +panegyricon +panegyrics +panegyricum +panegyris +panegyrist +panegyrists +panegyrize +panegyrized +panegyrizer +panegyrizes +panegyrizing +panegoism +panegoist +paneity +panel +panela +panelation +panelboard +paneled +paneler +paneless +paneling +panelings +panelist +panelists +panellation +panelled +panelling +panellist +panels +panelwise +panelwork +panentheism +panes +panesthesia +panesthetic +panetela +panetelas +panetella +panetiere +panettone +panettones +panettoni +paneulogism +panfil +panfish +panfishes +panfry +panful +panfuls +pang +panga +pangaea +pangamy +pangamic +pangamous +pangamously +pangane +pangara +pangas +pangasi +pangasinan +panged +pangen +pangene +pangenesis +pangenetic +pangenetically +pangenic +pangens +pangerang +pangful +pangi +panging +pangyrical +pangium +pangless +panglessly +panglima +pangloss +panglossian +panglossic +pangolin +pangolins +pangrammatist +pangs +panguingue +panguingui +pangwe +panhandle +panhandled +panhandler +panhandlers +panhandles +panhandling +panharmonic +panharmonicon +panhas +panhead +panheaded +panhellenic +panhellenios +panhellenism +panhellenist +panhellenium +panhematopenia +panhidrosis +panhygrous +panhyperemia +panhypopituitarism +panhysterectomy +panhuman +pani +panyar +panic +panical +panically +panicful +panichthyophagous +panicked +panicky +panickier +panickiest +panickiness +panicking +panicle +panicled +panicles +paniclike +panicmonger +panicmongering +paniconograph +paniconography +paniconographic +panics +panicularia +paniculate +paniculated +paniculately +paniculitis +panicum +panicums +panidiomorphic +panidrosis +panier +paniers +panification +panime +panimmunity +paninean +panini +paniolo +panion +panionia +panionian +panionic +paniquita +paniquitan +panisc +panisca +paniscus +panisic +panisk +panivorous +panjabi +panjandrum +panjandrums +pank +pankin +pankration +panleucopenia +panleukopenia +panlogical +panlogism +panlogist +panlogistic +panlogistical +panlogistically +panman +panmelodicon +panmelodion +panmerism +panmeristic +panmyelophthisis +panmixy +panmixia +panmixias +panmnesia +panmug +panna +pannade +pannag +pannage +pannam +pannationalism +panne +panned +pannel +pannellation +panner +pannery +pannes +panneuritic +panneuritis +pannicle +pannicular +panniculitis +panniculus +pannier +panniered +pannierman +panniers +pannikin +pannikins +panning +pannonian +pannonic +pannose +pannosely +pannum +pannus +pannuscorium +panoan +panocha +panochas +panoche +panoches +panococo +panoistic +panomphaean +panomphaic +panomphean +panomphic +panophobia +panophthalmia +panophthalmitis +panoply +panoplied +panoplies +panoplying +panoplist +panoptic +panoptical +panopticon +panoram +panorama +panoramas +panoramic +panoramical +panoramically +panoramist +panornithic +panorpa +panorpatae +panorpian +panorpid +panorpidae +panos +panosteitis +panostitis +panotype +panotitis +panouchi +panowie +panpathy +panpharmacon +panphenomenalism +panphobia +panpipe +panpipes +panplegia +panpneumatism +panpolism +panpsychic +panpsychism +panpsychist +panpsychistic +pans +panscientist +pansciolism +pansciolist +pansclerosis +pansclerotic +panse +pansexism +pansexual +pansexualism +pansexualist +pansexuality +pansexualize +panshard +pansy +panside +pansideman +pansied +pansiere +pansies +pansified +pansyish +pansylike +pansinuitis +pansinusitis +pansit +pansmith +pansophy +pansophic +pansophical +pansophically +pansophies +pansophism +pansophist +panspermatism +panspermatist +panspermy +panspermia +panspermic +panspermism +panspermist +pansphygmograph +panstereorama +pant +pantachromatic +pantacosm +pantagamy +pantagogue +pantagraph +pantagraphic +pantagraphical +pantagruel +pantagruelian +pantagruelic +pantagruelically +pantagrueline +pantagruelion +pantagruelism +pantagruelist +pantagruelistic +pantagruelistical +pantagruelize +pantalan +pantaleon +pantalet +pantaletless +pantalets +pantalette +pantaletted +pantalettes +pantalgia +pantalon +pantalone +pantaloon +pantalooned +pantaloonery +pantaloons +pantameter +pantamorph +pantamorphia +pantamorphic +pantanemone +pantanencephalia +pantanencephalic +pantaphobia +pantarbe +pantarchy +pantas +pantascope +pantascopic +pantastomatida +pantastomina +pantatype +pantatrophy +pantatrophia +pantdress +pantechnic +pantechnicon +panted +pantelegraph +pantelegraphy +panteleologism +pantelephone +pantelephonic +pantelis +pantellerite +panter +panterer +panthea +pantheian +pantheic +pantheism +pantheist +pantheistic +pantheistical +pantheistically +pantheists +panthelematism +panthelism +pantheology +pantheologist +pantheon +pantheonic +pantheonization +pantheonize +pantheons +panther +pantheress +pantherine +pantherish +pantherlike +panthers +pantherwood +pantheum +panty +pantie +panties +pantihose +pantyhose +pantile +pantiled +pantiles +pantiling +pantine +panting +pantingly +pantisocracy +pantisocrat +pantisocratic +pantisocratical +pantisocratist +pantywaist +pantywaists +pantle +pantler +panto +pantochrome +pantochromic +pantochromism +pantochronometer +pantocrator +pantod +pantodon +pantodontidae +pantoffle +pantofle +pantofles +pantoganglitis +pantogelastic +pantoglossical +pantoglot +pantoglottism +pantograph +pantographer +pantography +pantographic +pantographical +pantographically +pantoiatrical +pantology +pantologic +pantological +pantologist +pantomancer +pantomania +pantometer +pantometry +pantometric +pantometrical +pantomime +pantomimed +pantomimes +pantomimic +pantomimical +pantomimically +pantomimicry +pantomiming +pantomimish +pantomimist +pantomimists +pantomimus +pantomnesia +pantomnesic +pantomorph +pantomorphia +pantomorphic +panton +pantonal +pantonality +pantoon +pantopelagian +pantophagy +pantophagic +pantophagist +pantophagous +pantophile +pantophobia +pantophobic +pantophobous +pantoplethora +pantopod +pantopoda +pantopragmatic +pantopterous +pantos +pantoscope +pantoscopic +pantosophy +pantostomata +pantostomate +pantostomatous +pantostome +pantotactic +pantothen +pantothenate +pantothenic +pantothere +pantotheria +pantotherian +pantotype +pantoum +pantoums +pantry +pantries +pantryman +pantrymen +pantrywoman +pantropic +pantropical +pantropically +pants +pantsuit +pantsuits +pantun +panuelo +panuelos +panung +panure +panurge +panurgy +panurgic +panus +panzer +panzers +panzoism +panzooty +panzootia +panzootic +paola +paolo +paon +paopao +pap +papa +papability +papable +papabot +papabote +papacy +papacies +papagay +papagayo +papagallo +papago +papaya +papayaceae +papayaceous +papayan +papayas +papain +papains +papaio +papayotin +papal +papalise +papalism +papalist +papalistic +papality +papalization +papalize +papalizer +papally +papaloi +papalty +papane +papaphobia +papaphobist +papaprelatical +papaprelatist +paparazzi +paparazzo +paparchy +paparchical +papas +papaship +papaver +papaveraceae +papaveraceous +papaverales +papaverin +papaverine +papaverous +papaw +papaws +papboat +pape +papegay +papey +papelera +papeleras +papelon +papelonne +paper +paperasserie +paperback +paperbacks +paperbark +paperboard +paperboards +paperboy +paperboys +paperbound +paperclip +papercutting +papered +paperer +paperers +paperful +papergirl +paperhanger +paperhangers +paperhanging +papery +paperiness +papering +paperings +paperknife +paperknives +paperlike +papermaker +papermaking +papermouth +papern +papers +papershell +paperweight +paperweights +paperwork +papess +papeterie +paphian +paphians +paphiopedilum +papiamento +papicolar +papicolist +papier +papilio +papilionaceae +papilionaceous +papiliones +papilionid +papilionidae +papilionides +papilioninae +papilionine +papilionoid +papilionoidea +papilla +papillae +papillar +papillary +papillate +papillated +papillectomy +papilledema +papilliferous +papilliform +papillitis +papilloadenocystoma +papillocarcinoma +papilloedema +papilloma +papillomas +papillomata +papillomatosis +papillomatous +papillon +papillons +papilloretinitis +papillosarcoma +papillose +papillosity +papillote +papillous +papillulate +papillule +papinachois +papingo +papio +papion +papiopio +papyr +papyraceous +papyral +papyrean +papyri +papyrian +papyrin +papyrine +papyritious +papyrocracy +papyrograph +papyrographer +papyrography +papyrographic +papyrology +papyrological +papyrologist +papyrophobia +papyroplastics +papyrotamia +papyrotint +papyrotype +papyrus +papyruses +papish +papisher +papism +papist +papistic +papistical +papistically +papistly +papistlike +papistry +papistries +papists +papize +papless +paplike +papmeat +papolater +papolatry +papolatrous +papoose +papooseroot +papooses +papoosh +papoula +papovavirus +pappain +pappea +pappenheimer +pappescent +pappi +pappy +pappier +pappies +pappiest +pappiferous +pappiform +pappyri +pappoose +pappooses +pappose +pappous +pappox +pappus +papreg +paprica +papricas +paprika +paprikas +papriks +paps +papua +papuan +papuans +papula +papulae +papulan +papular +papulate +papulated +papulation +papule +papules +papuliferous +papuloerythematous +papulopustular +papulopustule +papulose +papulosquamous +papulous +papulovesicular +paque +paquet +par +para +paraaminobenzoic +parabanate +parabanic +parabaptism +parabaptization +parabasal +parabases +parabasic +parabasis +parabema +parabemata +parabematic +parabenzoquinone +parabien +parabiosis +parabiotic +parabiotically +parablast +parablastic +parable +parabled +parablepsy +parablepsia +parablepsis +parableptic +parables +parabling +parabola +parabolanus +parabolas +parabole +parabolic +parabolical +parabolicalism +parabolically +parabolicness +paraboliform +parabolise +parabolised +parabolising +parabolist +parabolization +parabolize +parabolized +parabolizer +parabolizing +paraboloid +paraboloidal +parabomb +parabotulism +parabrake +parabranchia +parabranchial +parabranchiate +parabulia +parabulic +paracanthosis +paracarmine +paracasein +paracaseinate +paracelsian +paracelsianism +paracelsic +paracelsist +paracelsistic +paracelsus +paracenteses +paracentesis +paracentral +paracentric +paracentrical +paracephalus +paracerebellar +paracetaldehyde +paracetamol +parachaplain +paracholia +parachor +parachordal +parachors +parachrea +parachroia +parachroma +parachromatism +parachromatophorous +parachromatopsia +parachromatosis +parachrome +parachromoparous +parachromophoric +parachromophorous +parachronism +parachronistic +parachrose +parachute +parachuted +parachuter +parachutes +parachutic +parachuting +parachutism +parachutist +parachutists +paracyanogen +paracyeses +paracyesis +paracymene +paracystic +paracystitis +paracystium +paracium +paraclete +paracmasis +paracme +paracoele +paracoelian +paracolitis +paracolon +paracolpitis +paracolpium +paracondyloid +paracone +paraconic +paraconid +paraconscious +paracorolla +paracotoin +paracoumaric +paracresol +paracress +paracrostic +paracusia +paracusic +paracusis +parada +parade +paraded +paradeful +paradeless +paradelike +paradenitis +paradental +paradentitis +paradentium +parader +paraderm +paraders +parades +paradiastole +paradiazine +paradichlorbenzene +paradichlorbenzol +paradichlorobenzene +paradichlorobenzol +paradiddle +paradidym +paradidymal +paradidymis +paradigm +paradigmatic +paradigmatical +paradigmatically +paradigmatize +paradigms +parading +paradingly +paradiplomatic +paradisaic +paradisaical +paradisaically +paradisal +paradisally +paradise +paradisea +paradisean +paradiseidae +paradiseinae +paradises +paradisia +paradisiac +paradisiacal +paradisiacally +paradisial +paradisian +paradisic +paradisical +parado +paradoctor +parados +paradoses +paradox +paradoxal +paradoxer +paradoxes +paradoxy +paradoxial +paradoxic +paradoxical +paradoxicalism +paradoxicality +paradoxically +paradoxicalness +paradoxician +paradoxides +paradoxidian +paradoxism +paradoxist +paradoxographer +paradoxographical +paradoxology +paradoxure +paradoxurinae +paradoxurine +paradoxurus +paradromic +paradrop +paradropped +paradropping +paradrops +paraenesis +paraenesize +paraenetic +paraenetical +paraengineer +paraesthesia +paraesthetic +paraffin +paraffine +paraffined +paraffiner +paraffiny +paraffinic +paraffining +paraffinize +paraffinized +paraffinizing +paraffinoid +paraffins +paraffle +parafle +parafloccular +paraflocculus +parafoil +paraform +paraformaldehyde +paraforms +parafunction +paragammacism +paraganglion +paragaster +paragastral +paragastric +paragastrula +paragastrular +parage +paragenesia +paragenesis +paragenetic +paragenetically +paragenic +paragerontic +parageusia +parageusic +parageusis +paragglutination +paraglenal +paraglycogen +paraglider +paraglobin +paraglobulin +paraglossa +paraglossae +paraglossal +paraglossate +paraglossia +paragnath +paragnathism +paragnathous +paragnaths +paragnathus +paragneiss +paragnosia +paragoge +paragoges +paragogic +paragogical +paragogically +paragogize +paragon +paragoned +paragonimiasis +paragonimus +paragoning +paragonite +paragonitic +paragonless +paragons +paragram +paragrammatist +paragraph +paragraphed +paragrapher +paragraphia +paragraphic +paragraphical +paragraphically +paragraphing +paragraphism +paragraphist +paragraphistical +paragraphize +paragraphs +paraguay +paraguayan +paraguayans +parah +paraheliotropic +paraheliotropism +parahematin +parahemoglobin +parahepatic +parahydrogen +parahypnosis +parahippus +parahopeite +parahormone +paraiba +paraiyan +paraison +parakeet +parakeets +parakeratosis +parakilya +parakinesia +parakinesis +parakinetic +paralactate +paralalia +paralambdacism +paralambdacismus +paralanguage +paralaurionite +paraldehyde +parale +paralectotype +paralegal +paraleipsis +paralepsis +paralexia +paralexic +paralgesia +paralgesic +paralian +paralimnion +paralinguistic +paralinguistics +paralinin +paralipomena +paralipomenon +paralipses +paralipsis +paralysation +paralyse +paralysed +paralyser +paralyses +paralysing +paralysis +paralytic +paralytica +paralitical +paralytical +paralytically +paralyzant +paralyzation +paralyze +paralyzed +paralyzedly +paralyzer +paralyzers +paralyzes +paralyzing +paralyzingly +parallactic +parallactical +parallactically +parallax +parallaxes +parallel +parallelable +paralleled +parallelepiped +parallelepipedal +parallelepipedic +parallelepipedon +parallelepipedonal +parallelepipedous +paralleler +parallelinervate +parallelinerved +parallelinervous +paralleling +parallelisation +parallelise +parallelised +parallelising +parallelism +parallelist +parallelistic +parallelith +parallelization +parallelize +parallelized +parallelizer +parallelizes +parallelizing +parallelled +parallelless +parallelly +parallelling +parallelodrome +parallelodromous +parallelogram +parallelogrammatic +parallelogrammatical +parallelogrammic +parallelogrammical +parallelograms +parallelograph +parallelometer +parallelopiped +parallelopipedon +parallelotropic +parallelotropism +parallels +parallelwise +parallepipedous +paralogy +paralogia +paralogic +paralogical +paralogician +paralogism +paralogist +paralogistic +paralogize +paralogized +paralogizing +paraluminite +param +paramagnet +paramagnetic +paramagnetically +paramagnetism +paramandelic +paramarine +paramastigate +paramastitis +paramastoid +paramatta +paramecia +paramecidae +paramecium +parameciums +paramedian +paramedic +paramedical +paramedics +paramelaconite +paramenia +parament +paramenta +paraments +paramere +parameric +parameron +paramese +paramesial +parameter +parameterizable +parameterization +parameterizations +parameterize +parameterized +parameterizes +parameterizing +parameterless +parameters +parametral +parametric +parametrical +parametrically +parametritic +parametritis +parametrium +parametrization +parametrize +parametrized +parametrizing +paramid +paramide +paramyelin +paramilitary +paramylum +paramimia +paramine +paramyoclonus +paramiographer +paramyosin +paramyosinogen +paramyotone +paramyotonia +paramita +paramitome +paramyxovirus +paramnesia +paramo +paramoecium +paramorph +paramorphia +paramorphic +paramorphine +paramorphism +paramorphosis +paramorphous +paramos +paramount +paramountcy +paramountly +paramountness +paramountship +paramour +paramours +paramuthetic +paranasal +paranatellon +parandrus +paranema +paranematic +paranephric +paranephritic +paranephritis +paranephros +paranepionic +paranete +parang +parangi +parangs +paranymph +paranymphal +paranitraniline +paranitrosophenol +paranja +paranoea +paranoeac +paranoeas +paranoia +paranoiac +paranoiacs +paranoias +paranoid +paranoidal +paranoidism +paranoids +paranomia +paranormal +paranormality +paranormally +paranosic +paranotions +paranthelion +paranthracene +paranthropus +paranuclear +paranucleate +paranuclei +paranucleic +paranuclein +paranucleinic +paranucleus +parao +paraoperation +parapaguridae +paraparesis +paraparetic +parapathy +parapathia +parapdia +parapegm +parapegma +parapegmata +paraperiodic +parapet +parapetalous +parapeted +parapetless +parapets +paraph +paraphasia +paraphasic +paraphed +paraphemia +paraphenetidine +paraphenylene +paraphenylenediamine +parapherna +paraphernal +paraphernalia +paraphernalian +paraphia +paraphilia +paraphiliac +paraphyllia +paraphyllium +paraphimosis +paraphing +paraphysate +paraphysical +paraphysiferous +paraphysis +paraphonia +paraphoniac +paraphonic +paraphototropism +paraphragm +paraphrasable +paraphrase +paraphrased +paraphraser +paraphrasers +paraphrases +paraphrasia +paraphrasian +paraphrasing +paraphrasis +paraphrasist +paraphrast +paraphraster +paraphrastic +paraphrastical +paraphrastically +paraphrenia +paraphrenic +paraphrenitis +paraphronesis +paraphrosyne +paraphs +paraplasis +paraplasm +paraplasmic +paraplastic +paraplastin +paraplectic +paraplegy +paraplegia +paraplegic +paraplegics +parapleuritis +parapleurum +parapod +parapodia +parapodial +parapodium +parapophysial +parapophysis +parapphyllia +parapraxia +parapraxis +paraproctitis +paraproctium +paraprofessional +paraprofessionals +paraprostatitis +paraprotein +parapsychical +parapsychism +parapsychology +parapsychological +parapsychologies +parapsychologist +parapsychologists +parapsychosis +parapsida +parapsidal +parapsidan +parapsis +paraptera +parapteral +parapteron +parapterum +paraquadrate +paraquat +paraquats +paraquet +paraquets +paraquinone +pararctalia +pararctalian +pararectal +pararek +parareka +pararhotacism +pararosaniline +pararosolic +pararthria +paras +parasaboteur +parasalpingitis +parasang +parasangs +parascene +parascenia +parascenium +parasceve +paraschematic +parasecretion +paraselenae +paraselene +paraselenic +parasemidin +parasemidine +parasexual +parasexuality +parashah +parashioth +parashoth +parasigmatism +parasigmatismus +parasympathetic +parasympathomimetic +parasynapsis +parasynaptic +parasynaptist +parasyndesis +parasynesis +parasynetic +parasynovitis +parasynthesis +parasynthetic +parasyntheton +parasyphilis +parasyphilitic +parasyphilosis +parasystole +parasita +parasital +parasitary +parasite +parasitelike +parasitemia +parasites +parasithol +parasitic +parasitica +parasitical +parasitically +parasiticalness +parasiticidal +parasiticide +parasiticidic +parasitics +parasiticus +parasitidae +parasitism +parasitization +parasitize +parasitized +parasitizes +parasitizing +parasitogenic +parasitoid +parasitoidism +parasitoids +parasitology +parasitologic +parasitological +parasitologies +parasitologist +parasitophobia +parasitosis +parasitotrope +parasitotropy +parasitotropic +parasitotropism +paraskenion +parasnia +parasol +parasoled +parasolette +parasols +paraspecific +parasphenoid +parasphenoidal +paraspy +paraspotter +parastades +parastas +parastatic +parastemon +parastemonal +parasternal +parasternum +parastichy +parastichies +parastyle +parasubphonate +parasubstituted +parasuchia +parasuchian +paratactic +paratactical +paratactically +paratartaric +parataxic +parataxis +parate +paraterminal +paratheria +paratherian +parathesis +parathetic +parathymic +parathion +parathyrin +parathyroid +parathyroidal +parathyroidectomy +parathyroidectomies +parathyroidectomize +parathyroidectomized +parathyroidectomizing +parathyroids +parathyroprival +parathyroprivia +parathyroprivic +parathormone +paratype +paratyphlitis +paratyphoid +paratypic +paratypical +paratypically +paratitla +paratitles +paratitlon +paratoloid +paratoluic +paratoluidine +paratomial +paratomium +paratonic +paratonically +paratonnerre +paratory +paratorium +paratracheal +paratragedia +paratragoedia +paratransversan +paratrichosis +paratrimma +paratriptic +paratroop +paratrooper +paratroopers +paratroops +paratrophy +paratrophic +paratuberculin +paratuberculosis +paratuberculous +paratungstate +paratungstic +paraunter +parava +paravaginitis +paravail +paravane +paravanes +paravant +paravauxite +paravent +paravertebral +paravesical +paravidya +parawing +paraxial +paraxially +paraxylene +paraxon +paraxonic +parazoa +parazoan +parazonium +parbake +parbate +parbleu +parboil +parboiled +parboiling +parboils +parbreak +parbuckle +parbuckled +parbuckling +parc +parcae +parcel +parceled +parceling +parcellary +parcellate +parcellation +parcelled +parcelling +parcellization +parcellize +parcelment +parcels +parcelwise +parcenary +parcener +parceners +parcenership +parch +parchable +parched +parchedly +parchedness +parcheesi +parchemin +parcher +parches +parchesi +parchy +parching +parchingly +parchisi +parchment +parchmenter +parchmenty +parchmentize +parchmentized +parchmentizing +parchmentlike +parchments +parcidenta +parcidentate +parciloquy +parclose +parcook +pard +pardah +pardahs +pardal +pardale +pardalote +pardanthus +pardao +pardaos +parde +parded +pardee +pardesi +pardhan +pardi +pardy +pardie +pardieu +pardine +pardner +pardners +pardnomastic +pardo +pardon +pardonable +pardonableness +pardonably +pardoned +pardonee +pardoner +pardoners +pardoning +pardonless +pardonmonger +pardons +pards +pare +parecy +parecious +pareciously +pareciousness +parecism +parecisms +pared +paregal +paregmenon +paregoric +paregorical +pareiasauri +pareiasauria +pareiasaurian +pareiasaurus +pareil +pareioplitae +pareira +pareiras +pareja +parel +parelectronomy +parelectronomic +parella +parelle +parellic +paren +parencephalic +parencephalon +parenchym +parenchyma +parenchymal +parenchymatic +parenchymatitis +parenchymatous +parenchymatously +parenchyme +parenchymous +parenesis +parenesize +parenetic +parenetical +parennece +parennir +parens +parent +parentage +parental +parentalia +parentalism +parentality +parentally +parentate +parentation +parentdom +parented +parentela +parentele +parentelic +parenteral +parenterally +parentheses +parenthesis +parenthesize +parenthesized +parenthesizes +parenthesizing +parenthetic +parenthetical +parentheticality +parenthetically +parentheticalness +parenthood +parenticide +parenting +parentis +parentless +parentlike +parents +parentship +pareoean +parepididymal +parepididymis +parepigastric +parer +parerethesis +parergal +parergy +parergic +parergon +parers +pares +pareses +paresis +paresthesia +paresthesis +paresthetic +parethmoid +paretic +paretically +paretics +paretta +pareu +pareunia +pareus +pareve +parfait +parfaits +parfey +parfield +parfilage +parfleche +parflesh +parfleshes +parfocal +parfocality +parfocalize +parfum +parfumerie +parfumeur +parfumoir +pargana +pargasite +parge +pargeboard +parged +parges +parget +pargeted +pargeter +pargeting +pargets +pargetted +pargetting +pargyline +parging +pargo +pargos +parhelia +parheliacal +parhelic +parhelion +parhelnm +parhypate +parhomology +parhomologous +pari +pariah +pariahdom +pariahism +pariahs +pariahship +parial +parian +parians +pariasauria +pariasaurus +parica +paridae +paridigitate +paridrosis +paries +pariet +parietal +parietales +parietals +parietary +parietaria +parietes +parietofrontal +parietojugal +parietomastoid +parietoquadrate +parietosphenoid +parietosphenoidal +parietosplanchnic +parietosquamosal +parietotemporal +parietovaginal +parietovisceral +parify +parigenin +pariglin +parilia +parilicium +parilla +parillin +parimutuel +parimutuels +parinarium +parine +paring +parings +paryphodrome +paripinnate +paris +parises +parish +parished +parishen +parishes +parishional +parishionally +parishionate +parishioner +parishioners +parishionership +parishwide +parisia +parisian +parisianism +parisianization +parisianize +parisianly +parisians +parisienne +parisii +parisyllabic +parisyllabical +parisis +parisite +parisology +parison +parisonic +paristhmic +paristhmion +pariti +parity +parities +paritium +paritor +parivincular +park +parka +parkas +parked +parkee +parker +parkers +parky +parkin +parking +parkings +parkinson +parkinsonia +parkinsonian +parkinsonism +parkish +parkland +parklands +parkleaves +parklike +parks +parkway +parkways +parkward +parl +parlay +parlayed +parlayer +parlayers +parlaying +parlays +parlamento +parlance +parlances +parlando +parlante +parlatory +parlatoria +parle +parled +parley +parleyed +parleyer +parleyers +parleying +parleys +parleyvoo +parlement +parles +parlesie +parli +parly +parlia +parliament +parliamental +parliamentary +parliamentarian +parliamentarianism +parliamentarians +parliamentarily +parliamentariness +parliamentarism +parliamentarization +parliamentarize +parliamenteer +parliamenteering +parliamenter +parliaments +parling +parlish +parlor +parlorish +parlormaid +parlors +parlour +parlourish +parlours +parlous +parlously +parlousness +parma +parmacety +parmack +parmak +parmelia +parmeliaceae +parmeliaceous +parmelioid +parmentier +parmentiera +parmesan +parmese +parmigiana +parmigiano +parnas +parnassia +parnassiaceae +parnassiaceous +parnassian +parnassianism +parnassiinae +parnassism +parnassus +parnel +parnellism +parnellite +parnorpine +paroarion +paroarium +paroccipital +paroch +parochial +parochialic +parochialis +parochialise +parochialised +parochialising +parochialism +parochialist +parochiality +parochialization +parochialize +parochially +parochialness +parochian +parochin +parochine +parochiner +parode +parodi +parody +parodiable +parodial +parodic +parodical +parodied +parodies +parodying +parodinia +parodyproof +parodist +parodistic +parodistically +parodists +parodize +parodoi +parodontia +parodontitia +parodontitis +parodontium +parodos +parodus +paroecy +paroecious +paroeciously +paroeciousness +paroecism +paroemia +paroemiac +paroemiographer +paroemiography +paroemiology +paroemiologist +paroicous +parol +parolable +parole +paroled +parolee +parolees +paroler +parolers +paroles +parolfactory +paroli +paroling +parolist +parols +paromoeon +paromologetic +paromology +paromologia +paromphalocele +paromphalocelic +paronychia +paronychial +paronychium +paronym +paronymy +paronymic +paronymization +paronymize +paronymous +paronyms +paronomasia +paronomasial +paronomasian +paronomasiastic +paronomastic +paronomastical +paronomastically +paroophoric +paroophoritis +paroophoron +paropsis +paroptesis +paroptic +paroquet +paroquets +parorchid +parorchis +parorexia +parosela +parosmia +parosmic +parosteal +parosteitis +parosteosis +parostosis +parostotic +parostotis +parotia +parotic +parotid +parotidean +parotidectomy +parotiditis +parotids +parotis +parotitic +parotitis +parotoid +parotoids +parous +parousia +parousiamania +parovarian +parovariotomy +parovarium +paroxazine +paroxysm +paroxysmal +paroxysmalist +paroxysmally +paroxysmic +paroxysmist +paroxysms +paroxytone +paroxytonic +paroxytonize +parpal +parpen +parpend +parquet +parquetage +parqueted +parqueting +parquetry +parquets +parr +parra +parrah +parrakeet +parrakeets +parral +parrall +parrals +parramatta +parred +parrel +parrels +parrhesia +parrhesiastic +parry +parriable +parricidal +parricidally +parricide +parricided +parricides +parricidial +parricidism +parridae +parridge +parridges +parried +parrier +parries +parrying +parring +parritch +parritches +parrock +parroket +parrokets +parroque +parroquet +parrot +parrotbeak +parrotbill +parroted +parroter +parroters +parrotfish +parrotfishes +parrothood +parroty +parroting +parrotism +parrotize +parrotlet +parrotlike +parrotry +parrots +parrotwise +parrs +pars +parsable +parse +parsec +parsecs +parsed +parsee +parseeism +parser +parsers +parses +parsettensite +parseval +parsi +parsic +parsifal +parsiism +parsimony +parsimonious +parsimoniously +parsimoniousness +parsing +parsings +parsism +parsley +parsleylike +parsleys +parsleywort +parsnip +parsnips +parson +parsonage +parsonages +parsonarchy +parsondom +parsoned +parsonese +parsoness +parsonet +parsonhood +parsony +parsonic +parsonical +parsonically +parsoning +parsonish +parsonity +parsonize +parsonly +parsonlike +parsonolatry +parsonology +parsonry +parsons +parsonship +parsonsia +parsonsite +part +partable +partage +partakable +partake +partaken +partaker +partakers +partakes +partaking +partan +partanfull +partanhanded +partans +parte +parted +partedness +parten +parter +parterre +parterred +parterres +parters +partes +partheniad +partheniae +parthenian +parthenic +parthenium +parthenocarpelly +parthenocarpy +parthenocarpic +parthenocarpical +parthenocarpically +parthenocarpous +parthenocissus +parthenogeneses +parthenogenesis +parthenogenetic +parthenogenetically +parthenogeny +parthenogenic +parthenogenitive +parthenogenous +parthenogone +parthenogonidium +parthenolatry +parthenology +parthenon +parthenopaeus +parthenoparous +parthenope +parthenopean +parthenophobia +parthenos +parthenosperm +parthenospore +parthian +parti +party +partial +partialed +partialise +partialised +partialising +partialism +partialist +partialistic +partiality +partialities +partialize +partially +partialness +partials +partiary +partibility +partible +particate +particeps +participability +participable +participance +participancy +participant +participantly +participants +participate +participated +participates +participating +participatingly +participation +participative +participatively +participator +participatory +participators +participatress +participial +participiality +participialization +participialize +participially +participle +participles +particle +particlecelerator +particled +particles +particular +particularisation +particularise +particularised +particulariser +particularising +particularism +particularist +particularistic +particularistically +particularity +particularities +particularization +particularize +particularized +particularizer +particularizes +particularizing +particularly +particularness +particulars +particulate +particule +partie +partied +parties +partigen +partying +partyism +partyist +partykin +partile +partyless +partim +partimembered +partimen +partimento +partymonger +parting +partings +partinium +partis +partisan +partisanism +partisanize +partisanry +partisans +partisanship +partyship +partita +partitas +partite +partition +partitional +partitionary +partitioned +partitioner +partitioning +partitionist +partitionment +partitions +partitive +partitively +partitura +partiversal +partivity +partizan +partizans +partizanship +partley +partless +partlet +partlets +partly +partner +partnered +partnering +partnerless +partners +partnership +partnerships +parto +parton +partons +partook +partridge +partridgeberry +partridgeberries +partridgelike +partridges +partridgewood +partridging +parts +partschinite +parture +parturiate +parturience +parturiency +parturient +parturifacient +parturition +parturitions +parturitive +partway +parukutu +parulis +parumbilical +parura +paruras +parure +parures +paruria +parus +parvanimity +parve +parvenu +parvenudom +parvenue +parvenuism +parvenus +parvicellular +parviflorous +parvifoliate +parvifolious +parvipotent +parvirostrate +parvis +parviscient +parvise +parvises +parvitude +parvolin +parvoline +parvolins +parvule +parvuli +parvulus +pas +pasadena +pasan +pasang +pascal +pasch +pascha +paschal +paschalist +paschals +paschaltide +paschflower +paschite +pascoite +pascola +pascuage +pascual +pascuous +pase +pasear +pasela +paseng +paseo +paseos +pases +pasewa +pasgarde +pash +pasha +pashadom +pashadoms +pashalic +pashalics +pashalik +pashaliks +pashas +pashaship +pashed +pashes +pashim +pashing +pashka +pashm +pashmina +pashto +pasi +pasigraphy +pasigraphic +pasigraphical +pasilaly +pasillo +pasiphae +pasis +pasitelean +pask +pasmo +paso +paspalum +pasqueflower +pasquil +pasquilant +pasquiler +pasquilic +pasquillant +pasquiller +pasquillic +pasquils +pasquin +pasquinade +pasquinaded +pasquinader +pasquinades +pasquinading +pasquinian +pasquino +pass +passable +passableness +passably +passacaglia +passacaglio +passade +passades +passado +passadoes +passados +passage +passageable +passaged +passager +passages +passageway +passageways +passaggi +passaggio +passagian +passaging +passagio +passay +passalid +passalidae +passalus +passamaquoddy +passament +passamezzo +passangrahan +passant +passaree +passata +passback +passband +passbands +passbook +passbooks +passe +passed +passee +passegarde +passel +passels +passemeasure +passement +passemented +passementerie +passementing +passemezzo +passen +passenger +passengers +passepied +passer +passerby +passeres +passeriform +passeriformes +passerina +passerine +passerines +passers +passersby +passes +passewa +passgang +passibility +passible +passibleness +passiflora +passifloraceae +passifloraceous +passiflorales +passim +passymeasure +passimeter +passing +passingly +passingness +passings +passion +passional +passionary +passionaries +passionate +passionately +passionateness +passionative +passionato +passioned +passionflower +passionfruit +passionful +passionfully +passionfulness +passionist +passionless +passionlessly +passionlessness +passionlike +passionometer +passionproof +passions +passiontide +passionwise +passionwort +passir +passival +passivate +passivation +passive +passively +passiveness +passives +passivism +passivist +passivity +passkey +passkeys +passless +passman +passo +passometer +passout +passover +passoverish +passovers +passpenny +passport +passportless +passports +passsaging +passu +passulate +passulation +passus +passuses +passway +passwoman +password +passwords +passworts +past +pasta +pastas +paste +pasteboard +pasteboardy +pasteboards +pasted +pastedness +pastedown +pastel +pastelist +pastelists +pastellist +pastellists +pastels +paster +pasterer +pastern +pasterned +pasterns +pasters +pastes +pasteup +pasteur +pasteurella +pasteurellae +pasteurellas +pasteurelleae +pasteurellosis +pasteurian +pasteurisation +pasteurise +pasteurised +pasteurising +pasteurism +pasteurization +pasteurize +pasteurized +pasteurizer +pasteurizers +pasteurizes +pasteurizing +pasty +pasticcci +pasticci +pasticcio +pasticcios +pastiche +pastiches +pasticheur +pasticheurs +pasticheuse +pasticheuses +pastier +pasties +pastiest +pastil +pastile +pastiled +pastiling +pastille +pastilled +pastilles +pastilling +pastils +pastime +pastimer +pastimes +pastina +pastinaca +pastinas +pastiness +pasting +pastis +pastler +pastness +pastnesses +pastophor +pastophorion +pastophorium +pastophorus +pastor +pastora +pastorage +pastoral +pastorale +pastoraled +pastorales +pastorali +pastoraling +pastoralisation +pastoralism +pastoralist +pastorality +pastoralization +pastoralize +pastoralized +pastoralizing +pastorally +pastoralness +pastorals +pastorate +pastorates +pastored +pastorela +pastoress +pastorhood +pastoring +pastorised +pastorising +pastorita +pastorium +pastoriums +pastorize +pastorless +pastorly +pastorlike +pastorling +pastors +pastorship +pastose +pastosity +pastour +pastourelle +pastrami +pastramis +pastry +pastrycook +pastries +pastryman +pastromi +pastromis +pasts +pasturability +pasturable +pasturage +pastural +pasture +pastured +pastureland +pastureless +pasturer +pasturers +pastures +pasturewise +pasturing +pasul +pat +pata +pataca +patacao +patacas +patache +pataco +patacoon +patagia +patagial +patagiate +patagium +patagon +patagones +patagonia +patagonian +pataka +patamar +patamars +patana +patand +patao +patapat +pataque +pataria +patarin +patarine +patarinism +patart +patas +patashte +patata +patavian +patavinity +patball +patballer +patch +patchable +patchboard +patchcock +patched +patcher +patchery +patcheries +patchers +patches +patchhead +patchy +patchier +patchiest +patchily +patchiness +patching +patchleaf +patchless +patchouli +patchouly +patchstand +patchwise +patchword +patchwork +patchworky +patd +pate +pated +patee +patefaction +patefy +patel +patella +patellae +patellar +patellaroid +patellas +patellate +patellidae +patellidan +patelliform +patelline +patellofemoral +patelloid +patellula +patellulae +patellulate +paten +patency +patencies +patener +patens +patent +patentability +patentable +patentably +patente +patented +patentee +patentees +patenter +patenters +patenting +patently +patentness +patentor +patentors +patents +pater +patera +paterae +patercove +paterero +paterfamiliar +paterfamiliarly +paterfamilias +paterfamiliases +pateria +pateriform +paterissa +paternal +paternalism +paternalist +paternalistic +paternalistically +paternality +paternalize +paternally +paternalness +paternity +paternities +paternoster +paternosterer +paternosters +paters +pates +patesi +patesiate +patetico +patgia +path +pathan +pathbreaker +pathed +pathema +pathematic +pathematically +pathematology +pathenogenicity +pathetic +pathetical +pathetically +patheticalness +patheticate +patheticly +patheticness +pathetism +pathetist +pathetize +pathfarer +pathfind +pathfinder +pathfinders +pathfinding +pathy +pathic +pathicism +pathless +pathlessness +pathlet +pathment +pathname +pathnames +pathoanatomy +pathoanatomical +pathobiology +pathobiological +pathobiologist +pathochemistry +pathocure +pathodontia +pathoformic +pathogen +pathogene +pathogeneses +pathogenesy +pathogenesis +pathogenetic +pathogeny +pathogenic +pathogenically +pathogenicity +pathogenous +pathogens +pathogerm +pathogermic +pathognomy +pathognomic +pathognomical +pathognomonic +pathognomonical +pathognomonically +pathognostic +pathography +pathographic +pathographical +pathol +patholysis +patholytic +pathology +pathologic +pathological +pathologically +pathologicoanatomic +pathologicoanatomical +pathologicoclinical +pathologicohistological +pathologicopsychological +pathologies +pathologist +pathologists +pathomania +pathometabolism +pathometer +pathomimesis +pathomimicry +pathomorphology +pathomorphologic +pathomorphological +pathoneurosis +pathonomy +pathonomia +pathophysiology +pathophysiologic +pathophysiological +pathophobia +pathophoresis +pathophoric +pathophorous +pathoplastic +pathoplastically +pathopoeia +pathopoiesis +pathopoietic +pathopsychology +pathopsychosis +pathoradiography +pathos +pathoses +pathosis +pathosocial +pathrusim +paths +pathway +pathwayed +pathways +paty +patia +patible +patibulary +patibulate +patibulated +patience +patiences +patiency +patient +patienter +patientest +patientless +patiently +patientness +patients +patin +patina +patinae +patinaed +patinas +patinate +patinated +patination +patine +patined +patines +patining +patinize +patinized +patinous +patins +patio +patios +patise +patisserie +patisseries +patissier +patly +patmian +patmos +patness +patnesses +patnidar +pato +patois +patola +patonce +patresfamilias +patria +patriae +patrial +patriarch +patriarchal +patriarchalism +patriarchally +patriarchate +patriarchates +patriarchdom +patriarched +patriarchess +patriarchy +patriarchic +patriarchical +patriarchically +patriarchies +patriarchism +patriarchist +patriarchs +patriarchship +patrice +patrices +patricia +patrician +patricianhood +patricianism +patricianly +patricians +patricianship +patriciate +patricidal +patricide +patricides +patricio +patrick +patriclan +patriclinous +patrico +patridge +patrilateral +patrilineage +patrilineal +patrilineally +patrilinear +patrilinearly +patriliny +patrilinies +patrilocal +patrilocality +patrimony +patrimonial +patrimonially +patrimonies +patrimonium +patrin +patriofelis +patriolatry +patriot +patrioteer +patriotess +patriotic +patriotical +patriotically +patriotics +patriotism +patriotly +patriots +patriotship +patripassian +patripassianism +patripassianist +patripassianly +patripotestal +patrisib +patrist +patristic +patristical +patristically +patristicalness +patristicism +patristics +patrix +patrixes +patrizate +patrization +patrocinate +patrocinium +patrocliny +patroclinic +patroclinous +patroclus +patrogenesis +patroiophobia +patrol +patrole +patrolled +patroller +patrollers +patrolling +patrollotism +patrolman +patrolmen +patrology +patrologic +patrological +patrologies +patrologist +patrols +patrolwoman +patrolwomen +patron +patronage +patronal +patronate +patrondom +patroness +patronesses +patronessship +patronym +patronymy +patronymic +patronymically +patronymics +patronisable +patronise +patronised +patroniser +patronising +patronisingly +patronite +patronizable +patronization +patronize +patronized +patronizer +patronizers +patronizes +patronizing +patronizingly +patronless +patronly +patronne +patronomatology +patrons +patronship +patroon +patroonry +patroons +patroonship +patroullart +patruity +pats +patsy +patsies +patt +patta +pattable +pattamar +pattamars +pattara +patte +patted +pattee +patten +pattened +pattener +pattens +patter +pattered +patterer +patterers +pattering +patterings +patterist +pattern +patternable +patterned +patterner +patterny +patterning +patternize +patternless +patternlike +patternmaker +patternmaking +patterns +patternwise +patters +patty +pattidari +pattie +patties +patting +pattinsonize +pattypan +pattypans +pattle +pattoo +pattu +patu +patuca +patulent +patulin +patulous +patulously +patulousness +patuxent +patwari +patwin +pau +paua +paucal +pauciarticulate +pauciarticulated +paucidentate +paucify +pauciflorous +paucifoliate +paucifolious +paucijugate +paucilocular +pauciloquent +pauciloquently +pauciloquy +paucinervate +paucipinnate +pauciplicate +pauciradiate +pauciradiated +paucispiral +paucispirated +paucity +paucities +paucitypause +paughty +pauky +paukpan +paul +paula +paular +pauldron +pauldrons +pauliad +paulian +paulianist +pauliccian +paulician +paulicianism +paulie +paulin +paulina +pauline +paulinia +paulinian +paulinism +paulinist +paulinistic +paulinistically +paulinity +paulinize +paulins +paulinus +paulism +paulist +paulista +paulite +paulopast +paulopost +paulospore +paulownia +paulus +paumari +paunch +paunche +paunched +paunches +paunchful +paunchy +paunchier +paunchiest +paunchily +paunchiness +paup +pauper +pauperage +pauperate +pauperdom +paupered +pauperess +paupering +pauperis +pauperisation +pauperise +pauperised +pauperiser +pauperising +pauperism +pauperitic +pauperization +pauperize +pauperized +pauperizer +pauperizes +pauperizing +paupers +pauraque +paurometabola +paurometaboly +paurometabolic +paurometabolism +paurometabolous +pauropod +pauropoda +pauropodous +pausably +pausai +pausal +pausalion +pausation +pause +paused +pauseful +pausefully +pauseless +pauselessly +pausement +pauser +pausers +pauses +pausing +pausingly +paussid +paussidae +paut +pauxi +pav +pavade +pavage +pavan +pavane +pavanes +pavanne +pavans +pave +paved +paveed +pavement +pavemental +pavements +paven +paver +pavers +paves +pavestone +pavetta +pavy +pavia +pavid +pavidity +pavier +pavies +pavilion +pavilioned +pavilioning +pavilions +pavillon +pavin +paving +pavings +pavins +pavior +paviors +paviotso +paviour +paviours +pavis +pavisade +pavisado +pavise +paviser +pavisers +pavises +pavisor +pavisse +pavlov +pavlovian +pavo +pavois +pavonated +pavonazzetto +pavonazzo +pavoncella +pavone +pavonia +pavonian +pavonine +pavonize +paw +pawaw +pawdite +pawed +pawer +pawers +pawing +pawk +pawkery +pawky +pawkier +pawkiest +pawkily +pawkiness +pawkrie +pawl +pawls +pawmark +pawn +pawnable +pawnage +pawnages +pawnbroker +pawnbrokerage +pawnbrokeress +pawnbrokery +pawnbrokering +pawnbrokers +pawnbroking +pawned +pawnee +pawnees +pawner +pawners +pawnie +pawning +pawnor +pawnors +pawns +pawnshop +pawnshops +pawpaw +pawpaws +paws +pawtucket +pax +paxes +paxilla +paxillae +paxillar +paxillary +paxillate +paxilli +paxilliferous +paxilliform +paxillosa +paxillose +paxillus +paxiuba +paxwax +paxwaxes +pazaree +pazend +pbx +pbxes +pc +pcf +pci +pcm +pct +pd +pdl +pdn +pdq +pe +pea +peaberry +peabird +peabody +peabrain +peabush +peace +peaceable +peaceableness +peaceably +peacebreaker +peacebreaking +peaced +peaceful +peacefuller +peacefullest +peacefully +peacefulness +peacekeeper +peacekeepers +peacekeeping +peaceless +peacelessness +peacelike +peacemake +peacemaker +peacemakers +peacemaking +peaceman +peacemonger +peacemongering +peacenik +peaces +peacetime +peach +peachberry +peachbloom +peachblossom +peachblow +peached +peachen +peacher +peachery +peachers +peaches +peachy +peachick +peachier +peachiest +peachify +peachiness +peaching +peachlet +peachlike +peachwood +peachwort +peacing +peacoat +peacoats +peacock +peacocked +peacockery +peacocky +peacockier +peacockiest +peacocking +peacockish +peacockishly +peacockishness +peacockism +peacockly +peacocklike +peacocks +peacockwise +peacod +peafowl +peafowls +peag +peage +peages +peagoose +peags +peahen +peahens +peai +peaiism +peak +peaked +peakedly +peakedness +peaker +peakgoose +peaky +peakier +peakiest +peakyish +peakily +peakiness +peaking +peakish +peakishly +peakishness +peakless +peaklike +peaks +peakward +peal +pealed +pealer +pealike +pealing +peals +peamouth +peamouths +pean +peans +peanut +peanuts +peapod +pear +pearce +pearceite +pearch +pearl +pearlash +pearlashes +pearlberry +pearlbird +pearlbush +pearled +pearleye +pearleyed +pearleyes +pearler +pearlers +pearlescence +pearlescent +pearlet +pearlfish +pearlfishes +pearlfruit +pearly +pearlier +pearliest +pearlike +pearlin +pearliness +pearling +pearlings +pearlish +pearlite +pearlites +pearlitic +pearlized +pearloyster +pearls +pearlsides +pearlspar +pearlstone +pearlweed +pearlwort +pearmain +pearmains +pearmonger +pears +peart +pearten +pearter +peartest +peartly +peartness +pearwood +peas +peasant +peasantess +peasanthood +peasantism +peasantize +peasantly +peasantlike +peasantry +peasants +peasantship +peascod +peascods +pease +peasecod +peasecods +peaselike +peasen +peases +peaseweep +peashooter +peasy +peason +peasouper +peastake +peastaking +peastick +peasticking +peastone +peat +peatery +peathouse +peaty +peatier +peatiest +peatman +peatmen +peats +peatship +peatstack +peatweed +peatwood +peauder +peavey +peaveys +peavy +peavie +peavies +peavine +peba +peban +pebble +pebbled +pebblehearted +pebbles +pebblestone +pebbleware +pebbly +pebblier +pebbliest +pebbling +pebrine +pebrinous +pecan +pecans +peccability +peccable +peccadillo +peccadilloes +peccadillos +peccancy +peccancies +peccant +peccantly +peccantness +peccary +peccaries +peccation +peccatiphobia +peccatophobia +peccavi +peccavis +pech +pechay +pechan +pechans +peched +pechili +peching +pechys +pechs +pecht +pecify +pecite +peck +peckage +pecked +pecker +peckers +peckerwood +pecket +peckful +peckhamite +pecky +peckier +peckiest +peckiness +pecking +peckish +peckishly +peckishness +peckle +peckled +peckly +pecks +pecksniff +pecksniffery +pecksniffian +pecksniffianism +pecksniffism +pecopteris +pecopteroid +pecora +pecorino +pecos +pectase +pectases +pectate +pectates +pecten +pectens +pectic +pectin +pectinacea +pectinacean +pectinaceous +pectinal +pectinase +pectinate +pectinated +pectinately +pectinatella +pectination +pectinatodenticulate +pectinatofimbricate +pectinatopinnate +pectineal +pectines +pectinesterase +pectineus +pectinibranch +pectinibranchia +pectinibranchian +pectinibranchiata +pectinibranchiate +pectinic +pectinid +pectinidae +pectiniferous +pectiniform +pectinirostrate +pectinite +pectinogen +pectinoid +pectinose +pectinous +pectins +pectizable +pectization +pectize +pectized +pectizes +pectizing +pectocellulose +pectolite +pectora +pectoral +pectorales +pectoralgia +pectoralis +pectoralist +pectorally +pectorals +pectoriloque +pectoriloquy +pectoriloquial +pectoriloquism +pectoriloquous +pectoris +pectosase +pectose +pectosic +pectosinase +pectous +pectron +pectunculate +pectunculus +pectus +peculate +peculated +peculates +peculating +peculation +peculations +peculator +peculators +peculia +peculiar +peculiarise +peculiarised +peculiarising +peculiarism +peculiarity +peculiarities +peculiarization +peculiarize +peculiarized +peculiarizing +peculiarly +peculiarness +peculiars +peculiarsome +peculium +pecunia +pecunial +pecuniary +pecuniarily +pecuniosity +pecunious +ped +peda +pedage +pedagese +pedagog +pedagogal +pedagogery +pedagogy +pedagogyaled +pedagogic +pedagogical +pedagogically +pedagogics +pedagogies +pedagogying +pedagogish +pedagogism +pedagogist +pedagogs +pedagogue +pedagoguery +pedagogues +pedagoguish +pedagoguism +pedal +pedaled +pedaler +pedalfer +pedalferic +pedalfers +pedaliaceae +pedaliaceous +pedalian +pedalier +pedaliers +pedaling +pedalion +pedalism +pedalist +pedaliter +pedality +pedalium +pedalled +pedaller +pedalling +pedalo +pedals +pedanalysis +pedant +pedante +pedantesque +pedantess +pedanthood +pedantic +pedantical +pedantically +pedanticalness +pedanticism +pedanticly +pedanticness +pedantics +pedantism +pedantize +pedantocracy +pedantocrat +pedantocratic +pedantry +pedantries +pedants +pedary +pedarian +pedata +pedate +pedated +pedately +pedatifid +pedatiform +pedatilobate +pedatilobed +pedatinerved +pedatipartite +pedatisect +pedatisected +pedatrophy +pedatrophia +pedder +peddlar +peddle +peddled +peddler +peddleress +peddlery +peddleries +peddlerism +peddlers +peddles +peddling +peddlingly +pedee +pedelion +pederast +pederasty +pederastic +pederastically +pederasties +pederasts +pederero +pedes +pedeses +pedesis +pedestal +pedestaled +pedestaling +pedestalled +pedestalling +pedestals +pedestrial +pedestrially +pedestrian +pedestrianate +pedestrianise +pedestrianised +pedestrianising +pedestrianism +pedestrianize +pedestrianized +pedestrianizing +pedestrians +pedestrious +pedetentous +pedetes +pedetic +pedetidae +pedetinae +pediad +pediadontia +pediadontic +pediadontist +pedial +pedialgia +pediastrum +pediatry +pediatric +pediatrician +pediatricians +pediatrics +pediatrist +pedicab +pedicabs +pedicel +pediceled +pedicellar +pedicellaria +pedicellate +pedicellated +pedicellation +pedicelled +pedicelliform +pedicellina +pedicellus +pedicels +pedicle +pedicled +pedicles +pedicular +pedicularia +pedicularis +pediculate +pediculated +pediculati +pediculation +pedicule +pediculi +pediculicidal +pediculicide +pediculid +pediculidae +pediculina +pediculine +pediculofrontal +pediculoid +pediculoparietal +pediculophobia +pediculosis +pediculous +pediculus +pedicure +pedicured +pedicures +pedicuring +pedicurism +pedicurist +pedicurists +pediferous +pediform +pedigerous +pedigraic +pedigree +pedigreed +pedigreeless +pedigrees +pediluvium +pedimana +pedimane +pedimanous +pediment +pedimental +pedimented +pediments +pedimentum +pediococci +pediococcocci +pediococcus +pedioecetes +pedion +pedionomite +pedionomus +pedipalp +pedipalpal +pedipalpate +pedipalpi +pedipalpida +pedipalpous +pedipalps +pedipalpus +pedipulate +pedipulation +pedipulator +pediwak +pedlar +pedlary +pedlaries +pedlars +pedler +pedlery +pedleries +pedlers +pedobaptism +pedobaptist +pedocal +pedocalcic +pedocalic +pedocals +pedodontia +pedodontic +pedodontist +pedodontology +pedogenesis +pedogenetic +pedogenic +pedograph +pedology +pedologic +pedological +pedologies +pedologist +pedologistical +pedologistically +pedomancy +pedomania +pedometer +pedometers +pedometric +pedometrical +pedometrically +pedometrician +pedometrist +pedomorphic +pedomorphism +pedomotive +pedomotor +pedophile +pedophilia +pedophiliac +pedophilic +pedophobia +pedosphere +pedospheric +pedotribe +pedotrophy +pedotrophic +pedotrophist +pedrail +pedregal +pedrero +pedro +pedros +peds +pedule +pedum +peduncle +peduncled +peduncles +peduncular +pedunculata +pedunculate +pedunculated +pedunculation +pedunculi +pedunculus +pee +peebeen +peebeens +peebles +peed +peeing +peek +peekaboo +peekaboos +peeke +peeked +peeking +peeks +peel +peelable +peelcrow +peele +peeled +peeledness +peeler +peelers +peelhouse +peeling +peelings +peelism +peelite +peelman +peels +peen +peened +peenge +peening +peens +peeoy +peep +peeped +peepeye +peeper +peepers +peephole +peepholes +peepy +peeping +peeps +peepshow +peepshows +peepul +peepuls +peer +peerage +peerages +peerdom +peered +peeress +peeresses +peerhood +peery +peerie +peeries +peering +peeringly +peerless +peerlessly +peerlessness +peerly +peerling +peers +peership +peert +pees +peesash +peeseweep +peesoreh +peesweep +peesweeps +peetweet +peetweets +peeve +peeved +peevedly +peevedness +peever +peevers +peeves +peeving +peevish +peevishly +peevishness +peewee +peeweep +peewees +peewit +peewits +peg +pega +pegador +pegall +pegamoid +peganite +peganum +pegasean +pegasian +pegasid +pegasidae +pegasoid +pegasus +pegboard +pegboards +pegbox +pegboxes +pegged +pegger +peggy +peggymast +pegging +peggle +pegh +peglegged +pegless +peglet +peglike +pegma +pegman +pegmatite +pegmatitic +pegmatization +pegmatize +pegmatoid +pegmatophyre +pegmen +pegology +pegomancy +pegoxyl +pegroots +pegs +pegtops +peguan +pegwood +peh +pehlevi +peho +pehuenche +peyerian +peignoir +peignoirs +peiktha +pein +peine +peined +peining +peins +peyote +peyotes +peyotyl +peyotyls +peyotism +peyotl +peyotls +peiping +peirameter +peirastic +peirastically +peisage +peisant +peise +peised +peiser +peises +peising +peitho +peyton +peytral +peytrals +peitrel +peytrel +peytrels +peixere +peixerey +peize +pejerrey +pejorate +pejoration +pejorationist +pejorative +pejoratively +pejoratives +pejorism +pejorist +pejority +pekan +pekans +peke +pekes +pekin +pekinese +peking +pekingese +pekins +pekoe +pekoes +pelade +peladic +pelado +peladore +pelage +pelages +pelagial +pelagian +pelagianism +pelagianize +pelagianizer +pelagic +pelagothuria +pelagra +pelamyd +pelanos +pelargi +pelargic +pelargikon +pelargomorph +pelargomorphae +pelargomorphic +pelargonate +pelargonic +pelargonidin +pelargonin +pelargonium +pelasgi +pelasgian +pelasgic +pelasgikon +pelasgoi +pele +pelean +pelecan +pelecani +pelecanidae +pelecaniformes +pelecanoides +pelecanoidinae +pelecanus +pelecypod +pelecypoda +pelecypodous +pelecoid +pelelith +peleliu +peleng +pelerin +pelerine +pelerines +peles +peletre +peleus +pelew +pelf +pelfs +pelham +pelias +pelican +pelicanry +pelicans +pelick +pelycogram +pelycography +pelycology +pelicometer +pelycometer +pelycometry +pelycosaur +pelycosauria +pelycosaurian +pelides +pelidnota +pelikai +pelike +peliom +pelioma +peliosis +pelisse +pelisses +pelite +pelites +pelitic +pell +pellaea +pellage +pellagra +pellagragenic +pellagras +pellagric +pellagrin +pellagroid +pellagrose +pellagrous +pellar +pellard +pellas +pellate +pellation +pellekar +peller +pellet +pelletal +pelleted +pellety +pelletierine +pelleting +pelletization +pelletize +pelletized +pelletizer +pelletizes +pelletizing +pelletlike +pellets +pellian +pellicle +pellicles +pellicula +pellicular +pellicularia +pelliculate +pellicule +pellile +pellitory +pellitories +pellmell +pellmells +pellock +pellotin +pellotine +pellucent +pellucid +pellucidity +pellucidly +pellucidness +pelmanism +pelmanist +pelmanize +pelmata +pelmatic +pelmatogram +pelmatozoa +pelmatozoan +pelmatozoic +pelmet +pelobates +pelobatid +pelobatidae +pelobatoid +pelodytes +pelodytid +pelodytidae +pelodytoid +peloid +pelomedusa +pelomedusid +pelomedusidae +pelomedusoid +pelomyxa +pelon +pelopaeus +pelopea +pelopid +pelopidae +peloponnesian +pelops +peloria +pelorian +pelorias +peloriate +peloric +pelorism +pelorization +pelorize +pelorized +pelorizing +pelorus +peloruses +pelota +pelotas +pelotherapy +peloton +pelt +pelta +peltae +peltandra +peltast +peltasts +peltate +peltated +peltately +peltatifid +peltation +peltatodigitate +pelted +pelter +pelterer +pelters +peltiferous +peltifolious +peltiform +peltigera +peltigeraceae +peltigerine +peltigerous +peltinervate +peltinerved +pelting +peltingly +peltish +peltless +peltmonger +peltogaster +peltry +peltries +pelts +pelu +peludo +pelure +pelusios +pelveoperitonitis +pelves +pelvetia +pelvic +pelvics +pelviform +pelvigraph +pelvigraphy +pelvimeter +pelvimetry +pelvimetric +pelviolithotomy +pelvioperitonitis +pelvioplasty +pelvioradiography +pelvioscopy +pelviotomy +pelviperitonitis +pelvirectal +pelvis +pelvisacral +pelvises +pelvisternal +pelvisternum +pembina +pembinas +pembroke +pemican +pemicans +pemmican +pemmicanization +pemmicanize +pemmicans +pemoline +pemolines +pemphigoid +pemphigous +pemphigus +pemphix +pemphixes +pen +penacute +penaea +penaeaceae +penaeaceous +penal +penalisable +penalisation +penalise +penalised +penalises +penalising +penalist +penality +penalities +penalizable +penalization +penalize +penalized +penalizes +penalizing +penally +penalty +penalties +penance +penanced +penanceless +penancer +penances +penancy +penancing +penang +penangs +penannular +penaria +penates +penbard +pencatite +pence +pencey +pencel +penceless +pencels +penchant +penchants +penche +penchute +pencil +penciled +penciler +pencilers +penciliform +penciling +pencilled +penciller +pencillike +pencilling +pencilry +pencils +pencilwood +penclerk +pencraft +pend +penda +pendant +pendanted +pendanting +pendantlike +pendants +pendative +pendecagon +pended +pendeloque +pendency +pendencies +pendens +pendent +pendente +pendentive +pendently +pendents +pendicle +pendicler +pending +pendle +pendn +pendom +pendragon +pendragonish +pendragonship +pends +pendulant +pendular +pendulate +pendulating +pendulation +pendule +penduline +pendulosity +pendulous +pendulously +pendulousness +pendulum +pendulumlike +pendulums +penecontemporaneous +penectomy +peneid +penelope +penelopean +penelophon +penelopinae +penelopine +peneplain +peneplains +peneplanation +peneplane +penes +peneseismic +penest +penetrability +penetrable +penetrableness +penetrably +penetral +penetralia +penetralian +penetrameter +penetrance +penetrancy +penetrant +penetrate +penetrated +penetrates +penetrating +penetratingly +penetratingness +penetration +penetrations +penetrative +penetratively +penetrativeness +penetrativity +penetrator +penetrators +penetrology +penetrolqgy +penetrometer +penfieldite +penfold +penful +peng +penghulu +pengo +pengos +penguin +penguinery +penguins +pengun +penhead +penholder +penial +peniaphobia +penible +penicil +penicilium +penicillate +penicillated +penicillately +penicillation +penicillia +penicilliform +penicillin +penicillinic +penicillium +penicils +penide +penile +penillion +peninsula +peninsular +peninsularism +peninsularity +peninsulas +peninsulate +penintime +peninvariant +penis +penises +penistone +penitence +penitencer +penitency +penitent +penitentes +penitential +penitentially +penitentials +penitentiary +penitentiaries +penitentiaryship +penitently +penitents +penitis +penk +penkeeper +penknife +penknives +penlight +penlights +penlike +penlite +penlites +penlop +penmaker +penmaking +penman +penmanship +penmaster +penmen +penna +pennaceous +pennacook +pennae +pennage +pennales +penname +pennames +pennant +pennants +pennaria +pennariidae +pennatae +pennate +pennated +pennatifid +pennatilobate +pennatipartite +pennatisect +pennatisected +pennatula +pennatulacea +pennatulacean +pennatulaceous +pennatularian +pennatulid +pennatulidae +pennatuloid +penned +penneech +penneeck +penney +penner +penners +pennet +penni +penny +pennia +pennybird +pennycress +pennyearth +pennied +pennies +penniferous +pennyflower +penniform +pennigerous +pennyhole +pennyland +pennyleaf +penniless +pennilessly +pennilessness +pennill +pennine +penninervate +penninerved +pennines +penning +penninite +pennipotent +pennyroyal +pennyroyals +pennyrot +pennis +pennisetum +pennysiller +pennystone +penniveined +pennyweight +pennyweights +pennywhistle +pennywinkle +pennywise +pennywort +pennyworth +pennyworths +pennon +pennoncel +pennoncelle +pennoned +pennons +pennopluma +pennoplume +pennorth +pennsylvania +pennsylvanian +pennsylvanians +pennsylvanicus +pennuckle +penobscot +penoche +penoches +penochi +penology +penologic +penological +penologies +penologist +penologists +penoncel +penoncels +penorcon +penoun +penpoint +penpoints +penpusher +penrack +penroseite +pens +pensacola +penscript +pense +pensee +pensees +penseful +pensefulness +penseroso +penship +pensy +pensil +pensile +pensileness +pensility +pensils +pension +pensionable +pensionably +pensionary +pensionaries +pensionat +pensione +pensioned +pensioner +pensioners +pensionership +pensiones +pensioning +pensionless +pensionnaire +pensionnat +pensionry +pensions +pensive +pensived +pensively +pensiveness +penstemon +penster +pensters +penstick +penstock +penstocks +pensum +pent +penta +pentabasic +pentabromide +pentacapsular +pentacarbon +pentacarbonyl +pentacarpellary +pentace +pentacetate +pentachenium +pentachloride +pentachlorophenol +pentachord +pentachromic +pentacyanic +pentacyclic +pentacid +pentacle +pentacles +pentacoccous +pentacontane +pentacosane +pentacrinidae +pentacrinite +pentacrinoid +pentacrinus +pentacron +pentacrostic +pentactinal +pentactine +pentacular +pentad +pentadactyl +pentadactyla +pentadactylate +pentadactyle +pentadactylism +pentadactyloid +pentadecagon +pentadecahydrate +pentadecahydrated +pentadecane +pentadecatoic +pentadecyl +pentadecylic +pentadecoic +pentadelphous +pentadic +pentadicity +pentadiene +pentadodecahedron +pentadrachm +pentadrachma +pentads +pentaerythrite +pentaerythritol +pentafid +pentafluoride +pentagamist +pentagyn +pentagynia +pentagynian +pentagynous +pentaglossal +pentaglot +pentaglottical +pentagon +pentagonal +pentagonally +pentagonohedron +pentagonoid +pentagonon +pentagons +pentagram +pentagrammatic +pentagrid +pentahalide +pentahedra +pentahedral +pentahedrical +pentahedroid +pentahedron +pentahedrous +pentahexahedral +pentahexahedron +pentahydrate +pentahydrated +pentahydric +pentahydroxy +pentail +pentaiodide +pentalobate +pentalogy +pentalogies +pentalogue +pentalpha +pentamera +pentameral +pentameran +pentamery +pentamerid +pentameridae +pentamerism +pentameroid +pentamerous +pentamerus +pentameter +pentameters +pentamethylene +pentamethylenediamine +pentametrist +pentametrize +pentander +pentandria +pentandrian +pentandrous +pentane +pentanedione +pentanes +pentangle +pentangular +pentanitrate +pentanoic +pentanolide +pentanone +pentapeptide +pentapetalous +pentaphylacaceae +pentaphylacaceous +pentaphylax +pentaphyllous +pentaploid +pentaploidy +pentaploidic +pentapody +pentapodic +pentapodies +pentapolis +pentapolitan +pentaprism +pentapterous +pentaptych +pentaptote +pentaquin +pentaquine +pentarch +pentarchy +pentarchical +pentarchies +pentarchs +pentasepalous +pentasilicate +pentasyllabic +pentasyllabism +pentasyllable +pentaspermous +pentaspheric +pentaspherical +pentastich +pentastichy +pentastichous +pentastyle +pentastylos +pentastom +pentastome +pentastomida +pentastomoid +pentastomous +pentastomum +pentasulphide +pentateuch +pentateuchal +pentathionate +pentathionic +pentathlete +pentathlon +pentathlons +pentathlos +pentatomic +pentatomid +pentatomidae +pentatomoidea +pentatone +pentatonic +pentatriacontane +pentatron +pentavalence +pentavalency +pentavalent +pentazocine +penteconter +pentecontoglossal +pentecost +pentecostal +pentecostalism +pentecostalist +pentecostals +pentecostarion +pentecoster +pentecostys +pentelic +pentelican +pentene +penteteric +penthemimer +penthemimeral +penthemimeris +penthestes +penthiophen +penthiophene +penthoraceae +penthorum +penthouse +penthoused +penthouselike +penthouses +penthousing +penthrit +penthrite +pentice +penticle +pentyl +pentylene +pentylenetetrazol +pentylic +pentylidene +pentyls +pentimenti +pentimento +pentine +pentyne +pentiodide +pentit +pentite +pentitol +pentlandite +pentobarbital +pentobarbitone +pentode +pentoic +pentol +pentolite +pentomic +pentosan +pentosane +pentosans +pentose +pentoses +pentosid +pentoside +pentosuria +pentothal +pentoxide +pentremital +pentremite +pentremites +pentremitidae +pentrit +pentrite +pentrough +pentstemon +pentstock +penttail +pentzia +penuche +penuches +penuchi +penuchis +penuchle +penuchles +penuckle +penuckles +penult +penultim +penultima +penultimate +penultimately +penultimatum +penults +penumbra +penumbrae +penumbral +penumbras +penumbrous +penup +penury +penuries +penurious +penuriously +penuriousness +penutian +penwiper +penwoman +penwomanship +penwomen +penworker +penwright +peon +peonage +peonages +peones +peony +peonies +peonism +peonisms +peonize +peons +people +peopled +peopledom +peoplehood +peopleize +peopleless +peoplement +peopler +peoplers +peoples +peoplet +peopling +peoplish +peoria +peorian +peotomy +pep +peperek +peperine +peperino +peperomia +peperoni +peperonis +pepful +pephredo +pepinella +pepino +pepinos +pepysian +pepla +pepless +peplos +peplosed +peploses +peplum +peplumed +peplums +peplus +pepluses +pepo +peponid +peponida +peponidas +peponium +peponiums +pepos +pepped +pepper +pepperbox +peppercorn +peppercorny +peppercornish +peppercorns +peppered +pepperer +pepperers +peppergrass +peppery +pepperidge +pepperily +pepperiness +peppering +pepperish +pepperishly +peppermint +pepperminty +peppermints +pepperoni +pepperproof +pepperroot +peppers +peppershrike +peppertree +pepperweed +pepperwood +pepperwort +peppy +peppier +peppiest +peppily +peppin +peppiness +pepping +peps +pepsi +pepsin +pepsinate +pepsinated +pepsinating +pepsine +pepsines +pepsinhydrochloric +pepsiniferous +pepsinogen +pepsinogenic +pepsinogenous +pepsins +pepsis +peptic +peptical +pepticity +peptics +peptid +peptidase +peptide +peptides +peptidic +peptidically +peptidoglycan +peptidolytic +peptids +peptizable +peptization +peptize +peptized +peptizer +peptizers +peptizes +peptizing +peptogaster +peptogen +peptogeny +peptogenic +peptogenous +peptohydrochloric +peptolysis +peptolytic +peptonaemia +peptonate +peptone +peptonelike +peptonemia +peptones +peptonic +peptonisation +peptonise +peptonised +peptoniser +peptonising +peptonization +peptonize +peptonized +peptonizer +peptonizing +peptonoid +peptonuria +peptotoxin +peptotoxine +pequot +per +peracarida +peracephalus +peracetate +peracetic +peracid +peracidite +peracidity +peracids +peract +peracute +peradventure +peragrate +peragration +perai +perakim +peramble +perambulant +perambulate +perambulated +perambulates +perambulating +perambulation +perambulations +perambulator +perambulatory +perambulators +perameles +peramelidae +perameline +perameloid +peramium +peratae +perates +perau +perbend +perborate +perborax +perbromide +perca +percale +percales +percaline +percarbide +percarbonate +percarbonic +percase +perceant +perceivability +perceivable +perceivableness +perceivably +perceivance +perceivancy +perceive +perceived +perceivedly +perceivedness +perceiver +perceivers +perceives +perceiving +perceivingness +percent +percentable +percentably +percentage +percentaged +percentages +percental +percenter +percentile +percentiles +percents +percentual +percentum +percept +perceptibility +perceptible +perceptibleness +perceptibly +perception +perceptional +perceptionalism +perceptionism +perceptions +perceptive +perceptively +perceptiveness +perceptivity +percepts +perceptual +perceptually +perceptum +percesoces +percesocine +perceval +perch +percha +perchable +perchance +perche +perched +percher +percheron +perchers +perches +perching +perchlorate +perchlorethane +perchlorethylene +perchloric +perchloride +perchlorinate +perchlorinated +perchlorinating +perchlorination +perchloroethane +perchloroethylene +perchloromethane +perchromate +perchromic +percy +percid +percidae +perciform +perciformes +percylite +percipi +percipience +percipiency +percipient +percival +percivale +perclose +percnosome +percoct +percoid +percoidea +percoidean +percoids +percolable +percolate +percolated +percolates +percolating +percolation +percolative +percolator +percolators +percomorph +percomorphi +percomorphous +percompound +percontation +percontatorial +percribrate +percribration +percrystallization +perculsion +perculsive +percur +percurration +percurrent +percursory +percuss +percussed +percusses +percussing +percussion +percussional +percussioner +percussionist +percussionists +percussionize +percussions +percussive +percussively +percussiveness +percussor +percutaneous +percutaneously +percutient +perdendo +perdendosi +perdy +perdicinae +perdicine +perdie +perdifoil +perdifume +perdiligence +perdiligent +perdit +perdition +perditionable +perdix +perdricide +perdrigon +perdrix +perdu +perdue +perduellion +perdues +perdurability +perdurable +perdurableness +perdurably +perdurance +perdurant +perdure +perdured +perduring +perduringly +perdus +pere +perean +peregrin +peregrina +peregrinate +peregrinated +peregrination +peregrinations +peregrinative +peregrinator +peregrinatory +peregrine +peregrinism +peregrinity +peregrinoid +peregrins +peregrinus +pereia +pereion +pereiopod +pereira +pereirine +perejonet +perempt +peremption +peremptory +peremptorily +peremptoriness +perendinant +perendinate +perendination +perendure +perennate +perennation +perennial +perenniality +perennialize +perennially +perennialness +perennials +perennibranch +perennibranchiata +perennibranchiate +perennity +perequitate +pererrate +pererration +peres +pereskia +pereundem +perezone +perf +perfay +perfect +perfecta +perfectability +perfectas +perfectation +perfected +perfectedly +perfecter +perfecters +perfectest +perfecti +perfectibilian +perfectibilism +perfectibilist +perfectibilitarian +perfectibility +perfectible +perfecting +perfection +perfectionate +perfectionation +perfectionator +perfectioner +perfectionism +perfectionist +perfectionistic +perfectionists +perfectionize +perfectionizement +perfectionizer +perfectionment +perfections +perfectism +perfectist +perfective +perfectively +perfectiveness +perfectivise +perfectivised +perfectivising +perfectivity +perfectivize +perfectly +perfectness +perfecto +perfector +perfectos +perfects +perfectuation +perfervent +perfervid +perfervidity +perfervidly +perfervidness +perfervor +perfervour +perficient +perfidy +perfidies +perfidious +perfidiously +perfidiousness +perfilograph +perfin +perfins +perfix +perflable +perflate +perflation +perfluent +perfoliate +perfoliation +perforable +perforant +perforata +perforate +perforated +perforates +perforating +perforation +perforationproof +perforations +perforative +perforator +perforatory +perforatorium +perforators +perforce +perforcedly +perform +performability +performable +performance +performances +performant +performative +performatory +performed +performer +performers +performing +performs +perfricate +perfrication +perfumatory +perfume +perfumed +perfumeless +perfumer +perfumeress +perfumery +perfumeries +perfumers +perfumes +perfumy +perfuming +perfunctionary +perfunctory +perfunctorily +perfunctoriness +perfunctorious +perfunctoriously +perfunctorize +perfuncturate +perfusate +perfuse +perfused +perfuses +perfusing +perfusion +perfusive +pergamene +pergameneous +pergamenian +pergamentaceous +pergamic +pergamyn +pergelisol +pergola +pergolas +pergunnah +perh +perhalide +perhalogen +perhaps +perhapses +perhazard +perhydroanthracene +perhydrogenate +perhydrogenation +perhydrogenize +perhydrogenized +perhydrogenizing +perhydrol +perhorresce +peri +periacinal +periacinous +periactus +periadenitis +periamygdalitis +perianal +periangiocholitis +periangioma +periangitis +perianth +perianthial +perianthium +perianths +periaortic +periaortitis +periapical +periappendicitis +periappendicular +periapt +periapts +periarctic +periareum +periarterial +periarteritis +periarthric +periarthritis +periarticular +periaster +periastra +periastral +periastron +periastrum +periatrial +periauger +periauricular +periaxial +periaxillary +periaxonal +periblast +periblastic +periblastula +periblem +periblems +periboli +periboloi +peribolos +peribolus +peribranchial +peribronchial +peribronchiolar +peribronchiolitis +peribronchitis +peribulbar +peribursal +pericaecal +pericaecitis +pericanalicular +pericapsular +pericardia +pericardiac +pericardiacophrenic +pericardial +pericardian +pericardicentesis +pericardiectomy +pericardiocentesis +pericardiolysis +pericardiomediastinitis +pericardiophrenic +pericardiopleural +pericardiorrhaphy +pericardiosymphysis +pericardiotomy +pericarditic +pericarditis +pericardium +pericardotomy +pericarp +pericarpial +pericarpic +pericarpium +pericarpoidal +pericarps +pericecal +pericecitis +pericellular +pericemental +pericementitis +pericementoclasia +pericementum +pericenter +pericentral +pericentre +pericentric +pericephalic +pericerebral +perichaete +perichaetia +perichaetial +perichaetium +perichaetous +perichdria +perichete +perichylous +pericholangitis +pericholecystitis +perichondral +perichondria +perichondrial +perichondritis +perichondrium +perichord +perichordal +perichoresis +perichorioidal +perichoroidal +perichtia +pericycle +pericyclic +pericycloid +pericyclone +pericyclonic +pericynthion +pericystic +pericystitis +pericystium +pericytial +pericladium +periclase +periclasia +periclasite +periclaustral +periclean +pericles +periclinal +periclinally +pericline +periclinium +periclitate +periclitation +pericolitis +pericolpitis +periconchal +periconchitis +pericopae +pericopal +pericope +pericopes +pericopic +pericorneal +pericowperitis +pericoxitis +pericrania +pericranial +pericranitis +pericranium +pericristate +pericu +periculant +periculous +periculum +peridendritic +peridental +peridentium +peridentoclasia +periderm +peridermal +peridermic +peridermis +peridermium +periderms +peridesm +peridesmic +peridesmitis +peridesmium +peridia +peridial +peridiastole +peridiastolic +perididymis +perididymitis +peridiiform +peridila +peridineae +peridiniaceae +peridiniaceous +peridinial +peridiniales +peridinian +peridinid +peridinidae +peridinieae +peridiniidae +peridinium +peridiola +peridiole +peridiolum +peridium +peridot +peridotic +peridotite +peridotitic +peridots +peridrome +peridromoi +peridromos +periductal +periegesis +periegetic +perielesis +periencephalitis +perienteric +perienteritis +perienteron +periependymal +periergy +periesophageal +periesophagitis +perifistular +perifoliary +perifollicular +perifolliculitis +perigangliitis +periganglionic +perigastric +perigastritis +perigastrula +perigastrular +perigastrulation +perigeal +perigean +perigee +perigees +perigemmal +perigenesis +perigenital +perigeum +perigyny +perigynial +perigynies +perigynium +perigynous +periglacial +periglandular +periglial +perigloea +periglottic +periglottis +perignathic +perigon +perigonadial +perigonal +perigone +perigonia +perigonial +perigonium +perigonnia +perigons +perigord +perigraph +perigraphic +perihelia +perihelial +perihelian +perihelion +perihelium +periheloin +perihepatic +perihepatitis +perihermenial +perihernial +perihysteric +perijejunitis +perijove +perikarya +perikaryal +perikaryon +perikronion +peril +perilabyrinth +perilabyrinthitis +perilaryngeal +perilaryngitis +periled +perilenticular +periligamentous +perilymph +perilymphangial +perilymphangitis +perilymphatic +periling +perilla +perillas +perilled +perilless +perilling +perilobar +perilous +perilously +perilousness +perils +perilsome +perilune +perilunes +perimartium +perimastitis +perimedullary +perimeningitis +perimeter +perimeterless +perimeters +perimetral +perimetry +perimetric +perimetrical +perimetrically +perimetritic +perimetritis +perimetrium +perimyelitis +perimysia +perimysial +perimysium +perimorph +perimorphic +perimorphism +perimorphous +perinaeum +perinatal +perinde +perine +perinea +perineal +perineocele +perineoplasty +perineoplastic +perineorrhaphy +perineoscrotal +perineosynthesis +perineostomy +perineotomy +perineovaginal +perineovulvar +perinephral +perinephria +perinephrial +perinephric +perinephritic +perinephritis +perinephrium +perineptunium +perineum +perineural +perineuria +perineurial +perineurical +perineuritis +perineurium +perinium +perinuclear +periocular +period +periodate +periodic +periodical +periodicalism +periodicalist +periodicalize +periodically +periodicalness +periodicals +periodicity +periodid +periodide +periodids +periodization +periodize +periodogram +periodograph +periodology +periodontal +periodontally +periodontia +periodontic +periodontics +periodontist +periodontitis +periodontium +periodontoclasia +periodontology +periodontologist +periodontoses +periodontosis +periodontum +periodoscope +periods +perioeci +perioecians +perioecic +perioecid +perioecus +perioesophageal +perioikoi +periomphalic +perionychia +perionychium +perionyx +perionyxis +perioophoritis +periophthalmic +periophthalmitis +periople +perioplic +perioptic +perioptometry +perioque +perioral +periorbit +periorbita +periorbital +periorchitis +periost +periostea +periosteal +periosteally +periosteitis +periosteoalveolar +periosteoma +periosteomedullitis +periosteomyelitis +periosteophyte +periosteorrhaphy +periosteotome +periosteotomy +periosteous +periosteum +periostitic +periostitis +periostoma +periostosis +periostotomy +periostraca +periostracal +periostracum +periotic +periovular +peripachymeningitis +peripancreatic +peripancreatitis +peripapillary +peripatetian +peripatetic +peripatetical +peripatetically +peripateticate +peripateticism +peripatetics +peripatidae +peripatidea +peripatize +peripatoid +peripatopsidae +peripatopsis +peripatus +peripenial +peripericarditis +peripetalous +peripetasma +peripeteia +peripety +peripetia +peripeties +periphacitis +peripharyngeal +periphasis +peripherad +peripheral +peripherally +peripherallies +peripherals +periphery +peripherial +peripheric +peripherical +peripherically +peripheries +peripherocentral +peripheroceptor +peripheromittor +peripheroneural +peripherophose +periphyllum +periphyse +periphysis +periphytic +periphyton +periphlebitic +periphlebitis +periphractic +periphrase +periphrased +periphrases +periphrasing +periphrasis +periphrastic +periphrastical +periphrastically +periphraxy +peripylephlebitis +peripyloric +periplaneta +periplasm +periplast +periplastic +periplegmatic +peripleural +peripleuritis +periploca +periplus +peripneumony +peripneumonia +peripneumonic +peripneustic +peripolar +peripolygonal +periportal +periproct +periproctal +periproctic +periproctitis +periproctous +periprostatic +periprostatitis +peripter +peripteral +periptery +peripteries +peripteroi +peripteros +peripterous +peripters +perique +periques +perirectal +perirectitis +perirenal +perirhinal +periryrle +perirraniai +peris +perisalpingitis +perisarc +perisarcal +perisarcous +perisarcs +perisaturnium +periscian +periscians +periscii +perisclerotic +periscopal +periscope +periscopes +periscopic +periscopical +periscopism +periselene +perish +perishability +perishabilty +perishable +perishableness +perishables +perishably +perished +perisher +perishers +perishes +perishing +perishingly +perishless +perishment +perisigmoiditis +perisynovial +perisinuitis +perisinuous +perisinusitis +perisystole +perisystolic +perisoma +perisomal +perisomatic +perisome +perisomial +perisperm +perispermal +perispermatitis +perispermic +perisphere +perispheric +perispherical +perisphinctean +perisphinctes +perisphinctidae +perisphinctoid +perisplanchnic +perisplanchnitis +perisplenetic +perisplenic +perisplenitis +perispome +perispomena +perispomenon +perispondylic +perispondylitis +perispore +perisporiaceae +perisporiaceous +perisporiales +perissad +perissodactyl +perissodactyla +perissodactylate +perissodactyle +perissodactylic +perissodactylism +perissodactylous +perissology +perissologic +perissological +perissosyllabic +peristalith +peristalses +peristalsis +peristaltic +peristaltically +peristaphyline +peristaphylitis +peristele +peristerite +peristeromorph +peristeromorphae +peristeromorphic +peristeromorphous +peristeronic +peristerophily +peristeropod +peristeropodan +peristeropode +peristeropodes +peristeropodous +peristethium +peristylar +peristyle +peristyles +peristylium +peristylos +peristylum +peristole +peristoma +peristomal +peristomatic +peristome +peristomial +peristomium +peristrephic +peristrephical +peristrumitis +peristrumous +perit +peritcia +perite +peritectic +peritendineum +peritenon +perithece +perithecia +perithecial +perithecium +perithelia +perithelial +perithelioma +perithelium +perithyreoiditis +perithyroiditis +perithoracic +perityphlic +perityphlitic +perityphlitis +peritlia +peritomy +peritomize +peritomous +peritonaea +peritonaeal +peritonaeum +peritonea +peritoneal +peritonealgia +peritonealize +peritonealized +peritonealizing +peritoneally +peritoneocentesis +peritoneoclysis +peritoneomuscular +peritoneopathy +peritoneopericardial +peritoneopexy +peritoneoplasty +peritoneoscope +peritoneoscopy +peritoneotomy +peritoneum +peritoneums +peritonism +peritonital +peritonitic +peritonitis +peritonsillar +peritonsillitis +peritracheal +peritrack +peritrema +peritrematous +peritreme +peritrich +peritricha +peritrichan +peritrichate +peritrichic +peritrichous +peritrichously +peritroch +peritrochal +peritrochanteric +peritrochium +peritrochoid +peritropal +peritrophic +peritropous +peritura +periumbilical +periungual +periuranium +periureteric +periureteritis +periurethral +periurethritis +periuterine +periuvular +perivaginal +perivaginitis +perivascular +perivasculitis +perivenous +perivertebral +perivesical +perivisceral +perivisceritis +perivitellin +perivitelline +periwig +periwigged +periwigpated +periwigs +periwinkle +periwinkled +periwinkler +periwinkles +perizonium +perjink +perjinkety +perjinkities +perjinkly +perjure +perjured +perjuredly +perjuredness +perjurement +perjurer +perjurers +perjures +perjuress +perjury +perjuries +perjurymonger +perjurymongering +perjuring +perjurious +perjuriously +perjuriousness +perjurous +perk +perked +perky +perkier +perkiest +perkily +perkin +perkiness +perking +perkingly +perkinism +perkish +perknite +perks +perla +perlaceous +perlaria +perlative +perle +perleche +perlection +perlid +perlidae +perligenous +perling +perlingual +perlingually +perlite +perlites +perlitic +perlocution +perlocutionary +perloir +perlucidus +perlustrate +perlustration +perlustrator +perm +permafrost +permalloy +permanence +permanency +permanencies +permanent +permanently +permanentness +permanents +permanganate +permanganic +permansion +permansive +permatron +permeability +permeable +permeableness +permeably +permeameter +permeance +permeant +permease +permeases +permeate +permeated +permeates +permeating +permeation +permeations +permeative +permeator +permiak +permian +permillage +perminvar +permirific +permiss +permissable +permissibility +permissible +permissibleness +permissibly +permissiblity +permission +permissioned +permissions +permissive +permissively +permissiveness +permissory +permistion +permit +permits +permittable +permittance +permitted +permittedly +permittee +permitter +permitting +permittivity +permittivities +permix +permixable +permixed +permixtion +permixtive +permixture +permocarboniferous +permonosulphuric +permoralize +perms +permutability +permutable +permutableness +permutably +permutate +permutated +permutating +permutation +permutational +permutationist +permutationists +permutations +permutator +permutatory +permutatorial +permute +permuted +permuter +permutes +permuting +pern +pernancy +pernasal +pernavigate +pernea +pernel +pernephria +pernettia +pernychia +pernicion +pernicious +perniciously +perniciousness +pernickety +pernicketiness +pernicketty +pernickity +pernyi +pernine +pernio +pernis +pernitrate +pernitric +pernoctate +pernoctation +pernod +pernor +peroba +perobrachius +perocephalus +perochirus +perodactylus +perodipus +perofskite +perognathinae +perognathus +peroliary +peromedusae +peromela +peromelous +peromelus +peromyscus +peronate +perone +peroneal +peronei +peroneocalcaneal +peroneotarsal +peroneotibial +peroneus +peronial +peronium +peronnei +peronospora +peronosporaceae +peronosporaceous +peronosporales +peropod +peropoda +peropodous +peropus +peroral +perorally +perorate +perorated +perorates +perorating +peroration +perorational +perorations +perorative +perorator +peroratory +peroratorical +peroratorically +peroses +perosis +perosmate +perosmic +perosomus +perotic +perovskite +peroxy +peroxyacid +peroxyborate +peroxid +peroxidase +peroxidate +peroxidation +peroxide +peroxided +peroxides +peroxidic +peroxidicperoxiding +peroxiding +peroxidize +peroxidized +peroxidizement +peroxidizing +peroxids +peroxyl +peroxisomal +peroxisome +perozonid +perozonide +perp +perpend +perpended +perpendicle +perpendicular +perpendicularity +perpendicularly +perpendicularness +perpendiculars +perpending +perpends +perpense +perpension +perpensity +perpent +perpents +perpera +perperfect +perpession +perpet +perpetrable +perpetrate +perpetrated +perpetrates +perpetrating +perpetration +perpetrations +perpetrator +perpetrators +perpetratress +perpetratrix +perpetuable +perpetual +perpetualism +perpetualist +perpetuality +perpetually +perpetualness +perpetuana +perpetuance +perpetuant +perpetuate +perpetuated +perpetuates +perpetuating +perpetuation +perpetuator +perpetuators +perpetuity +perpetuities +perpetuum +perphenazine +perplantar +perplex +perplexable +perplexed +perplexedly +perplexedness +perplexer +perplexes +perplexing +perplexingly +perplexity +perplexities +perplexment +perplication +perquadrat +perqueer +perqueerly +perqueir +perquest +perquisite +perquisites +perquisition +perquisitor +perradial +perradially +perradiate +perradius +perreia +perry +perridiculous +perrie +perrier +perries +perryman +perrinist +perron +perrons +perroquet +perruche +perrukery +perruque +perruquier +perruquiers +perruthenate +perruthenic +pers +persae +persalt +persalts +perscent +perscribe +perscrutate +perscrutation +perscrutator +perse +persea +persecute +persecuted +persecutee +persecutes +persecuting +persecutingly +persecution +persecutional +persecutions +persecutive +persecutiveness +persecutor +persecutory +persecutors +persecutress +persecutrix +perseid +perseite +perseity +perseitol +persentiscency +persephassa +persephone +persepolitan +perses +perseus +perseverance +perseverant +perseverate +perseveration +perseverative +persevere +persevered +perseveres +persevering +perseveringly +persia +persian +persianist +persianization +persianize +persians +persic +persicary +persicaria +persicize +persico +persicot +persienne +persiennes +persiflage +persiflate +persifleur +persilicic +persillade +persymmetric +persymmetrical +persimmon +persimmons +persio +persis +persism +persist +persistance +persisted +persistence +persistency +persistent +persistently +persister +persisters +persisting +persistingly +persistive +persistively +persistiveness +persists +persnickety +persnicketiness +persolve +person +persona +personable +personableness +personably +personae +personage +personages +personal +personalia +personalis +personalisation +personalism +personalist +personalistic +personality +personalities +personalization +personalize +personalized +personalizes +personalizing +personally +personalness +personals +personalty +personalties +personam +personarum +personas +personate +personated +personately +personating +personation +personative +personator +personed +personeity +personhood +personify +personifiable +personifiant +personification +personifications +personificative +personificator +personified +personifier +personifies +personifying +personization +personize +personnel +persons +personship +persorption +perspection +perspectival +perspective +perspectived +perspectiveless +perspectively +perspectives +perspectivism +perspectivist +perspectivity +perspectograph +perspectometer +perspicable +perspicacious +perspicaciously +perspicaciousness +perspicacity +perspicil +perspicous +perspicuity +perspicuous +perspicuously +perspicuousness +perspirability +perspirable +perspirant +perspirate +perspiration +perspirative +perspiratory +perspire +perspired +perspires +perspiry +perspiring +perspiringly +perstand +perstringe +perstringement +persuadability +persuadable +persuadableness +persuadably +persuade +persuaded +persuadedly +persuadedness +persuader +persuaders +persuades +persuading +persuadingly +persuasibility +persuasible +persuasibleness +persuasibly +persuasion +persuasions +persuasive +persuasively +persuasiveness +persuasory +persue +persulfate +persulphate +persulphide +persulphocyanate +persulphocyanic +persulphuric +pert +pertain +pertained +pertaining +pertainment +pertains +perten +pertenencia +perter +pertest +perthiocyanate +perthiocyanic +perthiotophyre +perthite +perthitic +perthitically +perthophyte +perthosite +perty +pertinaceous +pertinacious +pertinaciously +pertinaciousness +pertinacity +pertinate +pertinence +pertinency +pertinencies +pertinent +pertinentia +pertinently +pertinentness +pertish +pertly +pertness +pertnesses +perturb +perturbability +perturbable +perturbance +perturbancy +perturbant +perturbate +perturbation +perturbational +perturbations +perturbatious +perturbative +perturbator +perturbatory +perturbatress +perturbatrix +perturbed +perturbedly +perturbedness +perturber +perturbing +perturbingly +perturbment +perturbs +pertusaria +pertusariaceae +pertuse +pertused +pertusion +pertussal +pertussis +peru +perugian +peruginesque +peruke +peruked +perukeless +peruker +perukery +perukes +perukier +perukiership +perula +perularia +perulate +perule +perun +perusable +perusal +perusals +peruse +perused +peruser +perusers +peruses +perusing +peruvian +peruvianize +peruvians +perv +pervade +pervaded +pervadence +pervader +pervaders +pervades +pervading +pervadingly +pervadingness +pervagate +pervagation +pervalvar +pervasion +pervasive +pervasively +pervasiveness +pervenche +perverse +perversely +perverseness +perversion +perversions +perversite +perversity +perversities +perversive +pervert +perverted +pervertedly +pervertedness +perverter +pervertibility +pervertible +pervertibly +perverting +pervertive +perverts +pervestigate +perviability +perviable +pervial +pervicacious +pervicaciously +pervicaciousness +pervicacity +pervigilium +pervious +perviously +perviousness +pervulgate +pervulgation +perwick +perwitsky +pes +pesa +pesach +pesade +pesades +pesage +pesah +pesante +pescod +peseta +pesetas +pesewa +pesewas +peshito +peshkar +peshkash +peshwa +peshwaship +pesky +peskier +peskiest +peskily +peskiness +peso +pesos +pess +pessary +pessaries +pessimal +pessimism +pessimist +pessimistic +pessimistically +pessimists +pessimize +pessimum +pessomancy +pessoner +pessular +pessulus +pest +pestalozzian +pestalozzianism +peste +pester +pestered +pesterer +pesterers +pestering +pesteringly +pesterment +pesterous +pesters +pestersome +pestful +pesthole +pestholes +pesthouse +pesticidal +pesticide +pesticides +pestiduct +pestiferous +pestiferously +pestiferousness +pestify +pestifugous +pestilence +pestilences +pestilenceweed +pestilencewort +pestilent +pestilential +pestilentially +pestilentialness +pestilently +pestis +pestle +pestled +pestles +pestling +pestology +pestological +pestologist +pestproof +pests +pet +petal +petalage +petaled +petaly +petalia +petaliferous +petaliform +petaliidae +petaline +petaling +petalism +petalite +petalled +petalless +petallike +petalling +petalocerous +petalody +petalodic +petalodies +petalodont +petalodontid +petalodontidae +petalodontoid +petalodus +petaloid +petaloidal +petaloideous +petalomania +petalon +petalostemon +petalostichous +petalous +petals +petalwise +petara +petard +petardeer +petardier +petarding +petards +petary +petasites +petasma +petasos +petasoses +petasus +petasuses +petate +petaurine +petaurist +petaurista +petauristidae +petauroides +petaurus +petchary +petcock +petcocks +pete +peteca +petechia +petechiae +petechial +petechiate +petegreu +peteman +petemen +peter +petered +peterero +petering +peterkin +peterloo +peterman +petermen +peternet +peters +petersburg +petersen +petersham +peterwort +petful +pether +pethidine +petiolar +petiolary +petiolata +petiolate +petiolated +petiole +petioled +petioles +petioli +petioliventres +petiolular +petiolulate +petiolule +petiolus +petit +petite +petiteness +petites +petitgrain +petitio +petition +petitionable +petitional +petitionary +petitionarily +petitioned +petitionee +petitioner +petitioners +petitioning +petitionist +petitionproof +petitions +petitor +petitory +petits +petiveria +petiveriaceae +petkin +petkins +petling +petnapping +petnappings +peto +petos +petr +petralogy +petrarchal +petrarchan +petrarchesque +petrarchian +petrarchianism +petrarchism +petrarchist +petrarchistic +petrarchistical +petrarchize +petrary +petre +petrea +petrean +petreity +petrel +petrels +petrescence +petrescency +petrescent +petri +petricola +petricolidae +petricolous +petrie +petrifaction +petrifactive +petrify +petrifiable +petrific +petrificant +petrificate +petrification +petrified +petrifier +petrifies +petrifying +petrine +petrinism +petrinist +petrinize +petrissage +petro +petrobium +petrobrusian +petrochemical +petrochemicals +petrochemistry +petrodollar +petrodollars +petrog +petrogale +petrogenesis +petrogenetic +petrogeny +petrogenic +petroglyph +petroglyphy +petroglyphic +petrogram +petrograph +petrographer +petrographers +petrography +petrographic +petrographical +petrographically +petrohyoid +petrol +petrolage +petrolatum +petrolean +petrolene +petroleous +petroleum +petroleur +petroleuse +petrolic +petroliferous +petrolific +petrolin +petrolist +petrolithic +petrolization +petrolize +petrolized +petrolizing +petrolled +petrolling +petrology +petrologic +petrological +petrologically +petrologist +petrologists +petrols +petromastoid +petromyzon +petromyzonidae +petromyzont +petromyzontes +petromyzontidae +petromyzontoid +petronel +petronella +petronellier +petronels +petropharyngeal +petrophilous +petrosa +petrosal +petroselinum +petrosilex +petrosiliceous +petrosilicious +petrosphenoid +petrosphenoidal +petrosphere +petrosquamosal +petrosquamous +petrostearin +petrostearine +petrosum +petrotympanic +petrous +petroxolin +pets +pettable +pettah +petted +pettedly +pettedness +petter +petters +petti +petty +pettiagua +pettichaps +petticoat +petticoated +petticoatery +petticoaterie +petticoaty +petticoating +petticoatism +petticoatless +petticoats +pettier +pettiest +pettifog +pettyfog +pettifogged +pettifogger +pettifoggery +pettifoggers +pettifogging +pettifogs +pettifogulize +pettifogulizer +pettygod +pettily +pettiness +petting +pettingly +pettish +pettishly +pettishness +pettiskirt +pettitoes +pettle +pettled +pettles +pettling +petto +petulance +petulancy +petulancies +petulant +petulantly +petum +petune +petunia +petunias +petunse +petuntse +petuntses +petuntze +petuntzes +petwood +petzite +peucedanin +peucedanum +peucetii +peucyl +peucites +peugeot +peuhl +peul +peulvan +peumus +peutingerian +pew +pewage +pewdom +pewee +pewees +pewfellow +pewful +pewholder +pewy +pewing +pewit +pewits +pewless +pewmate +pews +pewter +pewterer +pewterers +pewtery +pewters +pewterwort +pezantic +peziza +pezizaceae +pezizaceous +pezizaeform +pezizales +peziziform +pezizoid +pezograph +pezophaps +pf +pfaffian +pfc +pfd +pfeffernuss +pfeifferella +pfennig +pfennige +pfennigs +pfg +pflag +pfui +pfund +pfunde +pfx +pg +pgntt +pgnttrp +ph +phaca +phacelia +phacelite +phacella +phacellite +phacellus +phacidiaceae +phacidiales +phacitis +phacoanaphylaxis +phacocele +phacochere +phacocherine +phacochoere +phacochoerid +phacochoerine +phacochoeroid +phacochoerus +phacocyst +phacocystectomy +phacocystitis +phacoglaucoma +phacoid +phacoidal +phacoidoscope +phacolysis +phacolite +phacolith +phacomalacia +phacometer +phacopid +phacopidae +phacops +phacosclerosis +phacoscope +phacotherapy +phaeacian +phaedo +phaedra +phaeism +phaelite +phaenanthery +phaenantherous +phaenogam +phaenogamia +phaenogamian +phaenogamic +phaenogamous +phaenogenesis +phaenogenetic +phaenology +phaenological +phaenomenal +phaenomenism +phaenomenon +phaenozygous +phaeochrous +phaeodaria +phaeodarian +phaeomelanin +phaeophyceae +phaeophycean +phaeophyceous +phaeophyl +phaeophyll +phaeophyta +phaeophytin +phaeophore +phaeoplast +phaeosporales +phaeospore +phaeosporeae +phaeosporous +phaet +phaethon +phaethonic +phaethontes +phaethontic +phaethontidae +phaethusa +phaeton +phaetons +phage +phageda +phagedaena +phagedaenic +phagedaenical +phagedaenous +phagedena +phagedenic +phagedenical +phagedenous +phages +phagineae +phagocytable +phagocytal +phagocyte +phagocyter +phagocytic +phagocytism +phagocytize +phagocytized +phagocytizing +phagocytoblast +phagocytolysis +phagocytolytic +phagocytose +phagocytosed +phagocytosing +phagocytosis +phagocytotic +phagodynamometer +phagolysis +phagolytic +phagomania +phagophobia +phagosome +phainolion +phainopepla +phajus +phalacrocoracidae +phalacrocoracine +phalacrocorax +phalacrosis +phalaecean +phalaecian +phalaenae +phalaenidae +phalaenopsid +phalaenopsis +phalangal +phalange +phalangeal +phalangean +phalanger +phalangeridae +phalangerinae +phalangerine +phalanges +phalangette +phalangian +phalangic +phalangid +phalangida +phalangidan +phalangidea +phalangidean +phalangides +phalangiform +phalangigrada +phalangigrade +phalangigrady +phalangiid +phalangiidae +phalangist +phalangista +phalangistidae +phalangistine +phalangite +phalangitic +phalangitis +phalangium +phalangology +phalangologist +phalanstery +phalansterial +phalansterian +phalansterianism +phalansteric +phalansteries +phalansterism +phalansterist +phalanx +phalanxed +phalanxes +phalarica +phalaris +phalarism +phalarope +phalaropes +phalaropodidae +phalera +phalerae +phalerate +phalerated +phaleucian +phallaceae +phallaceous +phallales +phallalgia +phallaneurysm +phallephoric +phalli +phallic +phallical +phallically +phallicism +phallicist +phallics +phallin +phallis +phallism +phallisms +phallist +phallists +phallitis +phallocrypsis +phallodynia +phalloid +phalloncus +phalloplasty +phallorrhagia +phallus +phalluses +phanar +phanariot +phanariote +phanatron +phane +phaneric +phanerite +phanerocarpae +phanerocarpous +phanerocephala +phanerocephalous +phanerocodonic +phanerocryst +phanerocrystalline +phanerogam +phanerogamy +phanerogamia +phanerogamian +phanerogamic +phanerogamous +phanerogenetic +phanerogenic +phaneroglossa +phaneroglossal +phaneroglossate +phaneromania +phaneromere +phaneromerous +phanerophyte +phaneroscope +phanerosis +phanerozoic +phanerozonate +phanerozonia +phanic +phano +phanos +phanotron +phansigar +phantascope +phantasy +phantasia +phantasiast +phantasiastic +phantasied +phantasies +phantasying +phantasist +phantasize +phantasm +phantasma +phantasmag +phantasmagory +phantasmagoria +phantasmagorial +phantasmagorially +phantasmagorian +phantasmagorianly +phantasmagorias +phantasmagoric +phantasmagorical +phantasmagorically +phantasmagories +phantasmagorist +phantasmal +phantasmalian +phantasmality +phantasmally +phantasmascope +phantasmata +phantasmatic +phantasmatical +phantasmatically +phantasmatography +phantasmic +phantasmical +phantasmically +phantasmist +phantasmogenesis +phantasmogenetic +phantasmograph +phantasmology +phantasmological +phantasms +phantast +phantastic +phantastical +phantasts +phantic +phantom +phantomatic +phantomy +phantomic +phantomical +phantomically +phantomist +phantomize +phantomizer +phantomland +phantomlike +phantomnation +phantomry +phantoms +phantomship +phantoplex +phantoscope +phar +pharaoh +pharaohs +pharaonic +pharaonical +pharbitis +phare +phareodus +pharian +pharyngal +pharyngalgia +pharyngalgic +pharyngeal +pharyngealization +pharyngealized +pharyngectomy +pharyngectomies +pharyngemphraxis +pharynges +pharyngic +pharyngismus +pharyngitic +pharyngitis +pharyngoamygdalitis +pharyngobranch +pharyngobranchial +pharyngobranchiate +pharyngobranchii +pharyngocele +pharyngoceratosis +pharyngodynia +pharyngoepiglottic +pharyngoepiglottidean +pharyngoesophageal +pharyngoglossal +pharyngoglossus +pharyngognath +pharyngognathi +pharyngognathous +pharyngography +pharyngographic +pharyngokeratosis +pharyngolaryngeal +pharyngolaryngitis +pharyngolith +pharyngology +pharyngological +pharyngomaxillary +pharyngomycosis +pharyngonasal +pharyngopalatine +pharyngopalatinus +pharyngoparalysis +pharyngopathy +pharyngoplasty +pharyngoplegy +pharyngoplegia +pharyngoplegic +pharyngopleural +pharyngopneusta +pharyngopneustal +pharyngorhinitis +pharyngorhinoscopy +pharyngoscleroma +pharyngoscope +pharyngoscopy +pharyngospasm +pharyngotherapy +pharyngotyphoid +pharyngotome +pharyngotomy +pharyngotonsillitis +pharyngoxerosis +pharynogotome +pharynx +pharynxes +pharisaean +pharisaic +pharisaical +pharisaically +pharisaicalness +pharisaism +pharisaist +pharisean +pharisee +phariseeism +pharisees +pharm +pharmacal +pharmaceutic +pharmaceutical +pharmaceutically +pharmaceuticals +pharmaceutics +pharmaceutist +pharmacy +pharmacic +pharmacies +pharmacist +pharmacists +pharmacite +pharmacochemistry +pharmacodiagnosis +pharmacodynamic +pharmacodynamical +pharmacodynamically +pharmacodynamics +pharmacoendocrinology +pharmacogenetic +pharmacogenetics +pharmacognosy +pharmacognosia +pharmacognosis +pharmacognosist +pharmacognostic +pharmacognostical +pharmacognostically +pharmacognostics +pharmacography +pharmacokinetic +pharmacokinetics +pharmacol +pharmacolite +pharmacology +pharmacologia +pharmacologic +pharmacological +pharmacologically +pharmacologies +pharmacologist +pharmacologists +pharmacomania +pharmacomaniac +pharmacomaniacal +pharmacometer +pharmacon +pharmacopedia +pharmacopedic +pharmacopedics +pharmacopeia +pharmacopeial +pharmacopeian +pharmacopeias +pharmacophobia +pharmacopoeia +pharmacopoeial +pharmacopoeian +pharmacopoeias +pharmacopoeic +pharmacopoeist +pharmacopolist +pharmacoposia +pharmacopsychology +pharmacopsychosis +pharmacosiderite +pharmacotherapy +pharmakoi +pharmakos +pharmic +pharmuthi +pharo +pharology +pharomacrus +pharos +pharoses +pharsalian +phascaceae +phascaceous +phascogale +phascolarctinae +phascolarctos +phascolome +phascolomyidae +phascolomys +phascolonus +phascum +phase +phaseal +phased +phaseless +phaselin +phasemeter +phasemy +phaseolaceae +phaseolin +phaseolous +phaseolunatin +phaseolus +phaseometer +phaseout +phaseouts +phaser +phasers +phases +phaseun +phasianella +phasianellidae +phasianic +phasianid +phasianidae +phasianinae +phasianine +phasianoid +phasianus +phasic +phasing +phasiron +phasis +phasitron +phasm +phasma +phasmajector +phasmatid +phasmatida +phasmatidae +phasmatodea +phasmatoid +phasmatoidea +phasmatrope +phasmid +phasmida +phasmidae +phasmids +phasmoid +phasmophobia +phasogeneous +phasor +phasotropy +phat +phatic +phatically +pheal +phearse +pheasant +pheasantry +pheasants +pheasantwood +phebe +phecda +pheeal +phegopteris +pheidole +phellandrene +phellem +phellems +phellodendron +phelloderm +phellodermal +phellogen +phellogenetic +phellogenic +phellonic +phelloplastic +phelloplastics +phellum +phelonia +phelonion +phelonionia +phelonions +phemic +phemie +phenacaine +phenacetin +phenacetine +phenaceturic +phenacyl +phenacite +phenacodontidae +phenacodus +phenakism +phenakistoscope +phenakite +phenalgin +phenanthraquinone +phenanthrene +phenanthrenequinone +phenanthridine +phenanthridone +phenanthrol +phenanthroline +phenarsine +phenate +phenazin +phenazine +phenazins +phenazone +phene +phenegol +phenelzine +phenene +phenethicillin +phenethyl +phenetic +pheneticist +phenetics +phenetidin +phenetidine +phenetol +phenetole +phenetols +phenformin +phengite +phengitical +pheny +phenic +phenicate +phenicine +phenicious +phenicopter +phenyl +phenylacetaldehyde +phenylacetamide +phenylacetic +phenylaceticaldehyde +phenylalanine +phenylamide +phenylamine +phenylate +phenylated +phenylation +phenylbenzene +phenylboric +phenylbutazone +phenylcarbamic +phenylcarbimide +phenylcarbinol +phenyldiethanolamine +phenylene +phenylenediamine +phenylephrine +phenylethylene +phenylethylmalonylure +phenylethylmalonylurea +phenylglycine +phenylglycolic +phenylglyoxylic +phenylhydrazine +phenylhydrazone +phenylic +phenylketonuria +phenylketonuric +phenylmethane +phenyls +phenylthiocarbamide +phenylthiourea +phenin +phenine +phenix +phenixes +phenmetrazine +phenmiazine +phenobarbital +phenobarbitol +phenobarbitone +phenocain +phenocoll +phenocopy +phenocopies +phenocryst +phenocrystalline +phenocrystic +phenogenesis +phenogenetic +phenol +phenolate +phenolated +phenolia +phenolic +phenolics +phenoliolia +phenolion +phenolions +phenolization +phenolize +phenology +phenologic +phenological +phenologically +phenologist +phenoloid +phenolphthalein +phenols +phenolsulphonate +phenolsulphonephthalein +phenolsulphonic +phenom +phenomena +phenomenal +phenomenalism +phenomenalist +phenomenalistic +phenomenalistically +phenomenalists +phenomenality +phenomenalization +phenomenalize +phenomenalized +phenomenalizing +phenomenally +phenomenalness +phenomenic +phenomenical +phenomenism +phenomenist +phenomenistic +phenomenize +phenomenized +phenomenology +phenomenologic +phenomenological +phenomenologically +phenomenologies +phenomenologist +phenomenon +phenomenona +phenomenons +phenoms +phenoplast +phenoplastic +phenoquinone +phenosafranine +phenosal +phenose +phenosol +phenospermy +phenospermic +phenothiazine +phenotype +phenotypes +phenotypic +phenotypical +phenotypically +phenoxazine +phenoxybenzamine +phenoxid +phenoxide +phenozygous +phentolamine +pheochromocytoma +pheon +pheophyl +pheophyll +pheophytin +pherecratean +pherecratian +pherecratic +pherephatta +pheretrer +pherkad +pheromonal +pheromone +pheromones +pherophatta +phersephatta +phersephoneia +phew +phi +phial +phialae +phialai +phiale +phialed +phialful +phialide +phialine +phialing +phialled +phiallike +phialling +phialophore +phialospore +phials +phycic +phyciodes +phycite +phycitidae +phycitol +phycochrom +phycochromaceae +phycochromaceous +phycochrome +phycochromophyceae +phycochromophyceous +phycocyanin +phycocyanogen +phycocolloid +phycodromidae +phycoerythrin +phycography +phycology +phycological +phycologist +phycomyces +phycomycete +phycomycetes +phycomycetous +phycophaein +phycoxanthin +phycoxanthine +phidiac +phidian +phies +phigalian +phygogalactic +phil +phyla +philabeg +philabegs +phylacobiosis +phylacobiotic +phylactery +phylacteric +phylacterical +phylacteried +phylacteries +phylacterize +phylactic +phylactocarp +phylactocarpal +phylactolaema +phylactolaemata +phylactolaematous +phylactolema +phylactolemata +philadelphy +philadelphia +philadelphian +philadelphianism +philadelphians +philadelphite +philadelphus +phylae +philalethist +philamot +philander +philandered +philanderer +philanderers +philandering +philanders +philanthid +philanthidae +philanthrope +philanthropy +philanthropian +philanthropic +philanthropical +philanthropically +philanthropies +philanthropine +philanthropinism +philanthropinist +philanthropinum +philanthropise +philanthropised +philanthropising +philanthropism +philanthropist +philanthropistic +philanthropists +philanthropize +philanthropized +philanthropizing +philanthus +philantomba +phylar +phylarch +philarchaist +phylarchy +phylarchic +phylarchical +philaristocracy +phylartery +philately +philatelic +philatelical +philatelically +philatelism +philatelist +philatelistic +philatelists +philathea +philathletic +philauty +phylaxis +phylaxises +phyle +philematology +philemon +phylephebic +philepitta +philepittidae +phyleses +philesia +phylesis +phylesises +philetaerus +phyletic +phyletically +phyletism +philharmonic +philharmonics +philhellene +philhellenic +philhellenism +philhellenist +philhymnic +philhippic +philia +philiater +philibeg +philibegs +philic +phylic +philydraceae +philydraceous +philine +philip +philippa +philippan +philippe +philippian +philippians +philippic +philippicize +philippics +philippina +philippine +philippines +philippism +philippist +philippistic +philippizate +philippize +philippizer +philippus +philyra +philister +philistia +philistian +philistine +philistinely +philistines +philistinian +philistinic +philistinish +philistinism +philistinize +phill +phyllachora +phyllactinia +phyllade +phyllamania +phyllamorph +phyllanthus +phyllary +phyllaries +phyllaurea +phylliform +phillilew +philliloo +phyllin +phylline +phillip +phillipeener +phillippi +phillipsine +phillipsite +phillyrea +phillyrin +phillis +phyllis +phyllite +phyllites +phyllitic +phyllitis +phyllium +phyllobranchia +phyllobranchial +phyllobranchiate +phyllocactus +phyllocarid +phyllocarida +phyllocaridan +phylloceras +phyllocerate +phylloceratidae +phyllocyanic +phyllocyanin +phyllocyst +phyllocystic +phylloclad +phylloclade +phyllocladia +phyllocladioid +phyllocladium +phyllocladous +phyllode +phyllodes +phyllody +phyllodia +phyllodial +phyllodination +phyllodineous +phyllodiniation +phyllodinous +phyllodium +phyllodoce +phylloerythrin +phyllogenetic +phyllogenous +phylloid +phylloidal +phylloideous +phylloids +phyllomancy +phyllomania +phyllome +phyllomes +phyllomic +phyllomorph +phyllomorphy +phyllomorphic +phyllomorphosis +phyllophaga +phyllophagan +phyllophagous +phyllophyllin +phyllophyte +phyllophore +phyllophorous +phyllopyrrole +phyllopod +phyllopoda +phyllopodan +phyllopode +phyllopodiform +phyllopodium +phyllopodous +phylloporphyrin +phyllopteryx +phylloptosis +phylloquinone +phyllorhine +phyllorhinine +phylloscopine +phylloscopus +phyllosilicate +phyllosiphonic +phyllosoma +phyllosomata +phyllosome +phyllospondyli +phyllospondylous +phyllostachys +phyllosticta +phyllostoma +phyllostomatidae +phyllostomatinae +phyllostomatoid +phyllostomatous +phyllostome +phyllostomidae +phyllostominae +phyllostomine +phyllostomous +phyllostomus +phyllotactic +phyllotactical +phyllotaxy +phyllotaxic +phyllotaxis +phyllous +phylloxanthin +phylloxera +phylloxerae +phylloxeran +phylloxeras +phylloxeric +phylloxeridae +phyllozooid +phillumenist +philobiblian +philobiblic +philobiblical +philobiblist +philobotanic +philobotanist +philobrutish +philocaly +philocalic +philocalist +philocathartic +philocatholic +philocyny +philocynic +philocynical +philocynicism +philocomal +philoctetes +philocubist +philodemic +philodendra +philodendron +philodendrons +philodespot +philodestructiveness +philodina +philodinidae +philodox +philodoxer +philodoxical +philodramatic +philodramatist +philofelist +philofelon +philogarlic +philogastric +philogeant +phylogenesis +phylogenetic +phylogenetical +phylogenetically +phylogeny +phylogenic +phylogenist +philogenitive +philogenitiveness +phylogerontic +phylogerontism +philogynaecic +philogyny +philogynist +philogynous +philograph +phylography +philographic +philohela +philohellenian +philokleptic +philol +philoleucosis +philologaster +philologastry +philologer +philology +phylology +philologian +philologic +philological +philologically +philologist +philologistic +philologists +philologize +philologue +philomachus +philomath +philomathematic +philomathematical +philomathy +philomathic +philomathical +philome +philomel +philomela +philomelanist +philomelian +philomels +philomystic +philomythia +philomythic +philomuse +philomusical +phylon +philonatural +phyloneanic +philoneism +phylonepionic +philonian +philonic +philonism +philonist +philonium +philonoist +philopagan +philopater +philopatrian +philopena +philophilosophos +philopig +philoplutonic +philopoet +philopogon +philopolemic +philopolemical +philopornist +philoprogeneity +philoprogenitive +philoprogenitiveness +philopterid +philopteridae +philopublican +philoradical +philorchidaceous +philornithic +philorthodox +philos +philosoph +philosophaster +philosophastering +philosophastry +philosophe +philosophedom +philosopheme +philosopher +philosopheress +philosophers +philosophership +philosophes +philosophess +philosophy +philosophic +philosophical +philosophically +philosophicalness +philosophicide +philosophicohistorical +philosophicojuristic +philosophicolegal +philosophicopsychological +philosophicoreligious +philosophicotheological +philosophies +philosophilous +philosophisation +philosophise +philosophised +philosophiser +philosophising +philosophism +philosophist +philosophister +philosophistic +philosophistical +philosophization +philosophize +philosophized +philosophizer +philosophizers +philosophizes +philosophizing +philosophling +philosophobia +philosophocracy +philosophuncule +philosophunculist +philotadpole +philotechnic +philotechnical +philotechnist +philothaumaturgic +philotheism +philotheist +philotheistic +philotheosophical +philotherian +philotherianism +philotria +philoxenian +philoxygenous +philozoic +philozoist +philozoonist +philter +philtered +philterer +philtering +philterproof +philters +philtra +philtre +philtred +philtres +philtring +philtrum +phylum +phylumla +phyma +phymas +phymata +phymatic +phymatid +phymatidae +phymatodes +phymatoid +phymatorhysin +phymatosis +phimosed +phimoses +phymosia +phimosis +phimotic +phineas +phiomia +phippe +phiroze +phis +phys +physa +physagogue +physalia +physalian +physaliidae +physalis +physalite +physalospora +physapoda +physaria +physcia +physciaceae +physcioid +physcomitrium +physes +physeter +physeteridae +physeterinae +physeterine +physeteroid +physeteroidea +physharmonica +physianthropy +physiatric +physiatrical +physiatrics +physiatrist +physic +physical +physicalism +physicalist +physicalistic +physicalistically +physicality +physicalities +physically +physicalness +physicals +physician +physicianary +physiciancy +physicianed +physicianer +physicianess +physicianing +physicianless +physicianly +physicians +physicianship +physicism +physicist +physicists +physicked +physicker +physicky +physicking +physicks +physicoastronomical +physicobiological +physicochemic +physicochemical +physicochemically +physicochemist +physicochemistry +physicogeographical +physicologic +physicological +physicomathematical +physicomathematics +physicomechanical +physicomedical +physicomental +physicomorph +physicomorphic +physicomorphism +physicooptics +physicophilosophy +physicophilosophical +physicophysiological +physicopsychical +physicosocial +physicotheology +physicotheological +physicotheologist +physicotherapeutic +physicotherapeutics +physicotherapy +physics +physid +physidae +physiform +physiochemical +physiochemically +physiochemistry +physiocracy +physiocrat +physiocratic +physiocratism +physiocratist +physiogenesis +physiogenetic +physiogeny +physiogenic +physiognomy +physiognomic +physiognomical +physiognomically +physiognomics +physiognomies +physiognomist +physiognomize +physiognomonic +physiognomonical +physiognomonically +physiogony +physiographer +physiography +physiographic +physiographical +physiographically +physiol +physiolater +physiolatry +physiolatrous +physiologer +physiology +physiologian +physiologic +physiological +physiologically +physiologicoanatomic +physiologies +physiologist +physiologists +physiologize +physiologue +physiologus +physiopathology +physiopathologic +physiopathological +physiopathologically +physiophilist +physiophilosopher +physiophilosophy +physiophilosophical +physiopsychic +physiopsychical +physiopsychology +physiopsychological +physiosociological +physiosophy +physiosophic +physiotherapeutic +physiotherapeutical +physiotherapeutics +physiotherapy +physiotherapies +physiotherapist +physiotherapists +physiotype +physiotypy +physique +physiqued +physiques +physis +physitheism +physitheist +physitheistic +physitism +physiurgy +physiurgic +physnomy +physocarpous +physocarpus +physocele +physoclist +physoclisti +physoclistic +physoclistous +physoderma +physogastry +physogastric +physogastrism +physometra +physonectae +physonectous +physophora +physophorae +physophoran +physophore +physophorous +physopod +physopoda +physopodan +physostegia +physostigma +physostigmine +physostomatous +physostome +physostomi +physostomous +phit +phytalbumose +phytane +phytanes +phytase +phytate +phytelephas +phyteus +phytic +phytiferous +phytiform +phytyl +phytin +phytins +phytivorous +phytoalexin +phytobacteriology +phytobezoar +phytobiology +phytobiological +phytobiologist +phytochemical +phytochemically +phytochemist +phytochemistry +phytochlore +phytochlorin +phytochrome +phytocidal +phytocide +phytoclimatology +phytoclimatologic +phytoclimatological +phytocoenoses +phytocoenosis +phytodynamics +phytoecology +phytoecological +phytoecologist +phytoflagellata +phytoflagellate +phytogamy +phytogenesis +phytogenetic +phytogenetical +phytogenetically +phytogeny +phytogenic +phytogenous +phytogeographer +phytogeography +phytogeographic +phytogeographical +phytogeographically +phytoglobulin +phytognomy +phytograph +phytographer +phytography +phytographic +phytographical +phytographist +phytohaemagglutinin +phytohemagglutinin +phytohormone +phytoid +phytokinin +phytol +phytolacca +phytolaccaceae +phytolaccaceous +phytolatry +phytolatrous +phytolite +phytolith +phytolithology +phytolithological +phytolithologist +phytology +phytologic +phytological +phytologically +phytologist +phytoma +phytomastigina +phytomastigoda +phytome +phytomer +phytomera +phytometer +phytometry +phytometric +phytomonad +phytomonadida +phytomonadina +phytomonas +phytomorphic +phytomorphology +phytomorphosis +phyton +phytonadione +phitones +phytonic +phytonomy +phytonomist +phytons +phytooecology +phytopaleontology +phytopaleontologic +phytopaleontological +phytopaleontologist +phytoparasite +phytopathogen +phytopathogenic +phytopathology +phytopathologic +phytopathological +phytopathologist +phytophaga +phytophagan +phytophage +phytophagy +phytophagic +phytophagineae +phytophagous +phytopharmacology +phytopharmacologic +phytophenology +phytophenological +phytophil +phytophylogenetic +phytophylogeny +phytophylogenic +phytophilous +phytophysiology +phytophysiological +phytophthora +phytoplankton +phytoplanktonic +phytoplasm +phytopsyche +phytoptid +phytoptidae +phytoptose +phytoptosis +phytoptus +phytorhodin +phytosaur +phytosauria +phytosaurian +phytoserology +phytoserologic +phytoserological +phytoserologically +phytosynthesis +phytosis +phytosociology +phytosociologic +phytosociological +phytosociologically +phytosociologist +phytosterin +phytosterol +phytostrote +phytosuccivorous +phytotaxonomy +phytotechny +phytoteratology +phytoteratologic +phytoteratological +phytoteratologist +phytotoma +phytotomy +phytotomidae +phytotomist +phytotopography +phytotopographical +phytotoxic +phytotoxicity +phytotoxin +phytotron +phytovitellin +phytozoa +phytozoan +phytozoaria +phytozoon +phiz +phizes +phizog +phlebalgia +phlebangioma +phlebarteriectasia +phlebarteriodialysis +phlebectasy +phlebectasia +phlebectasis +phlebectomy +phlebectopy +phlebectopia +phlebemphraxis +phlebenteric +phlebenterism +phlebitic +phlebitis +phlebodium +phlebogram +phlebograph +phlebography +phlebographic +phlebographical +phleboid +phleboidal +phlebolite +phlebolith +phlebolithiasis +phlebolithic +phlebolitic +phlebology +phlebological +phlebometritis +phlebopexy +phleboplasty +phleborrhage +phleborrhagia +phleborrhaphy +phleborrhexis +phlebosclerosis +phlebosclerotic +phlebostasia +phlebostasis +phlebostenosis +phlebostrepsis +phlebothrombosis +phlebotome +phlebotomy +phlebotomic +phlebotomical +phlebotomically +phlebotomies +phlebotomisation +phlebotomise +phlebotomised +phlebotomising +phlebotomist +phlebotomization +phlebotomize +phlebotomus +phlegethon +phlegethontal +phlegethontic +phlegm +phlegma +phlegmagogue +phlegmasia +phlegmatic +phlegmatical +phlegmatically +phlegmaticalness +phlegmaticly +phlegmaticness +phlegmatism +phlegmatist +phlegmatized +phlegmatous +phlegmy +phlegmier +phlegmiest +phlegmless +phlegmon +phlegmonic +phlegmonoid +phlegmonous +phlegms +phleum +phlyctaena +phlyctaenae +phlyctaenula +phlyctena +phlyctenae +phlyctenoid +phlyctenula +phlyctenule +phlyzacious +phlyzacium +phlobaphene +phlobatannin +phloem +phloems +phloeophagous +phloeoterma +phloeum +phlogisma +phlogistian +phlogistic +phlogistical +phlogisticate +phlogistication +phlogiston +phlogistonism +phlogistonist +phlogogenetic +phlogogenic +phlogogenous +phlogopite +phlogosed +phlogosin +phlogosis +phlogotic +phlomis +phloretic +phloretin +phlorhizin +phloridzin +phlorina +phlorizin +phloroglucic +phloroglucin +phloroglucinol +phlorol +phlorone +phlorrhizin +phlox +phloxes +phloxin +pho +phoby +phobia +phobiac +phobias +phobic +phobies +phobism +phobist +phobophobia +phobos +phoca +phocacean +phocaceous +phocaean +phocaena +phocaenina +phocaenine +phocal +phocean +phocenate +phocenic +phocenin +phocian +phocid +phocidae +phociform +phocinae +phocine +phocodont +phocodontia +phocodontic +phocoena +phocoid +phocomeli +phocomelia +phocomelous +phocomelus +phoebads +phoebe +phoebean +phoebes +phoebus +phoenicaceae +phoenicaceous +phoenicales +phoenicean +phoenicia +phoenician +phoenicianism +phoenicians +phoenicid +phoenicite +phoenicize +phoenicochroite +phoenicopter +phoenicopteridae +phoenicopteriformes +phoenicopteroid +phoenicopteroideae +phoenicopterous +phoenicopterus +phoeniculidae +phoeniculus +phoenicurous +phoenigm +phoenix +phoenixes +phoenixity +phoenixlike +phoh +phokomelia +pholad +pholadacea +pholadian +pholadid +pholadidae +pholadinea +pholadoid +pholas +pholcid +pholcidae +pholcoid +pholcus +pholido +pholidolite +pholidosis +pholidota +pholidote +pholiota +phoma +phomopsis +phon +phonal +phonasthenia +phonate +phonated +phonates +phonating +phonation +phonatory +phonautogram +phonautograph +phonautographic +phonautographically +phone +phoned +phoney +phoneidoscope +phoneidoscopic +phoneier +phoneiest +phoneys +phonelescope +phonematic +phonematics +phoneme +phonemes +phonemic +phonemically +phonemicist +phonemicize +phonemicized +phonemicizing +phonemics +phonendoscope +phoner +phones +phonesis +phonestheme +phonesthemic +phonet +phonetic +phonetical +phonetically +phonetician +phoneticians +phoneticism +phoneticist +phoneticization +phoneticize +phoneticogrammatical +phoneticohieroglyphic +phonetics +phonetism +phonetist +phonetization +phonetize +phonghi +phony +phoniatry +phoniatric +phoniatrics +phonic +phonically +phonics +phonier +phonies +phoniest +phonikon +phonily +phoniness +phoning +phonism +phono +phonocamptic +phonocardiogram +phonocardiograph +phonocardiography +phonocardiographic +phonocinematograph +phonodeik +phonodynamograph +phonoglyph +phonogram +phonogramic +phonogramically +phonogrammatic +phonogrammatical +phonogrammic +phonogrammically +phonograph +phonographer +phonography +phonographic +phonographical +phonographically +phonographist +phonographs +phonol +phonolite +phonolitic +phonologer +phonology +phonologic +phonological +phonologically +phonologist +phonologists +phonomania +phonometer +phonometry +phonometric +phonomimic +phonomotor +phonon +phonons +phonopathy +phonophile +phonophobia +phonophone +phonophore +phonophoric +phonophorous +phonophote +phonophotography +phonophotoscope +phonophotoscopic +phonoplex +phonopore +phonoreception +phonoreceptor +phonorecord +phonos +phonoscope +phonotactics +phonotelemeter +phonotype +phonotyper +phonotypy +phonotypic +phonotypical +phonotypically +phonotypist +phons +phoo +phooey +phooka +phora +phoradendron +phoranthium +phorate +phorates +phorbin +phoresy +phoresis +phoria +phorid +phoridae +phorminx +phormium +phorology +phorometer +phorometry +phorometric +phorone +phoronic +phoronid +phoronida +phoronidea +phoronis +phoronomy +phoronomia +phoronomic +phoronomically +phoronomics +phororhacidae +phororhacos +phoroscope +phorozooid +phorrhea +phos +phose +phosgene +phosgenes +phosgenic +phosgenite +phosis +phosphagen +phospham +phosphamic +phosphamide +phosphamidic +phosphamidon +phosphammonium +phosphatase +phosphate +phosphated +phosphatemia +phosphates +phosphatese +phosphatic +phosphatide +phosphatidic +phosphatidyl +phosphatidylcholine +phosphation +phosphatisation +phosphatise +phosphatised +phosphatising +phosphatization +phosphatize +phosphatized +phosphatizing +phosphaturia +phosphaturic +phosphene +phosphenyl +phosphid +phosphide +phosphids +phosphyl +phosphin +phosphinate +phosphine +phosphinic +phosphins +phosphite +phospho +phosphoaminolipide +phosphocarnic +phosphocreatine +phosphodiesterase +phosphoenolpyruvate +phosphoferrite +phosphofructokinase +phosphoglyceraldehyde +phosphoglycerate +phosphoglyceric +phosphoglycoprotein +phosphoglucomutase +phosphokinase +phospholipase +phospholipid +phospholipide +phospholipin +phosphomolybdate +phosphomolybdic +phosphomonoesterase +phosphonate +phosphonic +phosphonium +phosphonuclease +phosphophyllite +phosphophori +phosphoprotein +phosphor +phosphorate +phosphorated +phosphorating +phosphore +phosphoreal +phosphorent +phosphoreous +phosphoresce +phosphoresced +phosphorescence +phosphorescent +phosphorescently +phosphorescing +phosphoreted +phosphoretted +phosphorhidrosis +phosphori +phosphoric +phosphorical +phosphoriferous +phosphoryl +phosphorylase +phosphorylate +phosphorylated +phosphorylating +phosphorylation +phosphorylative +phosphorisation +phosphorise +phosphorised +phosphorising +phosphorism +phosphorite +phosphoritic +phosphorize +phosphorizing +phosphorogen +phosphorogene +phosphorogenic +phosphorograph +phosphorography +phosphorographic +phosphorolysis +phosphorolytic +phosphoroscope +phosphorous +phosphors +phosphoruria +phosphorus +phosphosilicate +phosphotartaric +phosphotungstate +phosphotungstic +phosphowolframic +phosphuranylite +phosphuret +phosphuria +phoss +phossy +phot +photaesthesia +photaesthesis +photaesthetic +photal +photalgia +photechy +photelectrograph +photeolic +photerythrous +photesthesis +photic +photically +photics +photinia +photinian +photinianism +photism +photistic +photo +photoactinic +photoactivate +photoactivation +photoactive +photoactivity +photoaesthetic +photoalbum +photoalgraphy +photoanamorphosis +photoaquatint +photoautotrophic +photoautotrophically +photobacterium +photobathic +photobiography +photobiology +photobiologic +photobiological +photobiologist +photobiotic +photobromide +photocampsis +photocatalysis +photocatalyst +photocatalytic +photocatalyzer +photocathode +photocell +photocells +photocellulose +photoceptor +photoceramic +photoceramics +photoceramist +photochemic +photochemical +photochemically +photochemigraphy +photochemist +photochemistry +photochloride +photochlorination +photochromascope +photochromatic +photochrome +photochromy +photochromic +photochromism +photochromography +photochromolithograph +photochromoscope +photochromotype +photochromotypy +photochronograph +photochronography +photochronographic +photochronographical +photochronographically +photocinesis +photocoagulation +photocollograph +photocollography +photocollographic +photocollotype +photocombustion +photocompose +photocomposed +photocomposer +photocomposes +photocomposing +photocomposition +photoconduction +photoconductive +photoconductivity +photoconductor +photocopy +photocopied +photocopier +photocopiers +photocopies +photocopying +photocrayon +photocurrent +photodecomposition +photodensitometer +photodermatic +photodermatism +photodetector +photodynamic +photodynamical +photodynamically +photodynamics +photodiode +photodiodes +photodisintegrate +photodisintegration +photodysphoria +photodissociate +photodissociation +photodissociative +photodrama +photodramatic +photodramatics +photodramatist +photodramaturgy +photodramaturgic +photodrome +photodromy +photoduplicate +photoduplication +photoed +photoelastic +photoelasticity +photoelectric +photoelectrical +photoelectrically +photoelectricity +photoelectron +photoelectronic +photoelectronics +photoelectrotype +photoemission +photoemissive +photoeng +photoengrave +photoengraved +photoengraver +photoengravers +photoengraves +photoengraving +photoengravings +photoepinasty +photoepinastic +photoepinastically +photoesthesis +photoesthetic +photoetch +photoetched +photoetcher +photoetching +photofilm +photofinish +photofinisher +photofinishing +photofission +photoflash +photoflight +photoflood +photofloodlamp +photofluorogram +photofluorograph +photofluorography +photofluorographic +photog +photogalvanograph +photogalvanography +photogalvanographic +photogastroscope +photogelatin +photogen +photogene +photogenetic +photogeny +photogenic +photogenically +photogenous +photogeology +photogeologic +photogeological +photogyric +photoglyph +photoglyphy +photoglyphic +photoglyphography +photoglyptic +photoglyptography +photogram +photogrammeter +photogrammetry +photogrammetric +photogrammetrical +photogrammetrist +photograph +photographable +photographed +photographee +photographer +photographeress +photographers +photographess +photography +photographic +photographical +photographically +photographing +photographist +photographize +photographometer +photographs +photograt +photogravure +photogravurist +photogs +photohalide +photoheliograph +photoheliography +photoheliographic +photoheliometer +photohyponasty +photohyponastic +photohyponastically +photoimpression +photoinactivation +photoinduced +photoinduction +photoinductive +photoing +photoinhibition +photointaglio +photoionization +photoisomeric +photoisomerization +photoist +photojournalism +photojournalist +photojournalistic +photojournalists +photokinesis +photokinetic +photolysis +photolyte +photolith +photolitho +photolithograph +photolithographer +photolithography +photolithographic +photolithographically +photolithoprint +photolytic +photolytically +photolyzable +photolyze +photology +photologic +photological +photologist +photoluminescence +photoluminescent +photoluminescently +photoluminescents +photom +photoma +photomacrograph +photomacrography +photomagnetic +photomagnetism +photomap +photomappe +photomapped +photomapper +photomappi +photomapping +photomaps +photomechanical +photomechanically +photometeor +photometer +photometers +photometry +photometric +photometrical +photometrically +photometrician +photometrist +photometrograph +photomezzotype +photomicrogram +photomicrograph +photomicrographer +photomicrography +photomicrographic +photomicrographical +photomicrographically +photomicrographs +photomicroscope +photomicroscopy +photomicroscopic +photomontage +photomorphogenesis +photomorphogenic +photomorphosis +photomultiplier +photomural +photomurals +photon +photonasty +photonastic +photonegative +photonephograph +photonephoscope +photoneutron +photonic +photonosus +photons +photonuclear +photooxidation +photooxidative +photopathy +photopathic +photoperceptive +photoperimeter +photoperiod +photoperiodic +photoperiodically +photoperiodism +photophane +photophygous +photophile +photophily +photophilic +photophilous +photophysical +photophysicist +photophobe +photophobia +photophobic +photophobous +photophone +photophony +photophonic +photophore +photophoresis +photophosphorescent +photophosphorylation +photopia +photopias +photopic +photopile +photopitometer +photoplay +photoplayer +photoplays +photoplaywright +photopography +photopolarigraph +photopolymer +photopolymerization +photopositive +photoprint +photoprinter +photoprinting +photoprocess +photoproduct +photoproduction +photoproton +photoptometer +photoradio +photoradiogram +photoreactivating +photoreactivation +photoreception +photoreceptive +photoreceptor +photoreconnaissance +photorecorder +photorecording +photoreduction +photoregression +photorelief +photoresist +photoresistance +photorespiration +photos +photosalt +photosantonic +photoscope +photoscopy +photoscopic +photosculptural +photosculpture +photosensitive +photosensitiveness +photosensitivity +photosensitization +photosensitize +photosensitized +photosensitizer +photosensitizes +photosensitizing +photosensory +photoset +photosets +photosetter +photosetting +photosyntax +photosynthate +photosyntheses +photosynthesis +photosynthesize +photosynthesized +photosynthesizes +photosynthesizing +photosynthetic +photosynthetically +photosynthometer +photospectroheliograph +photospectroscope +photospectroscopy +photospectroscopic +photospectroscopical +photosphere +photospheres +photospheric +photospherically +photostability +photostable +photostat +photostated +photostater +photostatic +photostatically +photostating +photostationary +photostats +photostatted +photostatter +photostatting +photostereograph +photosurveying +phototachometer +phototachometry +phototachometric +phototachometrical +phototactic +phototactically +phototactism +phototaxy +phototaxis +phototechnic +phototelegraph +phototelegraphy +phototelegraphic +phototelegraphically +phototelephone +phototelephony +phototelescope +phototelescopic +phototheodolite +phototherapeutic +phototherapeutics +phototherapy +phototherapic +phototherapies +phototherapist +photothermic +phototimer +phototype +phototypesetter +phototypesetters +phototypesetting +phototypy +phototypic +phototypically +phototypist +phototypography +phototypographic +phototonic +phototonus +phototopography +phototopographic +phototopographical +phototransceiver +phototransistor +phototrichromatic +phototrope +phototroph +phototrophy +phototrophic +phototropy +phototropic +phototropically +phototropism +phototube +photovisual +photovitrotype +photovoltaic +photoxylography +photozinco +photozincograph +photozincography +photozincographic +photozincotype +photozincotypy +photphotonegative +phots +photuria +phousdar +phpht +phr +phractamphibia +phragma +phragmidium +phragmites +phragmocyttares +phragmocyttarous +phragmocone +phragmoconic +phragmoid +phragmoplast +phragmosis +phrampel +phrarisaical +phrasable +phrasal +phrasally +phrase +phraseable +phrased +phrasey +phraseless +phrasem +phrasemake +phrasemaker +phrasemaking +phraseman +phrasemonger +phrasemongery +phrasemongering +phraseogram +phraseograph +phraseography +phraseographic +phraseology +phraseologic +phraseological +phraseologically +phraseologies +phraseologist +phraser +phrases +phrasy +phrasify +phrasiness +phrasing +phrasings +phrator +phratral +phratry +phratria +phratriac +phratrial +phratric +phratries +phreatic +phreatophyte +phreatophytic +phren +phrenesia +phrenesiac +phrenesis +phrenetic +phrenetical +phrenetically +phreneticness +phrenic +phrenicectomy +phrenicocolic +phrenicocostal +phrenicogastric +phrenicoglottic +phrenicohepatic +phrenicolienal +phrenicopericardiac +phrenicosplenic +phrenicotomy +phrenics +phrenitic +phrenitis +phrenocardia +phrenocardiac +phrenocolic +phrenocostal +phrenodynia +phrenogastric +phrenoglottic +phrenogrady +phrenograih +phrenogram +phrenograph +phrenography +phrenohepatic +phrenol +phrenologer +phrenology +phrenologic +phrenological +phrenologically +phrenologies +phrenologist +phrenologists +phrenologize +phrenomagnetism +phrenomesmerism +phrenopathy +phrenopathia +phrenopathic +phrenopericardiac +phrenoplegy +phrenoplegia +phrenosin +phrenosinic +phrenospasm +phrenosplenic +phrenotropic +phrenoward +phrensy +phrensied +phrensies +phrensying +phryganea +phryganeid +phryganeidae +phryganeoid +phrygia +phrygian +phrygianize +phrygium +phryma +phrymaceae +phrymaceous +phrynid +phrynidae +phrynin +phrynoid +phrynosoma +phronemophobia +phronesis +phronima +phronimidae +phrontistery +phrontisterion +phrontisterium +pht +phtalic +phthalacene +phthalan +phthalanilic +phthalate +phthalazin +phthalazine +phthalein +phthaleine +phthaleinometer +phthalic +phthalid +phthalide +phthalyl +phthalylsulfathiazole +phthalimide +phthalin +phthalins +phthalocyanine +phthanite +phthartolatrae +phthinoid +phthiocol +phthiriasis +phthirius +phthirophagous +phthises +phthisic +phthisical +phthisicky +phthisics +phthisiogenesis +phthisiogenetic +phthisiogenic +phthisiology +phthisiologist +phthisiophobia +phthisiotherapeutic +phthisiotherapy +phthisipneumony +phthisipneumonia +phthisis +phthongal +phthongometer +phthor +phthoric +phu +phugoid +phulkari +phulwa +phulwara +phut +pi +pia +pya +piaba +piacaba +piacevole +piache +piacle +piacula +piacular +piacularity +piacularly +piacularness +piaculum +pyaemia +pyaemias +pyaemic +piaffe +piaffed +piaffer +piaffers +piaffes +piaffing +pial +pyal +piala +pialyn +pyalla +pian +pianet +pianeta +pianette +piangendo +pianic +pianino +pianism +pianisms +pianissimo +pianissimos +pianist +pianiste +pianistic +pianistically +pianistiec +pianists +pianka +piankashaw +piannet +piano +pianoforte +pianofortes +pianofortist +pianograph +pianokoto +pianola +pianolist +pianologue +pianos +pianosa +pians +piarhaemic +piarhemia +piarhemic +piarist +piaroa +piaroan +piaropus +piarroan +pyarthrosis +pias +pyas +piasaba +piasabas +piasava +piasavas +piassaba +piassabas +piassava +piassavas +piast +piaster +piasters +piastre +piastres +piation +piatti +piazadora +piazin +piazine +piazza +piazzaed +piazzaless +piazzalike +piazzas +piazze +piazzetta +piazzian +pibal +pibcorn +pibgorn +piblockto +piblokto +pibloktos +pibroch +pibroches +pibrochs +pic +pica +picacho +picachos +picador +picadores +picadors +picadura +picae +picayune +picayunes +picayunish +picayunishly +picayunishness +pical +picamar +picaninny +picaninnies +picara +picaras +picard +picarel +picaresque +picary +picariae +picarian +picarii +picaro +picaroon +picarooned +picarooning +picaroons +picaros +picas +picasso +piccadill +piccadilly +piccage +piccalilli +piccalillis +piccanin +piccaninny +piccaninnies +piccante +piccata +picciotto +piccolo +piccoloist +piccolos +pice +picea +picein +picene +picenian +piceoferruginous +piceotestaceous +piceous +piceworth +pich +pyche +pichey +pichi +pichiciago +pichiciagos +pichiciego +pichuric +pichurim +pici +picidae +piciform +piciformes +picinae +picine +pick +pickaback +pickable +pickableness +pickadil +pickadils +pickage +pickaninny +pickaninnies +pickaroon +pickaway +pickax +pickaxe +pickaxed +pickaxes +pickaxing +pickback +picked +pickedevant +pickedly +pickedness +pickee +pickeer +pickeered +pickeering +pickeers +pickel +pickelhaube +picker +pickerel +pickerels +pickerelweed +pickery +pickering +pickeringite +pickers +picket +picketboat +picketed +picketeer +picketer +picketers +picketing +pickets +pickfork +picky +pickier +pickiest +pickietar +pickin +picking +pickings +pickle +pickled +picklelike +pickleman +pickler +pickles +pickleweed +pickleworm +pickling +picklock +picklocks +pickman +pickmaw +pickmen +picknick +picknicker +pickoff +pickoffs +pickout +pickover +pickpenny +pickpocket +pickpocketism +pickpocketry +pickpockets +pickpole +pickproof +pickpurse +picks +pickshaft +picksman +picksmith +picksome +picksomeness +pickthank +pickthankly +pickthankness +pickthatch +picktooth +pickup +pickups +pickwick +pickwickian +pickwickianism +pickwickianly +pickwicks +pickwork +picloram +piclorams +pycnanthemum +pycnia +pycnial +picnic +pycnic +picnicked +picnicker +picnickery +picnickers +picnicky +picnickian +picnicking +picnickish +picnics +pycnid +pycnidia +pycnidial +pycnidiophore +pycnidiospore +pycnidium +pycninidia +pycniospore +pycnite +pycnium +pycnocoma +pycnoconidium +pycnodont +pycnodonti +pycnodontidae +pycnodontoid +pycnodus +pycnogonid +pycnogonida +pycnogonidium +pycnogonoid +picnometer +pycnometer +pycnometochia +pycnometochic +pycnomorphic +pycnomorphous +pycnonotidae +pycnonotinae +pycnonotine +pycnonotus +pycnosis +pycnospore +pycnosporic +pycnostyle +pycnotic +pico +picocurie +picofarad +picogram +picograms +picoid +picojoule +picolin +picoline +picolines +picolinic +picolins +picometer +picong +picory +picornavirus +picosecond +picoseconds +picot +picotah +picote +picoted +picotee +picotees +picoting +picotite +picots +picottah +picowatt +picquet +picqueter +picquets +picra +picramic +picramnia +picrasmin +picrate +picrated +picrates +picry +picric +picryl +picris +picrite +picrites +picrocarmine +picrodendraceae +picrodendron +picroerythrin +picrol +picrolite +picromerite +picropodophyllin +picrorhiza +picrorhizin +picrotin +picrotoxic +picrotoxin +picrotoxinin +pics +pict +pictarnie +pictavi +pictish +pictland +pictogram +pictograph +pictography +pictographic +pictographically +pictographs +pictones +pictoradiogram +pictorial +pictorialisation +pictorialise +pictorialised +pictorialising +pictorialism +pictorialist +pictorialization +pictorialize +pictorially +pictorialness +pictorials +pictoric +pictorical +pictorically +pictun +picturability +picturable +picturableness +picturably +pictural +picture +picturecraft +pictured +picturedom +picturedrome +pictureful +picturegoer +pictureless +picturely +picturelike +picturemaker +picturemaking +picturephone +picturephones +picturer +picturers +pictures +picturesque +picturesquely +picturesqueness +picturesquish +pictury +picturing +picturization +picturize +picturized +picturizing +picucule +picuda +picudilla +picudo +picul +picule +piculet +piculs +piculule +picumninae +picumnus +picunche +picuris +picus +pidan +piddle +piddled +piddler +piddlers +piddles +piddling +piddlingly +piddock +piddocks +pidgin +pidginization +pidginize +pidgins +pidgized +pidgizing +pidjajap +pie +pye +piebald +piebaldism +piebaldly +piebaldness +piebalds +piece +pieceable +pieced +pieceless +piecemaker +piecemeal +piecemealwise +piecen +piecener +piecer +piecers +pieces +piecette +piecewise +piecework +pieceworker +pieceworkers +piecing +piecings +piecrust +piecrusts +pied +piedfort +piedforts +piedly +piedmont +piedmontal +piedmontese +piedmontite +piedmonts +piedness +piedra +piedroit +piefort +pieforts +piegan +piehouse +pieing +pyelectasis +pieless +pielet +pyelic +pielike +pyelitic +pyelitis +pyelitises +pyelocystitis +pyelogram +pyelograph +pyelography +pyelographic +pyelolithotomy +pyelometry +pyelonephritic +pyelonephritis +pyelonephrosis +pyeloplasty +pyeloscopy +pyelotomy +pyeloureterogram +pielum +piemag +pieman +piemarker +pyemesis +pyemia +pyemias +pyemic +pien +pienaar +pienanny +piend +pyengadu +pientao +piepan +pieplant +pieplants +piepoudre +piepowder +pieprint +pier +pierage +piercarlo +pierce +pierceable +pierced +piercel +pierceless +piercent +piercer +piercers +pierces +piercing +piercingly +piercingness +pierdrop +pierette +pierhead +pierian +pierid +pieridae +pierides +pieridinae +pieridine +pierinae +pierine +pieris +pierless +pierlike +pierre +pierrette +pierrot +pierrotic +pierrots +piers +piert +pies +pyes +pieshop +piest +piet +pieta +pietas +piete +pieter +piety +pietic +pieties +pietism +pietisms +pietist +pietistic +pietistical +pietistically +pietisticalness +pietists +pieton +pietose +pietoso +piewife +piewipe +piewoman +piezo +piezochemical +piezochemistry +piezochemistries +piezocrystallization +piezoelectric +piezoelectrically +piezoelectricity +piezometer +piezometry +piezometric +piezometrical +pifero +piff +piffero +piffle +piffled +piffler +piffles +piffling +pifine +pig +pygal +pygalgia +pygarg +pygargus +pigbelly +pigboat +pigboats +pigdan +pigdom +pigeon +pigeonable +pigeonberry +pigeonberries +pigeoneer +pigeoner +pigeonfoot +pigeongram +pigeonhearted +pigeonheartedness +pigeonhole +pigeonholed +pigeonholer +pigeonholes +pigeonholing +pigeonite +pigeonman +pigeonneau +pigeonpox +pigeonry +pigeons +pigeontail +pigeonweed +pigeonwing +pigeonwood +pigface +pigfish +pigfishes +pigflower +pigfoot +pigful +pigg +pigged +piggery +piggeries +piggy +piggyback +piggybacked +piggybacking +piggybacks +piggie +piggier +piggies +piggiest +piggin +pigging +piggins +piggish +piggishly +piggishness +piggle +pighead +pigheaded +pigheadedly +pigheadedness +pigherd +pight +pightel +pightle +pigyard +pygidia +pygidial +pygidid +pygididae +pygidium +pygigidia +pigless +piglet +piglets +pigly +piglike +pigling +piglinghood +pygmaean +pigmaker +pigmaking +pygmalion +pygmalionism +pigman +pygmean +pigmeat +pigment +pigmental +pigmentally +pigmentary +pigmentation +pigmentations +pigmented +pigmenting +pigmentize +pigmentolysis +pigmentophage +pigmentose +pigments +pigmew +pigmy +pygmy +pygmydom +pigmies +pygmies +pygmyhood +pygmyish +pygmyism +pygmyisms +pygmyship +pygmyweed +pygmoid +pignet +pignolia +pignon +pignora +pignorate +pignorated +pignoration +pignoratitious +pignorative +pignus +pignut +pignuts +pygobranchia +pygobranchiata +pygobranchiate +pygofer +pygopagus +pygopod +pygopodes +pygopodidae +pygopodine +pygopodous +pygopus +pygostyle +pygostyled +pygostylous +pigpen +pigpens +pigritia +pigritude +pigroot +pigroots +pigs +pigsconce +pigskin +pigskins +pigsney +pigsneys +pigsnies +pigsty +pigstick +pigsticked +pigsticker +pigsticking +pigsticks +pigsties +pigswill +pigtail +pigtailed +pigtails +pigwash +pigweabbits +pigweed +pigweeds +pigwidgeon +pigwidgin +pigwigeon +pyic +pyin +piing +pyins +piitis +pyjama +pyjamaed +pyjamas +pik +pika +pikake +pikakes +pikas +pike +pyke +pikeblenny +pikeblennies +piked +pikey +pikel +pikelet +pikelike +pikeman +pikemen +pikemonger +pikeperch +pikeperches +piker +pikers +pikes +pikestaff +pikestaves +piketail +piki +piky +piking +pikle +pyknatom +pyknic +pyknics +pyknotic +pil +pyla +pylades +pilaf +pilaff +pilaffs +pilafs +pilage +pylagore +pilandite +pylangial +pylangium +pilapil +pilar +pylar +pilary +pilaster +pilastered +pilastering +pilasters +pilastrade +pilastraded +pilastric +pilate +pilatian +pilau +pilaued +pilaus +pilaw +pilaws +pilch +pilchard +pilchards +pilcher +pilcherd +pilcorn +pilcrow +pile +pilea +pileata +pileate +pileated +piled +pilei +pileiform +pileless +pileolated +pileoli +pileolus +pileorhiza +pileorhize +pileous +pylephlebitic +pylephlebitis +piler +pilers +piles +pylethrombophlebitis +pylethrombosis +pileum +pileup +pileups +pileus +pileweed +pilework +pileworm +pilewort +pileworts +pilfer +pilferage +pilfered +pilferer +pilferers +pilfery +pilfering +pilferingly +pilferment +pilfers +pilfre +pilgarlic +pilgarlicky +pilger +pilgrim +pilgrimage +pilgrimaged +pilgrimager +pilgrimages +pilgrimaging +pilgrimatic +pilgrimatical +pilgrimdom +pilgrimer +pilgrimess +pilgrimism +pilgrimize +pilgrimlike +pilgrims +pilgrimwise +pili +pily +pylic +pilidium +pilies +pilifer +piliferous +piliform +piligan +piliganin +piliganine +piligerous +pilikai +pilikia +pililloo +pilimiction +pilin +piline +piling +pilings +pilipilula +pilis +pilitico +pilkins +pill +pillage +pillageable +pillaged +pillagee +pillager +pillagers +pillages +pillaging +pillar +pillared +pillaret +pillary +pillaring +pillarist +pillarize +pillarlet +pillarlike +pillars +pillarwise +pillas +pillbox +pillboxes +pilled +pilledness +piller +pillery +pillet +pilleus +pillhead +pillicock +pilling +pillion +pillions +pilliver +pilliwinks +pillmaker +pillmaking +pillmonger +pillory +pilloried +pillories +pillorying +pillorization +pillorize +pillow +pillowbeer +pillowber +pillowbere +pillowcase +pillowcases +pillowed +pillowy +pillowing +pillowless +pillowlike +pillowmade +pillows +pillowslip +pillowslips +pillowwork +pills +pillular +pillule +pillworm +pillwort +pilm +pilmy +pilobolus +pilocarpidine +pilocarpin +pilocarpine +pilocarpus +pilocereus +pilocystic +piloerection +pilomotor +pilon +pylon +piloncillo +pilonidal +pylons +pyloralgia +pylorectomy +pylorectomies +pilori +pylori +pyloric +pyloristenosis +pyloritis +pylorocleisis +pylorodilator +pylorogastrectomy +pyloroplasty +pyloroptosis +pyloroschesis +pyloroscirrhus +pyloroscopy +pylorospasm +pylorostenosis +pylorostomy +pylorous +pylorouses +pylorus +pyloruses +pilose +pilosebaceous +pilosin +pilosine +pilosis +pilosism +pilosity +pilosities +pilot +pilotage +pilotages +pilotaxitic +piloted +pilotee +pilotfish +pilotfishes +pilothouse +pilothouses +piloti +piloting +pilotings +pilotism +pilotless +pilotman +pilotry +pilots +pilotship +pilotweed +pilous +pilpai +pilpay +pilpul +pilpulist +pilpulistic +pilsener +pilseners +pilsner +pilsners +piltock +pilula +pilular +pilularia +pilule +pilules +pilulist +pilulous +pilum +pilumnus +pilus +pilusli +pilwillet +pim +pima +piman +pimaric +pimas +pimbina +pimelate +pimelea +pimelic +pimelite +pimelitis +piment +pimenta +pimentel +pimento +pimenton +pimentos +pimgenet +pimienta +pimiento +pimientos +pimlico +pimola +pimp +pimped +pimpery +pimperlimpimp +pimpernel +pimpernels +pimpinella +pimping +pimpish +pimpla +pimple +pimpleback +pimpled +pimpleproof +pimples +pimply +pimplier +pimpliest +pimplinae +pimpliness +pimpling +pimplo +pimploe +pimplous +pimps +pimpship +pin +pina +pinabete +pinaceae +pinaceous +pinaces +pinachrome +pinacyanol +pinacle +pinacoceras +pinacoceratidae +pinacocytal +pinacocyte +pinacoid +pinacoidal +pinacol +pinacolate +pinacolic +pinacolin +pinacoline +pinacone +pinacoteca +pinacotheca +pinaculum +pinafore +pinafores +pinayusa +pinakiolite +pinakoid +pinakoidal +pinakotheke +pinal +pinaleno +pinales +pinang +pinangs +pinard +pinards +pinas +pinaster +pinasters +pinata +pinatas +pinatype +pinaverdol +pinax +pinball +pinballs +pinbefore +pinbone +pinbones +pinbrain +pinbush +pincase +pincement +pincer +pincerlike +pincers +pincerweed +pincette +pinch +pinchable +pinchback +pinchbeck +pinchbelly +pinchbottle +pinchbug +pinchbugs +pinchcock +pinchcommons +pinchcrust +pinche +pincheck +pinchecks +pinched +pinchedly +pinchedness +pinchem +pincher +pinchers +pinches +pinchfist +pinchfisted +pinchgut +pinching +pinchingly +pinchpenny +pincian +pinckneya +pincoffin +pincpinc +pinctada +pincushion +pincushiony +pincushions +pind +pinda +pindal +pindari +pindaric +pindarical +pindarically +pindarics +pindarism +pindarist +pindarize +pindarus +pinder +pinders +pindy +pindjajap +pindling +pine +pineal +pinealectomy +pinealism +pinealoma +pineapple +pineapples +pinebank +pinecone +pinecones +pined +pinedrops +piney +pineland +pinelike +pinene +pinenes +piner +pinery +pineries +pines +pinesap +pinesaps +pineta +pinetum +pineweed +pinewood +pinewoods +pinfall +pinfeather +pinfeathered +pinfeatherer +pinfeathery +pinfeathers +pinfire +pinfish +pinfishes +pinfold +pinfolded +pinfolding +pinfolds +ping +pinge +pinged +pinger +pingers +pinging +pingle +pingler +pingo +pingos +pingrass +pingrasses +pings +pingster +pingue +pinguecula +pinguedinous +pinguefaction +pinguefy +pinguescence +pinguescent +pinguicula +pinguiculaceae +pinguiculaceous +pinguid +pinguidity +pinguiferous +pinguin +pinguinitescent +pinguite +pinguitude +pinguitudinous +pinhead +pinheaded +pinheadedness +pinheads +pinhold +pinhole +pinholes +pinhook +piny +pinic +pinicoline +pinicolous +pinier +piniest +piniferous +piniform +pinyin +pinyl +pining +piningly +pinings +pinion +pinyon +pinioned +pinioning +pinionless +pinionlike +pinions +pinyons +pinipicrin +pinitannic +pinite +pinites +pinitol +pinivorous +pinjane +pinjra +pink +pinkany +pinkberry +pinked +pinkeen +pinkey +pinkeye +pinkeyes +pinkeys +pinken +pinkeny +pinker +pinkerton +pinkertonism +pinkest +pinkfish +pinkfishes +pinky +pinkie +pinkies +pinkify +pinkified +pinkifying +pinkily +pinkiness +pinking +pinkings +pinkish +pinkishness +pinkly +pinkness +pinknesses +pinko +pinkoes +pinkos +pinkroot +pinkroots +pinks +pinksome +pinkster +pinkweed +pinkwood +pinkwort +pinless +pinlock +pinmaker +pinmaking +pinman +pinna +pinnace +pinnaces +pinnacle +pinnacled +pinnacles +pinnaclet +pinnacling +pinnae +pinnage +pinnaglobin +pinnal +pinnas +pinnate +pinnated +pinnatedly +pinnately +pinnatifid +pinnatifidly +pinnatilobate +pinnatilobed +pinnation +pinnatipartite +pinnatiped +pinnatisect +pinnatisected +pinnatodentate +pinnatopectinate +pinnatulate +pinned +pinnel +pinner +pinners +pinnet +pinny +pinnidae +pinniferous +pinniform +pinnigerous +pinnigrada +pinnigrade +pinninervate +pinninerved +pinning +pinningly +pinnings +pinniped +pinnipedia +pinnipedian +pinnipeds +pinnisect +pinnisected +pinnitarsal +pinnitentaculate +pinniwinkis +pinnywinkle +pinnywinkles +pinnock +pinnoite +pinnotere +pinnothere +pinnotheres +pinnotherian +pinnotheridae +pinnula +pinnulae +pinnular +pinnulate +pinnulated +pinnule +pinnules +pinnulet +pino +pinocchio +pinochle +pinochles +pinocytosis +pinocytotic +pinocytotically +pinocle +pinocles +pinole +pinoles +pinoleum +pinolia +pinolin +pinon +pinones +pinonic +pinons +pinot +pynot +pinoutpinpatch +pinpillow +pinpoint +pinpointed +pinpointing +pinpoints +pinprick +pinpricked +pinpricking +pinpricks +pinproof +pinrail +pinrowed +pins +pinscher +pinschers +pinsetter +pinsetters +pinson +pinsons +pinspotter +pinspotters +pinstripe +pinstriped +pinstripes +pint +pinta +pintada +pintadas +pintadera +pintado +pintadoes +pintadoite +pintados +pintail +pintails +pintano +pintanos +pintas +pinte +pintid +pintle +pintles +pinto +pintoes +pintos +pints +pintsize +pintura +pinuela +pinulus +pynung +pinup +pinups +pinus +pinwale +pinwales +pinweed +pinweeds +pinwheel +pinwheels +pinwing +pinwork +pinworks +pinworm +pinworms +pinx +pinxit +pinxter +pyobacillosis +pyocele +pyocyanase +pyocyanin +pyocyst +pyocyte +pyoctanin +pyoctanine +pyoderma +pyodermas +pyodermatitis +pyodermatosis +pyodermia +pyodermic +pyogenesis +pyogenetic +pyogenic +pyogenin +pyogenous +pyohemothorax +pyoid +pyolabyrinthitis +piolet +piolets +pyolymph +pyometra +pyometritis +pion +pioned +pioneer +pioneerdom +pioneered +pioneering +pioneers +pioneership +pyonephritis +pyonephrosis +pyonephrotic +pionery +pyongyang +pionic +pionnotes +pions +pyopericarditis +pyopericardium +pyoperitoneum +pyoperitonitis +pyophagia +pyophylactic +pyophthalmia +pyophthalmitis +pyoplania +pyopneumocholecystitis +pyopneumocyst +pyopneumopericardium +pyopneumoperitoneum +pyopneumoperitonitis +pyopneumothorax +pyopoiesis +pyopoietic +pyoptysis +pyorrhea +pyorrheal +pyorrheas +pyorrheic +pyorrhoea +pyorrhoeal +pyorrhoeic +pyosalpingitis +pyosalpinx +pioscope +pyosepticemia +pyosepticemic +pyoses +pyosis +piosity +piosities +pyospermia +pioted +pyotherapy +pyothorax +piotine +pyotoxinemia +piotr +piotty +pioupiou +pyoureter +pioury +pious +piously +piousness +pyovesiculosis +pyoxanthose +pioxe +pip +pipa +pipage +pipages +pipal +pipals +pipe +pipeage +pipeages +pipeclay +pipecolin +pipecoline +pipecolinic +piped +pipedream +pipefish +pipefishes +pipefitter +pipefitting +pipeful +pipefuls +pipey +pipelayer +pipelaying +pipeless +pipelike +pipeline +pipelined +pipelines +pipelining +pipeman +pipemouth +piper +piperaceae +piperaceous +piperales +piperate +piperazin +piperazine +pipery +piperic +piperide +piperideine +piperidge +piperidid +piperidide +piperidin +piperidine +piperylene +piperine +piperines +piperitious +piperitone +piperly +piperno +piperocaine +piperoid +piperonal +piperonyl +pipers +pipes +pipestapple +pipestem +pipestems +pipestone +pipet +pipets +pipette +pipetted +pipettes +pipetting +pipewalker +pipewood +pipework +pipewort +pipi +pipy +pipid +pipidae +pipier +pipiest +pipikaula +pipil +pipile +pipilo +piping +pipingly +pipingness +pipings +pipiri +pipistrel +pipistrelle +pipistrellus +pipit +pipits +pipkin +pipkinet +pipkins +pipless +pipped +pippen +pipper +pipperidge +pippy +pippier +pippiest +pippin +pippiner +pippinface +pipping +pippins +pipple +pipra +pipridae +piprinae +piprine +piproid +pips +pipsissewa +pipsqueak +pipsqueaks +piptadenia +piptomeris +piptonychia +pipunculid +pipunculidae +piqu +piquable +piquance +piquancy +piquancies +piquant +piquantly +piquantness +pique +piqued +piquero +piques +piquet +piquets +piquette +piqueur +piquia +piquiere +piquing +piqure +pir +pyr +pyracanth +pyracantha +pyraceae +pyracene +piracy +piracies +pyragravure +piragua +piraguas +piraya +pirayas +pyral +pyrales +pyralid +pyralidae +pyralidan +pyralidid +pyralididae +pyralidiform +pyralidoidea +pyralids +pyralis +pyraloid +pyrameis +pyramid +pyramidaire +pyramidal +pyramidale +pyramidalis +pyramidalism +pyramidalist +pyramidally +pyramidate +pyramided +pyramidella +pyramidellid +pyramidellidae +pyramider +pyramides +pyramidia +pyramidic +pyramidical +pyramidically +pyramidicalness +pyramiding +pyramidion +pyramidist +pyramidize +pyramidlike +pyramidoattenuate +pyramidoid +pyramidoidal +pyramidologist +pyramidon +pyramidoprismatic +pyramids +pyramidwise +pyramimidia +pyramoid +pyramoidal +pyramus +pyran +pirana +piranas +pirandellian +piranga +piranha +piranhas +pyranyl +pyranoid +pyranometer +pyranose +pyranoses +pyranoside +pyrans +pyrargyrite +pirarucu +pirarucus +pirate +pirated +piratelike +piratery +pirates +piratess +piraty +piratic +piratical +piratically +pirating +piratism +piratize +piratry +pyrausta +pyraustinae +pyrazin +pyrazine +pyrazole +pyrazolyl +pyrazoline +pyrazolone +pyre +pyrectic +pyrena +pirene +pyrene +pyrenean +pyrenees +pyrenematous +pyrenes +pyrenic +pyrenin +pyrenocarp +pyrenocarpic +pyrenocarpous +pyrenochaeta +pyrenodean +pyrenodeine +pyrenodeous +pyrenoid +pyrenoids +pyrenolichen +pyrenomycetales +pyrenomycete +pyrenomycetes +pyrenomycetineae +pyrenomycetous +pyrenopeziza +pyres +pyrethrin +pyrethrine +pyrethroid +pyrethrum +pyretic +pyreticosis +pyretogenesis +pyretogenetic +pyretogenic +pyretogenous +pyretography +pyretolysis +pyretology +pyretologist +pyretotherapy +pyrewinkes +pyrex +pyrexia +pyrexial +pyrexias +pyrexic +pyrexical +pyrgeometer +pyrgocephaly +pyrgocephalic +pyrgoidal +pyrgologist +pyrgom +pyrheliometer +pyrheliometry +pyrheliometric +pyrheliophor +pyribole +pyric +piricularia +pyridazine +pyridic +pyridyl +pyridine +pyridines +pyridinium +pyridinize +pyridone +pyridoxal +pyridoxamine +pyridoxin +pyridoxine +pyriform +piriformes +piriformis +pyriformis +pirijiri +pyrylium +pyrimethamine +pyrimidyl +pyrimidin +pyrimidine +piripiri +piririgua +pyritaceous +pyrite +pyrites +pyritic +pyritical +pyritiferous +pyritization +pyritize +pyritohedral +pyritohedron +pyritoid +pyritology +pyritous +pirl +pirlie +pirn +pirned +pirner +pirny +pirnie +pirns +piro +pyro +pyroacetic +pyroacid +pyroantimonate +pyroantimonic +pyroarsenate +pyroarsenic +pyroarsenious +pyroarsenite +pyroballogy +pyrobelonite +pyrobi +pyrobitumen +pyrobituminous +pyroborate +pyroboric +pyrocatechin +pyrocatechinol +pyrocatechol +pyrocatechuic +pyrocellulose +pyrochemical +pyrochemically +pyrochlore +pyrochromate +pyrochromic +pyrocinchonic +pyrocystis +pyrocitric +pyroclastic +pyrocoll +pyrocollodion +pyrocomenic +pyrocondensation +pyroconductivity +pyrocotton +pyrocrystalline +pyrodine +pyroelectric +pyroelectricity +pirog +pyrogallate +pyrogallic +pyrogallol +pirogen +pyrogen +pyrogenation +pyrogenesia +pyrogenesis +pyrogenetic +pyrogenetically +pyrogenic +pyrogenicity +pyrogenous +pyrogens +pyrogentic +piroghi +pirogi +pyroglazer +pyroglutamic +pyrognomic +pyrognostic +pyrognostics +pyrograph +pyrographer +pyrography +pyrographic +pyrographies +pyrogravure +pyroguaiacin +pirogue +pirogues +pyroheliometer +pyroid +pirojki +pirol +pyrola +pyrolaceae +pyrolaceous +pyrolas +pyrolater +pyrolatry +pyroligneous +pyrolignic +pyrolignite +pyrolignous +pyroline +pyrolysate +pyrolyse +pyrolysis +pyrolite +pyrolytic +pyrolytically +pyrolyzable +pyrolyzate +pyrolyze +pyrolyzed +pyrolyzer +pyrolyzes +pyrolyzing +pyrollogical +pyrology +pyrological +pyrologies +pyrologist +pyrolusite +pyromachy +pyromagnetic +pyromancer +pyromancy +pyromania +pyromaniac +pyromaniacal +pyromaniacs +pyromantic +pyromeconic +pyromellitic +pyrometallurgy +pyrometallurgical +pyrometamorphic +pyrometamorphism +pyrometer +pyrometers +pyrometry +pyrometric +pyrometrical +pyrometrically +pyromorphidae +pyromorphism +pyromorphite +pyromorphous +pyromotor +pyromucate +pyromucic +pyromucyl +pyronaphtha +pyrone +pyronema +pyrones +pyronine +pyronines +pyroninophilic +pyronyxis +pyronomics +piroot +pyrope +pyropen +pyropes +pyrophanite +pyrophanous +pyrophile +pyrophilia +pyrophyllite +pyrophilous +pyrophysalite +pyrophobia +pyrophone +pyrophoric +pyrophorous +pyrophorus +pyrophosphate +pyrophosphatic +pyrophosphoric +pyrophosphorous +pyrophotograph +pyrophotography +pyrophotometer +piroplasm +piroplasma +piroplasmata +piroplasmic +piroplasmosis +piroplasms +pyropuncture +pyropus +piroque +piroques +pyroracemate +pyroracemic +pyroscope +pyroscopy +piroshki +pyrosis +pyrosises +pyrosmalite +pyrosoma +pyrosomatidae +pyrosome +pyrosomidae +pyrosomoid +pyrosphere +pyrostat +pyrostats +pyrostereotype +pyrostilpnite +pyrosulfate +pyrosulfuric +pyrosulphate +pyrosulphite +pyrosulphuric +pyrosulphuryl +pirot +pyrotantalate +pyrotartaric +pyrotartrate +pyrotechny +pyrotechnian +pyrotechnic +pyrotechnical +pyrotechnically +pyrotechnician +pyrotechnics +pyrotechnist +pyroterebic +pyrotheology +pyrotheria +pyrotherium +pyrotic +pyrotoxin +pyrotritaric +pyrotritartric +pirouette +pirouetted +pirouetter +pirouettes +pirouetting +pirouettist +pyrouric +pyrovanadate +pyrovanadic +pyroxanthin +pyroxene +pyroxenes +pyroxenic +pyroxenite +pyroxenitic +pyroxenoid +pyroxyle +pyroxylene +pyroxylic +pyroxylin +pyroxyline +pyroxmangite +pyroxonium +pirozhki +pirozhok +pirquetted +pirquetter +pirr +pirraura +pirrauru +pyrrha +pyrrhic +pyrrhichian +pyrrhichius +pyrrhicist +pyrrhics +pyrrhocoridae +pyrrhonean +pyrrhonian +pyrrhonic +pyrrhonism +pyrrhonist +pyrrhonistic +pyrrhonize +pyrrhotine +pyrrhotism +pyrrhotist +pyrrhotite +pyrrhous +pyrrhuloxia +pyrrhus +pirrie +pyrryl +pyrrylene +pirrmaw +pyrrodiazole +pyrroyl +pyrrol +pyrrole +pyrroles +pyrrolic +pyrrolidyl +pyrrolidine +pyrrolidone +pyrrolylene +pyrroline +pyrrols +pyrrophyllin +pyrroporphyrin +pyrrotriazole +pirssonite +pyrula +pyrularia +pyruline +pyruloid +pyrus +pyruvaldehyde +pyruvate +pyruvates +pyruvic +pyruvil +pyruvyl +pyruwl +pis +pisa +pisaca +pisacha +pisachee +pisachi +pisay +pisan +pisang +pisanite +pisauridae +piscary +piscaries +piscataqua +piscataway +piscation +piscatology +piscator +piscatory +piscatorial +piscatorialist +piscatorially +piscatorian +piscatorious +piscators +pisces +piscian +piscicapture +piscicapturist +piscicide +piscicolous +piscicultural +pisciculturally +pisciculture +pisciculturist +piscid +piscidia +piscifauna +pisciferous +pisciform +piscina +piscinae +piscinal +piscinas +piscine +piscinity +piscioid +piscis +piscivorous +pisco +pise +pisgah +pish +pishaug +pished +pishes +pishing +pishogue +pishpash +pishposh +pishquow +pishu +pisidium +pisiform +pisiforms +pisistance +pisistratean +pisistratidae +pisk +pisky +piskun +pismire +pismires +pismirism +piso +pisolite +pisolites +pisolitic +pisonia +pisote +piss +pissabed +pissant +pissants +pissasphalt +pissed +pisses +pissing +pissodes +pissoir +pissoirs +pist +pistache +pistaches +pistachio +pistachios +pistacia +pistacite +pistareen +piste +pisteology +pistia +pistic +pistick +pistil +pistillaceous +pistillar +pistillary +pistillate +pistillid +pistillidium +pistilliferous +pistilliform +pistilligerous +pistilline +pistillode +pistillody +pistilloid +pistilogy +pistils +pistiology +pistle +pistler +pistoiese +pistol +pistolade +pistole +pistoled +pistoleer +pistoles +pistolet +pistoleter +pistoletier +pistolgram +pistolgraph +pistolier +pistoling +pistolled +pistollike +pistolling +pistology +pistolography +pistolproof +pistols +pistolwise +piston +pistonhead +pistonlike +pistons +pistrices +pistrix +pisum +pit +pita +pitahaya +pitahauerat +pitahauirata +pitaya +pitayita +pitanga +pitangua +pitapat +pitapatation +pitapats +pitapatted +pitapatting +pitarah +pitas +pitastile +pitau +pitawas +pitbird +pitcairnia +pitch +pitchable +pitchblende +pitched +pitcher +pitchered +pitcherful +pitcherfuls +pitchery +pitcherlike +pitcherman +pitchers +pitches +pitchfield +pitchfork +pitchforks +pitchhole +pitchi +pitchy +pitchier +pitchiest +pitchily +pitchiness +pitching +pitchlike +pitchman +pitchmen +pitchometer +pitchout +pitchouts +pitchpike +pitchpole +pitchpoll +pitchpot +pitchstone +pitchwork +piteira +piteous +piteously +piteousness +pitfall +pitfalls +pitfold +pith +pythagoras +pythagorean +pythagoreanism +pythagoreanize +pythagoreanly +pythagoreans +pythagoric +pythagorical +pythagorically +pythagorism +pythagorist +pythagorize +pythagorizer +pithanology +pithead +pitheads +pithecan +pithecanthrope +pithecanthropi +pithecanthropic +pithecanthropid +pithecanthropidae +pithecanthropine +pithecanthropoid +pithecanthropus +pithecia +pithecian +pitheciinae +pitheciine +pithecism +pithecoid +pithecolobium +pithecology +pithecological +pithecometric +pithecomorphic +pithecomorphism +pithecus +pithed +pithes +pithful +pithy +pythia +pythiaceae +pythiacystis +pythiad +pythiambic +pythian +pythias +pythic +pithier +pithiest +pithily +pithiness +pithing +pythios +pythium +pythius +pithless +pithlessly +pithoegia +pythogenesis +pythogenetic +pythogenic +pythogenous +pithoi +pithoigia +pithole +python +pythoness +pythonic +pythonical +pythonid +pythonidae +pythoniform +pythoninae +pythonine +pythonism +pythonissa +pythonist +pythonize +pythonoid +pythonomorph +pythonomorpha +pythonomorphic +pythonomorphous +pythons +pithos +piths +pithsome +pithwork +pity +pitiability +pitiable +pitiableness +pitiably +pitied +pitiedly +pitiedness +pitier +pitiers +pities +pitiful +pitifuller +pitifullest +pitifully +pitifulness +pitying +pityingly +pitikins +pitiless +pitilessly +pitilessness +pitylus +pityocampa +pityocampe +pityproof +pityriasic +pityriasis +pityrogramma +pityroid +pitirri +pitless +pitlike +pitmaker +pitmaking +pitman +pitmans +pitmark +pitmen +pitmenpitmirk +pitmirk +pitocin +pitometer +pitomie +piton +pitons +pitpan +pitpit +pitprop +pitressin +pitris +pits +pitsaw +pitsaws +pitside +pitta +pittacal +pittance +pittancer +pittances +pittard +pitted +pitter +pitticite +pittidae +pittine +pitting +pittings +pittism +pittite +pittoid +pittosporaceae +pittosporaceous +pittospore +pittosporum +pittsburgher +pituicyte +pituita +pituital +pituitary +pituitaries +pituite +pituitous +pituitousness +pituitrin +pituri +pitwood +pitwork +pitwright +piu +piupiu +piuri +pyuria +pyurias +piuricapsular +pius +piute +pivalic +pivot +pivotable +pivotal +pivotally +pivoted +pivoter +pivoting +pivotman +pivots +pyvuril +piwut +pix +pyx +pixel +pixels +pixes +pyxes +pixy +pyxidanthera +pyxidate +pyxides +pyxidia +pyxidium +pixie +pyxie +pixieish +pixies +pyxies +pixyish +pixilated +pixilation +pixiness +pixinesses +pyxis +pizaine +pizazz +pizazzes +pize +pizz +pizza +pizzas +pizzazz +pizzazzes +pizzeria +pizzerias +pizzicato +pizzle +pizzles +pk +pkg +pkgs +pks +pkt +pkwy +pl +placability +placabilty +placable +placableness +placably +placaean +placage +placard +placarded +placardeer +placarder +placarders +placarding +placards +placate +placated +placater +placaters +placates +placating +placation +placative +placatively +placatory +placcate +place +placeable +placean +placebo +placeboes +placebos +placed +placeful +placeholder +placekick +placekicker +placeless +placelessly +placemaker +placemaking +placeman +placemanship +placemen +placement +placements +placemonger +placemongering +placent +placenta +placentae +placental +placentalia +placentalian +placentary +placentas +placentate +placentation +placentiferous +placentiform +placentigerous +placentitis +placentography +placentoid +placentoma +placentomata +placer +placers +places +placet +placets +placewoman +placid +placidamente +placidity +placidly +placidness +placing +placit +placitum +plack +plackart +placket +plackets +plackless +placks +placochromatic +placode +placoderm +placodermal +placodermatous +placodermi +placodermoid +placodont +placodontia +placodus +placoganoid +placoganoidean +placoganoidei +placoid +placoidal +placoidean +placoidei +placoides +placoids +placophora +placophoran +placoplast +placque +placula +placuntitis +placuntoma +placus +pladaroma +pladarosis +plafond +plafonds +plaga +plagae +plagal +plagate +plage +plages +plagianthus +plagiaplite +plagiary +plagiarical +plagiaries +plagiarise +plagiarised +plagiariser +plagiarising +plagiarism +plagiarisms +plagiarist +plagiaristic +plagiaristically +plagiarists +plagiarization +plagiarize +plagiarized +plagiarizer +plagiarizers +plagiarizes +plagiarizing +plagihedral +plagiocephaly +plagiocephalic +plagiocephalism +plagiocephalous +plagiochila +plagioclase +plagioclasite +plagioclastic +plagioclimax +plagioclinal +plagiodont +plagiograph +plagioliparite +plagionite +plagiopatagium +plagiophyre +plagiostomata +plagiostomatous +plagiostome +plagiostomi +plagiostomous +plagiotropic +plagiotropically +plagiotropism +plagiotropous +plagium +plagose +plagosity +plague +plagued +plagueful +plaguey +plagueless +plagueproof +plaguer +plaguers +plagues +plaguesome +plaguesomeness +plaguy +plaguily +plaguing +plagula +play +playa +playability +playable +playact +playacted +playacting +playactor +playacts +playas +playback +playbacks +playbill +playbills +playboy +playboyism +playboys +playbook +playbooks +playbox +playbroker +plaice +plaices +playclothes +playcraft +playcraftsman +plaid +playday +playdays +plaided +plaidy +plaidie +plaiding +plaidman +plaidoyer +playdown +playdowns +plaids +played +player +playerdom +playeress +players +playfellow +playfellows +playfellowship +playfere +playfield +playfolk +playful +playfully +playfulness +playgirl +playgirls +playgoer +playgoers +playgoing +playground +playgrounds +playhouse +playhouses +playing +playingly +playland +playlands +playless +playlet +playlets +playlike +playmaker +playmaking +playman +playmare +playmate +playmates +playmonger +playmongering +plain +plainback +plainbacks +plainchant +plainclothes +plainclothesman +plainclothesmen +plained +plainer +plainest +plainfield +plainful +plainhearted +plainy +plaining +plainish +plainly +plainness +plains +plainscraft +plainsfolk +plainsman +plainsmen +plainsoled +plainsong +plainspoken +plainspokenness +plainstanes +plainstones +plainswoman +plainswomen +plaint +plaintail +plaintext +plaintexts +plaintful +plaintiff +plaintiffs +plaintiffship +plaintile +plaintive +plaintively +plaintiveness +plaintless +plaints +plainward +playock +playoff +playoffs +playpen +playpens +playreader +playroom +playrooms +plays +plaisance +plaisanterie +playschool +playscript +playsome +playsomely +playsomeness +playstead +plaister +plaistered +plaistering +plaisters +playstow +playsuit +playsuits +plait +playte +plaited +plaiter +plaiters +plaything +playthings +playtime +playtimes +plaiting +plaitings +plaitless +plaits +plaitwork +playward +playwear +playwears +playwoman +playwomen +playwork +playwright +playwrightess +playwrighting +playwrightry +playwrights +playwriter +playwriting +plak +plakat +plan +planable +planaea +planar +planaria +planarian +planarias +planarida +planaridan +planariform +planarioid +planarity +planaru +planate +planation +planceer +plancer +planch +planche +plancheite +plancher +planches +planchet +planchets +planchette +planching +planchment +plancier +planckian +planctus +plandok +plane +planed +planeload +planeness +planer +planera +planers +planes +planeshear +planet +planeta +planetable +planetabler +planetal +planetary +planetaria +planetarian +planetaries +planetarily +planetarium +planetariums +planeted +planetesimal +planetesimals +planetfall +planetic +planeticose +planeting +planetist +planetkin +planetless +planetlike +planetogeny +planetography +planetoid +planetoidal +planetoids +planetology +planetologic +planetological +planetologist +planetologists +planets +planettaria +planetule +planform +planforms +planful +planfully +planfulness +plang +plangency +plangent +plangently +plangents +plangi +plangor +plangorous +planicaudate +planicipital +planidorsate +planifolious +planiform +planigram +planigraph +planigraphy +planilla +planimeter +planimetry +planimetric +planimetrical +planineter +planing +planipennate +planipennia +planipennine +planipetalous +planiphyllous +planirostal +planirostral +planirostrate +planiscope +planiscopic +planish +planished +planisher +planishes +planishing +planispheral +planisphere +planispheric +planispherical +planispiral +planity +plank +plankage +plankbuilt +planked +planker +planky +planking +plankings +plankless +planklike +planks +planksheer +plankter +plankters +planktology +planktologist +plankton +planktonic +planktons +planktont +plankways +plankwise +planless +planlessly +planlessness +planned +planner +planners +planning +plannings +planoblast +planoblastic +planocylindric +planococcus +planoconcave +planoconical +planoconvex +planoferrite +planogamete +planograph +planography +planographic +planographically +planographist +planohorizontal +planolindrical +planometer +planometry +planomiller +planont +planoorbicular +planorbidae +planorbiform +planorbine +planorbis +planorboid +planorotund +planosarcina +planosol +planosols +planosome +planospiral +planospore +planosubulate +plans +plansheer +plant +planta +plantable +plantad +plantae +plantage +plantagenet +plantaginaceae +plantaginaceous +plantaginales +plantagineous +plantago +plantain +plantains +plantal +plantano +plantar +plantaris +plantarium +plantation +plantationlike +plantations +plantator +plantdom +planted +planter +planterdom +planterly +planters +plantership +plantigrada +plantigrade +plantigrady +planting +plantings +plantivorous +plantless +plantlet +plantlike +plantling +plantocracy +plants +plantsman +plantula +plantulae +plantular +plantule +planula +planulae +planulan +planular +planulate +planuliform +planuloid +planuloidea +planum +planury +planuria +planxty +plap +plappert +plaque +plaques +plaquette +plash +plashed +plasher +plashers +plashes +plashet +plashy +plashier +plashiest +plashing +plashingly +plashment +plasm +plasma +plasmacyte +plasmacytoma +plasmagel +plasmagene +plasmagenic +plasmalemma +plasmalogen +plasmaphaeresis +plasmaphereses +plasmapheresis +plasmaphoresisis +plasmas +plasmase +plasmasol +plasmatic +plasmatical +plasmation +plasmatoparous +plasmatorrhexis +plasmic +plasmid +plasmids +plasmin +plasminogen +plasmins +plasmochin +plasmocyte +plasmocytoma +plasmode +plasmodesm +plasmodesma +plasmodesmal +plasmodesmata +plasmodesmic +plasmodesmus +plasmodia +plasmodial +plasmodiate +plasmodic +plasmodiocarp +plasmodiocarpous +plasmodiophora +plasmodiophoraceae +plasmodiophorales +plasmodium +plasmogamy +plasmogen +plasmogeny +plasmoid +plasmoids +plasmolyse +plasmolysis +plasmolytic +plasmolytically +plasmolyzability +plasmolyzable +plasmolyze +plasmology +plasmoma +plasmomata +plasmon +plasmons +plasmopara +plasmophagy +plasmophagous +plasmoptysis +plasmoquin +plasmoquine +plasmosoma +plasmosomata +plasmosome +plasmotomy +plasms +plasome +plass +plasson +plastein +plaster +plasterbill +plasterboard +plastered +plasterer +plasterers +plastery +plasteriness +plastering +plasterlike +plasters +plasterwise +plasterwork +plastic +plastically +plasticimeter +plasticine +plasticisation +plasticise +plasticised +plasticising +plasticism +plasticity +plasticization +plasticize +plasticized +plasticizer +plasticizes +plasticizing +plasticly +plastics +plastid +plastidial +plastidium +plastidome +plastidozoa +plastids +plastidular +plastidule +plastify +plastin +plastinoid +plastique +plastiqueur +plastiqueurs +plastisol +plastochondria +plastochron +plastochrone +plastodynamia +plastodynamic +plastogamy +plastogamic +plastogene +plastomer +plastomere +plastometer +plastometry +plastometric +plastosome +plastotype +plastral +plastron +plastrons +plastrum +plastrums +plat +plataean +platalea +plataleidae +plataleiform +plataleinae +plataleine +platan +platanaceae +platanaceous +platane +platanes +platanist +platanista +platanistidae +platanna +platano +platans +platanus +platband +platch +plate +platea +plateasm +plateau +plateaued +plateauing +plateaulith +plateaus +plateaux +plated +plateful +platefuls +plateholder +plateiasmus +platelayer +plateless +platelet +platelets +platelike +platemaker +platemaking +plateman +platemark +platemen +platen +platens +plater +platerer +plateresque +platery +platers +plates +platesful +plateway +platework +plateworker +platform +platformally +platformed +platformer +platformy +platformish +platformism +platformist +platformistic +platformless +platforms +plathelminth +platy +platybasic +platybrachycephalic +platybrachycephalous +platybregmatic +platic +platycarya +platycarpous +platycarpus +platycelian +platycelous +platycephaly +platycephalic +platycephalidae +platycephalism +platycephaloid +platycephalous +platycephalus +platycercinae +platycercine +platycercus +platycerium +platycheiria +platycyrtean +platicly +platycnemia +platycnemic +platycodon +platycoelian +platycoelous +platycoria +platycrania +platycranial +platyctenea +platydactyl +platydactyle +platydactylous +platydolichocephalic +platydolichocephalous +platie +platier +platies +platiest +platyfish +platyglossal +platyglossate +platyglossia +platyhelmia +platyhelminth +platyhelminthes +platyhelminthic +platyhieric +platykurtic +platykurtosis +platilla +platylobate +platymery +platymeria +platymeric +platymesaticephalic +platymesocephalic +platymeter +platymyoid +platina +platinamin +platinamine +platinammin +platinammine +platinas +platinate +platinated +platinating +platine +plating +platings +platinic +platinichloric +platinichloride +platiniferous +platiniridium +platinisation +platinise +platinised +platinising +platinite +platynite +platinization +platinize +platinized +platinizing +platinochloric +platinochloride +platinocyanic +platinocyanide +platinode +platinoid +platynotal +platinotype +platinotron +platinous +platinum +platinums +platinumsmith +platyodont +platyope +platyopia +platyopic +platypellic +platypetalous +platyphyllous +platypi +platypygous +platypod +platypoda +platypodia +platypodous +platyptera +platypus +platypuses +platyrhina +platyrhynchous +platyrhini +platyrrhin +platyrrhina +platyrrhine +platyrrhini +platyrrhiny +platyrrhinian +platyrrhinic +platyrrhinism +platys +platysma +platysmamyoides +platysmas +platysmata +platysomid +platysomidae +platysomus +platystaphyline +platystemon +platystencephaly +platystencephalia +platystencephalic +platystencephalism +platysternal +platysternidae +platystomidae +platystomous +platytrope +platytropy +platitude +platitudes +platitudinal +platitudinarian +platitudinarianism +platitudinisation +platitudinise +platitudinised +platitudiniser +platitudinising +platitudinism +platitudinist +platitudinization +platitudinize +platitudinized +platitudinizer +platitudinizing +platitudinous +platitudinously +platitudinousness +platly +plato +platoda +platode +platodes +platoid +platonesque +platonian +platonic +platonical +platonically +platonicalness +platonician +platonicism +platonism +platonist +platonistic +platonization +platonize +platonizer +platoon +platooned +platooning +platoons +platopic +platosamine +platosammine +plats +platt +plattdeutsch +platted +platteland +platten +platter +platterface +platterful +platters +platty +platting +plattnerite +platurous +plaud +plaudation +plaudit +plaudite +plauditor +plauditory +plaudits +plauenite +plausibility +plausible +plausibleness +plausibly +plausive +plaustral +plautine +plautus +plaza +plazas +plazolite +plbroch +plea +pleach +pleached +pleacher +pleaches +pleaching +plead +pleadable +pleadableness +pleaded +pleader +pleaders +pleading +pleadingly +pleadingness +pleadings +pleads +pleaproof +pleas +pleasable +pleasableness +pleasance +pleasant +pleasantable +pleasanter +pleasantest +pleasantish +pleasantly +pleasantness +pleasantry +pleasantries +pleasantsome +pleasaunce +please +pleased +pleasedly +pleasedness +pleaseman +pleasemen +pleaser +pleasers +pleases +pleaship +pleasing +pleasingly +pleasingness +pleasurability +pleasurable +pleasurableness +pleasurably +pleasure +pleasured +pleasureful +pleasurefulness +pleasurehood +pleasureless +pleasurelessly +pleasureman +pleasurement +pleasuremonger +pleasureproof +pleasurer +pleasures +pleasuring +pleasurist +pleasurous +pleat +pleated +pleater +pleaters +pleating +pleatless +pleats +pleb +plebby +plebe +plebeian +plebeiance +plebeianisation +plebeianise +plebeianised +plebeianising +plebeianism +plebeianization +plebeianize +plebeianized +plebeianizing +plebeianly +plebeianness +plebeians +plebeity +plebes +plebescite +plebian +plebianism +plebicolar +plebicolist +plebicolous +plebify +plebificate +plebification +plebiscitary +plebiscitarian +plebiscitarism +plebiscite +plebiscites +plebiscitic +plebiscitum +plebs +pleck +plecoptera +plecopteran +plecopterid +plecopterous +plecotinae +plecotine +plecotus +plectognath +plectognathi +plectognathic +plectognathous +plectopter +plectopteran +plectopterous +plectospondyl +plectospondyli +plectospondylous +plectra +plectre +plectridial +plectridium +plectron +plectrons +plectrontra +plectrum +plectrums +plectrumtra +pled +pledable +pledge +pledgeable +pledged +pledgee +pledgees +pledgeholder +pledgeless +pledgeor +pledgeors +pledger +pledgers +pledges +pledgeshop +pledget +pledgets +pledging +pledgor +pledgors +plegadis +plegaphonia +plegometer +pleiad +pleiades +pleiads +pleinairism +pleinairist +pleiobar +pleiocene +pleiochromia +pleiochromic +pleiomastia +pleiomazia +pleiomery +pleiomerous +pleion +pleione +pleionian +pleiophylly +pleiophyllous +pleiotaxy +pleiotaxis +pleiotropy +pleiotropic +pleiotropically +pleiotropism +pleis +pleistocene +pleistocenic +pleistoseist +plemyrameter +plemochoe +plena +plenary +plenarily +plenariness +plenarium +plenarty +pleny +plenicorn +pleniloquence +plenilunal +plenilunar +plenilunary +plenilune +plenipo +plenipotence +plenipotency +plenipotent +plenipotential +plenipotentiality +plenipotentiary +plenipotentiaries +plenipotentiarily +plenipotentiaryship +plenipotentiarize +plenish +plenished +plenishes +plenishing +plenishment +plenism +plenisms +plenist +plenists +plenity +plenitide +plenitude +plenitudinous +plenshing +plenteous +plenteously +plenteousness +plenty +plenties +plentify +plentiful +plentifully +plentifulness +plentitude +plenum +plenums +pleochroic +pleochroism +pleochroitic +pleochromatic +pleochromatism +pleochroous +pleocrystalline +pleodont +pleomastia +pleomastic +pleomazia +pleometrosis +pleometrotic +pleomorph +pleomorphy +pleomorphic +pleomorphism +pleomorphist +pleomorphous +pleon +pleonal +pleonasm +pleonasms +pleonast +pleonaste +pleonastic +pleonastical +pleonastically +pleonectic +pleonexia +pleonic +pleophagous +pleophyletic +pleopod +pleopodite +pleopods +pleospora +pleosporaceae +plerergate +plerocercoid +pleroma +pleromatic +plerome +pleromorph +plerophory +plerophoric +plerosis +plerotic +plesance +plesianthropus +plesiobiosis +plesiobiotic +plesiomorphic +plesiomorphism +plesiomorphous +plesiosaur +plesiosauri +plesiosauria +plesiosaurian +plesiosauroid +plesiosaurus +plesiotype +plessigraph +plessimeter +plessimetry +plessimetric +plessor +plessors +plethysmogram +plethysmograph +plethysmography +plethysmographic +plethysmographically +plethodon +plethodontid +plethodontidae +plethora +plethoras +plethoretic +plethoretical +plethory +plethoric +plethorical +plethorically +plethorous +plethron +plethrum +pleura +pleuracanthea +pleuracanthidae +pleuracanthini +pleuracanthoid +pleuracanthus +pleurae +pleural +pleuralgia +pleuralgic +pleurapophysial +pleurapophysis +pleuras +pleurectomy +pleurenchyma +pleurenchymatous +pleuric +pleuriseptate +pleurisy +pleurisies +pleurite +pleuritic +pleuritical +pleuritically +pleuritis +pleurobrachia +pleurobrachiidae +pleurobranch +pleurobranchia +pleurobranchial +pleurobranchiate +pleurobronchitis +pleurocapsa +pleurocapsaceae +pleurocapsaceous +pleurocarp +pleurocarpi +pleurocarpous +pleurocele +pleurocentesis +pleurocentral +pleurocentrum +pleurocera +pleurocerebral +pleuroceridae +pleuroceroid +pleurococcaceae +pleurococcaceous +pleurococcus +pleurodelidae +pleurodynia +pleurodynic +pleurodira +pleurodiran +pleurodire +pleurodirous +pleurodiscous +pleurodont +pleurogenic +pleurogenous +pleurohepatitis +pleuroid +pleurolysis +pleurolith +pleuron +pleuronect +pleuronectes +pleuronectid +pleuronectidae +pleuronectoid +pleuronema +pleuropedal +pleuropericardial +pleuropericarditis +pleuroperitonaeal +pleuroperitoneal +pleuroperitoneum +pleuropneumonia +pleuropneumonic +pleuropodium +pleuropterygian +pleuropterygii +pleuropulmonary +pleurorrhea +pleurosaurus +pleurosigma +pleurospasm +pleurosteal +pleurosteon +pleurostict +pleurosticti +pleurostigma +pleurothotonic +pleurothotonos +pleurothotonus +pleurotyphoid +pleurotoma +pleurotomaria +pleurotomariidae +pleurotomarioid +pleurotomy +pleurotomid +pleurotomidae +pleurotomies +pleurotomine +pleurotomoid +pleurotonic +pleurotonus +pleurotremata +pleurotribal +pleurotribe +pleurotropous +pleurotus +pleurovisceral +pleurum +pleuston +pleustonic +pleustons +plevin +plew +plewch +plewgh +plex +plexal +plexicose +plexiform +plexiglas +plexiglass +pleximeter +pleximetry +pleximetric +plexippus +plexodont +plexometer +plexor +plexors +plexure +plexus +plexuses +plf +pli +ply +pliability +pliable +pliableness +pliably +pliancy +pliancies +pliant +pliantly +pliantness +plyboard +plica +plicable +plicae +plical +plicate +plicated +plicately +plicateness +plicater +plicatile +plicating +plication +plicative +plicatocontorted +plicatocristate +plicatolacunose +plicatolobate +plicatopapillose +plicator +plicatoundulate +plicatulate +plicature +plicidentine +pliciferous +pliciform +plie +plied +plier +plyer +pliers +plyers +plies +plygain +plight +plighted +plighter +plighters +plighting +plights +plying +plyingly +plim +plimmed +plimming +plymouth +plymouthism +plymouthist +plymouthite +plymouths +plimsol +plimsole +plimsoles +plimsoll +plimsolls +plimsols +pliny +plinian +plinyism +plink +plinked +plinker +plinkers +plinking +plinks +plynlymmon +plinth +plinther +plinthiform +plinthless +plinthlike +plinths +pliocene +pliofilm +pliohippus +pliopithecus +pliosaur +pliosaurian +pliosauridae +pliosaurus +pliothermic +pliotron +plyscore +plisky +pliskie +pliskies +pliss +plisse +plisses +plitch +plywood +plywoods +ploat +ploce +ploceidae +ploceiform +ploceinae +ploceus +plock +plod +plodded +plodder +plodderly +plodders +plodding +ploddingly +ploddingness +plodge +plods +ploesti +ploy +ploidy +ploidies +ployed +ploying +ploima +ploimate +ployment +ploys +plomb +plonk +plonked +plonking +plonko +plonks +plook +plop +plopped +plopping +plops +ploration +ploratory +plosion +plosions +plosive +plosives +plot +plotch +plotcock +plote +plotful +plotinian +plotinic +plotinical +plotinism +plotinist +plotinize +plotless +plotlessness +plotlib +plotosid +plotproof +plots +plott +plottage +plottages +plotted +plotter +plottery +plotters +plotty +plottier +plotties +plottiest +plotting +plottingly +plotton +plotx +plough +ploughboy +ploughed +plougher +ploughers +ploughfish +ploughfoot +ploughgang +ploughgate +ploughhead +ploughing +ploughjogger +ploughland +ploughline +ploughman +ploughmanship +ploughmell +ploughmen +ploughpoint +ploughs +ploughshare +ploughshoe +ploughstaff +ploughstilt +ploughtail +ploughwise +ploughwright +plouk +plouked +plouky +plounce +plousiocracy +plout +plouteneion +plouter +plover +plovery +ploverlike +plovers +plow +plowable +plowback +plowbacks +plowboy +plowboys +plowbote +plowed +plower +plowers +plowfish +plowfoot +plowgang +plowgate +plowgraith +plowhead +plowheads +plowing +plowjogger +plowland +plowlands +plowlight +plowline +plowmaker +plowmaking +plowman +plowmanship +plowmell +plowmen +plowpoint +plowrightia +plows +plowshare +plowshares +plowshoe +plowstaff +plowstilt +plowtail +plowter +plowwise +plowwoman +plowwright +pltano +plu +pluchea +pluck +pluckage +plucked +pluckedness +plucker +pluckerian +pluckers +plucky +pluckier +pluckiest +pluckily +pluckiness +plucking +pluckless +plucklessly +plucklessness +plucks +plud +pluff +pluffer +pluffy +plug +plugboard +plugdrawer +pluggable +plugged +plugger +pluggers +pluggy +plugging +pluggingly +plughole +pluglees +plugless +pluglike +plugman +plugmen +plugs +plugtray +plugtree +plugugly +pluguglies +plum +pluma +plumaceous +plumach +plumade +plumage +plumaged +plumagery +plumages +plumasite +plumassier +plumate +plumatella +plumatellid +plumatellidae +plumatelloid +plumb +plumbable +plumbage +plumbagin +plumbaginaceae +plumbaginaceous +plumbagine +plumbaginous +plumbago +plumbagos +plumbate +plumbean +plumbed +plumbeous +plumber +plumbery +plumberies +plumbers +plumbership +plumbet +plumbic +plumbicon +plumbiferous +plumbing +plumbings +plumbism +plumbisms +plumbisolvent +plumbite +plumbless +plumblessness +plumbness +plumbog +plumbojarosite +plumboniobate +plumbosolvency +plumbosolvent +plumbous +plumbs +plumbum +plumbums +plumcot +plumdamas +plumdamis +plume +plumed +plumeless +plumelet +plumelets +plumelike +plumemaker +plumemaking +plumeopicean +plumeous +plumer +plumery +plumes +plumet +plumete +plumetis +plumette +plumy +plumicorn +plumier +plumiera +plumieride +plumiest +plumify +plumification +plumiform +plumiformly +plumigerous +pluminess +pluming +plumiped +plumipede +plumipeds +plumist +plumless +plumlet +plumlike +plummer +plummet +plummeted +plummeting +plummetless +plummets +plummy +plummier +plummiest +plumming +plumose +plumosely +plumoseness +plumosite +plumosity +plumous +plump +plumped +plumpen +plumpened +plumpening +plumpens +plumper +plumpers +plumpest +plumpy +plumping +plumpish +plumply +plumpness +plumps +plumrock +plums +plumula +plumulaceous +plumular +plumularia +plumularian +plumulariidae +plumulate +plumule +plumules +plumuliform +plumulose +plunder +plunderable +plunderage +plunderbund +plundered +plunderer +plunderers +plunderess +plundering +plunderingly +plunderless +plunderous +plunderproof +plunders +plunge +plunged +plungeon +plunger +plungers +plunges +plungy +plunging +plungingly +plungingness +plunk +plunked +plunker +plunkers +plunking +plunks +plunther +plup +plupatriotic +pluperfect +pluperfectly +pluperfectness +pluperfects +plupf +plur +plural +pluralisation +pluralise +pluralised +pluraliser +pluralising +pluralism +pluralist +pluralistic +pluralistically +plurality +pluralities +pluralization +pluralize +pluralized +pluralizer +pluralizes +pluralizing +plurally +pluralness +plurals +plurative +plurel +plurennial +pluriaxial +pluribus +pluricarinate +pluricarpellary +pluricellular +pluricentral +pluricipital +pluricuspid +pluricuspidate +pluridentate +pluries +plurifacial +plurifetation +plurify +plurification +pluriflagellate +pluriflorous +plurifoliate +plurifoliolate +pluriglandular +pluriguttulate +plurilateral +plurilingual +plurilingualism +plurilingualist +pluriliteral +plurilocular +plurimammate +plurinominal +plurinucleate +pluripara +pluriparity +pluriparous +pluripartite +pluripetalous +pluripotence +pluripotent +pluripresence +pluriseptate +pluriserial +pluriseriate +pluriseriated +plurisetose +plurisy +plurisyllabic +plurisyllable +plurispiral +plurisporous +plurivalent +plurivalve +plurivory +plurivorous +plus +pluses +plush +plushed +plusher +plushes +plushest +plushette +plushy +plushier +plushiest +plushily +plushiness +plushly +plushlike +plushness +plusia +plusiinae +plusquam +plusquamperfect +plussage +plussages +plusses +plutarch +plutarchy +plutarchian +plutarchic +plutarchical +plutarchically +pluteal +plutean +plutei +pluteiform +plutella +pluteus +pluteuses +pluteutei +pluto +plutocracy +plutocracies +plutocrat +plutocratic +plutocratical +plutocratically +plutocrats +plutolatry +plutology +plutological +plutologist +plutomania +pluton +plutonian +plutonic +plutonion +plutonism +plutonist +plutonite +plutonium +plutonometamorphism +plutonomy +plutonomic +plutonomist +plutons +plutter +plutus +pluvial +pluvialiform +pluvialine +pluvialis +pluvially +pluvials +pluvian +pluvine +pluviograph +pluviography +pluviographic +pluviographical +pluviometer +pluviometry +pluviometric +pluviometrical +pluviometrically +pluvioscope +pluvioscopic +pluviose +pluviosity +pluvious +pm +pmk +pmsg +pmt +pnce +pneodynamics +pneograph +pneomanometer +pneometer +pneometry +pneophore +pneoscope +pneudraulic +pneum +pneuma +pneumarthrosis +pneumas +pneumathaemia +pneumatic +pneumatical +pneumatically +pneumaticity +pneumaticness +pneumatics +pneumatism +pneumatist +pneumatize +pneumatized +pneumatocardia +pneumatoce +pneumatocele +pneumatochemical +pneumatochemistry +pneumatocyst +pneumatocystic +pneumatode +pneumatogenic +pneumatogenous +pneumatogram +pneumatograph +pneumatographer +pneumatography +pneumatographic +pneumatolysis +pneumatolitic +pneumatolytic +pneumatology +pneumatologic +pneumatological +pneumatologist +pneumatomachy +pneumatomachian +pneumatomachist +pneumatometer +pneumatometry +pneumatomorphic +pneumatonomy +pneumatophany +pneumatophanic +pneumatophilosophy +pneumatophobia +pneumatophony +pneumatophonic +pneumatophore +pneumatophoric +pneumatophorous +pneumatorrhachis +pneumatoscope +pneumatosic +pneumatosis +pneumatostatics +pneumatotactic +pneumatotherapeutics +pneumatotherapy +pneumatria +pneumaturia +pneume +pneumectomy +pneumectomies +pneumobacillus +pneumobranchia +pneumobranchiata +pneumocele +pneumocentesis +pneumochirurgia +pneumococcal +pneumococcemia +pneumococci +pneumococcic +pneumococcocci +pneumococcous +pneumococcus +pneumoconiosis +pneumoderma +pneumodynamic +pneumodynamics +pneumoencephalitis +pneumoencephalogram +pneumoenteritis +pneumogastric +pneumogram +pneumograph +pneumography +pneumographic +pneumohemothorax +pneumohydropericardium +pneumohydrothorax +pneumolysis +pneumolith +pneumolithiasis +pneumology +pneumological +pneumomalacia +pneumomassage +pneumometer +pneumomycosis +pneumonalgia +pneumonectasia +pneumonectomy +pneumonectomies +pneumonedema +pneumony +pneumonia +pneumonic +pneumonitic +pneumonitis +pneumonocace +pneumonocarcinoma +pneumonocele +pneumonocentesis +pneumonocirrhosis +pneumonoconiosis +pneumonodynia +pneumonoenteritis +pneumonoerysipelas +pneumonography +pneumonographic +pneumonokoniosis +pneumonolysis +pneumonolith +pneumonolithiasis +pneumonomelanosis +pneumonometer +pneumonomycosis +pneumonoparesis +pneumonopathy +pneumonopexy +pneumonophorous +pneumonophthisis +pneumonopleuritis +pneumonorrhagia +pneumonorrhaphy +pneumonosis +pneumonotherapy +pneumonotomy +pneumopericardium +pneumoperitoneum +pneumoperitonitis +pneumopexy +pneumopyothorax +pneumopleuritis +pneumorrachis +pneumorrhachis +pneumorrhagia +pneumotactic +pneumotherapeutics +pneumotherapy +pneumothorax +pneumotyphoid +pneumotyphus +pneumotomy +pneumotoxin +pneumotropic +pneumotropism +pneumoventriculography +pnigerophobia +pnigophobia +pnyx +pnxt +po +poa +poaceae +poaceous +poach +poachable +poachard +poachards +poached +poacher +poachers +poaches +poachy +poachier +poachiest +poachiness +poaching +poales +poalike +pob +pobby +pobbies +pobedy +poblacht +poblacion +pobs +pocan +pochade +pochades +pochay +pochaise +pochard +pochards +poche +pochette +pochettino +pochismo +pochoir +pochote +pocill +pocilliform +pock +pocked +pocket +pocketable +pocketableness +pocketbook +pocketbooks +pocketcase +pocketed +pocketer +pocketers +pocketful +pocketfuls +pockety +pocketing +pocketknife +pocketknives +pocketless +pocketlike +pockets +pocketsful +pockhouse +pocky +pockier +pockiest +pockily +pockiness +pocking +pockmanky +pockmanteau +pockmantie +pockmark +pockmarked +pockmarking +pockmarks +pocks +pockweed +pockwood +poco +pococurante +pococuranteism +pococurantic +pococurantish +pococurantism +pococurantist +pocosen +pocosin +pocosins +pocoson +pocul +poculary +poculation +poculent +poculiform +pocus +pod +podagra +podagral +podagras +podagry +podagric +podagrical +podagrous +podal +podalgia +podalic +podaliriidae +podalirius +podanger +podarge +podargidae +podarginae +podargine +podargue +podargus +podarthral +podarthritis +podarthrum +podatus +podaxonia +podaxonial +podded +podder +poddy +poddia +poddidge +poddies +poddige +podding +poddish +poddle +poddock +podelcoma +podeon +podesta +podestas +podesterate +podetia +podetiiform +podetium +podex +podge +podger +podgy +podgier +podgiest +podgily +podginess +podia +podial +podiatry +podiatric +podiatries +podiatrist +podiatrists +podical +podiceps +podices +podicipedidae +podilegous +podite +podites +poditic +poditti +podium +podiums +podley +podler +podlike +podobranch +podobranchia +podobranchial +podobranchiate +podocarp +podocarpaceae +podocarpineae +podocarpous +podocarpus +podocephalous +pododerm +pododynia +podogyn +podogyne +podogynium +podolian +podolite +podology +podomancy +podomere +podomeres +podometer +podometry +podophyllaceae +podophyllic +podophyllin +podophyllotoxin +podophyllous +podophyllum +podophrya +podophryidae +podophthalma +podophthalmata +podophthalmate +podophthalmatous +podophthalmia +podophthalmian +podophthalmic +podophthalmite +podophthalmitic +podophthalmous +podos +podoscaph +podoscapher +podoscopy +podosomata +podosomatous +podosperm +podosphaera +podostemaceae +podostemaceous +podostemad +podostemon +podostemonaceae +podostemonaceous +podostomata +podostomatous +podotheca +podothecal +podozamites +pods +podsnap +podsnappery +podsol +podsolic +podsolization +podsolize +podsolized +podsolizing +podsols +podtia +podunk +podura +poduran +podurid +poduridae +podware +podzol +podzolic +podzolization +podzolize +podzolized +podzolizing +podzols +poe +poebird +poechore +poechores +poechoric +poecile +poeciliidae +poecilite +poecilitic +poecilocyttares +poecilocyttarous +poecilogony +poecilogonous +poecilomere +poecilonym +poecilonymy +poecilonymic +poecilopod +poecilopoda +poecilopodous +poem +poematic +poemet +poemlet +poems +poenitentiae +poenology +poephaga +poephagous +poephagus +poesy +poesie +poesies +poesiless +poesis +poet +poetaster +poetastery +poetastering +poetasterism +poetasters +poetastress +poetastry +poetastric +poetastrical +poetcraft +poetdom +poetesque +poetess +poetesses +poethood +poetic +poetical +poeticality +poetically +poeticalness +poeticise +poeticised +poeticising +poeticism +poeticize +poeticized +poeticizing +poeticness +poetics +poeticule +poetiised +poetiising +poetise +poetised +poetiser +poetisers +poetises +poetising +poetito +poetization +poetize +poetized +poetizer +poetizers +poetizes +poetizing +poetless +poetly +poetlike +poetling +poetomachia +poetress +poetry +poetries +poetryless +poets +poetship +poetwise +poffle +pogamoggan +pogey +pogeys +pogge +poggy +poggies +pogy +pogies +pogo +pogonatum +pogonia +pogonias +pogoniasis +pogoniate +pogonion +pogonip +pogonips +pogoniris +pogonite +pogonology +pogonological +pogonologist +pogonophobia +pogonophoran +pogonotomy +pogonotrophy +pogrom +pogromed +pogroming +pogromist +pogromize +pogroms +poh +poha +pohickory +pohna +pohutukawa +poi +poy +poiana +poybird +poictesme +poiesis +poietic +poignado +poignance +poignancy +poignancies +poignant +poignantly +poignard +poignet +poikile +poikilie +poikilitic +poikiloblast +poikiloblastic +poikilocyte +poikilocythemia +poikilocytosis +poikilotherm +poikilothermal +poikilothermy +poikilothermic +poikilothermism +poil +poilu +poilus +poimenic +poimenics +poinado +poinard +poinciana +poincianas +poind +poindable +poinded +poinder +poinding +poinds +poinephobia +poinsettia +poinsettias +point +pointable +pointage +pointal +pointblank +pointe +pointed +pointedly +pointedness +pointel +poyntell +pointer +pointers +pointes +pointful +pointfully +pointfulness +pointy +pointier +pointiest +poyntill +pointillage +pointille +pointillism +pointillist +pointilliste +pointillistic +pointillists +pointing +pointingly +pointless +pointlessly +pointlessness +pointlet +pointleted +pointmaker +pointmaking +pointman +pointmen +pointment +pointrel +points +pointsman +pointsmen +pointswoman +pointure +pointways +pointwise +poyou +poyous +poire +pois +poisable +poise +poised +poiser +poisers +poises +poiseuille +poising +poison +poisonable +poisonberry +poisonbush +poisoned +poisoner +poisoners +poisonful +poisonfully +poisoning +poisonings +poisonless +poisonlessness +poisonmaker +poisonous +poisonously +poisonousness +poisonproof +poisons +poisonweed +poisonwood +poissarde +poisson +poister +poisure +poitrail +poitrel +poitrels +poitrinaire +poivrade +pokable +pokan +pokanoket +poke +pokeberry +pokeberries +poked +pokeful +pokey +pokeys +pokelogan +pokeloken +pokeout +poker +pokerface +pokerish +pokerishly +pokerishness +pokerlike +pokeroot +pokeroots +pokers +pokes +pokeweed +pokeweeds +poky +pokie +pokier +pokies +pokiest +pokily +pokiness +pokinesses +poking +pokingly +pokom +pokomam +pokomo +pokomoo +pokonchi +pokunt +pol +polab +polabian +polabish +polacca +polack +polacre +poland +polander +polanisia +polar +polaran +polarans +polary +polaric +polarid +polarigraphic +polarily +polarimeter +polarimetry +polarimetric +polarimetries +polaris +polarisability +polarisable +polarisation +polariscope +polariscoped +polariscopy +polariscopic +polariscopically +polariscoping +polariscopist +polarise +polarised +polariser +polarises +polarising +polaristic +polaristrobometer +polarity +polarities +polariton +polarizability +polarizable +polarization +polarizations +polarize +polarized +polarizer +polarizes +polarizing +polarly +polarogram +polarograph +polarography +polarographic +polarographically +polaroid +polaroids +polaron +polarons +polars +polarward +polatouche +polaxis +poldavy +poldavis +polder +polderboy +polderland +polderman +polders +poldoody +poldron +pole +polearm +poleax +poleaxe +poleaxed +poleaxer +poleaxes +poleaxing +poleburn +polecat +polecats +poled +polehead +poley +poleyn +poleyne +poleyns +poleis +polejumper +poleless +poleman +polemarch +polemic +polemical +polemically +polemician +polemicist +polemicists +polemicize +polemics +polemist +polemists +polemize +polemized +polemizes +polemizing +polemoniaceae +polemoniaceous +polemoniales +polemonium +polemoscope +polenta +polentas +poler +polers +poles +polesaw +polesetter +polesian +polesman +polestar +polestars +poleward +polewards +polewig +poly +polyacanthus +polyacid +polyacoustic +polyacoustics +polyacrylamide +polyacrylonitrile +polyact +polyactinal +polyactine +polyactinia +poliad +polyad +polyadelph +polyadelphia +polyadelphian +polyadelphous +polyadenia +polyadenitis +polyadenoma +polyadenous +poliadic +polyadic +polyaemia +polyaemic +polyaffectioned +polyalcohol +polyalphabetic +polyamide +polyamylose +polyamine +polian +polyandry +polyandria +polyandrian +polyandrianism +polyandric +polyandries +polyandrious +polyandrism +polyandrist +polyandrium +polyandrous +polyangium +polyangular +polianite +polyantha +polianthes +polyanthi +polyanthy +polyanthous +polyanthus +polyanthuses +polyarch +polyarchal +polyarchy +polyarchic +polyarchical +polyarchies +polyarchist +polyarteritis +polyarthric +polyarthritic +polyarthritis +polyarthrous +polyarticular +polyatomic +polyatomicity +polyautography +polyautographic +polyaxial +polyaxon +polyaxone +polyaxonic +polybasic +polybasicity +polybasite +polyblast +polyborinae +polyborine +polyborus +polybranch +polybranchia +polybranchian +polybranchiata +polybranchiate +polybrid +polybrids +polybromid +polybromide +polybuny +polybunous +polybutene +polybutylene +polybuttoned +polycarbonate +polycarboxylic +polycarp +polycarpellary +polycarpy +polycarpic +polycarpon +polycarpous +police +policed +policedom +policeless +polycellular +policeman +policemanish +policemanism +policemanlike +policemanship +policemen +polycentral +polycentric +polycentrism +polycentrist +polycephaly +polycephalic +polycephalous +polices +policewoman +policewomen +polychaeta +polychaetal +polychaetan +polychaete +polychaetous +polychasia +polychasial +polychasium +polichinelle +polychloride +polychoerany +polychord +polychotomy +polychotomous +polychrest +polychresty +polychrestic +polychrestical +polychroic +polychroism +polychroite +polychromasia +polychromate +polychromatic +polychromatism +polychromatist +polychromatize +polychromatophil +polychromatophile +polychromatophilia +polychromatophilic +polychrome +polychromy +polychromia +polychromic +polychromism +polychromist +polychromize +polychromous +polychronicon +polychronious +polychsia +policy +policial +polycyanide +polycycly +polycyclic +policies +polycyesis +policyholder +policyholders +polyciliate +policymaker +policymaking +policing +polycystic +polycistronic +polycythaemia +polycythaemic +polycythemia +polycythemic +polycitral +polycyttaria +policize +policizer +polyclad +polyclady +polycladida +polycladine +polycladose +polycladous +polycletan +policlinic +polyclinic +polyclinics +polyclona +polycoccous +polycodium +polycondensation +polyconic +polycormic +polycot +polycotyl +polycotyledon +polycotyledonary +polycotyledony +polycotyledonous +polycotyly +polycotylous +polycots +polycracy +polycrase +polycratic +polycrystal +polycrystalline +polycrotic +polycrotism +polyctenid +polyctenidae +polycttarian +polyculture +polydactyl +polydactyle +polydactyly +polydactylies +polydactylism +polydactylous +polydactylus +polydaemoniac +polydaemonism +polydaemonist +polydaemonistic +polydemic +polydemonism +polydemonist +polydenominational +polydental +polydermy +polydermous +polydigital +polydimensional +polydymite +polydynamic +polydipsia +polydipsic +polydisperse +polydispersity +polydomous +polydontia +polyedral +polyeidic +polyeidism +polyelectrolyte +polyembryonate +polyembryony +polyembryonic +polyemia +polyemic +poliencephalitis +poliencephalomyelitis +polyene +polyenes +polyenic +polyenzymatic +polyergic +polyergus +polies +polyester +polyesterification +polyesters +polyesthesia +polyesthetic +polyestrous +polyethylene +polyethnic +polyfenestral +polyflorous +polyfoil +polyfold +polygala +polygalaceae +polygalaceous +polygalas +polygalic +polygalin +polygam +polygamy +polygamia +polygamian +polygamic +polygamical +polygamically +polygamies +polygamist +polygamistic +polygamists +polygamize +polygamodioecious +polygamous +polygamously +polyganglionic +poligar +polygar +polygarchy +poligarship +polygastric +polygene +polygenes +polygenesic +polygenesis +polygenesist +polygenetic +polygenetically +polygeny +polygenic +polygenism +polygenist +polygenistic +polygenous +polygenouss +polygyn +polygynaiky +polygyny +polygynia +polygynian +polygynic +polygynies +polygynious +polygynist +polygynoecial +polygynous +polygyral +polygyria +polyglandular +polyglycerol +polyglobulia +polyglobulism +polyglossary +polyglot +polyglotism +polyglotry +polyglots +polyglottal +polyglottally +polyglotted +polyglotter +polyglottery +polyglottic +polyglottically +polyglotting +polyglottism +polyglottist +polyglottonic +polyglottous +polyglotwise +polygon +polygonaceae +polygonaceous +polygonal +polygonales +polygonally +polygonatum +polygonella +polygoneutic +polygoneutism +polygony +polygonia +polygonic +polygonically +polygonies +polygonoid +polygonometry +polygonous +polygons +polygonum +polygordius +polygram +polygrammatic +polygraph +polygrapher +polygraphy +polygraphic +poligraphical +polygraphically +polygraphist +polygraphs +polygroove +polygrooved +polyhaemia +polyhaemic +polyhalide +polyhalite +polyhalogen +polyharmony +polyharmonic +polyhedra +polyhedral +polyhedrals +polyhedric +polyhedrical +polyhedroid +polyhedron +polyhedrons +polyhedrosis +polyhedrous +polyhemia +polyhemic +polyhybrid +polyhydric +polyhidrosis +polyhydroxy +polyhymnia +polyhistor +polyhistory +polyhistorian +polyhistoric +polyideic +polyideism +polyidrosis +polyimide +polyiodide +polyisobutene +polyisoprene +polyisotopic +polykaryocyte +polylaminated +polylemma +polylepidous +polylinguist +polylith +polylithic +polilla +polylobular +polylogy +polyloquent +polymagnet +polymania +polymasty +polymastia +polymastic +polymastiga +polymastigate +polymastigida +polymastigina +polymastigote +polymastigous +polymastism +polymastodon +polymastodont +polymath +polymathy +polymathic +polymathist +polymaths +polymazia +polymely +polymelia +polymelian +polymer +polymerase +polymere +polymery +polymeria +polymeric +polymerically +polymeride +polymerise +polymerism +polymerization +polymerize +polymerized +polymerizes +polymerizing +polymerous +polymers +polymetallism +polymetameric +polymeter +polymethylene +polymetochia +polymetochic +polimetrum +polymyaria +polymyarian +polymyarii +polymicrian +polymicrobial +polymicrobic +polymicroscope +polymignite +polymyodi +polymyodian +polymyodous +polymyoid +polymyositis +polymythy +polymythic +polymixia +polymixiid +polymixiidae +polymyxin +polymnestor +polymny +polymnia +polymnite +polymolecular +polymolybdate +polymorph +polymorpha +polymorphean +polymorphy +polymorphic +polymorphically +polymorphism +polymorphisms +polymorphistic +polymorphonuclear +polymorphonucleate +polymorphosis +polymorphous +polymorphously +polynaphthene +polynee +polynemid +polynemidae +polynemoid +polynemus +polynesia +polynesian +polynesians +polynesic +polyneural +polyneuric +polyneuritic +polyneuritis +polyneuropathy +poling +polynia +polynya +polynyas +polinices +polynices +polynodal +polynoe +polynoid +polynoidae +polynome +polynomial +polynomialism +polynomialist +polynomials +polynomic +polynucleal +polynuclear +polynucleate +polynucleated +polynucleolar +polynucleosis +polynucleotidase +polynucleotide +polio +polyodon +polyodont +polyodontal +polyodontia +polyodontidae +polyodontoid +polyoecy +polyoecious +polyoeciously +polyoeciousness +polyoecism +polioencephalitis +polioencephalomyelitis +polyoicous +polyol +poliomyelitic +poliomyelitis +poliomyelopathy +polyommatous +polioneuromere +polyonychia +polyonym +polyonymal +polyonymy +polyonymic +polyonymist +polyonymous +polyonomy +polyonomous +polionotus +polyophthalmic +polyopia +polyopic +polyopsy +polyopsia +polyorama +poliorcetic +poliorcetics +polyorchidism +polyorchism +polyorganic +polios +polyose +poliosis +poliovirus +polyoxide +polyoxymethylene +polyp +polypage +polypaged +polypapilloma +polyparasitic +polyparasitism +polyparesis +polypary +polyparia +polyparian +polyparies +polyparium +polyparous +polypean +polyped +polypedates +polypeptide +polypeptidic +polypetal +polypetalae +polypetaly +polypetalous +polyphaga +polyphage +polyphagy +polyphagia +polyphagian +polyphagic +polyphagist +polyphagous +polyphalangism +polypharmacal +polypharmacy +polypharmacist +polypharmacon +polypharmic +polyphasal +polyphase +polyphaser +polyphasic +polypheme +polyphemian +polyphemic +polyphemous +polyphemus +polyphenol +polyphenolic +polyphylesis +polyphylety +polyphyletic +polyphyletically +polyphyleticism +polyphyly +polyphylly +polyphylline +polyphyllous +polyphylogeny +polyphyodont +polyphloesboean +polyphloisboioism +polyphloisboism +polyphobia +polyphobic +polyphone +polyphoned +polyphony +polyphonia +polyphonic +polyphonical +polyphonically +polyphonies +polyphonism +polyphonist +polyphonium +polyphonous +polyphonously +polyphore +polyphosphoric +polyphotal +polyphote +polypi +polypian +polypide +polypides +polypidom +polypier +polypifer +polypifera +polypiferous +polypigerous +polypinnate +polypite +polyplacophora +polyplacophoran +polyplacophore +polyplacophorous +polyplastic +polyplectron +polyplegia +polyplegic +polyploid +polyploidy +polyploidic +polypnea +polypneas +polypneic +polypnoea +polypnoeic +polypod +polypoda +polypody +polypodia +polypodiaceae +polypodiaceous +polypodies +polypodium +polypodous +polypods +polypoid +polypoidal +polypomorpha +polypomorphic +polyporaceae +polyporaceous +polypore +polypores +polyporite +polyporoid +polyporous +polyporus +polypose +polyposis +polypotome +polypous +polypragmacy +polypragmaty +polypragmatic +polypragmatical +polypragmatically +polypragmatism +polypragmatist +polypragmist +polypragmon +polypragmonic +polypragmonist +polyprene +polyprism +polyprismatic +polypropylene +polyprothetic +polyprotic +polyprotodont +polyprotodontia +polyps +polypseudonymous +polypsychic +polypsychical +polypsychism +polypterid +polypteridae +polypteroid +polypterus +polyptych +polyptote +polyptoton +polypus +polypuses +polyrhythm +polyrhythmic +polyrhythmical +polyrhythmically +polyrhizal +polyrhizous +polyribonucleotide +polyribosomal +polyribosome +polis +polys +polysaccharide +polysaccharose +polysaccum +polysalicylide +polysaprobic +polysarcia +polysarcous +polyschematic +polyschematist +polyscope +polyscopic +polysemant +polysemantic +polysemeia +polysemy +polysemia +polysemies +polysemous +polysemousness +polysensuous +polysensuousness +polysepalous +polyseptate +polyserositis +polish +polishable +polished +polishedly +polishedness +polisher +polishers +polishes +polishing +polishings +polishment +polysided +polysidedness +polysilicate +polysilicic +polysyllabic +polysyllabical +polysyllabically +polysyllabicism +polysyllabicity +polysyllabism +polysyllable +polysyllables +polysyllogism +polysyllogistic +polysymmetry +polysymmetrical +polysymmetrically +polysynaptic +polysynaptically +polysyndetic +polysyndetically +polysyndeton +polysynthesis +polysynthesism +polysynthetic +polysynthetical +polysynthetically +polysyntheticism +polysynthetism +polysynthetize +polysiphonia +polysiphonic +polysiphonous +polisman +polysomaty +polysomatic +polysomatous +polysome +polysomes +polysomy +polysomia +polysomic +polysomitic +polysomous +polysorbate +polyspast +polyspaston +polyspermal +polyspermatous +polyspermy +polyspermia +polyspermic +polyspermous +polyspondyly +polyspondylic +polyspondylous +polyspora +polysporangium +polyspore +polyspored +polysporic +polysporous +polissoir +polista +polystachyous +polystaurion +polystele +polystelic +polystellic +polystemonous +polistes +polystichoid +polystichous +polystichum +polystictus +polystylar +polystyle +polystylous +polystyrene +polystomata +polystomatidae +polystomatous +polystome +polystomea +polystomella +polystomidae +polystomium +polysulfide +polysulfonate +polysulphid +polysulphide +polysulphonate +polysulphuration +polysulphurization +polysuspensoid +polit +politarch +politarchic +politbureau +politburo +polite +polytechnic +polytechnical +polytechnics +polytechnist +politeful +politei +politeia +politely +polytene +politeness +polyteny +polytenies +politer +polyterpene +politesse +politest +polytetrafluoroethylene +polythalamia +polythalamian +polythalamic +polythalamous +polythecial +polytheism +polytheist +polytheistic +polytheistical +polytheistically +polytheists +polytheize +polythely +polythelia +polythelism +polythene +polythionic +polity +politic +political +politicalism +politicalization +politicalize +politicalized +politicalizing +politically +politicaster +politician +politicians +politicious +politicise +politicised +politicising +politicist +politicization +politicize +politicized +politicizer +politicizes +politicizing +politick +politicked +politicker +politicking +politicks +politicly +politicness +politico +politicoes +politicomania +politicophobia +politicos +politics +politied +polities +polytype +polytyped +polytypes +polytypy +polytypic +polytypical +polytyping +polytypism +politique +politist +polytitanic +politize +polytocous +polytoky +polytokous +polytomy +polytomies +polytomous +polytonal +polytonalism +polytonality +polytonally +polytone +polytony +polytonic +polytope +polytopic +polytopical +polytrichaceae +polytrichaceous +polytrichia +polytrichous +polytrichum +polytrochal +polytrochous +polytrope +polytrophic +polytropic +polytungstate +polytungstic +politure +politzerization +politzerize +polyunsaturate +polyunsaturated +polyuresis +polyurethan +polyurethane +polyuria +polyurias +polyuric +polyvalence +polyvalency +polyvalent +polyve +polyvinyl +polyvinylidene +polyvinylpyrrolidone +polyvirulent +polyvoltine +polywater +polyzoa +polyzoal +polyzoan +polyzoans +polyzoary +polyzoaria +polyzoarial +polyzoarium +polyzoic +polyzoism +polyzonal +polyzooid +polyzoon +polje +polk +polka +polkadot +polkaed +polkaing +polkas +polki +poll +pollable +pollack +pollacks +polladz +pollage +pollakiuria +pollam +pollan +pollarchy +pollard +pollarded +pollarding +pollards +pollbook +pollcadot +polled +pollee +pollees +pollen +pollenate +pollenation +pollened +polleniferous +pollenigerous +pollening +pollenite +pollenivorous +pollenizer +pollenless +pollenlike +pollenosis +pollenproof +pollens +pollent +poller +pollera +polleras +pollers +pollet +polleten +pollette +pollex +polly +pollyanna +pollyannish +pollical +pollicar +pollicate +pollices +pollicitation +pollyfish +pollyfishes +pollinar +pollinarium +pollinate +pollinated +pollinates +pollinating +pollination +pollinator +pollinators +pollinctor +pollincture +polling +pollinia +pollinic +pollinical +polliniferous +pollinigerous +pollinium +pollinivorous +pollinization +pollinize +pollinized +pollinizer +pollinizing +pollinodial +pollinodium +pollinoid +pollinose +pollinosis +pollist +pollists +polliwig +polliwog +pollywog +polliwogs +pollywogs +pollock +pollocks +polloi +polls +pollster +pollsters +pollucite +pollutant +pollutants +pollute +polluted +pollutedly +pollutedness +polluter +polluters +pollutes +polluting +pollutingly +pollution +pollutive +pollux +polo +polocyte +poloconic +poloi +poloidal +poloist +poloists +polonaise +polonaises +polonese +polony +polonia +polonial +polonian +polonick +polonism +polonium +poloniums +polonius +polonization +polonize +polopony +polos +pols +polska +polster +polt +poltergeist +poltergeistism +poltergeists +poltfoot +poltfooted +poltina +poltinik +poltinnik +poltophagy +poltophagic +poltophagist +poltroon +poltroonery +poltroonish +poltroonishly +poltroonishness +poltroonism +poltroons +poluphloisboic +poluphloisboiotatotic +poluphloisboiotic +polverine +polzenite +pom +pomace +pomaceae +pomacentrid +pomacentridae +pomacentroid +pomacentrus +pomaceous +pomaces +pomada +pomade +pomaded +pomaderris +pomades +pomading +pomak +pomander +pomanders +pomane +pomard +pomary +pomarine +pomarium +pomate +pomato +pomatoes +pomatomid +pomatomidae +pomatomus +pomatorhine +pomatum +pomatums +pombe +pombo +pome +pomegranate +pomegranates +pomey +pomeys +pomel +pomely +pomelo +pomelos +pomeranian +pomeranians +pomeria +pomeridian +pomerium +pomeroy +pomes +pomeshchik +pomewater +pomfret +pomfrets +pomiculture +pomiculturist +pomiferous +pomiform +pomivorous +pommado +pommage +pommard +pomme +pommee +pommey +pommel +pommeled +pommeler +pommeling +pommelion +pommelled +pommeller +pommelling +pommelo +pommels +pommer +pommery +pommet +pommetty +pommy +pommies +pomo +pomoerium +pomolo +pomology +pomological +pomologically +pomologies +pomologist +pomona +pomonal +pomonic +pomp +pompa +pompadour +pompadours +pompal +pompano +pompanos +pompatic +pompey +pompeian +pompeii +pompelmoose +pompelmous +pomperkin +pompholygous +pompholix +pompholyx +pomphus +pompier +pompilid +pompilidae +pompiloid +pompilus +pompion +pompist +pompless +pompoleon +pompom +pompoms +pompon +pompons +pompoon +pomposity +pomposities +pomposo +pompous +pompously +pompousness +pomps +pompster +pomptine +pomster +pon +ponca +ponce +ponceau +poncelet +ponces +poncho +ponchoed +ponchos +poncirus +pond +pondage +pondbush +ponder +ponderability +ponderable +ponderableness +ponderal +ponderance +ponderancy +ponderant +ponderary +ponderate +ponderation +ponderative +pondered +ponderer +ponderers +pondering +ponderingly +ponderling +ponderment +ponderomotive +ponderosa +ponderosae +ponderosapine +ponderosity +ponderous +ponderously +ponderousness +ponders +pondfish +pondfishes +pondful +pondgrass +pondy +pondlet +pondlike +pondman +pondo +pondok +pondokkie +pondomisi +ponds +pondside +pondus +pondweed +pondweeds +pondwort +pone +poney +ponent +ponera +poneramoeba +ponerid +poneridae +ponerinae +ponerine +poneroid +ponerology +pones +pong +ponga +pongee +pongees +pongid +pongidae +pongids +pongo +ponhaws +pony +poniard +poniarded +poniarding +poniards +ponica +ponycart +ponied +ponier +ponies +ponying +ponytail +ponytails +ponja +ponograph +ponos +pons +pont +pontac +pontacq +pontage +pontal +pontederia +pontederiaceae +pontederiaceous +pontee +pontes +pontiac +pontiacs +pontianac +pontianak +pontic +ponticello +ponticellos +ponticular +ponticulus +pontifex +pontiff +pontiffs +pontify +pontific +pontifical +pontificalia +pontificalibus +pontificality +pontifically +pontificals +pontificate +pontificated +pontificates +pontificating +pontification +pontificator +pontifice +pontifices +pontificial +pontificially +pontificious +pontil +pontile +pontils +pontin +pontine +pontist +pontius +pontlevis +ponto +pontocaspian +pontocerebellar +ponton +pontoneer +pontonier +pontons +pontoon +pontooneer +pontooner +pontooning +pontoons +pontus +pontvolant +ponzite +pooa +pooch +pooches +pood +pooder +poodle +poodledom +poodleish +poodler +poodles +poodleship +poods +poof +pooftah +poogye +pooh +poohed +poohing +poohpoohist +poohs +poojah +pook +pooka +pookaun +pookawn +pookhaun +pookoo +pool +pooled +pooler +poolhall +poolhalls +pooli +pooly +pooling +poolroom +poolrooms +poolroot +pools +poolside +poolwort +poon +poonac +poonah +poonce +poonga +poongee +poonghee +poonghie +poons +poop +pooped +poophyte +poophytic +pooping +poops +poopsie +poor +poorer +poorest +poorga +poorhouse +poorhouses +poori +pooris +poorish +poorly +poorlyish +poorliness +poorling +poormaster +poorness +poornesses +poort +poortith +poortiths +poorweed +poorwill +poot +poother +pooty +poove +pop +popadam +popal +popcorn +popcorns +popdock +pope +popean +popedom +popedoms +popeholy +popehood +popeye +popeyed +popeyes +popeism +popeler +popeless +popely +popelike +popeline +popeling +popery +poperies +popes +popeship +popess +popglove +popgun +popgunner +popgunnery +popguns +popian +popie +popify +popinac +popinjay +popinjays +popish +popishly +popishness +popjoy +poplar +poplared +poplars +popleman +poplesie +poplet +poplilia +poplin +poplinette +poplins +poplitaeal +popliteal +poplitei +popliteus +poplitic +poplolly +popocracy +popocrat +popode +popodium +popolari +popolis +popoloco +popomastic +popover +popovers +popovets +poppa +poppability +poppable +poppadom +poppas +poppean +popped +poppel +popper +poppers +poppet +poppethead +poppets +poppy +poppycock +poppycockish +poppied +poppies +poppyfish +poppyfishes +poppyhead +poppylike +poppin +popping +poppywort +popple +poppled +popples +popply +poppling +pops +popshop +popsy +popsicle +populace +populaces +populacy +popular +populares +popularisation +popularise +popularised +populariser +popularising +popularism +popularist +popularity +popularization +popularizations +popularize +popularized +popularizer +popularizes +popularizing +popularly +popularness +populate +populated +populates +populating +population +populational +populationist +populationistic +populationless +populations +populaton +populator +populeon +populi +populicide +populin +populism +populisms +populist +populistic +populists +populous +populously +populousness +populum +populus +popweed +por +porail +poral +porbeagle +porc +porcate +porcated +porcelain +porcelainization +porcelainize +porcelainized +porcelainizing +porcelainlike +porcelainous +porcelains +porcelaneous +porcelanic +porcelanite +porcelanous +porcellana +porcellaneous +porcellanian +porcellanic +porcellanid +porcellanidae +porcellanite +porcellanize +porcellanous +porch +porched +porches +porching +porchless +porchlike +porcine +porcula +porcupine +porcupines +porcupinish +pore +pored +porelike +porella +porencephaly +porencephalia +porencephalic +porencephalitis +porencephalon +porencephalous +porencephalus +porer +pores +poret +porett +porge +porger +porgy +porgies +porgo +pory +poria +poricidal +porifera +poriferal +poriferan +poriferous +poriform +porimania +porina +poriness +poring +poringly +poriomanic +porion +porions +porism +porismatic +porismatical +porismatically +porisms +poristic +poristical +porite +porites +poritidae +poritoid +pork +porkburger +porkchop +porkeater +porker +porkery +porkers +porket +porkfish +porkfishes +porky +porkier +porkies +porkiest +porkin +porkiness +porkish +porkless +porkling +porkman +porkolt +porkopolis +porkpen +porkpie +porkpies +porks +porkwood +porkwoods +porn +pornerastic +porno +pornocracy +pornocrat +pornograph +pornographer +pornography +pornographic +pornographically +pornographies +pornographist +pornographomania +pornological +pornos +porns +porocephalus +porodine +porodite +porogam +porogamy +porogamic +porogamous +porokaiwhiria +porokeratosis +porokoto +poroma +poromas +poromata +poromeric +porometer +porophyllous +poroplastic +poroporo +pororoca +poros +poroscope +poroscopy +poroscopic +porose +poroseness +porosimeter +porosis +porosity +porosities +porotic +porotype +porous +porously +porousness +porpentine +porphine +porphyra +porphyraceae +porphyraceous +porphyratin +porphyrean +porphyry +porphyria +porphyrian +porphyrianist +porphyries +porphyrin +porphyrine +porphyrinuria +porphyrio +porphyrion +porphyrisation +porphyrite +porphyritic +porphyrization +porphyrize +porphyrized +porphyrizing +porphyroblast +porphyroblastic +porphyrogene +porphyrogenite +porphyrogenitic +porphyrogenitism +porphyrogeniture +porphyrogenitus +porphyroid +porphyrophore +porphyropsin +porphyrous +porpita +porpitoid +porpoise +porpoiselike +porpoises +porpoising +porporate +porr +porraceous +porrect +porrection +porrectus +porret +porry +porridge +porridgelike +porridges +porridgy +porriginous +porrigo +porrima +porringer +porringers +porriwiggle +port +porta +portability +portable +portableness +portables +portably +portage +portaged +portages +portaging +portague +portahepatis +portail +portal +portaled +portalled +portalless +portals +portamenti +portamento +portamentos +portance +portances +portas +portass +portate +portatile +portative +portato +portator +portcrayon +portcullis +portcullised +portcullises +portcullising +porte +porteacid +ported +porteligature +portend +portendance +portended +portending +portendment +portends +porteno +portension +portent +portention +portentive +portentosity +portentous +portentously +portentousness +portents +porteous +porter +porterage +porteranthus +porteress +porterhouse +porterhouses +porterly +porterlike +porters +portership +portesse +portfire +portfolio +portfolios +portglaive +portglave +portgrave +portgreve +porthetria +portheus +porthole +portholes +porthook +porthors +porthouse +porty +portia +portico +porticoed +porticoes +porticos +porticus +portiere +portiered +portieres +portify +portifory +porting +portio +portiomollis +portion +portionable +portional +portionally +portioned +portioner +portioners +portiones +portioning +portionist +portionize +portionless +portions +portitor +portland +portlandian +portlast +portless +portlet +portly +portlier +portliest +portligature +portlight +portlily +portliness +portman +portmanmote +portmanteau +portmanteaus +portmanteaux +portmantle +portmantologism +portment +portmoot +portmote +porto +portoise +portolan +portolani +portolano +portolanos +portor +portpayne +portray +portrayable +portrayal +portrayals +portrayed +portrayer +portraying +portrayist +portrayment +portrays +portrait +portraitist +portraitists +portraitlike +portraits +portraiture +portreeve +portreeveship +portress +portresses +ports +portsale +portside +portsider +portsman +portsoken +portuary +portugais +portugal +portugalism +portugee +portugese +portuguese +portulaca +portulacaceae +portulacaceous +portulacaria +portulacas +portulan +portunalia +portunian +portunid +portunidae +portunus +porture +portway +porule +porulose +porulous +porus +porwigle +porzana +pos +posable +posada +posadas +posadaship +posaune +posca +poschay +pose +posed +posey +poseidon +poseidonian +posement +poser +posers +poses +poseur +poseurs +poseuse +posh +posher +poshest +poshly +poshness +posho +posy +posied +posies +posing +posingly +posit +posited +positif +positing +position +positional +positioned +positioner +positioning +positionless +positions +positival +positive +positively +positiveness +positiver +positives +positivest +positivism +positivist +positivistic +positivistically +positivity +positivize +positor +positrino +positron +positronium +positrons +posits +positum +positure +posnanian +posnet +posole +posolo +posology +posologic +posological +posologies +posologist +posostemad +pospolite +poss +posse +posseman +possemen +posses +possess +possessable +possessed +possessedly +possessedness +possesses +possessible +possessing +possessingly +possessingness +possessio +possession +possessional +possessionalism +possessionalist +possessionary +possessionate +possessioned +possessioner +possessiones +possessionist +possessionless +possessionlessness +possessions +possessival +possessive +possessively +possessiveness +possessives +possessor +possessoress +possessory +possessorial +possessoriness +possessors +possessorship +posset +possets +possy +possibile +possibilism +possibilist +possibilitate +possibility +possibilities +possible +possibleness +possibler +possibles +possiblest +possibly +possie +possies +possisdendi +possodie +possum +possumhaw +possums +possumwood +post +postabdomen +postabdominal +postable +postabortal +postacetabular +postact +postadjunct +postage +postages +postal +postallantoic +postally +postals +postalveolar +postament +postamniotic +postanal +postanesthetic +postantennal +postaortic +postapoplectic +postapostolic +postapostolical +postappendicular +postarytenoid +postarmistice +postarterial +postarthritic +postarticular +postaspirate +postaspirated +postasthmatic +postatrial +postauditory +postauricular +postaxiad +postaxial +postaxially +postaxillary +postbag +postbags +postbaptismal +postbellum +postboy +postboys +postbook +postbox +postboxes +postbrachial +postbrachium +postbranchial +postbreakfast +postbreeding +postbronchial +postbuccal +postbulbar +postbursal +postcaecal +postcalcaneal +postcalcarine +postcanonical +postcard +postcardiac +postcardinal +postcards +postcarnate +postcarotid +postcart +postcartilaginous +postcatarrhal +postcaudal +postcava +postcavae +postcaval +postcecal +postcenal +postcentral +postcentrum +postcephalic +postcerebellar +postcerebral +postcesarean +postcibal +postclassic +postclassical +postclassicism +postclavicle +postclavicula +postclavicular +postclimax +postclitellian +postclival +postcode +postcoenal +postcoital +postcolon +postcolonial +postcolumellar +postcomitial +postcommissural +postcommissure +postcommunicant +postcommunion +postconceptive +postconcretism +postconcretist +postcondylar +postcondition +postconfinement +postconnubial +postconquest +postconsonantal +postcontact +postcontract +postconvalescent +postconvalescents +postconvulsive +postcordial +postcornu +postcosmic +postcostal +postcoxal +postcretaceous +postcribrate +postcritical +postcruciate +postcrural +postcubital +postdate +postdated +postdates +postdating +postdental +postdepressive +postdetermined +postdevelopmental +postdiagnostic +postdiaphragmatic +postdiastolic +postdicrotic +postdigestive +postdigital +postdiluvial +postdiluvian +postdiphtherial +postdiphtheric +postdiphtheritic +postdisapproved +postdiscoidal +postdysenteric +postdisseizin +postdisseizor +postdoctoral +postdoctorate +postdural +postea +posted +posteen +posteens +postel +postelection +postelemental +postelementary +postembryonal +postembryonic +postemergence +postemporal +postencephalitic +postencephalon +postenteral +postentry +postentries +postepileptic +poster +posterette +posteriad +posterial +posterior +posteriori +posterioric +posteriorically +posterioristic +posterioristically +posteriority +posteriorly +posteriormost +posteriors +posteriorums +posterish +posterishness +posterist +posterity +posterities +posterization +posterize +postern +posterns +posteroclusion +posterodorsad +posterodorsal +posterodorsally +posteroexternal +posteroinferior +posterointernal +posterolateral +posteromedial +posteromedian +posteromesial +posteroparietal +posterosuperior +posterotemporal +posteroterminal +posteroventral +posters +posteruptive +postesophageal +posteternity +postethmoid +postexilian +postexilic +postexist +postexistence +postexistency +postexistent +postexpressionism +postexpressionist +postface +postfaces +postfact +postfactor +postfebrile +postfemoral +postfetal +postfix +postfixal +postfixation +postfixed +postfixes +postfixial +postfixing +postflection +postflexion +postfoetal +postform +postformed +postforming +postforms +postfoveal +postfrontal +postfurca +postfurcal +postganglionic +postgangrenal +postgastric +postgeminum +postgenial +postgenital +postgeniture +postglacial +postglenoid +postglenoidal +postgonorrheic +postgracile +postgraduate +postgraduates +postgrippal +posthabit +postharvest +posthaste +postheat +posthemiplegic +posthemorrhagic +posthepatic +posthetomy +posthetomist +posthexaplar +posthexaplaric +posthyoid +posthypnotic +posthypnotically +posthypophyseal +posthypophysis +posthippocampal +posthysterical +posthitis +posthoc +postholder +posthole +postholes +posthouse +posthuma +posthume +posthumeral +posthumous +posthumously +posthumousness +posthumus +postyard +postic +postical +postically +postiche +postiches +posticous +posticteric +posticum +posticus +postie +postil +postiler +postilion +postilioned +postilions +postillate +postillation +postillator +postiller +postillion +postillioned +postils +postimpressionism +postimpressionist +postimpressionistic +postin +postincarnation +postinfective +postinfluenzal +posting +postingly +postings +postins +postintestinal +postique +postiques +postirradiation +postischial +postjacent +postjugular +postlabial +postlabially +postlachrymal +postlapsarian +postlaryngal +postlaryngeal +postlarval +postlegal +postlegitimation +postlenticular +postless +postlicentiate +postlike +postliminary +postlimini +postliminy +postliminiary +postliminious +postliminium +postliminous +postliterate +postloitic +postloral +postlude +postludes +postludium +postluetic +postmalarial +postmamillary +postmammary +postmammillary +postman +postmandibular +postmaniacal +postmarital +postmark +postmarked +postmarking +postmarks +postmarriage +postmaster +postmasterlike +postmasters +postmastership +postmastoid +postmaturity +postmaxillary +postmaximal +postmeatal +postmedia +postmediaeval +postmedial +postmedian +postmediastinal +postmediastinum +postmedieval +postmedullary +postmeiotic +postmen +postmeningeal +postmenopausal +postmenstrual +postmental +postmeridian +postmeridional +postmesenteric +postmycotic +postmillenarian +postmillenarianism +postmillennial +postmillennialism +postmillennialist +postmillennian +postmineral +postmistress +postmistresses +postmyxedematous +postmyxedemic +postmortal +postmortem +postmortems +postmortuary +postmultiply +postmultiplied +postmultiplying +postmundane +postmuscular +postmutative +postnarial +postnaris +postnasal +postnatal +postnatally +postnate +postnati +postnatus +postnecrotic +postnephritic +postneural +postneuralgic +postneuritic +postneurotic +postnodal +postnodular +postnominal +postnota +postnotum +postnotums +postnotumta +postnuptial +postnuptially +postobituary +postocular +postoffice +postoffices +postolivary +postomental +postoperative +postoperatively +postoptic +postoral +postorbital +postorder +postordination +postorgastic +postosseous +postotic +postpagan +postpaid +postpalatal +postpalatine +postpalpebral +postpaludal +postparalytic +postparietal +postparotid +postparotitic +postparoxysmal +postpartal +postpartum +postparturient +postparturition +postpatellar +postpathologic +postpathological +postpectoral +postpeduncular +postperforated +postpericardial +postpharyngal +postpharyngeal +postphlogistic +postphragma +postphrenic +postphthisic +postphthistic +postpycnotic +postpyloric +postpyramidal +postpyretic +postpituitary +postplace +postplegic +postpneumonic +postponable +postpone +postponed +postponement +postponements +postponence +postponer +postpones +postponing +postpontile +postpose +postposit +postposited +postposition +postpositional +postpositionally +postpositive +postpositively +postprandial +postprandially +postpredicament +postprocess +postprocessing +postprocessor +postprophesy +postprophetic +postprophetical +postprostate +postpubertal +postpuberty +postpubescent +postpubic +postpubis +postpuerperal +postpulmonary +postpupillary +postrachitic +postramus +postrectal +postredemption +postreduction +postremogeniture +postremote +postrenal +postreproductive +postresurrection +postresurrectional +postretinal +postrheumatic +postrhinal +postrider +postrorse +postrostral +postrubeolar +posts +postsaccular +postsacral +postscalenus +postscapula +postscapular +postscapularis +postscarlatinal +postscarlatinoid +postscenium +postscholastic +postschool +postscorbutic +postscribe +postscript +postscripts +postscriptum +postscutella +postscutellar +postscutellum +postscuttella +postseason +postseasonal +postsigmoid +postsigmoidal +postsign +postsigner +postsymphysial +postsynaptic +postsynaptically +postsynsacral +postsyphilitic +postsystolic +postspasmodic +postsphenoid +postsphenoidal +postsphygmic +postspinous +postsplenial +postsplenic +poststernal +poststertorous +postsuppurative +postsurgical +posttabetic +posttarsal +posttemporal +posttension +posttest +posttests +posttetanic +postthalamic +postthyroidal +postthoracic +posttibial +posttympanic +posttyphoid +posttonic +posttoxic +posttracheal +posttrapezoid +posttraumatic +posttreaty +posttreatment +posttubercular +posttussive +postulance +postulancy +postulant +postulants +postulantship +postulata +postulate +postulated +postulates +postulating +postulation +postulational +postulations +postulator +postulatory +postulatum +postulnar +postumbilical +postumbonal +postural +posture +postured +posturer +posturers +postures +postureteral +postureteric +posturing +posturise +posturised +posturising +posturist +posturize +posturized +posturizing +postuterine +postvaccinal +postvaricellar +postvarioloid +postvelar +postvenereal +postvenous +postventral +postverbal +postverta +postvertebral +postvesical +postvide +postvocalic +postvocalically +postwar +postward +postwise +postwoman +postwomen +postxiphoid +postxyphoid +postzygapophyseal +postzygapophysial +postzygapophysis +pot +potability +potable +potableness +potables +potage +potager +potagere +potagery +potagerie +potages +potail +potamian +potamic +potamobiidae +potamochoerus +potamogale +potamogalidae +potamogeton +potamogetonaceae +potamogetonaceous +potamology +potamological +potamologist +potamometer +potamonidae +potamophilous +potamophobia +potamoplankton +potance +potash +potashery +potashes +potass +potassa +potassamide +potassic +potassiferous +potassium +potate +potation +potations +potative +potato +potatoes +potator +potatory +potawatami +potawatomi +potbank +potbelly +potbellied +potbellies +potboy +potboydom +potboil +potboiled +potboiler +potboilers +potboiling +potboils +potboys +potch +potcher +potcherman +potchermen +potcrook +potdar +pote +potecary +poteen +poteens +poteye +potence +potences +potency +potencies +potent +potentacy +potentate +potentates +potentee +potenty +potential +potentiality +potentialities +potentialization +potentialize +potentially +potentialness +potentials +potentiate +potentiated +potentiates +potentiating +potentiation +potentiator +potentibility +potenties +potentilla +potentiometer +potentiometers +potentiometric +potentize +potently +potentness +poter +poterium +potestal +potestas +potestate +potestative +potful +potfuls +potgirl +potgun +potgut +pothanger +pothead +potheads +pothecary +pothecaries +potheen +potheens +pother +potherb +potherbs +pothered +pothery +pothering +potherment +pothers +potholder +potholders +pothole +potholed +potholer +potholes +potholing +pothook +pothookery +pothooks +pothos +pothouse +pothousey +pothouses +pothunt +pothunted +pothunter +pothunting +poti +poticary +potycary +potiche +potiches +potichomania +potichomanist +potifer +potiguara +potion +potions +potlach +potlache +potlaches +potlatch +potlatched +potlatches +potlatching +potleg +potlicker +potlid +potlike +potlikker +potline +potling +potluck +potlucks +potmaker +potmaking +potman +potmen +potomac +potomania +potomato +potometer +potong +potoo +potoos +potophobia +potoroinae +potoroo +potoroos +potorous +potpie +potpies +potpourri +potpourris +potrack +potrero +pots +potshard +potshards +potshaw +potsherd +potsherds +potshoot +potshooter +potshot +potshots +potshotting +potsy +potsie +potsies +potstick +potstone +potstones +pott +pottage +pottages +pottagy +pottah +pottaro +potted +potteen +potteens +potter +pottered +potterer +potterers +potteress +pottery +potteries +pottering +potteringly +pottern +potters +potti +potty +pottiaceae +pottier +potties +pottiest +potting +pottinger +pottle +pottled +pottles +potto +pottos +pottur +potus +potwaller +potwalling +potwalloper +potware +potwhisky +potwork +potwort +pouce +poucey +poucer +pouch +pouched +pouches +pouchful +pouchy +pouchier +pouchiest +pouching +pouchless +pouchlike +poucy +poudret +poudrette +poudreuse +poudreuses +poudrin +pouf +poufed +pouff +pouffe +pouffed +pouffes +pouffs +poufs +poulaine +poulard +poularde +poulardes +poulardize +poulards +pouldron +poule +poulet +poulette +poulp +poulpe +poult +poulter +poulterer +poulteress +poultice +poulticed +poultices +poulticewise +poulticing +poultry +poultrydom +poultries +poultryist +poultryless +poultrylike +poultryman +poultrymen +poultryproof +poults +pounamu +pounce +pounced +pouncer +pouncers +pounces +pouncet +pouncy +pouncing +pouncingly +pound +poundage +poundages +poundal +poundals +poundbreach +poundcake +pounded +pounder +pounders +pounding +poundkeeper +poundless +poundlike +poundman +poundmaster +poundmeal +pounds +poundstone +poundworth +pour +pourability +pourable +pourboire +pourboires +poured +pourer +pourers +pourie +pouring +pouringly +pourparley +pourparler +pourparlers +pourparty +pourpiece +pourpoint +pourpointer +pourprise +pourquoi +pourris +pours +pourvete +pouser +pousy +pousse +poussette +poussetted +poussetting +poussie +poussies +poussin +poustie +pout +pouted +pouter +pouters +poutful +pouty +poutier +poutiest +pouting +poutingly +pouts +poverish +poverishment +poverty +poverties +povertyweed +povindah +pow +powan +powcat +powder +powderable +powdered +powderer +powderers +powdery +powderies +powderiness +powdering +powderization +powderize +powderizer +powderlike +powderman +powderpuff +powders +powdike +powdry +powellite +power +powerable +powerably +powerboat +powerboats +powered +powerful +powerfully +powerfulness +powerhouse +powerhouses +powering +powerless +powerlessly +powerlessness +powermonger +powerplants +powers +powerset +powersets +powerstat +powhatan +powhead +powitch +powldoody +powny +pownie +pows +powsoddy +powsowdy +powter +powters +powwow +powwowed +powwower +powwowing +powwowism +powwows +pox +poxed +poxes +poxy +poxing +poxvirus +poxviruses +poz +pozzy +pozzolan +pozzolana +pozzolanic +pozzolans +pozzuolana +pozzuolanic +pp +ppa +ppb +ppd +pph +ppi +ppl +ppm +ppr +pps +ppt +pptn +pq +pr +praam +praams +prabble +prabhu +pracharak +practic +practicability +practicabilities +practicable +practicableness +practicably +practical +practicalism +practicalist +practicality +practicalization +practicalize +practicalized +practicalizer +practically +practicalness +practicant +practice +practiced +practicedness +practicer +practices +practician +practicianism +practicing +practico +practicum +practisant +practise +practised +practiser +practises +practising +practitional +practitioner +practitionery +practitioners +practive +prad +pradeep +pradhana +prado +praeabdomen +praeacetabular +praeanal +praecava +praecipe +praecipes +praecipitatio +praecipuum +praecoces +praecocial +praecognitum +praecoracoid +praecordia +praecordial +praecordium +praecornu +praecox +praecuneus +praedial +praedialist +praediality +praedium +praeesophageal +praefect +praefectorial +praefects +praefectus +praefervid +praefloration +praefoliation +praehallux +praelabrum +praelect +praelected +praelecting +praelection +praelectionis +praelector +praelectorship +praelectress +praelects +praeludium +praemaxilla +praemolar +praemunientes +praemunire +praenarial +praenestine +praenestinian +praeneural +praenomen +praenomens +praenomina +praenominal +praeoperculum +praepositor +praepositure +praepositus +praeposter +praepostor +praepostorial +praepubis +praepuce +praescutum +praesens +praesenti +praesepe +praesertim +praeses +praesian +praesidia +praesidium +praesystolic +praesphenoid +praesternal +praesternum +praestomium +praetaxation +praetexta +praetextae +praetor +praetorial +praetorian +praetorianism +praetorium +praetors +praetorship +praezygapophysis +pragmarize +pragmat +pragmatic +pragmatica +pragmatical +pragmaticality +pragmatically +pragmaticalness +pragmaticism +pragmaticist +pragmatics +pragmatism +pragmatist +pragmatistic +pragmatists +pragmatize +pragmatizer +prague +praham +prahm +prahu +prahus +pray +praya +prayable +prayed +prayer +prayerful +prayerfully +prayerfulness +prayerless +prayerlessly +prayerlessness +prayermaker +prayermaking +prayers +prayerwise +prayful +praying +prayingly +prayingwise +prairie +prairiecraft +prairied +prairiedom +prairielike +prairies +prairieweed +prairillon +prays +praisable +praisableness +praisably +praise +praised +praiseful +praisefully +praisefulness +praiseless +praiseproof +praiser +praisers +praises +praiseworthy +praiseworthily +praiseworthiness +praising +praisingly +praiss +praisworthily +praisworthiness +prajapati +prajna +prakash +prakrit +prakriti +prakritic +prakritize +praline +pralines +pralltriller +pram +pramnian +prams +prana +pranava +prance +pranced +pranceful +prancer +prancers +prances +prancy +prancing +prancingly +prancome +prand +prandial +prandially +prang +pranged +pranging +prangs +pranidhana +prank +pranked +pranker +prankful +prankfulness +pranky +prankier +prankiest +pranking +prankingly +prankish +prankishly +prankishness +prankle +pranks +pranksome +pranksomeness +prankster +pranksters +prankt +prao +praos +prase +praseocobaltic +praseodidymium +praseodymia +praseodymium +praseolite +prases +prasine +prasinous +praskeen +prasoid +prasophagy +prasophagous +prastha +prat +pratal +pratap +pratapwant +prate +prated +prateful +pratey +pratement +pratensian +prater +praters +prates +pratfall +pratfalls +pratiyasamutpada +pratiloma +pratincola +pratincole +pratincoline +pratincolous +prating +pratingly +pratique +pratiques +prats +pratt +prattfall +pratty +prattle +prattled +prattlement +prattler +prattlers +prattles +prattly +prattling +prattlingly +prau +praus +pravilege +pravin +pravity +pravous +prawn +prawned +prawner +prawners +prawny +prawning +prawns +praxean +praxeanist +praxeology +praxeological +praxes +praxinoscope +praxiology +praxis +praxises +praxitelean +praxithea +pre +preabdomen +preabsorb +preabsorbent +preabstract +preabundance +preabundant +preabundantly +preaccept +preacceptance +preacceptances +preaccepted +preaccepting +preaccepts +preaccess +preaccessible +preaccidental +preaccidentally +preaccommodate +preaccommodated +preaccommodating +preaccommodatingly +preaccommodation +preaccomplish +preaccomplishment +preaccord +preaccordance +preaccount +preaccounting +preaccredit +preaccumulate +preaccumulated +preaccumulating +preaccumulation +preaccusation +preaccuse +preaccused +preaccusing +preaccustom +preaccustomed +preaccustoming +preaccustoms +preace +preacetabular +preach +preachable +preached +preacher +preacherdom +preacheress +preacherize +preacherless +preacherling +preachers +preachership +preaches +preachy +preachier +preachiest +preachieved +preachify +preachification +preachified +preachifying +preachily +preachiness +preaching +preachingly +preachings +preachman +preachment +preachments +preacid +preacidity +preacidly +preacidness +preacknowledge +preacknowledged +preacknowledgement +preacknowledging +preacknowledgment +preacness +preacquaint +preacquaintance +preacquire +preacquired +preacquiring +preacquisition +preacquisitive +preacquisitively +preacquisitiveness +preacquit +preacquittal +preacquitted +preacquitting +preact +preacted +preacting +preaction +preactive +preactively +preactiveness +preactivity +preacts +preacute +preacutely +preacuteness +preadamic +preadamite +preadamitic +preadamitical +preadamitism +preadapt +preadaptable +preadaptation +preadapted +preadapting +preadaptive +preadapts +preaddition +preadditional +preaddress +preadequacy +preadequate +preadequately +preadequateness +preadhere +preadhered +preadherence +preadherent +preadherently +preadhering +preadjectival +preadjectivally +preadjective +preadjourn +preadjournment +preadjunct +preadjust +preadjustable +preadjusted +preadjusting +preadjustment +preadjustments +preadjusts +preadministration +preadministrative +preadministrator +preadmire +preadmired +preadmirer +preadmiring +preadmission +preadmit +preadmits +preadmitted +preadmitting +preadmonish +preadmonition +preadolescence +preadolescent +preadolescents +preadopt +preadopted +preadopting +preadoption +preadopts +preadoration +preadore +preadorn +preadornment +preadult +preadulthood +preadults +preadvance +preadvancement +preadventure +preadvertency +preadvertent +preadvertise +preadvertised +preadvertisement +preadvertiser +preadvertising +preadvice +preadvisable +preadvise +preadvised +preadviser +preadvising +preadvisory +preadvocacy +preadvocate +preadvocated +preadvocating +preaestival +preaffect +preaffection +preaffidavit +preaffiliate +preaffiliated +preaffiliating +preaffiliation +preaffirm +preaffirmation +preaffirmative +preaffirmed +preaffirming +preaffirms +preafflict +preaffliction +preafternoon +preage +preaged +preaggravate +preaggravated +preaggravating +preaggravation +preaggression +preaggressive +preaggressively +preaggressiveness +preaging +preagitate +preagitated +preagitating +preagitation +preagonal +preagony +preagree +preagreed +preagreeing +preagreement +preagricultural +preagriculture +prealarm +prealcohol +prealcoholic +prealgebra +prealgebraic +prealkalic +preallable +preallably +preallegation +preallege +prealleged +prealleging +preally +prealliance +preallied +preallies +preallying +preallocate +preallocated +preallocating +preallot +preallotment +preallots +preallotted +preallotting +preallow +preallowable +preallowably +preallowance +preallude +prealluded +prealluding +preallusion +prealphabet +prealphabetical +prealphabetically +prealtar +prealter +prealteration +prealveolar +preamalgamation +preambassadorial +preambition +preambitious +preambitiously +preamble +preambled +preambles +preambling +preambular +preambulary +preambulate +preambulation +preambulatory +preamp +preamplifier +preamplifiers +preamps +preanal +preanaphoral +preanesthetic +preanimism +preannex +preannounce +preannounced +preannouncement +preannouncements +preannouncer +preannounces +preannouncing +preantepenult +preantepenultimate +preanterior +preanticipate +preanticipated +preanticipating +preantiquity +preantiseptic +preaortic +preappearance +preappearances +preapperception +preapply +preapplication +preapplications +preapplied +preapplying +preappoint +preappointed +preappointing +preappointment +preappoints +preapprehend +preapprehension +preapprise +preapprised +preapprising +preapprize +preapprized +preapprizing +preapprobation +preapproval +preapprove +preapproved +preapproving +preaptitude +prearm +prearmed +prearming +prearms +prearrange +prearranged +prearrangement +prearranges +prearranging +prearrest +prearrestment +prearticulate +preartistic +preascertain +preascertained +preascertaining +preascertainment +preascertains +preascetic +preascitic +preaseptic +preassemble +preassembled +preassembles +preassembly +preassembling +preassert +preassign +preassigned +preassigning +preassigns +preassume +preassumed +preassuming +preassumption +preassurance +preassure +preassured +preassuring +preataxic +preatomic +preattachment +preattune +preattuned +preattuning +preaudience +preauditory +preauricular +preaver +preaverred +preaverring +preavers +preavowal +preaxiad +preaxial +preaxially +prebachelor +prebacillary +prebade +prebake +prebalance +prebalanced +prebalancing +preballot +preballoted +preballoting +prebankruptcy +prebaptismal +prebaptize +prebarbaric +prebarbarically +prebarbarous +prebarbarously +prebarbarousness +prebargain +prebasal +prebasilar +prebble +prebeleve +prebelief +prebelieve +prebelieved +prebeliever +prebelieving +prebellum +prebeloved +prebend +prebendal +prebendary +prebendaries +prebendaryship +prebendate +prebends +prebenediction +prebeneficiary +prebeneficiaries +prebenefit +prebenefited +prebenefiting +prebeset +prebesetting +prebestow +prebestowal +prebetray +prebetrayal +prebetrothal +prebid +prebidding +prebill +prebilled +prebilling +prebills +prebind +prebinding +prebinds +prebiologic +prebiological +prebiotic +prebless +preblessed +preblesses +preblessing +preblockade +preblockaded +preblockading +preblooming +preboast +preboding +preboyhood +preboil +preboiled +preboiling +preboils +preborn +preborrowing +prebound +prebrachial +prebrachium +prebranchial +prebreathe +prebreathed +prebreathing +prebridal +prebroadcasting +prebromidic +prebronchial +prebronze +prebrute +prebuccal +prebudget +prebudgetary +prebullying +preburlesque +preburn +prec +precalculable +precalculate +precalculated +precalculates +precalculating +precalculation +precalculations +precalculus +precambrian +precampaign +precancel +precanceled +precanceling +precancellation +precancelled +precancelling +precancels +precancerous +precandidacy +precandidature +precanning +precanonical +precant +precantation +precanvass +precapillary +precapitalist +precapitalistic +precaptivity +precapture +precaptured +precapturing +precarcinomatous +precardiac +precary +precaria +precarious +precariously +precariousness +precarium +precarnival +precartilage +precartilaginous +precast +precasting +precasts +precation +precative +precatively +precatory +precaudal +precausation +precaution +precautional +precautionary +precautioning +precautions +precautious +precautiously +precautiousness +precava +precavae +precaval +precchose +precchosen +precedable +precedaneous +precede +preceded +precedence +precedences +precedency +precedencies +precedent +precedentable +precedentary +precedented +precedential +precedentless +precedently +precedents +preceder +precedes +preceding +precednce +preceeding +precel +precelebrant +precelebrate +precelebrated +precelebrating +precelebration +precelebrations +precensor +precensure +precensured +precensuring +precensus +precent +precented +precentennial +precenting +precentless +precentor +precentory +precentorial +precentors +precentorship +precentral +precentress +precentrix +precentrum +precents +precept +preception +preceptist +preceptive +preceptively +preceptor +preceptoral +preceptorate +preceptory +preceptorial +preceptorially +preceptories +preceptors +preceptorship +preceptress +preceptresses +precepts +preceptual +preceptually +preceramic +precerebellar +precerebral +precerebroid +preceremony +preceremonial +preceremonies +precertify +precertification +precertified +precertifying +preces +precess +precessed +precesses +precessing +precession +precessional +precessions +prechallenge +prechallenged +prechallenging +prechampioned +prechampionship +precharge +precharged +precharging +prechart +precharted +precheck +prechecked +prechecking +prechecks +prechemical +precherish +prechildhood +prechill +prechilled +prechilling +prechills +prechloric +prechloroform +prechoice +prechoose +prechoosing +prechordal +prechoroid +prechose +prechosen +preciation +precyclone +precyclonic +precide +precieuse +precieux +precinct +precinction +precinctive +precincts +precynical +preciosity +preciosities +precious +preciouses +preciously +preciousness +precipe +precipes +precipice +precipiced +precipices +precipitability +precipitable +precipitance +precipitancy +precipitancies +precipitant +precipitantly +precipitantness +precipitate +precipitated +precipitatedly +precipitately +precipitateness +precipitates +precipitating +precipitation +precipitations +precipitative +precipitator +precipitatousness +precipitin +precipitinogen +precipitinogenic +precipitous +precipitously +precipitousness +precirculate +precirculated +precirculating +precirculation +precis +precise +precised +precisely +preciseness +preciser +precises +precisest +precisian +precisianism +precisianist +precisianistic +precisians +precising +precision +precisional +precisioner +precisionism +precisionist +precisionistic +precisionize +precisions +precisive +preciso +precyst +precystic +precitation +precite +precited +preciting +precivilization +preclaim +preclaimant +preclaimer +preclare +preclassic +preclassical +preclassically +preclassify +preclassification +preclassified +preclassifying +preclean +precleaned +precleaner +precleaning +precleans +preclerical +preclimax +preclinical +preclival +precloacal +preclose +preclosed +preclosing +preclosure +preclothe +preclothed +preclothing +precludable +preclude +precluded +precludes +precluding +preclusion +preclusive +preclusively +precoagulation +precoccygeal +precoce +precocial +precocious +precociously +precociousness +precocity +precogitate +precogitated +precogitating +precogitation +precognition +precognitions +precognitive +precognizable +precognizant +precognize +precognized +precognizing +precognosce +precoil +precoiler +precoincidence +precoincident +precoincidently +precollapsable +precollapse +precollapsed +precollapsibility +precollapsible +precollapsing +precollect +precollectable +precollection +precollector +precollege +precollegiate +precollude +precolluded +precolluding +precollusion +precollusive +precolonial +precolor +precolorable +precoloration +precoloring +precolour +precolourable +precolouration +precombat +precombatant +precombated +precombating +precombination +precombine +precombined +precombining +precombustion +precommand +precommend +precomment +precommercial +precommissural +precommissure +precommit +precommitted +precommitting +precommune +precommuned +precommunicate +precommunicated +precommunicating +precommunication +precommuning +precommunion +precompare +precompared +precomparing +precomparison +precompass +precompel +precompelled +precompelling +precompensate +precompensated +precompensating +precompensation +precompilation +precompile +precompiled +precompiler +precompiling +precompleteness +precompletion +precompliance +precompliant +precomplicate +precomplicated +precomplicating +precomplication +precompose +precomposition +precompound +precompounding +precompoundly +precomprehend +precomprehension +precomprehensive +precomprehensively +precomprehensiveness +precompress +precompression +precompulsion +precompute +precomputed +precomputing +precomradeship +preconceal +preconcealed +preconcealing +preconcealment +preconceals +preconcede +preconceded +preconceding +preconceivable +preconceive +preconceived +preconceives +preconceiving +preconcentrate +preconcentrated +preconcentratedly +preconcentrating +preconcentration +preconcept +preconception +preconceptional +preconceptions +preconceptual +preconcern +preconcernment +preconcert +preconcerted +preconcertedly +preconcertedness +preconcertion +preconcertive +preconcession +preconcessions +preconcessive +preconclude +preconcluded +preconcluding +preconclusion +preconcur +preconcurred +preconcurrence +preconcurrent +preconcurrently +preconcurring +precondemn +precondemnation +precondemned +precondemning +precondemns +precondensation +precondense +precondensed +precondensing +precondylar +precondyloid +precondition +preconditioned +preconditioning +preconditions +preconduct +preconduction +preconductor +preconfer +preconference +preconferred +preconferring +preconfess +preconfession +preconfide +preconfided +preconfiding +preconfiguration +preconfigure +preconfigured +preconfiguring +preconfine +preconfined +preconfinedly +preconfinement +preconfinemnt +preconfining +preconfirm +preconfirmation +preconflict +preconform +preconformity +preconfound +preconfuse +preconfused +preconfusedly +preconfusing +preconfusion +precongenial +precongested +precongestion +precongestive +precongratulate +precongratulated +precongratulating +precongratulation +precongressional +precony +preconise +preconizance +preconization +preconize +preconized +preconizer +preconizing +preconjecture +preconjectured +preconjecturing +preconnection +preconnective +preconnubial +preconquer +preconquest +preconquestal +preconquestual +preconscious +preconsciously +preconsciousness +preconseccrated +preconseccrating +preconsecrate +preconsecrated +preconsecrating +preconsecration +preconsent +preconsider +preconsideration +preconsiderations +preconsidered +preconsign +preconsoidate +preconsolation +preconsole +preconsolidate +preconsolidated +preconsolidating +preconsolidation +preconsonantal +preconspiracy +preconspiracies +preconspirator +preconspire +preconspired +preconspiring +preconstituent +preconstitute +preconstituted +preconstituting +preconstruct +preconstructed +preconstructing +preconstruction +preconstructs +preconsult +preconsultation +preconsultations +preconsultor +preconsume +preconsumed +preconsumer +preconsuming +preconsumption +precontact +precontain +precontained +precontemn +precontemplate +precontemplated +precontemplating +precontemplation +precontemporaneity +precontemporaneous +precontemporaneously +precontemporary +precontend +precontent +precontention +precontently +precontentment +precontest +precontinental +precontract +precontractive +precontractual +precontribute +precontributed +precontributing +precontribution +precontributive +precontrivance +precontrive +precontrived +precontrives +precontriving +precontrol +precontrolled +precontrolling +precontroversy +precontroversial +precontroversies +preconvey +preconveyal +preconveyance +preconvention +preconversation +preconversational +preconversion +preconvert +preconvict +preconviction +preconvince +preconvinced +preconvincing +precook +precooked +precooker +precooking +precooks +precool +precooled +precooler +precooling +precools +precopy +precopied +precopying +precopulatory +precoracoid +precordia +precordial +precordiality +precordially +precordium +precorneal +precornu +precoronation +precorrect +precorrection +precorrectly +precorrectness +precorrespond +precorrespondence +precorrespondent +precorridor +precorrupt +precorruption +precorruptive +precorruptly +precorruptness +precoruptness +precosmic +precosmical +precosmically +precostal +precounsel +precounseled +precounseling +precounsellor +precourse +precover +precovering +precox +precranial +precranially +precreate +precreation +precreative +precredit +precreditor +precreed +precrystalline +precritical +precriticism +precriticize +precriticized +precriticizing +precrucial +precrural +precule +precultivate +precultivated +precultivating +precultivation +precultural +preculturally +preculture +precuneal +precuneate +precuneus +precure +precured +precures +precuring +precurrent +precurrer +precurricula +precurricular +precurriculum +precurriculums +precursal +precurse +precursive +precursor +precursory +precursors +precurtain +precut +pred +predable +predacean +predaceous +predaceousness +predacious +predaciousness +predacity +preday +predaylight +predaytime +predamage +predamaged +predamaging +predamn +predamnation +predark +predarkness +predata +predate +predated +predates +predating +predation +predations +predatism +predative +predator +predatory +predatorial +predatorily +predatoriness +predators +predawn +predawns +predazzite +predealer +predealing +predeath +predeathly +predebate +predebater +predebit +predebtor +predecay +predecease +predeceased +predeceaser +predeceases +predeceasing +predeceive +predeceived +predeceiver +predeceiving +predeception +predecess +predecession +predecessor +predecessors +predecessorship +predecide +predecided +predeciding +predecision +predecisive +predecisively +predeclaration +predeclare +predeclared +predeclaring +predeclination +predecline +predeclined +predeclining +predecree +predecreed +predecreeing +predecrement +prededicate +prededicated +prededicating +prededication +prededuct +prededuction +predefault +predefeat +predefect +predefective +predefence +predefend +predefense +predefy +predefiance +predeficiency +predeficient +predeficiently +predefied +predefying +predefine +predefined +predefines +predefining +predefinite +predefinition +predefinitions +predefray +predefrayal +predegeneracy +predegenerate +predegree +predeication +predelay +predelegate +predelegated +predelegating +predelegation +predeliberate +predeliberated +predeliberately +predeliberating +predeliberation +predelineate +predelineated +predelineating +predelineation +predelinquency +predelinquent +predelinquently +predeliver +predelivery +predeliveries +predella +predelle +predelude +predeluded +predeluding +predelusion +predemand +predemocracy +predemocratic +predemonstrate +predemonstrated +predemonstrating +predemonstration +predemonstrative +predeny +predenial +predenied +predenying +predental +predentary +predentata +predentate +predepart +predepartmental +predeparture +predependable +predependence +predependent +predeplete +predepleted +predepleting +predepletion +predeposit +predepository +predepreciate +predepreciated +predepreciating +predepreciation +predepression +predeprivation +predeprive +predeprived +predepriving +prederivation +prederive +prederived +prederiving +predescend +predescent +predescribe +predescribed +predescribing +predescription +predesert +predeserter +predesertion +predeserve +predeserved +predeserving +predesign +predesignate +predesignated +predesignates +predesignating +predesignation +predesignatory +predesirous +predesirously +predesolate +predesolation +predespair +predesperate +predespicable +predespise +predespond +predespondency +predespondent +predestinable +predestinarian +predestinarianism +predestinate +predestinated +predestinately +predestinates +predestinating +predestination +predestinational +predestinationism +predestinationist +predestinative +predestinator +predestine +predestined +predestines +predestiny +predestining +predestitute +predestitution +predestroy +predestruction +predetach +predetachment +predetail +predetain +predetainer +predetect +predetection +predetention +predeterminability +predeterminable +predeterminant +predeterminate +predeterminately +predetermination +predeterminations +predeterminative +predetermine +predetermined +predeterminer +predetermines +predetermining +predeterminism +predeterministic +predetest +predetestation +predetrimental +predevelop +predevelopment +predevise +predevised +predevising +predevote +predevotion +predevour +predy +prediabetes +prediabetic +prediagnoses +prediagnosis +prediagnostic +predial +predialist +prediality +prediastolic +prediatory +predicability +predicable +predicableness +predicably +predicament +predicamental +predicamentally +predicaments +predicant +predicate +predicated +predicates +predicating +predication +predicational +predications +predicative +predicatively +predicator +predicatory +predicrotic +predict +predictability +predictable +predictably +predictate +predictated +predictating +predictation +predicted +predicting +prediction +predictional +predictions +predictive +predictively +predictiveness +predictor +predictory +predictors +predicts +prediet +predietary +predifferent +predifficulty +predigest +predigested +predigesting +predigestion +predigests +predigital +predikant +predilect +predilected +predilection +predilections +prediligent +prediligently +prediluvial +prediluvian +prediminish +prediminishment +prediminution +predynamite +predynastic +predine +predined +predining +predinner +prediphtheritic +prediploma +prediplomacy +prediplomatic +predirect +predirection +predirector +predisability +predisable +predisadvantage +predisadvantageous +predisadvantageously +predisagree +predisagreeable +predisagreed +predisagreeing +predisagreement +predisappointment +predisaster +predisastrous +predisastrously +prediscern +prediscernment +predischarge +predischarged +predischarging +prediscipline +predisciplined +predisciplining +predisclose +predisclosed +predisclosing +predisclosure +prediscontent +prediscontented +prediscontentment +prediscontinuance +prediscontinuation +prediscontinue +prediscount +prediscountable +prediscourage +prediscouraged +prediscouragement +prediscouraging +prediscourse +prediscover +prediscoverer +prediscovery +prediscoveries +prediscreet +prediscretion +prediscretionary +prediscriminate +prediscriminated +prediscriminating +prediscrimination +prediscriminator +prediscuss +prediscussion +predisgrace +predisguise +predisguised +predisguising +predisgust +predislike +predisliked +predisliking +predismiss +predismissal +predismissory +predisorder +predisordered +predisorderly +predispatch +predispatcher +predisperse +predispersed +predispersing +predispersion +predisplace +predisplaced +predisplacement +predisplacing +predisplay +predisponency +predisponent +predisposable +predisposal +predispose +predisposed +predisposedly +predisposedness +predisposes +predisposing +predisposition +predispositional +predispositions +predisputant +predisputation +predispute +predisputed +predisputing +predisregard +predisrupt +predisruption +predissatisfaction +predissolution +predissolve +predissolved +predissolving +predissuade +predissuaded +predissuading +predistinct +predistinction +predistinguish +predistortion +predistress +predistribute +predistributed +predistributing +predistribution +predistributor +predistrict +predistrust +predistrustful +predisturb +predisturbance +prediversion +predivert +predivide +predivided +predividend +predivider +predividing +predivinable +predivinity +predivision +predivorce +predivorcement +prednisolone +prednisone +predoctoral +predoctorate +predocumentary +predomestic +predomestically +predominance +predominancy +predominant +predominantly +predominate +predominated +predominately +predominates +predominating +predominatingly +predomination +predominator +predonate +predonated +predonating +predonation +predonor +predoom +predormition +predorsal +predoubt +predoubter +predoubtful +predoubtfully +predraft +predrainage +predramatic +predraw +predrawer +predrawing +predrawn +predread +predreadnought +predrew +predry +predried +predrying +predrill +predriller +predrive +predriven +predriver +predriving +predrove +preduplicate +preduplicated +preduplicating +preduplication +predusk +predusks +predwell +pree +preearthly +preearthquake +preeconomic +preeconomical +preeconomically +preed +preedit +preedition +preeditor +preeditorial +preeditorially +preeducate +preeducated +preeducating +preeducation +preeducational +preeducationally +preeffect +preeffective +preeffectively +preeffectual +preeffectually +preeffort +preeing +preelect +preelected +preelecting +preelection +preelective +preelectric +preelectrical +preelectrically +preelects +preelemental +preelementary +preeligibility +preeligible +preeligibleness +preeligibly +preeliminate +preeliminated +preeliminating +preelimination +preeliminator +preemancipation +preembarrass +preembarrassment +preembody +preembodied +preembodying +preembodiment +preemergence +preemergency +preemergencies +preemergent +preemie +preemies +preeminence +preeminent +preeminently +preemotion +preemotional +preemotionally +preemperor +preemphasis +preemploy +preemployee +preemployer +preemployment +preempt +preempted +preempting +preemption +preemptions +preemptive +preemptively +preemptor +preemptory +preempts +preen +preenable +preenabled +preenabling +preenact +preenacted +preenacting +preenaction +preenacts +preenclose +preenclosed +preenclosing +preenclosure +preencounter +preencourage +preencouragement +preendeavor +preendorse +preendorsed +preendorsement +preendorser +preendorsing +preened +preener +preeners +preenforce +preenforced +preenforcement +preenforcing +preengage +preengaged +preengagement +preengages +preengaging +preengineering +preening +preenjoy +preenjoyable +preenjoyment +preenlarge +preenlarged +preenlargement +preenlarging +preenlighten +preenlightener +preenlightenment +preenlist +preenlistment +preenlistments +preenroll +preenrollment +preens +preentail +preentailment +preenter +preentertain +preentertainer +preentertainment +preenthusiasm +preentitle +preentitled +preentitling +preentrance +preentry +preenumerate +preenumerated +preenumerating +preenumeration +preenvelop +preenvelopment +preenvironmental +preepidemic +preepochal +preequalization +preequip +preequipment +preequipped +preequipping +preequity +preerect +preerection +preerupt +preeruption +preeruptive +preeruptively +prees +preescape +preescaped +preescaping +preesophageal +preessay +preessential +preessentially +preestablish +preestablished +preestablishes +preestablishing +preesteem +preestimate +preestimated +preestimates +preestimating +preestimation +preestival +preeternal +preeternity +preevade +preevaded +preevading +preevaporate +preevaporated +preevaporating +preevaporation +preevaporator +preevasion +preevidence +preevident +preevidently +preevolutional +preevolutionary +preevolutionist +preexact +preexaction +preexamination +preexaminations +preexamine +preexamined +preexaminer +preexamines +preexamining +preexcept +preexception +preexceptional +preexceptionally +preexchange +preexchanged +preexchanging +preexcitation +preexcite +preexcited +preexciting +preexclude +preexcluded +preexcluding +preexclusion +preexclusive +preexclusively +preexcursion +preexcuse +preexcused +preexcusing +preexecute +preexecuted +preexecuting +preexecution +preexecutor +preexempt +preexemption +preexhaust +preexhaustion +preexhibit +preexhibition +preexhibitor +preexilian +preexilic +preexist +preexisted +preexistence +preexistent +preexisting +preexists +preexpand +preexpansion +preexpect +preexpectant +preexpectation +preexpedition +preexpeditionary +preexpend +preexpenditure +preexpense +preexperience +preexperienced +preexperiencing +preexperiment +preexperimental +preexpiration +preexplain +preexplanation +preexplanatory +preexplode +preexploded +preexploding +preexplosion +preexpose +preexposed +preexposes +preexposing +preexposition +preexposure +preexposures +preexpound +preexpounder +preexpress +preexpression +preexpressive +preextend +preextensive +preextensively +preextent +preextinction +preextinguish +preextinguishment +preextract +preextraction +preeze +pref +prefab +prefabbed +prefabbing +prefabricate +prefabricated +prefabricates +prefabricating +prefabrication +prefabricator +prefabs +preface +prefaceable +prefaced +prefacer +prefacers +prefaces +prefacial +prefacing +prefacist +prefactor +prefactory +prefamiliar +prefamiliarity +prefamiliarly +prefamous +prefamously +prefashion +prefashioned +prefatial +prefator +prefatory +prefatorial +prefatorially +prefatorily +prefavor +prefavorable +prefavorably +prefavorite +prefearful +prefearfully +prefeast +prefect +prefectly +prefectoral +prefectorial +prefectorially +prefectorian +prefects +prefectship +prefectual +prefectural +prefecture +prefectures +prefecundation +prefecundatory +prefederal +prefelic +prefer +preferability +preferable +preferableness +preferably +prefered +preferee +preference +preferences +preferent +preferential +preferentialism +preferentialist +preferentially +preferment +prefermentation +preferments +preferral +preferred +preferredly +preferredness +preferrer +preferrers +preferring +preferrous +prefers +prefertile +prefertility +prefertilization +prefertilize +prefertilized +prefertilizing +prefervid +prefestival +prefet +prefeudal +prefeudalic +prefeudalism +preffroze +preffrozen +prefiction +prefictional +prefigurate +prefiguration +prefigurative +prefiguratively +prefigurativeness +prefigure +prefigured +prefigurement +prefigurer +prefigures +prefiguring +prefill +prefiller +prefills +prefilter +prefinal +prefinance +prefinanced +prefinancial +prefinancing +prefine +prefinish +prefix +prefixable +prefixal +prefixally +prefixation +prefixed +prefixedly +prefixes +prefixing +prefixion +prefixions +prefixture +preflagellate +preflagellated +preflatter +preflattery +preflavor +preflavoring +preflection +preflexion +preflight +preflood +prefloration +preflowering +prefocus +prefocused +prefocuses +prefocusing +prefocussed +prefocusses +prefocussing +prefoliation +prefool +preforbidden +preforceps +preforgave +preforgive +preforgiven +preforgiveness +preforgiving +preforgotten +preform +preformant +preformation +preformationary +preformationism +preformationist +preformative +preformed +preforming +preformism +preformist +preformistic +preforms +preformulate +preformulated +preformulating +preformulation +prefortunate +prefortunately +prefortune +prefoundation +prefounder +prefract +prefragrance +prefragrant +prefrank +prefranked +prefranking +prefrankness +prefranks +prefraternal +prefraternally +prefraud +prefreeze +prefreezing +prefreshman +prefreshmen +prefriendly +prefriendship +prefright +prefrighten +prefrontal +prefroze +prefrozen +prefulfill +prefulfillment +prefulgence +prefulgency +prefulgent +prefunction +prefunctional +prefuneral +prefungoidal +prefurlough +prefurnish +pregain +pregainer +pregalvanize +pregalvanized +pregalvanizing +pregame +preganglionic +pregastrular +pregather +pregathering +pregeminum +pregenerate +pregenerated +pregenerating +pregeneration +pregenerosity +pregenerous +pregenerously +pregenial +pregeniculatum +pregeniculum +pregenital +pregeological +preggers +preghiera +pregirlhood +preglacial +pregladden +pregladness +preglenoid +preglenoidal +preglobulin +pregnability +pregnable +pregnance +pregnancy +pregnancies +pregnant +pregnantly +pregnantness +pregnenolone +pregolden +pregolfing +pregracile +pregracious +pregrade +pregraded +pregrading +pregraduation +pregranite +pregranitic +pregratify +pregratification +pregratified +pregratifying +pregreet +pregreeting +pregrievance +pregrowth +preguarantee +preguaranteed +preguaranteeing +preguarantor +preguard +preguess +preguidance +preguide +preguided +preguiding +preguilt +preguilty +preguiltiness +pregust +pregustant +pregustation +pregustator +pregustic +prehallux +prehalter +prehalteres +prehandicap +prehandicapped +prehandicapping +prehandle +prehandled +prehandling +prehaps +preharden +prehardened +prehardener +prehardening +prehardens +preharmony +preharmonious +preharmoniously +preharmoniousness +preharsh +preharshness +preharvest +prehatred +prehaunt +prehaunted +prehaustorium +prehazard +prehazardous +preheal +prehearing +preheat +preheated +preheater +preheating +preheats +prehemiplegic +prehend +prehended +prehensibility +prehensible +prehensile +prehensility +prehension +prehensive +prehensiveness +prehensor +prehensory +prehensorial +prehepatic +prehepaticus +preheroic +prehesitancy +prehesitate +prehesitated +prehesitating +prehesitation +prehexameral +prehydration +prehypophysis +prehistory +prehistorian +prehistoric +prehistorical +prehistorically +prehistorics +prehistories +prehnite +prehnitic +preholder +preholding +preholiday +prehominid +prehorizon +prehorror +prehostile +prehostility +prehuman +prehumans +prehumiliate +prehumiliation +prehumor +prehunger +prey +preidea +preidentify +preidentification +preidentified +preidentifying +preyed +preyer +preyers +preyful +preignition +preying +preyingly +preilium +preilluminate +preillumination +preillustrate +preillustrated +preillustrating +preillustration +preimage +preimaginary +preimagination +preimagine +preimagined +preimagining +preimbibe +preimbibed +preimbibing +preimbue +preimbued +preimbuing +preimitate +preimitated +preimitating +preimitation +preimitative +preimmigration +preimpair +preimpairment +preimpart +preimperial +preimport +preimportance +preimportant +preimportantly +preimportation +preimposal +preimpose +preimposed +preimposing +preimposition +preimpress +preimpression +preimpressionism +preimpressionist +preimpressive +preimprove +preimproved +preimprovement +preimproving +preinaugural +preinaugurate +preinaugurated +preinaugurating +preincarnate +preincentive +preincination +preinclination +preincline +preinclined +preinclining +preinclude +preincluded +preincluding +preinclusion +preincorporate +preincorporated +preincorporating +preincorporation +preincrease +preincreased +preincreasing +preindebted +preindebtedly +preindebtedness +preindemnify +preindemnification +preindemnified +preindemnifying +preindemnity +preindependence +preindependent +preindependently +preindesignate +preindicant +preindicate +preindicated +preindicating +preindication +preindicative +preindispose +preindisposed +preindisposing +preindisposition +preinduce +preinduced +preinducement +preinducing +preinduction +preinductive +preindulge +preindulged +preindulgence +preindulgent +preindulging +preindustry +preindustrial +preinfect +preinfection +preinfer +preinference +preinferredpreinferring +preinflection +preinflectional +preinflict +preinfliction +preinfluence +preinform +preinformation +preinhabit +preinhabitant +preinhabitation +preinhere +preinhered +preinhering +preinherit +preinheritance +preinitial +preinitialize +preinitialized +preinitializes +preinitializing +preinitiate +preinitiated +preinitiating +preinitiation +preinjure +preinjury +preinjurious +preinquisition +preinscribe +preinscribed +preinscribing +preinscription +preinsert +preinserted +preinserting +preinsertion +preinserts +preinsinuate +preinsinuated +preinsinuating +preinsinuatingly +preinsinuation +preinsinuative +preinspect +preinspection +preinspector +preinspire +preinspired +preinspiring +preinstall +preinstallation +preinstill +preinstillation +preinstruct +preinstructed +preinstructing +preinstruction +preinstructional +preinstructive +preinstructs +preinsula +preinsular +preinsulate +preinsulated +preinsulating +preinsulation +preinsult +preinsurance +preinsure +preinsured +preinsuring +preintellectual +preintellectually +preintelligence +preintelligent +preintelligently +preintend +preintention +preintercede +preinterceded +preinterceding +preintercession +preinterchange +preintercourse +preinterest +preinterfere +preinterference +preinterpret +preinterpretation +preinterpretative +preinterrupt +preinterview +preintimate +preintimated +preintimately +preintimating +preintimation +preintone +preinvasive +preinvent +preinvention +preinventive +preinventory +preinventories +preinvest +preinvestigate +preinvestigated +preinvestigating +preinvestigation +preinvestigator +preinvestment +preinvitation +preinvite +preinvited +preinviting +preinvocation +preinvolve +preinvolved +preinvolvement +preinvolving +preiotization +preiotize +preyouthful +preirrigation +preirrigational +preys +preissuance +preissue +preissued +preissuing +prejacent +prejournalistic +prejudge +prejudged +prejudgement +prejudger +prejudges +prejudging +prejudgment +prejudgments +prejudicate +prejudication +prejudicative +prejudicator +prejudice +prejudiced +prejudicedly +prejudiceless +prejudices +prejudiciable +prejudicial +prejudicially +prejudicialness +prejudicing +prejudicious +prejudiciously +prejunior +prejurisdiction +prejustify +prejustification +prejustified +prejustifying +prejuvenile +prekantian +prekindergarten +prekindergartens +prekindle +prekindled +prekindling +preknew +preknit +preknow +preknowing +preknowledge +preknown +prela +prelabel +prelabial +prelabor +prelabrum +prelachrymal +prelacy +prelacies +prelacrimal +prelacteal +prelanguage +prelapsarian +prelaryngoscopic +prelate +prelatehood +prelateity +prelates +prelateship +prelatess +prelaty +prelatial +prelatic +prelatical +prelatically +prelaticalness +prelation +prelatish +prelatism +prelatist +prelatize +prelatry +prelature +prelaunch +prelaunching +prelaw +prelawful +prelawfully +prelawfulness +prelease +preleased +preleasing +prelect +prelected +prelecting +prelection +prelector +prelectorship +prelectress +prelects +prelecture +prelectured +prelecturing +prelegacy +prelegal +prelegate +prelegatee +prelegend +prelegendary +prelegislative +prelexical +preliability +preliable +prelibation +preliberal +preliberality +preliberally +preliberate +preliberated +preliberating +preliberation +prelicense +prelicensed +prelicensing +prelim +preliminary +preliminaries +preliminarily +prelimit +prelimitate +prelimitated +prelimitating +prelimitation +prelimited +prelimiting +prelimits +prelims +prelingual +prelingually +prelinguistic +prelinpinpin +preliquidate +preliquidated +preliquidating +preliquidation +preliteral +preliterally +preliteralness +preliterary +preliterate +preliterature +prelithic +prelitigation +preloaded +preloan +prelocalization +prelocate +prelocated +prelocating +prelogic +prelogical +preloral +preloreal +preloss +prelude +preluded +preluder +preluders +preludes +preludial +preluding +preludio +preludious +preludiously +preludium +preludize +prelumbar +prelusion +prelusive +prelusively +prelusory +prelusorily +preluxurious +preluxuriously +preluxuriousness +prem +premachine +premade +premadness +premaintain +premaintenance +premake +premaker +premaking +premalignant +preman +premandibular +premanhood +premaniacal +premanifest +premanifestation +premankind +premanufacture +premanufactured +premanufacturer +premanufacturing +premarital +premarketing +premarry +premarriage +premarried +premarrying +premastery +prematch +premate +premated +prematerial +prematernity +premating +prematrimonial +prematrimonially +prematuration +premature +prematurely +prematureness +prematurity +prematurities +premaxilla +premaxillae +premaxillary +premeasure +premeasured +premeasurement +premeasuring +premechanical +premed +premedia +premedial +premedian +premedic +premedical +premedicate +premedicated +premedicating +premedication +premedics +premedieval +premedievalism +premeditate +premeditated +premeditatedly +premeditatedness +premeditates +premeditating +premeditatingly +premeditation +premeditative +premeditator +premeditators +premeds +premegalithic +premeiotic +prememoda +prememoranda +prememorandum +prememorandums +premen +premenace +premenaced +premenacing +premenstrual +premenstrually +premention +premeridian +premerit +premetallic +premethodical +premia +premial +premiant +premiate +premiated +premiating +premycotic +premidnight +premidsummer +premie +premyelocyte +premier +premieral +premiere +premiered +premieres +premieress +premiering +premierjus +premiers +premiership +premierships +premies +premilitary +premillenarian +premillenarianism +premillenial +premillennial +premillennialise +premillennialised +premillennialising +premillennialism +premillennialist +premillennialize +premillennialized +premillennializing +premillennially +premillennian +preminister +preministry +preministries +premio +premious +premisal +premise +premised +premises +premising +premisory +premisrepresent +premisrepresentation +premiss +premissable +premisses +premit +premythical +premium +premiums +premix +premixed +premixer +premixes +premixing +premixture +premodel +premodeled +premodeling +premodern +premodify +premodification +premodified +premodifying +premolar +premolars +premold +premolder +premolding +premonarchal +premonarchial +premonarchical +premonetary +premonetory +premongolian +premonish +premonishment +premonition +premonitions +premonitive +premonitor +premonitory +premonitorily +premonopoly +premonopolies +premonopolize +premonopolized +premonopolizing +premonstrant +premonstratensian +premonstratensis +premonstration +premonumental +premoral +premorality +premorally +premorbid +premorbidly +premorbidness +premorning +premorse +premortal +premortally +premortify +premortification +premortified +premortifying +premortuary +premorula +premosaic +premotion +premourn +premove +premovement +premover +premuddle +premuddled +premuddling +premultiply +premultiplication +premultiplier +premultiplying +premundane +premune +premunicipal +premunire +premunition +premunitory +premusical +premusically +premuster +premutative +premutiny +premutinied +premutinies +premutinying +prename +prenames +prenanthes +prenarcotic +prenares +prenarial +prenaris +prenasal +prenatal +prenatalist +prenatally +prenational +prenative +prenatural +prenaval +prender +prendre +prenebular +prenecessitate +prenecessitated +prenecessitating +preneglect +preneglectful +prenegligence +prenegligent +prenegotiate +prenegotiated +prenegotiating +prenegotiation +preneolithic +prenephritic +preneural +preneuralgic +prenight +prenoble +prenodal +prenomen +prenomens +prenomina +prenominal +prenominate +prenominated +prenominating +prenomination +prenominical +prenotation +prenote +prenoted +prenotice +prenotify +prenotification +prenotified +prenotifying +prenoting +prenotion +prentice +prenticed +prentices +prenticeship +prenticing +prenumber +prenumbering +prenuncial +prenunciate +prenuptial +prenursery +prenurseries +prenzie +preobedience +preobedient +preobediently +preobject +preobjection +preobjective +preobligate +preobligated +preobligating +preobligation +preoblige +preobliged +preobliging +preoblongata +preobservance +preobservation +preobservational +preobserve +preobserved +preobserving +preobstruct +preobstruction +preobtain +preobtainable +preobtrude +preobtruded +preobtrudingpreobtrusion +preobtrusion +preobtrusive +preobviate +preobviated +preobviating +preobvious +preobviously +preobviousness +preoccasioned +preoccipital +preocclusion +preoccultation +preoccupancy +preoccupant +preoccupate +preoccupation +preoccupations +preoccupative +preoccupy +preoccupied +preoccupiedly +preoccupiedness +preoccupier +preoccupies +preoccupying +preoccur +preoccurred +preoccurrence +preoccurring +preoceanic +preocular +preodorous +preoesophageal +preoffend +preoffense +preoffensive +preoffensively +preoffensiveness +preoffer +preoffering +preofficial +preofficially +preominate +preomission +preomit +preomitted +preomitting +preopen +preopening +preoperate +preoperated +preoperating +preoperation +preoperative +preoperatively +preoperator +preopercle +preopercular +preoperculum +preopinion +preopinionated +preoppose +preopposed +preopposing +preopposition +preoppress +preoppression +preoppressor +preoptic +preoptimistic +preoption +preoral +preorally +preorbital +preordain +preordained +preordaining +preordainment +preordains +preorder +preordered +preordering +preordinance +preordination +preorganic +preorganically +preorganization +preorganize +preorganized +preorganizing +preoriginal +preoriginally +preornamental +preotic +preoutfit +preoutfitted +preoutfitting +preoutline +preoutlined +preoutlining +preoverthrew +preoverthrow +preoverthrowing +preoverthrown +preoviposition +preovulatory +prep +prepack +prepackage +prepackaged +prepackages +prepackaging +prepacked +prepacking +prepacks +prepaging +prepay +prepayable +prepaid +prepaying +prepayment +prepayments +prepainful +prepays +prepalaeolithic +prepalatal +prepalatine +prepaleolithic +prepanic +preparable +preparateur +preparation +preparationist +preparations +preparative +preparatively +preparatives +preparator +preparatory +preparatorily +prepardon +prepare +prepared +preparedly +preparedness +preparement +preparental +preparer +preparers +prepares +preparietal +preparing +preparingly +preparliamentary +preparoccipital +preparoxysmal +prepartake +prepartaken +prepartaking +preparticipation +prepartisan +prepartition +prepartnership +prepartook +prepatellar +prepatent +prepatrician +prepatriotic +prepave +prepaved +prepavement +prepaving +prepd +prepectoral +prepeduncle +prepend +prepended +prepending +prepenetrate +prepenetrated +prepenetrating +prepenetration +prepenial +prepense +prepensed +prepensely +prepeople +preperceive +preperception +preperceptive +preperfect +preperitoneal +prepersuade +prepersuaded +prepersuading +prepersuasion +prepersuasive +preperusal +preperuse +preperused +preperusing +prepetition +prepg +prephragma +prephthisical +prepigmental +prepyloric +prepineal +prepink +prepious +prepiously +prepyramidal +prepituitary +preplace +preplaced +preplacement +preplacental +preplaces +preplacing +preplan +preplanned +preplanning +preplans +preplant +preplanting +prepledge +prepledged +prepledging +preplot +preplotted +preplotting +prepn +prepoetic +prepoetical +prepoison +prepolice +prepolish +prepolitic +prepolitical +prepolitically +prepollence +prepollency +prepollent +prepollex +prepollices +preponder +preponderance +preponderancy +preponderant +preponderantly +preponderate +preponderated +preponderately +preponderates +preponderating +preponderatingly +preponderation +preponderous +preponderously +prepontile +prepontine +preportray +preportrayal +prepose +preposed +preposing +preposition +prepositional +prepositionally +prepositions +prepositive +prepositively +prepositor +prepositorial +prepositure +prepossess +prepossessed +prepossesses +prepossessing +prepossessingly +prepossessingness +prepossession +prepossessionary +prepossessions +prepossessor +preposter +preposterous +preposterously +preposterousness +prepostor +prepostorship +prepotence +prepotency +prepotent +prepotential +prepotently +prepped +preppy +preppie +preppies +prepping +prepractical +prepractice +prepracticed +prepracticing +prepractise +prepractised +prepractising +preprandial +prepreference +prepreparation +preprice +prepriced +prepricing +preprimary +preprimer +preprimitive +preprint +preprinted +preprinting +preprints +preprocess +preprocessed +preprocessing +preprocessor +preprocessors +preproduction +preprofess +preprofessional +preprogram +preprogrammed +preprohibition +prepromise +prepromised +prepromising +prepromote +prepromoted +prepromoting +prepromotion +prepronounce +prepronounced +prepronouncement +prepronouncing +preprophetic +preprostatic +preprove +preproved +preprovide +preprovided +preproviding +preprovision +preprovocation +preprovoke +preprovoked +preprovoking +preprudent +preprudently +preps +prepsychology +prepsychological +prepsychotic +prepuberal +prepuberally +prepubertal +prepubertally +prepuberty +prepubescence +prepubescent +prepubic +prepubis +prepublication +prepublish +prepuce +prepuces +prepueblo +prepunch +prepunched +prepunches +prepunching +prepunctual +prepunish +prepunishment +prepupa +prepupal +prepurchase +prepurchased +prepurchaser +prepurchasing +prepurpose +prepurposed +prepurposing +prepurposive +preputial +preputium +prequalify +prequalification +prequalified +prequalifying +prequarantine +prequarantined +prequarantining +prequel +prequestion +prequotation +prequote +prequoted +prequoting +preracing +preradio +prerailroad +prerailroadite +prerailway +preramus +prerational +preready +prereadiness +prerealization +prerealize +prerealized +prerealizing +prerebellion +prereceipt +prereceive +prereceived +prereceiver +prereceiving +prerecital +prerecite +prerecited +prereciting +prereckon +prereckoning +prerecognition +prerecognize +prerecognized +prerecognizing +prerecommend +prerecommendation +prereconcile +prereconciled +prereconcilement +prereconciliation +prereconciling +prerecord +prerecorded +prerecording +prerecords +prerectal +preredeem +preredemption +prereduction +prerefer +prereference +prereferred +prereferring +prerefine +prerefined +prerefinement +prerefining +prereform +prereformation +prereformatory +prerefusal +prerefuse +prerefused +prerefusing +preregal +preregister +preregistered +preregistering +preregisters +preregistration +preregnant +preregulate +preregulated +preregulating +preregulation +prereject +prerejection +prerejoice +prerejoiced +prerejoicing +prerelate +prerelated +prerelating +prerelation +prerelationship +prerelease +prereligious +prereluctance +prereluctation +preremit +preremittance +preremitted +preremitting +preremorse +preremote +preremoval +preremove +preremoved +preremoving +preremunerate +preremunerated +preremunerating +preremuneration +prerenal +prerent +prerental +prereport +prerepresent +prerepresentation +prereproductive +prereption +prerepublican +prerequest +prerequire +prerequired +prerequirement +prerequiring +prerequisite +prerequisites +prerequisition +preresemblance +preresemble +preresembled +preresembling +preresolution +preresolve +preresolved +preresolving +preresort +prerespectability +prerespectable +prerespiration +prerespire +preresponsibility +preresponsible +prerestoration +prerestrain +prerestraint +prerestrict +prerestriction +prereturn +prereveal +prerevelation +prerevenge +prerevenged +prerevenging +prereversal +prereverse +prereversed +prereversing +prereview +prerevise +prerevised +prerevising +prerevision +prerevival +prerevolutionary +prerheumatic +prerich +prerighteous +prerighteously +prerighteousness +prerogatival +prerogative +prerogatived +prerogatively +prerogatives +prerogativity +preroyal +preroyally +preroyalty +prerolandic +preromantic +preromanticism +preroute +prerouted +preroutine +prerouting +prerupt +preruption +pres +presa +presacral +presacrifice +presacrificed +presacrificial +presacrificing +presage +presaged +presageful +presagefully +presagefulness +presagement +presager +presagers +presages +presagient +presaging +presagingly +presay +presaid +presaying +presalvation +presanctify +presanctification +presanctified +presanctifying +presanguine +presanitary +presartorial +presatisfaction +presatisfactory +presatisfy +presatisfied +presatisfying +presavage +presavagery +presaw +presbyacousia +presbyacusia +presbycousis +presbycusis +presbyope +presbyophrenia +presbyophrenic +presbyopy +presbyopia +presbyopic +presbyte +presbyter +presbyteral +presbyterate +presbyterated +presbytere +presbyteress +presbytery +presbyteria +presbyterial +presbyterially +presbyterian +presbyterianism +presbyterianize +presbyterianly +presbyterians +presbyteries +presbyterium +presbyters +presbytership +presbytia +presbytic +presbytinae +presbytis +presbytism +prescan +prescapula +prescapular +prescapularis +prescholastic +preschool +preschooler +preschoolers +prescience +prescient +prescientific +presciently +prescind +prescinded +prescindent +prescinding +prescinds +prescission +prescore +prescored +prescores +prescoring +prescout +prescribable +prescribe +prescribed +prescriber +prescribes +prescribing +prescript +prescriptibility +prescriptible +prescription +prescriptionist +prescriptions +prescriptive +prescriptively +prescriptiveness +prescriptivism +prescriptivist +prescriptorial +prescripts +prescrive +prescutal +prescutum +prese +preseal +presearch +preseason +preseasonal +presecular +presecure +presecured +presecuring +presedentary +presee +preseeing +preseen +preselect +preselected +preselecting +preselection +preselector +preselects +presell +preselling +presells +presemilunar +preseminal +preseminary +presence +presenced +presenceless +presences +presenile +presenility +presensation +presension +present +presentability +presentable +presentableness +presentably +presental +presentation +presentational +presentationalism +presentationes +presentationism +presentationist +presentations +presentative +presentatively +presented +presentee +presentence +presentenced +presentencing +presenter +presenters +presential +presentiality +presentially +presentialness +presentiate +presentient +presentiment +presentimental +presentiments +presenting +presentist +presentive +presentively +presentiveness +presently +presentment +presentness +presentor +presents +preseparate +preseparated +preseparating +preseparation +preseparator +preseptal +preser +preservability +preservable +preserval +preservation +preservationist +preservations +preservative +preservatives +preservatize +preservatory +preserve +preserved +preserver +preserveress +preservers +preserves +preserving +preses +presession +preset +presets +presettable +presetting +presettle +presettled +presettlement +presettling +presexual +preshadow +preshape +preshaped +preshapes +preshaping +preshare +preshared +presharing +presharpen +preshelter +preship +preshipment +preshipped +preshipping +preshortage +preshorten +preshow +preshowed +preshowing +preshown +preshows +preshrink +preshrinkage +preshrinking +preshrunk +preside +presided +presidence +presidency +presidencia +presidencies +president +presidente +presidentes +presidentess +presidential +presidentially +presidentiary +presidents +presidentship +presider +presiders +presides +presidy +presidia +presidial +presidially +presidiary +presiding +presidio +presidios +presidium +presidiums +presift +presifted +presifting +presifts +presign +presignal +presignaled +presignify +presignificance +presignificancy +presignificant +presignification +presignificative +presignificator +presignified +presignifying +presylvian +presimian +presympathy +presympathize +presympathized +presympathizing +presymphysial +presymphony +presymphonic +presymptom +presymptomatic +presynapsis +presynaptic +presynaptically +presynsacral +presystematic +presystematically +presystole +presystolic +preslavery +presley +presmooth +presoak +presoaked +presoaking +presoaks +presocial +presocialism +presocialist +presolar +presold +presolicit +presolicitation +presolution +presolvated +presolve +presolved +presolving +presophomore +presound +prespecialist +prespecialize +prespecialized +prespecializing +prespecify +prespecific +prespecifically +prespecification +prespecified +prespecifying +prespective +prespeculate +prespeculated +prespeculating +prespeculation +presphenoid +presphenoidal +presphygmic +prespinal +prespinous +prespiracular +presplendor +presplenomegalic +prespoil +prespontaneity +prespontaneous +prespontaneously +prespread +prespreading +presprinkle +presprinkled +presprinkling +prespur +prespurred +prespurring +press +pressable +pressage +pressboard +pressdom +pressed +pressel +presser +pressers +presses +pressfat +pressful +pressgang +pressible +pressie +pressing +pressingly +pressingness +pressings +pression +pressiroster +pressirostral +pressive +pressly +pressman +pressmanship +pressmark +pressmaster +pressmen +pressor +pressoreceptor +pressors +pressosensitive +presspack +pressroom +pressrooms +pressrun +pressruns +pressurage +pressural +pressure +pressured +pressureless +pressureproof +pressures +pressuring +pressurization +pressurize +pressurized +pressurizer +pressurizers +pressurizes +pressurizing +presswoman +presswomen +presswork +pressworker +prest +prestabilism +prestability +prestable +prestamp +prestamped +prestamping +prestamps +prestandard +prestandardization +prestandardize +prestandardized +prestandardizing +prestant +prestate +prestated +prestating +prestation +prestatistical +presteam +presteel +prester +presternal +presternum +presters +prestezza +prestidigital +prestidigitate +prestidigitation +prestidigitator +prestidigitatory +prestidigitatorial +prestidigitators +prestige +prestigeful +prestiges +prestigiate +prestigiation +prestigiator +prestigious +prestigiously +prestigiousness +prestimulate +prestimulated +prestimulating +prestimulation +prestimuli +prestimulus +prestissimo +prestly +presto +prestock +prestomial +prestomium +prestorage +prestore +prestored +prestoring +prestos +prestraighten +prestrain +prestrengthen +prestress +prestressed +prestretch +prestricken +prestruggle +prestruggled +prestruggling +prests +prestubborn +prestudy +prestudied +prestudying +prestudious +prestudiously +prestudiousness +presubdue +presubdued +presubduing +presubiculum +presubject +presubjection +presubmission +presubmit +presubmitted +presubmitting +presubordinate +presubordinated +presubordinating +presubordination +presubscribe +presubscribed +presubscriber +presubscribing +presubscription +presubsist +presubsistence +presubsistent +presubstantial +presubstitute +presubstituted +presubstituting +presubstitution +presuccess +presuccessful +presuccessfully +presuffer +presuffering +presufficiency +presufficient +presufficiently +presuffrage +presuggest +presuggestion +presuggestive +presuitability +presuitable +presuitably +presul +presumable +presumableness +presumably +presume +presumed +presumedly +presumer +presumers +presumes +presuming +presumingly +presumption +presumptions +presumptious +presumptiously +presumptive +presumptively +presumptiveness +presumptuous +presumptuously +presumptuousness +presuperficial +presuperficiality +presuperficially +presuperfluity +presuperfluous +presuperfluously +presuperintendence +presuperintendency +presupervise +presupervised +presupervising +presupervision +presupervisor +presupplemental +presupplementary +presupply +presupplicate +presupplicated +presupplicating +presupplication +presupplied +presupplying +presupport +presupposal +presuppose +presupposed +presupposes +presupposing +presupposition +presuppositionless +presuppositions +presuppress +presuppression +presuppurative +presupremacy +presupreme +presurgery +presurgical +presurmise +presurmised +presurmising +presurprisal +presurprise +presurrender +presurround +presurvey +presusceptibility +presusceptible +presuspect +presuspend +presuspension +presuspicion +presuspicious +presuspiciously +presuspiciousness +presustain +presutural +preswallow +pret +preta +pretabulate +pretabulated +pretabulating +pretabulation +pretan +pretangible +pretangibly +pretannage +pretanned +pretanning +pretardy +pretardily +pretardiness +pretariff +pretarsi +pretarsus +pretarsusi +pretaste +pretasted +pretaster +pretastes +pretasting +pretaught +pretax +pretaxation +preteach +preteaching +pretechnical +pretechnically +preteen +preteens +pretelegraph +pretelegraphic +pretelephone +pretelephonic +pretell +pretelling +pretemperate +pretemperately +pretemporal +pretempt +pretemptation +pretence +pretenced +pretenceful +pretenceless +pretences +pretend +pretendant +pretended +pretendedly +pretender +pretenderism +pretenders +pretendership +pretending +pretendingly +pretendingness +pretends +pretense +pretensed +pretenseful +pretenseless +pretenses +pretension +pretensional +pretensionless +pretensions +pretensive +pretensively +pretensiveness +pretentative +pretention +pretentious +pretentiously +pretentiousness +preter +pretercanine +preterchristian +preterconventional +preterdetermined +preterdeterminedly +preterdiplomatic +preterdiplomatically +preterequine +preteressential +pretergress +pretergression +preterhuman +preterience +preterient +preterimperfect +preterintentional +preterist +preterit +preterite +preteriteness +preterition +preteritive +preteritness +preterits +preterlabent +preterlegal +preterlethal +preterminal +pretermission +pretermit +pretermitted +pretermitter +pretermitting +preternative +preternatural +preternaturalism +preternaturalist +preternaturality +preternaturally +preternaturalness +preternormal +preternotorious +preternuptial +preterperfect +preterpluperfect +preterpolitical +preterrational +preterregular +preterrestrial +preterritorial +preterroyal +preterscriptural +preterseasonable +pretersensual +pretervection +pretest +pretested +pretestify +pretestified +pretestifying +pretestimony +pretestimonies +pretesting +pretests +pretext +pretexta +pretextae +pretexted +pretexting +pretexts +pretextuous +pretheological +prethyroid +prethoracic +prethoughtful +prethoughtfully +prethoughtfulness +prethreaten +prethrill +prethrust +pretibial +pretil +pretimely +pretimeliness +pretympanic +pretincture +pretyphoid +pretypify +pretypified +pretypifying +pretypographical +pretyranny +pretyrannical +pretire +pretired +pretiring +pretium +pretoken +pretold +pretone +pretonic +pretor +pretoria +pretorial +pretorian +pretorium +pretors +pretorship +pretorsional +pretorture +pretortured +pretorturing +pretournament +pretrace +pretraced +pretracheal +pretracing +pretraditional +pretrain +pretraining +pretransact +pretransaction +pretranscribe +pretranscribed +pretranscribing +pretranscription +pretranslate +pretranslated +pretranslating +pretranslation +pretransmission +pretransmit +pretransmitted +pretransmitting +pretransport +pretransportation +pretravel +pretreat +pretreated +pretreaty +pretreating +pretreatment +pretreats +pretrematic +pretry +pretrial +pretribal +pretried +pretrying +pretrochal +pretty +prettied +prettier +pretties +prettiest +prettyface +prettify +prettification +prettified +prettifier +prettifiers +prettifies +prettifying +prettying +prettyish +prettyism +prettikin +prettily +prettiness +pretubercular +pretuberculous +pretzel +pretzels +preultimate +preultimately +preumbonal +preunderstand +preunderstanding +preunderstood +preundertake +preundertaken +preundertaking +preundertook +preunion +preunions +preunite +preunited +preunites +preuniting +preutilizable +preutilization +preutilize +preutilized +preutilizing +preux +prev +prevacate +prevacated +prevacating +prevacation +prevaccinate +prevaccinated +prevaccinating +prevaccination +prevail +prevailance +prevailed +prevailer +prevailers +prevailing +prevailingly +prevailingness +prevailment +prevails +prevalence +prevalency +prevalencies +prevalent +prevalently +prevalentness +prevalescence +prevalescent +prevalid +prevalidity +prevalidly +prevaluation +prevalue +prevalued +prevaluing +prevariation +prevaricate +prevaricated +prevaricates +prevaricating +prevarication +prevarications +prevaricative +prevaricator +prevaricatory +prevaricators +prevascular +preve +prevegetation +prevelar +prevenance +prevenances +prevenancy +prevenant +prevene +prevened +prevenience +prevenient +preveniently +prevening +prevent +preventability +preventable +preventably +preventative +preventatives +prevented +preventer +preventible +preventing +preventingly +prevention +preventionism +preventionist +preventions +preventive +preventively +preventiveness +preventives +preventoria +preventorium +preventoriums +preventral +prevents +preventtoria +preventure +preventured +preventuring +preverb +preverbal +preverify +preverification +preverified +preverifying +prevernal +preversed +preversing +preversion +prevertebral +prevesical +preveto +prevetoed +prevetoes +prevetoing +previctorious +previde +previdence +preview +previewed +previewing +previews +previgilance +previgilant +previgilantly +previolate +previolated +previolating +previolation +previous +previously +previousness +previse +prevised +previses +previsibility +previsible +previsibly +prevising +prevision +previsional +previsionary +previsioned +previsioning +previsit +previsitor +previsive +previsor +previsors +previze +prevocal +prevocalic +prevocalically +prevocally +prevocational +prevogue +prevoyance +prevoyant +prevoid +prevoidance +prevolitional +prevolunteer +prevomer +prevost +prevot +prevotal +prevote +prevoted +prevoting +prevue +prevued +prevues +prevuing +prewar +prewarm +prewarmed +prewarming +prewarms +prewarn +prewarned +prewarning +prewarns +prewarrant +prewash +prewashed +prewashes +prewashing +preweigh +prewelcome +prewelcomed +prewelcoming +prewelwired +prewelwiring +prewhip +prewhipped +prewhipping +prewilling +prewillingly +prewillingness +prewire +prewired +prewireless +prewiring +prewitness +prewonder +prewonderment +preworldly +preworldliness +preworship +preworthy +preworthily +preworthiness +prewound +prewrap +prewrapped +prewrapping +prewraps +prex +prexes +prexy +prexies +prezygapophysial +prezygapophysis +prezygomatic +prezonal +prezone +prf +pry +pria +priacanthid +priacanthidae +priacanthine +priacanthus +priam +priapean +priapi +priapic +priapism +priapismic +priapisms +priapitis +priapulacea +priapulid +priapulida +priapulidae +priapuloid +priapuloidea +priapulus +priapus +priapuses +priapusian +pribble +price +priceable +priceably +priced +pricefixing +pricey +priceite +priceless +pricelessly +pricelessness +pricemaker +pricer +pricers +prices +prich +pricy +pricier +priciest +pricing +prick +prickado +prickant +pricked +pricker +prickers +pricket +prickets +prickfoot +pricky +prickier +prickiest +pricking +prickingly +prickish +prickle +prickleback +prickled +pricklefish +prickles +prickless +prickly +pricklyback +pricklier +prickliest +prickliness +prickling +pricklingly +pricklouse +prickmadam +prickmedainty +prickproof +pricks +prickseam +prickshot +prickspur +pricktimber +prickwood +pride +prided +prideful +pridefully +pridefulness +prideless +pridelessly +prideling +prides +prideweed +pridy +pridian +priding +pridingly +prie +pried +priedieu +priedieus +priedieux +prier +pryer +priers +pryers +pries +priest +priestal +priestcap +priestcraft +priestdom +priested +priesteen +priestery +priestess +priestesses +priestfish +priestfishes +priesthood +priestianity +priesting +priestish +priestism +priestless +priestlet +priestly +priestlier +priestliest +priestlike +priestliness +priestling +priests +priestship +priestshire +prig +prigdom +prigged +prigger +priggery +priggeries +priggess +prigging +priggish +priggishly +priggishness +priggism +priggisms +prighood +prigman +prigs +prigster +prying +pryingly +pryingness +pryler +prill +prilled +prilling +prillion +prills +prim +prima +primacy +primacies +primacord +primaeval +primage +primages +primal +primality +primally +primaquine +primar +primary +primarian +primaried +primaries +primarily +primariness +primas +primatal +primate +primates +primateship +primatial +primatic +primatical +primatology +primatological +primatologist +primavera +primaveral +prime +primed +primegilt +primely +primeness +primer +primero +primerole +primeros +primers +primes +primeur +primeval +primevalism +primevally +primevarous +primeverin +primeverose +primevity +primevous +primevrin +primi +primy +primianist +primices +primigene +primigenial +primigenian +primigenious +primigenous +primigravida +primine +primines +priming +primings +primipara +primiparae +primiparas +primiparity +primiparous +primipilar +primity +primitiae +primitial +primitias +primitive +primitively +primitiveness +primitives +primitivism +primitivist +primitivistic +primitivity +primly +primmed +primmer +primmest +primming +primness +primnesses +primo +primogenetrix +primogenial +primogenital +primogenitary +primogenitive +primogenitor +primogenitors +primogeniture +primogenitureship +primogenous +primomo +primoprime +primoprimitive +primordality +primordia +primordial +primordialism +primordiality +primordially +primordiate +primordium +primos +primosity +primost +primp +primped +primping +primprint +primps +primrose +primrosed +primroses +primrosetide +primrosetime +primrosy +prims +primsie +primula +primulaceae +primulaceous +primulales +primulas +primulaverin +primulaveroside +primulic +primuline +primulinus +primus +primuses +primwort +prin +prince +princeage +princecraft +princedom +princedoms +princehood +princeite +princekin +princeless +princelet +princely +princelier +princeliest +princelike +princeliness +princeling +princelings +princeps +princes +princeship +princess +princessdom +princesse +princesses +princessly +princesslike +princeton +princewood +princicipia +princify +princified +principal +principality +principalities +principally +principalness +principals +principalship +principate +principe +principes +principi +principia +principial +principiant +principiate +principiation +principium +principle +principled +principles +principly +principling +principulus +princock +princocks +princod +princox +princoxes +prine +pringle +prink +prinked +prinker +prinkers +prinky +prinking +prinkle +prinks +prinos +print +printability +printable +printableness +printably +printanier +printed +printer +printerdom +printery +printeries +printerlike +printers +printing +printings +printless +printline +printmake +printmaker +printmaking +printout +printouts +prints +printscript +printshop +printworks +prio +priodon +priodont +priodontes +prion +prionid +prionidae +prioninae +prionine +prionodesmacea +prionodesmacean +prionodesmaceous +prionodesmatic +prionodon +prionodont +prionopinae +prionopine +prionops +prionus +prior +prioracy +prioral +priorate +priorates +prioress +prioresses +priori +priory +priories +prioristic +prioristically +priorite +priority +priorities +prioritize +prioritized +priorly +priors +priorship +pryproof +prys +prisable +prisage +prisal +priscan +priscian +priscianist +priscilla +priscillian +priscillianism +priscillianist +prise +pryse +prised +prisere +priseres +prises +prisiadka +prising +prism +prismal +prismatic +prismatical +prismatically +prismatization +prismatize +prismatoid +prismatoidal +prismed +prismy +prismoid +prismoidal +prismoids +prisms +prisometer +prison +prisonable +prisonbreak +prisondom +prisoned +prisoner +prisoners +prisonful +prisonhouse +prisoning +prisonlike +prisonment +prisonous +prisons +priss +prisses +prissy +prissier +prissies +prissiest +prissily +prissiness +pristane +pristanes +pristav +pristaw +pristine +pristinely +pristineness +pristipomatidae +pristipomidae +pristis +pristodus +prytaneum +prytany +prytanis +prytanize +pritch +pritchardia +pritchel +prithee +prythee +prittle +prius +priv +privacy +privacies +privacity +privado +privant +privata +privatdocent +privatdozent +private +privateer +privateered +privateering +privateers +privateersman +privately +privateness +privater +privates +privatest +privation +privations +privatism +privatistic +privative +privatively +privativeness +privatization +privatize +privatized +privatizing +privatum +privet +privets +privy +privier +privies +priviest +priviledge +privilege +privileged +privileger +privileges +privileging +privily +priviness +privity +privities +prix +prizable +prize +prizeable +prized +prizefight +prizefighter +prizefighters +prizefighting +prizefights +prizeholder +prizeman +prizemen +prizer +prizery +prizers +prizes +prizetaker +prizewinner +prizewinners +prizewinning +prizeworthy +prizing +prlate +prn +pro +proa +proabolition +proabolitionist +proabortion +proabsolutism +proabsolutist +proabstinence +proacademic +proaccelerin +proacceptance +proach +proacquisition +proacquittal +proacting +proaction +proactive +proactor +proaddition +proadjournment +proadministration +proadmission +proadoption +proadvertising +proadvertizing +proaeresis +proaesthetic +proaggressionist +proagitation +proagon +proagones +proagrarian +proagreement +proagricultural +proagule +proairesis +proairplane +proal +proalcoholism +proalien +proalliance +proallotment +proalteration +proamateur +proambient +proamendment +proamnion +proamniotic +proamusement +proanaphora +proanaphoral +proanarchy +proanarchic +proanarchism +proangiosperm +proangiospermic +proangiospermous +proanimistic +proannexation +proannexationist +proantarctic +proanthropos +proapostolic +proappointment +proapportionment +proappreciation +proappropriation +proapproval +proaquatic +proarbitration +proarbitrationist +proarchery +proarctic +proaristocracy +proaristocratic +proarmy +proart +proarthri +proas +proassessment +proassociation +proatheism +proatheist +proatheistic +proathletic +proatlas +proattack +proattendance +proauction +proaudience +proaulion +proauthor +proauthority +proautomation +proautomobile +proavian +proaviation +proavis +proaward +prob +probabiliorism +probabiliorist +probabilism +probabilist +probabilistic +probabilistically +probability +probabilities +probabilize +probabl +probable +probableness +probably +probachelor +probal +proballoon +proband +probandi +probands +probang +probangs +probanishment +probankruptcy +probant +probargaining +probaseball +probasketball +probata +probate +probated +probates +probathing +probatical +probating +probation +probational +probationally +probationary +probationer +probationerhood +probationers +probationership +probationism +probationist +probations +probationship +probative +probatively +probator +probatory +probattle +probattleship +probatum +probe +probeable +probed +probeer +probenecid +prober +probers +probes +probetting +probing +probings +probiology +probit +probity +probities +probits +probituminous +problem +problematic +problematical +problematically +problematicness +problematist +problematize +problemdom +problemist +problemistic +problemize +problems +problemwise +problockade +proboycott +probonding +probonus +proborrowing +proboscidal +proboscidate +proboscidea +proboscidean +proboscideous +proboscides +proboscidial +proboscidian +proboscidiferous +proboscidiform +probosciform +probosciformed +probosciger +proboscis +proboscises +proboscislike +probouleutic +proboulevard +probowling +proboxing +probrick +probridge +probroadcasting +probudget +probudgeting +probuying +probuilding +probusiness +proc +procaccia +procaccio +procacious +procaciously +procacity +procaine +procaines +procambial +procambium +procanal +procancellation +procapital +procapitalism +procapitalist +procapitalists +procarbazine +procaryote +procaryotic +procarnival +procarp +procarpium +procarps +procarrier +procatalectic +procatalepsis +procatarctic +procatarxis +procathedral +procathedrals +procavia +procaviidae +procbal +procedendo +procedes +procedural +procedurally +procedurals +procedure +procedured +procedures +proceduring +proceed +proceeded +proceeder +proceeders +proceeding +proceedings +proceeds +proceleusmatic +procellaria +procellarian +procellarid +procellariidae +procellariiformes +procellariine +procellas +procello +procellose +procellous +procensorship +procensure +procentralization +procephalic +procercoid +procere +procereal +procerebral +procerebrum +proceremonial +proceremonialism +proceremonialist +proceres +procerite +procerity +proceritic +procerus +process +processability +processable +processal +processed +processer +processes +processibility +processible +processing +procession +processional +processionalist +processionally +processionals +processionary +processioner +processioning +processionist +processionize +processions +processionwise +processive +processor +processors +processual +processus +prochain +procharity +prochein +prochemical +prochlorite +prochondral +prochooi +prochoos +prochordal +prochorion +prochorionic +prochromosome +prochronic +prochronism +prochronistic +prochronize +prochurch +prochurchian +procidence +procident +procidentia +procinct +procyon +procyonidae +procyoniform +procyoniformia +procyoninae +procyonine +procity +procivic +procivilian +procivism +proclaim +proclaimable +proclaimant +proclaimed +proclaimer +proclaimers +proclaiming +proclaimingly +proclaims +proclamation +proclamations +proclamator +proclamatory +proclassic +proclassical +proclei +proclergy +proclerical +proclericalism +proclimax +procline +proclisis +proclitic +proclive +proclivity +proclivities +proclivitous +proclivous +proclivousness +procne +procnemial +procoelia +procoelian +procoelous +procoercion +procoercive +procollectivism +procollectivist +procollectivistic +procollegiate +procolonial +procombat +procombination +procomedy +procommemoration +procomment +procommercial +procommission +procommittee +procommunal +procommunism +procommunist +procommunists +procommunity +procommutation +procompensation +procompetition +procomprise +procompromise +procompulsion +proconcentration +proconcession +proconciliation +procondemnation +proconfederationist +proconference +proconfession +proconfessionist +proconfiscation +proconformity +proconnesian +proconquest +proconscription +proconscriptive +proconservation +proconservationist +proconsolidation +proconstitutional +proconstitutionalism +proconsul +proconsular +proconsulary +proconsularly +proconsulate +proconsulates +proconsuls +proconsulship +proconsulships +proconsultation +procontinuation +proconvention +proconventional +proconviction +procoracoid +procoracoidal +procorporation +procosmetic +procosmopolitan +procotols +procotton +procourt +procrastinate +procrastinated +procrastinates +procrastinating +procrastinatingly +procrastination +procrastinative +procrastinatively +procrastinativeness +procrastinator +procrastinatory +procrastinators +procreant +procreate +procreated +procreates +procreating +procreation +procreative +procreativeness +procreativity +procreator +procreatory +procreators +procreatress +procreatrix +procremation +procrypsis +procryptic +procryptically +procris +procritic +procritique +procrustean +procrusteanism +procrusteanize +procrustes +proctal +proctalgy +proctalgia +proctatresy +proctatresia +proctectasia +proctectomy +procteurynter +proctitis +proctocele +proctocystoplasty +proctocystotomy +proctoclysis +proctocolitis +proctocolonoscopy +proctodaea +proctodaeal +proctodaedaea +proctodaeum +proctodaeums +proctodea +proctodeal +proctodeudea +proctodeum +proctodeums +proctodynia +proctoelytroplastic +proctology +proctologic +proctological +proctologies +proctologist +proctologists +proctoparalysis +proctoplasty +proctoplastic +proctoplegia +proctopolypus +proctoptoma +proctoptosis +proctor +proctorage +proctoral +proctored +proctorial +proctorially +proctorical +proctoring +proctorization +proctorize +proctorling +proctorrhagia +proctorrhaphy +proctorrhea +proctors +proctorship +proctoscope +proctoscopes +proctoscopy +proctoscopic +proctoscopically +proctoscopies +proctosigmoidectomy +proctosigmoiditis +proctospasm +proctostenosis +proctostomy +proctotome +proctotomy +proctotresia +proctotrypid +proctotrypidae +proctotrypoid +proctotrypoidea +proctovalvotomy +proculcate +proculcation +proculian +procumbent +procurability +procurable +procurableness +procuracy +procuracies +procural +procurals +procurance +procurate +procuration +procurative +procurator +procuratorate +procuratory +procuratorial +procurators +procuratorship +procuratrix +procure +procured +procurement +procurements +procurer +procurers +procures +procuress +procuresses +procureur +procuring +procurrent +procursive +procurvation +procurved +proczarist +prod +prodatary +prodd +prodded +prodder +prodders +prodding +proddle +prodecoration +prodefault +prodefiance +prodelay +prodelision +prodemocracy +prodemocrat +prodemocratic +prodenia +prodenominational +prodentine +prodeportation +prodespotic +prodespotism +prodialogue +prodigal +prodigalish +prodigalism +prodigality +prodigalize +prodigally +prodigals +prodigy +prodigies +prodigiosity +prodigious +prodigiously +prodigiousness +prodigus +prodisarmament +prodisplay +prodissoconch +prodissolution +prodistribution +prodition +proditor +proditorious +proditoriously +prodivision +prodivorce +prodomoi +prodomos +prodproof +prodramatic +prodroma +prodromal +prodromata +prodromatic +prodromatically +prodrome +prodromes +prodromic +prodromous +prodromus +prods +producal +produce +produceable +produceableness +produced +producement +producent +producer +producers +producership +produces +producibility +producible +producibleness +producing +product +producted +productibility +productible +productid +productidae +productile +production +productional +productionist +productions +productive +productively +productiveness +productivity +productoid +productor +productory +productress +products +productus +proecclesiastical +proeconomy +proeducation +proeducational +proegumenal +proelectric +proelectrical +proelectrification +proelectrocution +proelimination +proem +proembryo +proembryonic +proemial +proemium +proempire +proempiricism +proempiricist +proemployee +proemployer +proemployment +proemptosis +proems +proenforcement +proenlargement +proenzym +proenzyme +proepimeron +proepiscopist +proepisternum +proequality +proestrus +proethical +proethnic +proethnically +proetid +proetidae +proette +proettes +proetus +proevolution +proevolutionary +proevolutionist +proexamination +proexecutive +proexemption +proexercise +proexperiment +proexperimentation +proexpert +proexporting +proexposure +proextension +proextravagance +prof +proface +profaculty +profanable +profanableness +profanably +profanation +profanations +profanatory +profanchise +profane +profaned +profanely +profanement +profaneness +profaner +profaners +profanes +profaning +profanism +profanity +profanities +profanize +profarmer +profascism +profascist +profascists +profection +profectional +profectitious +profederation +profeminism +profeminist +profeminists +profer +proferment +profert +profess +professable +professed +professedly +professes +professing +profession +professional +professionalisation +professionalise +professionalised +professionalising +professionalism +professionalist +professionalists +professionality +professionalization +professionalize +professionalized +professionalizing +professionally +professionals +professionist +professionize +professionless +professions +professive +professively +professor +professorate +professordom +professoress +professorhood +professory +professorial +professorialism +professorially +professoriat +professoriate +professorlike +professorling +professors +professorship +professorships +proffer +proffered +profferer +profferers +proffering +proffers +profichi +proficience +proficiency +proficiencies +proficient +proficiently +proficientness +profiction +proficuous +proficuously +profile +profiled +profiler +profilers +profiles +profiling +profilist +profilograph +profit +profitability +profitable +profitableness +profitably +profited +profiteer +profiteered +profiteering +profiteers +profiter +profiterole +profiters +profiting +profitless +profitlessly +profitlessness +profitmonger +profitmongering +profitproof +profits +profitsharing +profitted +profitter +profitters +proflated +proflavine +profligacy +profligacies +profligate +profligated +profligately +profligateness +profligates +profligation +proflogger +profluence +profluent +profluvious +profluvium +profonde +proforeign +proforma +profound +profounder +profoundest +profoundly +profoundness +profounds +profraternity +profre +profs +profugate +profulgent +profunda +profundae +profundity +profundities +profuse +profusely +profuseness +profuser +profusion +profusive +profusively +profusiveness +prog +progambling +progamete +progamic +proganosaur +proganosauria +progenerate +progeneration +progenerative +progeny +progenies +progenital +progenity +progenitive +progenitiveness +progenitor +progenitorial +progenitors +progenitorship +progenitress +progenitrix +progeniture +progeotropic +progeotropism +progeria +progermination +progestational +progesterone +progestin +progestogen +progged +progger +proggers +progging +progymnasium +progymnosperm +progymnospermic +progymnospermous +progypsy +proglottic +proglottid +proglottidean +proglottides +proglottis +prognathi +prognathy +prognathic +prognathism +prognathous +progne +prognose +prognosed +prognoses +prognosing +prognosis +prognostic +prognosticable +prognostical +prognostically +prognosticate +prognosticated +prognosticates +prognosticating +prognostication +prognostications +prognosticative +prognosticator +prognosticatory +prognosticators +prognostics +progoneate +progospel +progovernment +prograde +program +programable +programatic +programed +programer +programers +programing +programist +programistic +programma +programmability +programmable +programmar +programmata +programmatic +programmatically +programmatist +programme +programmed +programmer +programmers +programmes +programming +programmist +programmng +programs +progravid +progrede +progrediency +progredient +progress +progressed +progresser +progresses +progressing +progression +progressional +progressionally +progressionary +progressionism +progressionist +progressions +progressism +progressist +progressive +progressively +progressiveness +progressives +progressivism +progressivist +progressivistic +progressivity +progressor +progs +proguardian +prohaste +proheim +prohibit +prohibita +prohibited +prohibiter +prohibiting +prohibition +prohibitionary +prohibitionism +prohibitionist +prohibitionists +prohibitions +prohibitive +prohibitively +prohibitiveness +prohibitor +prohibitory +prohibitorily +prohibits +prohibitum +prohydrotropic +prohydrotropism +proholiday +prohostility +prohuman +prohumanistic +proidealistic +proimmigration +proimmunity +proinclusion +proincrease +proindemnity +proindustry +proindustrial +proindustrialisation +proindustrialization +proinjunction +proinnovationist +proinquiry +proinsurance +prointegration +prointervention +proinvestment +proirrigation +projacient +project +projectable +projected +projectedly +projectile +projectiles +projecting +projectingly +projection +projectional +projectionist +projectionists +projections +projective +projectively +projectivity +projector +projectors +projectress +projectrix +projects +projecture +projet +projets +projicience +projicient +projiciently +projournalistic +projudicial +prokaryote +proke +prokeimenon +proker +prokindergarten +proklausis +prolabium +prolabor +prolacrosse +prolactin +prolamin +prolamine +prolamins +prolan +prolans +prolapse +prolapsed +prolapses +prolapsing +prolapsion +prolapsus +prolarva +prolarval +prolate +prolately +prolateness +prolation +prolative +prolatively +prole +proleague +proleaguer +prolectite +proleg +prolegate +prolegislative +prolegomena +prolegomenal +prolegomenary +prolegomenist +prolegomenon +prolegomenona +prolegomenous +prolegs +proleniency +prolepses +prolepsis +proleptic +proleptical +proleptically +proleptics +proles +proletaire +proletairism +proletary +proletarian +proletarianise +proletarianised +proletarianising +proletarianism +proletarianization +proletarianize +proletarianly +proletarianness +proletarians +proletariat +proletariate +proletariatism +proletaries +proletarise +proletarised +proletarising +proletarization +proletarize +proletarized +proletarizing +proletcult +proletkult +proleucocyte +proleukocyte +prolia +prolicense +prolicidal +prolicide +proliferant +proliferate +proliferated +proliferates +proliferating +proliferation +proliferations +proliferative +proliferous +proliferously +prolify +prolific +prolificacy +prolifical +prolifically +prolificalness +prolificate +prolificated +prolificating +prolification +prolificy +prolificity +prolificly +prolificness +proligerous +prolyl +prolin +proline +prolines +proliquor +proliterary +proliturgical +proliturgist +prolix +prolixious +prolixity +prolixly +prolixness +proller +prolocution +prolocutor +prolocutorship +prolocutress +prolocutrix +prolog +prologed +prologi +prologing +prologise +prologised +prologising +prologist +prologize +prologized +prologizer +prologizing +prologlike +prologos +prologs +prologue +prologued +prologuelike +prologuer +prologues +prologuing +prologuise +prologuised +prologuiser +prologuising +prologuist +prologuize +prologuized +prologuizer +prologuizing +prologulogi +prologus +prolong +prolongable +prolongableness +prolongably +prolongate +prolongated +prolongating +prolongation +prolongations +prolonge +prolonged +prolonger +prolonges +prolonging +prolongment +prolongs +prolotherapy +prolusion +prolusionize +prolusory +prom +promachinery +promachos +promagisterial +promagistracy +promagistrate +promajority +promammal +promammalia +promammalian +promarriage +promatrimonial +promatrimonialist +promaximum +promazine +promemorial +promenade +promenaded +promenader +promenaderess +promenaders +promenades +promenading +promercantile +promercy +promerger +promeristem +promerit +promeritor +promerops +prometacenter +promethazine +promethea +promethean +prometheus +promethium +promic +promycelia +promycelial +promycelium +promilitary +promilitarism +promilitarist +prominence +prominences +prominency +prominent +prominently +prominimum +proministry +prominority +promisable +promiscuity +promiscuities +promiscuous +promiscuously +promiscuousness +promise +promised +promisee +promisees +promiseful +promiseless +promisemonger +promiseproof +promiser +promisers +promises +promising +promisingly +promisingness +promisor +promisors +promiss +promissionary +promissive +promissor +promissory +promissorily +promissvry +promit +promythic +promitosis +promittor +promnesia +promo +promoderation +promoderationist +promodern +promodernist +promodernistic +promonarchy +promonarchic +promonarchical +promonarchicalness +promonarchist +promonarchists +promonopoly +promonopolist +promonopolistic +promontory +promontoried +promontories +promoral +promorph +promorphology +promorphological +promorphologically +promorphologist +promotability +promotable +promote +promoted +promotement +promoter +promoters +promotes +promoting +promotion +promotional +promotions +promotive +promotiveness +promotor +promotorial +promotress +promotrix +promovable +promoval +promove +promovent +prompt +promptbook +promptbooks +prompted +prompter +prompters +promptest +prompting +promptings +promptitude +promptive +promptly +promptness +promptorium +promptress +prompts +promptuary +prompture +proms +promulgate +promulgated +promulgates +promulgating +promulgation +promulgations +promulgator +promulgatory +promulgators +promulge +promulged +promulger +promulges +promulging +promuscidate +promuscis +pron +pronaoi +pronaos +pronate +pronated +pronates +pronating +pronation +pronational +pronationalism +pronationalist +pronationalistic +pronative +pronatoflexor +pronator +pronatores +pronators +pronaval +pronavy +prone +pronegotiation +pronegro +pronegroism +pronely +proneness +pronephric +pronephridiostome +pronephron +pronephros +proneur +prong +prongbuck +pronged +pronger +pronghorn +pronghorns +prongy +pronging +pronglike +prongs +pronic +pronymph +pronymphal +pronity +pronograde +pronomial +pronominal +pronominalize +pronominally +pronomination +prononce +pronota +pronotal +pronotum +pronoun +pronounal +pronounce +pronounceable +pronounceableness +pronounced +pronouncedly +pronouncedness +pronouncement +pronouncements +pronounceness +pronouncer +pronounces +pronouncing +pronouns +pronpl +pronto +pronuba +pronubial +pronuclear +pronuclei +pronucleus +pronumber +pronunciability +pronunciable +pronuncial +pronunciamento +pronunciamentos +pronunciation +pronunciational +pronunciations +pronunciative +pronunciator +pronunciatory +proo +proode +prooemiac +prooemion +prooemium +proof +proofed +proofer +proofers +proofful +proofy +proofing +proofless +prooflessly +prooflike +proofness +proofread +proofreader +proofreaders +proofreading +proofreads +proofroom +proofs +prop +propacifism +propacifist +propadiene +propaedeutic +propaedeutical +propaedeutics +propagability +propagable +propagableness +propagand +propaganda +propagandic +propagandise +propagandised +propagandising +propagandism +propagandist +propagandistic +propagandistically +propagandists +propagandize +propagandized +propagandizes +propagandizing +propagate +propagated +propagates +propagating +propagation +propagational +propagations +propagative +propagator +propagatory +propagators +propagatress +propagines +propago +propagula +propagule +propagulla +propagulum +propayment +propale +propalinal +propane +propanedicarboxylic +propanedioic +propanediol +propanes +propanol +propanone +propapist +proparasceve +proparent +propargyl +propargylic +proparia +proparian +proparliamental +proparoxytone +proparoxytonic +proparticipation +propassion +propatagial +propatagian +propatagium +propatriotic +propatriotism +propatronage +propel +propellable +propellant +propellants +propelled +propellent +propeller +propellers +propelling +propellor +propelment +propels +propend +propended +propendent +propending +propends +propene +propenes +propenyl +propenylic +propenoic +propenol +propenols +propense +propensely +propenseness +propension +propensity +propensities +propensitude +proper +properdin +properer +properest +properispome +properispomenon +properitoneal +properly +properness +propers +property +propertied +properties +propertyless +propertyship +propessimism +propessimist +prophage +prophages +prophase +prophases +prophasic +prophasis +prophecy +prophecies +prophecymonger +prophesy +prophesiable +prophesied +prophesier +prophesiers +prophesies +prophesying +prophet +prophetess +prophetesses +prophethood +prophetic +prophetical +propheticality +prophetically +propheticalness +propheticism +propheticly +prophetism +prophetize +prophetless +prophetlike +prophetry +prophets +prophetship +prophylactic +prophylactical +prophylactically +prophylactics +prophylactodontia +prophylactodontist +prophylaxes +prophylaxy +prophylaxis +prophyll +prophyllum +prophilosophical +prophloem +prophoric +prophototropic +prophototropism +propygidium +propyl +propyla +propylacetic +propylaea +propylaeum +propylalaea +propylamine +propylation +propylene +propylhexedrine +propylic +propylidene +propylite +propylitic +propylitization +propylon +propyls +propination +propine +propyne +propined +propines +propining +propinoic +propynoic +propinquant +propinque +propinquitatis +propinquity +propinquous +propio +propiolaldehyde +propiolate +propiolic +propionaldehyde +propionate +propione +propionibacteria +propionibacterieae +propionibacterium +propionic +propionyl +propionitril +propionitrile +propithecus +propitiable +propitial +propitiate +propitiated +propitiates +propitiating +propitiatingly +propitiation +propitiative +propitiator +propitiatory +propitiatorily +propitious +propitiously +propitiousness +propjet +propjets +proplasm +proplasma +proplastic +proplastid +propless +propleural +propleuron +proplex +proplexus +propliopithecus +propman +propmen +propmistress +propmistresses +propodeal +propodeon +propodeum +propodial +propodiale +propodite +propoditic +propodium +propoganda +propolis +propolises +propolitical +propolitics +propolization +propolize +propoma +propomata +propone +proponed +proponement +proponent +proponents +proponer +propones +proponing +propons +propontic +propontis +propooling +propopery +proport +proportion +proportionability +proportionable +proportionableness +proportionably +proportional +proportionalism +proportionality +proportionally +proportionate +proportionated +proportionately +proportionateness +proportionating +proportioned +proportioner +proportioning +proportionless +proportionment +proportions +propos +proposable +proposal +proposals +proposant +propose +proposed +proposedly +proposer +proposers +proposes +proposing +propositi +propositio +proposition +propositional +propositionally +propositioned +propositioning +propositionize +propositions +propositus +propositusti +proposterously +propound +propounded +propounder +propounders +propounding +propoundment +propounds +propoxy +propoxyphene +proppage +propped +propper +propping +propr +propraetor +propraetorial +propraetorian +propranolol +proprecedent +propretor +propretorial +propretorian +propria +propriation +propriatory +proprietage +proprietary +proprietarian +proprietariat +proprietaries +proprietarily +proprietatis +propriety +proprieties +proprietor +proprietory +proprietorial +proprietorially +proprietors +proprietorship +proprietorships +proprietous +proprietress +proprietresses +proprietrix +proprioception +proprioceptive +proprioceptor +propriospinal +proprium +proprivilege +proproctor +proprofit +proprovincial +proprovost +props +propter +propterygial +propterygium +proptosed +proptoses +proptosis +propublication +propublicity +propugn +propugnacled +propugnaculum +propugnation +propugnator +propugner +propulsation +propulsatory +propulse +propulsion +propulsions +propulsity +propulsive +propulsor +propulsory +propunishment +propupa +propupal +propurchase +propus +propwood +proquaestor +proracing +prorailroad +prorata +proratable +prorate +prorated +prorater +prorates +prorating +proration +prore +proreader +prorealism +prorealist +prorealistic +proreality +prorean +prorebate +prorebel +prorecall +proreciprocation +prorecognition +proreconciliation +prorector +prorectorate +proredemption +proreduction +proreferendum +proreform +proreformist +prorefugee +proregent +prorelease +proreptilia +proreptilian +proreption +prorepublican +proresearch +proreservationist +proresignation +prorestoration +prorestriction +prorevision +prorevisionist +prorevolution +prorevolutionary +prorevolutionist +prorex +prorhinal +prorhipidoglossomorpha +proritual +proritualistic +prorogate +prorogation +prorogations +prorogator +prorogue +prorogued +proroguer +prorogues +proroguing +proroyal +proroyalty +proromance +proromantic +proromanticism +prorrhesis +prorsa +prorsad +prorsal +prorump +proruption +pros +prosabbath +prosabbatical +prosacral +prosaic +prosaical +prosaically +prosaicalness +prosaicism +prosaicness +prosaism +prosaisms +prosaist +prosaists +prosal +prosapy +prosar +prosarthri +prosateur +proscapula +proscapular +proscenia +proscenium +prosceniums +proscholastic +proscholasticism +proscholium +proschool +proscience +proscientific +proscind +proscynemata +prosciutto +proscolecine +proscolex +proscolices +proscribable +proscribe +proscribed +proscriber +proscribes +proscribing +proscript +proscription +proscriptional +proscriptionist +proscriptions +proscriptive +proscriptively +proscriptiveness +proscutellar +proscutellum +prose +prosecrecy +prosecretin +prosect +prosected +prosecting +prosection +prosector +prosectorial +prosectorium +prosectorship +prosects +prosecutable +prosecute +prosecuted +prosecutes +prosecuting +prosecution +prosecutions +prosecutive +prosecutor +prosecutory +prosecutorial +prosecutors +prosecutrices +prosecutrix +prosecutrixes +prosed +proseity +proselenic +prosely +proselike +proselyte +proselyted +proselyter +proselytes +proselytical +proselyting +proselytingly +proselytisation +proselytise +proselytised +proselytiser +proselytising +proselytism +proselytist +proselytistic +proselytization +proselytize +proselytized +proselytizer +proselytizers +proselytizes +proselytizing +proseman +proseminar +proseminary +proseminate +prosemination +prosencephalic +prosencephalon +prosenchyma +prosenchymas +prosenchymata +prosenchymatous +proseneschal +prosequendum +prosequi +prosequitur +proser +proserpina +proserpinaca +prosers +proses +prosethmoid +proseucha +proseuche +prosy +prosier +prosiest +prosify +prosification +prosifier +prosily +prosiliency +prosilient +prosiliently +prosyllogism +prosilverite +prosimiae +prosimian +prosyndicalism +prosyndicalist +prosiness +prosing +prosingly +prosiphon +prosiphonal +prosiphonate +prosish +prosist +prosit +proskomide +proslambanomenos +proslave +proslaver +proslavery +proslaveryism +proslyted +proslyting +prosneusis +proso +prosobranch +prosobranchia +prosobranchiata +prosobranchiate +prosocele +prosocoele +prosodal +prosode +prosodemic +prosodetic +prosody +prosodiac +prosodiacal +prosodiacally +prosodial +prosodially +prosodian +prosodic +prosodical +prosodically +prosodics +prosodies +prosodion +prosodist +prosodus +prosogaster +prosogyrate +prosogyrous +prosoma +prosomal +prosomas +prosomatic +prosonomasia +prosopalgia +prosopalgic +prosopantritis +prosopectasia +prosophist +prosopic +prosopically +prosopyl +prosopyle +prosopis +prosopite +prosopium +prosoplasia +prosopography +prosopographical +prosopolepsy +prosopon +prosoponeuralgia +prosopoplegia +prosopoplegic +prosopopoeia +prosopopoeial +prosoposchisis +prosopospasm +prosopotocia +prosorus +prosos +prospect +prospected +prospecting +prospection +prospections +prospective +prospectively +prospectiveness +prospectives +prospectless +prospector +prospectors +prospects +prospectus +prospectuses +prospectusless +prospeculation +prosper +prosperation +prospered +prosperer +prospering +prosperity +prosperities +prospero +prosperous +prosperously +prosperousness +prospers +prosphysis +prosphora +prosphoron +prospice +prospicience +prosporangium +prosport +pross +prosser +prossy +prosstoa +prost +prostades +prostaglandin +prostas +prostasis +prostatauxe +prostate +prostatectomy +prostatectomies +prostatelcosis +prostates +prostatic +prostaticovesical +prostatism +prostatitic +prostatitis +prostatocystitis +prostatocystotomy +prostatodynia +prostatolith +prostatomegaly +prostatometer +prostatomyomectomy +prostatorrhea +prostatorrhoea +prostatotomy +prostatovesical +prostatovesiculectomy +prostatovesiculitis +prostemmate +prostemmatic +prostern +prosterna +prosternal +prosternate +prosternum +prosternums +prostheca +prosthenic +prostheses +prosthesis +prosthetic +prosthetically +prosthetics +prosthetist +prosthion +prosthionic +prosthodontia +prosthodontic +prosthodontics +prosthodontist +prostigmin +prostyle +prostyles +prostylos +prostitute +prostituted +prostitutely +prostitutes +prostituting +prostitution +prostitutor +prostoa +prostomia +prostomial +prostomiate +prostomium +prostomiumia +prostoon +prostrate +prostrated +prostrates +prostrating +prostration +prostrations +prostrative +prostrator +prostrike +prosubmission +prosubscription +prosubstantive +prosubstitution +prosuffrage +prosupervision +prosupport +prosurgical +prosurrender +protactic +protactinium +protagon +protagonism +protagonist +protagonists +protagorean +protagoreanism +protalbumose +protamin +protamine +protamins +protandry +protandric +protandrism +protandrous +protandrously +protanomal +protanomaly +protanomalous +protanope +protanopia +protanopic +protargentum +protargin +protargol +protariff +protarsal +protarsus +protases +protasis +protaspis +protatic +protatically +protax +protaxation +protaxial +protaxis +prote +protea +proteaceae +proteaceous +protead +protean +proteanly +proteanwise +proteas +protease +proteases +protechnical +protect +protectable +protectant +protected +protectee +protectible +protecting +protectingly +protectinglyrmal +protectingness +protection +protectional +protectionate +protectionism +protectionist +protectionists +protectionize +protections +protectionship +protective +protectively +protectiveness +protectograph +protector +protectoral +protectorate +protectorates +protectory +protectorial +protectorian +protectories +protectorless +protectors +protectorship +protectress +protectresses +protectrix +protects +protege +protegee +protegees +proteges +protegulum +protei +proteic +proteid +proteida +proteidae +proteide +proteidean +proteides +proteidogenous +proteids +proteiform +protein +proteinaceous +proteinase +proteinate +proteinic +proteinochromogen +proteinous +proteinphobia +proteins +proteinuria +proteinuric +proteles +protelidae +protelytroptera +protelytropteran +protelytropteron +protelytropterous +protemperance +protempirical +protemporaneous +protend +protended +protending +protends +protense +protension +protensity +protensive +protensively +proteoclastic +proteogenous +proteolipide +proteolysis +proteolytic +proteopectic +proteopexy +proteopexic +proteopexis +proteosaurid +proteosauridae +proteosaurus +proteose +proteoses +proteosoma +proteosomal +proteosome +proteosuria +protephemeroid +protephemeroidea +proterandry +proterandric +proterandrous +proterandrously +proterandrousness +proteranthy +proteranthous +proterobase +proterogyny +proterogynous +proteroglyph +proteroglypha +proteroglyphic +proteroglyphous +proterothesis +proterotype +proterozoic +proterve +protervity +protest +protestable +protestancy +protestant +protestantish +protestantishly +protestantism +protestantize +protestantly +protestantlike +protestants +protestation +protestations +protestator +protestatory +protested +protester +protesters +protesting +protestingly +protestive +protestor +protestors +protests +protetrarch +proteus +protevangel +protevangelion +protevangelium +protext +prothalamia +prothalamion +prothalamium +prothalamiumia +prothalli +prothallia +prothallial +prothallic +prothalline +prothallium +prothalloid +prothallus +protheatrical +protheca +protheses +prothesis +prothetely +prothetelic +prothetic +prothetical +prothetically +prothyl +prothysteron +prothmia +prothonotary +prothonotarial +prothonotariat +prothonotaries +prothonotaryship +prothoraces +prothoracic +prothorax +prothoraxes +prothrift +prothrombin +prothrombogen +protid +protide +protyl +protyle +protyles +protylopus +protyls +protiodide +protype +protist +protista +protistan +protistic +protistology +protistological +protistologist +protiston +protists +protium +protiums +proto +protoactinium +protoalbumose +protoamphibian +protoanthropic +protoapostate +protoarchitect +protoascales +protoascomycetes +protobacco +protobasidii +protobasidiomycetes +protobasidiomycetous +protobasidium +protobishop +protoblast +protoblastic +protoblattoid +protoblattoidea +protobranchia +protobranchiata +protobranchiate +protocalcium +protocanonical +protocaris +protocaseose +protocatechualdehyde +protocatechuic +protoceras +protoceratidae +protoceratops +protocercal +protocerebral +protocerebrum +protochemist +protochemistry +protochloride +protochlorophyll +protochorda +protochordata +protochordate +protochromium +protochronicler +protocitizen +protoclastic +protocneme +protococcaceae +protococcaceous +protococcal +protococcales +protococcoid +protococcus +protocol +protocolar +protocolary +protocoled +protocoleoptera +protocoleopteran +protocoleopteron +protocoleopterous +protocoling +protocolist +protocolization +protocolize +protocolled +protocolling +protocols +protoconch +protoconchal +protocone +protoconid +protoconule +protoconulid +protocopper +protocorm +protodeacon +protoderm +protodermal +protodevil +protodynastic +protodonata +protodonatan +protodonate +protodont +protodonta +protodramatic +protoelastose +protoepiphyte +protoforaminifer +protoforester +protogalaxy +protogaster +protogelatose +protogenal +protogenes +protogenesis +protogenetic +protogenic +protogenist +protogeometric +protogine +protogyny +protogynous +protoglobulose +protogod +protogonous +protogospel +protograph +protohematoblast +protohemiptera +protohemipteran +protohemipteron +protohemipterous +protoheresiarch +protohydra +protohydrogen +protohymenoptera +protohymenopteran +protohymenopteron +protohymenopterous +protohippus +protohistory +protohistorian +protohistoric +protohomo +protohuman +protoypes +protoiron +protolanguage +protoleration +protoleucocyte +protoleukocyte +protolithic +protoliturgic +protolog +protologist +protoloph +protoma +protomagister +protomagnate +protomagnesium +protomala +protomalal +protomalar +protomammal +protomammalian +protomanganese +protomartyr +protomastigida +protome +protomeristem +protomerite +protomeritic +protometal +protometallic +protometals +protometaphrast +protomycetales +protominobacter +protomyosinose +protomonadina +protomonostelic +protomorph +protomorphic +proton +protonate +protonated +protonation +protone +protonegroid +protonema +protonemal +protonemata +protonematal +protonematoid +protoneme +protonemertini +protonephridial +protonephridium +protonephros +protoneuron +protoneurone +protoneutron +protonic +protonickel +protonym +protonymph +protonymphal +protonitrate +protonotary +protonotater +protonotion +protonotions +protons +protopapas +protopappas +protoparent +protopathy +protopathia +protopathic +protopatriarchal +protopatrician +protopattern +protopectin +protopectinase +protopepsia +protoperlaria +protoperlarian +protophyll +protophilosophic +protophyta +protophyte +protophytic +protophloem +protopin +protopine +protopyramid +protoplanet +protoplasm +protoplasma +protoplasmal +protoplasmatic +protoplasmic +protoplast +protoplastic +protopod +protopodial +protopodite +protopoditic +protopods +protopoetic +protopope +protoporphyrin +protopragmatic +protopresbyter +protopresbytery +protoprism +protoproteose +protoprotestant +protopteran +protopteridae +protopteridophyte +protopterous +protopterus +protore +protorebel +protoreligious +protoreptilian +protorohippus +protorosaur +protorosauria +protorosaurian +protorosauridae +protorosauroid +protorosaurus +protorthoptera +protorthopteran +protorthopteron +protorthopterous +protosalt +protosaurian +protoscientific +protoselachii +protosilicate +protosilicon +protosinner +protosyntonose +protosiphon +protosiphonaceae +protosiphonaceous +protosocial +protosolution +protospasm +protosphargis +protospondyli +protospore +protostar +protostega +protostegidae +protostele +protostelic +protostome +protostrontium +protosulphate +protosulphide +prototaxites +prototheca +protothecal +prototheme +protothere +prototheria +prototherian +prototypal +prototype +prototyped +prototypes +prototypic +prototypical +prototypically +prototyping +prototypographer +prototyrant +prototitanium +prototracheata +prototraitor +prototroch +prototrochal +prototroph +prototrophy +prototrophic +protovanadium +protoveratrine +protovertebra +protovertebral +protovestiary +protovillain +protovum +protoxid +protoxide +protoxidize +protoxidized +protoxids +protoxylem +protozoa +protozoacidal +protozoacide +protozoal +protozoan +protozoans +protozoea +protozoean +protozoiasis +protozoic +protozoology +protozoological +protozoologist +protozoon +protozoonal +protozzoa +protracheata +protracheate +protract +protracted +protractedly +protractedness +protracter +protractible +protractile +protractility +protracting +protraction +protractive +protractor +protractors +protracts +protrade +protradition +protraditional +protragedy +protragical +protragie +protransfer +protranslation +protransubstantiation +protravel +protreasurer +protreaty +protremata +protreptic +protreptical +protriaene +protropical +protrudable +protrude +protruded +protrudent +protrudes +protruding +protrusible +protrusile +protrusility +protrusion +protrusions +protrusive +protrusively +protrusiveness +protthalli +protuberance +protuberances +protuberancy +protuberancies +protuberant +protuberantial +protuberantly +protuberantness +protuberate +protuberated +protuberating +protuberosity +protuberous +protura +proturan +protutor +protutory +proud +prouder +proudest +proudful +proudhearted +proudish +proudishly +proudly +proudling +proudness +prouniformity +prounion +prounionism +prounionist +prouniversity +proustian +proustite +prov +provability +provable +provableness +provably +provaccination +provaccine +provaccinist +provand +provant +provascular +prove +provect +provection +proved +proveditor +proveditore +provedly +provedor +provedore +proven +provenance +provenances +provencal +provencalize +provence +provencial +provend +provender +provene +provenience +provenient +provenly +provent +proventricular +proventricule +proventriculi +proventriculus +prover +proverb +proverbed +proverbial +proverbialism +proverbialist +proverbialize +proverbially +proverbic +proverbing +proverbiology +proverbiologist +proverbize +proverblike +proverbs +provers +proves +proviant +provicar +provicariate +providable +providance +provide +provided +providence +provident +providential +providentialism +providentially +providently +providentness +provider +providers +provides +providing +providore +providoring +province +provinces +provincial +provincialate +provincialism +provincialist +provinciality +provincialities +provincialization +provincialize +provincially +provincialship +provinciate +provinculum +provine +proving +provingly +proviral +provirus +proviruses +provision +provisional +provisionality +provisionally +provisionalness +provisionary +provisioned +provisioner +provisioneress +provisioning +provisionless +provisionment +provisions +provisive +proviso +provisoes +provisor +provisory +provisorily +provisorship +provisos +provitamin +provivisection +provivisectionist +provocant +provocateur +provocateurs +provocation +provocational +provocations +provocative +provocatively +provocativeness +provocator +provocatory +provokable +provoke +provoked +provokee +provoker +provokers +provokes +provoking +provokingly +provokingness +provola +provolone +provolunteering +provoquant +provost +provostal +provostess +provostorial +provostry +provosts +provostship +prow +prowar +prowarden +prowaterpower +prowed +prower +prowersite +prowess +prowessed +prowesses +prowessful +prowest +prowfish +prowfishes +prowl +prowled +prowler +prowlers +prowling +prowlingly +prowls +prows +prox +proxemic +proxemics +proxenet +proxenete +proxenetism +proxeny +proxenos +proxenus +proxy +proxically +proxied +proxies +proxying +proxima +proximad +proximal +proximally +proximate +proximately +proximateness +proximation +proxime +proximity +proximities +proximo +proximobuccal +proximolabial +proximolingual +proxyship +proxysm +prozygapophysis +prozymite +prozone +prozoning +prp +prs +prude +prudely +prudelike +prudence +prudences +prudent +prudential +prudentialism +prudentialist +prudentiality +prudentially +prudentialness +prudently +prudery +pruderies +prudes +prudhomme +prudy +prudish +prudishly +prudishness +prudist +prudity +prue +pruh +pruigo +pruinate +pruinescence +pruinose +pruinous +prulaurasin +prunability +prunable +prunableness +prunably +prunaceae +prunase +prunasin +prune +pruned +prunell +prunella +prunellas +prunelle +prunelles +prunellidae +prunello +prunellos +pruner +pruners +prunes +prunetin +prunetol +pruniferous +pruniform +pruning +prunitrin +prunt +prunted +prunus +prurience +pruriency +prurient +pruriently +pruriginous +prurigo +prurigos +pruriousness +pruritic +pruritus +prurituses +prusiano +prussia +prussian +prussianisation +prussianise +prussianised +prussianiser +prussianising +prussianism +prussianization +prussianize +prussianized +prussianizer +prussianizing +prussians +prussiate +prussic +prussify +prussification +prussin +prussine +prut +pruta +prutah +prutenic +prutot +prutoth +ps +psalis +psalloid +psalm +psalmbook +psalmed +psalmy +psalmic +psalming +psalmist +psalmister +psalmistry +psalmists +psalmless +psalmody +psalmodial +psalmodic +psalmodical +psalmodies +psalmodist +psalmodize +psalmograph +psalmographer +psalmography +psalms +psaloid +psalter +psalterer +psaltery +psalteria +psalterial +psalterian +psalteries +psalterion +psalterist +psalterium +psalters +psaltes +psalteteria +psaltress +psaltry +psaltries +psammead +psammite +psammites +psammitic +psammocarcinoma +psammocharid +psammocharidae +psammogenous +psammolithic +psammology +psammologist +psammoma +psammophile +psammophilous +psammophis +psammophyte +psammophytic +psammosarcoma +psammosere +psammotherapy +psammous +psarolite +psaronius +pschent +pschents +psec +psedera +pselaphidae +pselaphus +psellism +psellismus +psend +psephism +psephisma +psephite +psephites +psephitic +psephology +psephological +psephologist +psephomancy +psephurus +psetta +pseud +pseudaconin +pseudaconine +pseudaconitine +pseudacusis +pseudalveolar +pseudambulacral +pseudambulacrum +pseudamoeboid +pseudamphora +pseudamphorae +pseudandry +pseudangina +pseudankylosis +pseudaphia +pseudaposematic +pseudapospory +pseudaposporous +pseudapostle +pseudarachnidan +pseudarthrosis +pseudataxic +pseudatoll +pseudaxine +pseudaxis +pseudechis +pseudelephant +pseudelytron +pseudelminth +pseudembryo +pseudembryonic +pseudencephalic +pseudencephalus +pseudepigraph +pseudepigrapha +pseudepigraphal +pseudepigraphy +pseudepigraphic +pseudepigraphical +pseudepigraphous +pseudepiploic +pseudepiploon +pseudepiscopacy +pseudepiscopy +pseudepisematic +pseudesthesia +pseudhaemal +pseudhalteres +pseudhemal +pseudimaginal +pseudimago +pseudisodomic +pseudisodomum +pseudo +pseudoacaccia +pseudoacacia +pseudoacademic +pseudoacademical +pseudoacademically +pseudoaccidental +pseudoaccidentally +pseudoacid +pseudoaconitine +pseudoacquaintance +pseudoacromegaly +pseudoadiabatic +pseudoaesthetic +pseudoaesthetically +pseudoaffectionate +pseudoaffectionately +pseudoaggressive +pseudoaggressively +pseudoalkaloid +pseudoallegoristic +pseudoallele +pseudoallelic +pseudoallelism +pseudoalum +pseudoalveolar +pseudoamateurish +pseudoamateurishly +pseudoamateurism +pseudoamatory +pseudoamatorial +pseudoambidextrous +pseudoambidextrously +pseudoameboid +pseudoanachronistic +pseudoanachronistical +pseudoanaphylactic +pseudoanaphylaxis +pseudoanarchistic +pseudoanatomic +pseudoanatomical +pseudoanatomically +pseudoancestral +pseudoancestrally +pseudoanemia +pseudoanemic +pseudoangelic +pseudoangelical +pseudoangelically +pseudoangina +pseudoangular +pseudoangularly +pseudoankylosis +pseudoanthorine +pseudoanthropoid +pseudoanthropology +pseudoanthropological +pseudoantique +pseudoapologetic +pseudoapologetically +pseudoapoplectic +pseudoapoplectical +pseudoapoplectically +pseudoapoplexy +pseudoappendicitis +pseudoapplicative +pseudoapprehensive +pseudoapprehensively +pseudoaquatic +pseudoarchaic +pseudoarchaically +pseudoarchaism +pseudoarchaist +pseudoaristocratic +pseudoaristocratical +pseudoaristocratically +pseudoarthrosis +pseudoarticulate +pseudoarticulately +pseudoarticulation +pseudoartistic +pseudoartistically +pseudoascetic +pseudoascetical +pseudoascetically +pseudoasymmetry +pseudoasymmetric +pseudoasymmetrical +pseudoasymmetrically +pseudoassertive +pseudoassertively +pseudoassociational +pseudoastringent +pseudoataxia +pseudobacterium +pseudobankrupt +pseudobaptismal +pseudobasidium +pseudobchia +pseudobenefactory +pseudobenevolent +pseudobenevolently +pseudobenthonic +pseudobenthos +pseudobia +pseudobinary +pseudobiographic +pseudobiographical +pseudobiographically +pseudobiological +pseudobiologically +pseudoblepsia +pseudoblepsis +pseudobrachia +pseudobrachial +pseudobrachium +pseudobranch +pseudobranchia +pseudobranchial +pseudobranchiate +pseudobranchus +pseudobrookite +pseudobrotherly +pseudobulb +pseudobulbar +pseudobulbil +pseudobulbous +pseudobutylene +pseudocandid +pseudocandidly +pseudocapitulum +pseudocaptive +pseudocarbamide +pseudocarcinoid +pseudocarp +pseudocarpous +pseudocartilaginous +pseudocatholically +pseudocele +pseudocelian +pseudocelic +pseudocellus +pseudocelom +pseudocentric +pseudocentrous +pseudocentrum +pseudoceratites +pseudoceratitic +pseudocercaria +pseudocercariae +pseudocercerci +pseudocerci +pseudocercus +pseudoceryl +pseudocharitable +pseudocharitably +pseudochemical +pseudochylous +pseudochina +pseudochrysalis +pseudochrysolite +pseudochromesthesia +pseudochromia +pseudochromosome +pseudochronism +pseudochronologist +pseudocyclosis +pseudocyesis +pseudocyphella +pseudocirrhosis +pseudocyst +pseudoclassic +pseudoclassical +pseudoclassicality +pseudoclassicism +pseudoclerical +pseudoclerically +pseudococcinae +pseudococcus +pseudococtate +pseudocoel +pseudocoele +pseudocoelom +pseudocoelomate +pseudocoelome +pseudocollegiate +pseudocolumella +pseudocolumellar +pseudocommissural +pseudocommissure +pseudocommisural +pseudocompetitive +pseudocompetitively +pseudoconcha +pseudoconclude +pseudocone +pseudoconfessional +pseudoconglomerate +pseudoconglomeration +pseudoconhydrine +pseudoconjugation +pseudoconservative +pseudoconservatively +pseudocorneous +pseudocortex +pseudocosta +pseudocotyledon +pseudocotyledonal +pseudocotyledonary +pseudocourteous +pseudocourteously +pseudocrystalline +pseudocritical +pseudocritically +pseudocroup +pseudocubic +pseudocubical +pseudocubically +pseudocultivated +pseudocultural +pseudoculturally +pseudocumene +pseudocumenyl +pseudocumidine +pseudocumyl +pseudodeltidium +pseudodementia +pseudodemocratic +pseudodemocratically +pseudoderm +pseudodermic +pseudodevice +pseudodiagnosis +pseudodiastolic +pseudodiphtheria +pseudodiphtherial +pseudodiphtheric +pseudodiphtheritic +pseudodipteral +pseudodipterally +pseudodipteros +pseudodysentery +pseudodivine +pseudodont +pseudodox +pseudodoxal +pseudodoxy +pseudodramatic +pseudodramatically +pseudoeconomical +pseudoeconomically +pseudoedema +pseudoedemata +pseudoeditorial +pseudoeditorially +pseudoeducational +pseudoeducationally +pseudoelectoral +pseudoelephant +pseudoembryo +pseudoembryonic +pseudoemotional +pseudoemotionally +pseudoencephalitic +pseudoenthusiastic +pseudoenthusiastically +pseudoephedrine +pseudoepiscopal +pseudoequalitarian +pseudoerysipelas +pseudoerysipelatous +pseudoerythrin +pseudoerotic +pseudoerotically +pseudoeroticism +pseudoethical +pseudoethically +pseudoetymological +pseudoetymologically +pseudoeugenics +pseudoevangelic +pseudoevangelical +pseudoevangelically +pseudoexperimental +pseudoexperimentally +pseudofaithful +pseudofaithfully +pseudofamous +pseudofamously +pseudofarcy +pseudofatherly +pseudofeminine +pseudofever +pseudofeverish +pseudofeverishly +pseudofilaria +pseudofilarian +pseudofiles +pseudofinal +pseudofinally +pseudofluctuation +pseudofluorescence +pseudofoliaceous +pseudoform +pseudofossil +pseudogalena +pseudoganglion +pseudogaseous +pseudogaster +pseudogastrula +pseudogenera +pseudogeneral +pseudogeneric +pseudogenerical +pseudogenerically +pseudogenerous +pseudogenteel +pseudogentlemanly +pseudogenus +pseudogenuses +pseudogeometry +pseudogermanic +pseudogeusia +pseudogeustia +pseudogyne +pseudogyny +pseudogynous +pseudogyrate +pseudoglanders +pseudoglioma +pseudoglobulin +pseudoglottis +pseudograph +pseudographeme +pseudographer +pseudography +pseudographia +pseudographize +pseudograsserie +pseudogryphus +pseudohallucination +pseudohallucinatory +pseudohalogen +pseudohemal +pseudohemophilia +pseudohermaphrodism +pseudohermaphrodite +pseudohermaphroditic +pseudohermaphroditism +pseudoheroic +pseudoheroical +pseudoheroically +pseudohexagonal +pseudohexagonally +pseudohydrophobia +pseudohyoscyamine +pseudohypertrophy +pseudohypertrophic +pseudohistoric +pseudohistorical +pseudohistorically +pseudoholoptic +pseudohuman +pseudohumanistic +pseudoidentical +pseudoimpartial +pseudoimpartially +pseudoindependent +pseudoindependently +pseudoinfluenza +pseudoinsane +pseudoinsoluble +pseudoinspirational +pseudoinspiring +pseudoinstruction +pseudoinstructions +pseudointellectual +pseudointellectually +pseudointellectuals +pseudointernational +pseudointernationalistic +pseudoinvalid +pseudoinvalidly +pseudoyohimbine +pseudoisatin +pseudoism +pseudoisomer +pseudoisomeric +pseudoisomerism +pseudoisometric +pseudoisotropy +pseudojervine +pseudolabia +pseudolabial +pseudolabium +pseudolalia +pseudolamellibranchia +pseudolamellibranchiata +pseudolamellibranchiate +pseudolaminated +pseudolarix +pseudolateral +pseudolatry +pseudolegal +pseudolegality +pseudolegendary +pseudolegislative +pseudoleucite +pseudoleucocyte +pseudoleukemia +pseudoleukemic +pseudoliberal +pseudoliberally +pseudolichen +pseudolinguistic +pseudolinguistically +pseudoliterary +pseudolobar +pseudology +pseudological +pseudologically +pseudologist +pseudologue +pseudolunula +pseudolunulae +pseudolunule +pseudomalachite +pseudomalaria +pseudomancy +pseudomania +pseudomaniac +pseudomantic +pseudomantist +pseudomasculine +pseudomedical +pseudomedically +pseudomedieval +pseudomedievally +pseudomelanosis +pseudomembrane +pseudomembranous +pseudomemory +pseudomeningitis +pseudomenstruation +pseudomer +pseudomery +pseudomeric +pseudomerism +pseudometallic +pseudometameric +pseudometamerism +pseudometric +pseudomica +pseudomycelial +pseudomycelium +pseudomilitary +pseudomilitarily +pseudomilitarist +pseudomilitaristic +pseudoministerial +pseudoministry +pseudomiraculous +pseudomiraculously +pseudomythical +pseudomythically +pseudomitotic +pseudomnesia +pseudomodern +pseudomodest +pseudomodestly +pseudomonades +pseudomonas +pseudomonastic +pseudomonastical +pseudomonastically +pseudomonocyclic +pseudomonoclinic +pseudomonocotyledonous +pseudomonotropy +pseudomoral +pseudomoralistic +pseudomorph +pseudomorphia +pseudomorphic +pseudomorphine +pseudomorphism +pseudomorphose +pseudomorphosis +pseudomorphous +pseudomorula +pseudomorular +pseudomucin +pseudomucoid +pseudomultilocular +pseudomultiseptate +pseudomutuality +pseudonarcotic +pseudonational +pseudonationally +pseudonavicella +pseudonavicellar +pseudonavicula +pseudonavicular +pseudoneuropter +pseudoneuroptera +pseudoneuropteran +pseudoneuropterous +pseudonychium +pseudonym +pseudonymal +pseudonymic +pseudonymity +pseudonymous +pseudonymously +pseudonymousness +pseudonyms +pseudonymuncle +pseudonymuncule +pseudonitrol +pseudonitrole +pseudonitrosite +pseudonoble +pseudonuclein +pseudonucleolus +pseudoobscura +pseudooccidental +pseudoofficial +pseudoofficially +pseudoorganic +pseudoorganically +pseudooriental +pseudoorientally +pseudoorthorhombic +pseudooval +pseudoovally +pseudopagan +pseudopapal +pseudopapaverine +pseudoparalyses +pseudoparalysis +pseudoparalytic +pseudoparallel +pseudoparallelism +pseudoparaplegia +pseudoparasitic +pseudoparasitism +pseudoparenchyma +pseudoparenchymatous +pseudoparenchyme +pseudoparesis +pseudoparthenogenesis +pseudopatriotic +pseudopatriotically +pseudopediform +pseudopelletierine +pseudopercular +pseudoperculate +pseudoperculum +pseudoperianth +pseudoperidium +pseudoperiodic +pseudoperipteral +pseudoperipteros +pseudopermanent +pseudoperoxide +pseudoperspective +pseudopeziza +pseudophallic +pseudophellandrene +pseudophenanthrene +pseudophenanthroline +pseudophenocryst +pseudophilanthropic +pseudophilanthropical +pseudophilanthropically +pseudophilosophical +pseudophoenix +pseudophone +pseudopionnotes +pseudopious +pseudopiously +pseudopyriform +pseudoplasm +pseudoplasma +pseudoplasmodium +pseudopneumonia +pseudopod +pseudopodal +pseudopode +pseudopodia +pseudopodial +pseudopodian +pseudopodic +pseudopodiospore +pseudopodium +pseudopoetic +pseudopoetical +pseudopolitic +pseudopolitical +pseudopopular +pseudopore +pseudoporphyritic +pseudopregnancy +pseudopregnant +pseudopriestly +pseudoprimitive +pseudoprimitivism +pseudoprincely +pseudoproboscis +pseudoprofessional +pseudoprofessorial +pseudoprophetic +pseudoprophetical +pseudoprosperous +pseudoprosperously +pseudoprostyle +pseudopsia +pseudopsychological +pseudoptics +pseudoptosis +pseudopupa +pseudopupal +pseudopurpurin +pseudoquinol +pseudorabies +pseudoracemic +pseudoracemism +pseudoramose +pseudoramulus +pseudorandom +pseudorealistic +pseudoreduction +pseudoreformatory +pseudoreformed +pseudoregal +pseudoregally +pseudoreligious +pseudoreligiously +pseudoreminiscence +pseudorepublican +pseudoresident +pseudoresidential +pseudorganic +pseudorheumatic +pseudorhombohedral +pseudoroyal +pseudoroyally +pseudoromantic +pseudoromantically +pseudorunic +pseudosacred +pseudosacrilegious +pseudosacrilegiously +pseudosalt +pseudosatirical +pseudosatirically +pseudoscalar +pseudoscarlatina +pseudoscarus +pseudoscholarly +pseudoscholastic +pseudoscholastically +pseudoscience +pseudoscientific +pseudoscientifically +pseudoscientist +pseudoscines +pseudoscinine +pseudosclerosis +pseudoscope +pseudoscopy +pseudoscopic +pseudoscopically +pseudoscorpion +pseudoscorpiones +pseudoscorpionida +pseudoscutum +pseudosemantic +pseudosemantically +pseudosematic +pseudosensational +pseudoseptate +pseudoservile +pseudoservilely +pseudosessile +pseudosyllogism +pseudosymmetry +pseudosymmetric +pseudosymmetrical +pseudosymptomatic +pseudosyphilis +pseudosyphilitic +pseudosiphonal +pseudosiphonic +pseudosiphuncal +pseudoskeletal +pseudoskeleton +pseudoskink +pseudosmia +pseudosocial +pseudosocialistic +pseudosocially +pseudosolution +pseudosoph +pseudosopher +pseudosophy +pseudosophical +pseudosophist +pseudospectral +pseudosperm +pseudospermic +pseudospermium +pseudospermous +pseudosphere +pseudospherical +pseudospiracle +pseudospiritual +pseudospiritually +pseudosporangium +pseudospore +pseudosquamate +pseudostalactite +pseudostalactitic +pseudostalactitical +pseudostalagmite +pseudostalagmitic +pseudostalagmitical +pseudostereoscope +pseudostereoscopic +pseudostereoscopism +pseudostigma +pseudostigmatic +pseudostoma +pseudostomatous +pseudostomous +pseudostratum +pseudostudious +pseudostudiously +pseudosubtle +pseudosubtly +pseudosuchia +pseudosuchian +pseudosuicidal +pseudosweating +pseudotabes +pseudotachylite +pseudotetanus +pseudotetragonal +pseudotetramera +pseudotetrameral +pseudotetramerous +pseudotyphoid +pseudotrachea +pseudotracheal +pseudotribal +pseudotribally +pseudotributary +pseudotrimera +pseudotrimeral +pseudotrimerous +pseudotripteral +pseudotropine +pseudotsuga +pseudotubercular +pseudotuberculosis +pseudotuberculous +pseudoturbinal +pseudoval +pseudovary +pseudovarian +pseudovaries +pseudovelar +pseudovelum +pseudoventricle +pseudoviaduct +pseudoviperine +pseudoviperous +pseudoviperously +pseudoviscosity +pseudoviscous +pseudovolcanic +pseudovolcano +pseudovum +pseudowhorl +pseudoxanthine +pseudozealot +pseudozealous +pseudozealously +pseudozoea +pseudozoogloeal +pseudozoological +psf +psha +pshav +pshaw +pshawed +pshawing +pshaws +psi +psia +psych +psychagogy +psychagogic +psychagogos +psychagogue +psychal +psychalgia +psychanalysis +psychanalysist +psychanalytic +psychanalytically +psychasthenia +psychasthenic +psychataxia +psyche +psychean +psyched +psychedelia +psychedelic +psychedelically +psychedelics +psycheometry +psyches +psychesthesia +psychesthetic +psychiasis +psychiater +psychiatry +psychiatria +psychiatric +psychiatrical +psychiatrically +psychiatries +psychiatrist +psychiatrists +psychiatrize +psychic +psychical +psychically +psychichthys +psychicism +psychicist +psychics +psychid +psychidae +psyching +psychism +psychist +psycho +psychoacoustic +psychoacoustics +psychoactive +psychoanal +psychoanalyse +psychoanalyses +psychoanalysis +psychoanalyst +psychoanalysts +psychoanalytic +psychoanalytical +psychoanalytically +psychoanalyze +psychoanalyzed +psychoanalyzer +psychoanalyzes +psychoanalyzing +psychoautomatic +psychobiochemistry +psychobiology +psychobiologic +psychobiological +psychobiologist +psychobiotic +psychocatharsis +psychochemical +psychochemist +psychochemistry +psychoclinic +psychoclinical +psychoclinicist +psychoda +psychodelic +psychodiagnosis +psychodiagnostic +psychodiagnostics +psychodidae +psychodynamic +psychodynamics +psychodispositional +psychodrama +psychodramas +psychodramatic +psychoeducational +psychoepilepsy +psychoethical +psychofugal +psychogalvanic +psychogalvanometer +psychogenesis +psychogenetic +psychogenetical +psychogenetically +psychogenetics +psychogeny +psychogenic +psychogenically +psychogeriatrics +psychognosy +psychognosis +psychognostic +psychogony +psychogonic +psychogonical +psychogram +psychograph +psychographer +psychography +psychographic +psychographically +psychographist +psychohistory +psychoid +psychokyme +psychokineses +psychokinesia +psychokinesis +psychokinetic +psychol +psycholepsy +psycholeptic +psycholinguistic +psycholinguistics +psychologer +psychology +psychologian +psychologic +psychological +psychologically +psychologics +psychologies +psychologised +psychologising +psychologism +psychologist +psychologistic +psychologists +psychologize +psychologized +psychologizing +psychologue +psychomachy +psychomancy +psychomantic +psychometer +psychometry +psychometric +psychometrical +psychometrically +psychometrician +psychometrics +psychometries +psychometrist +psychometrize +psychomonism +psychomoral +psychomorphic +psychomorphism +psychomotility +psychomotor +psychon +psychoneural +psychoneurological +psychoneuroses +psychoneurosis +psychoneurotic +psychony +psychonomy +psychonomic +psychonomics +psychoorganic +psychopanychite +psychopannychy +psychopannychian +psychopannychism +psychopannychist +psychopannychistic +psychopath +psychopathy +psychopathia +psychopathic +psychopathically +psychopathies +psychopathist +psychopathology +psychopathologic +psychopathological +psychopathologically +psychopathologist +psychopaths +psychopetal +psychopharmacology +psychopharmacologic +psychopharmacological +psychophysic +psychophysical +psychophysically +psychophysicist +psychophysics +psychophysiology +psychophysiologic +psychophysiological +psychophysiologically +psychophysiologist +psychophobia +psychophonasthenia +psychoplasm +psychopomp +psychopompos +psychoprophylactic +psychoprophylaxis +psychoquackeries +psychorealism +psychorealist +psychorealistic +psychoreflex +psychorhythm +psychorhythmia +psychorhythmic +psychorhythmical +psychorhythmically +psychorrhagy +psychorrhagic +psychos +psychosarcous +psychosensory +psychosensorial +psychoses +psychosexual +psychosexuality +psychosexually +psychosyntheses +psychosynthesis +psychosynthetic +psychosis +psychosocial +psychosocially +psychosociology +psychosomatic +psychosomatics +psychosome +psychosophy +psychostasy +psychostatic +psychostatical +psychostatically +psychostatics +psychosurgeon +psychosurgery +psychotaxis +psychotechnical +psychotechnician +psychotechnics +psychotechnology +psychotechnological +psychotechnologist +psychotheism +psychotheist +psychotherapeutic +psychotherapeutical +psychotherapeutically +psychotherapeutics +psychotherapeutist +psychotherapy +psychotherapies +psychotherapist +psychotherapists +psychotic +psychotically +psychotics +psychotogen +psychotogenic +psychotomimetic +psychotoxic +psychotria +psychotrine +psychotropic +psychovital +psychozoic +psychroesthesia +psychrograph +psychrometer +psychrometry +psychrometric +psychrometrical +psychrophile +psychrophilic +psychrophyte +psychrophobia +psychrophore +psychrotherapies +psychs +psychurgy +psycter +psid +psidium +psig +psykter +psykters +psilanthropy +psilanthropic +psilanthropism +psilanthropist +psilatro +psylla +psyllas +psyllid +psyllidae +psyllids +psyllium +psiloceran +psiloceras +psiloceratan +psiloceratid +psiloceratidae +psilocybin +psilocin +psiloi +psilology +psilomelane +psilomelanic +psilophytales +psilophyte +psilophyton +psiloses +psilosis +psilosopher +psilosophy +psilotaceae +psilotaceous +psilothrum +psilotic +psilotum +psis +psithyrus +psithurism +psittaceous +psittaceously +psittaci +psittacidae +psittaciformes +psittacinae +psittacine +psittacinite +psittacism +psittacistic +psittacomorphae +psittacomorphic +psittacosis +psittacotic +psittacus +psywar +psize +psoadic +psoae +psoai +psoas +psoatic +psocid +psocidae +psocids +psocine +psoitis +psomophagy +psomophagic +psomophagist +psora +psoralea +psoraleas +psoriases +psoriasic +psoriasiform +psoriasis +psoriatic +psoriatiform +psoric +psoroid +psorophora +psorophthalmia +psorophthalmic +psoroptes +psoroptic +psorosis +psorosperm +psorospermial +psorospermiasis +psorospermic +psorospermiform +psorospermosis +psorous +psovie +pssimistical +psst +pst +psuedo +psw +pt +pta +ptarmic +ptarmica +ptarmical +ptarmigan +ptarmigans +pte +ptelea +ptenoglossa +ptenoglossate +pteranodon +pteranodont +pteranodontidae +pteraspid +pteraspidae +pteraspis +ptereal +pterergate +pterian +pteric +pterichthyodes +pterichthys +pterideous +pteridium +pteridography +pteridoid +pteridology +pteridological +pteridologist +pteridophilism +pteridophilist +pteridophilistic +pteridophyta +pteridophyte +pteridophytes +pteridophytic +pteridophytous +pteridosperm +pteridospermae +pteridospermaphyta +pteridospermaphytic +pteridospermous +pterygia +pterygial +pterygiophore +pterygium +pterygiums +pterygobranchiate +pterygode +pterygodum +pterygogenea +pterygoid +pterygoidal +pterygoidean +pterygomalar +pterygomandibular +pterygomaxillary +pterygopalatal +pterygopalatine +pterygopharyngeal +pterygopharyngean +pterygophore +pterygopodium +pterygoquadrate +pterygosphenoid +pterygospinous +pterygostaphyline +pterygota +pterygote +pterygotous +pterygotrabecular +pterygotus +pteryla +pterylae +pterylography +pterylographic +pterylographical +pterylology +pterylological +pterylosis +pterin +pterins +pterion +pteryrygia +pteris +pterna +pterobranchia +pterobranchiate +pterocarya +pterocarpous +pterocarpus +pterocaulon +pterocera +pteroceras +pterocles +pterocletes +pteroclidae +pteroclomorphae +pteroclomorphic +pterodactyl +pterodactyli +pterodactylian +pterodactylic +pterodactylid +pterodactylidae +pterodactyloid +pterodactylous +pterodactyls +pterodactylus +pterographer +pterography +pterographic +pterographical +pteroid +pteroylglutamic +pteroylmonogl +pteroma +pteromalid +pteromalidae +pteromata +pteromys +pteron +pteronophobia +pteropaedes +pteropaedic +pteropegal +pteropegous +pteropegum +pterophorid +pterophoridae +pterophorus +pterophryne +pteropid +pteropidae +pteropine +pteropod +pteropoda +pteropodal +pteropodan +pteropodial +pteropodidae +pteropodium +pteropodous +pteropods +pteropsida +pteropus +pterosaur +pterosauri +pterosauria +pterosaurian +pterospermous +pterospora +pterostemon +pterostemonaceae +pterostigma +pterostigmal +pterostigmatic +pterostigmatical +pterotheca +pterothorax +pterotic +ptg +pty +ptyalagogic +ptyalagogue +ptyalectases +ptyalectasis +ptyalin +ptyalins +ptyalism +ptyalisms +ptyalize +ptyalized +ptyalizing +ptyalocele +ptyalogenic +ptyalolith +ptyalolithiasis +ptyalorrhea +ptychoparia +ptychoparid +ptychopariid +ptychopterygial +ptychopterygium +ptychosperma +ptilichthyidae +ptiliidae +ptilimnium +ptilinal +ptilinum +ptilocercus +ptilonorhynchidae +ptilonorhynchinae +ptilopaedes +ptilopaedic +ptilosis +ptilota +ptinid +ptinidae +ptinoid +ptinus +ptisan +ptisans +ptysmagogue +ptyxis +ptochocracy +ptochogony +ptochology +ptolemaean +ptolemaian +ptolemaic +ptolemaical +ptolemaism +ptolemaist +ptolemean +ptolemy +ptomain +ptomaine +ptomaines +ptomainic +ptomains +ptomatropine +ptoses +ptosis +ptotic +ptp +pts +ptt +ptts +pu +pua +puan +pub +pubal +pubble +puberal +pubertal +puberty +pubertic +puberties +puberulent +puberulous +pubes +pubescence +pubescency +pubescent +pubian +pubic +pubigerous +pubiotomy +pubis +publ +public +publica +publicae +publically +publican +publicanism +publicans +publicate +publication +publicational +publications +publice +publichearted +publicheartedness +publici +publicism +publicist +publicists +publicity +publicization +publicize +publicized +publicizer +publicizes +publicizing +publicly +publicness +publics +publicum +publicute +publilian +publish +publishable +published +publisher +publisheress +publishers +publishership +publishes +publishing +publishment +pubococcygeal +pubofemoral +puboiliac +puboischiac +puboischial +puboischiatic +puboprostatic +puborectalis +pubotibial +pubourethral +pubovesical +pubs +puca +puccini +puccinia +pucciniaceae +pucciniaceous +puccinoid +puccoon +puccoons +puce +pucelage +pucellage +pucellas +pucelle +puceron +puces +puchanahua +puchera +pucherite +puchero +puck +pucka +puckball +pucker +puckerbush +puckered +puckerel +puckerer +puckerers +puckery +puckerier +puckeriest +puckering +puckermouth +puckers +puckfist +puckfoist +puckish +puckishly +puckishness +puckle +pucklike +puckling +puckneedle +puckrel +pucks +pucksey +puckster +pud +pudda +puddee +puddening +pudder +puddy +pudding +puddingberry +puddinghead +puddingheaded +puddinghouse +puddingy +puddinglike +puddings +puddingstone +puddingwife +puddingwives +puddle +puddleball +puddlebar +puddled +puddlelike +puddler +puddlers +puddles +puddly +puddlier +puddliest +puddling +puddlings +puddock +pudency +pudencies +pudenda +pudendal +pudendous +pudendum +pudent +pudge +pudgy +pudgier +pudgiest +pudgily +pudginess +pudiano +pudibund +pudibundity +pudic +pudical +pudicity +pudicitia +puds +pudsey +pudsy +pudu +pueblito +pueblo +puebloan +puebloization +puebloize +pueblos +puelche +puelchean +pueraria +puerer +puericulture +puerile +puerilely +puerileness +puerilism +puerility +puerilities +puerman +puerpera +puerperae +puerperal +puerperalism +puerperant +puerpery +puerperia +puerperium +puerperous +puerto +puff +puffback +puffball +puffballs +puffbird +puffed +puffer +puffery +pufferies +puffers +puffy +puffier +puffiest +puffily +puffin +puffiness +puffinet +puffing +puffingly +puffins +puffinus +pufflet +puffs +pufftn +puffwig +pug +pugaree +pugarees +pugdog +pugenello +puget +puggaree +puggarees +pugged +pugger +puggi +puggy +puggier +puggiest +pugginess +pugging +puggish +puggle +puggree +puggrees +puggry +puggries +pugh +pugil +pugilant +pugilism +pugilisms +pugilist +pugilistic +pugilistical +pugilistically +pugilists +puglianite +pugman +pugmark +pugmarks +pugmill +pugmiller +pugnacious +pugnaciously +pugnaciousness +pugnacity +pugree +pugrees +pugs +puy +puya +puyallup +puinavi +puinavian +puinavis +puir +puirness +puirtith +puisne +puisnes +puisny +puissance +puissant +puissantly +puissantness +puist +puistie +puja +pujari +pujunan +puka +pukatea +pukateine +puke +puked +pukeka +pukeko +puker +pukes +pukeweed +pukhtun +puky +puking +pukish +pukishness +pukka +pukras +puku +pul +pulahan +pulahanes +pulahanism +pulaya +pulayan +pulajan +pulas +pulasan +pulaskite +pulchrify +pulchritude +pulchritudinous +pule +puled +pulegol +pulegone +puleyn +puler +pulers +pules +pulex +pulgada +pulghere +puli +puly +pulian +pulicarious +pulicat +pulicate +pulicene +pulicid +pulicidae +pulicidal +pulicide +pulicides +pulicine +pulicoid +pulicose +pulicosity +pulicous +pulijan +pulik +puling +pulingly +pulings +puliol +pulis +pulish +pulitzer +pulk +pulka +pull +pullable +pullaile +pullalue +pullback +pullbacks +pullboat +pulldevil +pulldoo +pulldown +pulldrive +pulled +pulley +pulleyless +pulleys +pullen +puller +pullery +pulleries +pullers +pullet +pullets +pulli +pullicat +pullicate +pulling +pullings +pullisee +pullman +pullmanize +pullmans +pullock +pullorum +pullout +pullouts +pullover +pullovers +pulls +pullshovel +pullulant +pullulate +pullulated +pullulating +pullulation +pullulative +pullus +pulment +pulmobranchia +pulmobranchial +pulmobranchiate +pulmocardiac +pulmocutaneous +pulmogastric +pulmometer +pulmometry +pulmonal +pulmonar +pulmonary +pulmonaria +pulmonarian +pulmonata +pulmonate +pulmonated +pulmonectomy +pulmonectomies +pulmonic +pulmonical +pulmonifer +pulmonifera +pulmoniferous +pulmonitis +pulmotor +pulmotors +pulmotracheal +pulmotracheary +pulmotrachearia +pulmotracheate +pulp +pulpaceous +pulpal +pulpalgia +pulpally +pulpamenta +pulpar +pulpatone +pulpatoon +pulpboard +pulpectomy +pulped +pulpefaction +pulper +pulperia +pulpers +pulpy +pulpier +pulpiest +pulpify +pulpification +pulpified +pulpifier +pulpifying +pulpily +pulpiness +pulping +pulpit +pulpital +pulpitarian +pulpiteer +pulpiter +pulpitful +pulpitic +pulpitical +pulpitically +pulpitis +pulpitish +pulpitism +pulpitize +pulpitless +pulpitly +pulpitolatry +pulpitry +pulpits +pulpitum +pulpless +pulplike +pulpotomy +pulpous +pulpousness +pulps +pulpstone +pulpwood +pulpwoods +pulque +pulques +puls +pulsant +pulsar +pulsars +pulsatance +pulsate +pulsated +pulsates +pulsatile +pulsatility +pulsatilla +pulsating +pulsation +pulsational +pulsations +pulsative +pulsatively +pulsator +pulsatory +pulsators +pulse +pulsebeat +pulsed +pulsejet +pulsejets +pulseless +pulselessly +pulselessness +pulselike +pulsellum +pulser +pulsers +pulses +pulsidge +pulsific +pulsimeter +pulsing +pulsion +pulsions +pulsive +pulsojet +pulsojets +pulsometer +pulsus +pultaceous +pulton +pultost +pultun +pulture +pulu +pulv +pulverable +pulverableness +pulveraceous +pulverant +pulverate +pulverated +pulverating +pulveration +pulvereous +pulverescent +pulverin +pulverine +pulverisable +pulverisation +pulverise +pulverised +pulveriser +pulverising +pulverizable +pulverizate +pulverization +pulverizator +pulverize +pulverized +pulverizer +pulverizes +pulverizing +pulverous +pulverulence +pulverulent +pulverulently +pulvic +pulvil +pulvilio +pulvillar +pulvilli +pulvilliform +pulvillus +pulvinar +pulvinaria +pulvinarian +pulvinate +pulvinated +pulvinately +pulvination +pulvini +pulvinic +pulviniform +pulvinni +pulvino +pulvinule +pulvinulus +pulvinus +pulviplume +pulwar +puma +pumas +pume +pumelo +pumelos +pumex +pumicate +pumicated +pumicating +pumice +pumiced +pumiceous +pumicer +pumicers +pumices +pumiciform +pumicing +pumicite +pumicites +pumicose +pummel +pummeled +pummeling +pummelled +pummelling +pummels +pummice +pump +pumpable +pumpage +pumped +pumpellyite +pumper +pumpernickel +pumpers +pumpet +pumphandle +pumping +pumpkin +pumpkinify +pumpkinification +pumpkinish +pumpkinity +pumpkins +pumpkinseed +pumpknot +pumple +pumpless +pumplike +pumpman +pumpmen +pumps +pumpsman +pumpwell +pumpwright +pun +puna +punaise +punalua +punaluan +punamu +punan +punas +punatoo +punce +punch +punchable +punchayet +punchball +punchboard +punchbowl +punched +puncheon +puncheons +puncher +punchers +punches +punchy +punchier +punchiest +punchinello +punchiness +punching +punchless +punchlike +punchproof +punct +punctal +punctate +punctated +punctatim +punctation +punctator +puncticular +puncticulate +puncticulose +punctiform +punctiliar +punctilio +punctiliomonger +punctilios +punctiliosity +punctilious +punctiliously +punctiliousness +punction +punctist +punctographic +punctual +punctualist +punctuality +punctually +punctualness +punctuate +punctuated +punctuates +punctuating +punctuation +punctuational +punctuationist +punctuative +punctuator +punctuist +punctulate +punctulated +punctulation +punctule +punctulum +punctum +puncturation +puncture +punctured +punctureless +punctureproof +puncturer +punctures +puncturing +punctus +pundigrion +pundit +pundita +punditic +punditically +punditry +punditries +pundits +pundonor +pundum +puneca +punese +pung +punga +pungapung +pungar +pungey +pungence +pungency +pungencies +pungent +pungently +punger +pungi +pungy +pungie +pungies +pungyi +pungle +pungled +pungs +puny +punic +punica +punicaceae +punicaceous +puniceous +punicial +punicin +punicine +punier +puniest +punyish +punyism +punily +puniness +puninesses +punish +punishability +punishable +punishableness +punishably +punished +punisher +punishers +punishes +punishing +punyship +punishment +punishmentproof +punishments +punition +punitional +punitionally +punitions +punitive +punitively +punitiveness +punitory +punitur +punjabi +punjum +punk +punka +punkah +punkahs +punkas +punkey +punkeys +punker +punkest +punketto +punky +punkie +punkier +punkies +punkiest +punkin +punkiness +punkins +punkish +punkling +punks +punkt +punkwood +punless +punlet +punnable +punnage +punned +punner +punners +punnet +punny +punnic +punnical +punnier +punniest +punnigram +punning +punningly +punnology +puno +punproof +puns +punster +punsters +punstress +punt +punta +puntabout +puntal +punted +puntel +puntello +punter +punters +punti +punty +punties +puntil +puntilla +puntillas +puntillero +punting +puntist +puntlatsh +punto +puntos +puntout +punts +puntsman +pup +pupa +pupae +pupahood +pupal +puparia +puparial +puparium +pupas +pupate +pupated +pupates +pupating +pupation +pupations +pupelo +pupfish +pupfishes +pupidae +pupiferous +pupiform +pupigenous +pupigerous +pupil +pupilability +pupilage +pupilages +pupilar +pupilary +pupilarity +pupilate +pupildom +pupiled +pupilize +pupillage +pupillar +pupillary +pupillarity +pupillate +pupilled +pupilless +pupillidae +pupillize +pupillometer +pupillometry +pupillometries +pupillonian +pupilloscope +pupilloscopy +pupilloscoptic +pupilmonger +pupils +pupipara +pupiparous +pupivora +pupivore +pupivorous +puplike +pupoid +pupped +puppet +puppetdom +puppeteer +puppeteers +puppethead +puppethood +puppetish +puppetism +puppetize +puppetly +puppetlike +puppetman +puppetmaster +puppetry +puppetries +puppets +puppy +puppydom +puppydoms +puppied +puppies +puppyfeet +puppify +puppyfish +puppyfoot +puppyhood +puppying +puppyish +puppyism +puppily +puppylike +pupping +puppis +puppysnatch +pups +pupulo +pupuluca +pupunha +puquina +puquinan +pur +purana +puranas +puranic +puraque +purasati +purau +purbeck +purbeckian +purblind +purblindly +purblindness +purchasability +purchasable +purchase +purchaseable +purchased +purchaser +purchasery +purchasers +purchases +purchasing +purda +purdah +purdahs +purdas +purdy +purdon +pure +pureayn +pureblood +purebred +purebreds +pured +puredee +puree +pureed +pureeing +purees +purehearted +purey +purely +pureness +purenesses +purer +purest +purfle +purfled +purfler +purfles +purfly +purfling +purflings +purga +purgament +purgation +purgations +purgative +purgatively +purgatives +purgatory +purgatorial +purgatorian +purgatories +purge +purgeable +purged +purger +purgery +purgers +purges +purging +purgings +puri +purify +purificant +purification +purifications +purificative +purificator +purificatory +purified +purifier +purifiers +purifies +purifying +puriform +purim +purin +purine +purines +purins +puriri +puris +purism +purisms +purist +puristic +puristical +puristically +purists +puritan +puritandom +puritaness +puritanic +puritanical +puritanically +puritanicalness +puritanism +puritanize +puritanizer +puritanly +puritanlike +puritano +puritans +purity +purities +purkinje +purkinjean +purl +purled +purler +purlhouse +purlicue +purlicues +purlieu +purlieuman +purlieumen +purlieus +purlin +purline +purlines +purling +purlins +purlman +purloin +purloined +purloiner +purloiners +purloining +purloins +purls +purohepatitis +purohit +purolymph +puromycin +puromucous +purpart +purparty +purpense +purpie +purple +purpled +purpleheart +purplely +purplelip +purpleness +purpler +purples +purplescent +purplest +purplewood +purplewort +purply +purpliness +purpling +purplish +purplishness +purport +purported +purportedly +purporter +purporters +purportes +purporting +purportively +purportless +purports +purpose +purposed +purposedly +purposeful +purposefully +purposefulness +purposeless +purposelessly +purposelessness +purposely +purposelike +purposer +purposes +purposing +purposive +purposively +purposiveness +purposivism +purposivist +purposivistic +purpresture +purprise +purprision +purpura +purpuraceous +purpuras +purpurate +purpure +purpureal +purpurean +purpureous +purpures +purpurescent +purpuric +purpuriferous +purpuriform +purpurigenous +purpurin +purpurine +purpurins +purpuriparous +purpurite +purpurize +purpurogallin +purpurogenous +purpuroid +purpuroxanthin +purr +purrah +purre +purred +purree +purreic +purrel +purrer +purry +purring +purringly +purrone +purrs +purs +purse +pursed +purseful +purseless +purselike +purser +pursers +pursership +purses +purset +purshia +pursy +pursier +pursiest +pursily +pursiness +pursing +pursive +purslane +purslanes +pursley +purslet +pursuable +pursual +pursuance +pursuant +pursuantly +pursue +pursued +pursuer +pursuers +pursues +pursuing +pursuit +pursuitmeter +pursuits +pursuivant +purtenance +purty +puru +puruha +purulence +purulences +purulency +purulencies +purulent +purulently +puruloid +purupuru +purusha +purushartha +purvey +purveyable +purveyal +purveyance +purveyancer +purveyed +purveying +purveyor +purveyoress +purveyors +purveys +purview +purviews +purvoe +purwannah +pus +puschkinia +puseyism +puseyistical +puseyite +puses +pusgut +push +pushball +pushballs +pushbutton +pushcard +pushcart +pushcarts +pushchair +pushdown +pushdowns +pushed +pusher +pushers +pushes +pushful +pushfully +pushfulness +pushy +pushier +pushiest +pushily +pushiness +pushing +pushingly +pushingness +pushmina +pushmobile +pushout +pushover +pushovers +pushpin +pushpins +pushrod +pushtu +pushum +pushup +pushups +pushwainling +pusill +pusillanimity +pusillanimous +pusillanimously +pusillanimousness +pusley +pusleys +puslike +puss +pusscat +pusses +pussy +pussycat +pussycats +pussier +pussies +pussiest +pussyfoot +pussyfooted +pussyfooter +pussyfooting +pussyfootism +pussyfoots +pussiness +pussytoe +pussley +pussleys +pussly +pusslies +pusslike +pustulant +pustular +pustulate +pustulated +pustulating +pustulation +pustulatous +pustule +pustuled +pustulelike +pustules +pustuliform +pustulose +pustulous +puszta +put +putage +putain +putamen +putamina +putaminous +putanism +putation +putationary +putative +putatively +putback +putchen +putcher +putchuk +putdown +putdowns +puteal +putelee +puteli +puther +puthery +putid +putidly +putidness +puting +putlock +putlog +putlogs +putoff +putoffs +putois +puton +putons +putorius +putout +putouts +putredinal +putredinous +putrefacient +putrefactible +putrefaction +putrefactive +putrefactiveness +putrefy +putrefiable +putrefied +putrefier +putrefies +putrefying +putresce +putrescence +putrescency +putrescent +putrescibility +putrescible +putrescine +putricide +putrid +putridity +putridly +putridness +putrifacted +putriform +putrilage +putrilaginous +putrilaginously +puts +putsch +putsches +putschism +putschist +putt +puttan +putted +puttee +puttees +putter +puttered +putterer +putterers +puttering +putteringly +putters +putti +putty +puttyblower +puttie +puttied +puttier +puttiers +putties +puttyhead +puttyhearted +puttying +puttylike +putting +puttyroot +puttywork +putto +puttock +puttoo +putts +puture +putz +puxy +puzzle +puzzleation +puzzled +puzzledly +puzzledness +puzzledom +puzzlehead +puzzleheaded +puzzleheadedly +puzzleheadedness +puzzleman +puzzlement +puzzlepate +puzzlepated +puzzlepatedness +puzzler +puzzlers +puzzles +puzzling +puzzlingly +puzzlingness +puzzlings +puzzolan +puzzolana +pvt +pwca +pwr +pwt +q +qabbala +qabbalah +qadarite +qadi +qaf +qaid +qaids +qaimaqam +qanat +qanats +qantar +qasida +qasidas +qat +qatar +qats +qe +qed +qere +qeri +qh +qy +qiana +qibla +qid +qiyas +qindar +qindarka +qindars +qintar +qintars +qiviut +qiviuts +ql +qm +qn +qoheleth +qoph +qophs +qp +qqv +qr +qrs +qs +qt +qtam +qtd +qty +qto +qtr +qts +qu +qua +quaalude +quaaludes +quab +quabird +quachil +quack +quacked +quackery +quackeries +quackhood +quacky +quackier +quackiest +quacking +quackish +quackishly +quackishness +quackism +quackisms +quackle +quacks +quacksalver +quackster +quad +quadded +quadding +quaddle +quader +quadi +quadle +quadmeter +quadplex +quadplexes +quadra +quadrable +quadrae +quadragenarian +quadragenarious +quadragesima +quadragesimal +quadragintesimal +quadral +quadrangle +quadrangled +quadrangles +quadrangular +quadrangularly +quadrangularness +quadrangulate +quadranguled +quadrans +quadrant +quadrantal +quadrantes +quadrantid +quadrantile +quadrantly +quadrantlike +quadrants +quadraphonic +quadraphonics +quadrat +quadrate +quadrated +quadrateness +quadrates +quadratic +quadratical +quadratically +quadratics +quadratifera +quadratiferous +quadrating +quadratojugal +quadratomandibular +quadrator +quadratosquamosal +quadratrix +quadrats +quadratum +quadrature +quadratures +quadratus +quadrauricular +quadrel +quadrella +quadrennia +quadrennial +quadrennially +quadrennials +quadrennium +quadrenniums +quadriad +quadrialate +quadriannulate +quadriarticulate +quadriarticulated +quadribasic +quadric +quadricapsular +quadricapsulate +quadricarinate +quadricellular +quadricentennial +quadricentennials +quadriceps +quadricepses +quadrichord +quadricycle +quadricycler +quadricyclist +quadriciliate +quadricinium +quadricipital +quadricone +quadricorn +quadricornous +quadricostate +quadricotyledonous +quadricovariant +quadricrescentic +quadricrescentoid +quadrics +quadricuspid +quadricuspidal +quadricuspidate +quadridentate +quadridentated +quadriderivative +quadridigitate +quadriennial +quadriennium +quadrienniumutile +quadrifarious +quadrifariously +quadrifid +quadrifilar +quadrifocal +quadrifoil +quadrifoliate +quadrifoliolate +quadrifolious +quadrifolium +quadriform +quadrifrons +quadrifrontal +quadrifurcate +quadrifurcated +quadrifurcation +quadriga +quadrigabled +quadrigae +quadrigamist +quadrigate +quadrigati +quadrigatus +quadrigeminal +quadrigeminate +quadrigeminous +quadrigeminum +quadrigenarious +quadriglandular +quadrihybrid +quadrijugal +quadrijugate +quadrijugous +quadrilaminar +quadrilaminate +quadrilateral +quadrilaterally +quadrilateralness +quadrilaterals +quadrilingual +quadriliteral +quadrille +quadrilled +quadrilles +quadrilling +quadrillion +quadrillions +quadrillionth +quadrillionths +quadrilobate +quadrilobed +quadrilocular +quadriloculate +quadrilogy +quadrilogue +quadrimembral +quadrimetallic +quadrimolecular +quadrimum +quadrin +quadrine +quadrinodal +quadrinomial +quadrinomical +quadrinominal +quadrinucleate +quadrioxalate +quadriparous +quadripartite +quadripartitely +quadripartition +quadripennate +quadriphyllous +quadriphonic +quadriphosphate +quadripinnate +quadriplanar +quadriplegia +quadriplegic +quadriplicate +quadriplicated +quadripolar +quadripole +quadriportico +quadriporticus +quadripulmonary +quadriquadric +quadriradiate +quadrireme +quadrisect +quadrisected +quadrisection +quadriseptate +quadriserial +quadrisetose +quadrisyllabic +quadrisyllabical +quadrisyllable +quadrisyllabous +quadrispiral +quadristearate +quadrisulcate +quadrisulcated +quadrisulphide +quadriternate +quadriti +quadritubercular +quadrituberculate +quadriurate +quadrivalence +quadrivalency +quadrivalent +quadrivalently +quadrivalve +quadrivalvular +quadrivia +quadrivial +quadrivious +quadrivium +quadrivoltine +quadroon +quadroons +quadrophonics +quadrual +quadrula +quadrum +quadrumana +quadrumanal +quadrumane +quadrumanous +quadrumvir +quadrumvirate +quadruped +quadrupedal +quadrupedan +quadrupedant +quadrupedantic +quadrupedantical +quadrupedate +quadrupedation +quadrupedism +quadrupedous +quadrupeds +quadruplane +quadruplate +quadruplator +quadruple +quadrupled +quadrupleness +quadruples +quadruplet +quadruplets +quadruplex +quadruply +quadruplicate +quadruplicated +quadruplicates +quadruplicating +quadruplication +quadruplications +quadruplicature +quadruplicity +quadrupling +quadrupole +quads +quae +quaedam +quaequae +quaere +quaeres +quaesita +quaesitum +quaestio +quaestiones +quaestor +quaestorial +quaestorian +quaestors +quaestorship +quaestuary +quaff +quaffed +quaffer +quaffers +quaffing +quaffingly +quaffs +quag +quagga +quaggas +quaggy +quaggier +quaggiest +quagginess +quaggle +quagmire +quagmired +quagmires +quagmiry +quagmirier +quagmiriest +quags +quahaug +quahaugs +quahog +quahogs +quai +quay +quayage +quayages +quaich +quaiches +quaichs +quayed +quaife +quayful +quaigh +quaighs +quaying +quail +quailberry +quailed +quailery +quaileries +quailhead +quaily +quaylike +quailing +quaillike +quails +quayman +quaint +quaintance +quainter +quaintest +quaintise +quaintish +quaintly +quaintness +quais +quays +quayside +quaysider +quaysides +quaitso +quake +quaked +quakeful +quakeproof +quaker +quakerbird +quakerdom +quakeress +quakery +quakeric +quakerish +quakerishly +quakerishness +quakerism +quakerization +quakerize +quakerlet +quakerly +quakerlike +quakers +quakership +quakes +quaketail +quaky +quakier +quakiest +quakily +quakiness +quaking +quakingly +qual +quale +qualia +qualify +qualifiable +qualification +qualifications +qualificative +qualificator +qualificatory +qualified +qualifiedly +qualifiedness +qualifier +qualifiers +qualifies +qualifying +qualifyingly +qualimeter +qualitative +qualitatively +quality +qualitied +qualities +qualityless +qualityship +qually +qualm +qualmy +qualmier +qualmiest +qualmyish +qualminess +qualmish +qualmishly +qualmishness +qualmproof +qualms +qualtagh +quam +quamash +quamashes +quamasia +quamoclit +quan +quandang +quandangs +quandary +quandaries +quandy +quando +quandong +quandongs +quango +quangos +quannet +quant +quanta +quantal +quanted +quanti +quantic +quantical +quantics +quanties +quantify +quantifiability +quantifiable +quantifiably +quantification +quantifications +quantified +quantifier +quantifiers +quantifies +quantifying +quantile +quantiles +quantimeter +quanting +quantitate +quantitation +quantitative +quantitatively +quantitativeness +quantity +quantitied +quantities +quantitive +quantitively +quantitiveness +quantivalence +quantivalency +quantivalent +quantizable +quantization +quantize +quantized +quantizer +quantizes +quantizing +quantometer +quantong +quantongs +quants +quantulum +quantum +quantummechanical +quapaw +quaquaversal +quaquaversally +quar +quaranty +quarantinable +quarantine +quarantined +quarantiner +quarantines +quarantining +quardeel +quare +quarenden +quarender +quarentene +quaresma +quarion +quark +quarks +quarl +quarle +quarles +quarmen +quarred +quarrel +quarreled +quarreler +quarrelers +quarrelet +quarreling +quarrelingly +quarrelled +quarreller +quarrellers +quarrelling +quarrellingly +quarrellous +quarrelous +quarrelously +quarrelproof +quarrels +quarrelsome +quarrelsomely +quarrelsomeness +quarry +quarriable +quarryable +quarrian +quarried +quarrier +quarriers +quarries +quarrying +quarryman +quarrymen +quarrion +quarrystone +quarrome +quarsome +quart +quarta +quartan +quartane +quartano +quartans +quartation +quartaut +quarte +quartenylic +quarter +quarterage +quarterback +quarterbacks +quarterdeck +quarterdeckish +quarterdecks +quartered +quarterer +quarterfinal +quarterfinalist +quarterfoil +quartering +quarterings +quarterization +quarterland +quarterly +quarterlies +quarterlight +quarterman +quartermaster +quartermasterlike +quartermasters +quartermastership +quartermen +quartern +quarternight +quarternion +quarterns +quarteron +quarterpace +quarters +quartersaw +quartersawed +quartersawing +quartersawn +quarterspace +quarterstaff +quarterstaves +quarterstetch +quartes +quartet +quartets +quartette +quartetto +quartful +quartic +quartics +quartile +quartiles +quartin +quartine +quartinho +quartiparous +quarto +quartodeciman +quartodecimanism +quartole +quartos +quarts +quartus +quartz +quartzes +quartzy +quartzic +quartziferous +quartzite +quartzitic +quartzless +quartzoid +quartzose +quartzous +quasar +quasars +quash +quashed +quashee +quashey +quasher +quashers +quashes +quashy +quashing +quasi +quasicontinuous +quasijudicial +quasimodo +quasiorder +quasiparticle +quasiperiodic +quasistationary +quasky +quaskies +quasquicentennial +quass +quassation +quassative +quasses +quassia +quassias +quassiin +quassin +quassins +quat +quata +quatch +quate +quatenus +quatercentenary +quaterion +quatern +quaternal +quaternary +quaternarian +quaternaries +quaternarius +quaternate +quaternion +quaternionic +quaternionist +quaternitarian +quaternity +quaternities +quateron +quaters +quatertenses +quatorzain +quatorze +quatorzes +quatrayle +quatrain +quatrains +quatral +quatre +quatreble +quatrefeuille +quatrefoil +quatrefoiled +quatrefoils +quatrefoliated +quatres +quatrible +quatrin +quatrino +quatrocentism +quatrocentist +quatrocento +quatsino +quatty +quattie +quattrini +quattrino +quattrocento +quattuordecillion +quattuordecillionth +quatuor +quatuorvirate +quauk +quave +quaver +quavered +quaverer +quaverers +quavery +quaverymavery +quavering +quaveringly +quaverous +quavers +quaviver +quaw +quawk +qubba +que +queach +queachy +queachier +queachiest +queak +queal +quean +queanish +queanlike +queans +quease +queasy +queasier +queasiest +queasily +queasiness +queasom +queazen +queazy +queazier +queaziest +quebec +quebrachamine +quebrachine +quebrachite +quebrachitol +quebracho +quebrada +quebradilla +quebrith +quechua +quechuan +quedful +quedly +quedness +quedship +queechy +queen +queencake +queencraft +queencup +queendom +queened +queenfish +queenfishes +queenhood +queening +queenite +queenless +queenlet +queenly +queenlier +queenliest +queenlike +queenliness +queenright +queenroot +queens +queensberry +queensberries +queenship +queensware +queenweed +queenwood +queer +queered +queerer +queerest +queery +queering +queerish +queerishness +queerity +queerly +queerness +queers +queersome +queest +queesting +queet +queeve +quegh +quei +quey +queing +queintise +queys +quelch +quelea +quelite +quell +quellable +quelled +queller +quellers +quelling +quellio +quells +quellung +quelme +quelquechose +quelt +quem +quemado +queme +quemeful +quemefully +quemely +quench +quenchable +quenchableness +quenched +quencher +quenchers +quenches +quenching +quenchless +quenchlessly +quenchlessness +quenda +quenelle +quenelles +quenite +quenselite +quent +quentise +quercetagetin +quercetic +quercetin +quercetum +quercic +querciflorae +quercimeritrin +quercin +quercine +quercinic +quercitannic +quercitannin +quercite +quercitin +quercitol +quercitrin +quercitron +quercivorous +quercus +querecho +querela +querelae +querele +querencia +querendi +querendy +querent +queres +query +querida +queridas +querido +queridos +queried +querier +queriers +queries +querying +queryingly +queryist +queriman +querimans +querimony +querimonies +querimonious +querimoniously +querimoniousness +querist +querists +querken +querl +quern +quernal +quernales +querns +quernstone +querre +quersprung +querulant +querulation +querulent +querulential +querulist +querulity +querulosity +querulous +querulously +querulousness +ques +quesal +quesited +quesitive +quest +quested +quester +questers +questeur +questful +questhouse +questing +questingly +question +questionability +questionable +questionableness +questionably +questionary +questionaries +questioned +questionee +questioner +questioners +questioning +questioningly +questionings +questionist +questionle +questionless +questionlessly +questionlessness +questionnaire +questionnaires +questionous +questions +questionwise +questman +questmen +questmonger +questor +questorial +questors +questorship +questrist +quests +quet +quetch +quetenite +quethe +quetsch +quetzal +quetzalcoatl +quetzales +quetzals +queue +queued +queueing +queuer +queuers +queues +queuing +quezal +quezales +quezals +qui +quia +quiangan +quiapo +quiaquia +quib +quibble +quibbled +quibbleproof +quibbler +quibblers +quibbles +quibbling +quibblingly +quiblet +quibus +quica +quiche +quiches +quick +quickbeam +quickborn +quicked +quicken +quickenance +quickenbeam +quickened +quickener +quickening +quickens +quicker +quickest +quickfoot +quickhatch +quickhearted +quickie +quickies +quicking +quickly +quicklime +quickness +quicks +quicksand +quicksandy +quicksands +quickset +quicksets +quickside +quicksilver +quicksilvery +quicksilvering +quicksilverish +quicksilverishness +quickstep +quicksteps +quickthorn +quickwater +quickwittedness +quickwork +quid +quidae +quidam +quiddany +quiddative +quidder +quiddist +quiddit +quidditative +quidditatively +quiddity +quiddities +quiddle +quiddled +quiddler +quiddling +quidnunc +quidnuncs +quids +quienal +quiesce +quiesced +quiescence +quiescency +quiescent +quiescently +quiescing +quiet +quieta +quietable +quietage +quieted +quieten +quietened +quietener +quietening +quietens +quieter +quieters +quietest +quieti +quieting +quietism +quietisms +quietist +quietistic +quietists +quietive +quietly +quietlike +quietness +quiets +quietsome +quietude +quietudes +quietus +quietuses +quiff +quiffing +quiffs +quiina +quiinaceae +quiinaceous +quila +quilate +quileces +quiles +quileses +quileute +quilez +quilisma +quilkin +quill +quillagua +quillai +quillaia +quillaias +quillaic +quillais +quillaja +quillajas +quillajic +quillback +quillbacks +quilled +quiller +quillet +quilleted +quillets +quillfish +quillfishes +quilly +quilling +quillity +quillon +quills +quilltail +quillwork +quillwort +quilt +quilted +quilter +quilters +quilting +quiltings +quilts +quim +quimbaya +quimper +quin +quina +quinacrine +quinaielt +quinaldic +quinaldyl +quinaldin +quinaldine +quinaldinic +quinaldinium +quinamicin +quinamicine +quinamidin +quinamidine +quinamin +quinamine +quinanarii +quinanisole +quinaquina +quinary +quinarian +quinaries +quinarii +quinarius +quinas +quinate +quinatoxin +quinatoxine +quinault +quinazolyl +quinazolin +quinazoline +quince +quincentenary +quincentennial +quinces +quincewort +quinch +quincy +quincies +quincubital +quincubitalism +quincuncial +quincuncially +quincunx +quincunxes +quincunxial +quindecad +quindecagon +quindecangle +quindecaplet +quindecasyllabic +quindecemvir +quindecemvirate +quindecemviri +quindecennial +quindecylic +quindecillion +quindecillionth +quindecim +quindecima +quindecimvir +quindene +quinela +quinelas +quinella +quinellas +quinet +quinetum +quingentenary +quinhydrone +quinia +quinible +quinic +quinicin +quinicine +quinidia +quinidin +quinidine +quiniela +quinielas +quinyie +quinyl +quinin +quinina +quininas +quinine +quinines +quininiazation +quininic +quininism +quininize +quinins +quiniretin +quinisext +quinisextine +quinism +quinite +quinitol +quinizarin +quinize +quink +quinnat +quinnats +quinnet +quinnipiac +quinoa +quinoas +quinocarbonium +quinoform +quinogen +quinoid +quinoidal +quinoidation +quinoidin +quinoidine +quinoids +quinoyl +quinol +quinolas +quinolyl +quinolin +quinoline +quinolinic +quinolinyl +quinolinium +quinolins +quinology +quinologist +quinols +quinometry +quinon +quinone +quinonediimine +quinones +quinonic +quinonyl +quinonimin +quinonimine +quinonization +quinonize +quinonoid +quinopyrin +quinotannic +quinotoxine +quinova +quinovatannic +quinovate +quinovic +quinovin +quinovose +quinoxalyl +quinoxalin +quinoxaline +quinquagenary +quinquagenarian +quinquagenaries +quinquagesima +quinquagesimal +quinquangle +quinquarticular +quinquatria +quinquatrus +quinquecapsular +quinquecentenary +quinquecostate +quinquedentate +quinquedentated +quinquefarious +quinquefid +quinquefoil +quinquefoliate +quinquefoliated +quinquefoliolate +quinquegrade +quinquejugous +quinquelateral +quinqueliteral +quinquelobate +quinquelobated +quinquelobed +quinquelocular +quinqueloculine +quinquenary +quinquenerval +quinquenerved +quinquennalia +quinquennia +quinquenniad +quinquennial +quinquennialist +quinquennially +quinquennium +quinquenniums +quinquepartite +quinquepartition +quinquepedal +quinquepedalian +quinquepetaloid +quinquepunctal +quinquepunctate +quinqueradial +quinqueradiate +quinquereme +quinquertium +quinquesect +quinquesection +quinqueseptate +quinqueserial +quinqueseriate +quinquesyllabic +quinquesyllable +quinquetubercular +quinquetuberculate +quinquevalence +quinquevalency +quinquevalent +quinquevalve +quinquevalvous +quinquevalvular +quinqueverbal +quinqueverbial +quinquevir +quinquevirate +quinquevirs +quinquiliteral +quinquina +quinquino +quinquivalent +quins +quinse +quinsy +quinsyberry +quinsyberries +quinsied +quinsies +quinsywort +quint +quinta +quintad +quintadena +quintadene +quintain +quintains +quintal +quintals +quintan +quintans +quintant +quintar +quintary +quintars +quintaten +quintato +quinte +quintefoil +quintelement +quintennial +quinternion +quinteron +quinteroon +quintes +quintescence +quintessence +quintessential +quintessentiality +quintessentially +quintessentiate +quintet +quintets +quintette +quintetto +quintfoil +quintic +quintics +quintile +quintiles +quintilis +quintillian +quintillion +quintillions +quintillionth +quintillionths +quintin +quintins +quintiped +quintius +quinto +quintocubital +quintocubitalism +quintole +quinton +quintons +quintroon +quints +quintuple +quintupled +quintuples +quintuplet +quintuplets +quintuplicate +quintuplicated +quintuplicates +quintuplicating +quintuplication +quintuplinerved +quintupling +quintupliribbed +quintus +quinua +quinuclidine +quinzaine +quinze +quinzieme +quip +quipful +quipo +quippe +quipped +quipper +quippy +quipping +quippish +quippishness +quippu +quippus +quips +quipsome +quipsomeness +quipster +quipsters +quipu +quipus +quira +quircal +quire +quired +quires +quirewise +quirinal +quirinalia +quirinca +quiring +quiritary +quiritarian +quirite +quirites +quirk +quirked +quirky +quirkier +quirkiest +quirkily +quirkiness +quirking +quirkish +quirks +quirksey +quirksome +quirl +quirquincho +quirt +quirted +quirting +quirts +quis +quisby +quiscos +quisle +quisler +quisling +quislingism +quislingistic +quislings +quisqualis +quisqueite +quisquilian +quisquiliary +quisquilious +quisquous +quist +quistiti +quistron +quisutsch +quit +quitantie +quitch +quitches +quitclaim +quitclaimed +quitclaiming +quitclaims +quite +quitely +quitemoca +quiteno +quiteve +quiting +quito +quitrent +quitrents +quits +quittable +quittal +quittance +quittances +quitted +quitter +quitterbone +quitters +quitting +quittor +quittors +quitu +quiver +quivered +quiverer +quiverers +quiverful +quivery +quivering +quiveringly +quiverish +quiverleaf +quivers +quixote +quixotes +quixotic +quixotical +quixotically +quixotism +quixotize +quixotry +quixotries +quiz +quizmaster +quizzability +quizzable +quizzacious +quizzatorial +quizzed +quizzee +quizzer +quizzery +quizzers +quizzes +quizzy +quizzical +quizzicality +quizzically +quizzicalness +quizzify +quizzification +quizziness +quizzing +quizzingly +quizzish +quizzism +quizzity +qung +quo +quoad +quod +quodded +quoddies +quodding +quoddity +quodlibet +quodlibetal +quodlibetary +quodlibetarian +quodlibetic +quodlibetical +quodlibetically +quodlibetz +quodling +quods +quohog +quohogs +quoilers +quoin +quoined +quoining +quoins +quoit +quoited +quoiter +quoiting +quoitlike +quoits +quokka +quokkas +quominus +quomodo +quomodos +quondam +quondamly +quondamship +quoniam +quonking +quonset +quop +quor +quoratean +quorum +quorums +quos +quot +quota +quotability +quotable +quotableness +quotably +quotas +quotation +quotational +quotationally +quotationist +quotations +quotative +quote +quoted +quotee +quoteless +quotennial +quoter +quoters +quotes +quoteworthy +quoth +quotha +quotid +quotidian +quotidianly +quotidianness +quotient +quotients +quoties +quotiety +quotieties +quoting +quotingly +quotity +quotlibet +quott +quotum +qursh +qurshes +qurti +qurush +qurushes +qv +r +ra +raad +raadzaal +raanan +raasch +raash +rab +rabal +raband +rabanna +rabat +rabatine +rabato +rabatos +rabatte +rabatted +rabattement +rabatting +rabban +rabbanim +rabbanist +rabbanite +rabbet +rabbeted +rabbeting +rabbets +rabbi +rabbies +rabbin +rabbinate +rabbinates +rabbindom +rabbinic +rabbinica +rabbinical +rabbinically +rabbinism +rabbinist +rabbinistic +rabbinistical +rabbinite +rabbinitic +rabbinize +rabbins +rabbinship +rabbis +rabbish +rabbiship +rabbit +rabbitberry +rabbitberries +rabbited +rabbiteye +rabbiter +rabbiters +rabbitfish +rabbitfishes +rabbithearted +rabbity +rabbiting +rabbitlike +rabbitmouth +rabbitoh +rabbitproof +rabbitry +rabbitries +rabbitroot +rabbits +rabbitskin +rabbitweed +rabbitwise +rabbitwood +rabble +rabbled +rabblelike +rabblement +rabbleproof +rabbler +rabblers +rabbles +rabblesome +rabbling +rabboni +rabbonim +rabbonis +rabdomancy +rabelais +rabelaisian +rabelaisianism +rabelaism +rabfak +rabi +rabiator +rabic +rabid +rabidity +rabidities +rabidly +rabidness +rabies +rabietic +rabific +rabiform +rabigenic +rabin +rabinet +rabious +rabirubia +rabitic +rablin +rabot +rabulistic +rabulous +racahout +racallable +racche +raccoon +raccoonberry +raccoons +raccroc +race +raceabout +racebrood +racecard +racecourse +racecourses +raced +racegoer +racegoing +racehorse +racehorses +racelike +raceline +racemase +racemate +racemates +racemation +raceme +racemed +racemes +racemic +racemiferous +racemiform +racemism +racemisms +racemization +racemize +racemized +racemizes +racemizing +racemocarbonate +racemocarbonic +racemoid +racemomethylate +racemose +racemosely +racemous +racemously +racemule +racemulose +raceplate +racer +racers +racerunner +races +racetrack +racetracker +racetracks +racette +raceway +raceways +rach +rache +rachel +raches +rachet +rachets +rachial +rachialgia +rachialgic +rachianalgesia +rachianectes +rachianesthesia +rachicentesis +rachycentridae +rachycentron +rachides +rachidial +rachidian +rachiform +rachiglossa +rachiglossate +rachigraph +rachilla +rachillae +rachiocentesis +rachiocyphosis +rachiococainize +rachiodynia +rachiodont +rachiometer +rachiomyelitis +rachioparalysis +rachioplegia +rachioscoliosis +rachiotome +rachiotomy +rachipagus +rachis +rachischisis +rachises +rachitic +rachitides +rachitis +rachitism +rachitogenic +rachitome +rachitomy +rachitomous +racy +racial +racialism +racialist +racialistic +racialists +raciality +racialization +racialize +racially +racier +raciest +racily +racinage +raciness +racinesses +racing +racinglike +racings +racion +racism +racisms +racist +racists +rack +rackabones +rackan +rackapee +rackateer +rackateering +rackboard +rackbone +racked +racker +rackers +racket +racketed +racketeer +racketeering +racketeers +racketer +rackety +racketier +racketiest +racketiness +racketing +racketlike +racketproof +racketry +rackets +rackett +rackettail +rackful +racking +rackingly +rackle +rackless +rackman +rackmaster +racknumber +rackproof +rackrentable +racks +rackway +rackwork +rackworks +raclette +raclettes +racloir +racoyian +racon +racons +raconteur +raconteurs +raconteuses +racoon +racoons +racovian +racquet +racquetball +racquets +rad +rada +radar +radarman +radarmen +radars +radarscope +radarscopes +radded +radding +raddle +raddled +raddleman +raddlemen +raddles +raddling +raddlings +radeau +radeaux +radectomy +radectomieseph +radek +radeur +radevore +radford +radiability +radiable +radiably +radiac +radial +radiale +radialia +radialis +radiality +radialization +radialize +radially +radials +radian +radiance +radiances +radiancy +radiancies +radians +radiant +radiantly +radiantness +radiants +radiary +radiata +radiate +radiated +radiately +radiateness +radiates +radiatics +radiatiform +radiating +radiation +radiational +radiationless +radiations +radiative +radiatopatent +radiatoporose +radiatoporous +radiator +radiatory +radiators +radiatostriate +radiatosulcate +radiature +radiatus +radical +radicalism +radicality +radicalization +radicalize +radicalized +radicalizes +radicalizing +radically +radicalness +radicals +radicand +radicands +radicant +radicate +radicated +radicates +radicating +radication +radicel +radicels +radices +radicicola +radicicolous +radiciferous +radiciflorous +radiciform +radicivorous +radicle +radicles +radicolous +radicose +radicula +radicular +radicule +radiculectomy +radiculitis +radiculose +radidii +radiectomy +radient +radiescent +radiesthesia +radiferous +radii +radio +radioacoustics +radioactinium +radioactivate +radioactivated +radioactivating +radioactive +radioactively +radioactivity +radioactivities +radioamplifier +radioanaphylaxis +radioastronomy +radioautograph +radioautography +radioautographic +radiobicipital +radiobiology +radiobiologic +radiobiological +radiobiologically +radiobiologist +radiobroadcast +radiobroadcasted +radiobroadcaster +radiobroadcasters +radiobroadcasting +radiobserver +radiocalcium +radiocarbon +radiocarpal +radiocast +radiocaster +radiocasting +radiochemical +radiochemically +radiochemist +radiochemistry +radiocinematograph +radiocommunication +radioconductor +radiocopper +radiodating +radiode +radiodermatitis +radiodetector +radiodiagnoses +radiodiagnosis +radiodigital +radiodynamic +radiodynamics +radiodontia +radiodontic +radiodontics +radiodontist +radioecology +radioecological +radioecologist +radioed +radioelement +radiofrequency +radiogenic +radiogoniometer +radiogoniometry +radiogoniometric +radiogram +radiograms +radiograph +radiographer +radiography +radiographic +radiographical +radiographically +radiographies +radiographs +radiohumeral +radioing +radioiodine +radioiron +radioisotope +radioisotopes +radioisotopic +radioisotopically +radiolabel +radiolaria +radiolarian +radiolead +radiolysis +radiolite +radiolites +radiolitic +radiolytic +radiolitidae +radiolocation +radiolocator +radiolocators +radiology +radiologic +radiological +radiologically +radiologies +radiologist +radiologists +radiolucence +radiolucency +radiolucencies +radiolucent +radioluminescence +radioluminescent +radioman +radiomedial +radiomen +radiometallography +radiometeorograph +radiometer +radiometers +radiometry +radiometric +radiometrically +radiometries +radiomicrometer +radiomicrophone +radiomimetic +radiomobile +radiomovies +radiomuscular +radion +radionecrosis +radioneuritis +radionic +radionics +radionuclide +radiopacity +radiopalmar +radiopaque +radioparent +radiopathology +radiopelvimetry +radiophare +radiopharmaceutical +radiophysics +radiophone +radiophones +radiophony +radiophonic +radiophosphorus +radiophoto +radiophotogram +radiophotograph +radiophotography +radiopotassium +radiopraxis +radioprotection +radioprotective +radiorays +radios +radioscope +radioscopy +radioscopic +radioscopical +radiosensibility +radiosensitive +radiosensitivity +radiosensitivities +radiosymmetrical +radiosodium +radiosonde +radiosondes +radiosonic +radiostereoscopy +radiosterilization +radiosterilize +radiosterilized +radiostrontium +radiosurgery +radiosurgeries +radiosurgical +radiotechnology +radiotelegram +radiotelegraph +radiotelegrapher +radiotelegraphy +radiotelegraphic +radiotelegraphically +radiotelegraphs +radiotelemetry +radiotelemetric +radiotelemetries +radiotelephone +radiotelephoned +radiotelephones +radiotelephony +radiotelephonic +radiotelephoning +radioteletype +radioteria +radiothallium +radiotherapeutic +radiotherapeutics +radiotherapeutist +radiotherapy +radiotherapies +radiotherapist +radiotherapists +radiothermy +radiothorium +radiotoxemia +radiotoxic +radiotracer +radiotransparency +radiotransparent +radiotrician +radiotron +radiotropic +radiotropism +radious +radiov +radiovision +radish +radishes +radishlike +radium +radiumization +radiumize +radiumlike +radiumproof +radiums +radiumtherapy +radius +radiuses +radix +radixes +radknight +radly +radman +radome +radomes +radon +radons +rads +radsimir +radula +radulae +radular +radulas +radulate +raduliferous +raduliform +radzimir +rafael +rafale +rafe +raff +raffaelesque +raffe +raffee +raffery +raffia +raffias +raffinase +raffinate +raffing +raffinose +raffish +raffishly +raffishness +raffle +raffled +raffler +rafflers +raffles +rafflesia +rafflesiaceae +rafflesiaceous +raffling +raffman +raffs +rafik +rafraichissoir +raft +raftage +rafted +rafter +rafters +rafty +raftiness +rafting +raftlike +raftman +rafts +raftsman +raftsmen +rag +raga +ragabash +ragabrash +ragamuffin +ragamuffinism +ragamuffinly +ragamuffins +ragas +ragazze +ragbag +ragbags +ragbolt +rage +raged +ragee +ragees +rageful +ragefully +rageless +rageous +rageously +rageousness +rageproof +rager +ragery +rages +ragesome +ragfish +ragfishes +ragged +raggeder +raggedest +raggedy +raggedly +raggedness +raggee +ragger +raggery +raggety +raggy +raggies +raggil +raggily +ragging +raggle +raggled +raggles +raghouse +raghu +ragi +raging +ragingly +ragis +raglan +raglanite +raglans +raglet +raglin +ragman +ragmen +ragnar +ragnarok +ragondin +ragout +ragouted +ragouting +ragouts +ragpicker +rags +ragseller +ragshag +ragsorter +ragstone +ragtag +ragtags +ragtime +ragtimey +ragtimer +ragtimes +ragule +raguly +ragusye +ragweed +ragweeds +ragwork +ragworm +ragwort +ragworts +rah +rahanwin +rahdar +rahdaree +rahdari +rahul +ray +raia +raya +raiae +rayage +rayah +rayahs +rayan +raias +rayas +rayat +raid +raided +raider +raiders +raiding +raidproof +raids +rayed +raif +rayful +raygrass +raygrasses +raiyat +raiidae +raiiform +raying +rail +railage +railbird +railbirds +railcar +railed +railer +railers +rayless +raylessly +raylessness +raylet +railhead +railheads +railing +railingly +railings +raillery +railleries +railless +railleur +railly +raillike +railman +railmen +railriding +railroad +railroadana +railroaded +railroader +railroaders +railroadiana +railroading +railroadish +railroads +railroadship +rails +railside +railway +railwaydom +railwayed +railwayless +railwayman +railways +raimannia +raiment +raimented +raimentless +raiments +raymond +rain +rainband +rainbands +rainbird +rainbirds +rainbound +rainbow +rainbowy +rainbowlike +rainbows +rainbowweed +rainburst +raincheck +raincoat +raincoats +raindrop +raindrops +rained +rainer +raines +rainfall +rainfalls +rainforest +rainfowl +rainful +rainy +rainier +rainiest +rainily +raininess +raining +rainless +rainlessness +rainlight +rainmaker +rainmakers +rainmaking +rainout +rainouts +rainproof +rainproofer +rains +rainspout +rainsquall +rainstorm +rainstorms +raintight +rainwash +rainwashes +rainwater +rainwear +rainwears +rainworm +raioid +rayon +rayonnance +rayonnant +rayonne +rayonny +rayons +rais +rays +raisable +raise +raiseable +raised +raiseman +raiser +raisers +raises +raisin +raisine +raising +raisings +raisiny +raisins +raison +raisonne +raisons +raj +raja +rajab +rajah +rajahs +rajarshi +rajas +rajaship +rajasic +rajasthani +rajbansi +rajeev +rajendra +rajes +rajesh +rajidae +rajiv +rajoguna +rajpoot +rajput +rakan +rake +rakeage +raked +rakee +rakees +rakeful +rakehell +rakehelly +rakehellish +rakehells +rakely +rakeoff +rakeoffs +raker +rakery +rakers +rakes +rakeshame +rakesteel +rakestele +rakh +rakhal +raki +rakija +rakily +raking +rakingly +rakis +rakish +rakishly +rakishness +rakit +rakshasa +raku +rale +rales +ralf +ralish +rall +rallentando +rallery +rally +ralliance +rallycross +rallidae +rallye +rallied +rallier +ralliers +rallies +rallyes +ralliform +rallying +rallyings +rallyist +rallyists +rallymaster +rallinae +ralline +rallus +ralph +rals +ralstonite +ram +rama +ramack +ramada +ramadan +ramadoss +ramage +ramaism +ramaite +ramal +raman +ramanan +ramanas +ramarama +ramark +ramass +ramate +rambarre +rambeh +ramberge +rambla +ramble +rambled +rambler +ramblers +rambles +rambling +ramblingly +ramblingness +ramblings +rambo +rambong +rambooze +rambouillet +rambunctious +rambunctiously +rambunctiousness +rambure +rambutan +rambutans +ramdohrite +rame +rameal +ramean +ramed +ramee +ramees +ramekin +ramekins +ramellose +rament +ramenta +ramentaceous +ramental +ramentiferous +ramentum +rameous +ramequin +ramequins +rameses +rameseum +ramesh +ramessid +ramesside +ramet +ramets +ramex +ramfeezled +ramforce +ramgunshoch +ramhead +ramhood +rami +ramicorn +ramie +ramies +ramiferous +ramify +ramificate +ramification +ramifications +ramified +ramifies +ramifying +ramiflorous +ramiform +ramigerous +ramilie +ramilies +ramillie +ramillied +ramillies +ramiparous +ramiro +ramisection +ramisectomy +ramism +ramist +ramistical +ramjet +ramjets +ramlike +ramline +rammack +rammage +rammass +rammed +rammel +rammelsbergite +rammer +rammerman +rammermen +rammers +rammi +rammy +rammier +rammiest +ramming +rammish +rammishly +rammishness +ramneek +ramnenses +ramnes +ramon +ramona +ramoneur +ramoon +ramoosii +ramose +ramosely +ramosity +ramosities +ramosopalmate +ramosopinnate +ramososubdivided +ramous +ramp +rampacious +rampaciously +rampage +rampaged +rampageous +rampageously +rampageousness +rampager +rampagers +rampages +rampaging +rampagious +rampallion +rampancy +rampancies +rampant +rampantly +rampantness +rampart +ramparted +ramparting +ramparts +ramped +ramper +ramphastidae +ramphastides +ramphastos +rampick +rampier +rampike +rampikes +ramping +rampingly +rampion +rampions +rampire +rampish +rampler +ramplor +rampole +rampoled +rampoles +rampoling +ramps +rampsman +ramrace +ramrod +ramroddy +ramrodlike +ramrods +rams +ramscallion +ramsch +ramsey +ramshackle +ramshackled +ramshackleness +ramshackly +ramshorn +ramshorns +ramson +ramsons +ramstam +ramstead +ramta +ramtil +ramtils +ramular +ramule +ramuliferous +ramulose +ramulous +ramulus +ramus +ramuscule +ramusi +ramverse +ran +rana +ranal +ranales +ranaria +ranarian +ranarium +ranatra +rance +rancel +rancellor +rancelman +rancelmen +rancer +rances +rancescent +ranch +ranche +ranched +rancher +rancheria +rancherie +ranchero +rancheros +ranchers +ranches +ranching +ranchless +ranchlike +ranchman +ranchmen +rancho +ranchos +ranchwoman +rancid +rancidify +rancidification +rancidified +rancidifying +rancidity +rancidities +rancidly +rancidness +rancio +rancor +rancored +rancorous +rancorously +rancorousness +rancorproof +rancors +rancour +rancours +rand +randal +randall +randallite +randan +randannite +randans +randell +randem +rander +randers +randy +randia +randie +randier +randies +randiest +randiness +randing +randir +randite +randle +randn +randolph +random +randomish +randomization +randomize +randomized +randomizer +randomizes +randomizing +randomly +randomness +randoms +randomwise +randon +randori +rands +rane +ranee +ranees +ranella +ranere +ranforce +rang +rangale +rangatira +rangdoodles +range +ranged +rangefinder +rangeheads +rangey +rangeland +rangelands +rangeless +rangeman +rangemen +ranger +rangers +rangership +ranges +rangework +rangy +rangier +rangiest +rangifer +rangiferine +ranginess +ranging +rangle +rangler +rangoon +rangpur +rani +ranid +ranidae +ranids +raniferous +raniform +ranina +raninae +ranine +raninian +ranis +ranivorous +ranjit +rank +ranked +ranker +rankers +rankest +ranket +rankett +rankine +ranking +rankings +rankish +rankle +rankled +rankles +rankless +rankly +rankling +ranklingly +rankness +ranknesses +ranks +ranksman +ranksmen +rankwise +ranli +rann +rannel +ranny +rannigal +ranomer +ranomers +ranpike +ranpikes +ranquel +ransack +ransacked +ransacker +ransackers +ransacking +ransackle +ransacks +ransel +ranselman +ranselmen +ranses +ranseur +ransom +ransomable +ransomed +ransomer +ransomers +ransomfree +ransoming +ransomless +ransoms +ranstead +rant +rantan +rantankerous +ranted +rantepole +ranter +ranterism +ranters +ranty +ranting +rantingly +rantipole +rantism +rantize +rantock +rantoon +rantree +rants +ranula +ranular +ranulas +ranunculaceae +ranunculaceous +ranunculales +ranunculi +ranunculus +ranunculuses +ranzania +raob +raoulia +rap +rapaces +rapaceus +rapacious +rapaciously +rapaciousness +rapacity +rapacities +rapakivi +rapallo +rapanea +rapateaceae +rapateaceous +rape +raped +rapeful +rapeye +rapely +rapeoil +raper +rapers +rapes +rapeseed +rapeseeds +raphae +raphael +raphaelesque +raphaelic +raphaelism +raphaelite +raphaelitism +raphany +raphania +raphanus +raphe +raphes +raphia +raphias +raphide +raphides +raphidiferous +raphidiid +raphidiidae +raphidodea +raphidoidea +raphiolepis +raphis +raphus +rapic +rapid +rapidamente +rapide +rapider +rapidest +rapidity +rapidities +rapidly +rapidness +rapido +rapids +rapier +rapiered +rapiers +rapilli +rapillo +rapine +rapiner +rapines +raping +rapinic +rapist +rapists +raploch +raport +rappage +rapparee +rapparees +rappe +rapped +rappee +rappees +rappel +rappeling +rappelled +rappelling +rappels +rappen +rapper +rappers +rapping +rappini +rappist +rappite +rapport +rapporteur +rapports +rapprochement +rapprochements +raps +rapscallion +rapscallionism +rapscallionly +rapscallionry +rapscallions +rapt +raptatory +raptatorial +rapter +raptest +raptly +raptness +raptnesses +raptor +raptores +raptorial +raptorious +raptors +raptril +rapture +raptured +raptureless +raptures +raptury +rapturing +rapturist +rapturize +rapturous +rapturously +rapturousness +raptus +raquet +raquette +rara +rare +rarebit +rarebits +rarefaction +rarefactional +rarefactive +rarefy +rarefiable +rarefication +rarefied +rarefier +rarefiers +rarefies +rarefying +rareyfy +rarely +rareness +rarenesses +rarer +rareripe +rareripes +rarest +rarety +rareties +rariconstant +rariety +rarify +rarified +rarifies +rarifying +raring +rariora +rarish +rarity +rarities +rarotongan +ras +rasa +rasalas +rasalhague +rasamala +rasant +rasbora +rasboras +rascacio +rascal +rascaldom +rascaless +rascalion +rascalism +rascality +rascalities +rascalize +rascally +rascallike +rascallion +rascalry +rascals +rascalship +rascasse +rasceta +rascette +rase +rased +rasen +rasenna +raser +rasers +rases +rasgado +rash +rashbuss +rasher +rashers +rashes +rashest +rashful +rashing +rashly +rashlike +rashness +rashnesses +rashti +rasing +rasion +raskolnik +rasoir +rason +rasophore +rasores +rasorial +rasour +rasp +raspatory +raspatorium +raspberry +raspberriade +raspberries +raspberrylike +rasped +rasper +raspers +raspy +raspier +raspiest +raspiness +rasping +raspingly +raspingness +raspings +raspis +raspish +raspite +rasps +rassasy +rasse +rasselas +rassle +rassled +rassles +rassling +rastaban +rastafarian +rastafarianism +raster +rasters +rasty +rastik +rastle +rastled +rastling +rastus +rasure +rasures +rat +rata +ratability +ratable +ratableness +ratably +ratafee +ratafees +ratafia +ratafias +ratal +ratals +ratan +ratanhia +ratany +ratanies +ratans +rataplan +rataplanned +rataplanning +rataplans +ratatat +ratatats +ratatouille +ratbag +ratbaggery +ratbite +ratcatcher +ratcatching +ratch +ratchel +ratchelly +ratcher +ratches +ratchet +ratchety +ratchetlike +ratchets +ratching +ratchment +rate +rateability +rateable +rateableness +rateably +rated +rateen +ratel +rateless +ratels +ratement +ratemeter +ratepayer +ratepaying +rater +ratero +raters +rates +ratfink +ratfinks +ratfish +ratfishes +rath +ratha +rathe +rathed +rathely +ratheness +rather +ratherest +ratheripe +ratherish +ratherly +rathest +ratheter +rathite +rathnakumar +rathole +ratholes +rathripe +rathskeller +rathskellers +raticidal +raticide +raticides +raticocinator +ratify +ratifia +ratification +ratificationist +ratified +ratifier +ratifiers +ratifies +ratifying +ratihabition +ratine +ratines +rating +ratings +ratio +ratiocinant +ratiocinate +ratiocinated +ratiocinates +ratiocinating +ratiocination +ratiocinations +ratiocinative +ratiocinator +ratiocinatory +ratiocinators +ratiometer +ration +rationable +rationably +rational +rationale +rationales +rationalisation +rationalise +rationalised +rationaliser +rationalising +rationalism +rationalist +rationalistic +rationalistical +rationalistically +rationalisticism +rationalists +rationality +rationalities +rationalizable +rationalization +rationalizations +rationalize +rationalized +rationalizer +rationalizers +rationalizes +rationalizing +rationally +rationalness +rationals +rationate +rationed +rationing +rationless +rationment +rations +ratios +ratitae +ratite +ratites +ratitous +ratiuncle +ratlike +ratlin +ratline +ratliner +ratlines +ratlins +rato +ratoon +ratooned +ratooner +ratooners +ratooning +ratoons +ratos +ratproof +rats +ratsbane +ratsbanes +ratskeller +rattage +rattail +rattails +rattan +rattans +rattaree +rattattoo +ratted +ratteen +ratteens +rattel +ratten +rattened +rattener +ratteners +rattening +rattens +ratter +rattery +ratters +ratti +ratty +rattier +rattiest +rattinet +ratting +rattingly +rattish +rattle +rattlebag +rattlebones +rattlebox +rattlebrain +rattlebrained +rattlebrains +rattlebush +rattled +rattlehead +rattleheaded +rattlejack +rattlemouse +rattlenut +rattlepate +rattlepated +rattlepod +rattleproof +rattler +rattleran +rattleroot +rattlers +rattlertree +rattles +rattleskull +rattleskulled +rattlesnake +rattlesnakes +rattlesome +rattletybang +rattletrap +rattletraps +rattleweed +rattlewort +rattly +rattling +rattlingly +rattlingness +rattlings +ratton +rattoner +rattons +rattoon +rattooned +rattooning +rattoons +rattrap +rattraps +rattus +ratwa +ratwood +raucid +raucidity +raucity +raucities +raucorous +raucous +raucously +raucousness +raught +raughty +raugrave +rauk +raukle +raul +rauli +raun +raunchy +raunchier +raunchiest +raunchily +raunchiness +raunge +raunpick +raupo +rauque +rauraci +raurici +rauriki +rauwolfia +ravage +ravaged +ravagement +ravager +ravagers +ravages +ravaging +rave +raved +ravehook +raveinelike +ravel +raveled +raveler +ravelers +ravelin +raveling +ravelings +ravelins +ravelled +raveller +ravellers +ravelly +ravelling +ravellings +ravelment +ravelproof +ravels +raven +ravenala +ravendom +ravenduck +ravened +ravenelia +ravener +raveners +ravenhood +ravening +raveningly +ravenings +ravenish +ravenlike +ravenling +ravenous +ravenously +ravenousness +ravenry +ravens +ravensara +ravenstone +ravenwise +raver +ravery +ravers +raves +ravi +ravigote +ravigotes +ravin +ravinate +ravindran +ravindranath +ravine +ravined +raviney +ravinement +ravines +raving +ravingly +ravings +ravining +ravins +ravioli +raviolis +ravish +ravished +ravishedly +ravisher +ravishers +ravishes +ravishing +ravishingly +ravishingness +ravishment +ravishments +ravison +ravissant +raw +rawbone +rawboned +rawbones +rawer +rawest +rawhead +rawhide +rawhided +rawhider +rawhides +rawhiding +rawin +rawing +rawinsonde +rawish +rawishness +rawky +rawly +rawness +rawnesses +rawnie +raws +rax +raxed +raxes +raxing +raze +razed +razee +razeed +razeeing +razees +razeing +razer +razers +razes +razing +razoo +razor +razorable +razorback +razorbill +razored +razoredge +razorfish +razorfishes +razoring +razorless +razormaker +razormaking +razorman +razors +razorstrop +razoumofskya +razour +razz +razzberry +razzberries +razzed +razzer +razzes +razzia +razzing +razzle +razzly +razzmatazz +rbound +rc +rcd +rchauff +rchitect +rclame +rcpt +rct +rcvr +rd +re +rea +reaal +reabandon +reabandoned +reabandoning +reabandons +reabbreviate +reabbreviated +reabbreviates +reabbreviating +reable +reabolish +reabolition +reabridge +reabridged +reabridging +reabsence +reabsent +reabsolve +reabsorb +reabsorbed +reabsorbing +reabsorbs +reabsorption +reabuse +reaccede +reacceded +reaccedes +reacceding +reaccelerate +reaccelerated +reaccelerating +reaccent +reaccented +reaccenting +reaccents +reaccentuate +reaccentuated +reaccentuating +reaccept +reacceptance +reaccepted +reaccepting +reaccepts +reaccess +reaccession +reacclaim +reacclimate +reacclimated +reacclimates +reacclimating +reacclimatization +reacclimatize +reacclimatized +reacclimatizing +reaccommodate +reaccommodated +reaccommodates +reaccommodating +reaccomodated +reaccompany +reaccompanied +reaccompanies +reaccompanying +reaccomplish +reaccomplishment +reaccord +reaccost +reaccount +reaccredit +reaccredited +reaccrediting +reaccredits +reaccrue +reaccumulate +reaccumulated +reaccumulating +reaccumulation +reaccusation +reaccuse +reaccused +reaccuses +reaccusing +reaccustom +reaccustomed +reaccustoming +reaccustoms +reacetylation +reach +reachability +reachable +reachableness +reachably +reached +reacher +reachers +reaches +reachy +reachieve +reachievement +reaching +reachless +reacidify +reacidification +reacidified +reacidifying +reacknowledge +reacknowledged +reacknowledging +reacknowledgment +reacquaint +reacquaintance +reacquainted +reacquainting +reacquaints +reacquire +reacquired +reacquires +reacquiring +reacquisition +reacquisitions +react +reactance +reactant +reactants +reacted +reacting +reaction +reactional +reactionally +reactionary +reactionaries +reactionaryism +reactionariness +reactionarism +reactionarist +reactionism +reactionist +reactions +reactivate +reactivated +reactivates +reactivating +reactivation +reactivator +reactive +reactively +reactiveness +reactivity +reactivities +reactology +reactological +reactor +reactors +reacts +reactualization +reactualize +reactuate +reacuaintance +read +readability +readable +readableness +readably +readapt +readaptability +readaptable +readaptation +readapted +readaptiness +readapting +readaptive +readaptiveness +readapts +readd +readded +readdict +readdicted +readdicting +readdicts +readding +readdition +readdress +readdressed +readdresses +readdressing +readds +readept +reader +readerdom +readers +readership +readerships +readhere +readhesion +ready +readied +readier +readies +readiest +readying +readily +readymade +readiness +reading +readingdom +readings +readjourn +readjourned +readjourning +readjournment +readjournments +readjourns +readjudicate +readjudicated +readjudicating +readjudication +readjust +readjustable +readjusted +readjuster +readjusting +readjustment +readjustments +readjusts +readl +readmeasurement +readminister +readmiration +readmire +readmission +readmissions +readmit +readmits +readmittance +readmitted +readmitting +readopt +readopted +readopting +readoption +readopts +readorn +readorned +readorning +readornment +readorns +readout +readouts +reads +readvance +readvancement +readvent +readventure +readvertency +readvertise +readvertised +readvertisement +readvertising +readvertize +readvertized +readvertizing +readvise +readvised +readvising +readvocate +readvocated +readvocating +readvocation +reaeration +reaffect +reaffection +reaffiliate +reaffiliated +reaffiliating +reaffiliation +reaffirm +reaffirmance +reaffirmation +reaffirmations +reaffirmed +reaffirmer +reaffirming +reaffirms +reaffix +reaffixed +reaffixes +reaffixing +reafflict +reafford +reafforest +reafforestation +reaffront +reaffusion +reagan +reaganomics +reagency +reagent +reagents +reaggravate +reaggravation +reaggregate +reaggregated +reaggregating +reaggregation +reaggressive +reagin +reaginic +reaginically +reagins +reagitate +reagitated +reagitating +reagitation +reagree +reagreement +reak +reaks +real +realarm +realer +reales +realest +realestate +realgar +realgars +realia +realienate +realienated +realienating +realienation +realign +realigned +realigning +realignment +realignments +realigns +realisable +realisation +realise +realised +realiser +realisers +realises +realising +realism +realisms +realist +realistic +realistically +realisticize +realisticness +realists +reality +realities +realive +realizability +realizable +realizableness +realizably +realization +realizations +realize +realized +realizer +realizers +realizes +realizing +realizingly +reallegation +reallege +realleged +realleging +reallegorize +really +realliance +reallocate +reallocated +reallocates +reallocating +reallocation +reallocations +reallot +reallotment +reallots +reallotted +reallotting +reallow +reallowance +reallude +reallusion +realm +realmless +realmlet +realms +realness +realnesses +realpolitik +reals +realter +realterable +realterableness +realterably +realteration +realtered +realtering +realters +realty +realties +realtor +realtors +ream +reamage +reamalgamate +reamalgamated +reamalgamating +reamalgamation +reamass +reamassment +reambitious +reamed +reamend +reamendment +reamer +reamerer +reamers +reamy +reaminess +reaming +reamputation +reams +reamuse +reanalyses +reanalysis +reanalyzable +reanalyze +reanalyzed +reanalyzely +reanalyzes +reanalyzing +reanchor +reanimalize +reanimate +reanimated +reanimates +reanimating +reanimation +reanimations +reanneal +reannex +reannexation +reannexed +reannexes +reannexing +reannoy +reannoyance +reannotate +reannotated +reannotating +reannotation +reannounce +reannounced +reannouncement +reannouncing +reanoint +reanointed +reanointing +reanointment +reanoints +reanswer +reantagonize +reantagonized +reantagonizing +reanvil +reanxiety +reap +reapable +reapdole +reaped +reaper +reapers +reaphook +reaphooks +reaping +reapology +reapologies +reapologize +reapologized +reapologizing +reapparel +reapparition +reappeal +reappear +reappearance +reappearances +reappeared +reappearing +reappears +reappease +reapplaud +reapplause +reapply +reappliance +reapplicant +reapplication +reapplied +reapplier +reapplies +reapplying +reappoint +reappointed +reappointing +reappointment +reappointments +reappoints +reapportion +reapportioned +reapportioning +reapportionment +reapportionments +reapportions +reapposition +reappraisal +reappraisals +reappraise +reappraised +reappraisement +reappraiser +reappraises +reappraising +reappreciate +reappreciation +reapprehend +reapprehension +reapproach +reapproachable +reapprobation +reappropriate +reappropriated +reappropriating +reappropriation +reapproval +reapprove +reapproved +reapproving +reaps +rear +rearanged +rearanging +rearbitrate +rearbitrated +rearbitrating +rearbitration +reardoss +reared +rearer +rearers +rearguard +reargue +reargued +reargues +rearguing +reargument +rearhorse +rearii +rearing +rearisal +rearise +rearisen +rearising +rearly +rearling +rearm +rearmament +rearmed +rearmice +rearming +rearmost +rearmouse +rearms +rearose +rearousal +rearouse +rearoused +rearouses +rearousing +rearray +rearrange +rearrangeable +rearranged +rearrangement +rearrangements +rearranger +rearranges +rearranging +rearrest +rearrested +rearresting +rearrests +rearrival +rearrive +rears +rearticulate +rearticulated +rearticulating +rearticulation +rearward +rearwardly +rearwardness +rearwards +reascend +reascendancy +reascendant +reascended +reascendency +reascendent +reascending +reascends +reascension +reascensional +reascent +reascents +reascertain +reascertainment +reasearch +reashlar +reasy +reasiness +reask +reason +reasonability +reasonable +reasonableness +reasonably +reasonal +reasoned +reasonedly +reasoner +reasoners +reasoning +reasoningly +reasonings +reasonless +reasonlessly +reasonlessness +reasonlessured +reasonlessuring +reasonproof +reasons +reaspire +reassay +reassail +reassailed +reassailing +reassails +reassault +reassemblage +reassemble +reassembled +reassembles +reassembly +reassemblies +reassembling +reassent +reassert +reasserted +reasserting +reassertion +reassertor +reasserts +reassess +reassessed +reassesses +reassessing +reassessment +reassessments +reasseverate +reassign +reassignation +reassigned +reassigning +reassignment +reassignments +reassigns +reassimilate +reassimilated +reassimilates +reassimilating +reassimilation +reassist +reassistance +reassociate +reassociated +reassociating +reassociation +reassort +reassorted +reassorting +reassortment +reassortments +reassorts +reassume +reassumed +reassumes +reassuming +reassumption +reassumptions +reassurance +reassurances +reassure +reassured +reassuredly +reassurement +reassurer +reassures +reassuring +reassuringly +reast +reasty +reastiness +reastonish +reastonishment +reastray +reata +reatas +reattach +reattachable +reattached +reattaches +reattaching +reattachment +reattachments +reattack +reattacked +reattacking +reattacks +reattain +reattained +reattaining +reattainment +reattains +reattempt +reattempted +reattempting +reattempts +reattend +reattendance +reattention +reattentive +reattest +reattire +reattired +reattiring +reattract +reattraction +reattribute +reattribution +reatus +reaudit +reaudition +reaumur +reaute +reauthenticate +reauthenticated +reauthenticating +reauthentication +reauthorization +reauthorize +reauthorized +reauthorizing +reavail +reavailable +reave +reaved +reaver +reavery +reavers +reaves +reaving +reavoid +reavoidance +reavouch +reavow +reavowal +reavowed +reavowing +reavows +reawait +reawake +reawaked +reawaken +reawakened +reawakening +reawakenings +reawakenment +reawakens +reawakes +reawaking +reaward +reaware +reawoke +reawoken +reb +rebab +reback +rebag +rebait +rebaited +rebaiting +rebaits +rebake +rebaked +rebaking +rebalance +rebalanced +rebalancing +rebale +rebaled +rebaling +reballast +reballot +reballoted +reballoting +reban +rebandage +rebandaged +rebandaging +rebanish +rebanishment +rebank +rebankrupt +rebankruptcy +rebaptism +rebaptismal +rebaptization +rebaptize +rebaptized +rebaptizer +rebaptizes +rebaptizing +rebar +rebarbarization +rebarbarize +rebarbative +rebarbatively +rebarbativeness +rebargain +rebase +rebasis +rebatable +rebate +rebateable +rebated +rebatement +rebater +rebaters +rebates +rebathe +rebathed +rebathing +rebating +rebato +rebatos +rebawl +rebbe +rebbes +rebbred +rebeamer +rebear +rebeat +rebeautify +rebec +rebecca +rebeccaism +rebeccaites +rebeck +rebecks +rebecome +rebecs +rebed +rebeg +rebeget +rebeggar +rebegin +rebeginner +rebeginning +rebeguile +rebehold +rebeholding +rebekah +rebel +rebeldom +rebeldoms +rebelief +rebelieve +rebelled +rebeller +rebelly +rebellike +rebelling +rebellion +rebellions +rebellious +rebelliously +rebelliousness +rebellow +rebelong +rebelove +rebelproof +rebels +rebemire +rebend +rebending +rebenediction +rebenefit +rebent +rebeset +rebesiege +rebestow +rebestowal +rebetake +rebetray +rebewail +rebia +rebias +rebid +rebiddable +rebidden +rebidding +rebids +rebill +rebilled +rebillet +rebilling +rebills +rebind +rebinding +rebinds +rebirth +rebirths +rebite +reblade +reblame +reblast +rebleach +reblend +reblended +rebless +reblister +reblock +rebloom +rebloomed +reblooming +reblooms +reblossom +reblot +reblow +reblown +reblue +rebluff +reblunder +reboant +reboantic +reboard +reboarded +reboarding +reboards +reboast +reboation +rebob +reboil +reboiled +reboiler +reboiling +reboils +reboise +reboisement +reboke +rebold +rebolera +rebolt +rebone +rebook +reboot +rebooted +rebooting +reboots +rebop +rebops +rebore +reborn +reborrow +rebosa +reboso +rebosos +rebote +rebottle +reboulia +rebounce +rebound +reboundable +reboundant +rebounded +rebounder +rebounding +reboundingness +rebounds +rebourbonize +rebox +rebozo +rebozos +rebrace +rebraced +rebracing +rebraid +rebranch +rebranched +rebranches +rebranching +rebrand +rebrandish +rebreathe +rebred +rebreed +rebreeding +rebrew +rebribe +rebrick +rebridge +rebrighten +rebring +rebringer +rebroach +rebroadcast +rebroadcasted +rebroadcasting +rebroadcasts +rebroaden +rebroadened +rebroadening +rebroadens +rebronze +rebrown +rebrush +rebrutalize +rebs +rebubble +rebuckle +rebuckled +rebuckling +rebud +rebudget +rebudgeted +rebudgeting +rebuff +rebuffable +rebuffably +rebuffed +rebuffet +rebuffing +rebuffproof +rebuffs +rebuy +rebuying +rebuild +rebuilded +rebuilder +rebuilding +rebuilds +rebuilt +rebukable +rebuke +rebukeable +rebuked +rebukeful +rebukefully +rebukefulness +rebukeproof +rebuker +rebukers +rebukes +rebuking +rebukingly +rebulk +rebunch +rebundle +rebunker +rebuoy +rebuoyage +reburden +reburgeon +rebury +reburial +reburials +reburied +reburies +reburying +reburn +reburnish +reburse +reburst +rebus +rebused +rebuses +rebush +rebusy +rebusing +rebut +rebute +rebutment +rebuts +rebuttable +rebuttably +rebuttal +rebuttals +rebutted +rebutter +rebutters +rebutting +rebutton +rebuttoned +rebuttoning +rebuttons +rec +recable +recabled +recabling +recadency +recado +recage +recaged +recaging +recalcination +recalcine +recalcitrance +recalcitrances +recalcitrancy +recalcitrancies +recalcitrant +recalcitrate +recalcitrated +recalcitrating +recalcitration +recalculate +recalculated +recalculates +recalculating +recalculation +recalculations +recalesce +recalesced +recalescence +recalescent +recalescing +recalibrate +recalibrated +recalibrates +recalibrating +recalibration +recalk +recall +recallability +recallable +recalled +recaller +recallers +recalling +recallist +recallment +recalls +recamera +recampaign +recanalization +recancel +recanceled +recanceling +recancellation +recandescence +recandidacy +recane +recaned +recanes +recaning +recant +recantation +recantations +recanted +recanter +recanters +recanting +recantingly +recants +recanvas +recap +recapacitate +recapitalization +recapitalize +recapitalized +recapitalizes +recapitalizing +recapitulate +recapitulated +recapitulates +recapitulating +recapitulation +recapitulationist +recapitulations +recapitulative +recapitulator +recapitulatory +recappable +recapped +recapper +recapping +recaps +recaption +recaptivate +recaptivation +recaptor +recapture +recaptured +recapturer +recaptures +recapturing +recarbon +recarbonate +recarbonation +recarbonization +recarbonize +recarbonizer +recarburization +recarburize +recarburizer +recarnify +recarpet +recarry +recarriage +recarried +recarrier +recarries +recarrying +recart +recarve +recarved +recarving +recase +recash +recasket +recast +recaster +recasting +recasts +recatalog +recatalogue +recatalogued +recataloguing +recatch +recategorize +recategorized +recategorizing +recaulescence +recausticize +recaution +recce +recche +recchose +recchosen +reccy +recco +recd +recede +receded +recedence +recedent +receder +recedes +receding +receipt +receiptable +receipted +receipter +receipting +receiptless +receiptment +receiptor +receipts +receivability +receivable +receivableness +receivables +receivablness +receival +receive +received +receivedness +receiver +receivers +receivership +receiverships +receives +receiving +recelebrate +recelebrated +recelebrates +recelebrating +recelebration +recement +recementation +recency +recencies +recense +recenserecit +recension +recensionist +recensor +recensure +recensus +recent +recenter +recentest +recently +recentness +recentralization +recentralize +recentralized +recentralizing +recentre +recept +receptacle +receptacles +receptacula +receptacular +receptaculite +receptaculites +receptaculitid +receptaculitidae +receptaculitoid +receptaculum +receptant +receptary +receptibility +receptible +reception +receptionism +receptionist +receptionists +receptionreck +receptions +receptitious +receptive +receptively +receptiveness +receptivity +receptor +receptoral +receptorial +receptors +recepts +receptual +receptually +recercele +recercelee +recertify +recertificate +recertification +recertified +recertifying +recess +recessed +recesser +recesses +recessing +recession +recessional +recessionals +recessionary +recessions +recessive +recessively +recessiveness +recesslike +recessor +rechabite +rechabitism +rechafe +rechain +rechal +rechallenge +rechallenged +rechallenging +rechamber +rechange +rechanged +rechanges +rechanging +rechannel +rechanneled +rechanneling +rechannelling +rechant +rechaos +rechar +recharge +rechargeable +recharged +recharger +recharges +recharging +rechart +recharted +recharter +rechartered +rechartering +recharters +recharting +recharts +rechase +rechaser +rechasten +rechate +rechauffe +rechauffes +rechaw +recheat +recheats +recheck +rechecked +rechecking +rechecks +recheer +recherch +recherche +rechew +rechip +rechisel +rechoose +rechooses +rechoosing +rechose +rechosen +rechristen +rechristened +rechristening +rechristenings +rechristens +rechuck +rechurn +recyclability +recyclable +recycle +recycled +recycles +recycling +recide +recidivate +recidivated +recidivating +recidivation +recidive +recidivism +recidivist +recidivistic +recidivists +recidivity +recidivous +recip +recipe +recipes +recipiangle +recipiatur +recipience +recipiency +recipiend +recipiendary +recipiendum +recipient +recipients +recipiomotor +reciprocable +reciprocal +reciprocality +reciprocalize +reciprocally +reciprocalness +reciprocals +reciprocant +reciprocantive +reciprocate +reciprocated +reciprocates +reciprocating +reciprocation +reciprocatist +reciprocative +reciprocator +reciprocatory +reciprocitarian +reciprocity +reciprocities +reciproque +recircle +recircled +recircles +recircling +recirculate +recirculated +recirculates +recirculating +recirculation +recirculations +recision +recisions +recission +recissory +recit +recitable +recital +recitalist +recitalists +recitals +recitando +recitatif +recitation +recitationalism +recitationist +recitations +recitative +recitatively +recitatives +recitativi +recitativical +recitativo +recitativos +recite +recited +recitement +reciter +reciters +recites +reciting +recivilization +recivilize +reck +recked +recking +reckla +reckless +recklessly +recklessness +reckling +reckon +reckonable +reckoned +reckoner +reckoners +reckoning +reckonings +reckons +recks +reclad +reclaim +reclaimable +reclaimableness +reclaimably +reclaimant +reclaimed +reclaimer +reclaimers +reclaiming +reclaimless +reclaimment +reclaims +reclama +reclamation +reclamations +reclamatory +reclame +reclames +reclang +reclasp +reclasped +reclasping +reclasps +reclass +reclassify +reclassification +reclassifications +reclassified +reclassifies +reclassifying +reclean +recleaned +recleaner +recleaning +recleans +recleanse +recleansed +recleansing +reclear +reclearance +reclimb +reclimbed +reclimbing +reclinable +reclinant +reclinate +reclinated +reclination +recline +reclined +recliner +recliners +reclines +reclining +reclivate +reclosable +reclose +recloseable +reclothe +reclothed +reclothes +reclothing +reclude +recluse +reclusely +recluseness +reclusery +recluses +reclusion +reclusive +reclusiveness +reclusory +recoach +recoagulate +recoagulated +recoagulating +recoagulation +recoal +recoaled +recoaling +recoals +recoast +recoat +recock +recocked +recocking +recocks +recoct +recoction +recode +recoded +recodes +recodify +recodification +recodified +recodifies +recodifying +recoding +recogitate +recogitation +recognisable +recognise +recognised +recogniser +recognising +recognita +recognition +recognitions +recognitive +recognitor +recognitory +recognizability +recognizable +recognizably +recognizance +recognizant +recognize +recognized +recognizedly +recognizee +recognizer +recognizers +recognizes +recognizing +recognizingly +recognizor +recognosce +recohabitation +recoil +recoiled +recoiler +recoilers +recoiling +recoilingly +recoilless +recoilment +recoils +recoin +recoinage +recoined +recoiner +recoining +recoins +recoke +recollapse +recollate +recollation +recollect +recollectable +recollected +recollectedly +recollectedness +recollectible +recollecting +recollection +recollections +recollective +recollectively +recollectiveness +recollects +recollet +recolonisation +recolonise +recolonised +recolonising +recolonization +recolonize +recolonized +recolonizes +recolonizing +recolor +recoloration +recolored +recoloring +recolors +recolour +recolouration +recomb +recombed +recombinant +recombination +recombinational +recombinations +recombine +recombined +recombines +recombing +recombining +recombs +recomember +recomfort +recommand +recommence +recommenced +recommencement +recommencer +recommences +recommencing +recommend +recommendability +recommendable +recommendableness +recommendably +recommendation +recommendations +recommendative +recommendatory +recommended +recommendee +recommender +recommenders +recommending +recommends +recommission +recommissioned +recommissioning +recommissions +recommit +recommiting +recommitment +recommits +recommittal +recommitted +recommitting +recommunicate +recommunion +recompact +recompare +recompared +recomparing +recomparison +recompass +recompel +recompence +recompensable +recompensate +recompensated +recompensating +recompensation +recompensatory +recompense +recompensed +recompenser +recompenses +recompensing +recompensive +recompete +recompetition +recompetitor +recompilation +recompilations +recompile +recompiled +recompilement +recompiles +recompiling +recomplain +recomplaint +recomplete +recompletion +recomply +recompliance +recomplicate +recomplication +recompose +recomposed +recomposer +recomposes +recomposing +recomposition +recompound +recompounded +recompounding +recompounds +recomprehend +recomprehension +recompress +recompression +recomputation +recompute +recomputed +recomputes +recomputing +recon +reconceal +reconcealment +reconcede +reconceive +reconcentrado +reconcentrate +reconcentrated +reconcentrates +reconcentrating +reconcentration +reconception +reconcert +reconcession +reconcilability +reconcilable +reconcilableness +reconcilably +reconcile +reconciled +reconcilee +reconcileless +reconcilement +reconcilements +reconciler +reconcilers +reconciles +reconciliability +reconciliable +reconciliate +reconciliated +reconciliating +reconciliation +reconciliations +reconciliatiory +reconciliative +reconciliator +reconciliatory +reconciling +reconcilingly +reconclude +reconclusion +reconcoct +reconcrete +reconcur +recond +recondemn +recondemnation +recondensation +recondense +recondensed +recondenses +recondensing +recondite +reconditely +reconditeness +recondition +reconditioned +reconditioning +reconditions +reconditory +recondole +reconduct +reconduction +reconfer +reconferred +reconferring +reconfess +reconfide +reconfigurability +reconfigurable +reconfiguration +reconfigurations +reconfigure +reconfigured +reconfigurer +reconfigures +reconfiguring +reconfine +reconfined +reconfinement +reconfining +reconfirm +reconfirmation +reconfirmations +reconfirmed +reconfirming +reconfirms +reconfiscate +reconfiscated +reconfiscating +reconfiscation +reconform +reconfound +reconfront +reconfrontation +reconfuse +reconfused +reconfusing +reconfusion +recongeal +recongelation +recongest +recongestion +recongratulate +recongratulation +reconjoin +reconjunction +reconnaissance +reconnaissances +reconnect +reconnected +reconnecting +reconnection +reconnects +reconnoissance +reconnoiter +reconnoitered +reconnoiterer +reconnoitering +reconnoiteringly +reconnoiters +reconnoitre +reconnoitred +reconnoitrer +reconnoitring +reconnoitringly +reconquer +reconquered +reconquering +reconqueror +reconquers +reconquest +recons +reconsecrate +reconsecrated +reconsecrates +reconsecrating +reconsecration +reconsecrations +reconsent +reconsider +reconsideration +reconsidered +reconsidering +reconsiders +reconsign +reconsigned +reconsigning +reconsignment +reconsigns +reconsole +reconsoled +reconsolidate +reconsolidated +reconsolidates +reconsolidating +reconsolidation +reconsolidations +reconsoling +reconstituent +reconstitute +reconstituted +reconstitutes +reconstituting +reconstitution +reconstruct +reconstructed +reconstructible +reconstructing +reconstruction +reconstructional +reconstructionary +reconstructionism +reconstructionist +reconstructions +reconstructive +reconstructively +reconstructiveness +reconstructor +reconstructs +reconstrue +reconsult +reconsultation +recontact +recontamination +recontemplate +recontemplated +recontemplating +recontemplation +recontend +reconter +recontest +recontested +recontesting +recontests +recontinuance +recontinue +recontract +recontracted +recontracting +recontraction +recontracts +recontrast +recontribute +recontribution +recontrivance +recontrive +recontrol +recontrolling +reconvalesce +reconvalescence +reconvalescent +reconvey +reconveyance +reconveyed +reconveying +reconveys +reconvene +reconvened +reconvenes +reconvening +reconvenire +reconvention +reconventional +reconverge +reconverged +reconvergence +reconverging +reconverse +reconversion +reconversions +reconvert +reconverted +reconvertible +reconverting +reconverts +reconvict +reconviction +reconvince +reconvoke +recook +recooked +recooking +recooks +recool +recooper +recopy +recopied +recopies +recopying +recopilation +recopyright +recopper +record +recordable +recordance +recordant +recordation +recordative +recordatively +recordatory +recorded +recordedly +recorder +recorders +recordership +recording +recordings +recordist +recordists +recordless +records +recordsize +recork +recoronation +recorporify +recorporification +recorrect +recorrection +recorrupt +recorruption +recost +recostume +recostumed +recostuming +recounsel +recounseled +recounseling +recount +recountable +recountal +recounted +recountenance +recounter +recounting +recountless +recountment +recounts +recoup +recoupable +recoupe +recouped +recouper +recouping +recouple +recoupled +recouples +recoupling +recoupment +recoups +recour +recours +recourse +recourses +recover +recoverability +recoverable +recoverableness +recoverance +recovered +recoveree +recoverer +recovery +recoveries +recovering +recoveringly +recoverless +recoveror +recovers +recpt +recrayed +recramp +recrank +recrate +recrated +recrates +recrating +recreance +recreancy +recreant +recreantly +recreantness +recreants +recrease +recreatable +recreate +recreated +recreates +recreating +recreation +recreational +recreationally +recreationist +recreations +recreative +recreatively +recreativeness +recreator +recreatory +recredential +recredit +recrement +recremental +recrementitial +recrementitious +recrescence +recrew +recriminate +recriminated +recriminates +recriminating +recrimination +recriminations +recriminative +recriminator +recriminatory +recrystallise +recrystallised +recrystallising +recrystallization +recrystallize +recrystallized +recrystallizes +recrystallizing +recriticize +recriticized +recriticizing +recroon +recrop +recross +recrossed +recrosses +recrossing +recrowd +recrown +recrowned +recrowning +recrowns +recrucify +recrudency +recrudesce +recrudesced +recrudescence +recrudescency +recrudescent +recrudesces +recrudescing +recruit +recruitable +recruitage +recruital +recruited +recruitee +recruiter +recruiters +recruithood +recruity +recruiting +recruitment +recruitors +recruits +recrush +recrusher +recs +rect +recta +rectal +rectalgia +rectally +rectangle +rectangled +rectangles +rectangular +rectangularity +rectangularly +rectangularness +rectangulate +rectangulometer +rectectomy +rectectomies +recti +rectify +rectifiability +rectifiable +rectification +rectifications +rectificative +rectificator +rectificatory +rectified +rectifier +rectifiers +rectifies +rectifying +rectigrade +rectigraph +rectilineal +rectilineally +rectilinear +rectilinearism +rectilinearity +rectilinearly +rectilinearness +rectilineation +rectinerved +rection +rectipetality +rectirostral +rectischiac +rectiserial +rectitic +rectitis +rectitude +rectitudinous +recto +rectoabdominal +rectocele +rectocystotomy +rectoclysis +rectococcygeal +rectococcygeus +rectocolitic +rectocolonic +rectogenital +rectopexy +rectophobia +rectoplasty +rector +rectoral +rectorate +rectorates +rectoress +rectory +rectorial +rectories +rectorrhaphy +rectors +rectorship +rectos +rectoscope +rectoscopy +rectosigmoid +rectostenosis +rectostomy +rectotome +rectotomy +rectovaginal +rectovesical +rectress +rectrices +rectricial +rectrix +rectum +rectums +rectus +recubant +recubate +recubation +recueil +recueillement +reculade +recule +recultivate +recultivated +recultivating +recultivation +recumb +recumbence +recumbency +recumbencies +recumbent +recumbently +recuperability +recuperance +recuperate +recuperated +recuperates +recuperating +recuperation +recuperative +recuperativeness +recuperator +recuperatory +recuperet +recur +recure +recureful +recureless +recurl +recurred +recurrence +recurrences +recurrency +recurrent +recurrently +recurrer +recurring +recurringly +recurs +recursant +recurse +recursed +recurses +recursing +recursion +recursions +recursive +recursively +recursiveness +recurtain +recurvant +recurvaria +recurvate +recurvated +recurvation +recurvature +recurve +recurved +recurves +recurving +recurvirostra +recurvirostral +recurvirostridae +recurvity +recurvopatent +recurvoternate +recurvous +recusal +recusance +recusancy +recusant +recusants +recusation +recusative +recusator +recuse +recused +recuses +recusf +recushion +recusing +recussion +recut +recuts +recutting +red +redact +redacted +redacteur +redacting +redaction +redactional +redactor +redactorial +redactors +redacts +redamage +redamaged +redamaging +redamation +redame +redamnation +redan +redans +redare +redared +redargue +redargued +redargues +redarguing +redargution +redargutive +redargutory +redaring +redarken +redarn +redart +redate +redated +redates +redating +redaub +redawn +redback +redbay +redbays +redbait +redbaited +redbaiting +redbaits +redbeard +redbelly +redberry +redbill +redbird +redbirds +redbone +redbones +redbreast +redbreasts +redbrick +redbricks +redbrush +redbuck +redbud +redbuds +redbug +redbugs +redcap +redcaps +redcoat +redcoats +redcoll +redcurrant +redd +redded +redden +reddenda +reddendo +reddendum +reddened +reddening +reddens +redder +redders +reddest +reddy +redding +reddingite +reddish +reddishly +reddishness +reddition +redditive +reddle +reddled +reddleman +reddlemen +reddles +reddling +reddock +redds +reddsman +rede +redeal +redealing +redealt +redear +redears +redebate +redebit +redecay +redeceive +redeceived +redeceiving +redecide +redecided +redeciding +redecimate +redecision +redeck +redeclaration +redeclare +redeclared +redeclares +redeclaring +redecline +redeclined +redeclining +redecorate +redecorated +redecorates +redecorating +redecoration +redecorator +redecrease +redecussate +reded +rededicate +rededicated +rededicates +rededicating +rededication +rededicatory +rededuct +rededuction +redeed +redeem +redeemability +redeemable +redeemableness +redeemably +redeemed +redeemedness +redeemer +redeemeress +redeemers +redeemership +redeeming +redeemless +redeems +redefault +redefeat +redefeated +redefeating +redefeats +redefecate +redefer +redefy +redefiance +redefied +redefies +redefying +redefine +redefined +redefines +redefining +redefinition +redefinitions +redeflect +redeye +redeyes +redeify +redelay +redelegate +redelegated +redelegating +redelegation +redeless +redelete +redeleted +redeleting +redely +redeliberate +redeliberated +redeliberating +redeliberation +redeliver +redeliverance +redelivered +redeliverer +redelivery +redeliveries +redelivering +redelivers +redemand +redemandable +redemanded +redemanding +redemands +redemise +redemised +redemising +redemolish +redemonstrate +redemonstrated +redemonstrates +redemonstrating +redemonstration +redemptible +redemptine +redemption +redemptional +redemptioner +redemptionist +redemptionless +redemptions +redemptive +redemptively +redemptor +redemptory +redemptorial +redemptorist +redemptress +redemptrice +redeny +redenial +redenied +redenies +redenigrate +redenying +redepend +redeploy +redeployed +redeploying +redeployment +redeploys +redeposit +redeposited +redepositing +redeposition +redeposits +redepreciate +redepreciated +redepreciating +redepreciation +redeprive +rederivation +redes +redescend +redescent +redescribe +redescribed +redescribes +redescribing +redescription +redesert +redesertion +redeserve +redesign +redesignate +redesignated +redesignating +redesignation +redesigned +redesigning +redesigns +redesire +redesirous +redesman +redespise +redetect +redetention +redetermination +redetermine +redetermined +redetermines +redeterminible +redetermining +redevable +redevelop +redeveloped +redeveloper +redevelopers +redeveloping +redevelopment +redevelopments +redevelops +redevise +redevote +redevotion +redfield +redfin +redfinch +redfins +redfish +redfishes +redfoot +redhandedness +redhead +redheaded +redheadedly +redheadedness +redheads +redheart +redhearted +redhibition +redhibitory +redhoop +redhorse +redhorses +redia +rediae +redial +redias +redictate +redictated +redictating +redictation +redid +redye +redyed +redyeing +redient +redyes +redifferentiate +redifferentiated +redifferentiating +redifferentiation +rediffuse +rediffused +rediffusing +rediffusion +redig +redigest +redigested +redigesting +redigestion +redigests +redigitalize +redying +redilate +redilated +redilating +redimension +redimensioned +redimensioning +redimensions +rediminish +reding +redingote +redintegrate +redintegrated +redintegrating +redintegration +redintegrative +redintegrator +redip +redipped +redipper +redipping +redips +redipt +redirect +redirected +redirecting +redirection +redirections +redirects +redisable +redisappear +redisburse +redisbursed +redisbursement +redisbursing +redischarge +redischarged +redischarging +rediscipline +redisciplined +redisciplining +rediscount +rediscountable +rediscounted +rediscounting +rediscounts +rediscourage +rediscover +rediscovered +rediscoverer +rediscovery +rediscoveries +rediscovering +rediscovers +rediscuss +rediscussion +redisembark +redisinfect +redismiss +redismissal +redispatch +redispel +redispersal +redisperse +redispersed +redispersing +redisplay +redisplayed +redisplaying +redisplays +redispose +redisposed +redisposing +redisposition +redispute +redisputed +redisputing +redissect +redissection +redisseise +redisseisin +redisseisor +redisseize +redisseizin +redisseizor +redissoluble +redissolubleness +redissolubly +redissolution +redissolvable +redissolve +redissolved +redissolves +redissolving +redistend +redistill +redistillable +redistillableness +redistillabness +redistillation +redistilled +redistiller +redistilling +redistills +redistinguish +redistrain +redistrainer +redistribute +redistributed +redistributer +redistributes +redistributing +redistribution +redistributionist +redistributions +redistributive +redistributor +redistributory +redistrict +redistricted +redistricting +redistricts +redisturb +redition +redive +rediversion +redivert +redivertible +redivide +redivided +redivides +redividing +redivision +redivive +redivivous +redivivus +redivorce +redivorced +redivorcement +redivorcing +redivulge +redivulgence +redjacket +redknees +redleg +redlegs +redly +redline +redlined +redlines +redlining +redmouth +redneck +rednecks +redness +rednesses +redo +redock +redocked +redocket +redocketed +redocketing +redocking +redocks +redocument +redodid +redodoing +redodone +redoes +redoing +redolence +redolency +redolent +redolently +redominate +redominated +redominating +redondilla +redone +redoom +redos +redouble +redoubled +redoublement +redoubler +redoubles +redoubling +redoubt +redoubtable +redoubtableness +redoubtably +redoubted +redoubting +redoubts +redound +redounded +redounding +redounds +redout +redoute +redouts +redowa +redowas +redox +redoxes +redpoll +redpolls +redraft +redrafted +redrafting +redrafts +redrag +redrape +redraw +redrawer +redrawers +redrawing +redrawn +redraws +redream +redredge +redress +redressable +redressal +redressed +redresser +redresses +redressible +redressing +redressive +redressless +redressment +redressor +redrew +redry +redried +redries +redrying +redrill +redrilled +redrilling +redrills +redrive +redriven +redrives +redriving +redroop +redroot +redroots +redrove +redrug +redrugged +redrugging +reds +redsear +redshank +redshanks +redshire +redshirt +redshirted +redshirting +redshirts +redskin +redskins +redstart +redstarts +redstreak +redtab +redtail +redtapism +redthroat +redtop +redtops +redub +redubber +reduccion +reduce +reduceable +reduceableness +reduced +reducement +reducent +reducer +reducers +reduces +reducibility +reducibilities +reducible +reducibleness +reducibly +reducing +reduct +reductant +reductase +reductibility +reductio +reduction +reductional +reductionism +reductionist +reductionistic +reductions +reductive +reductively +reductivism +reductor +reductorial +redue +redug +reduit +redunca +redundance +redundances +redundancy +redundancies +redundant +redundantly +redupl +reduplicate +reduplicated +reduplicating +reduplication +reduplicative +reduplicatively +reduplicatory +reduplicature +redust +reduviid +reduviidae +reduviids +reduvioid +reduvius +redux +reduzate +redward +redware +redwares +redweed +redwing +redwings +redwithe +redwood +redwoods +redwud +ree +reearn +reearned +reearning +reearns +reebok +reechy +reecho +reechoed +reechoes +reechoing +reed +reedbird +reedbirds +reedbuck +reedbucks +reedbush +reeded +reeden +reeder +reedy +reediemadeasy +reedier +reediest +reedify +reedified +reedifies +reedifying +reedily +reediness +reeding +reedings +reedish +reedit +reedited +reediting +reedition +reedits +reedless +reedlike +reedling +reedlings +reedmaker +reedmaking +reedman +reedplot +reeds +reeducate +reeducated +reeducates +reeducating +reeducation +reeducative +reedwork +reef +reefable +reefed +reefer +reefers +reeffish +reeffishes +reefy +reefier +reefiest +reefing +reefs +reeject +reejected +reejecting +reejects +reek +reeked +reeker +reekers +reeky +reekier +reekiest +reeking +reekingly +reeks +reel +reelable +reelect +reelected +reelecting +reelection +reelections +reelects +reeled +reeledid +reeledoing +reeledone +reeler +reelers +reelevate +reelevated +reelevating +reelevation +reeligibility +reeligible +reeligibleness +reeligibly +reeling +reelingly +reelrall +reels +reem +reemanate +reemanated +reemanating +reembarcation +reembark +reembarkation +reembarked +reembarking +reembarks +reembellish +reembody +reembodied +reembodies +reembodying +reembodiment +reembrace +reembraced +reembracing +reembroider +reemerge +reemerged +reemergence +reemergent +reemerges +reemerging +reemersion +reemigrate +reemigrated +reemigrating +reemigration +reeming +reemish +reemission +reemit +reemits +reemitted +reemitting +reemphases +reemphasis +reemphasize +reemphasized +reemphasizes +reemphasizing +reemploy +reemployed +reemploying +reemployment +reemploys +reen +reenable +reenabled +reenact +reenacted +reenacting +reenaction +reenactment +reenactments +reenacts +reenclose +reenclosed +reencloses +reenclosing +reencounter +reencountered +reencountering +reencounters +reencourage +reencouraged +reencouragement +reencouraging +reendorse +reendorsed +reendorsement +reendorsing +reendow +reendowed +reendowing +reendowment +reendows +reenergize +reenergized +reenergizing +reenforce +reenforced +reenforcement +reenforces +reenforcing +reengage +reengaged +reengagement +reengages +reengaging +reenge +reengrave +reengraved +reengraving +reengross +reenjoy +reenjoyed +reenjoying +reenjoyment +reenjoin +reenjoys +reenlarge +reenlarged +reenlargement +reenlarges +reenlarging +reenlighted +reenlighten +reenlightened +reenlightening +reenlightenment +reenlightens +reenlist +reenlisted +reenlisting +reenlistment +reenlistments +reenlists +reenslave +reenslaved +reenslavement +reenslaves +reenslaving +reenter +reenterable +reentered +reentering +reenters +reentrance +reentranced +reentrances +reentrancy +reentrancing +reentrant +reentry +reentries +reenumerate +reenumerated +reenumerating +reenumeration +reenunciate +reenunciated +reenunciating +reenunciation +reeper +reequip +reequipped +reequipping +reequips +reequipt +reerect +reerected +reerecting +reerection +reerects +reerupt +reeruption +rees +reese +reeshie +reeshle +reesk +reesle +reest +reestablish +reestablished +reestablishes +reestablishing +reestablishment +reested +reester +reesty +reestimate +reestimated +reestimating +reestimation +reesting +reestle +reests +reet +reetam +reetle +reevacuate +reevacuated +reevacuating +reevacuation +reevaluate +reevaluated +reevaluates +reevaluating +reevaluation +reevaluations +reevasion +reeve +reeved +reeveland +reeves +reeveship +reevidence +reevidenced +reevidencing +reeving +reevoke +reevoked +reevokes +reevoking +reexamination +reexaminations +reexamine +reexamined +reexamines +reexamining +reexcavate +reexcavated +reexcavating +reexcavation +reexchange +reexchanged +reexchanges +reexchanging +reexecute +reexecuted +reexecuting +reexecution +reexercise +reexercised +reexercising +reexhibit +reexhibited +reexhibiting +reexhibition +reexhibits +reexpand +reexpansion +reexpel +reexpelled +reexpelling +reexpels +reexperience +reexperienced +reexperiences +reexperiencing +reexperiment +reexplain +reexplanation +reexplicate +reexplicated +reexplicating +reexplication +reexploration +reexplore +reexplored +reexploring +reexport +reexportation +reexported +reexporter +reexporting +reexports +reexpose +reexposed +reexposing +reexposition +reexposure +reexpress +reexpressed +reexpresses +reexpressing +reexpression +ref +refabricate +refabrication +reface +refaced +refaces +refacilitate +refacing +refaction +refait +refall +refallen +refalling +refallow +refalls +refamiliarization +refamiliarize +refamiliarized +refamiliarizing +refan +refascinate +refascination +refashion +refashioned +refashioner +refashioning +refashionment +refashions +refasten +refastened +refastening +refastens +refathered +refavor +refect +refected +refecting +refection +refectionary +refectioner +refective +refectorary +refectorarian +refectorer +refectory +refectorial +refectorian +refectories +refects +refed +refederalization +refederalize +refederalized +refederalizing +refederate +refederated +refederating +refederation +refeed +refeeding +refeeds +refeel +refeeling +refeign +refel +refell +refelled +refelling +refels +refelt +refence +refer +referable +referda +refered +referee +refereed +refereeing +referees +refereeship +reference +referenced +referencer +references +referencing +referenda +referendal +referendary +referendaries +referendaryship +referendum +referendums +referent +referential +referentiality +referentially +referently +referents +referment +referrable +referral +referrals +referred +referrer +referrers +referrible +referribleness +referring +refers +refertilizable +refertilization +refertilize +refertilized +refertilizing +refetch +refete +reffed +reffelt +reffing +reffo +reffos +reffroze +reffrozen +refight +refighting +refights +refigure +refigured +refigures +refiguring +refile +refiled +refiles +refiling +refill +refillable +refilled +refilling +refills +refilm +refilmed +refilming +refilms +refilter +refiltered +refiltering +refilters +refinable +refinage +refinance +refinanced +refinances +refinancing +refind +refinding +refinds +refine +refined +refinedly +refinedness +refinement +refinements +refiner +refinery +refineries +refiners +refines +refinger +refining +refiningly +refinish +refinished +refinisher +refinishes +refinishing +refire +refired +refires +refiring +refit +refitment +refits +refitted +refitting +refix +refixation +refixed +refixes +refixing +refixture +refl +reflag +reflagellate +reflair +reflame +reflash +reflate +reflated +reflates +reflating +reflation +reflationary +reflationism +reflect +reflectance +reflected +reflectedly +reflectedness +reflectent +reflecter +reflectibility +reflectible +reflecting +reflectingly +reflection +reflectional +reflectioning +reflectionist +reflectionless +reflections +reflective +reflectively +reflectiveness +reflectivity +reflectometer +reflectometry +reflector +reflectorize +reflectorized +reflectorizing +reflectors +reflectoscope +reflects +refledge +reflee +reflet +reflets +reflew +reflex +reflexed +reflexes +reflexibility +reflexible +reflexing +reflexion +reflexional +reflexism +reflexiue +reflexive +reflexively +reflexiveness +reflexives +reflexivity +reflexly +reflexness +reflexogenous +reflexology +reflexological +reflexologically +reflexologies +reflexologist +refly +reflies +reflying +refling +refloat +refloatation +refloated +refloating +refloats +reflog +reflood +reflooded +reflooding +refloods +refloor +reflorescence +reflorescent +reflourish +reflourishment +reflow +reflowed +reflower +reflowered +reflowering +reflowers +reflowing +reflown +reflows +refluctuation +refluence +refluency +refluent +refluous +reflush +reflux +refluxed +refluxes +refluxing +refocillate +refocillation +refocus +refocused +refocuses +refocusing +refocussed +refocusses +refocussing +refold +refolded +refolding +refolds +refoment +refont +refool +refoot +reforbid +reforce +reford +reforecast +reforest +reforestation +reforestational +reforested +reforesting +reforestization +reforestize +reforestment +reforests +reforfeit +reforfeiture +reforge +reforgeable +reforged +reforger +reforges +reforget +reforging +reforgive +reform +reformability +reformable +reformableness +reformado +reformanda +reformandum +reformat +reformate +reformated +reformati +reformating +reformation +reformational +reformationary +reformationist +reformations +reformative +reformatively +reformativeness +reformatness +reformatory +reformatories +reformats +reformatted +reformatting +reformed +reformedly +reformer +reformeress +reformers +reforming +reformingly +reformism +reformist +reformistic +reformproof +reforms +reformulate +reformulated +reformulates +reformulating +reformulation +reformulations +reforsake +refortify +refortification +refortified +refortifies +refortifying +reforward +refought +refound +refoundation +refounded +refounder +refounding +refounds +refr +refract +refractable +refractary +refracted +refractedly +refractedness +refractile +refractility +refracting +refraction +refractional +refractionate +refractionist +refractions +refractive +refractively +refractiveness +refractivity +refractivities +refractometer +refractometry +refractometric +refractor +refractory +refractories +refractorily +refractoriness +refractors +refracts +refracturable +refracture +refractured +refractures +refracturing +refragability +refragable +refragableness +refragate +refragment +refrain +refrained +refrainer +refraining +refrainment +refrains +reframe +reframed +reframes +reframing +refrangent +refrangibility +refrangibilities +refrangible +refrangibleness +refreeze +refreezes +refreezing +refreid +refreit +refrenation +refrenzy +refresco +refresh +refreshant +refreshed +refreshen +refreshener +refresher +refreshers +refreshes +refreshful +refreshfully +refreshing +refreshingly +refreshingness +refreshment +refreshments +refry +refricate +refried +refries +refrig +refrigerant +refrigerants +refrigerate +refrigerated +refrigerates +refrigerating +refrigeration +refrigerative +refrigerator +refrigeratory +refrigerators +refrigerium +refrighten +refrying +refringe +refringence +refringency +refringent +refroid +refront +refronted +refronting +refronts +refroze +refrozen +refrustrate +refrustrated +refrustrating +refs +reft +refuel +refueled +refueling +refuelled +refuelling +refuels +refuge +refuged +refugee +refugeeism +refugees +refugeeship +refuges +refugia +refuging +refugium +refulge +refulgence +refulgency +refulgent +refulgently +refulgentness +refunction +refund +refundability +refundable +refunded +refunder +refunders +refunding +refundment +refunds +refurbish +refurbished +refurbisher +refurbishes +refurbishing +refurbishment +refurl +refurnish +refurnished +refurnishes +refurnishing +refurnishment +refusable +refusal +refusals +refuse +refused +refusenik +refuser +refusers +refuses +refusing +refusingly +refusion +refusive +refutability +refutable +refutably +refutal +refutals +refutation +refutations +refutative +refutatory +refute +refuted +refuter +refuters +refutes +refuting +reg +regain +regainable +regained +regainer +regainers +regaining +regainment +regains +regal +regalado +regald +regale +regalecidae +regalecus +regaled +regalement +regaler +regales +regalia +regalian +regaling +regalio +regalism +regalist +regality +regalities +regalize +regally +regallop +regalness +regalo +regalty +regalvanization +regalvanize +regalvanized +regalvanizing +regamble +regambled +regambling +regard +regardable +regardance +regardancy +regardant +regarded +regarder +regardful +regardfully +regardfulness +regarding +regardless +regardlessly +regardlessness +regards +regarment +regarnish +regarrison +regather +regathered +regathering +regathers +regatta +regattas +regauge +regauged +regauges +regauging +regave +regd +regear +regeared +regearing +regears +regel +regelate +regelated +regelates +regelating +regelation +regelled +regelling +regence +regency +regencies +regenerable +regeneracy +regenerance +regenerant +regenerate +regenerated +regenerately +regenerateness +regenerates +regenerating +regeneration +regenerative +regeneratively +regenerator +regeneratory +regeneratoryregeneratress +regenerators +regeneratress +regeneratrix +regenesis +regent +regental +regentess +regents +regentship +regerminate +regerminated +regerminates +regerminating +regermination +regerminative +regerminatively +reges +regest +reget +regga +reggae +reggie +regia +regian +regicidal +regicide +regicides +regicidism +regidor +regie +regift +regifuge +regild +regilded +regilding +regilds +regill +regilt +regime +regimen +regimenal +regimens +regiment +regimental +regimentaled +regimentalled +regimentally +regimentals +regimentary +regimentation +regimented +regimenting +regiments +regimes +regiminal +regin +regina +reginae +reginal +reginald +reginas +regioide +region +regional +regionalism +regionalist +regionalistic +regionalization +regionalize +regionalized +regionalizing +regionally +regionals +regionary +regioned +regions +regird +regisseur +regisseurs +register +registerable +registered +registerer +registering +registers +registership +registrability +registrable +registral +registrant +registrants +registrar +registrary +registrars +registrarship +registrate +registrated +registrating +registration +registrational +registrationist +registrations +registrator +registrer +registry +registries +regitive +regius +regive +regiven +regives +regiving +regladden +reglair +reglaze +reglazed +reglazes +reglazing +regle +reglement +reglementary +reglementation +reglementist +reglet +reglets +reglorify +reglorification +reglorified +reglorifying +regloss +reglossed +reglosses +reglossing +reglove +reglow +reglowed +reglowing +reglows +reglue +reglued +reglues +regluing +regma +regmacarp +regmata +regna +regnal +regnancy +regnancies +regnant +regnerable +regnum +rego +regolith +regoliths +regorge +regorged +regorges +regorging +regosol +regosols +regovern +regovernment +regr +regrab +regrabbed +regrabbing +regracy +regradate +regradated +regradating +regradation +regrade +regraded +regrades +regrading +regraduate +regraduation +regraft +regrafted +regrafting +regrafts +regrant +regranted +regranting +regrants +regraph +regrasp +regrass +regrate +regrated +regrater +regrates +regratify +regratification +regrating +regratingly +regrator +regratress +regravel +regrease +regreased +regreasing +regrede +regreen +regreet +regreeted +regreeting +regreets +regress +regressed +regresses +regressing +regression +regressionist +regressions +regressive +regressively +regressiveness +regressivity +regressor +regressors +regret +regretable +regretableness +regretably +regretful +regretfully +regretfulness +regretless +regretlessness +regrets +regrettable +regrettableness +regrettably +regretted +regretter +regretters +regretting +regrettingly +regrew +regrind +regrinder +regrinding +regrinds +regrip +regripped +regroove +regrooved +regrooves +regrooving +reground +regroup +regrouped +regrouping +regroupment +regroups +regrow +regrowing +regrown +regrows +regrowth +regrowths +regt +reguarantee +reguaranteed +reguaranteeing +reguaranty +reguaranties +reguard +reguardant +reguide +reguided +reguiding +regula +regulable +regular +regulares +regularia +regularise +regularity +regularities +regularization +regularize +regularized +regularizer +regularizes +regularizing +regularly +regularness +regulars +regulatable +regulate +regulated +regulates +regulating +regulation +regulationist +regulations +regulative +regulatively +regulator +regulatory +regulators +regulatorship +regulatress +regulatris +reguli +reguline +regulize +regulus +reguluses +regur +regurge +regurgitant +regurgitate +regurgitated +regurgitates +regurgitating +regurgitation +regurgitations +regurgitative +regush +reh +rehabilitant +rehabilitate +rehabilitated +rehabilitates +rehabilitating +rehabilitation +rehabilitationist +rehabilitations +rehabilitative +rehabilitator +rehabilitee +rehair +rehayte +rehale +rehallow +rehammer +rehammered +rehammering +rehammers +rehandicap +rehandle +rehandled +rehandler +rehandles +rehandling +rehang +rehanged +rehanging +rehangs +rehappen +reharden +rehardened +rehardening +rehardens +reharm +reharmonization +reharmonize +reharmonized +reharmonizing +reharness +reharrow +reharvest +rehash +rehashed +rehashes +rehashing +rehaul +rehazard +rehboc +rehead +reheal +reheap +rehear +reheard +rehearheard +rehearhearing +rehearing +rehearings +rehears +rehearsable +rehearsal +rehearsals +rehearse +rehearsed +rehearser +rehearsers +rehearses +rehearsing +rehearten +reheat +reheated +reheater +reheaters +reheating +reheats +reheboth +rehedge +reheel +reheeled +reheeling +reheels +reheighten +rehem +rehemmed +rehemming +rehems +rehete +rehybridize +rehid +rehidden +rehide +rehydratable +rehydrate +rehydrating +rehydration +rehinge +rehinged +rehinges +rehinging +rehypnotize +rehypnotized +rehypnotizing +rehypothecate +rehypothecated +rehypothecating +rehypothecation +rehypothecator +rehire +rehired +rehires +rehiring +rehoboam +rehoboth +rehobothan +rehoe +rehoist +rehollow +rehone +rehoned +rehoning +rehonor +rehonour +rehood +rehook +rehoop +rehospitalization +rehospitalize +rehospitalized +rehospitalizing +rehouse +rehoused +rehouses +rehousing +rehumanization +rehumanize +rehumanized +rehumanizing +rehumble +rehumiliate +rehumiliated +rehumiliating +rehumiliation +rehung +rei +reice +reiced +reich +reichsgulden +reichsland +reichslander +reichsmark +reichsmarks +reichspfennig +reichstaler +reichsthaler +reicing +reid +reidentify +reidentification +reidentified +reidentifying +reif +reify +reification +reified +reifier +reifiers +reifies +reifying +reifs +reign +reigned +reigner +reigning +reignite +reignited +reignites +reigniting +reignition +reignore +reigns +reyield +reykjavik +reillume +reilluminate +reilluminated +reilluminating +reillumination +reillumine +reillustrate +reillustrated +reillustrating +reillustration +reim +reimage +reimaged +reimages +reimagination +reimagine +reimaging +reimbark +reimbarkation +reimbibe +reimbody +reimbursable +reimburse +reimburseable +reimbursed +reimbursement +reimbursements +reimburser +reimburses +reimbursing +reimbush +reimbushment +reimkennar +reimmerge +reimmerse +reimmersion +reimmigrant +reimmigration +reimpact +reimpark +reimpart +reimpatriate +reimpatriation +reimpel +reimplant +reimplantation +reimplement +reimplemented +reimply +reimplied +reimplying +reimport +reimportation +reimported +reimporting +reimports +reimportune +reimpose +reimposed +reimposes +reimposing +reimposition +reimposure +reimpregnate +reimpregnated +reimpregnating +reimpress +reimpression +reimprint +reimprison +reimprisoned +reimprisoning +reimprisonment +reimprisons +reimprove +reimprovement +reimpulse +rein +reina +reinability +reynard +reynards +reinaugurate +reinaugurated +reinaugurating +reinauguration +reincapable +reincarnadine +reincarnate +reincarnated +reincarnates +reincarnating +reincarnation +reincarnationism +reincarnationist +reincarnationists +reincarnations +reincense +reincentive +reincidence +reincidency +reincite +reincited +reincites +reinciting +reinclination +reincline +reinclined +reinclining +reinclude +reincluded +reincluding +reinclusion +reincorporate +reincorporated +reincorporates +reincorporating +reincorporation +reincrease +reincreased +reincreasing +reincrudate +reincrudation +reinculcate +reincur +reincurred +reincurring +reincurs +reindebted +reindebtedness +reindeer +reindeers +reindependence +reindex +reindexed +reindexes +reindexing +reindicate +reindicated +reindicating +reindication +reindict +reindictment +reindifferent +reindoctrinate +reindoctrinated +reindoctrinating +reindoctrination +reindorse +reindorsed +reindorsement +reindorsing +reinduce +reinduced +reinducement +reinduces +reinducing +reinduct +reinducted +reinducting +reinduction +reinducts +reindue +reindulge +reindulged +reindulgence +reindulging +reindustrialization +reindustrialize +reindustrialized +reindustrializing +reined +reiner +reinette +reinfect +reinfected +reinfecting +reinfection +reinfections +reinfectious +reinfects +reinfer +reinferred +reinferring +reinfest +reinfestation +reinfiltrate +reinfiltrated +reinfiltrating +reinfiltration +reinflame +reinflamed +reinflames +reinflaming +reinflatable +reinflate +reinflated +reinflating +reinflation +reinflict +reinfliction +reinfluence +reinfluenced +reinfluencing +reinforce +reinforceable +reinforced +reinforcement +reinforcements +reinforcer +reinforcers +reinforces +reinforcing +reinform +reinformed +reinforming +reinforms +reinfund +reinfuse +reinfused +reinfuses +reinfusing +reinfusion +reingraft +reingratiate +reingress +reinhabit +reinhabitation +reinhard +reinherit +reining +reinitialize +reinitialized +reinitializes +reinitializing +reinitiate +reinitiation +reinject +reinjure +reinjured +reinjures +reinjury +reinjuries +reinjuring +reink +reinless +reinoculate +reinoculated +reinoculates +reinoculating +reinoculation +reinoculations +reynold +reinquire +reinquired +reinquiry +reinquiries +reinquiring +reins +reinsane +reinsanity +reinscribe +reinscribed +reinscribes +reinscribing +reinsert +reinserted +reinserting +reinsertion +reinserts +reinsist +reinsman +reinsmen +reinspect +reinspected +reinspecting +reinspection +reinspector +reinspects +reinsphere +reinspiration +reinspire +reinspired +reinspiring +reinspirit +reinstall +reinstallation +reinstallations +reinstalled +reinstalling +reinstallment +reinstallments +reinstalls +reinstalment +reinstate +reinstated +reinstatement +reinstatements +reinstates +reinstating +reinstation +reinstator +reinstauration +reinstil +reinstill +reinstitute +reinstituted +reinstituting +reinstitution +reinstruct +reinstructed +reinstructing +reinstruction +reinstructs +reinsulate +reinsulated +reinsulating +reinsult +reinsurance +reinsure +reinsured +reinsurer +reinsures +reinsuring +reintegrate +reintegrated +reintegrates +reintegrating +reintegration +reintegrative +reintend +reinter +reintercede +reintercession +reinterchange +reinterest +reinterfere +reinterference +reinterment +reinterpret +reinterpretation +reinterpretations +reinterpreted +reinterpreting +reinterprets +reinterred +reinterring +reinterrogate +reinterrogated +reinterrogates +reinterrogating +reinterrogation +reinterrogations +reinterrupt +reinterruption +reinters +reintervene +reintervened +reintervening +reintervention +reinterview +reinthrone +reintimate +reintimation +reintitule +reintrench +reintrenched +reintrenches +reintrenching +reintrenchment +reintroduce +reintroduced +reintroduces +reintroducing +reintroduction +reintrude +reintrusion +reintuition +reintuitive +reinvade +reinvaded +reinvading +reinvasion +reinvent +reinvented +reinventing +reinvention +reinventor +reinvents +reinversion +reinvert +reinvest +reinvested +reinvestigate +reinvestigated +reinvestigates +reinvestigating +reinvestigation +reinvestigations +reinvesting +reinvestiture +reinvestment +reinvests +reinvigorate +reinvigorated +reinvigorates +reinvigorating +reinvigoration +reinvigorator +reinvitation +reinvite +reinvited +reinvites +reinviting +reinvoice +reinvoke +reinvoked +reinvokes +reinvoking +reinvolve +reinvolved +reinvolvement +reinvolves +reinvolving +reinwardtia +reyoke +reyoked +reyoking +reyouth +reirrigate +reirrigated +reirrigating +reirrigation +reis +reisner +reisolate +reisolated +reisolating +reisolation +reyson +reissuable +reissuably +reissue +reissued +reissuement +reissuer +reissuers +reissues +reissuing +reist +reister +reit +reitbok +reitboks +reitbuck +reitemize +reitemized +reitemizing +reiter +reiterable +reiterance +reiterant +reiterate +reiterated +reiteratedly +reiteratedness +reiterates +reiterating +reiteration +reiterations +reiterative +reiteratively +reiterativeness +reiterator +reive +reived +reiver +reivers +reives +reiving +rejail +rejang +reject +rejectable +rejectableness +rejectage +rejectamenta +rejectaneous +rejected +rejectee +rejectees +rejecter +rejecters +rejecting +rejectingly +rejection +rejections +rejective +rejectment +rejector +rejectors +rejects +rejeopardize +rejeopardized +rejeopardizing +rejerk +rejig +rejigger +rejiggered +rejiggering +rejiggers +rejoice +rejoiced +rejoiceful +rejoicement +rejoicer +rejoicers +rejoices +rejoicing +rejoicingly +rejoin +rejoinder +rejoinders +rejoindure +rejoined +rejoining +rejoins +rejolt +rejoneador +rejoneo +rejounce +rejourn +rejourney +rejudge +rejudged +rejudgement +rejudges +rejudging +rejudgment +rejumble +rejunction +rejustify +rejustification +rejustified +rejustifying +rejuvenant +rejuvenate +rejuvenated +rejuvenates +rejuvenating +rejuvenation +rejuvenations +rejuvenative +rejuvenator +rejuvenesce +rejuvenescence +rejuvenescent +rejuvenise +rejuvenised +rejuvenising +rejuvenize +rejuvenized +rejuvenizing +rekey +rekeyed +rekeying +rekeys +rekhti +reki +rekick +rekill +rekindle +rekindled +rekindlement +rekindler +rekindles +rekindling +reking +rekinole +rekiss +reknead +reknit +reknits +reknitted +reknitting +reknock +reknot +reknotted +reknotting +reknow +rel +relabel +relabeled +relabeling +relabelled +relabelling +relabels +relace +relaced +relaces +relache +relacing +relacquer +relade +reladen +reladle +reladled +reladling +relay +relaid +relayed +relayer +relaying +relayman +relais +relays +relament +relamp +relance +relanced +relancing +reland +relap +relapper +relapsable +relapse +relapsed +relapseproof +relapser +relapsers +relapses +relapsing +relast +relaster +relata +relatability +relatable +relatch +relate +related +relatedly +relatedness +relater +relaters +relates +relating +relatinization +relation +relational +relationality +relationally +relationals +relationary +relatione +relationism +relationist +relationless +relations +relationship +relationships +relatival +relative +relatively +relativeness +relatives +relativism +relativist +relativistic +relativistically +relativity +relativization +relativize +relator +relators +relatrix +relatum +relaunch +relaunched +relaunches +relaunching +relaunder +relaundered +relaundering +relaunders +relax +relaxable +relaxant +relaxants +relaxation +relaxations +relaxative +relaxatory +relaxed +relaxedly +relaxedness +relaxer +relaxers +relaxes +relaxin +relaxing +relaxins +relbun +relead +releap +relearn +relearned +relearning +relearns +relearnt +releasability +releasable +releasably +release +released +releasee +releasement +releaser +releasers +releases +releasibility +releasible +releasing +releasor +releather +relection +relegable +relegate +relegated +relegates +relegating +relegation +releivo +releivos +relend +relending +relends +relent +relented +relenting +relentingly +relentless +relentlessly +relentlessness +relentment +relents +reles +relessa +relessee +relessor +relet +relets +reletter +relettered +relettering +reletters +reletting +relevance +relevances +relevancy +relevancies +relevant +relevantly +relevate +relevation +relevator +releve +relevel +releveled +releveling +relevent +relever +relevy +relevied +relevying +rely +reliability +reliabilities +reliable +reliableness +reliably +reliance +reliances +reliant +reliantly +reliberate +reliberated +reliberating +relic +relicary +relicense +relicensed +relicenses +relicensing +relick +reliclike +relicmonger +relics +relict +relictae +relicted +relicti +reliction +relicts +relide +relied +relief +reliefer +reliefless +reliefs +relier +reliers +relies +relievable +relieve +relieved +relievedly +relievement +reliever +relievers +relieves +relieving +relievingly +relievo +relievos +relift +relig +religate +religation +relight +relightable +relighted +relighten +relightener +relighter +relighting +relights +religieuse +religieuses +religieux +religio +religion +religionary +religionate +religioner +religionism +religionist +religionistic +religionists +religionize +religionless +religions +religiose +religiosity +religioso +religious +religiously +religiousness +reliiant +relying +relime +relimit +relimitation +reline +relined +reliner +relines +relining +relink +relinked +relinquent +relinquish +relinquished +relinquisher +relinquishers +relinquishes +relinquishing +relinquishment +relinquishments +reliquaire +reliquary +reliquaries +relique +reliquefy +reliquefied +reliquefying +reliques +reliquiae +reliquian +reliquidate +reliquidated +reliquidates +reliquidating +reliquidation +reliquism +relish +relishable +relished +relisher +relishes +relishy +relishing +relishingly +relishsome +relist +relisted +relisten +relisting +relists +relit +relitigate +relitigated +relitigating +relitigation +relivable +relive +relived +reliver +relives +reliving +rellyan +rellyanism +rellyanite +reload +reloaded +reloader +reloaders +reloading +reloads +reloan +reloaned +reloaning +reloans +relocable +relocatability +relocatable +relocate +relocated +relocatee +relocates +relocating +relocation +relocations +relocator +relock +relodge +relong +relook +relose +relosing +relost +relot +relove +relower +relubricate +relubricated +relubricating +reluce +relucent +reluct +reluctance +reluctancy +reluctant +reluctantly +reluctate +reluctation +relucted +relucting +reluctivity +relucts +relume +relumed +relumes +relumine +relumined +relumines +reluming +relumining +rem +remade +remagnetization +remagnetize +remagnetized +remagnetizing +remagnify +remagnification +remagnified +remagnifying +remail +remailed +remailing +remails +remaim +remain +remainder +remaindered +remaindering +remainderman +remaindermen +remainders +remaindership +remaindment +remained +remainer +remaining +remains +remaintain +remaintenance +remake +remaker +remakes +remaking +reman +remanage +remanagement +remanation +remancipate +remancipation +remand +remanded +remanding +remandment +remands +remanence +remanency +remanent +remanet +remanie +remanifest +remanifestation +remanipulate +remanipulation +remanned +remanning +remans +remantle +remanufacture +remanufactured +remanufacturer +remanufactures +remanufacturing +remanure +remap +remapped +remapping +remaps +remarch +remargin +remark +remarkability +remarkable +remarkableness +remarkably +remarked +remarkedly +remarker +remarkers +remarket +remarking +remarks +remarque +remarques +remarry +remarriage +remarriages +remarried +remarries +remarrying +remarshal +remarshaled +remarshaling +remarshalling +remask +remass +remast +remaster +remastery +remasteries +remasticate +remasticated +remasticating +remastication +rematch +rematched +rematches +rematching +rematerialization +rematerialize +rematerialized +rematerializing +rematriculate +rematriculated +rematriculating +remblai +remble +remblere +rembrandt +rembrandtesque +rembrandtish +rembrandtism +remeant +remeasure +remeasured +remeasurement +remeasurements +remeasures +remeasuring +remede +remedy +remediability +remediable +remediableness +remediably +remedial +remedially +remediate +remediated +remediating +remediation +remedied +remedies +remedying +remediless +remedilessly +remedilessness +remeditate +remeditation +remedium +remeet +remeeting +remeets +remelt +remelted +remelting +remelts +remember +rememberability +rememberable +rememberably +remembered +rememberer +rememberers +remembering +rememberingly +remembers +remembrance +remembrancer +remembrancership +remembrances +rememorate +rememoration +rememorative +rememorize +rememorized +rememorizing +remen +remenace +remenant +remend +remended +remending +remends +remene +remention +remercy +remerge +remerged +remerges +remerging +remet +remetal +remex +remi +remica +remicate +remication +remicle +remiform +remigate +remigation +remiges +remigial +remigrant +remigrate +remigrated +remigrates +remigrating +remigration +remigrations +remijia +remilitarization +remilitarize +remilitarized +remilitarizes +remilitarizing +remill +remillable +remimic +remind +remindal +reminded +reminder +reminders +remindful +reminding +remindingly +reminds +remineralization +remineralize +remingle +remingled +remingling +reminisce +reminisced +reminiscence +reminiscenceful +reminiscencer +reminiscences +reminiscency +reminiscent +reminiscential +reminiscentially +reminiscently +reminiscer +reminisces +reminiscing +reminiscitory +remint +reminted +reminting +remints +remiped +remirror +remise +remised +remises +remising +remisrepresent +remisrepresentation +remiss +remissful +remissibility +remissible +remissibleness +remissibly +remission +remissions +remissive +remissively +remissiveness +remissly +remissness +remissory +remisunderstand +remit +remital +remitment +remits +remittable +remittal +remittals +remittance +remittancer +remittances +remitted +remittee +remittence +remittency +remittent +remittently +remitter +remitters +remitting +remittitur +remittor +remittors +remix +remixed +remixes +remixing +remixt +remixture +remnant +remnantal +remnants +remobilization +remobilize +remobilized +remobilizing +remoboth +remock +remodel +remodeled +remodeler +remodelers +remodeling +remodelled +remodeller +remodelling +remodelment +remodels +remodify +remodification +remodified +remodifies +remodifying +remodulate +remodulated +remodulating +remolade +remolades +remold +remolded +remolding +remolds +remollient +remollify +remollified +remollifying +remonetisation +remonetise +remonetised +remonetising +remonetization +remonetize +remonetized +remonetizes +remonetizing +remonstrance +remonstrances +remonstrant +remonstrantly +remonstrate +remonstrated +remonstrates +remonstrating +remonstratingly +remonstration +remonstrations +remonstrative +remonstratively +remonstrator +remonstratory +remonstrators +remontado +remontant +remontoir +remontoire +remop +remora +remoras +remorate +remord +remore +remorid +remorse +remorseful +remorsefully +remorsefulness +remorseless +remorselessly +remorselessness +remorseproof +remorses +remortgage +remortgaged +remortgages +remortgaging +remote +remoted +remotely +remoteness +remoter +remotest +remotion +remotions +remotive +remoulade +remould +remount +remounted +remounting +remounts +removability +removable +removableness +removably +removal +removalist +removals +remove +removed +removedly +removedness +removeless +removement +remover +removers +removes +removing +rems +remuable +remuda +remudas +remue +remultiply +remultiplication +remultiplied +remultiplying +remunerability +remunerable +remunerably +remunerate +remunerated +remunerates +remunerating +remuneration +remunerations +remunerative +remuneratively +remunerativeness +remunerator +remuneratory +remunerators +remurmur +remus +remuster +remutation +ren +renable +renably +renay +renail +renaissance +renaissancist +renaissant +renal +rename +renamed +renames +renaming +renardine +renascence +renascences +renascency +renascent +renascible +renascibleness +renate +renationalize +renationalized +renationalizing +renaturation +renature +renatured +renatures +renaturing +renavigate +renavigated +renavigating +renavigation +rencontre +rencontres +rencounter +rencountered +rencountering +rencounters +renculus +rend +rended +rendement +render +renderable +rendered +renderer +renderers +rendering +renderings +renders +renderset +rendezvous +rendezvoused +rendezvouses +rendezvousing +rendibility +rendible +rending +rendition +renditions +rendlewood +rendoun +rendrock +rends +rendu +rendzina +rendzinas +reneague +renealmia +renecessitate +reneg +renegade +renegaded +renegades +renegading +renegadism +renegado +renegadoes +renegados +renegate +renegated +renegating +renegation +renege +reneged +reneger +renegers +reneges +reneging +reneglect +renegotiable +renegotiate +renegotiated +renegotiates +renegotiating +renegotiation +renegotiations +renegotiator +renegue +renerve +renes +renet +renette +reneutralize +reneutralized +reneutralizing +renew +renewability +renewable +renewably +renewal +renewals +renewed +renewedly +renewedness +renewer +renewers +renewing +renewment +renews +renforce +renga +rengue +renguera +renicardiac +renickel +reniculus +renidify +renidification +reniform +renig +renigged +renigging +renigs +renilla +renillidae +renin +renins +renipericardial +reniportal +renipuncture +renish +renishly +renitence +renitency +renitent +renk +renky +renn +rennase +rennases +renne +renner +rennet +renneting +rennets +rennin +renninogen +rennins +renniogen +reno +renocutaneous +renogastric +renogram +renograms +renography +renographic +renointestinal +renoir +renomee +renominate +renominated +renominates +renominating +renomination +renominations +renomme +renommee +renone +renopericardial +renopulmonary +renormalization +renormalize +renormalized +renormalizing +renotarize +renotarized +renotarizing +renotation +renotice +renoticed +renoticing +renotify +renotification +renotified +renotifies +renotifying +renounce +renounceable +renounced +renouncement +renouncements +renouncer +renouncers +renounces +renouncing +renourish +renourishment +renovare +renovate +renovated +renovater +renovates +renovating +renovatingly +renovation +renovations +renovative +renovator +renovatory +renovators +renove +renovel +renovize +renown +renowned +renownedly +renownedness +renowner +renownful +renowning +renownless +renowns +rensselaerite +rent +rentability +rentable +rentage +rental +rentaler +rentaller +rentals +rente +rented +rentee +renter +renters +rentes +rentier +rentiers +renting +rentless +rentrayeuse +rentrant +rentree +rents +renu +renule +renullify +renullification +renullified +renullifying +renumber +renumbered +renumbering +renumbers +renumerate +renumerated +renumerating +renumeration +renunciable +renunciance +renunciant +renunciate +renunciation +renunciations +renunciative +renunciator +renunciatory +renunculus +renverse +renversement +renvoi +renvoy +renvois +renwick +reobject +reobjected +reobjecting +reobjectivization +reobjectivize +reobjects +reobligate +reobligated +reobligating +reobligation +reoblige +reobliged +reobliging +reobscure +reobservation +reobserve +reobserved +reobserving +reobtain +reobtainable +reobtained +reobtaining +reobtainment +reobtains +reoccasion +reoccupation +reoccupations +reoccupy +reoccupied +reoccupies +reoccupying +reoccur +reoccurred +reoccurrence +reoccurrences +reoccurring +reoccurs +reoffend +reoffense +reoffer +reoffered +reoffering +reoffers +reoffset +reoil +reoiled +reoiling +reoils +reometer +reomission +reomit +reopen +reopened +reopener +reopening +reopenings +reopens +reoperate +reoperated +reoperating +reoperation +reophore +reoppose +reopposed +reopposes +reopposing +reopposition +reoppress +reoppression +reorchestrate +reorchestrated +reorchestrating +reorchestration +reordain +reordained +reordaining +reordains +reorder +reordered +reordering +reorders +reordinate +reordination +reorganise +reorganised +reorganiser +reorganising +reorganization +reorganizational +reorganizationist +reorganizations +reorganize +reorganized +reorganizer +reorganizers +reorganizes +reorganizing +reorient +reorientate +reorientated +reorientating +reorientation +reorientations +reoriented +reorienting +reorients +reornament +reoutfit +reoutfitted +reoutfitting +reoutline +reoutlined +reoutlining +reoutput +reoutrage +reovercharge +reoverflow +reovertake +reoverwork +reovirus +reoviruses +reown +reoxidation +reoxidise +reoxidised +reoxidising +reoxidize +reoxidized +reoxidizing +reoxygenate +reoxygenize +rep +repace +repacify +repacification +repacified +repacifies +repacifying +repack +repackage +repackaged +repackager +repackages +repackaging +repacked +repacker +repacking +repacks +repad +repadded +repadding +repaganization +repaganize +repaganizer +repage +repaginate +repaginated +repaginates +repaginating +repagination +repay +repayable +repayal +repaid +repayed +repaying +repayment +repayments +repaint +repainted +repainting +repaints +repair +repairability +repairable +repairableness +repaired +repairer +repairers +repairing +repairman +repairmen +repairs +repays +repale +repand +repandly +repandodentate +repandodenticulate +repandolobate +repandous +repandousness +repanel +repaneled +repaneling +repaper +repapered +repapering +repapers +reparability +reparable +reparably +reparagraph +reparate +reparation +reparations +reparative +reparatory +reparel +repark +repart +repartable +repartake +repartee +reparteeist +repartees +reparticipate +reparticipation +repartition +repartitionable +repas +repass +repassable +repassage +repassant +repassed +repasser +repasses +repassing +repast +repaste +repasted +repasting +repasts +repasture +repatch +repatency +repatent +repatriable +repatriate +repatriated +repatriates +repatriating +repatriation +repatriations +repatrol +repatrolled +repatrolling +repatronize +repatronized +repatronizing +repattern +repave +repaved +repavement +repaves +repaving +repawn +repeal +repealability +repealable +repealableness +repealed +repealer +repealers +repealing +repealist +repealless +repeals +repeat +repeatability +repeatable +repeatal +repeated +repeatedly +repeater +repeaters +repeating +repeats +repechage +repeddle +repeddled +repeddling +repeg +repel +repellance +repellant +repellantly +repelled +repellence +repellency +repellent +repellently +repellents +repeller +repellers +repelling +repellingly +repellingness +repels +repen +repenalize +repenalized +repenalizing +repenetrate +repenned +repenning +repension +repent +repentable +repentance +repentant +repentantly +repented +repenter +repenters +repenting +repentingly +repents +repeople +repeopled +repeoples +repeopling +reperceive +reperceived +reperceiving +repercept +reperception +repercolation +repercuss +repercussion +repercussions +repercussive +repercussively +repercussiveness +repercussor +repercutient +reperforator +reperform +reperformance +reperfume +reperible +reperk +reperked +reperking +reperks +repermission +repermit +reperplex +repersonalization +repersonalize +repersuade +repersuasion +repertoire +repertoires +repertory +repertorial +repertories +repertorily +repertorium +reperusal +reperuse +reperused +reperusing +repetatively +repetend +repetends +repetitae +repetiteur +repetiteurs +repetition +repetitional +repetitionary +repetitions +repetitious +repetitiously +repetitiousness +repetitive +repetitively +repetitiveness +repetitory +repetoire +repetticoat +repew +rephael +rephase +rephonate +rephosphorization +rephosphorize +rephotograph +rephrase +rephrased +rephrases +rephrasing +repic +repick +repicture +repiece +repile +repin +repine +repined +repineful +repinement +repiner +repiners +repines +repining +repiningly +repinned +repinning +repins +repipe +repique +repiqued +repiquing +repitch +repkie +repl +replace +replaceability +replaceable +replaced +replacement +replacements +replacer +replacers +replaces +replacing +replay +replayed +replaying +replays +replait +replan +replane +replaned +replaning +replanned +replanning +replans +replant +replantable +replantation +replanted +replanter +replanting +replants +replaster +replate +replated +replates +replating +replead +repleader +repleading +repleat +repledge +repledged +repledger +repledges +repledging +replenish +replenished +replenisher +replenishers +replenishes +replenishing +replenishingly +replenishment +replete +repletely +repleteness +repletion +repletive +repletively +repletory +repleve +replevy +repleviable +replevied +replevies +replevying +replevin +replevined +replevining +replevins +replevisable +replevisor +reply +replial +repliant +replica +replicable +replicant +replicas +replicate +replicated +replicates +replicatile +replicating +replication +replications +replicative +replicatively +replicatory +replied +replier +repliers +replies +replight +replying +replyingly +replique +replod +replot +replotment +replotted +replotter +replotting +replough +replow +replowed +replowing +replum +replume +replumed +repluming +replunder +replunge +replunged +replunges +replunging +repocket +repoint +repolarization +repolarize +repolarized +repolarizing +repolymerization +repolymerize +repolish +repolished +repolishes +repolishing +repoll +repollute +repolon +reponder +repondez +repone +repope +repopularization +repopularize +repopularized +repopularizing +repopulate +repopulated +repopulates +repopulating +repopulation +report +reportable +reportage +reportages +reported +reportedly +reporter +reporteress +reporterism +reporters +reportership +reporting +reportingly +reportion +reportorial +reportorially +reports +reposal +reposals +repose +reposed +reposedly +reposedness +reposeful +reposefully +reposefulness +reposer +reposers +reposes +reposing +reposit +repositary +reposited +repositing +reposition +repositioned +repositioning +repositions +repositor +repository +repositories +reposits +reposoir +repossess +repossessed +repossesses +repossessing +repossession +repossessions +repossessor +repost +repostpone +repostponed +repostponing +repostulate +repostulated +repostulating +repostulation +reposure +repot +repound +repour +repoured +repouring +repours +repouss +repoussage +repousse +repousses +repowder +repower +repowered +repowering +repowers +repp +repped +repps +repr +repractice +repracticed +repracticing +repray +repraise +repraised +repraising +repreach +reprecipitate +reprecipitation +repredict +reprefer +reprehend +reprehendable +reprehendatory +reprehended +reprehender +reprehending +reprehends +reprehensibility +reprehensible +reprehensibleness +reprehensibly +reprehension +reprehensive +reprehensively +reprehensory +repremise +repremised +repremising +repreparation +reprepare +reprepared +repreparing +represcribe +represcribed +represcribing +represent +representability +representable +representably +representamen +representant +representation +representational +representationalism +representationalist +representationalistic +representationally +representationary +representationes +representationism +representationist +representations +representative +representatively +representativeness +representatives +representativeship +representativity +represented +representee +representer +representing +representment +representor +represents +represide +repress +repressed +repressedly +represser +represses +repressibility +repressibilities +repressible +repressibly +repressing +repression +repressionary +repressionist +repressions +repressive +repressively +repressiveness +repressment +repressor +repressory +repressure +repry +reprice +repriced +reprices +repricing +reprievable +reprieval +reprieve +reprieved +repriever +reprievers +reprieves +reprieving +reprimand +reprimanded +reprimander +reprimanding +reprimandingly +reprimands +reprime +reprimed +reprimer +repriming +reprint +reprinted +reprinter +reprinting +reprintings +reprints +reprisal +reprisalist +reprisals +reprise +reprised +reprises +reprising +repristinate +repristination +reprivatization +reprivatize +reprivilege +repro +reproach +reproachability +reproachable +reproachableness +reproachably +reproached +reproacher +reproaches +reproachful +reproachfully +reproachfulness +reproaching +reproachingly +reproachless +reproachlessness +reprobacy +reprobance +reprobate +reprobated +reprobateness +reprobater +reprobates +reprobating +reprobation +reprobationary +reprobationer +reprobative +reprobatively +reprobator +reprobatory +reprobe +reprobed +reprobes +reprobing +reproceed +reprocess +reprocessed +reprocesses +reprocessing +reproclaim +reproclamation +reprocurable +reprocure +reproduce +reproduceable +reproduced +reproducer +reproducers +reproduces +reproducibility +reproducibilities +reproducible +reproducibly +reproducing +reproduction +reproductionist +reproductions +reproductive +reproductively +reproductiveness +reproductivity +reproductory +reprofane +reprofess +reproffer +reprogram +reprogrammed +reprogramming +reprograms +reprography +reprohibit +reproject +repromise +repromised +repromising +repromulgate +repromulgated +repromulgating +repromulgation +repronounce +repronunciation +reproof +reproofless +reproofs +repropagate +repropitiate +repropitiation +reproportion +reproposal +repropose +reproposed +reproposing +repros +reprosecute +reprosecuted +reprosecuting +reprosecution +reprosper +reprotect +reprotection +reprotest +reprovability +reprovable +reprovableness +reprovably +reproval +reprovals +reprove +reproved +reprover +reprovers +reproves +reprovide +reproving +reprovingly +reprovision +reprovocation +reprovoke +reprune +repruned +repruning +reps +rept +reptant +reptation +reptatory +reptatorial +reptile +reptiledom +reptilelike +reptiles +reptilferous +reptilia +reptilian +reptilians +reptiliary +reptiliform +reptilious +reptiliousness +reptilism +reptility +reptilivorous +reptiloid +republic +republica +republical +republican +republicanisation +republicanise +republicanised +republicaniser +republicanising +republicanism +republicanization +republicanize +republicanizer +republicans +republication +republics +republish +republishable +republished +republisher +republishes +republishing +republishment +repudative +repuddle +repudiable +repudiate +repudiated +repudiates +repudiating +repudiation +repudiationist +repudiations +repudiative +repudiator +repudiatory +repudiators +repuff +repugn +repugnable +repugnance +repugnancy +repugnant +repugnantly +repugnantness +repugnate +repugnatorial +repugned +repugner +repugning +repugns +repullulate +repullulation +repullulative +repullulescent +repulpit +repulse +repulsed +repulseless +repulseproof +repulser +repulsers +repulses +repulsing +repulsion +repulsions +repulsive +repulsively +repulsiveness +repulsor +repulsory +repulverize +repump +repunch +repunctuate +repunctuated +repunctuating +repunctuation +repunish +repunishable +repunishment +repurchase +repurchased +repurchaser +repurchases +repurchasing +repure +repurge +repurify +repurification +repurified +repurifies +repurifying +repurple +repurpose +repurposed +repurposing +repursue +repursued +repursues +repursuing +repursuit +reputability +reputable +reputableness +reputably +reputation +reputationless +reputations +reputative +reputatively +repute +reputed +reputedly +reputeless +reputes +reputing +req +reqd +requalify +requalification +requalified +requalifying +requarantine +requeen +requench +request +requested +requester +requesters +requesting +requestion +requestor +requestors +requests +requeued +requicken +requiem +requiems +requienia +requiescat +requiescence +requin +requins +requirable +require +required +requirement +requirements +requirer +requirers +requires +requiring +requisite +requisitely +requisiteness +requisites +requisition +requisitionary +requisitioned +requisitioner +requisitioners +requisitioning +requisitionist +requisitions +requisitor +requisitory +requisitorial +requit +requitable +requital +requitals +requitative +requite +requited +requiteful +requiteless +requitement +requiter +requiters +requites +requiting +requiz +requotation +requote +requoted +requoting +rerack +reracker +reradiate +reradiated +reradiates +reradiating +reradiation +rerail +rerailer +reraise +rerake +reran +rerank +rerate +rerated +rerating +reread +rereader +rereading +rereads +rerebrace +rerecord +rerecorded +rerecording +rerecords +reredos +reredoses +reree +rereel +rereeve +rerefief +reregister +reregistration +reregulate +reregulated +reregulating +reregulation +rereign +rerelease +reremice +reremmice +reremouse +rerent +rerental +reresupper +rereward +rerewards +rerig +rering +rerise +rerisen +rerises +rerising +rerival +rerivet +rerob +rerobe +reroyalize +reroll +rerolled +reroller +rerollers +rerolling +rerolls +reroof +reroot +rerope +rerose +reroute +rerouted +reroutes +rerouting +rerow +rerub +rerummage +rerun +rerunning +reruns +res +resaca +resack +resacrifice +resaddle +resaddled +resaddles +resaddling +resay +resaid +resaying +resail +resailed +resailing +resails +resays +resalable +resale +resaleable +resales +resalgar +resalt +resalutation +resalute +resaluted +resalutes +resaluting +resalvage +resample +resampled +resamples +resampling +resanctify +resanction +resarcelee +resat +resatisfaction +resatisfy +resave +resaw +resawed +resawer +resawyer +resawing +resawn +resaws +resazurin +rescale +rescaled +rescales +rescaling +rescan +rescattering +reschedule +rescheduled +reschedules +rescheduling +reschool +rescind +rescindable +rescinded +rescinder +rescinding +rescindment +rescinds +rescissible +rescission +rescissions +rescissory +rescore +rescored +rescores +rescoring +rescounter +rescous +rescramble +rescratch +rescreen +rescreened +rescreening +rescreens +rescribe +rescript +rescription +rescriptive +rescriptively +rescripts +rescrub +rescrubbed +rescrubbing +rescrutiny +rescrutinies +rescrutinize +rescrutinized +rescrutinizing +rescuable +rescue +rescued +rescueless +rescuer +rescuers +rescues +rescuing +rescusser +reseal +resealable +resealed +resealing +reseals +reseam +research +researchable +researched +researcher +researchers +researches +researchful +researching +researchist +reseason +reseat +reseated +reseating +reseats +reseau +reseaus +reseaux +resecate +resecrete +resecretion +resect +resectability +resectabilities +resectable +resected +resecting +resection +resectional +resections +resectoscope +resects +resecure +resecured +resecuring +reseda +resedaceae +resedaceous +resedas +resee +reseed +reseeded +reseeding +reseeds +reseeing +reseek +reseeking +reseeks +reseen +resees +resegment +resegmentation +resegregate +resegregated +resegregating +resegregation +reseise +reseiser +reseize +reseized +reseizer +reseizes +reseizing +reseizure +reselect +reselected +reselecting +reselection +reselects +reself +resell +reseller +resellers +reselling +resells +resemblable +resemblance +resemblances +resemblant +resemble +resembled +resembler +resembles +resembling +resemblingly +reseminate +resend +resending +resends +resene +resensation +resensitization +resensitize +resensitized +resensitizing +resent +resentationally +resented +resentence +resentenced +resentencing +resenter +resentful +resentfully +resentfullness +resentfulness +resentience +resentiment +resenting +resentingly +resentive +resentless +resentment +resentments +resents +reseparate +reseparated +reseparating +reseparation +resepulcher +resequencing +resequent +resequester +resequestration +reserate +reserene +reserpine +reserpinized +reservable +reserval +reservation +reservationist +reservations +reservative +reservatory +reserve +reserved +reservedly +reservedness +reservee +reserveful +reserveless +reserver +reservery +reservers +reserves +reservice +reserviced +reservicing +reserving +reservist +reservists +reservoir +reservoired +reservoirs +reservor +reset +resets +resettable +resetter +resetters +resetting +resettings +resettle +resettled +resettlement +resettlements +resettles +resettling +resever +resew +resewed +resewing +resewn +resews +resex +resgat +resh +reshake +reshaken +reshaking +reshape +reshaped +reshaper +reshapers +reshapes +reshaping +reshare +reshared +resharing +resharpen +resharpened +resharpening +resharpens +reshave +reshaved +reshaving +reshear +reshearer +resheathe +reshelve +reshes +reshew +reshift +reshine +reshined +reshingle +reshingled +reshingling +reshining +reship +reshipment +reshipments +reshipped +reshipper +reshipping +reships +reshod +reshoe +reshoeing +reshoes +reshook +reshoot +reshooting +reshoots +reshorten +reshot +reshoulder +reshovel +reshow +reshowed +reshower +reshowing +reshown +reshows +reshrine +reshuffle +reshuffled +reshuffles +reshuffling +reshun +reshunt +reshut +reshutting +reshuttle +resiance +resiancy +resiant +resiccate +resicken +resid +reside +resided +residence +residencer +residences +residency +residencia +residencies +resident +residental +residenter +residential +residentiality +residentially +residentiary +residentiaryship +residents +residentship +resider +residers +resides +residing +residiuum +resids +residua +residual +residually +residuals +residuary +residuation +residue +residuent +residues +residuous +residuua +residuum +residuums +resift +resifted +resifting +resifts +resigh +resight +resign +resignal +resignaled +resignaling +resignatary +resignation +resignationism +resignations +resigned +resignedly +resignedness +resignee +resigner +resigners +resignful +resigning +resignment +resigns +resile +resiled +resilement +resiles +resilia +resilial +resiliate +resilience +resiliency +resilient +resiliently +resilifer +resiling +resiliometer +resilition +resilium +resyllabification +resilver +resilvered +resilvering +resilvers +resymbolization +resymbolize +resymbolized +resymbolizing +resimmer +resin +resina +resinaceous +resinate +resinated +resinates +resinating +resinbush +resynchronization +resynchronize +resynchronized +resynchronizing +resined +resiner +resinfiable +resing +resiny +resinic +resiniferous +resinify +resinification +resinified +resinifies +resinifying +resinifluous +resiniform +resining +resinize +resink +resinlike +resinoelectric +resinoextractive +resinogenous +resinoid +resinoids +resinol +resinolic +resinophore +resinosis +resinous +resinously +resinousness +resinovitreous +resins +resyntheses +resynthesis +resynthesize +resynthesized +resynthesizing +resynthetize +resynthetized +resynthetizing +resipiscence +resipiscent +resist +resistability +resistable +resistableness +resistably +resistance +resistances +resistant +resistante +resistantes +resistantly +resistants +resistate +resisted +resystematize +resystematized +resystematizing +resistence +resistent +resister +resisters +resistful +resistibility +resistible +resistibleness +resistibly +resisting +resistingly +resistive +resistively +resistiveness +resistivity +resistless +resistlessly +resistlessness +resistor +resistors +resists +resit +resitting +resituate +resituated +resituates +resituating +resize +resized +resizer +resizes +resizing +resketch +reskew +reskin +reslay +reslander +reslash +reslate +reslide +reslot +resmell +resmelt +resmelted +resmelting +resmelts +resmile +resmooth +resmoothed +resmoothing +resmooths +resnap +resnatch +resnatron +resnub +resoak +resoap +resoften +resoil +resojet +resojets +resojourn +resold +resolder +resoldered +resoldering +resolders +resole +resoled +resolemnize +resoles +resolicit +resolicitation +resolidify +resolidification +resoling +resolubility +resoluble +resolubleness +resolute +resolutely +resoluteness +resoluter +resolutes +resolutest +resolution +resolutioner +resolutionist +resolutions +resolutive +resolutory +resolvability +resolvable +resolvableness +resolvancy +resolve +resolved +resolvedly +resolvedness +resolvend +resolvent +resolver +resolvers +resolves +resolvible +resolving +resonance +resonances +resonancy +resonancies +resonant +resonantly +resonants +resonate +resonated +resonates +resonating +resonation +resonations +resonator +resonatory +resonators +resoothe +resorb +resorbed +resorbence +resorbent +resorbing +resorbs +resorcylic +resorcin +resorcinal +resorcine +resorcinism +resorcinol +resorcinolphthalein +resorcins +resorcinum +resorption +resorptive +resort +resorted +resorter +resorters +resorting +resorts +resorufin +resought +resound +resounded +resounder +resounding +resoundingly +resounds +resource +resourceful +resourcefully +resourcefulness +resourceless +resourcelessness +resources +resoutive +resow +resowed +resowing +resown +resows +resp +respace +respaced +respacing +respade +respaded +respading +respan +respangle +resparkle +respasse +respeak +respecify +respecification +respecifications +respecified +respecifying +respect +respectability +respectabilities +respectabilize +respectable +respectableness +respectably +respectant +respected +respecter +respecters +respectful +respectfully +respectfulness +respecting +respection +respective +respectively +respectiveness +respectless +respectlessly +respectlessness +respects +respectum +respectuous +respectworthy +respell +respelled +respelling +respells +respelt +respersive +respice +respiced +respicing +respin +respirability +respirable +respirableness +respirating +respiration +respirational +respirations +respirative +respirator +respiratored +respiratory +respiratorium +respirators +respire +respired +respires +respiring +respirit +respirometer +respirometry +respirometric +respite +respited +respiteless +respites +respiting +resplend +resplendence +resplendency +resplendent +resplendently +resplendish +resplice +respliced +resplicing +resplit +respoke +respond +responde +respondeat +responded +respondence +respondences +respondency +respondencies +respondendum +respondent +respondentia +respondents +responder +responders +responding +responds +responsa +responsable +responsal +responsary +response +responseless +responser +responses +responsibility +responsibilities +responsible +responsibleness +responsibles +responsibly +responsion +responsions +responsive +responsively +responsiveness +responsivity +responsor +responsory +responsorial +responsories +responsum +responsusa +respot +respray +resprang +respread +respreading +respreads +respring +respringing +resprings +resprinkle +resprinkled +resprinkling +resprout +resprung +respue +resquander +resquare +resqueak +ressaidar +ressala +ressalah +ressaldar +ressaut +ressentiment +resshot +ressort +rest +restab +restabbed +restabbing +restabilization +restabilize +restabilized +restabilizing +restable +restabled +restabling +restack +restacked +restacking +restacks +restaff +restaffed +restaffing +restaffs +restage +restaged +restages +restaging +restagnate +restain +restainable +restake +restamp +restamped +restamping +restamps +restandardization +restandardize +restant +restart +restartable +restarted +restarting +restarts +restate +restated +restatement +restatements +restates +restating +restation +restaur +restaurant +restauranteur +restauranteurs +restaurants +restaurate +restaurateur +restaurateurs +restauration +restbalk +resteal +rested +resteel +resteep +restem +restep +rester +resterilization +resterilize +resterilized +resterilizing +resters +restes +restful +restfuller +restfullest +restfully +restfulness +restharrow +resthouse +resty +restiaceae +restiaceous +restiad +restibrachium +restiff +restiffen +restiffener +restiffness +restifle +restiform +restigmatize +restyle +restyled +restyles +restyling +restimulate +restimulated +restimulating +restimulation +restiness +resting +restinging +restingly +restio +restionaceae +restionaceous +restipulate +restipulated +restipulating +restipulation +restipulatory +restir +restirred +restirring +restis +restitch +restitue +restitute +restituted +restituting +restitution +restitutional +restitutionism +restitutionist +restitutions +restitutive +restitutor +restitutory +restive +restively +restiveness +restless +restlessly +restlessness +restock +restocked +restocking +restocks +restopper +restorability +restorable +restorableness +restoral +restorals +restoration +restorationer +restorationism +restorationist +restorations +restorative +restoratively +restorativeness +restoratives +restorator +restoratory +restore +restored +restorer +restorers +restores +restoring +restoringmoment +restow +restowal +restproof +restr +restraighten +restraightened +restraightening +restraightens +restrain +restrainability +restrainable +restrained +restrainedly +restrainedness +restrainer +restrainers +restraining +restrainingly +restrains +restraint +restraintful +restraints +restrap +restrapped +restrapping +restratification +restream +restrengthen +restrengthened +restrengthening +restrengthens +restress +restretch +restricken +restrict +restricted +restrictedly +restrictedness +restricting +restriction +restrictionary +restrictionism +restrictionist +restrictions +restrictive +restrictively +restrictiveness +restricts +restrike +restrikes +restriking +restring +restringe +restringency +restringent +restringer +restringing +restrings +restrip +restrive +restriven +restrives +restriving +restroke +restroom +restrove +restruck +restructure +restructured +restructures +restructuring +restrung +rests +restudy +restudied +restudies +restudying +restuff +restuffed +restuffing +restuffs +restung +restward +restwards +resubject +resubjection +resubjugate +resublimate +resublimated +resublimating +resublimation +resublime +resubmerge +resubmerged +resubmerging +resubmission +resubmissions +resubmit +resubmits +resubmitted +resubmitting +resubordinate +resubscribe +resubscribed +resubscriber +resubscribes +resubscribing +resubscription +resubstantiate +resubstantiated +resubstantiating +resubstantiation +resubstitute +resubstitution +resucceed +resuck +resudation +resue +resuffer +resufferance +resuggest +resuggestion +resuing +resuit +resulfurize +resulfurized +resulfurizing +resulphurize +resulphurized +resulphurizing +result +resultance +resultancy +resultant +resultantly +resultants +resultative +resulted +resultful +resultfully +resultfulness +resulting +resultingly +resultive +resultless +resultlessly +resultlessness +results +resumability +resumable +resume +resumed +resumeing +resumer +resumers +resumes +resuming +resummon +resummonable +resummoned +resummoning +resummons +resumption +resumptions +resumptive +resumptively +resun +resup +resuperheat +resupervise +resupinate +resupinated +resupination +resupine +resupply +resupplied +resupplies +resupplying +resupport +resuppose +resupposition +resuppress +resuppression +resurface +resurfaced +resurfaces +resurfacing +resurgam +resurge +resurged +resurgence +resurgences +resurgency +resurgent +resurges +resurging +resurprise +resurrect +resurrected +resurrectible +resurrecting +resurrection +resurrectional +resurrectionary +resurrectioner +resurrectioning +resurrectionism +resurrectionist +resurrectionize +resurrections +resurrective +resurrector +resurrectors +resurrects +resurrender +resurround +resurvey +resurveyed +resurveying +resurveys +resuscitable +resuscitant +resuscitate +resuscitated +resuscitates +resuscitating +resuscitation +resuscitative +resuscitator +resuscitators +resuspect +resuspend +resuspension +reswage +reswallow +resward +reswarm +reswear +reswearing +resweat +resweep +resweeping +resweeten +reswell +reswept +reswill +reswim +reswore +ret +retable +retables +retablo +retabulate +retabulated +retabulating +retack +retackle +retag +retail +retailable +retailed +retailer +retailers +retailing +retailment +retailor +retailored +retailoring +retailors +retails +retain +retainability +retainable +retainableness +retainal +retainder +retained +retainer +retainers +retainership +retaining +retainment +retains +retake +retaken +retaker +retakers +retakes +retaking +retal +retaliate +retaliated +retaliates +retaliating +retaliation +retaliationist +retaliations +retaliative +retaliator +retaliatory +retaliators +retalk +retally +retallies +retama +retame +retan +retanned +retanner +retanning +retape +retaped +retaping +retar +retard +retardance +retardant +retardants +retardate +retardates +retardation +retardative +retardatory +retarded +retardee +retardence +retardent +retarder +retarders +retarding +retardingly +retardive +retardment +retards +retardure +retare +retariff +retarred +retarring +retaste +retasted +retastes +retasting +retation +retattle +retaught +retax +retaxation +retch +retched +retches +retching +retchless +retd +rete +reteach +reteaches +reteaching +retear +retearing +retecious +retelegraph +retelephone +retelevise +retell +retelling +retells +retem +retemper +retempt +retemptation +retems +retenant +retender +retene +retenes +retent +retention +retentionist +retentions +retentive +retentively +retentiveness +retentivity +retentivities +retentor +retenue +retepora +retepore +reteporidae +retest +retested +retestify +retestified +retestifying +retestimony +retestimonies +retesting +retests +retexture +rethank +rethatch +rethaw +rethe +retheness +rether +rethicken +rethink +rethinker +rethinking +rethinks +rethought +rethrash +rethread +rethreaded +rethreading +rethreads +rethreaten +rethresh +rethresher +rethrill +rethrive +rethrone +rethrow +rethrust +rethunder +retia +retial +retiary +retiariae +retiarian +retiarii +retiarius +reticella +reticello +reticence +reticency +reticencies +reticent +reticently +reticket +reticle +reticles +reticula +reticular +reticulary +reticularia +reticularian +reticularly +reticulate +reticulated +reticulately +reticulates +reticulating +reticulation +reticulatocoalescent +reticulatogranulate +reticulatoramose +reticulatovenose +reticule +reticuled +reticules +reticuli +reticulin +reticulitis +reticulocyte +reticulocytic +reticulocytosis +reticuloendothelial +reticuloramose +reticulosa +reticulose +reticulovenose +reticulum +retie +retied +retier +reties +retiform +retighten +retying +retile +retiled +retiling +retill +retimber +retimbering +retime +retimed +retimes +retiming +retin +retina +retinacula +retinacular +retinaculate +retinaculum +retinae +retinal +retinalite +retinals +retinas +retinasphalt +retinasphaltum +retincture +retinene +retinenes +retinerved +retinge +retinged +retingeing +retinian +retinic +retinispora +retinite +retinites +retinitis +retinize +retinker +retinned +retinning +retinoblastoma +retinochorioid +retinochorioidal +retinochorioiditis +retinoid +retinol +retinols +retinopapilitis +retinopathy +retinophoral +retinophore +retinoscope +retinoscopy +retinoscopic +retinoscopically +retinoscopies +retinoscopist +retinospora +retint +retinted +retinting +retints +retinue +retinued +retinues +retinula +retinulae +retinular +retinulas +retinule +retip +retype +retyped +retypes +retyping +retiracy +retiracied +retirade +retiral +retirant +retirants +retire +retired +retiredly +retiredness +retiree +retirees +retirement +retirements +retirer +retirers +retires +retiring +retiringly +retiringness +retistene +retitle +retitled +retitles +retitling +retled +retling +retoast +retold +retolerate +retoleration +retomb +retonation +retook +retool +retooled +retooling +retools +retooth +retoother +retore +retorn +retorsion +retort +retortable +retorted +retorter +retorters +retorting +retortion +retortive +retorts +retorture +retoss +retotal +retotaled +retotaling +retouch +retouchable +retouched +retoucher +retouchers +retouches +retouching +retouchment +retour +retourable +retrace +retraceable +retraced +retracement +retraces +retracing +retrack +retracked +retracking +retracks +retract +retractability +retractable +retractation +retracted +retractibility +retractible +retractile +retractility +retracting +retraction +retractions +retractive +retractively +retractiveness +retractor +retractors +retracts +retrad +retrade +retraded +retrading +retradition +retrahent +retraict +retrain +retrainable +retrained +retrainee +retraining +retrains +retrait +retral +retrally +retramp +retrample +retranquilize +retranscribe +retranscribed +retranscribing +retranscription +retransfer +retransference +retransferred +retransferring +retransfers +retransfigure +retransform +retransformation +retransfuse +retransit +retranslate +retranslated +retranslates +retranslating +retranslation +retranslations +retransmission +retransmissions +retransmissive +retransmit +retransmits +retransmitted +retransmitting +retransmute +retransplant +retransplantation +retransport +retransportation +retravel +retraverse +retraversed +retraversing +retraxit +retread +retreaded +retreading +retreads +retreat +retreatal +retreatant +retreated +retreater +retreatful +retreating +retreatingness +retreatism +retreatist +retreative +retreatment +retreats +retree +retrench +retrenchable +retrenched +retrencher +retrenches +retrenching +retrenchment +retrenchments +retry +retrial +retrials +retribute +retributed +retributing +retribution +retributive +retributively +retributor +retributory +retricked +retried +retrier +retriers +retries +retrievability +retrievable +retrievableness +retrievably +retrieval +retrievals +retrieve +retrieved +retrieveless +retrievement +retriever +retrieverish +retrievers +retrieves +retrieving +retrying +retrim +retrimmed +retrimmer +retrimming +retrims +retrip +retro +retroact +retroacted +retroacting +retroaction +retroactionary +retroactive +retroactively +retroactivity +retroacts +retroalveolar +retroauricular +retrobronchial +retrobuccal +retrobulbar +retrocaecal +retrocardiac +retrocecal +retrocede +retroceded +retrocedence +retrocedent +retroceding +retrocervical +retrocession +retrocessional +retrocessionist +retrocessive +retrochoir +retroclavicular +retroclusion +retrocognition +retrocognitive +retrocolic +retroconsciousness +retrocopulant +retrocopulation +retrocostal +retrocouple +retrocoupler +retrocurved +retrod +retrodate +retrodden +retrodeviation +retrodirective +retrodisplacement +retroduction +retrodural +retroesophageal +retrofire +retrofired +retrofires +retrofiring +retrofit +retrofits +retrofitted +retrofitting +retroflected +retroflection +retroflex +retroflexed +retroflexion +retroflux +retroform +retrofract +retrofracted +retrofrontal +retrogastric +retrogenerative +retrogradation +retrogradatory +retrograde +retrograded +retrogradely +retrogrades +retrogradient +retrograding +retrogradingly +retrogradism +retrogradist +retrogress +retrogressed +retrogresses +retrogressing +retrogression +retrogressionist +retrogressions +retrogressive +retrogressively +retrogressiveness +retrohepatic +retroinfection +retroinsular +retroiridian +retroject +retrojection +retrojugular +retrolabyrinthine +retrolaryngeal +retrolental +retrolingual +retrolocation +retromammary +retromammillary +retromandibular +retromastoid +retromaxillary +retromigration +retromingent +retromingently +retromorphosed +retromorphosis +retronasal +retropack +retroperitoneal +retroperitoneally +retropharyngeal +retropharyngitis +retroplacental +retroplexed +retroposed +retroposition +retropresbyteral +retropubic +retropulmonary +retropulsion +retropulsive +retroreception +retrorectal +retroreflection +retroreflective +retroreflector +retrorenal +retrorocket +retrorockets +retrorse +retrorsely +retros +retroserrate +retroserrulate +retrospect +retrospection +retrospective +retrospectively +retrospectiveness +retrospectives +retrospectivity +retrosplenic +retrostalsis +retrostaltic +retrosternal +retrosusception +retrot +retrotarsal +retrotemporal +retrothyroid +retrotympanic +retrotracheal +retrotransfer +retrotransference +retrouss +retroussage +retrousse +retrovaccinate +retrovaccination +retrovaccine +retroverse +retroversion +retrovert +retroverted +retrovision +retroxiphoid +retrude +retruded +retruding +retrue +retruse +retrusible +retrusion +retrusive +retrust +rets +retsina +retsinas +retted +retter +rettery +retteries +retting +rettore +rettory +rettorn +retube +retuck +retumble +retumescence +retund +retunded +retunding +retune +retuned +retunes +retuning +returban +returf +returfer +return +returnability +returnable +returned +returnee +returnees +returner +returners +returning +returnless +returnlessly +returns +retuse +retwine +retwined +retwining +retwist +retwisted +retwisting +retwists +retzian +reub +reuben +reubenites +reuchlinian +reuchlinism +reuel +reundercut +reundergo +reundertake +reundulate +reundulation +reune +reunfold +reunify +reunification +reunifications +reunified +reunifies +reunifying +reunion +reunionism +reunionist +reunionistic +reunions +reunitable +reunite +reunited +reunitedly +reuniter +reuniters +reunites +reuniting +reunition +reunitive +reunpack +reuphold +reupholster +reupholstered +reupholsterer +reupholstery +reupholsteries +reupholstering +reupholsters +reuplift +reurge +reusability +reusable +reusableness +reusabness +reuse +reuseable +reuseableness +reuseabness +reused +reuses +reusing +reutilise +reutilised +reutilising +reutilization +reutilizations +reutilize +reutilized +reutilizes +reutilizing +reutter +reutterance +reuttered +reuttering +reutters +rev +revacate +revacated +revacating +revaccinate +revaccinated +revaccinating +revaccination +revay +revalenta +revalescence +revalescent +revalidate +revalidated +revalidating +revalidation +revalorization +revalorize +revaluate +revaluated +revaluates +revaluating +revaluation +revaluations +revalue +revalued +revalues +revaluing +revamp +revamped +revamper +revampers +revamping +revampment +revamps +revanche +revanches +revanchism +revanchist +revaporization +revaporize +revaporized +revaporizing +revary +revarnish +revarnished +revarnishes +revarnishing +reve +reveal +revealability +revealable +revealableness +revealed +revealedly +revealer +revealers +revealing +revealingly +revealingness +revealment +reveals +revegetate +revegetated +revegetating +revegetation +revehent +reveil +reveille +reveilles +revel +revelability +revelant +revelation +revelational +revelationer +revelationist +revelationize +revelations +revelative +revelator +revelatory +reveled +reveler +revelers +reveling +revelled +revellent +reveller +revellers +revelly +revelling +revellings +revelment +revelous +revelry +revelries +revelrous +revelrout +revels +revenant +revenants +revend +revender +revendicate +revendicated +revendicating +revendication +reveneer +revenge +revengeable +revenged +revengeful +revengefully +revengefulness +revengeless +revengement +revenger +revengers +revenges +revenging +revengingly +revent +reventilate +reventilated +reventilating +reventilation +reventure +revenual +revenue +revenued +revenuer +revenuers +revenues +rever +reverable +reverb +reverbatory +reverberant +reverberantly +reverberate +reverberated +reverberates +reverberating +reverberation +reverberations +reverberative +reverberator +reverberatory +reverberatories +reverberators +reverbrate +reverbs +reverdi +reverdure +revere +revered +reveree +reverence +reverenced +reverencer +reverencers +reverences +reverencing +reverend +reverendly +reverends +reverendship +reverent +reverential +reverentiality +reverentially +reverentialness +reverently +reverentness +reverer +reverers +reveres +revery +reverie +reveries +reverify +reverification +reverifications +reverified +reverifies +reverifying +revering +reverist +revers +reversability +reversable +reversal +reversals +reverse +reversed +reversedly +reverseful +reverseless +reversely +reversement +reverser +reversers +reverses +reverseways +reversewise +reversi +reversibility +reversible +reversibleness +reversibly +reversify +reversification +reversifier +reversing +reversingly +reversion +reversionable +reversional +reversionally +reversionary +reversioner +reversionist +reversions +reversis +reversist +reversive +reverso +reversos +revert +revertal +reverted +revertendi +reverter +reverters +revertibility +revertible +reverting +revertive +revertively +reverts +revest +revested +revestiary +revesting +revestry +revests +revet +revete +revetement +revetment +revetments +reveto +revetoed +revetoing +revets +revetted +revetting +reveverberatory +revibrant +revibrate +revibrated +revibrating +revibration +revibrational +revictory +revictorious +revictual +revictualed +revictualing +revictualled +revictualling +revictualment +revictuals +revie +review +reviewability +reviewable +reviewage +reviewal +reviewals +reviewed +reviewer +revieweress +reviewers +reviewing +reviewish +reviewless +reviews +revification +revigor +revigorate +revigoration +revigour +revile +reviled +revilement +reviler +revilers +reviles +reviling +revilingly +revince +revindicate +revindicated +revindicates +revindicating +revindication +reviolate +reviolated +reviolating +reviolation +revirado +revirescence +revirescent +revisable +revisableness +revisal +revisals +revise +revised +revisee +reviser +revisers +revisership +revises +revisible +revising +revision +revisional +revisionary +revisionism +revisionist +revisionists +revisions +revisit +revisitable +revisitant +revisitation +revisited +revisiting +revisits +revisor +revisory +revisors +revisualization +revisualize +revisualized +revisualizing +revitalisation +revitalise +revitalised +revitalising +revitalization +revitalize +revitalized +revitalizer +revitalizes +revitalizing +revivability +revivable +revivably +revival +revivalism +revivalist +revivalistic +revivalists +revivalize +revivals +revivatory +revive +revived +revivement +reviver +revivers +revives +revivescence +revivescency +reviviction +revivify +revivification +revivified +revivifier +revivifies +revivifying +reviving +revivingly +reviviscence +reviviscency +reviviscent +reviviscible +revivor +revocability +revocabilty +revocable +revocableness +revocably +revocandi +revocate +revocation +revocations +revocative +revocatory +revoyage +revoyaged +revoyaging +revoice +revoiced +revoices +revoicing +revoir +revokable +revoke +revoked +revokement +revoker +revokers +revokes +revoking +revokingly +revolant +revolatilize +revolt +revolted +revolter +revolters +revolting +revoltingly +revoltress +revolts +revolubility +revoluble +revolubly +revolunteer +revolute +revoluted +revolution +revolutional +revolutionally +revolutionary +revolutionaries +revolutionarily +revolutionariness +revolutioneering +revolutioner +revolutionise +revolutionised +revolutioniser +revolutionising +revolutionism +revolutionist +revolutionists +revolutionize +revolutionized +revolutionizement +revolutionizer +revolutionizes +revolutionizing +revolutions +revolvable +revolvably +revolve +revolved +revolvement +revolvency +revolver +revolvers +revolves +revolving +revolvingly +revomit +revote +revoted +revoting +revs +revue +revues +revuette +revuist +revuists +revulsant +revulse +revulsed +revulsion +revulsionary +revulsions +revulsive +revulsively +revved +revving +rew +rewade +rewager +rewaybill +rewayle +rewake +rewaked +rewaken +rewakened +rewakening +rewakens +rewakes +rewaking +rewall +rewallow +rewan +reward +rewardable +rewardableness +rewardably +rewarded +rewardedly +rewarder +rewarders +rewardful +rewardfulness +rewarding +rewardingly +rewardingness +rewardless +rewardproof +rewards +rewarehouse +rewarm +rewarmed +rewarming +rewarms +rewarn +rewarrant +rewash +rewashed +rewashes +rewashing +rewater +rewave +rewax +rewaxed +rewaxes +rewaxing +reweaken +rewear +rewearing +reweave +reweaved +reweaves +reweaving +rewed +rewedded +rewedding +reweds +reweigh +reweighed +reweigher +reweighing +reweighs +reweight +rewelcome +reweld +rewelded +rewelding +rewelds +rewend +rewet +rewhelp +rewhirl +rewhisper +rewhiten +rewiden +rewidened +rewidening +rewidens +rewin +rewind +rewinded +rewinder +rewinders +rewinding +rewinds +rewing +rewinning +rewins +rewirable +rewire +rewired +rewires +rewiring +rewish +rewithdraw +rewithdrawal +rewoke +rewoken +rewon +rewood +reword +reworded +rewording +rewords +rewore +rework +reworked +reworking +reworks +rewound +rewove +rewoven +rewrap +rewrapped +rewrapping +rewraps +rewrapt +rewrite +rewriter +rewriters +rewrites +rewriting +rewritten +rewrote +rewrought +rewwore +rewwove +rex +rexen +rexes +rexine +rezbanyite +rezone +rezoned +rezones +rezoning +rf +rfb +rfound +rfree +rfs +rfz +rg +rgen +rgisseur +rglement +rh +rha +rhabarb +rhabarbarate +rhabarbaric +rhabarbarum +rhabdite +rhabditiform +rhabditis +rhabdium +rhabdocarpum +rhabdocoela +rhabdocoelan +rhabdocoele +rhabdocoelida +rhabdocoelidan +rhabdocoelous +rhabdoid +rhabdoidal +rhabdolith +rhabdology +rhabdom +rhabdomal +rhabdomancer +rhabdomancy +rhabdomantic +rhabdomantist +rhabdome +rhabdomere +rhabdomes +rhabdomyoma +rhabdomyosarcoma +rhabdomysarcoma +rhabdomonas +rhabdoms +rhabdophane +rhabdophanite +rhabdophobia +rhabdophora +rhabdophoran +rhabdopleura +rhabdopod +rhabdos +rhabdosome +rhabdosophy +rhabdosphere +rhabdus +rhachi +rhachides +rhachis +rhachises +rhacianectes +rhacomitrium +rhacophorus +rhadamanthine +rhadamanthys +rhadamanthus +rhaebosis +rhaetian +rhaetic +rhaetizite +rhagades +rhagadiform +rhagiocrin +rhagionid +rhagionidae +rhagite +rhagodia +rhagon +rhagonate +rhagonoid +rhagose +rhamn +rhamnaceae +rhamnaceous +rhamnal +rhamnales +rhamnetin +rhamninase +rhamninose +rhamnite +rhamnitol +rhamnohexite +rhamnohexitol +rhamnohexose +rhamnonic +rhamnose +rhamnoses +rhamnoside +rhamnus +rhamnuses +rhamphoid +rhamphorhynchus +rhamphosuchus +rhamphotheca +rhaphae +rhaphe +rhaphes +rhapidophyllum +rhapis +rhapontic +rhaponticin +rhapontin +rhapsode +rhapsodes +rhapsody +rhapsodic +rhapsodical +rhapsodically +rhapsodie +rhapsodies +rhapsodism +rhapsodist +rhapsodistic +rhapsodists +rhapsodize +rhapsodized +rhapsodizes +rhapsodizing +rhapsodomancy +rhaptopetalaceae +rhason +rhasophore +rhatany +rhatania +rhatanies +rhatikon +rhb +rhd +rhe +rhea +rheadine +rheae +rheas +rhebok +rheboks +rhebosis +rheda +rhedae +rhedas +rheeboc +rheebok +rheen +rhegmatype +rhegmatypy +rhegnopteri +rheic +rheidae +rheiformes +rhein +rheinberry +rheingold +rheinic +rhema +rhematic +rhematology +rheme +rhemish +rhemist +rhenea +rhenic +rhenish +rhenium +rheniums +rheo +rheobase +rheobases +rheocrat +rheology +rheologic +rheological +rheologically +rheologies +rheologist +rheologists +rheometer +rheometers +rheometry +rheometric +rheopexy +rheophil +rheophile +rheophilic +rheophore +rheophoric +rheoplankton +rheoscope +rheoscopic +rheostat +rheostatic +rheostatics +rheostats +rheotactic +rheotan +rheotaxis +rheotome +rheotron +rheotrope +rheotropic +rheotropism +rhesian +rhesis +rhesus +rhesuses +rhet +rhetor +rhetoric +rhetorical +rhetorically +rhetoricalness +rhetoricals +rhetorician +rhetoricians +rhetorics +rhetorize +rhetors +rheum +rheumarthritis +rheumatalgia +rheumatic +rheumatical +rheumatically +rheumaticky +rheumatics +rheumatism +rheumatismal +rheumatismoid +rheumative +rheumatiz +rheumatize +rheumatogenic +rheumatoid +rheumatoidal +rheumatoidally +rheumatology +rheumatologist +rheumed +rheumy +rheumic +rheumier +rheumiest +rheumily +rheuminess +rheums +rhexes +rhexia +rhexis +rhyacolite +rhibia +rhigolene +rhigosis +rhigotic +rhila +rhyme +rhymed +rhymeless +rhymelet +rhymemaker +rhymemaking +rhymeproof +rhymer +rhymery +rhymers +rhymes +rhymester +rhymesters +rhymewise +rhymy +rhymic +rhyming +rhymist +rhina +rhinal +rhinalgia +rhinanthaceae +rhinanthus +rhinaria +rhinarium +rhynchobdellae +rhynchobdellida +rhynchocephala +rhynchocephali +rhynchocephalia +rhynchocephalian +rhynchocephalic +rhynchocephalous +rhynchocoela +rhynchocoelan +rhynchocoele +rhynchocoelic +rhynchocoelous +rhynchodont +rhyncholite +rhynchonella +rhynchonellacea +rhynchonellidae +rhynchonelloid +rhynchophora +rhynchophoran +rhynchophore +rhynchophorous +rhynchopinae +rhynchops +rhynchosia +rhynchospora +rhynchota +rhynchotal +rhynchote +rhynchotous +rhynconellid +rhincospasm +rhyncostomi +rhine +rhinegrave +rhineland +rhinelander +rhinencephala +rhinencephalic +rhinencephalon +rhinencephalons +rhinencephalous +rhinenchysis +rhineodon +rhineodontidae +rhinestone +rhinestones +rhineura +rhineurynter +rhynia +rhyniaceae +rhinidae +rhinion +rhinitides +rhinitis +rhino +rhinobatidae +rhinobatus +rhinobyon +rhinocaul +rhinocele +rhinocelian +rhinoceri +rhinocerial +rhinocerian +rhinocerical +rhinocerine +rhinoceroid +rhinoceros +rhinoceroses +rhinoceroslike +rhinocerotic +rhinocerotidae +rhinocerotiform +rhinocerotine +rhinocerotoid +rhynocheti +rhinochiloplasty +rhinocoele +rhinocoelian +rhinoderma +rhinodynia +rhinogenous +rhinolalia +rhinolaryngology +rhinolaryngoscope +rhinolite +rhinolith +rhinolithic +rhinology +rhinologic +rhinological +rhinologist +rhinolophid +rhinolophidae +rhinolophine +rhinopharyngeal +rhinopharyngitis +rhinopharynx +rhinophidae +rhinophyma +rhinophis +rhinophonia +rhinophore +rhinoplasty +rhinoplastic +rhinopolypus +rhinoptera +rhinopteridae +rhinorrhagia +rhinorrhea +rhinorrheal +rhinorrhoea +rhinos +rhinoscleroma +rhinoscope +rhinoscopy +rhinoscopic +rhinosporidiosis +rhinosporidium +rhinotheca +rhinothecal +rhinovirus +rhynsburger +rhinthonic +rhinthonica +rhyobasalt +rhyodacite +rhyolite +rhyolites +rhyolitic +rhyotaxitic +rhyparographer +rhyparography +rhyparographic +rhyparographist +rhipidate +rhipidion +rhipidistia +rhipidistian +rhipidium +rhipidoglossa +rhipidoglossal +rhipidoglossate +rhipidoptera +rhipidopterous +rhipiphorid +rhipiphoridae +rhipiptera +rhipipteran +rhipipterous +rhypography +rhipsalis +rhyptic +rhyptical +rhiptoglossa +rhysimeter +rhyssa +rhyta +rhythm +rhythmal +rhythmed +rhythmic +rhythmical +rhythmicality +rhythmically +rhythmicity +rhythmicities +rhythmicize +rhythmics +rhythmist +rhythmizable +rhythmization +rhythmize +rhythmless +rhythmometer +rhythmopoeia +rhythmproof +rhythms +rhythmus +rhytidodon +rhytidome +rhytidosis +rhytina +rhytisma +rhyton +rhytta +rhizanth +rhizanthous +rhizautoicous +rhizina +rhizinaceae +rhizine +rhizinous +rhizobia +rhizobium +rhizocarp +rhizocarpeae +rhizocarpean +rhizocarpian +rhizocarpic +rhizocarpous +rhizocaul +rhizocaulus +rhizocephala +rhizocephalan +rhizocephalid +rhizocephalous +rhizocorm +rhizoctonia +rhizoctoniose +rhizodermis +rhizodus +rhizoflagellata +rhizoflagellate +rhizogen +rhizogenesis +rhizogenetic +rhizogenic +rhizogenous +rhizoid +rhizoidal +rhizoids +rhizoma +rhizomata +rhizomatic +rhizomatous +rhizome +rhizomelic +rhizomes +rhizomic +rhizomorph +rhizomorphic +rhizomorphoid +rhizomorphous +rhizoneure +rhizophagous +rhizophilous +rhizophyte +rhizophora +rhizophoraceae +rhizophoraceous +rhizophore +rhizophorous +rhizopi +rhizoplane +rhizoplast +rhizopod +rhizopoda +rhizopodal +rhizopodan +rhizopodist +rhizopodous +rhizopods +rhizopogon +rhizopus +rhizopuses +rhizosphere +rhizostomae +rhizostomata +rhizostomatous +rhizostome +rhizostomous +rhizota +rhizotaxy +rhizotaxis +rhizote +rhizotic +rhizotomi +rhizotomy +rhizotomies +rho +rhoda +rhodaline +rhodamin +rhodamine +rhodamins +rhodanate +rhodanian +rhodanic +rhodanine +rhodanthe +rhodeoretin +rhodeose +rhodes +rhodesia +rhodesian +rhodesians +rhodesoid +rhodeswood +rhodian +rhodic +rhodymenia +rhodymeniaceae +rhodymeniaceous +rhodymeniales +rhodinal +rhoding +rhodinol +rhodite +rhodium +rhodiums +rhodizite +rhodizonic +rhodobacteriaceae +rhodobacterioideae +rhodochrosite +rhodocystis +rhodocyte +rhodococcus +rhododaphne +rhododendron +rhododendrons +rhodolite +rhodomelaceae +rhodomelaceous +rhodomontade +rhodonite +rhodope +rhodophane +rhodophyceae +rhodophyceous +rhodophyll +rhodophyllidaceae +rhodophyta +rhodoplast +rhodopsin +rhodora +rhodoraceae +rhodoras +rhodorhiza +rhodosperm +rhodospermeae +rhodospermin +rhodospermous +rhodospirillum +rhodothece +rhodotypos +rhoeadales +rhoecus +rhoeo +rhomb +rhombencephala +rhombencephalon +rhombencephalons +rhombenla +rhombenporphyr +rhombi +rhombic +rhombical +rhombiform +rhomboclase +rhomboganoid +rhomboganoidei +rhombogene +rhombogenic +rhombogenous +rhombohedra +rhombohedral +rhombohedrally +rhombohedric +rhombohedron +rhombohedrons +rhomboid +rhomboidal +rhomboidally +rhomboidei +rhomboides +rhomboideus +rhomboidly +rhomboids +rhomboquadratic +rhomborectangular +rhombos +rhombovate +rhombozoa +rhombs +rhombus +rhombuses +rhoncal +rhonchal +rhonchi +rhonchial +rhonchus +rhonda +rhopalic +rhopalism +rhopalium +rhopalocera +rhopaloceral +rhopalocerous +rhopalura +rhos +rhotacism +rhotacismus +rhotacist +rhotacistic +rhotacize +rhotic +rhubarb +rhubarby +rhubarbs +rhumb +rhumba +rhumbaed +rhumbaing +rhumbas +rhumbatron +rhumbs +rhus +rhuses +ria +rya +rial +ryal +rials +rialty +rialto +rialtos +riancy +ryania +riant +riantly +ryas +riata +riatas +rib +ribald +ribaldish +ribaldly +ribaldness +ribaldry +ribaldries +ribaldrous +ribalds +riband +ribandism +ribandist +ribandlike +ribandmaker +ribandry +ribands +ribat +rybat +ribaudequin +ribaudred +ribazuba +ribband +ribbandry +ribbands +ribbed +ribber +ribbers +ribbet +ribby +ribbidge +ribbier +ribbiest +ribbing +ribbings +ribble +ribbon +ribbonback +ribboned +ribboner +ribbonfish +ribbonfishes +ribbony +ribboning +ribbonism +ribbonlike +ribbonmaker +ribbonman +ribbonry +ribbons +ribbonweed +ribbonwood +ribe +ribes +ribgrass +ribgrasses +ribhus +ribibe +ribless +riblet +riblets +riblike +riboflavin +ribonic +ribonuclease +ribonucleic +ribonucleoprotein +ribonucleoside +ribonucleotide +ribose +riboses +riboso +ribosomal +ribosome +ribosomes +ribosos +riboza +ribozo +ribozos +ribroast +ribroaster +ribroasting +ribs +ribskin +ribspare +ribston +ribwork +ribwort +ribworts +ribzuba +ric +ricardian +ricardianism +ricardo +ricasso +riccia +ricciaceae +ricciaceous +ricciales +rice +ricebird +ricebirds +ricecar +ricecars +riced +ricegrass +ricey +riceland +ricer +ricercar +ricercare +ricercari +ricercars +ricercata +ricers +rices +rich +richard +richardia +richardson +richardsonia +richdom +riche +richebourg +richellite +richen +richened +richening +richens +richer +riches +richesse +richest +richeted +richeting +richetted +richetting +richfield +richly +richling +richmond +richmondena +richness +richnesses +richt +richter +richterite +richweed +richweeds +ricin +ricine +ricinelaidic +ricinelaidinic +ricing +ricinic +ricinine +ricininic +ricinium +ricinoleate +ricinoleic +ricinolein +ricinolic +ricins +ricinulei +ricinus +ricinuses +rick +rickardite +ricked +rickey +rickeys +ricker +ricket +rickety +ricketier +ricketiest +ricketily +ricketiness +ricketish +rickets +rickettsia +rickettsiae +rickettsial +rickettsiales +rickettsialpox +rickettsias +ricky +rickyard +ricking +rickle +rickmatic +rickrack +rickracks +ricks +ricksha +rickshas +rickshaw +rickshaws +rickstaddle +rickstand +rickstick +ricochet +ricocheted +ricocheting +ricochets +ricochetted +ricochetting +ricolettaite +ricotta +ricottas +ricrac +ricracs +rictal +rictus +rictuses +rid +ridability +ridable +ridableness +ridably +riddam +riddance +riddances +ridded +riddel +ridden +ridder +ridders +ridding +riddle +riddled +riddlemeree +riddler +riddlers +riddles +riddling +riddlingly +riddlings +ride +rideable +rideau +riden +rident +rider +ryder +ridered +rideress +riderless +riders +ridership +riderships +rides +ridge +ridgeband +ridgeboard +ridgebone +ridged +ridgel +ridgelet +ridgelike +ridgeling +ridgels +ridgepiece +ridgeplate +ridgepole +ridgepoled +ridgepoles +ridger +ridgerope +ridges +ridgetree +ridgeway +ridgewise +ridgy +ridgier +ridgiest +ridgil +ridgils +ridging +ridgingly +ridgling +ridglings +ridibund +ridicule +ridiculed +ridiculer +ridicules +ridiculing +ridiculize +ridiculosity +ridiculous +ridiculously +ridiculousness +ridiest +riding +ridingman +ridingmen +ridings +ridley +ridleys +ridotto +ridottos +rids +rie +rye +riebeckite +ryegrass +ryegrasses +riel +riels +riem +riemannean +riemannian +riempie +ryen +ryepeck +rier +ries +ryes +riesling +riever +rievers +rifacimenti +rifacimento +rifampicin +rifampin +rifart +rife +rifely +rifeness +rifenesses +rifer +rifest +riff +riffed +riffi +riffian +riffing +riffle +riffled +riffler +rifflers +riffles +riffling +riffraff +riffraffs +riffs +rifi +rifian +rifle +riflebird +rifled +rifledom +rifleite +rifleman +riflemanship +riflemen +rifleproof +rifler +riflery +rifleries +riflers +rifles +riflescope +rifleshot +rifling +riflings +rift +rifted +rifter +rifty +rifting +riftless +rifts +rig +riga +rigadig +rigadon +rigadoon +rigadoons +rigamajig +rigamarole +rigation +rigatoni +rigatonis +rigaudon +rigaudons +rigbane +rigel +rigelian +rigescence +rigescent +riggal +riggald +rigged +rigger +riggers +rigging +riggings +riggish +riggite +riggot +right +rightable +rightabout +righted +righten +righteous +righteously +righteousness +righter +righters +rightest +rightforth +rightful +rightfully +rightfulness +righthand +rightheaded +righthearted +righty +righties +righting +rightish +rightism +rightisms +rightist +rightists +rightle +rightless +rightlessness +rightly +rightmost +rightness +righto +rights +rightship +rightward +rightwardly +rightwards +rigid +rigidify +rigidification +rigidified +rigidifies +rigidifying +rigidist +rigidity +rigidities +rigidly +rigidness +rigidulous +riginal +riglet +rigling +rigmaree +rigmarole +rigmarolery +rigmaroles +rigmarolic +rigmarolish +rigmarolishly +rignum +rigodon +rigol +rigole +rigolet +rigolette +rigor +rigorism +rigorisms +rigorist +rigoristic +rigorists +rigorous +rigorously +rigorousness +rigors +rigour +rigourism +rigourist +rigouristic +rigours +rigs +rigsby +rigsdaler +rigsmaal +rigsmal +rigueur +rigwiddy +rigwiddie +rigwoodie +riyal +riyals +rijksdaalder +rijksdaaler +rik +rikari +ryke +ryked +rykes +ryking +rikisha +rikishas +rikk +riksdaalder +riksha +rikshas +rikshaw +rikshaws +riksmaal +riksmal +rilawa +rile +riled +riley +riles +rilievi +rilievo +riling +rill +rille +rilled +rilles +rillet +rillets +rillett +rillette +rillettes +rilly +rilling +rillock +rillow +rills +rillstone +rim +rima +rimal +rymandra +rimas +rimate +rimation +rimbase +rime +ryme +rimed +rimeless +rimer +rimery +rimers +rimes +rimester +rimesters +rimfire +rimy +rimier +rimiest +rimiform +riming +rimland +rimlands +rimless +rimmaker +rimmaking +rimmed +rimmer +rimmers +rimming +rimose +rimosely +rimosity +rimosities +rimous +rimpi +rimple +rimpled +rimples +rimpling +rimption +rimptions +rimrock +rimrocks +rims +rimstone +rimu +rimula +rimulose +rin +rinaldo +rinceau +rinceaux +rinch +rynchospora +rynchosporous +rincon +rind +rynd +rinde +rinded +rinderpest +rindy +rindle +rindless +rinds +rynds +rine +rinforzando +ring +ringable +ringatu +ringbark +ringbarked +ringbarker +ringbarking +ringbarks +ringbill +ringbird +ringbolt +ringbolts +ringbone +ringboned +ringbones +ringcraft +ringdove +ringdoves +ringe +ringed +ringeye +ringent +ringer +ringers +ringgit +ringgiver +ringgiving +ringgoer +ringhals +ringhalses +ringhead +ringy +ringiness +ringing +ringingly +ringingness +ringings +ringite +ringle +ringlead +ringleader +ringleaderless +ringleaders +ringleadership +ringless +ringlet +ringleted +ringlety +ringlets +ringlike +ringmaker +ringmaking +ringman +ringmaster +ringmasters +ringneck +ringnecks +rings +ringsail +ringside +ringsider +ringsides +ringster +ringstick +ringstraked +ringtail +ringtailed +ringtails +ringtaw +ringtaws +ringtime +ringtoss +ringtosses +ringwalk +ringwall +ringwise +ringworm +ringworms +rink +rinka +rinker +rinkite +rinks +rinncefada +rinneite +rinner +rinning +rins +rinsable +rinse +rinsed +rinser +rinsers +rinses +rinsible +rinsing +rinsings +rynt +rinthereout +rintherout +rio +riobitsu +ryokan +riot +ryot +rioted +rioter +rioters +rioting +riotingly +riotise +riotist +riotistic +riotocracy +riotous +riotously +riotousness +riotproof +riotry +riots +ryots +ryotwar +ryotwari +ryotwary +rip +ripa +ripal +riparial +riparian +riparii +riparious +ripcord +ripcords +ripe +rype +rypeck +riped +ripely +ripelike +ripen +ripened +ripener +ripeners +ripeness +ripenesses +ripening +ripeningly +ripens +riper +ripes +ripest +ripgut +ripicolous +ripidolite +ripieni +ripienist +ripieno +ripienos +ripier +riping +ripoff +ripoffs +rypophobia +ripost +riposte +riposted +ripostes +riposting +riposts +rippable +ripped +ripper +ripperman +rippermen +rippers +rippet +rippier +ripping +rippingly +rippingness +rippit +ripple +rippled +rippleless +rippler +ripplers +ripples +ripplet +ripplets +ripply +ripplier +rippliest +rippling +ripplingly +rippon +riprap +riprapped +riprapping +ripraps +rips +ripsack +ripsaw +ripsaws +ripsnorter +ripsnorting +ripstone +ripstop +riptide +riptides +ripuarian +ripup +riroriro +risala +risaldar +risberm +risdaler +rise +risen +riser +risers +riserva +rises +rishi +rishis +rishtadar +risibility +risibilities +risible +risibleness +risibles +risibly +rising +risings +risk +risked +risker +riskers +riskful +riskfulness +risky +riskier +riskiest +riskily +riskiness +risking +riskish +riskless +risklessness +riskproof +risks +risorgimento +risorgimentos +risorial +risorius +risorse +risotto +risottos +risp +risper +rispetto +risposta +risqu +risque +risquee +riss +rissel +risser +rissian +rissle +rissoa +rissoid +rissoidae +rissole +rissoles +rissom +rist +ristori +risus +risuses +rit +rita +ritalynne +ritard +ritardando +ritardandos +ritards +ritchey +rite +riteless +ritelessness +ritely +ritenuto +rites +rithe +rytidosis +rytina +ritling +ritmaster +ritornel +ritornelle +ritornelli +ritornello +ritornellos +ritratto +ritschlian +ritschlianism +ritsu +ritter +ritters +rittingerite +rittmaster +rittock +ritual +rituale +ritualise +ritualism +ritualist +ritualistic +ritualistically +ritualists +rituality +ritualities +ritualization +ritualize +ritualized +ritualizing +ritualless +ritually +rituals +ritus +ritz +ritzes +ritzy +ritzier +ritziest +ritzily +ritziness +ryukyu +riv +riva +rivage +rivages +rival +rivalable +rivaled +rivaless +rivaling +rivalism +rivality +rivalize +rivalled +rivalless +rivalling +rivalry +rivalries +rivalrous +rivalrousness +rivals +rivalship +rive +rived +rivederci +rivel +riveled +riveling +rivell +rivelled +riven +river +riverain +riverbank +riverbanks +riverbed +riverbeds +riverboat +riverbush +riverdamp +rivered +riveret +riverfront +riverhead +riverhood +rivery +riverine +riverines +riverish +riverless +riverlet +riverly +riverlike +riverling +riverman +rivermen +rivers +riverscape +riverside +riversider +riverway +riverward +riverwards +riverwash +riverweed +riverwise +rives +rivet +riveted +riveter +riveters +rivethead +riveting +rivetless +rivetlike +rivets +rivetted +rivetting +riviera +rivieras +riviere +rivieres +rivina +riving +rivingly +rivinian +rivo +rivose +rivularia +rivulariaceae +rivulariaceous +rivulation +rivulet +rivulets +rivulose +rivulus +rix +rixatrix +rixdaler +rixy +rizar +riziform +rizzar +rizzer +rizzle +rizzom +rizzomed +rizzonite +rld +rle +rly +rm +rmoulade +rms +rn +rnd +ro +roach +roachback +roached +roaches +roaching +road +roadability +roadable +roadbed +roadbeds +roadblock +roadblocks +roadbook +roadcraft +roaded +roader +roaders +roadfellow +roadhead +roadholding +roadhouse +roadhouses +roading +roadite +roadless +roadlessness +roadlike +roadman +roadmaster +roadroller +roadrunner +roadrunners +roads +roadshow +roadside +roadsider +roadsides +roadsman +roadstead +roadsteads +roadster +roadsters +roadstone +roadtrack +roadway +roadways +roadweed +roadwise +roadwork +roadworks +roadworthy +roadworthiness +roak +roam +roamage +roamed +roamer +roamers +roaming +roamingly +roams +roan +roanoke +roans +roar +roared +roarer +roarers +roaring +roaringly +roarings +roars +roast +roastable +roasted +roaster +roasters +roasting +roastingly +roasts +rob +robalito +robalo +robalos +roband +robands +robbed +robber +robbery +robberies +robberproof +robbers +robbin +robbing +robbins +robe +robed +robeless +robenhausian +rober +roberd +roberdsman +robert +roberta +roberto +roberts +robes +robhah +robigalia +robigus +robin +robinet +robing +robinia +robinin +robinoside +robins +robinson +roble +robles +robomb +roborant +roborants +roborate +roboration +roborative +roborean +roboreous +robot +robotesque +robotian +robotic +robotics +robotism +robotisms +robotistic +robotization +robotize +robotized +robotizes +robotizing +robotlike +robotry +robotries +robots +robs +robur +roburite +robust +robuster +robustest +robustful +robustfully +robustfulness +robustic +robusticity +robustious +robustiously +robustiousness +robustity +robustly +robustness +robustuous +roc +rocaille +rocambole +roccella +roccellaceae +roccellic +roccellin +roccelline +roche +rochea +rochelime +rochelle +rocher +rochester +rochet +rocheted +rochets +roching +rociest +rock +rockaby +rockabye +rockabies +rockabyes +rockabilly +rockable +rockably +rockallite +rockat +rockaway +rockaways +rockbell +rockberry +rockbird +rockborn +rockbound +rockbrush +rockcist +rockcraft +rocked +rockelay +rocker +rockered +rockery +rockeries +rockers +rockerthon +rocket +rocketed +rocketeer +rocketer +rocketers +rockety +rocketing +rocketlike +rocketor +rocketry +rocketries +rockets +rocketsonde +rockfall +rockfalls +rockfish +rockfishes +rockfoil +rockhair +rockhearted +rocky +rockier +rockies +rockiest +rockiness +rocking +rockingly +rockish +rocklay +rockless +rocklet +rocklike +rockling +rocklings +rockman +rockoon +rockoons +rockribbed +rockrose +rockroses +rocks +rockshaft +rockskipper +rockslide +rockstaff +rocktree +rockward +rockwards +rockweed +rockweeds +rockwood +rockwork +rockworks +rococo +rococos +rocolo +rocouyenne +rocs +rocta +rod +rodd +rodded +rodden +rodder +rodders +roddikin +roddin +rodding +rode +rodent +rodentia +rodential +rodentially +rodentian +rodenticidal +rodenticide +rodentproof +rodents +rodeo +rodeos +roderic +roderick +rodge +rodger +rodham +rodinal +rodinesque +roding +rodingite +rodknight +rodless +rodlet +rodlike +rodmaker +rodman +rodmen +rodney +rodolph +rodolphus +rodomont +rodomontade +rodomontaded +rodomontading +rodomontadist +rodomontador +rodriguez +rods +rodsman +rodsmen +rodster +rodwood +roe +roeblingite +roebuck +roebucks +roed +roey +roelike +roemer +roemers +roeneng +roentgen +roentgenism +roentgenization +roentgenize +roentgenogram +roentgenograms +roentgenograph +roentgenography +roentgenographic +roentgenographically +roentgenology +roentgenologic +roentgenological +roentgenologically +roentgenologies +roentgenologist +roentgenologists +roentgenometer +roentgenometry +roentgenometries +roentgenopaque +roentgenoscope +roentgenoscopy +roentgenoscopic +roentgenoscopies +roentgenotherapy +roentgens +roentgentherapy +roer +roes +roestone +rog +rogan +rogation +rogations +rogationtide +rogative +rogatory +roger +rogerian +rogero +rogers +rogersite +roggle +rognon +rognons +rogue +rogued +roguedom +rogueing +rogueling +roguery +rogueries +rogues +rogueship +roguy +roguing +roguish +roguishly +roguishness +rohan +rohilla +rohob +rohun +rohuna +roi +roy +royal +royale +royalet +royalisation +royalise +royalised +royalising +royalism +royalisms +royalist +royalistic +royalists +royalization +royalize +royalized +royalizing +royally +royalmast +royalme +royals +royalty +royalties +roid +royena +royet +royetness +royetous +royetously +roil +roiled +roiledness +roily +roilier +roiliest +roiling +roils +roin +roinish +roynous +royou +roist +roister +royster +roistered +roystered +roisterer +roisterers +roistering +roystering +roisteringly +roisterly +roisterous +roisterously +roisters +roysters +roystonea +roit +royt +roitelet +rojak +rok +roka +roke +rokeage +rokee +rokey +rokelay +roker +roky +rolamite +rolamites +roland +rolandic +rolando +role +roleo +roleplayed +roleplaying +roles +rolf +rolfe +roll +rollable +rollaway +rollback +rollbacks +rollbar +rolled +rolley +rolleyway +rolleywayman +rollejee +roller +rollerer +rollermaker +rollermaking +rollerman +rollers +rollerskater +rollerskating +rolliche +rollichie +rollick +rollicked +rollicker +rollicky +rollicking +rollickingly +rollickingness +rollicks +rollicksome +rollicksomeness +rolling +rollingly +rollings +rollinia +rollix +rollman +rollmop +rollmops +rollneck +rollo +rollock +rollout +rollouts +rollover +rollovers +rolls +rolltop +rollway +rollways +roloway +rolpens +rom +romaean +romagnese +romagnol +romagnole +romaic +romaika +romain +romaine +romaines +romaji +romal +roman +romana +romance +romancealist +romancean +romanced +romanceful +romanceish +romanceishness +romanceless +romancelet +romancelike +romancemonger +romanceproof +romancer +romanceress +romancers +romances +romancy +romancical +romancing +romancist +romandom +romane +romanes +romanese +romanesque +romanhood +romany +romanian +romanic +romanies +romaniform +romanish +romanism +romanist +romanistic +romanite +romanity +romanium +romanization +romanize +romanized +romanizer +romanizes +romanizing +romanly +romano +romanos +romans +romansch +romansh +romantic +romantical +romanticalism +romanticality +romantically +romanticalness +romanticise +romanticism +romanticist +romanticistic +romanticists +romanticity +romanticization +romanticize +romanticized +romanticizes +romanticizing +romanticly +romanticness +romantics +romantism +romantist +romanza +romaunt +romaunts +romble +rombos +rombowline +rome +romeine +romeite +romeldale +romeo +romerillo +romero +romeros +romescot +romeshot +romeward +romewards +romic +romyko +romipetal +romish +romishly +romishness +rommack +rommany +romney +romneya +romp +romped +rompee +romper +rompers +rompy +romping +rompingly +rompish +rompishly +rompishness +romps +rompu +roms +romulian +romulus +ron +ronald +roncador +roncaglian +roncet +roncho +ronco +roncos +rond +rondache +rondacher +rondawel +ronde +rondeau +rondeaux +rondel +rondelet +rondeletia +rondelets +rondelier +rondelle +rondelles +rondellier +rondels +rondino +rondle +rondo +rondoletto +rondos +rondure +rondures +rone +rong +ronga +rongeur +ronggeng +ronier +ronin +ronion +ronyon +ronions +ronyons +ronnel +ronnels +ronni +ronquil +ronsardian +ronsardism +ronsardist +ronsardize +ronsdorfer +ronsdorfian +rontgen +rontgenism +rontgenize +rontgenized +rontgenizing +rontgenography +rontgenographic +rontgenographically +rontgenology +rontgenologic +rontgenological +rontgenologist +rontgenoscope +rontgenoscopy +rontgenoscopic +rontgens +roo +rood +roodebok +roodle +roodles +roods +roodstone +rooed +roof +roofage +roofed +roofer +roofers +roofy +roofing +roofings +roofless +rooflet +rooflike +roofline +rooflines +roofman +roofmen +roofpole +roofs +rooftop +rooftops +rooftree +rooftrees +roofward +roofwise +rooibok +rooyebok +rooinek +rooing +rook +rooked +rooker +rookery +rookeried +rookeries +rooky +rookie +rookier +rookies +rookiest +rooking +rookish +rooklet +rooklike +rooks +rookus +rool +room +roomage +roomed +roomer +roomers +roomette +roomettes +roomful +roomfuls +roomy +roomie +roomier +roomies +roomiest +roomily +roominess +rooming +roomkeeper +roomless +roomlet +roommate +roommates +rooms +roomsful +roomsome +roomstead +roomth +roomthy +roomthily +roomthiness +roomward +roon +roop +roorbach +roorback +roorbacks +roosa +roose +roosed +rooser +roosers +rooses +roosevelt +rooseveltian +roosing +roost +roosted +rooster +roosterfish +roosterhood +roosterless +roosters +roostership +roosty +roosting +roosts +root +rootage +rootages +rootcap +rooted +rootedly +rootedness +rooter +rootery +rooters +rootfast +rootfastness +roothold +rootholds +rooti +rooty +rootier +rootiest +rootiness +rooting +rootle +rootless +rootlessness +rootlet +rootlets +rootlike +rootling +roots +rootstalk +rootstock +rootstocks +rootwalt +rootward +rootwise +rootworm +roove +rooved +rooving +ropable +ropand +ropani +rope +ropeable +ropeband +ropebark +roped +ropedance +ropedancer +ropedancing +ropey +ropelayer +ropelaying +ropelike +ropemaker +ropemaking +ropeman +ropemen +roper +ropery +roperies +roperipe +ropers +ropes +ropesmith +ropetrick +ropeway +ropeways +ropewalk +ropewalker +ropewalks +ropework +ropy +ropier +ropiest +ropily +ropiness +ropinesses +roping +ropish +ropishness +roploch +ropp +roque +roquefort +roquelaure +roquelaures +roquellorz +roquer +roques +roquet +roqueted +roqueting +roquets +roquette +roquille +roquist +roral +roratorio +rori +rory +roric +rorid +roridula +roridulaceae +roriferous +rorifluent +roripa +rorippa +roritorious +rorqual +rorquals +rorschach +rort +rorty +rorulent +ros +rosa +rosabel +rosabella +rosace +rosaceae +rosacean +rosaceous +rosaker +rosal +rosales +rosalger +rosalia +rosalie +rosalyn +rosalind +rosaline +rosamond +rosanilin +rosaniline +rosary +rosaria +rosarian +rosarians +rosaries +rosariia +rosario +rosarium +rosariums +rosaruby +rosated +rosbif +roschach +roscherite +roscian +roscid +roscoe +roscoelite +roscoes +rose +roseal +roseate +roseately +rosebay +rosebays +rosebud +rosebuds +rosebush +rosebushes +rosed +rosedrop +rosefish +rosefishes +rosehead +rosehill +rosehiller +rosehip +roseine +rosel +roseless +roselet +roselike +roselite +rosella +rosellate +roselle +roselles +rosellinia +rosemaling +rosemary +rosemaries +rosenbergia +rosenbuschite +roseola +roseolar +roseolas +roseoliform +roseolous +roseous +rosery +roseries +roseroot +roseroots +roses +roset +rosetan +rosetangle +rosety +rosetime +rosets +rosetta +rosette +rosetted +rosettes +rosetty +rosetum +roseways +rosewater +rosewise +rosewood +rosewoods +rosewort +roshi +rosy +rosicrucian +rosicrucianism +rosied +rosier +rosieresite +rosiest +rosily +rosilla +rosillo +rosin +rosinante +rosinate +rosinduline +rosine +rosined +rosiness +rosinesses +rosing +rosiny +rosining +rosinol +rosinous +rosins +rosinweed +rosinwood +rosland +rosmarine +rosmarinus +rosminian +rosminianism +rosoli +rosolic +rosolio +rosolios +rosolite +rosorial +ross +rosser +rossite +rostel +rostella +rostellar +rostellaria +rostellarian +rostellate +rostelliform +rostellum +roster +rosters +rostra +rostral +rostrally +rostrate +rostrated +rostriferous +rostriform +rostroantennary +rostrobranchial +rostrocarinate +rostrocaudal +rostroid +rostrolateral +rostrular +rostrulate +rostrulum +rostrum +rostrums +rosttra +rosular +rosulate +rot +rota +rotacism +rotal +rotala +rotalia +rotalian +rotaliform +rotaliiform +rotaman +rotamen +rotameter +rotan +rotanev +rotang +rotary +rotarian +rotarianism +rotarianize +rotaries +rotas +rotascope +rotatable +rotatably +rotate +rotated +rotates +rotating +rotation +rotational +rotationally +rotations +rotative +rotatively +rotativism +rotatodentate +rotatoplane +rotator +rotatores +rotatory +rotatoria +rotatorian +rotators +rotavist +rotch +rotche +rotches +rote +rotella +rotenone +rotenones +roter +rotes +rotge +rotgut +rotguts +rother +rothermuck +rothesay +roti +rotifer +rotifera +rotiferal +rotiferan +rotiferous +rotifers +rotiform +rotisserie +rotisseries +rotl +rotls +roto +rotocraft +rotodyne +rotograph +rotogravure +rotogravures +rotometer +rotonda +rotonde +rotor +rotorcraft +rotors +rotos +rototill +rototilled +rototiller +rototilling +rototills +rotproof +rots +rotse +rotta +rottan +rotte +rotted +rotten +rottener +rottenest +rottenish +rottenly +rottenness +rottenstone +rotter +rotterdam +rotters +rotting +rottle +rottlera +rottlerin +rottock +rottolo +rottweiler +rotula +rotulad +rotular +rotulet +rotulian +rotuliform +rotulus +rotund +rotunda +rotundas +rotundate +rotundify +rotundifoliate +rotundifolious +rotundiform +rotundity +rotundities +rotundly +rotundness +rotundo +rotundotetragonal +roture +roturier +roturiers +roub +rouble +roubles +roubouh +rouche +rouches +roucou +roud +roudas +roue +rouelle +rouen +rouens +rouerie +roues +rouge +rougeau +rougeberry +rouged +rougelike +rougemontite +rougeot +rouges +rough +roughage +roughages +roughcast +roughcaster +roughcasting +roughdraft +roughdraw +roughdress +roughdry +roughdried +roughdries +roughdrying +roughed +roughen +roughened +roughener +roughening +roughens +rougher +roughers +roughest +roughet +roughfooted +roughhearted +roughheartedness +roughhew +roughhewed +roughhewer +roughhewing +roughhewn +roughhews +roughhouse +roughhoused +roughhouser +roughhouses +roughhousy +roughhousing +roughy +roughie +roughing +roughings +roughish +roughishly +roughishness +roughleg +roughlegs +roughly +roughneck +roughnecks +roughness +roughnesses +roughometer +roughride +roughrider +roughroot +roughs +roughscuff +roughsetter +roughshod +roughslant +roughsome +roughstring +roughstuff +rought +roughtail +roughtailed +roughwork +roughwrought +rougy +rouging +rouille +rouky +roulade +roulades +rouleau +rouleaus +rouleaux +roulette +rouletted +roulettes +rouletting +rouman +roumanian +roumeliote +roun +rounce +rounceval +rouncy +rouncival +round +roundabout +roundaboutly +roundaboutness +rounded +roundedly +roundedness +roundel +roundelay +roundelays +roundeleer +roundels +rounder +rounders +roundest +roundfish +roundhead +roundheaded +roundheadedness +roundheel +roundhouse +roundhouses +roundy +rounding +roundish +roundishness +roundle +roundlet +roundlets +roundly +roundline +roundmouthed +roundness +roundnose +roundnosed +roundoff +roundridge +rounds +roundseam +roundsman +roundtable +roundtail +roundtop +roundtree +roundup +roundups +roundure +roundwise +roundwood +roundworm +roundworms +rounge +rounspik +rountree +roup +rouped +rouper +roupet +roupy +roupie +roupier +roupiest +roupily +rouping +roupingwife +roupit +roups +rous +rousant +rouse +rouseabout +roused +rousedness +rousement +rouser +rousers +rouses +rousette +rousing +rousingly +rousseau +rousseauan +rousseauism +rousseauist +rousseauistic +rousseauite +rousseaus +roussellian +roussette +roussillon +roust +roustabout +roustabouts +rousted +rouster +rousters +rousting +rousts +rout +route +routed +routeman +routemarch +routemen +router +routers +routes +routeway +routeways +routh +routhercock +routhy +routhie +routhiness +rouths +routier +routinary +routine +routineer +routinely +routineness +routines +routing +routings +routinish +routinism +routinist +routinization +routinize +routinized +routinizes +routinizing +routivarite +routous +routously +routs +rouvillite +roux +rove +roved +roven +rover +rovers +roves +rovescio +rovet +rovetto +roving +rovingly +rovingness +rovings +row +rowable +rowan +rowanberry +rowanberries +rowans +rowboat +rowboats +rowdy +rowdydow +rowdydowdy +rowdier +rowdies +rowdiest +rowdyish +rowdyishly +rowdyishness +rowdyism +rowdyisms +rowdily +rowdiness +rowdyproof +rowed +rowel +roweled +rowelhead +roweling +rowelled +rowelling +rowels +rowen +rowena +rowens +rower +rowers +rowet +rowy +rowiness +rowing +rowings +rowland +rowlandite +rowley +rowleian +rowleyan +rowlet +rowlock +rowlocks +rowport +rows +rowt +rowte +rowted +rowth +rowths +rowty +rowting +rox +roxana +roxane +roxanne +roxburgh +roxburghe +roxburghiaceae +roxbury +roxy +roxie +roxolani +rozener +rozum +rozzer +rozzers +rpm +rps +rpt +rrhiza +rs +rsum +rsvp +rt +rte +rti +rtw +rua +ruach +ruana +rub +rubaboo +rubaboos +rubace +rubaces +rubaiyat +rubasse +rubasses +rubato +rubatos +rubbaboo +rubbaboos +rubbed +rubbee +rubber +rubberer +rubbery +rubberiness +rubberise +rubberised +rubberising +rubberize +rubberized +rubberizes +rubberizing +rubberless +rubberlike +rubberneck +rubbernecked +rubbernecker +rubbernecking +rubbernecks +rubbernose +rubbers +rubberstone +rubberwise +rubby +rubbing +rubbings +rubbingstone +rubbio +rubbish +rubbishes +rubbishy +rubbishing +rubbishingly +rubbishly +rubbishry +rubbisy +rubble +rubbled +rubbler +rubbles +rubblestone +rubblework +rubbly +rubblier +rubbliest +rubbling +rubdown +rubdowns +rube +rubedinous +rubedity +rubefacience +rubefacient +rubefaction +rubefy +rubelet +rubella +rubellas +rubelle +rubellite +rubellosis +rubens +rubensian +rubeola +rubeolar +rubeolas +rubeoloid +ruberythric +ruberythrinic +rubes +rubescence +rubescent +ruby +rubia +rubiaceae +rubiaceous +rubiacin +rubiales +rubian +rubianic +rubiate +rubiator +rubible +rubican +rubicelle +rubicola +rubicon +rubiconed +rubicund +rubicundity +rubidic +rubidine +rubidium +rubidiums +rubied +rubier +rubies +rubiest +rubify +rubific +rubification +rubificative +rubiginose +rubiginous +rubigo +rubigos +rubying +rubijervine +rubylike +rubin +rubine +rubineous +rubious +rubytail +rubythroat +rubywise +ruble +rubles +rublis +rubor +rubout +rubrail +rubric +rubrica +rubrical +rubricality +rubrically +rubricate +rubricated +rubricating +rubrication +rubricator +rubrician +rubricism +rubricist +rubricity +rubricize +rubricose +rubrics +rubrify +rubrific +rubrification +rubrisher +rubrospinal +rubs +rubstone +rubus +rucervine +rucervus +ruchbah +ruche +ruches +ruching +ruchings +ruck +rucked +rucker +rucky +rucking +ruckle +ruckling +rucks +rucksack +rucksacks +rucksey +ruckus +ruckuses +ructation +ruction +ructions +ructious +rud +rudaceous +rudas +rudbeckia +rudd +rudder +rudderfish +rudderfishes +rudderhead +rudderhole +rudderless +rudderlike +rudderpost +rudders +rudderstock +ruddervator +ruddy +ruddied +ruddier +ruddiest +ruddyish +ruddily +ruddiness +ruddish +ruddle +ruddled +ruddleman +ruddlemen +ruddles +ruddling +ruddock +ruddocks +rudds +rude +rudely +rudeness +rudenesses +rudented +rudenture +ruder +rudera +ruderal +ruderals +ruderate +rudesby +rudesbies +rudesheimer +rudest +rudge +rudy +rudiment +rudimental +rudimentary +rudimentarily +rudimentariness +rudimentation +rudiments +rudinsky +rudish +rudista +rudistae +rudistan +rudistid +rudity +rudloff +rudmasday +rudolf +rudolph +rudolphine +rudolphus +rudous +rue +rued +rueful +ruefully +ruefulness +ruely +ruelike +ruelle +ruellia +ruen +ruer +ruers +rues +ruesome +ruesomeness +ruewort +rufescence +rufescent +ruff +ruffable +ruffe +ruffed +ruffer +ruffes +ruffian +ruffianage +ruffiandom +ruffianhood +ruffianish +ruffianism +ruffianize +ruffianly +ruffianlike +ruffiano +ruffians +ruffin +ruffing +ruffle +ruffled +ruffleless +rufflement +ruffler +rufflers +ruffles +ruffly +rufflike +ruffliness +ruffling +ruffmans +ruffs +ruficarpous +ruficaudate +ruficoccin +ruficornate +rufigallic +rufoferruginous +rufofulvous +rufofuscous +rufopiceous +rufosity +rufotestaceous +rufous +rufter +rufulous +rufus +rug +ruga +rugae +rugal +rugate +rugbeian +rugby +rugbies +rugged +ruggeder +ruggedest +ruggedization +ruggedize +ruggedly +ruggedness +rugger +ruggers +ruggy +rugging +ruggle +ruggown +rugheaded +rugine +ruglike +rugmaker +rugmaking +rugosa +rugose +rugosely +rugosity +rugosities +rugous +rugs +rugulose +ruin +ruinable +ruinate +ruinated +ruinates +ruinating +ruination +ruinations +ruinatious +ruinator +ruined +ruiner +ruiners +ruing +ruiniform +ruining +ruinlike +ruinous +ruinously +ruinousness +ruinproof +ruins +rukbat +rukh +rulable +rulander +rule +ruled +ruledom +ruleless +rulemonger +ruler +rulers +rulership +rules +ruly +ruling +rulingly +rulings +rull +ruller +rullion +rullock +rum +rumage +rumaged +rumaging +rumal +ruman +rumania +rumanian +rumanians +rumanite +rumb +rumba +rumbaed +rumbaing +rumbarge +rumbas +rumbelow +rumble +rumbled +rumblegarie +rumblegumption +rumblement +rumbler +rumblers +rumbles +rumbly +rumbling +rumblingly +rumblings +rumbo +rumbooze +rumbowline +rumbowling +rumbullion +rumbumptious +rumbustical +rumbustion +rumbustious +rumbustiousness +rumchunder +rumdum +rume +rumelian +rumen +rumenitis +rumenocentesis +rumenotomy +rumens +rumex +rumfustian +rumgumption +rumgumptious +rumicin +rumina +ruminal +ruminant +ruminantia +ruminantly +ruminants +ruminate +ruminated +ruminates +ruminating +ruminatingly +rumination +ruminations +ruminative +ruminatively +ruminator +ruminators +rumkin +rumless +rumly +rummage +rummaged +rummager +rummagers +rummages +rummagy +rummaging +rummer +rummery +rummers +rummes +rummest +rummy +rummier +rummies +rummiest +rummily +rumminess +rummish +rummle +rumney +rumness +rumor +rumored +rumorer +rumoring +rumormonger +rumorous +rumorproof +rumors +rumour +rumoured +rumourer +rumouring +rumourmonger +rumours +rump +rumpad +rumpadder +rumpade +rumper +rumpy +rumple +rumpled +rumples +rumpless +rumply +rumplier +rumpliest +rumpling +rumpot +rumps +rumpscuttle +rumpuncheon +rumpus +rumpuses +rumrunner +rumrunners +rumrunning +rums +rumshop +rumswizzle +rumtytoo +run +runabout +runabouts +runagado +runagate +runagates +runaround +runaway +runaways +runback +runbacks +runby +runboard +runch +runchweed +runcinate +rundale +rundel +rundi +rundle +rundles +rundlet +rundlets +rundown +rundowns +rune +runecraft +runed +runefolk +runeless +runelike +runer +runes +runesmith +runestaff +runeword +runfish +rung +runghead +rungless +rungs +runholder +runic +runically +runiform +runite +runkeeper +runkle +runkled +runkles +runkly +runkling +runless +runlet +runlets +runman +runnable +runnel +runnels +runner +runners +runnet +runneth +runny +runnier +runniest +running +runningly +runnings +runnion +runoff +runoffs +runology +runologist +runout +runouts +runover +runovers +runproof +runrig +runround +runrounds +runs +runsy +runt +runted +runtee +runty +runtier +runtiest +runtime +runtiness +runtish +runtishly +runtishness +runts +runway +runways +rupa +rupee +rupees +rupellary +rupert +rupestral +rupestrian +rupestrine +rupia +rupiah +rupiahs +rupial +rupicapra +rupicaprinae +rupicaprine +rupicola +rupicolinae +rupicoline +rupicolous +rupie +rupitic +ruppia +ruptile +ruption +ruptive +ruptuary +rupturable +rupture +ruptured +ruptures +rupturewort +rupturing +rural +ruralisation +ruralise +ruralised +ruralises +ruralising +ruralism +ruralisms +ruralist +ruralists +ruralite +ruralites +rurality +ruralities +ruralization +ruralize +ruralized +ruralizes +ruralizing +rurally +ruralness +rurban +ruridecanal +rurigenous +ruritania +ruritanian +ruru +rus +rusa +ruscus +ruse +ruses +rush +rushbush +rushed +rushee +rushees +rushen +rusher +rushers +rushes +rushy +rushier +rushiest +rushiness +rushing +rushingly +rushingness +rushings +rushland +rushlight +rushlighted +rushlike +rushlit +rushwork +rusin +rusine +rusines +rusk +rusky +ruskin +ruskinian +rusks +rusma +rusot +ruspone +russ +russe +russel +russelet +russelia +russell +russellite +russene +russet +russety +russeting +russetish +russetlike +russets +russetting +russia +russian +russianism +russianist +russianization +russianize +russians +russify +russification +russificator +russified +russifier +russifies +russifying +russine +russism +russniak +russolatry +russolatrous +russomania +russomaniac +russomaniacal +russophile +russophilism +russophilist +russophobe +russophobia +russophobiac +russophobism +russophobist +russud +russula +rust +rustable +rusted +rustful +rusty +rustyback +rustic +rustical +rustically +rusticalness +rusticanum +rusticate +rusticated +rusticates +rusticating +rustication +rusticator +rusticators +rusticial +rusticism +rusticity +rusticities +rusticize +rusticly +rusticness +rusticoat +rustics +rusticum +rusticwork +rustier +rustiest +rustyish +rustily +rustiness +rusting +rustle +rustled +rustler +rustlers +rustles +rustless +rustly +rustling +rustlingly +rustlingness +rustproof +rustre +rustred +rusts +ruswut +rut +ruta +rutabaga +rutabagas +rutaceae +rutaceous +rutaecarpine +rutate +rutch +rutelian +rutelinae +ruth +ruthenate +ruthene +ruthenian +ruthenic +ruthenious +ruthenium +ruthenous +ruther +rutherford +rutherfordine +rutherfordite +rutherfordium +ruthful +ruthfully +ruthfulness +ruthless +ruthlessly +ruthlessness +ruths +rutic +rutidosis +rutyl +rutilant +rutilate +rutilated +rutilation +rutile +rutylene +rutiles +rutilous +rutin +rutinose +rutiodon +ruts +rutted +ruttee +rutter +rutty +ruttier +ruttiest +ruttily +ruttiness +rutting +ruttish +ruttishly +ruttishness +ruttle +rutuli +ruvid +rux +rvulsant +rwd +rwy +rwound +s +sa +saa +saad +saan +saanen +saarbrucken +sab +saba +sabadilla +sabadin +sabadine +sabadinine +sabaean +sabaeanism +sabaeism +sabaigrass +sabayon +sabaism +sabaist +sabakha +sabal +sabalaceae +sabalo +sabalos +sabalote +saban +sabana +sabanut +sabaoth +sabathikos +sabaton +sabatons +sabazian +sabazianism +sabazios +sabbat +sabbatary +sabbatarian +sabbatarianism +sabbatean +sabbath +sabbathaian +sabbathaic +sabbathaist +sabbathbreaker +sabbathbreaking +sabbathism +sabbathize +sabbathkeeper +sabbathkeeping +sabbathless +sabbathly +sabbathlike +sabbaths +sabbatia +sabbatian +sabbatic +sabbatical +sabbatically +sabbaticalness +sabbaticals +sabbatine +sabbatism +sabbatist +sabbatization +sabbatize +sabbaton +sabbats +sabbed +sabbeka +sabby +sabbing +sabbitha +sabdariffa +sabe +sabeca +sabed +sabeing +sabella +sabellan +sabellaria +sabellarian +sabelli +sabellian +sabellianism +sabellianize +sabellid +sabellidae +sabelloid +saber +saberbill +sabered +sabering +saberleg +saberlike +saberproof +sabers +sabertooth +saberwing +sabes +sabia +sabiaceae +sabiaceous +sabian +sabianism +sabicu +sabik +sabin +sabina +sabine +sabines +sabing +sabinian +sabino +sabins +sabir +sabirs +sable +sablefish +sablefishes +sableness +sables +sably +sabora +saboraim +sabot +sabotage +sabotaged +sabotages +sabotaging +saboted +saboteur +saboteurs +sabotier +sabotine +sabots +sabra +sabras +sabre +sabrebill +sabred +sabres +sabretache +sabretooth +sabreur +sabrina +sabring +sabromin +sabs +sabuja +sabuline +sabulite +sabulose +sabulosity +sabulous +sabulum +saburra +saburral +saburrate +saburration +sabutan +sabzi +sac +sacae +sacahuiste +sacalait +sacaline +sacate +sacaton +sacatons +sacatra +sacbrood +sacbut +sacbuts +saccade +saccades +saccadge +saccadic +saccage +saccammina +saccarify +saccarimeter +saccate +saccated +saccha +saccharamide +saccharase +saccharate +saccharated +saccharephidrosis +saccharic +saccharide +sacchariferous +saccharify +saccharification +saccharified +saccharifier +saccharifying +saccharilla +saccharimeter +saccharimetry +saccharimetric +saccharimetrical +saccharin +saccharinate +saccharinated +saccharine +saccharineish +saccharinely +saccharinic +saccharinity +saccharization +saccharize +saccharized +saccharizing +saccharobacillus +saccharobiose +saccharobutyric +saccharoceptive +saccharoceptor +saccharochemotropic +saccharocolloid +saccharofarinaceous +saccharogalactorrhea +saccharogenic +saccharohumic +saccharoid +saccharoidal +saccharolactonic +saccharolytic +saccharometabolic +saccharometabolism +saccharometer +saccharometry +saccharometric +saccharometrical +saccharomyces +saccharomycetaceae +saccharomycetaceous +saccharomycetales +saccharomycete +saccharomycetes +saccharomycetic +saccharomycosis +saccharomucilaginous +saccharon +saccharonate +saccharone +saccharonic +saccharophylly +saccharorrhea +saccharoscope +saccharose +saccharostarchy +saccharosuria +saccharotriose +saccharous +saccharulmic +saccharulmin +saccharum +saccharuria +sacchulmin +sacciferous +sacciform +saccli +saccobranchiata +saccobranchiate +saccobranchus +saccoderm +saccolabium +saccomyian +saccomyid +saccomyidae +saccomyina +saccomyine +saccomyoid +saccomyoidea +saccomyoidean +saccomys +saccoon +saccopharyngidae +saccopharynx +saccorhiza +saccos +saccular +sacculate +sacculated +sacculation +saccule +saccules +sacculi +sacculina +sacculoutricular +sacculus +saccus +sacela +sacella +sacellum +sacerdocy +sacerdos +sacerdotage +sacerdotal +sacerdotalism +sacerdotalist +sacerdotalize +sacerdotally +sacerdotical +sacerdotism +sacerdotium +sachamaker +sachcloth +sachem +sachemdom +sachemic +sachems +sachemship +sachet +sacheted +sachets +sacheverell +sacian +sack +sackage +sackamaker +sackbag +sackbut +sackbuts +sackbutt +sackcloth +sackclothed +sackdoudle +sacked +sacken +sacker +sackers +sacket +sackful +sackfuls +sacking +sackings +sackless +sacklike +sackmaker +sackmaking +sackman +sacks +sacksful +sacktime +saclike +saco +sacope +sacque +sacques +sacra +sacrad +sacral +sacralgia +sacralization +sacralize +sacrals +sacrament +sacramental +sacramentalis +sacramentalism +sacramentalist +sacramentality +sacramentally +sacramentalness +sacramentary +sacramentarian +sacramentarianism +sacramentarist +sacramenter +sacramentism +sacramentize +sacramento +sacraments +sacramentum +sacrary +sacraria +sacrarial +sacrarium +sacrate +sacrcraria +sacre +sacrectomy +sacred +sacredly +sacredness +sacry +sacrify +sacrificable +sacrifical +sacrificant +sacrificati +sacrification +sacrificator +sacrificatory +sacrificature +sacrifice +sacrificeable +sacrificed +sacrificer +sacrificers +sacrifices +sacrificial +sacrificially +sacrificing +sacrificingly +sacrilege +sacrileger +sacrilegious +sacrilegiously +sacrilegiousness +sacrilegist +sacrilumbal +sacrilumbalis +sacring +sacripant +sacrist +sacristan +sacristans +sacristy +sacristies +sacristry +sacrists +sacro +sacrocaudal +sacrococcygeal +sacrococcygean +sacrococcygeus +sacrococcyx +sacrocostal +sacrocotyloid +sacrocotyloidean +sacrocoxalgia +sacrocoxitis +sacrodynia +sacrodorsal +sacrofemoral +sacroiliac +sacroiliacs +sacroinguinal +sacroischiac +sacroischiadic +sacroischiatic +sacrolumbal +sacrolumbalis +sacrolumbar +sacropectineal +sacroperineal +sacropictorial +sacroposterior +sacropubic +sacrorectal +sacrosanct +sacrosanctity +sacrosanctness +sacrosciatic +sacrosecular +sacrospinal +sacrospinalis +sacrospinous +sacrotomy +sacrotuberous +sacrovertebral +sacrum +sacrums +sacs +sad +sadachbia +sadalmelik +sadalsuud +sadaqat +sadden +saddened +saddening +saddeningly +saddens +sadder +saddest +saddhu +saddhus +saddik +saddirham +saddish +saddle +saddleback +saddlebacked +saddlebag +saddlebags +saddlebill +saddlebow +saddlebows +saddlecloth +saddlecloths +saddled +saddleleaf +saddleless +saddlelike +saddlemaker +saddlenose +saddler +saddlery +saddleries +saddlers +saddles +saddlesick +saddlesore +saddlesoreness +saddlestead +saddletree +saddletrees +saddlewise +saddling +sadducaic +sadducean +sadducee +sadduceeism +sadduceeist +sadducees +sadducism +sadducize +sade +sades +sadh +sadhaka +sadhana +sadhe +sadhearted +sadheartedness +sadhes +sadhika +sadhu +sadhus +sadi +sadic +sadie +sadiron +sadirons +sadis +sadism +sadisms +sadist +sadistic +sadistically +sadists +sadite +sadleir +sadly +sadness +sadnesses +sado +sadomasochism +sadomasochist +sadomasochistic +sadomasochists +sadr +sadware +sae +saebeins +saecula +saecular +saeculum +saeima +saernaite +saeta +saeter +saeume +safar +safari +safaried +safariing +safaris +safavi +safawid +safe +safeblower +safeblowing +safebreaker +safebreaking +safecracker +safecracking +safegaurds +safeguard +safeguarded +safeguarder +safeguarding +safeguards +safehold +safekeeper +safekeeping +safely +safelight +safemaker +safemaking +safen +safener +safeness +safenesses +safer +safes +safest +safety +safetied +safeties +safetying +safetyman +safeway +saffarian +saffarid +saffian +saffior +safflor +safflorite +safflow +safflower +safflowers +saffron +saffroned +saffrony +saffrons +saffrontree +saffronwood +safi +safine +safini +safranyik +safranin +safranine +safranins +safranophil +safranophile +safrol +safrole +safroles +safrols +saft +saftly +sag +saga +sagaciate +sagacious +sagaciously +sagaciousness +sagacity +sagacities +sagai +sagaie +sagaman +sagamen +sagamite +sagamore +sagamores +sagan +saganash +saganashes +sagapen +sagapenum +sagas +sagathy +sagbut +sagbuts +sage +sagebrush +sagebrusher +sagebrushes +sagebush +sageer +sageleaf +sagely +sagene +sageness +sagenesses +sagenite +sagenitic +sager +sageretia +sagerose +sages +sageship +sagesse +sagest +sagewood +saggar +saggard +saggards +saggared +saggaring +saggars +sagged +sagger +saggered +saggering +saggers +saggy +saggier +saggiest +sagginess +sagging +saggon +saghavart +sagy +sagier +sagiest +sagina +saginate +sagination +saging +sagital +sagitarii +sagitarius +sagitta +sagittae +sagittal +sagittally +sagittary +sagittaria +sagittaries +sagittarii +sagittariid +sagittarius +sagittate +sagittid +sagittiferous +sagittiform +sagittocyst +sagittoid +sagless +sago +sagoin +sagolike +sagos +sagoweer +sagra +sags +saguaro +saguaros +saguerus +saguing +sagum +saguran +saguranes +sagvandite +sagwire +sah +sahadeva +sahaptin +sahara +saharan +saharian +saharic +sahh +sahib +sahibah +sahibs +sahidic +sahiwal +sahiwals +sahlite +sahme +saho +sahoukar +sahras +sahuaro +sahuaros +sahukar +sai +say +saya +sayability +sayable +sayableness +sayal +saibling +saic +saice +saices +said +saidi +saids +sayee +sayer +sayers +sayest +sayette +saify +saiga +saigas +saignant +saigon +saiid +sayid +sayids +saiyid +sayyid +saiyids +sayyids +saying +sayings +sail +sailable +sailage +sailboard +sailboat +sailboater +sailboating +sailboats +sailcloth +sailed +sailer +sailers +sailfin +sailfish +sailfishes +sailflying +saily +sailyard +sailye +sailing +sailingly +sailings +sailless +sailmaker +sailmaking +sailor +sailorfish +sailoring +sailorizing +sailorless +sailorly +sailorlike +sailorman +sailorproof +sailors +sailour +sailplane +sailplaned +sailplaner +sailplaning +sails +sailship +sailsman +saim +saimy +saimiri +sain +saynay +saindoux +sained +saynete +sainfoin +sainfoins +saining +sains +saint +saintdom +saintdoms +sainte +sainted +saintess +sainthood +sainting +saintish +saintism +saintless +saintly +saintlier +saintliest +saintlike +saintlikeness +saintlily +saintliness +saintling +saintology +saintologist +saintpaulia +saints +saintship +sayonara +sayonaras +saip +saiph +sair +sairy +sairly +sairve +says +sayst +saite +saith +saithe +saitic +saiva +saivism +saj +sajou +sajous +sak +saka +sakai +sakalava +sake +sakeber +sakeen +sakel +sakelarides +sakell +sakellaridis +saker +sakeret +sakers +sakes +sakha +saki +sakyamuni +sakieh +sakiyeh +sakis +sakkara +sakkoi +sakkos +sakti +saktism +sakulya +sal +sala +salaam +salaamed +salaaming +salaamlike +salaams +salability +salabilities +salable +salableness +salably +salaceta +salacious +salaciously +salaciousness +salacity +salacities +salacot +salad +salada +saladang +saladangs +salade +saladero +saladin +salading +salads +salago +salagrama +salay +salal +salamandarin +salamander +salamanderlike +salamanders +salamandra +salamandrian +salamandridae +salamandriform +salamandrin +salamandrina +salamandrine +salamandroid +salamat +salambao +salame +salami +salaminian +salamis +salamo +salampore +salamstone +salangane +salangid +salangidae +salar +salary +salariat +salariats +salaried +salariego +salaries +salarying +salaryless +salat +salband +salchow +saldid +sale +saleability +saleable +saleably +salebrous +saleeite +salegoer +saleyard +salele +salem +salema +salempore +salenixon +salep +saleps +saleratus +saleroom +salerooms +sales +salesclerk +salesclerks +salesgirl +salesgirls +salesian +salesite +saleslady +salesladies +salesman +salesmanship +salesmen +salespeople +salesperson +salespersons +salesroom +salesrooms +saleswoman +saleswomen +salet +saleware +salework +salfern +salian +saliant +saliaric +salic +salicaceae +salicaceous +salicales +salicariaceae +salicetum +salicyl +salicylal +salicylaldehyde +salicylamide +salicylanilide +salicylase +salicylate +salicylic +salicylide +salicylidene +salicylyl +salicylism +salicylize +salicylous +salicyluric +salicin +salicine +salicines +salicins +salicional +salicorn +salicornia +salience +saliences +saliency +saliencies +salient +salientia +salientian +saliently +salientness +salients +saliferous +salify +salifiable +salification +salified +salifies +salifying +saligenin +saligenol +saligot +saligram +salimeter +salimetry +salina +salinan +salinas +salination +saline +salinella +salinelle +salineness +salines +saliniferous +salinification +saliniform +salinity +salinities +salinization +salinize +salinized +salinizes +salinizing +salinometer +salinometry +salinosulphureous +salinoterreous +salique +saliretin +salisbury +salisburia +salish +salishan +salite +salited +saliva +salival +salivan +salivant +salivary +salivas +salivate +salivated +salivates +salivating +salivation +salivator +salivatory +salivous +salix +sall +salle +sallee +salleeman +salleemen +sallender +sallenders +sallet +sallets +sally +sallybloom +sallied +sallier +salliers +sallies +sallying +sallyman +sallymen +sallyport +sallywood +salloo +sallow +sallowed +sallower +sallowest +sallowy +sallowing +sallowish +sallowly +sallowness +sallows +salm +salma +salmagundi +salmagundis +salmary +salmi +salmiac +salmin +salmine +salmis +salmo +salmon +salmonberry +salmonberries +salmonella +salmonellae +salmonellas +salmonellosis +salmonet +salmonid +salmonidae +salmonids +salmoniform +salmonlike +salmonoid +salmonoidea +salmonoidei +salmons +salmonsite +salmwood +salnatron +salol +salols +salome +salometer +salometry +salomon +salomonia +salomonian +salomonic +salon +salonika +salons +saloon +saloonist +saloonkeep +saloonkeeper +saloons +saloop +saloops +salopette +salopian +salp +salpa +salpacean +salpae +salpas +salpian +salpians +salpicon +salpid +salpidae +salpids +salpiform +salpiglosis +salpiglossis +salpingectomy +salpingemphraxis +salpinges +salpingian +salpingion +salpingitic +salpingitis +salpingocatheterism +salpingocele +salpingocyesis +salpingomalleus +salpingonasal +salpingopalatal +salpingopalatine +salpingoperitonitis +salpingopexy +salpingopharyngeal +salpingopharyngeus +salpingopterygoid +salpingorrhaphy +salpingoscope +salpingostaphyline +salpingostenochoria +salpingostomatomy +salpingostomy +salpingostomies +salpingotomy +salpingotomies +salpinx +salpoid +salps +sals +salsa +salse +salsify +salsifies +salsifis +salsilla +salsillas +salsoda +salsola +salsolaceae +salsolaceous +salsuginose +salsuginous +salt +salta +saltando +saltant +saltarella +saltarelli +saltarello +saltarellos +saltary +saltate +saltation +saltativeness +saltato +saltator +saltatory +saltatoria +saltatorial +saltatorian +saltatoric +saltatorily +saltatorious +saltatras +saltbox +saltboxes +saltbrush +saltbush +saltbushes +saltcat +saltcatch +saltcellar +saltcellars +saltchuck +saltchucker +salteaux +salted +saltee +salten +salter +salteretto +saltery +saltern +salterns +salters +saltest +saltfat +saltfish +saltfoot +saltgrass +salthouse +salty +salticid +saltie +saltier +saltierra +saltiers +saltierwise +salties +saltiest +saltigradae +saltigrade +saltily +saltimbanco +saltimbank +saltimbankery +saltimbanque +saltine +saltines +saltiness +salting +saltire +saltires +saltireways +saltirewise +saltish +saltishly +saltishness +saltless +saltlessness +saltly +saltlike +saltmaker +saltmaking +saltman +saltmouth +saltness +saltnesses +saltometer +saltorel +saltpan +saltpans +saltpeter +saltpetre +saltpetrous +saltpond +salts +saltshaker +saltspoon +saltspoonful +saltsprinkler +saltus +saltuses +saltwater +saltweed +saltwife +saltwork +saltworker +saltworks +saltwort +saltworts +salubrify +salubrious +salubriously +salubriousness +salubrity +salubrities +salud +saluda +salue +salugi +saluki +salukis +salung +salus +salutary +salutarily +salutariness +salutation +salutational +salutationless +salutations +salutatious +salutatory +salutatoria +salutatorian +salutatories +salutatorily +salutatorium +salute +saluted +saluter +saluters +salutes +salutiferous +salutiferously +saluting +salutoria +salva +salvability +salvable +salvableness +salvably +salvador +salvadora +salvadoraceae +salvadoraceous +salvadoran +salvadorian +salvagable +salvage +salvageability +salvageable +salvaged +salvagee +salvagees +salvageproof +salvager +salvagers +salvages +salvaging +salvarsan +salvatella +salvation +salvational +salvationism +salvationist +salvations +salvator +salvatory +salve +salved +salveline +salvelinus +salver +salverform +salvers +salves +salvy +salvia +salvianin +salvias +salvific +salvifical +salvifically +salvifics +salving +salvinia +salviniaceae +salviniaceous +salviniales +salviol +salvo +salvoed +salvoes +salvoing +salvor +salvors +salvos +salwey +salwin +salzfelle +sam +samadera +samadh +samadhi +samaj +samal +saman +samandura +samani +samanid +samantha +samara +samaras +samaria +samariform +samaritan +samaritaness +samaritanism +samaritans +samarium +samariums +samarkand +samaroid +samarra +samarskite +samas +samba +sambaed +sambaing +sambal +sambaqui +sambaquis +sambar +sambara +sambars +sambas +sambathe +sambel +sambhar +sambhars +sambhogakaya +sambhur +sambhurs +sambo +sambos +sambouk +sambouse +sambuca +sambucaceae +sambucas +sambucus +sambuk +sambuke +sambukes +sambul +sambunigrin +sambur +samburs +samburu +same +samech +samechs +samek +samekh +samekhs +sameks +samel +samely +sameliness +samen +sameness +samenesses +samesome +samfoo +samgarnebo +samgha +samh +samhain +samhita +samian +samydaceae +samiel +samiels +samir +samiresite +samiri +samisen +samisens +samish +samite +samites +samiti +samizdat +samkara +samkhya +samlet +samlets +sammel +sammer +sammy +sammier +samnani +samnite +samoa +samoan +samoans +samogitian +samogon +samogonka +samohu +samoyed +samoyedic +samolus +samory +samosatenian +samothere +samotherium +samothracian +samovar +samovars +samp +sampaguita +sampaloc +sampan +sampans +samphire +samphires +sampi +sample +sampled +sampleman +samplemen +sampler +samplery +samplers +samples +sampling +samplings +samps +sampsaean +samsam +samsara +samsaras +samshoo +samshu +samshus +samsien +samskara +samson +samsoness +samsonian +samsonic +samsonistic +samsonite +samucan +samucu +samuel +samuin +samurai +samurais +samvat +san +sanability +sanable +sanableness +sanai +sanand +sanataria +sanatarium +sanatariums +sanation +sanative +sanativeness +sanatory +sanatoria +sanatoriria +sanatoririums +sanatorium +sanatoriums +sanballat +sanbenito +sanbenitos +sanche +sancho +sancy +sancyite +sancord +sanct +sancta +sanctae +sanctanimity +sancties +sanctify +sanctifiable +sanctifiableness +sanctifiably +sanctificate +sanctification +sanctifications +sanctified +sanctifiedly +sanctifier +sanctifiers +sanctifies +sanctifying +sanctifyingly +sanctilogy +sanctiloquent +sanctimony +sanctimonial +sanctimonious +sanctimoniously +sanctimoniousness +sanction +sanctionable +sanctionableness +sanctionary +sanctionative +sanctioned +sanctioner +sanctioners +sanctioning +sanctionist +sanctionless +sanctionment +sanctions +sanctity +sanctities +sanctitude +sanctology +sanctologist +sanctorian +sanctorium +sanctuary +sanctuaried +sanctuaries +sanctuarize +sanctum +sanctums +sanctus +sand +sandak +sandal +sandaled +sandaliform +sandaling +sandalled +sandalling +sandals +sandalwood +sandalwoods +sandalwort +sandan +sandarac +sandaracin +sandaracs +sandastra +sandastros +sandawe +sandbag +sandbagged +sandbagger +sandbaggers +sandbagging +sandbags +sandbank +sandbanks +sandbar +sandbars +sandbin +sandblast +sandblasted +sandblaster +sandblasters +sandblasting +sandblasts +sandblind +sandblindness +sandboard +sandboy +sandbox +sandboxes +sandbug +sandbur +sandburr +sandburrs +sandburs +sandclub +sandculture +sanded +sandeep +sandemanian +sandemanianism +sandemanism +sander +sanderling +sanders +sanderswood +sandfish +sandfishes +sandfly +sandflies +sandflower +sandglass +sandgoby +sandgrouse +sandheat +sandhi +sandhya +sandhill +sandhis +sandhog +sandhogs +sandy +sandia +sandier +sandies +sandiest +sandiferous +sandyish +sandiness +sanding +sandip +sandiver +sandix +sandyx +sandkey +sandlapper +sandless +sandlike +sandling +sandlings +sandlot +sandlots +sandlotter +sandlotters +sandman +sandmen +sandmite +sandnatter +sandnecker +sandpaper +sandpapered +sandpaperer +sandpapery +sandpapering +sandpapers +sandpeep +sandpeeps +sandpile +sandpiles +sandpiper +sandpipers +sandpit +sandpits +sandproof +sandra +sandrock +sandroller +sands +sandshoe +sandsoap +sandsoaps +sandspit +sandspout +sandspur +sandstay +sandstone +sandstones +sandstorm +sandunga +sandust +sandweed +sandweld +sandwich +sandwiched +sandwiches +sandwiching +sandwood +sandworm +sandworms +sandwort +sandworts +sane +saned +sanely +sanemindedness +saneness +sanenesses +saner +sanes +sanest +sanetch +sanford +sanforized +sang +sanga +sangah +sangamon +sangar +sangaree +sangarees +sangars +sangas +sangei +sanger +sangerbund +sangerfest +sangers +sangfroid +sanggau +sanggil +sangh +sangha +sangho +sanghs +sangil +sangir +sangirese +sanglant +sangley +sanglier +sangraal +sangrail +sangreal +sangreeroot +sangrel +sangria +sangrias +sangsue +sangu +sanguicolous +sanguifacient +sanguiferous +sanguify +sanguification +sanguifier +sanguifluous +sanguimotor +sanguimotory +sanguinaceous +sanguinary +sanguinaria +sanguinarily +sanguinariness +sanguine +sanguineless +sanguinely +sanguineness +sanguineobilious +sanguineophlegmatic +sanguineous +sanguineousness +sanguineovascular +sanguines +sanguinicolous +sanguiniferous +sanguinification +sanguinis +sanguinism +sanguinity +sanguinivorous +sanguinocholeric +sanguinolency +sanguinolent +sanguinometer +sanguinopoietic +sanguinopurulent +sanguinous +sanguinuity +sanguisorba +sanguisorbaceae +sanguisuge +sanguisugent +sanguisugous +sanguivorous +sanhedrim +sanhedrin +sanhedrist +sanhita +sanyakoan +sanyasi +sanicle +sanicles +sanicula +sanidine +sanidinic +sanidinite +sanies +sanify +sanification +saning +sanious +sanipractic +sanit +sanitary +sanitaria +sanitarian +sanitarians +sanitaries +sanitariia +sanitariiums +sanitarily +sanitariness +sanitarist +sanitarium +sanitariums +sanitate +sanitated +sanitates +sanitating +sanitation +sanitationist +sanity +sanities +sanitisation +sanitise +sanitised +sanitises +sanitising +sanitist +sanitization +sanitize +sanitized +sanitizer +sanitizes +sanitizing +sanitoria +sanitorium +sanjay +sanjak +sanjakate +sanjakbeg +sanjaks +sanjakship +sanjeev +sanjib +sank +sanka +sankha +sankhya +sannaite +sannhemp +sannyasi +sannyasin +sannyasis +sannoisian +sannop +sannops +sannup +sannups +sanopurulent +sanoserous +sanpoil +sans +sansar +sansara +sansars +sansculot +sansculotte +sansculottic +sansculottid +sansculottish +sansculottism +sansei +sanseis +sanserif +sanserifs +sansevieria +sanshach +sansi +sanskrit +sanskritic +sanskritist +sanskritization +sanskritize +sant +santa +santal +santalaceae +santalaceous +santalales +santali +santalic +santalin +santalol +santalum +santalwood +santapee +santar +santee +santene +santy +santiago +santification +santii +santimi +santims +santir +santirs +santo +santol +santolina +santols +santon +santonate +santonic +santonica +santonin +santonine +santoninic +santonins +santorinite +santos +santour +santours +sanukite +sanvitalia +sanzen +sao +saoshyant +sap +sapa +sapajou +sapajous +sapan +sapanwood +sapbush +sapek +sapele +saperda +sapful +sapharensian +saphead +sapheaded +sapheadedness +sapheads +saphena +saphenae +saphenal +saphenous +saphie +sapiao +sapid +sapidity +sapidities +sapidless +sapidness +sapience +sapiences +sapiency +sapiencies +sapiens +sapient +sapiential +sapientially +sapientize +sapiently +sapin +sapinda +sapindaceae +sapindaceous +sapindales +sapindaship +sapindus +sapit +sapium +sapiutan +saple +sapless +saplessness +sapling +saplinghood +saplings +sapo +sapodilla +sapodillo +sapogenin +saponaceous +saponaceousness +saponacity +saponary +saponaria +saponarin +saponated +saponi +saponiferous +saponify +saponifiable +saponification +saponified +saponifier +saponifies +saponifying +saponin +saponine +saponines +saponins +saponite +saponites +saponul +saponule +sapophoric +sapor +saporific +saporifical +saporosity +saporous +sapors +sapota +sapotaceae +sapotaceous +sapotas +sapote +sapotilha +sapotilla +sapotoxin +sapour +sapours +sappanwood +sappare +sapped +sapper +sappers +sapphic +sapphics +sapphira +sapphire +sapphireberry +sapphired +sapphires +sapphirewing +sapphiric +sapphirine +sapphism +sapphisms +sapphist +sapphists +sappho +sappy +sappier +sappiest +sappily +sappiness +sapping +sapples +sapraemia +sapremia +sapremias +sapremic +saprin +saprine +saprobe +saprobes +saprobic +saprobically +saprobiont +saprocoll +saprodil +saprodontia +saprogen +saprogenic +saprogenicity +saprogenous +saprolegnia +saprolegniaceae +saprolegniaceous +saprolegniales +saprolegnious +saprolite +saprolitic +sapromic +sapropel +sapropelic +sapropelite +sapropels +saprophagan +saprophagous +saprophile +saprophilous +saprophyte +saprophytes +saprophytic +saprophytically +saprophytism +saproplankton +saprostomous +saprozoic +saprozoon +saps +sapsago +sapsagos +sapsap +sapskull +sapsuck +sapsucker +sapsuckers +sapucaia +sapucainha +sapwood +sapwoods +sapwort +saqib +saquaro +sar +sara +saraad +sarabacan +sarabaite +saraband +sarabande +sarabands +saracen +saracenian +saracenic +saracenical +saracenism +saracenlike +saracens +sarada +saraf +sarafan +sarah +sarakolet +sarakolle +saramaccaner +saran +sarangi +sarangousty +sarans +sarape +sarapes +saratoga +saratogan +saravan +sarawakese +sarawakite +sarawan +sarbacane +sarbican +sarcasm +sarcasmproof +sarcasms +sarcast +sarcastic +sarcastical +sarcastically +sarcasticalness +sarcasticness +sarcel +sarcelle +sarcelled +sarcelly +sarcenet +sarcenets +sarcilis +sarcina +sarcinae +sarcinas +sarcine +sarcitis +sarcle +sarcler +sarcoadenoma +sarcoadenomas +sarcoadenomata +sarcobatus +sarcoblast +sarcocarcinoma +sarcocarcinomas +sarcocarcinomata +sarcocarp +sarcocele +sarcocyst +sarcocystidea +sarcocystidean +sarcocystidian +sarcocystis +sarcocystoid +sarcocyte +sarcococca +sarcocol +sarcocolla +sarcocollin +sarcode +sarcoderm +sarcoderma +sarcodes +sarcodic +sarcodictyum +sarcodina +sarcodous +sarcoenchondroma +sarcoenchondromas +sarcoenchondromata +sarcogenic +sarcogenous +sarcogyps +sarcoglia +sarcoid +sarcoidosis +sarcoids +sarcolactic +sarcolemma +sarcolemmal +sarcolemmas +sarcolemmata +sarcolemmic +sarcolemmous +sarcoline +sarcolysis +sarcolite +sarcolyte +sarcolytic +sarcology +sarcologic +sarcological +sarcologist +sarcoma +sarcomas +sarcomata +sarcomatoid +sarcomatosis +sarcomatous +sarcomere +sarcomeric +sarcophaga +sarcophagal +sarcophagi +sarcophagy +sarcophagic +sarcophagid +sarcophagidae +sarcophagine +sarcophagize +sarcophagous +sarcophagus +sarcophaguses +sarcophile +sarcophilous +sarcophilus +sarcoplasm +sarcoplasma +sarcoplasmatic +sarcoplasmic +sarcoplast +sarcoplastic +sarcopoietic +sarcopsylla +sarcopsyllidae +sarcoptes +sarcoptic +sarcoptid +sarcoptidae +sarcorhamphus +sarcosepsis +sarcosepta +sarcoseptum +sarcosin +sarcosine +sarcosis +sarcosoma +sarcosomal +sarcosome +sarcosperm +sarcosporid +sarcosporida +sarcosporidia +sarcosporidial +sarcosporidian +sarcosporidiosis +sarcostyle +sarcostosis +sarcotheca +sarcotherapeutics +sarcotherapy +sarcotic +sarcous +sarcura +sard +sardachate +sardana +sardanapalian +sardanapalus +sardar +sardars +sardel +sardelle +sardian +sardine +sardines +sardinewise +sardinia +sardinian +sardinians +sardius +sardiuses +sardoin +sardonian +sardonic +sardonical +sardonically +sardonicism +sardonyx +sardonyxes +sards +sare +saree +sarees +sargasso +sargassos +sargassum +sargassumfish +sargassumfishes +sarge +sarges +sargo +sargonic +sargonid +sargonide +sargos +sargus +sari +sarif +sarigue +sarin +sarinda +sarins +sarip +saris +sark +sarkar +sarkful +sarky +sarkical +sarkine +sarking +sarkinite +sarkit +sarkless +sarks +sarlac +sarlak +sarlyk +sarmatian +sarmatic +sarmatier +sarment +sarmenta +sarmentaceous +sarmentiferous +sarmentose +sarmentous +sarments +sarmentum +sarna +sarod +sarode +sarodes +sarodist +sarodists +sarods +saron +sarong +sarongs +saronic +saronide +saros +sarothamnus +sarothra +sarothrum +sarpanch +sarpedon +sarpler +sarpo +sarra +sarracenia +sarraceniaceae +sarraceniaceous +sarracenial +sarraceniales +sarraf +sarrasin +sarrazin +sarrow +sarrusophone +sarrusophonist +sarsa +sarsaparilla +sarsaparillas +sarsaparillin +sarsar +sarsars +sarsechim +sarsen +sarsenet +sarsenets +sarsens +sarsi +sarsnet +sarson +sarsparilla +sart +sartage +sartain +sartish +sartor +sartoriad +sartorial +sartorially +sartorian +sartorii +sartorite +sartorius +sartors +saruk +sarum +sarus +sarvarthasiddha +sarwan +sarzan +sasa +sasan +sasani +sasanqua +sasarara +sash +sashay +sashayed +sashaying +sashays +sashed +sashery +sasheries +sashes +sashimi +sashimis +sashing +sashless +sashoon +sasin +sasine +sasins +saskatchewan +saskatoon +sass +sassaby +sassabies +sassafac +sassafrack +sassafras +sassafrases +sassagum +sassak +sassan +sassandra +sassanian +sassanid +sassanidae +sassanide +sasse +sassed +sassenach +sasses +sassy +sassybark +sassier +sassies +sassiest +sassily +sassiness +sassing +sassywood +sassolin +sassoline +sassolite +sasswood +sasswoods +sastean +sastra +sastruga +sastrugi +sat +sata +satable +satai +satan +satanael +satanas +satang +satangs +satanic +satanical +satanically +satanicalness +satanism +satanisms +satanist +satanistic +satanists +satanity +satanize +satanology +satanophany +satanophil +satanophobia +satanship +satara +sataras +satchel +satcheled +satchelful +satchels +satd +sate +sated +satedness +sateen +sateens +sateenwood +sateless +satelles +satellitarian +satellite +satellited +satellites +satellitesimal +satellitian +satellitic +satellitious +satellitium +satellitoid +satellitory +satelloid +satem +sates +sati +satiability +satiable +satiableness +satiably +satyagraha +satyagrahi +satyaloka +satyashodak +satiate +satiated +satiates +satiating +satiation +satieno +satient +satiety +satieties +satin +satinay +satinbush +satine +satined +satinet +satinets +satinette +satinfin +satinflower +sating +satiny +satininess +satining +satinite +satinity +satinize +satinleaf +satinleaves +satinlike +satinpod +satinpods +satins +satinwood +satinwoods +sation +satyr +satire +satireproof +satires +satyresque +satyress +satyriases +satyriasis +satiric +satyric +satirical +satyrical +satirically +satiricalness +satyrid +satyridae +satyrids +satyrinae +satyrine +satyrion +satirisable +satirisation +satirise +satirised +satiriser +satirises +satirising +satirism +satyrism +satirist +satirists +satirizable +satirize +satirized +satirizer +satirizers +satirizes +satirizing +satyrlike +satyromaniac +satyrs +satis +satisdation +satisdiction +satisfaciendum +satisfaction +satisfactional +satisfactionist +satisfactionless +satisfactions +satisfactive +satisfactory +satisfactorily +satisfactoriness +satisfactorious +satisfy +satisfiability +satisfiable +satisfice +satisfied +satisfiedly +satisfiedness +satisfier +satisfiers +satisfies +satisfying +satisfyingly +satisfyingness +satispassion +sativa +sativae +sative +satlijk +satori +satorii +satoris +satrae +satrap +satrapal +satrapate +satrapess +satrapy +satrapic +satrapical +satrapies +satraps +satron +satsop +satsuma +sattar +satterthwaite +sattie +sattle +sattva +sattvic +satura +saturability +saturable +saturant +saturants +saturate +saturated +saturatedness +saturater +saturates +saturating +saturation +saturations +saturator +saturday +saturdays +satureia +satury +saturity +saturization +saturn +saturnal +saturnale +saturnali +saturnalia +saturnalian +saturnalianly +saturnalias +saturnia +saturnian +saturnic +saturnicentric +saturniid +saturniidae +saturnine +saturninely +saturnineness +saturninity +saturnism +saturnist +saturnity +saturnize +saturnus +sau +sauba +sauce +sauceboat +saucebox +sauceboxes +sauced +saucedish +sauceless +sauceline +saucemaker +saucemaking +sauceman +saucemen +saucepan +saucepans +sauceplate +saucepot +saucer +saucerful +saucery +saucerize +saucerized +saucerleaf +saucerless +saucerlike +saucerman +saucers +sauces +sauch +sauchs +saucy +saucier +sauciest +saucily +sauciness +saucing +saucisse +saucisson +saudi +saudis +sauerbraten +sauerkraut +sauf +sauger +saugers +saugh +saughen +saughy +saughs +saught +saul +sauld +saulge +saulie +sauls +sault +saulter +saulteur +saults +saum +saumya +saumon +saumont +saumur +sauna +saunas +sauncy +sauncier +saunciest +saunders +saunderswood +saunt +saunter +sauntered +saunterer +saunterers +sauntering +saunteringly +saunters +sauqui +saur +saura +sauraseni +saurauia +saurauiaceae +saurel +saurels +saury +sauria +saurian +saurians +sauriasis +sauries +sauriosis +saurischia +saurischian +saurless +sauroctonos +saurodont +saurodontidae +saurognathae +saurognathism +saurognathous +sauroid +sauromatian +saurophagous +sauropod +sauropoda +sauropodous +sauropods +sauropsid +sauropsida +sauropsidan +sauropsidian +sauropterygia +sauropterygian +saurornithes +saurornithic +saururaceae +saururaceous +saururae +saururan +saururous +saururus +sausage +sausagelike +sausages +sausinger +saussurea +saussurite +saussuritic +saussuritization +saussuritize +saut +saute +sauted +sauteed +sauteing +sauter +sautereau +sauterelle +sauterne +sauternes +sautes +sauteur +sauty +sautoir +sautoire +sautoires +sautoirs +sautree +sauvagesia +sauve +sauvegarde +sav +savable +savableness +savacu +savage +savaged +savagedom +savagely +savageness +savager +savagery +savageries +savagerous +savagers +savages +savagess +savagest +savaging +savagism +savagisms +savagize +savanilla +savanna +savannah +savannahs +savannas +savant +savants +savara +savarin +savate +savates +savation +save +saveable +saveableness +saved +savey +savelha +saveloy +saveloys +savement +saver +savery +savers +saves +savile +savin +savine +savines +saving +savingly +savingness +savings +savins +savintry +savior +savioress +saviorhood +saviors +saviorship +saviour +saviouress +saviourhood +saviours +saviourship +savitar +savitri +savoy +savoyard +savoyed +savoying +savoys +savola +savonarolist +savonnerie +savor +savored +savorer +savorers +savory +savorier +savories +savoriest +savorily +savoriness +savoring +savoringly +savorless +savorlessness +savorly +savorous +savors +savorsome +savour +savoured +savourer +savourers +savoury +savourier +savouries +savouriest +savourily +savouriness +savouring +savouringly +savourless +savourous +savours +savssat +savvy +savvied +savvies +savvying +saw +sawah +sawaiori +sawali +sawan +sawarra +sawback +sawbelly +sawbill +sawbills +sawbones +sawboneses +sawbuck +sawbucks +sawbwa +sawder +sawdust +sawdusty +sawdustish +sawdustlike +sawdusts +sawed +sawer +sawers +sawfish +sawfishes +sawfly +sawflies +sawflom +sawhorse +sawhorses +sawyer +sawyers +sawing +sawings +sawish +sawlike +sawlog +sawlogs +sawlshot +sawmaker +sawmaking +sawman +sawmill +sawmiller +sawmilling +sawmills +sawmon +sawmont +sawn +sawneb +sawney +sawneys +sawny +sawnie +sawpit +saws +sawsetter +sawsharper +sawsmith +sawt +sawteeth +sawtimber +sawtooth +sawway +sawworker +sawwort +sax +saxatile +saxaul +saxboard +saxcornet +saxe +saxes +saxhorn +saxhorns +saxicava +saxicavous +saxicola +saxicole +saxicolidae +saxicolinae +saxicoline +saxicolous +saxifraga +saxifragaceae +saxifragaceous +saxifragant +saxifrage +saxifragous +saxifrax +saxigenous +saxish +saxitoxin +saxon +saxondom +saxony +saxonian +saxonic +saxonical +saxonically +saxonies +saxonish +saxonism +saxonist +saxonite +saxonization +saxonize +saxonly +saxons +saxophone +saxophones +saxophonic +saxophonist +saxophonists +saxotromba +saxpence +saxten +saxtie +saxtuba +saxtubas +sazen +sazerac +sb +sbaikian +sbirro +sblood +sbodikins +sc +scab +scabbado +scabbard +scabbarded +scabbarding +scabbardless +scabbards +scabbed +scabbedness +scabbery +scabby +scabbier +scabbiest +scabbily +scabbiness +scabbing +scabble +scabbled +scabbler +scabbles +scabbling +scabellum +scaberulous +scabetic +scabia +scabicidal +scabicide +scabid +scabies +scabietic +scabine +scabinus +scabiophobia +scabiosa +scabiosas +scabiosity +scabious +scabiouses +scabish +scabland +scablike +scabrate +scabrescent +scabrid +scabridity +scabridulous +scabrin +scabrities +scabriusculose +scabriusculous +scabrock +scabrosely +scabrous +scabrously +scabrousness +scabs +scabwort +scacchic +scacchite +scad +scaddle +scads +scaean +scaena +scaff +scaffer +scaffery +scaffy +scaffie +scaffle +scaffold +scaffoldage +scaffolded +scaffolder +scaffolding +scaffoldings +scaffolds +scag +scaglia +scagliola +scagliolist +scags +scaife +scala +scalable +scalableness +scalably +scalade +scalades +scalado +scalados +scalae +scalage +scalages +scalar +scalare +scalares +scalary +scalaria +scalarian +scalariform +scalariformly +scalariidae +scalars +scalarwise +scalation +scalawag +scalawaggery +scalawaggy +scalawags +scald +scaldberry +scalded +scalder +scaldfish +scaldy +scaldic +scalding +scaldini +scaldino +scaldra +scalds +scaldweed +scale +scaleback +scalebark +scaleboard +scaled +scaledrake +scalefish +scaleful +scaleless +scalelet +scalelike +scaleman +scalemen +scalena +scalene +scaleni +scalenohedra +scalenohedral +scalenohedron +scalenohedrons +scalenon +scalenous +scalenum +scalenus +scalepan +scalepans +scaleproof +scaler +scalers +scales +scalesman +scalesmen +scalesmith +scalet +scaletail +scalewing +scalewise +scalework +scalewort +scalf +scalfe +scaly +scalier +scaliest +scaliger +scaliness +scaling +scalings +scalytail +scall +scallage +scallawag +scallawaggery +scallawaggy +scalled +scallion +scallions +scallywag +scallola +scallom +scallop +scalloped +scalloper +scallopers +scalloping +scallopini +scallops +scallopwise +scalls +scalma +scalodo +scalogram +scaloni +scaloppine +scalops +scalopus +scalp +scalped +scalpeen +scalpel +scalpellar +scalpellic +scalpellum +scalpellus +scalpels +scalper +scalpers +scalping +scalpless +scalplock +scalpra +scalpriform +scalprum +scalps +scalpture +scalt +scalx +scalz +scam +scamander +scamandrius +scamble +scambled +scambler +scambling +scamell +scamillus +scamler +scamles +scammel +scammony +scammoniate +scammonies +scammonin +scammonyroot +scamp +scampavia +scamped +scamper +scampered +scamperer +scampering +scampers +scamphood +scampi +scampies +scamping +scampingly +scampish +scampishly +scampishness +scamps +scampsman +scams +scan +scance +scandal +scandaled +scandaling +scandalisation +scandalise +scandalised +scandaliser +scandalising +scandalization +scandalize +scandalized +scandalizer +scandalizers +scandalizes +scandalizing +scandalled +scandalling +scandalmonger +scandalmongery +scandalmongering +scandalmonging +scandalous +scandalously +scandalousness +scandalproof +scandals +scandaroon +scandent +scandia +scandian +scandias +scandic +scandicus +scandinavia +scandinavian +scandinavianism +scandinavians +scandium +scandiums +scandix +scania +scanian +scanic +scanmag +scannable +scanned +scanner +scanners +scanning +scanningly +scannings +scans +scansion +scansionist +scansions +scansores +scansory +scansorial +scansorious +scanstor +scant +scanted +scanter +scantest +scanty +scantier +scanties +scantiest +scantily +scantiness +scanting +scantity +scantle +scantlet +scantly +scantling +scantlinged +scantlings +scantness +scants +scap +scape +scaped +scapegallows +scapegoat +scapegoater +scapegoating +scapegoatism +scapegoats +scapegrace +scapegraces +scapel +scapeless +scapement +scapes +scapethrift +scapewheel +scapha +scaphander +scaphandridae +scaphe +scaphion +scaphiopodidae +scaphiopus +scaphism +scaphite +scaphites +scaphitidae +scaphitoid +scaphocephaly +scaphocephalic +scaphocephalism +scaphocephalous +scaphocephalus +scaphocerite +scaphoceritic +scaphognathite +scaphognathitic +scaphoid +scaphoids +scapholunar +scaphopod +scaphopoda +scaphopodous +scapiform +scapigerous +scaping +scapoid +scapolite +scapolitization +scapose +scapple +scappler +scapula +scapulae +scapulalgia +scapular +scapulare +scapulary +scapularies +scapulars +scapulas +scapulated +scapulectomy +scapulet +scapulette +scapulimancy +scapuloaxillary +scapulobrachial +scapuloclavicular +scapulocoracoid +scapulodynia +scapulohumeral +scapulopexy +scapuloradial +scapulospinal +scapulothoracic +scapuloulnar +scapulovertebral +scapus +scar +scarab +scarabaean +scarabaei +scarabaeid +scarabaeidae +scarabaeidoid +scarabaeiform +scarabaeinae +scarabaeoid +scarabaeus +scarabaeuses +scarabee +scaraboid +scarabs +scaramouch +scaramouche +scarborough +scarce +scarcely +scarcelins +scarcement +scarcen +scarceness +scarcer +scarcest +scarcy +scarcity +scarcities +scards +scare +scarebabe +scarebug +scarecrow +scarecrowy +scarecrowish +scarecrows +scared +scareful +scarehead +scarey +scaremonger +scaremongering +scareproof +scarer +scarers +scares +scaresome +scarf +scarface +scarfe +scarfed +scarfer +scarfy +scarfing +scarfless +scarflike +scarfpin +scarfpins +scarfs +scarfskin +scarfwise +scary +scarid +scaridae +scarier +scariest +scarify +scarification +scarificator +scarified +scarifier +scarifies +scarifying +scarily +scariness +scaring +scaringly +scariole +scariose +scarious +scarlatina +scarlatinal +scarlatiniform +scarlatinoid +scarlatinous +scarless +scarlet +scarletberry +scarlety +scarletina +scarlets +scarletseed +scarman +scarn +scaroid +scarola +scarp +scarpa +scarpe +scarped +scarper +scarpered +scarpering +scarpers +scarpetti +scarph +scarphed +scarphing +scarphs +scarpines +scarping +scarplet +scarpment +scarproof +scarps +scarred +scarrer +scarry +scarrier +scarriest +scarring +scarrow +scars +scart +scarted +scarth +scarting +scarts +scarus +scarved +scarves +scase +scasely +scat +scatback +scatbacks +scatch +scathe +scathed +scatheful +scatheless +scathelessly +scathes +scathful +scathy +scathing +scathingly +scaticook +scatland +scatology +scatologia +scatologic +scatological +scatologies +scatologist +scatologize +scatoma +scatomancy +scatomas +scatomata +scatophagy +scatophagid +scatophagidae +scatophagies +scatophagoid +scatophagous +scatoscopy +scats +scatt +scatted +scatter +scatterable +scatteration +scatteraway +scatterbrain +scatterbrained +scatterbrains +scattered +scatteredly +scatteredness +scatterer +scatterers +scattergood +scattergram +scattergraph +scattergun +scattery +scattering +scatteringly +scatterings +scatterling +scatterment +scattermouch +scatterplot +scatterplots +scatters +scattershot +scattersite +scatty +scattier +scattiest +scatting +scatts +scatula +scaturient +scaul +scaum +scaup +scauper +scaupers +scaups +scaur +scaurie +scaurs +scaut +scavage +scavager +scavagery +scavel +scavenage +scavenge +scavenged +scavenger +scavengery +scavengerism +scavengers +scavengership +scavenges +scavenging +scaw +scawd +scawl +scawtite +scazon +scazontic +scclera +sceat +scegger +scelalgia +scelerat +scelerate +scelidosaur +scelidosaurian +scelidosauroid +scelidosaurus +scelidotherium +sceliphron +sceloncus +sceloporus +scelotyrbe +scelp +scena +scenary +scenario +scenarioist +scenarioization +scenarioize +scenarios +scenarist +scenarists +scenarization +scenarize +scenarizing +scenas +scend +scended +scendentality +scending +scends +scene +scenecraft +scenedesmus +sceneful +sceneman +scenery +sceneries +scenes +sceneshifter +scenewright +scenic +scenical +scenically +scenist +scenite +scenograph +scenographer +scenography +scenographic +scenographical +scenographically +scenopinidae +scension +scent +scented +scenter +scentful +scenting +scentless +scentlessness +scentproof +scents +scentwood +scepsis +scepter +scepterdom +sceptered +sceptering +scepterless +scepters +sceptibly +sceptic +sceptical +sceptically +scepticism +scepticize +scepticized +scepticizing +sceptics +sceptral +sceptre +sceptred +sceptredom +sceptreless +sceptres +sceptry +sceptring +sceptropherous +sceptrosophy +scerne +sceuophylacium +sceuophylax +sceuophorion +scewing +scf +scfh +scfm +sch +schaapsteker +schadchan +schadenfreude +schaefferia +schairerite +schalmei +schalmey +schalstein +schanse +schanz +schapbachite +schappe +schapped +schappes +schapping +schapska +scharf +scharlachberger +schatchen +schav +schavs +scheat +schedar +schediasm +schediastic +schedius +schedulable +schedular +schedulate +schedule +scheduled +scheduler +schedulers +schedules +scheduling +schedulize +scheelin +scheelite +scheffel +schefferite +scheherazade +schelly +schelling +schellingian +schellingianism +schellingism +schelm +scheltopusik +schema +schemas +schemata +schemati +schematic +schematical +schematically +schematics +schematisation +schematise +schematised +schematiser +schematising +schematism +schematist +schematization +schematize +schematized +schematizer +schematogram +schematograph +schematologetically +schematomancy +schematonics +scheme +schemed +schemeful +schemeless +schemer +schemery +schemers +schemes +schemy +scheming +schemingly +schemist +schemozzle +schene +schepel +schepen +scherm +scherzando +scherzi +scherzo +scherzos +scherzoso +schesis +scheuchzeria +scheuchzeriaceae +scheuchzeriaceous +schiavona +schiavone +schiavones +schiavoni +schick +schiedam +schiffli +schiller +schillerfels +schillerization +schillerize +schillerized +schillerizing +schillers +schilling +schillings +schillu +schimmel +schynbald +schindylesis +schindyletic +schinus +schipperke +schisandra +schisandraceae +schism +schisma +schismatic +schismatical +schismatically +schismaticalness +schismatics +schismatism +schismatist +schismatize +schismatized +schismatizing +schismic +schismless +schisms +schist +schistaceous +schistic +schistocelia +schistocephalus +schistocerca +schistocyte +schistocytosis +schistocoelia +schistocormia +schistocormus +schistoglossia +schistoid +schistomelia +schistomelus +schistoprosopia +schistoprosopus +schistorrhachis +schistoscope +schistose +schistosis +schistosity +schistosoma +schistosomal +schistosome +schistosomia +schistosomiasis +schistosomus +schistosternia +schistothorax +schistous +schists +schistus +schiz +schizaea +schizaeaceae +schizaeaceous +schizanthus +schizaxon +schizy +schizo +schizocarp +schizocarpic +schizocarpous +schizochroal +schizocyte +schizocytosis +schizocoele +schizocoelic +schizocoelous +schizodinic +schizogamy +schizogenesis +schizogenetic +schizogenetically +schizogenic +schizogenous +schizogenously +schizognath +schizognathae +schizognathism +schizognathous +schizogony +schizogonic +schizogonous +schizogregarinae +schizogregarine +schizogregarinida +schizoid +schizoidism +schizoids +schizolaenaceae +schizolaenaceous +schizolysigenous +schizolite +schizomanic +schizomeria +schizomycete +schizomycetes +schizomycetic +schizomycetous +schizomycosis +schizonemertea +schizonemertean +schizonemertine +schizoneura +schizonotus +schizont +schizonts +schizopelmous +schizopetalon +schizophasia +schizophyceae +schizophyceous +schizophyllum +schizophyta +schizophyte +schizophytic +schizophragma +schizophrene +schizophrenia +schizophreniac +schizophrenic +schizophrenically +schizophrenics +schizopod +schizopoda +schizopodal +schizopodous +schizorhinal +schizos +schizospore +schizostele +schizostely +schizostelic +schizothecal +schizothyme +schizothymia +schizothymic +schizothoracic +schizotrichia +schizotrypanum +schiztic +schizzo +schlauraffenland +schleichera +schlemiel +schlemiels +schlemihl +schlenter +schlep +schlepp +schlepped +schlepper +schlepping +schlepps +schleps +schlieren +schlieric +schlimazel +schlimazl +schlock +schlocks +schloop +schloss +schlump +schmalkaldic +schmaltz +schmaltzes +schmaltzy +schmaltzier +schmaltziest +schmalz +schmalzes +schmalzy +schmalzier +schmalziest +schmatte +schmear +schmeer +schmeered +schmeering +schmeers +schmeiss +schmelz +schmelze +schmelzes +schmitz +schmo +schmoe +schmoes +schmoos +schmoose +schmoosed +schmooses +schmoosing +schmooze +schmoozed +schmoozes +schmoozing +schmuck +schmucks +schnabel +schnabelkanne +schnapper +schnapps +schnaps +schnauzer +schnauzers +schnebelite +schnecke +schnecken +schneider +schneiderian +schnell +schnitz +schnitzel +schnook +schnooks +schnorchel +schnorkel +schnorkle +schnorrer +schnoz +schnozzle +schnozzola +scho +schochat +schoche +schochet +schoenanth +schoenobatic +schoenobatist +schoenocaulon +schoenus +schoharie +schokker +schola +scholae +scholaptitude +scholar +scholarch +scholardom +scholarian +scholarism +scholarity +scholarless +scholarly +scholarlike +scholarliness +scholars +scholarship +scholarships +scholasm +scholastic +scholastical +scholastically +scholasticate +scholasticism +scholasticly +scholastics +scholasticus +scholia +scholiast +scholiastic +scholion +scholium +scholiumlia +scholiums +schomburgkia +schone +schonfelsite +schoodic +school +schoolable +schoolage +schoolbag +schoolboy +schoolboydom +schoolboyhood +schoolboyish +schoolboyishly +schoolboyishness +schoolboyism +schoolboys +schoolbook +schoolbookish +schoolbooks +schoolbutter +schoolchild +schoolchildren +schoolcraft +schooldays +schooldame +schooldom +schooled +schooler +schoolery +schoolers +schoolfellow +schoolfellows +schoolfellowship +schoolful +schoolgirl +schoolgirlhood +schoolgirly +schoolgirlish +schoolgirlishly +schoolgirlishness +schoolgirlism +schoolgirls +schoolgoing +schoolhouse +schoolhouses +schoolyard +schoolyards +schoolie +schooling +schoolingly +schoolish +schoolkeeper +schoolkeeping +schoolless +schoollike +schoolma +schoolmaam +schoolmaamish +schoolmaid +schoolman +schoolmarm +schoolmarms +schoolmaster +schoolmasterhood +schoolmastery +schoolmastering +schoolmasterish +schoolmasterishly +schoolmasterishness +schoolmasterism +schoolmasterly +schoolmasterlike +schoolmasters +schoolmastership +schoolmate +schoolmates +schoolmen +schoolmiss +schoolmistress +schoolmistresses +schoolmistressy +schoolroom +schoolrooms +schools +schoolteacher +schoolteachery +schoolteacherish +schoolteacherly +schoolteachers +schoolteaching +schooltide +schooltime +schoolward +schoolwards +schoolwork +schoon +schooner +schooners +schooper +schopenhauereanism +schopenhauerian +schopenhauerism +schoppen +schorenbergite +schorl +schorlaceous +schorly +schorlomite +schorlous +schorls +schottische +schottish +schout +schouw +schradan +schrank +schraubthaler +schrebera +schrecklich +schreibersite +schreiner +schreinerize +schreinerized +schreinerizing +schryari +schriesheimite +schrik +schriks +schrother +schrund +schtick +schticks +schtoff +schubert +schuh +schuhe +schuit +schuyt +schuits +schul +schule +schuln +schultenite +schultz +schultze +schungite +schuss +schussboomer +schussboomers +schussed +schusses +schussing +schute +schwa +schwabacher +schwalbea +schwanpan +schwarmerei +schwarz +schwarzian +schwas +schweizer +schweizerkase +schwendenerian +schwenkfelder +schwenkfeldian +sci +sciadopitys +sciaena +sciaenid +sciaenidae +sciaenids +sciaeniform +sciaeniformes +sciaenoid +sciage +sciagraph +sciagraphed +sciagraphy +sciagraphic +sciagraphing +scialytic +sciamachy +sciamachies +sciametry +scian +sciapod +sciapodous +sciara +sciarid +sciaridae +sciarinae +sciascope +sciascopy +sciath +sciatheric +sciatherical +sciatherically +sciatic +sciatica +sciatical +sciatically +sciaticas +sciaticky +sciatics +scybala +scybalous +scybalum +scibile +scye +scyelite +science +scienced +sciences +scient +scienter +scientia +sciential +scientiarum +scientician +scientific +scientifical +scientifically +scientificalness +scientificogeographical +scientificohistorical +scientificophilosophical +scientificopoetic +scientificoreligious +scientificoromantic +scientintically +scientism +scientist +scientistic +scientistically +scientists +scientize +scientolism +scientology +scientologist +scil +scyld +scilicet +scilla +scylla +scyllaea +scyllaeidae +scillain +scyllarian +scyllaridae +scyllaroid +scyllarus +scillas +scyllidae +scylliidae +scyllioid +scylliorhinidae +scylliorhinoid +scylliorhinus +scillipicrin +scillitan +scyllite +scillitin +scillitine +scyllitol +scillitoxin +scyllium +scillonian +scimetar +scimetars +scimitar +scimitared +scimitarpod +scimitars +scimiter +scimitered +scimiterpod +scimiters +scincid +scincidae +scincidoid +scinciform +scincoid +scincoidian +scincoids +scincomorpha +scincus +scind +sciniph +scintigraphy +scintigraphic +scintil +scintilla +scintillant +scintillantly +scintillas +scintillate +scintillated +scintillates +scintillating +scintillatingly +scintillation +scintillations +scintillator +scintillators +scintillescent +scintillize +scintillometer +scintilloscope +scintillose +scintillous +scintillously +scintle +scintled +scintler +scintling +sciograph +sciography +sciographic +sciolism +sciolisms +sciolist +sciolistic +sciolists +sciolous +sciolto +sciomachy +sciomachiology +sciomancy +sciomantic +scion +scions +sciophilous +sciophyte +sciophobia +scioptic +sciopticon +scioptics +scioptric +sciosophy +sciosophies +sciosophist +sciot +scioterical +scioterique +sciotheism +sciotheric +sciotherical +sciotherically +scious +scypha +scyphae +scyphate +scyphi +scyphiferous +scyphiform +scyphiphorous +scyphistoma +scyphistomae +scyphistomas +scyphistomoid +scyphistomous +scyphoi +scyphomancy +scyphomedusae +scyphomedusan +scyphomedusoid +scyphophore +scyphophori +scyphophorous +scyphopolyp +scyphose +scyphostoma +scyphozoa +scyphozoan +scyphula +scyphulus +scyphus +scypphi +scirenga +scirocco +sciroccos +scirophoria +scirophorion +scirpus +scirrhi +scirrhogastria +scirrhoid +scirrhoma +scirrhosis +scirrhosity +scirrhous +scirrhus +scirrhuses +scirrosity +scirtopod +scirtopoda +scirtopodous +sciscitation +scissel +scissible +scissil +scissile +scission +scissions +scissiparity +scissor +scissorbill +scissorbird +scissored +scissorer +scissoria +scissoring +scissorium +scissorlike +scissorlikeness +scissors +scissorsbird +scissorsmith +scissorstail +scissortail +scissorwise +scissura +scissure +scissurella +scissurellid +scissurellidae +scissures +scyt +scytale +scitaminales +scitamineae +scyth +scythe +scythed +scytheless +scythelike +scytheman +scythes +scythesmith +scythestone +scythework +scythian +scythic +scything +scythize +scytitis +scytoblastema +scytodepsic +scytonema +scytonemataceae +scytonemataceous +scytonematoid +scytonematous +scytopetalaceae +scytopetalaceous +scytopetalum +scituate +sciurid +sciuridae +sciurine +sciurines +sciuroid +sciuroids +sciuromorph +sciuromorpha +sciuromorphic +sciuropterus +sciurus +scivvy +scivvies +sclaff +sclaffed +sclaffer +sclaffers +sclaffert +sclaffing +sclaffs +sclat +sclatch +sclate +sclater +sclav +sclavonian +sclaw +sclent +scler +sclera +sclerae +scleral +scleranth +scleranthaceae +scleranthus +scleras +scleratogenous +sclere +sclerectasia +sclerectomy +sclerectomies +scleredema +sclereid +sclereids +sclerema +sclerencephalia +sclerenchyma +sclerenchymatous +sclerenchyme +sclererythrin +scleretinite +scleria +scleriasis +sclerify +sclerification +sclerite +sclerites +scleritic +scleritis +sclerized +sclerobase +sclerobasic +scleroblast +scleroblastema +scleroblastemic +scleroblastic +sclerocauly +sclerochorioiditis +sclerochoroiditis +scleroconjunctival +scleroconjunctivitis +sclerocornea +sclerocorneal +sclerodactyly +sclerodactylia +sclerodema +scleroderm +scleroderma +sclerodermaceae +sclerodermata +sclerodermatales +sclerodermatitis +sclerodermatous +sclerodermi +sclerodermia +sclerodermic +sclerodermite +sclerodermitic +sclerodermitis +sclerodermous +sclerogen +sclerogeni +sclerogenic +sclerogenoid +sclerogenous +scleroid +scleroiritis +sclerokeratitis +sclerokeratoiritis +scleroma +scleromas +scleromata +scleromeninx +scleromere +sclerometer +sclerometric +scleronychia +scleronyxis +scleropages +scleroparei +sclerophyll +sclerophylly +sclerophyllous +sclerophthalmia +scleroprotein +sclerosal +sclerosarcoma +scleroscope +sclerose +sclerosed +scleroseptum +scleroses +sclerosing +sclerosis +scleroskeletal +scleroskeleton +sclerospora +sclerostenosis +sclerostoma +sclerostomiasis +sclerotal +sclerote +sclerotia +sclerotial +sclerotic +sclerotica +sclerotical +scleroticectomy +scleroticochorioiditis +scleroticochoroiditis +scleroticonyxis +scleroticotomy +sclerotin +sclerotinia +sclerotinial +sclerotiniose +sclerotioid +sclerotitic +sclerotitis +sclerotium +sclerotization +sclerotized +sclerotoid +sclerotome +sclerotomy +sclerotomic +sclerotomies +sclerous +scleroxanthin +sclerozone +scliff +sclim +sclimb +scoad +scob +scobby +scobicular +scobiform +scobs +scodgy +scoff +scoffed +scoffer +scoffery +scoffers +scoffing +scoffingly +scoffingstock +scofflaw +scofflaws +scoffs +scog +scoggan +scogger +scoggin +scogginism +scogginist +scogie +scoinson +scoke +scolb +scold +scoldable +scolded +scoldenore +scolder +scolders +scolding +scoldingly +scoldings +scolds +scoleces +scoleciasis +scolecid +scolecida +scoleciform +scolecite +scolecoid +scolecology +scolecophagous +scolecospore +scoley +scoleryng +scolex +scolia +scolices +scoliid +scoliidae +scolymus +scoliograptic +scoliokyposis +scolioma +scoliomas +scoliometer +scolion +scoliorachitic +scoliosis +scoliotic +scoliotone +scolite +scolytid +scolytidae +scolytids +scolytoid +scolytus +scollop +scolloped +scolloper +scolloping +scollops +scoloc +scolog +scolopaceous +scolopacidae +scolopacine +scolopax +scolopendra +scolopendrella +scolopendrellidae +scolopendrelloid +scolopendrid +scolopendridae +scolopendriform +scolopendrine +scolopendrium +scolopendroid +scolopes +scolophore +scolopophore +scolops +scomber +scomberoid +scombresocidae +scombresox +scombrid +scombridae +scombriform +scombriformes +scombrine +scombroid +scombroidea +scombroidean +scombrone +scomfit +scomm +sconce +sconced +sconcer +sconces +sconcheon +sconcible +sconcing +scone +scones +scooch +scoon +scoop +scooped +scooper +scoopers +scoopful +scoopfulfuls +scoopfuls +scooping +scoopingly +scoops +scoopsful +scoot +scooted +scooter +scooters +scooting +scoots +scop +scopa +scoparin +scoparium +scoparius +scopate +scope +scoped +scopeless +scopelid +scopelidae +scopeliform +scopelism +scopeloid +scopelus +scopes +scopet +scophony +scopic +scopidae +scopiferous +scopiform +scopiformly +scopine +scoping +scopious +scopiped +scopola +scopolamin +scopolamine +scopoleine +scopoletin +scopoline +scopone +scopophilia +scopophiliac +scopophilic +scopperil +scops +scoptical +scoptically +scoptophilia +scoptophiliac +scoptophilic +scoptophobia +scopula +scopulae +scopularia +scopularian +scopulas +scopulate +scopuliferous +scopuliform +scopuliped +scopulipedes +scopulite +scopulous +scopulousness +scopus +scorbuch +scorbute +scorbutic +scorbutical +scorbutically +scorbutize +scorbutus +scorce +scorch +scorched +scorcher +scorchers +scorches +scorching +scorchingly +scorchingness +scorchproof +scorchs +scordato +scordatura +scordaturas +scordature +scordium +score +scoreboard +scoreboards +scorebook +scorecard +scored +scorekeeper +scorekeeping +scoreless +scorepad +scorepads +scorer +scorers +scores +scoresheet +scoria +scoriac +scoriaceous +scoriae +scorify +scorification +scorified +scorifier +scorifies +scorifying +scoriform +scoring +scorings +scorious +scorkle +scorn +scorned +scorner +scorners +scornful +scornfully +scornfulness +scorny +scorning +scorningly +scornproof +scorns +scorodite +scorpaena +scorpaenid +scorpaenidae +scorpaenoid +scorpene +scorper +scorpidae +scorpididae +scorpii +scorpiid +scorpio +scorpioid +scorpioidal +scorpioidea +scorpion +scorpiones +scorpionfish +scorpionfishes +scorpionfly +scorpionflies +scorpionic +scorpionid +scorpionida +scorpionidea +scorpionis +scorpions +scorpionweed +scorpionwort +scorpios +scorpiurus +scorpius +scorse +scorser +scortation +scortatory +scorza +scorzonera +scot +scotal +scotale +scotch +scotched +scotcher +scotchery +scotches +scotchy +scotchify +scotchification +scotchiness +scotching +scotchman +scotchmen +scotchness +scotchwoman +scote +scoter +scoterythrous +scoters +scotia +scotias +scotic +scotino +scotism +scotist +scotistic +scotistical +scotize +scotland +scotlandwards +scotodinia +scotogram +scotograph +scotography +scotographic +scotoma +scotomas +scotomata +scotomatic +scotomatical +scotomatous +scotomy +scotomia +scotomic +scotophilia +scotophiliac +scotophobia +scotopia +scotopias +scotopic +scotoscope +scotosis +scots +scotsman +scotsmen +scotswoman +scott +scotty +scottice +scotticism +scotticize +scottie +scotties +scottify +scottification +scottish +scottisher +scottishly +scottishman +scottishness +scouch +scouk +scoundrel +scoundreldom +scoundrelish +scoundrelism +scoundrelly +scoundrels +scoundrelship +scoup +scour +scourage +scoured +scourer +scourers +scouress +scourfish +scourfishes +scourge +scourged +scourger +scourgers +scourges +scourging +scourgingly +scoury +scouriness +scouring +scourings +scours +scourway +scourweed +scourwort +scouse +scouses +scout +scoutcraft +scoutdom +scouted +scouter +scouters +scouth +scouther +scouthered +scouthering +scouthers +scouthood +scouths +scouting +scoutingly +scoutings +scoutish +scoutmaster +scoutmasters +scouts +scoutwatch +scove +scovel +scovy +scovillite +scow +scowbank +scowbanker +scowder +scowdered +scowdering +scowders +scowed +scowing +scowl +scowled +scowler +scowlers +scowlful +scowling +scowlingly +scowlproof +scowls +scowman +scowmen +scows +scowther +scr +scrab +scrabble +scrabbled +scrabbler +scrabblers +scrabbles +scrabbly +scrabbling +scrabe +scraber +scrae +scraffle +scrag +scragged +scraggedly +scraggedness +scragger +scraggy +scraggier +scraggiest +scraggily +scragginess +scragging +scraggle +scraggled +scraggly +scragglier +scraggliest +scraggliness +scraggling +scrags +scray +scraich +scraiched +scraiching +scraichs +scraye +scraigh +scraighed +scraighing +scraighs +scraily +scram +scramasax +scramasaxe +scramb +scramble +scramblebrained +scrambled +scramblement +scrambler +scramblers +scrambles +scrambly +scrambling +scramblingly +scrammed +scramming +scrampum +scrams +scran +scranch +scrank +scranky +scrannel +scrannels +scranny +scrannier +scranniest +scranning +scrap +scrapable +scrapbook +scrapbooks +scrape +scrapeage +scraped +scrapepenny +scraper +scraperboard +scrapers +scrapes +scrapheap +scrapy +scrapie +scrapies +scrapiness +scraping +scrapingly +scrapings +scrapler +scraplet +scrapling +scrapman +scrapmonger +scrappage +scrapped +scrapper +scrappers +scrappet +scrappy +scrappier +scrappiest +scrappily +scrappiness +scrapping +scrappingly +scrapple +scrappler +scrapples +scraps +scrapworks +scrat +scratch +scratchable +scratchably +scratchback +scratchboard +scratchbrush +scratchcard +scratchcarding +scratchcat +scratched +scratcher +scratchers +scratches +scratchy +scratchier +scratchiest +scratchification +scratchily +scratchiness +scratching +scratchingly +scratchless +scratchlike +scratchman +scratchpad +scratchpads +scratchproof +scratchweed +scratchwork +scrath +scratter +scrattle +scrattling +scrauch +scrauchle +scraunch +scraw +scrawk +scrawl +scrawled +scrawler +scrawlers +scrawly +scrawlier +scrawliest +scrawliness +scrawling +scrawls +scrawm +scrawny +scrawnier +scrawniest +scrawnily +scrawniness +scraze +screak +screaked +screaky +screaking +screaks +scream +screamed +screamer +screamers +screamy +screaminess +screaming +screamingly +screamproof +screams +screar +scree +screech +screechbird +screeched +screecher +screeches +screechy +screechier +screechiest +screechily +screechiness +screeching +screechingly +screed +screeded +screeding +screeds +screek +screel +screeman +screen +screenable +screenage +screencraft +screendom +screened +screener +screeners +screenful +screeny +screening +screenings +screenland +screenless +screenlike +screenman +screeno +screenplay +screenplays +screens +screensman +screenwise +screenwork +screenwriter +screes +screet +screeve +screeved +screever +screeving +screich +screigh +screve +screver +screw +screwable +screwage +screwball +screwballs +screwbarrel +screwbean +screwdrive +screwdriver +screwdrivers +screwed +screwer +screwers +screwfly +screwhead +screwy +screwier +screwiest +screwiness +screwing +screwish +screwless +screwlike +screwman +screwmatics +screwpile +screwplate +screwpod +screwpropeller +screws +screwship +screwsman +screwstem +screwstock +screwwise +screwworm +scrfchar +scry +scribable +scribacious +scribaciousness +scribal +scribals +scribanne +scribatious +scribatiousness +scribbet +scribblage +scribblative +scribblatory +scribble +scribbleable +scribbled +scribbledom +scribbleism +scribblemania +scribblemaniacal +scribblement +scribbleomania +scribbler +scribblers +scribbles +scribbly +scribbling +scribblingly +scribe +scribed +scriber +scribers +scribes +scribeship +scribing +scribism +scribophilous +scride +scryer +scrieve +scrieved +scriever +scrieves +scrieving +scriggle +scriggler +scriggly +scrying +scrike +scrim +scrime +scrimer +scrimy +scrimmage +scrimmaged +scrimmager +scrimmages +scrimmaging +scrimp +scrimped +scrimper +scrimpy +scrimpier +scrimpiest +scrimpily +scrimpiness +scrimping +scrimpingly +scrimpit +scrimply +scrimpness +scrimps +scrimption +scrims +scrimshander +scrimshandy +scrimshank +scrimshanker +scrimshaw +scrimshaws +scrimshon +scrimshorn +scrin +scrinch +scrine +scringe +scrinia +scriniary +scrinium +scrip +scripee +scripless +scrippage +scrips +scripsit +script +scripted +scripter +scripting +scription +scriptitious +scriptitiously +scriptitory +scriptive +scripto +scriptor +scriptory +scriptoria +scriptorial +scriptorium +scriptoriums +scripts +scriptum +scriptural +scripturalism +scripturalist +scripturality +scripturalize +scripturally +scripturalness +scripturarian +scripture +scriptured +scriptureless +scriptures +scripturiency +scripturient +scripturism +scripturist +scriptwriter +scriptwriting +scripula +scripulum +scripuralistic +scrit +scritch +scrite +scrithe +scritoire +scrivaille +scrivan +scrivano +scrive +scrived +scrivello +scrivelloes +scrivellos +scriven +scrivener +scrivenery +scriveners +scrivenership +scrivening +scrivenly +scriver +scrives +scriving +scrob +scrobble +scrobe +scrobicula +scrobicular +scrobiculate +scrobiculated +scrobicule +scrobiculus +scrobis +scrod +scroddled +scrodgill +scrods +scroff +scrofula +scrofularoot +scrofulas +scrofulaweed +scrofulide +scrofulism +scrofulitic +scrofuloderm +scrofuloderma +scrofulorachitic +scrofulosis +scrofulotuberculous +scrofulous +scrofulously +scrofulousness +scrog +scrogged +scroggy +scroggie +scroggier +scroggiest +scrogie +scrogs +scroyle +scroinoch +scroinogh +scrolar +scroll +scrolled +scrollery +scrollhead +scrolly +scrolling +scrolls +scrollwise +scrollwork +scronach +scroo +scrooch +scrooge +scrooges +scroop +scrooped +scrooping +scroops +scrophularia +scrophulariaceae +scrophulariaceous +scrota +scrotal +scrotectomy +scrotiform +scrotitis +scrotocele +scrotofemoral +scrotta +scrotum +scrotums +scrouge +scrouged +scrouger +scrouges +scrouging +scrounge +scrounged +scrounger +scroungers +scrounges +scroungy +scroungier +scroungiest +scrounging +scrout +scrow +scrub +scrubbable +scrubbed +scrubber +scrubbery +scrubbers +scrubby +scrubbier +scrubbiest +scrubbily +scrubbiness +scrubbing +scrubbird +scrubbly +scrubboard +scrubgrass +scrubland +scrublike +scrubs +scrubwoman +scrubwomen +scrubwood +scruf +scruff +scruffy +scruffier +scruffiest +scruffily +scruffiness +scruffle +scruffman +scruffs +scruft +scrum +scrummage +scrummaged +scrummager +scrummaging +scrump +scrumpy +scrumple +scrumption +scrumptious +scrumptiously +scrumptiousness +scrums +scrunch +scrunched +scrunches +scrunchy +scrunching +scrunchs +scrunge +scrunger +scrunt +scrunty +scruple +scrupled +scrupleless +scrupler +scruples +scruplesome +scruplesomeness +scrupling +scrupula +scrupular +scrupuli +scrupulist +scrupulosity +scrupulosities +scrupulous +scrupulously +scrupulousness +scrupulum +scrupulus +scrush +scrutability +scrutable +scrutate +scrutation +scrutator +scrutatory +scrutinant +scrutinate +scrutineer +scrutiny +scrutinies +scrutinisation +scrutinise +scrutinised +scrutinising +scrutinization +scrutinize +scrutinized +scrutinizer +scrutinizers +scrutinizes +scrutinizing +scrutinizingly +scrutinous +scrutinously +scruto +scrutoire +scruze +sct +sctd +scuba +scubas +scud +scuddaler +scuddawn +scudded +scudder +scuddy +scuddick +scudding +scuddle +scudi +scudler +scudo +scuds +scuff +scuffed +scuffer +scuffy +scuffing +scuffle +scuffled +scuffler +scufflers +scuffles +scuffly +scuffling +scufflingly +scuffs +scuft +scufter +scug +scuggery +sculch +sculduddery +sculdudderies +sculduggery +sculk +sculked +sculker +sculkers +sculking +sculks +scull +scullduggery +sculled +sculler +scullery +sculleries +scullers +scullful +sculling +scullion +scullionish +scullionize +scullions +scullionship +scullog +scullogue +sculls +sculp +sculped +sculper +sculpin +sculping +sculpins +sculps +sculpsit +sculpt +sculpted +sculptile +sculpting +sculptitory +sculptograph +sculptography +sculptor +sculptorid +sculptors +sculptress +sculptresses +sculpts +sculptural +sculpturally +sculpturation +sculpture +sculptured +sculpturer +sculptures +sculpturesque +sculpturesquely +sculpturesqueness +sculpturing +sculsh +scult +scum +scumber +scumble +scumbled +scumbles +scumbling +scumboard +scumfish +scumless +scumlike +scummed +scummer +scummers +scummy +scummier +scummiest +scumminess +scumming +scumproof +scums +scun +scuncheon +scunder +scunge +scungy +scungili +scungilli +scunner +scunnered +scunnering +scunners +scup +scupful +scuppaug +scuppaugs +scupper +scuppered +scuppering +scuppernong +scuppers +scuppet +scuppit +scuppler +scups +scur +scurdy +scurf +scurfer +scurfy +scurfier +scurfiest +scurfily +scurfiness +scurflike +scurfs +scurling +scurry +scurried +scurrier +scurries +scurrying +scurril +scurrile +scurrilist +scurrility +scurrilities +scurrilize +scurrilous +scurrilously +scurrilousness +scurvy +scurvied +scurvier +scurvies +scurviest +scurvily +scurviness +scurvish +scurvyweed +scusation +scuse +scusin +scut +scuta +scutage +scutages +scutal +scutate +scutated +scutatiform +scutation +scutch +scutched +scutcheon +scutcheoned +scutcheonless +scutcheonlike +scutcheons +scutcheonwise +scutcher +scutchers +scutches +scutching +scutchs +scute +scutel +scutella +scutellae +scutellar +scutellaria +scutellarin +scutellate +scutellated +scutellation +scutellerid +scutelleridae +scutelliform +scutelligerous +scutelliplantar +scutelliplantation +scutellum +scutes +scutibranch +scutibranchia +scutibranchian +scutibranchiate +scutifer +scutiferous +scutiform +scutiger +scutigera +scutigeral +scutigeridae +scutigerous +scutiped +scuts +scutta +scutter +scuttered +scuttering +scutters +scutty +scuttle +scuttlebutt +scuttled +scuttleful +scuttleman +scuttler +scuttles +scuttling +scuttock +scutula +scutular +scutulate +scutulated +scutulum +scutum +scuz +scuzzy +sd +sdeath +sdeign +sdlc +sdrucciola +sds +sdump +se +sea +seabag +seabags +seabank +seabeach +seabeaches +seabeard +seabed +seabeds +seabee +seaberry +seabird +seabirds +seaboard +seaboards +seaboot +seaboots +seaborderer +seaborne +seabound +seacannie +seacatch +seacliff +seacoast +seacoasts +seacock +seacocks +seaconny +seacraft +seacrafty +seacrafts +seacross +seacunny +seadog +seadogs +seadrome +seadromes +seafardinger +seafare +seafarer +seafarers +seafaring +seafighter +seaflood +seafloor +seafloors +seaflower +seafoam +seafolk +seafood +seafoods +seaforthia +seafowl +seafowls +seafront +seafronts +seaghan +seagirt +seagoer +seagoing +seagull +seagulls +seah +seahorse +seahound +seak +seakeeping +seakindliness +seal +sealable +sealant +sealants +sealch +sealed +sealer +sealery +sealeries +sealers +sealess +sealet +sealette +sealevel +sealflower +sealy +sealyham +sealike +sealine +sealing +sealkie +sealless +seallike +seals +sealskin +sealskins +sealwort +seam +seaman +seamancraft +seamanite +seamanly +seamanlike +seamanlikeness +seamanliness +seamanship +seamark +seamarks +seamas +seambiter +seamed +seamen +seamer +seamers +seamew +seamy +seamier +seamiest +seaminess +seaming +seamless +seamlessly +seamlessness +seamlet +seamlike +seamost +seamount +seamounts +seamrend +seamrog +seams +seamster +seamsters +seamstress +seamstresses +seamus +sean +seance +seances +seapiece +seapieces +seaplane +seaplanes +seapoose +seaport +seaports +seapost +seaquake +seaquakes +sear +searce +searcer +search +searchable +searchableness +searchant +searched +searcher +searcheress +searcherlike +searchers +searchership +searches +searchful +searching +searchingly +searchingness +searchings +searchless +searchlight +searchlights +searchment +searcloth +seared +searedness +searer +searest +seary +searing +searingly +searlesite +searness +searoving +sears +seas +seasan +seascape +seascapes +seascapist +seascout +seascouting +seascouts +seashell +seashells +seashine +seashore +seashores +seasick +seasickness +seaside +seasider +seasides +seasnail +season +seasonable +seasonableness +seasonably +seasonal +seasonality +seasonally +seasonalness +seasoned +seasonedly +seasoner +seasoners +seasoning +seasoninglike +seasonings +seasonless +seasons +seastar +seastrand +seastroke +seat +seatang +seatbelt +seated +seater +seaters +seathe +seating +seatings +seatless +seatmate +seatmates +seatrain +seatrains +seatron +seats +seatsman +seatstone +seattle +seatwork +seatworks +seave +seavy +seaway +seaways +seawall +seawalls +seawan +seawans +seawant +seawants +seaward +seawardly +seawards +seaware +seawares +seawater +seawaters +seaweed +seaweedy +seaweeds +seawife +seawoman +seaworn +seaworthy +seaworthiness +seax +seba +sebacate +sebaceous +sebaceousness +sebacic +sebago +sebait +sebasic +sebastian +sebastianite +sebastichthys +sebastine +sebastodes +sebat +sebate +sebesten +sebiferous +sebific +sebilla +sebiparous +sebkha +sebolith +seborrhagia +seborrhea +seborrheal +seborrheic +seborrhoea +seborrhoeic +seborrhoic +sebright +sebum +sebums +sebundy +sec +secability +secable +secale +secalin +secaline +secalose +secamone +secancy +secant +secantly +secants +secateur +secateurs +secchio +secco +seccos +seccotine +secede +seceded +seceder +seceders +secedes +seceding +secern +secerned +secernent +secerning +secernment +secerns +secesh +secesher +secess +secessia +secession +secessional +secessionalist +secessiondom +secessioner +secessionism +secessionist +secessionists +secessions +sech +sechium +sechuana +secy +seck +seckel +seclude +secluded +secludedly +secludedness +secludes +secluding +secluse +seclusion +seclusionist +seclusive +seclusively +seclusiveness +secno +secobarbital +secodont +secohm +secohmmeter +seconal +second +secondar +secondary +secondaries +secondarily +secondariness +seconde +seconded +seconder +seconders +secondes +secondhand +secondhanded +secondhandedly +secondhandedness +secondi +secondine +secondines +seconding +secondly +secondment +secondness +secondo +secondrater +seconds +secondsighted +secondsightedness +secos +secours +secpar +secpars +secque +secration +secre +secrecy +secrecies +secret +secreta +secretage +secretagogue +secretaire +secretar +secretary +secretarial +secretarian +secretariat +secretariate +secretariats +secretaries +secretaryship +secretaryships +secrete +secreted +secreter +secretes +secretest +secretin +secreting +secretins +secretion +secretional +secretionary +secretions +secretitious +secretive +secretively +secretivelies +secretiveness +secretly +secretmonger +secretness +secreto +secretomotor +secretor +secretory +secretors +secrets +secretum +secs +sect +sectary +sectarial +sectarian +sectarianise +sectarianised +sectarianising +sectarianism +sectarianize +sectarianized +sectarianizing +sectarianly +sectarians +sectaries +sectarism +sectarist +sectator +sectile +sectility +section +sectional +sectionalisation +sectionalise +sectionalised +sectionalising +sectionalism +sectionalist +sectionality +sectionalization +sectionalize +sectionalized +sectionalizing +sectionally +sectionary +sectioned +sectioning +sectionist +sectionize +sectionized +sectionizing +sections +sectioplanography +sectism +sectist +sectiuncle +sective +sector +sectoral +sectored +sectorial +sectoring +sectors +sectroid +sects +sectuary +sectwise +secular +secularisation +secularise +secularised +seculariser +secularising +secularism +secularist +secularistic +secularists +secularity +secularities +secularization +secularize +secularized +secularizer +secularizers +secularizes +secularizing +secularly +secularness +seculars +seculum +secund +secunda +secundate +secundation +secundiflorous +secundigravida +secundine +secundines +secundipara +secundiparity +secundiparous +secundly +secundogeniture +secundoprimary +secundum +secundus +securable +securableness +securance +secure +secured +secureful +securely +securement +secureness +securer +securers +secures +securest +securicornate +securifer +securifera +securiferous +securiform +securigera +securigerous +securing +securings +securitan +security +securities +secus +secutor +sed +sedaceae +sedan +sedang +sedanier +sedans +sedarim +sedat +sedate +sedated +sedately +sedateness +sedater +sedates +sedatest +sedating +sedation +sedations +sedative +sedatives +sedent +sedentary +sedentaria +sedentarily +sedentariness +sedentation +seder +seders +sederunt +sederunts +sedge +sedged +sedgelike +sedges +sedgy +sedgier +sedgiest +sedging +sedigitate +sedigitated +sedile +sedilia +sedilium +sediment +sedimental +sedimentary +sedimentaries +sedimentarily +sedimentate +sedimentation +sedimented +sedimenting +sedimentology +sedimentologic +sedimentological +sedimentologically +sedimentologist +sedimentous +sediments +sedimetric +sedimetrical +sedition +seditionary +seditionist +seditionists +seditions +seditious +seditiously +seditiousness +sedjadeh +sedovic +seduce +seduceability +seduceable +seduced +seducee +seducement +seducer +seducers +seduces +seducible +seducing +seducingly +seducive +seduct +seduction +seductionist +seductions +seductive +seductively +seductiveness +seductress +seductresses +sedulity +sedulities +sedulous +sedulously +sedulousness +sedum +sedums +see +seeable +seeableness +seeably +seebeck +seecatch +seecatchie +seecawk +seech +seechelt +seed +seedage +seedball +seedbed +seedbeds +seedbird +seedbox +seedcake +seedcakes +seedcase +seedcases +seedeater +seeded +seeder +seeders +seedful +seedgall +seedy +seedier +seediest +seedily +seediness +seeding +seedings +seedkin +seedleaf +seedless +seedlessness +seedlet +seedlike +seedling +seedlings +seedlip +seedman +seedmen +seedness +seedpod +seedpods +seeds +seedsman +seedsmen +seedstalk +seedster +seedtime +seedtimes +seege +seeing +seeingly +seeingness +seeings +seek +seeker +seekerism +seekers +seeking +seeks +seel +seeled +seelful +seely +seelily +seeliness +seeling +seels +seem +seemable +seemably +seemed +seemer +seemers +seeming +seemingly +seemingness +seemings +seemless +seemly +seemlier +seemliest +seemlihead +seemlily +seemliness +seems +seen +seenie +seenil +seenu +seep +seepage +seepages +seeped +seepy +seepier +seepiest +seeping +seepproof +seeps +seepweed +seer +seerband +seercraft +seeress +seeresses +seerfish +seerhand +seerhood +seerlike +seerpaw +seers +seership +seersucker +sees +seesaw +seesawed +seesawiness +seesawing +seesaws +seesee +seethe +seethed +seether +seethes +seething +seethingly +seetulputty +seewee +sefekhet +sefton +seg +segar +segathy +segetal +seggar +seggard +seggars +segged +seggy +seggio +seggiola +seggrom +seghol +segholate +seginus +segment +segmental +segmentalize +segmentally +segmentary +segmentate +segmentation +segmentations +segmented +segmenter +segmenting +segmentize +segments +segni +segno +segnos +sego +segol +segolate +segos +segou +segreant +segregable +segregant +segregate +segregated +segregatedly +segregatedness +segregateness +segregates +segregating +segregation +segregational +segregationist +segregationists +segregative +segregator +segue +segued +segueing +seguendo +segues +seguidilla +seguidillas +seguing +sehyo +sei +sey +seybertite +seicento +seicentos +seiche +seiches +seid +seidel +seidels +seidlitz +seif +seige +seigneur +seigneurage +seigneuress +seigneury +seigneurial +seigneurs +seignior +seigniorage +seignioral +seignioralty +seigniory +seigniorial +seigniories +seigniority +seigniors +seigniorship +seignorage +seignoral +seignory +seignorial +seignories +seignorize +seiyuhonto +seiyukai +seilenoi +seilenos +seimas +seymeria +seymour +seine +seined +seiner +seiners +seines +seining +seiren +seirospore +seirosporic +seis +seisable +seise +seised +seiser +seisers +seises +seisin +seising +seisings +seisins +seism +seismal +seismatical +seismetic +seismic +seismical +seismically +seismicity +seismism +seismisms +seismochronograph +seismogram +seismograms +seismograph +seismographer +seismographers +seismography +seismographic +seismographical +seismographs +seismol +seismology +seismologic +seismological +seismologically +seismologist +seismologists +seismologue +seismometer +seismometers +seismometry +seismometric +seismometrical +seismometrograph +seismomicrophone +seismoscope +seismoscopic +seismotectonic +seismotherapy +seismotic +seisms +seisor +seisors +seisure +seisures +seit +seity +seiurus +seizable +seize +seized +seizer +seizers +seizes +seizin +seizing +seizings +seizins +seizor +seizors +seizure +seizures +sejant +sejeant +sejero +sejoin +sejoined +sejour +sejugate +sejugous +sejunct +sejunction +sejunctive +sejunctively +sejunctly +sekane +sekani +sekar +seker +sekere +sekhwan +sekos +sel +selachian +selachii +selachoid +selachoidei +selachostome +selachostomi +selachostomous +seladang +seladangs +selaginaceae +selaginella +selaginellaceae +selaginellaceous +selagite +selago +selah +selahs +selamin +selamlik +selamliks +selander +selaphobia +selbergite +selbornian +selcouth +seld +selden +seldom +seldomcy +seldomer +seldomly +seldomness +seldor +seldseen +sele +select +selectable +selectance +selected +selectedly +selectee +selectees +selecting +selection +selectional +selectionism +selectionist +selectionists +selections +selective +selectively +selectiveness +selectivity +selectivitysenescence +selectly +selectman +selectmen +selectness +selector +selectors +selects +selectus +selena +selenate +selenates +selene +selenian +seleniate +selenic +selenicereus +selenide +selenidera +selenides +seleniferous +selenigenous +selenion +selenious +selenipedium +selenite +selenites +selenitic +selenitical +selenitiferous +selenitish +selenium +seleniums +seleniuret +selenobismuthite +selenocentric +selenodesy +selenodont +selenodonta +selenodonty +selenograph +selenographer +selenographers +selenography +selenographic +selenographical +selenographically +selenographist +selenolatry +selenolog +selenology +selenological +selenologist +selenomancy +selenomorphology +selenoscope +selenosis +selenotropy +selenotropic +selenotropism +selenous +selensilver +selensulphur +seletar +selety +seleucia +seleucian +seleucid +seleucidae +seleucidan +seleucidean +seleucidian +seleucidic +self +selfadjoint +selfcide +selfdom +selfdoms +selfed +selfeffacing +selfful +selffulness +selfheal +selfheals +selfhypnotization +selfhood +selfhoods +selfing +selfish +selfishly +selfishness +selfism +selfist +selfless +selflessly +selflessness +selfly +selflike +selfmovement +selfness +selfnesses +selfpreservatory +selfpropelling +selfrestrained +selfs +selfsaid +selfsame +selfsameness +selfseekingness +selfsufficiency +selfsustainingly +selfward +selfwards +selictar +seligmannite +selihoth +selina +seling +selinuntine +selion +seljuk +seljukian +sell +sella +sellable +sellably +sellaite +sellar +sellary +sellate +selle +sellenders +seller +sellers +selles +selli +selly +sellie +selliform +selling +sellout +sellouts +sells +sels +selsyn +selsyns +selsoviet +selt +selter +seltzer +seltzers +seltzogene +selung +selva +selvage +selvaged +selvagee +selvages +selvedge +selvedged +selvedges +selves +selzogene +sem +semaeostomae +semaeostomata +semainier +semainiers +semaise +semang +semanteme +semantic +semantical +semantically +semantician +semanticist +semanticists +semantics +semantology +semantological +semantron +semaphore +semaphored +semaphores +semaphoric +semaphorical +semaphorically +semaphoring +semaphorist +semarum +semasiology +semasiological +semasiologically +semasiologist +semateme +sematic +sematography +sematographic +sematology +sematrope +semball +semblable +semblably +semblance +semblances +semblant +semblative +semble +semblence +sembling +seme +semecarpus +semee +semeed +semeia +semeiography +semeiology +semeiologic +semeiological +semeiologist +semeion +semeiotic +semeiotical +semeiotics +semel +semelfactive +semelincident +semelparity +semelparous +sememe +sememes +sememic +semen +semence +semencinae +semencontra +semens +sement +sementera +semeostoma +semes +semese +semester +semesters +semestral +semestrial +semi +semiabsorbent +semiabstract +semiabstracted +semiabstraction +semiacademic +semiacademical +semiacademically +semiaccomplishment +semiacetic +semiacid +semiacidic +semiacidified +semiacidulated +semiacquaintance +semiacrobatic +semiactive +semiactively +semiactiveness +semiadherent +semiadhesive +semiadhesively +semiadhesiveness +semiadjectively +semiadnate +semiaerial +semiaffectionate +semiagricultural +semiahmoo +semialbinism +semialcoholic +semialien +semiallegiance +semiallegoric +semiallegorical +semiallegorically +semialpine +semialuminous +semiamplexicaul +semiamplitude +semian +semianaesthetic +semianalytic +semianalytical +semianalytically +semianarchism +semianarchist +semianarchistic +semianatomic +semianatomical +semianatomically +semianatropal +semianatropous +semiandrogenous +semianesthetic +semiangle +semiangular +semianimal +semianimate +semianimated +semianna +semiannealed +semiannual +semiannually +semiannular +semianthracite +semianthropologic +semianthropological +semianthropologically +semiantiministerial +semiantique +semiape +semiaperiodic +semiaperture +semiappressed +semiaquatic +semiarboreal +semiarborescent +semiarc +semiarch +semiarchitectural +semiarchitecturally +semiarid +semiaridity +semiarticulate +semiarticulately +semiasphaltic +semiatheist +semiattached +semiautomated +semiautomatic +semiautomatically +semiautomatics +semiautonomous +semiaxis +semibacchanalian +semibachelor +semibay +semibald +semibaldly +semibaldness +semibalked +semiball +semiballoon +semiband +semibarbarian +semibarbarianism +semibarbaric +semibarbarism +semibarbarous +semibaronial +semibarren +semibase +semibasement +semibastion +semibeam +semibejan +semibelted +semibifid +semibiographic +semibiographical +semibiographically +semibiologic +semibiological +semibiologically +semibituminous +semiblasphemous +semiblasphemously +semiblasphemousness +semibleached +semiblind +semiblunt +semibody +semiboiled +semibold +semibolshevist +semibolshevized +semibouffant +semibourgeois +semibreve +semibull +semibureaucratic +semibureaucratically +semiburrowing +semic +semicabalistic +semicabalistical +semicabalistically +semicadence +semicalcareous +semicalcined +semicallipygian +semicanal +semicanalis +semicannibalic +semicantilever +semicapitalistic +semicapitalistically +semicarbazide +semicarbazone +semicarbonate +semicarbonize +semicardinal +semicaricatural +semicartilaginous +semicarved +semicastrate +semicastration +semicatalyst +semicatalytic +semicathartic +semicatholicism +semicaudate +semicelestial +semicell +semicellulose +semicellulous +semicentenary +semicentenarian +semicentenaries +semicentennial +semicentury +semicha +semichannel +semichaotic +semichaotically +semichemical +semichemically +semicheviot +semichevron +semichiffon +semichivalrous +semichoric +semichorus +semichrome +semicyclic +semicycloid +semicylinder +semicylindric +semicylindrical +semicynical +semicynically +semicircle +semicircled +semicircles +semicircular +semicircularity +semicircularly +semicircularness +semicircumference +semicircumferentor +semicircumvolution +semicirque +semicitizen +semicivilization +semicivilized +semiclassic +semiclassical +semiclassically +semiclause +semicleric +semiclerical +semiclerically +semiclimber +semiclimbing +semiclinical +semiclinically +semiclose +semiclosed +semiclosure +semicoagulated +semicoke +semicollapsible +semicollar +semicollegiate +semicolloid +semicolloidal +semicolloquial +semicolloquially +semicolon +semicolony +semicolonial +semicolonialism +semicolonially +semicolons +semicolumn +semicolumnar +semicoma +semicomas +semicomatose +semicombined +semicombust +semicomic +semicomical +semicomically +semicommercial +semicommercially +semicommunicative +semicompact +semicompacted +semicomplete +semicomplicated +semiconceal +semiconcealed +semiconcrete +semiconditioned +semiconducting +semiconduction +semiconductor +semiconductors +semicone +semiconfident +semiconfinement +semiconfluent +semiconformist +semiconformity +semiconic +semiconical +semiconically +semiconnate +semiconnection +semiconoidal +semiconscious +semiconsciously +semiconsciousness +semiconservative +semiconservatively +semiconsonant +semiconsonantal +semiconspicuous +semicontinent +semicontinuous +semicontinuously +semicontinuum +semicontraction +semicontradiction +semiconventional +semiconventionality +semiconventionally +semiconvergence +semiconvergent +semiconversion +semiconvert +semicope +semicordate +semicordated +semicoriaceous +semicorneous +semicoronate +semicoronated +semicoronet +semicostal +semicostiferous +semicotyle +semicotton +semicounterarch +semicountry +semicrepe +semicrescentic +semicretin +semicretinism +semicriminal +semicrystallinc +semicrystalline +semicroma +semicrome +semicrustaceous +semicubical +semicubit +semicultivated +semicultured +semicup +semicupe +semicupium +semicupola +semicured +semicurl +semicursive +semicurvilinear +semidaily +semidangerous +semidangerously +semidangerousness +semidark +semidarkness +semidead +semideaf +semideafness +semidecadent +semidecadently +semidecay +semidecayed +semidecussation +semidefensive +semidefensively +semidefensiveness +semidefined +semidefinite +semidefinitely +semidefiniteness +semideify +semideific +semideification +semideistical +semideity +semidelight +semidelirious +semidelirium +semideltaic +semidemented +semidenatured +semidependence +semidependent +semidependently +semideponent +semidesert +semideserts +semidestruction +semidestructive +semidetached +semidetachment +semideterministic +semideveloped +semidiagrammatic +semidiameter +semidiapason +semidiapente +semidiaphaneity +semidiaphanous +semidiaphanously +semidiaphanousness +semidiatessaron +semidictatorial +semidictatorially +semidictatorialness +semidifference +semidigested +semidigitigrade +semidigression +semidilapidation +semidine +semidiness +semidirect +semidirectness +semidisabled +semidisk +semiditone +semidiurnal +semidivided +semidivine +semidivision +semidivisive +semidivisively +semidivisiveness +semidocumentary +semidodecagon +semidole +semidome +semidomed +semidomes +semidomestic +semidomestically +semidomesticated +semidomestication +semidomical +semidominant +semidormant +semidouble +semidrachm +semidramatic +semidramatical +semidramatically +semidress +semidressy +semidry +semidried +semidrying +semiductile +semidull +semiduplex +semidurables +semiduration +semiearly +semieducated +semieffigy +semiegg +semiegret +semielastic +semielastically +semielevated +semielision +semiellipse +semiellipsis +semiellipsoidal +semielliptic +semielliptical +semiemotional +semiemotionally +semiempirical +semiempirically +semienclosed +semienclosure +semiengaged +semiepic +semiepical +semiepically +semiequitant +semierect +semierectly +semierectness +semieremitical +semiessay +semievergreen +semiexclusive +semiexclusively +semiexclusiveness +semiexecutive +semiexhibitionist +semiexpanded +semiexpansible +semiexperimental +semiexperimentally +semiexplanation +semiexposed +semiexpositive +semiexpository +semiexposure +semiexpressionistic +semiexternal +semiexternalized +semiexternally +semiextinct +semiextinction +semifable +semifabulous +semifailure +semifamine +semifascia +semifasciated +semifashion +semifast +semifatalistic +semiferal +semiferous +semifeudal +semifeudalism +semify +semifib +semifiction +semifictional +semifictionalized +semifictionally +semifigurative +semifiguratively +semifigurativeness +semifigure +semifinal +semifinalist +semifinals +semifine +semifinish +semifinished +semifiscal +semifistular +semifit +semifitted +semifitting +semifixed +semiflashproof +semiflex +semiflexed +semiflexible +semiflexion +semiflexure +semiflint +semifloating +semifloret +semifloscular +semifloscule +semiflosculose +semiflosculous +semifluctuant +semifluctuating +semifluid +semifluidic +semifluidity +semifoaming +semiforbidding +semiforeign +semiform +semiformal +semiformed +semifossil +semifossilized +semifrantic +semifrater +semifriable +semifrontier +semifuddle +semifunctional +semifunctionalism +semifunctionally +semifurnished +semifused +semifusion +semifuturistic +semigala +semigelatinous +semigentleman +semigenuflection +semigeometric +semigeometrical +semigeometrically +semigirder +semiglaze +semiglazed +semiglobe +semiglobose +semiglobular +semiglobularly +semiglorious +semigloss +semiglutin +semigod +semigovernmental +semigovernmentally +semigrainy +semigranitic +semigranulate +semigraphic +semigraphics +semigravel +semigroove +semigroup +semih +semihand +semihaness +semihard +semiharden +semihardened +semihardy +semihardness +semihastate +semihepatization +semiherbaceous +semiheretic +semiheretical +semiheterocercal +semihexagon +semihexagonal +semihyaline +semihiant +semihiatus +semihibernation +semihydrate +semihydrobenzoinic +semihigh +semihyperbola +semihyperbolic +semihyperbolical +semihysterical +semihysterically +semihistoric +semihistorical +semihistorically +semihobo +semihoboes +semihobos +semiholiday +semihonor +semihoral +semihorny +semihostile +semihostilely +semihostility +semihot +semihuman +semihumanism +semihumanistic +semihumanitarian +semihumanized +semihumbug +semihumorous +semihumorously +semiyearly +semiyearlies +semiintoxicated +semijealousy +semijocular +semijocularly +semijubilee +semijudicial +semijudicially +semijuridic +semijuridical +semijuridically +semikah +semilanceolate +semilate +semilatent +semilatus +semileafless +semilegal +semilegendary +semilegislative +semilegislatively +semilens +semilenticular +semilethal +semiliberal +semiliberalism +semiliberally +semilichen +semiligneous +semilimber +semilined +semiliquid +semiliquidity +semilyric +semilyrical +semilyrically +semiliterate +semilocular +semilog +semilogarithmic +semilogical +semiloyalty +semilong +semilooper +semiloose +semilor +semilucent +semiluminous +semiluminously +semiluminousness +semilunar +semilunare +semilunary +semilunate +semilunated +semilunation +semilune +semilustrous +semiluxation +semiluxury +semimachine +semimade +semimadman +semimagical +semimagically +semimagnetic +semimagnetical +semimagnetically +semimajor +semimalicious +semimaliciously +semimaliciousness +semimalignant +semimalignantly +semimanagerial +semimanagerially +semimanneristic +semimanufacture +semimanufactured +semimanufactures +semimarine +semimarking +semimat +semimaterialistic +semimathematical +semimathematically +semimatt +semimatte +semimature +semimaturely +semimatureness +semimaturity +semimechanical +semimechanistic +semimedicinal +semimember +semimembranosus +semimembranous +semimenstrual +semimercerized +semimessianic +semimetal +semimetallic +semimetamorphosis +semimetaphoric +semimetaphorical +semimetaphorically +semimicro +semimicroanalysis +semimicrochemical +semimild +semimildness +semimilitary +semimill +semimineral +semimineralized +semiminess +semiminim +semiministerial +semiminor +semimystic +semimystical +semimystically +semimysticalness +semimythic +semimythical +semimythically +semimobile +semimoderate +semimoderately +semimoist +semimolecule +semimonarchic +semimonarchical +semimonarchically +semimonastic +semimonitor +semimonopoly +semimonopolistic +semimonster +semimonthly +semimonthlies +semimoralistic +semimoron +semimountainous +semimountainously +semimucous +semimute +semina +seminaked +seminal +seminality +seminally +seminaphthalidine +seminaphthylamine +seminar +seminarcosis +seminarcotic +seminary +seminarial +seminarian +seminarianism +seminarians +seminaries +seminarist +seminaristic +seminarize +seminarrative +seminars +seminasal +seminasality +seminasally +seminase +seminatant +seminate +seminated +seminating +semination +seminationalism +seminationalistic +seminationalization +seminationalized +seminative +seminebulous +seminecessary +seminegro +seminervous +seminervously +seminervousness +seminess +semineurotic +semineurotically +semineutral +semineutrality +seminiferal +seminiferous +seminific +seminifical +seminification +seminist +seminium +seminivorous +seminocturnal +seminole +seminoles +seminoma +seminomad +seminomadic +seminomadically +seminomadism +seminomas +seminomata +seminonconformist +seminonflammable +seminonsensical +seminormal +seminormality +seminormally +seminormalness +seminose +seminovel +seminovelty +seminude +seminudity +seminule +seminuliferous +seminuria +seminvariant +seminvariantive +semiobjective +semiobjectively +semiobjectiveness +semioblivion +semioblivious +semiobliviously +semiobliviousness +semiobscurity +semioccasional +semioccasionally +semiocclusive +semioctagonal +semiofficial +semiofficially +semiography +semiology +semiological +semiologist +semionotidae +semionotus +semiopacity +semiopacous +semiopal +semiopalescent +semiopaque +semiopen +semiopened +semiopenly +semiopenness +semioptimistic +semioptimistically +semioratorical +semioratorically +semiorb +semiorbicular +semiorbicularis +semiorbiculate +semiordinate +semiorganic +semiorganically +semiorganized +semioriental +semiorientally +semiorthodox +semiorthodoxly +semioscillation +semioses +semiosis +semiosseous +semiostracism +semiotic +semiotical +semiotician +semiotics +semioval +semiovally +semiovalness +semiovaloid +semiovate +semioviparous +semiovoid +semiovoidal +semioxidated +semioxidized +semioxygenated +semioxygenized +semipacifist +semipacifistic +semipagan +semipaganish +semipalmate +semipalmated +semipalmation +semipanic +semipapal +semipapist +semiparabola +semiparalysis +semiparalytic +semiparalyzed +semiparallel +semiparameter +semiparasite +semiparasitic +semiparasitism +semiparochial +semipassive +semipassively +semipassiveness +semipaste +semipasty +semipastoral +semipastorally +semipathologic +semipathological +semipathologically +semipatriot +semipatriotic +semipatriotically +semipatterned +semipause +semipeace +semipeaceful +semipeacefully +semipectinate +semipectinated +semipectoral +semiped +semipedal +semipedantic +semipedantical +semipedantically +semipellucid +semipellucidity +semipendent +semipendulous +semipendulously +semipendulousness +semipenniform +semiperceptive +semiperfect +semiperimeter +semiperimetry +semiperiphery +semipermanent +semipermanently +semipermeability +semipermeable +semiperoid +semiperspicuous +semipertinent +semiperviness +semipervious +semiperviousness +semipetaloid +semipetrified +semiphase +semiphenomenal +semiphenomenally +semiphilologist +semiphilosophic +semiphilosophical +semiphilosophically +semiphlogisticated +semiphonotypy +semiphosphorescence +semiphosphorescent +semiphrenetic +semipictorial +semipictorially +semipinacolic +semipinacolin +semipinnate +semipious +semipiously +semipiousness +semipyramidal +semipyramidical +semipyritic +semipiscine +semiplantigrade +semiplastic +semiplumaceous +semiplume +semipneumatic +semipneumatical +semipneumatically +semipoisonous +semipoisonously +semipolar +semipolitical +semipolitician +semipoor +semipopish +semipopular +semipopularity +semipopularized +semipopularly +semiporcelain +semiporous +semiporphyritic +semiportable +semipostal +semipractical +semiprecious +semipreservation +semipreserved +semiprimigenous +semiprimitive +semiprivacy +semiprivate +semipro +semiproductive +semiproductively +semiproductiveness +semiproductivity +semiprofane +semiprofanely +semiprofaneness +semiprofanity +semiprofessional +semiprofessionalized +semiprofessionally +semiprofessionals +semiprogressive +semiprogressively +semiprogressiveness +semipronation +semiprone +semipronely +semiproneness +semipronominal +semiproof +semipropagandist +semipros +semiproselyte +semiprosthetic +semiprostrate +semiprotected +semiprotective +semiprotectively +semiprotectorate +semiproven +semiprovincial +semiprovincially +semipsychologic +semipsychological +semipsychologically +semipsychotic +semipublic +semipunitive +semipunitory +semipupa +semipurposive +semipurposively +semipurposiveness +semipurulent +semiputrid +semiquadrangle +semiquadrantly +semiquadrate +semiquantitative +semiquantitatively +semiquartile +semiquaver +semiquietism +semiquietist +semiquinquefid +semiquintile +semiquote +semiradial +semiradiate +semiradical +semiradically +semiradicalness +semiramis +semiramize +semirapacious +semirare +semirarely +semirareness +semirationalized +semirattlesnake +semiraw +semirawly +semirawness +semireactionary +semirealistic +semirealistically +semirebel +semirebellion +semirebellious +semirebelliously +semirebelliousness +semirecondite +semirecumbent +semirefined +semireflex +semireflexive +semireflexively +semireflexiveness +semiregular +semirelief +semireligious +semireniform +semirepublic +semirepublican +semiresiny +semiresinous +semiresolute +semiresolutely +semiresoluteness +semirespectability +semirespectable +semireticulate +semiretired +semiretirement +semiretractile +semireverberatory +semirevolute +semirevolution +semirevolutionary +semirevolutionist +semirhythm +semirhythmic +semirhythmical +semirhythmically +semiriddle +semirigid +semirigorous +semirigorously +semirigorousness +semiring +semiroyal +semiroll +semiromantic +semiromantically +semirotary +semirotating +semirotative +semirotatory +semirotund +semirotunda +semiround +semiruin +semirural +semiruralism +semirurally +semirustic +semis +semisacerdotal +semisacred +semisagittate +semisaint +semisaline +semisaltire +semisaprophyte +semisaprophytic +semisarcodic +semisatiric +semisatirical +semisatirically +semisaturation +semisavage +semisavagedom +semisavagery +semiscenic +semischolastic +semischolastically +semiscientific +semiseafaring +semisecondary +semisecrecy +semisecret +semisecretly +semisection +semisedentary +semisegment +semisensuous +semisentient +semisentimental +semisentimentalized +semisentimentally +semiseparatist +semiseptate +semiserf +semiserious +semiseriously +semiseriousness +semiservile +semises +semisevere +semiseverely +semiseverity +semisextile +semishade +semishady +semishaft +semisheer +semishirker +semishrub +semishrubby +semisightseeing +semisilica +semisimious +semisymmetric +semisimple +semisingle +semisynthetic +semisirque +semisixth +semiskilled +semislave +semismelting +semismile +semisocial +semisocialism +semisocialist +semisocialistic +semisocialistically +semisociative +semisocinian +semisoft +semisolemn +semisolemnity +semisolemnly +semisolemnness +semisolid +semisolute +semisomnambulistic +semisomnolence +semisomnolent +semisomnolently +semisomnous +semisopor +semisoun +semisovereignty +semispan +semispeculation +semispeculative +semispeculatively +semispeculativeness +semisphere +semispheric +semispherical +semispheroidal +semispinalis +semispiral +semispiritous +semispontaneity +semispontaneous +semispontaneously +semispontaneousness +semisport +semisporting +semisquare +semistagnation +semistaminate +semistarvation +semistarved +semistate +semisteel +semistiff +semistiffly +semistiffness +semistill +semistimulating +semistock +semistory +semistratified +semistriate +semistriated +semistuporous +semisubterranean +semisuburban +semisuccess +semisuccessful +semisuccessfully +semisucculent +semisupernatural +semisupernaturally +semisupernaturalness +semisupinated +semisupination +semisupine +semisuspension +semisweet +semita +semitact +semitae +semitailored +semital +semitandem +semitangent +semitaur +semite +semitechnical +semiteetotal +semitelic +semitendinosus +semitendinous +semiterete +semiterrestrial +semitertian +semites +semitesseral +semitessular +semitextural +semitexturally +semitheatric +semitheatrical +semitheatricalism +semitheatrically +semitheological +semitheologically +semithoroughfare +semitic +semiticism +semiticize +semitics +semitime +semitism +semitist +semitists +semitization +semitize +semitonal +semitonally +semitone +semitones +semitonic +semitonically +semitontine +semitorpid +semitour +semitraditional +semitraditionally +semitraditonal +semitrailer +semitrailers +semitrained +semitransept +semitranslucent +semitransparency +semitransparent +semitransparently +semitransparentness +semitransverse +semitreasonable +semitrimmed +semitropic +semitropical +semitropically +semitropics +semitruth +semitruthful +semitruthfully +semitruthfulness +semituberous +semitubular +semiuncial +semiundressed +semiuniversalist +semiupright +semiurban +semiurn +semivalvate +semivault +semivector +semivegetable +semivertebral +semiverticillate +semivibration +semivirtue +semiviscid +semivisibility +semivisible +semivital +semivitreous +semivitrification +semivitrified +semivocal +semivocalic +semivolatile +semivolcanic +semivolcanically +semivoluntary +semivowel +semivowels +semivulcanized +semiwaking +semiwarfare +semiweekly +semiweeklies +semiwild +semiwildly +semiwildness +semiwoody +semiworks +semmel +semmet +semmit +semnae +semnones +semnopithecinae +semnopithecine +semnopithecus +semois +semola +semolella +semolina +semolinas +semology +semological +semostomae +semostomeous +semostomous +semoted +semoule +semper +semperannual +sempergreen +semperidem +semperidentical +semperjuvenescent +sempervirent +sempervirid +sempervivum +sempitern +sempiternal +sempiternally +sempiternity +sempiternize +sempiternous +semple +semples +semplice +semplices +sempre +sempres +sempster +sempstress +sempstry +sempstrywork +semsem +semsen +semuncia +semuncial +sen +sena +senaah +senachie +senage +senaite +senal +senam +senary +senarian +senarii +senarius +senarmontite +senate +senates +senator +senatory +senatorial +senatorially +senatorian +senators +senatorship +senatress +senatrices +senatrix +senatus +sence +senci +sencio +sencion +send +sendable +sendal +sendals +sendee +sender +senders +sending +sendle +sendoff +sendoffs +sends +seneca +senecan +senecas +senecio +senecioid +senecionine +senecios +senectitude +senectude +senectuous +senega +senegal +senegalese +senegambian +senegas +senegin +senesce +senescence +senescency +senescent +seneschal +seneschally +seneschalship +seneschalsy +seneschalty +senex +sengi +sengreen +senhor +senhora +senhoras +senhores +senhorita +senhoritas +senhors +senicide +senijextee +senile +senilely +seniles +senilis +senilism +senility +senilities +senilize +senior +seniory +seniority +seniorities +seniors +seniorship +senit +seniti +senium +senlac +senna +sennachie +sennas +sennegrass +sennet +sennets +sennett +sennight +sennights +sennit +sennite +sennits +senocular +senones +senonian +senopia +senopias +senor +senora +senoras +senores +senorita +senoritas +senors +senoufo +sensa +sensable +sensal +sensate +sensated +sensately +sensates +sensating +sensation +sensational +sensationalise +sensationalised +sensationalising +sensationalism +sensationalist +sensationalistic +sensationalists +sensationalize +sensationalized +sensationalizing +sensationally +sensationary +sensationish +sensationism +sensationist +sensationistic +sensationless +sensations +sensatory +sensatorial +sense +sensed +senseful +senseless +senselessly +senselessness +senses +sensibilia +sensibilisin +sensibility +sensibilities +sensibilitiy +sensibilitist +sensibilitous +sensibilium +sensibilization +sensibilize +sensible +sensibleness +sensibler +sensibles +sensiblest +sensibly +sensical +sensifacient +sensiferous +sensify +sensific +sensificatory +sensifics +sensigenous +sensile +sensilia +sensilla +sensillae +sensillum +sensillumla +sensimotor +sensyne +sensing +sension +sensism +sensist +sensistic +sensitisation +sensitiser +sensitive +sensitively +sensitiveness +sensitives +sensitivist +sensitivity +sensitivities +sensitization +sensitize +sensitized +sensitizer +sensitizes +sensitizing +sensitometer +sensitometers +sensitometry +sensitometric +sensitometrically +sensitory +sensive +sensize +senso +sensomobile +sensomobility +sensomotor +sensoparalysis +sensor +sensory +sensoria +sensorial +sensorially +sensories +sensoriglandular +sensorimotor +sensorimuscular +sensorineural +sensorium +sensoriums +sensorivascular +sensorivasomotor +sensorivolitional +sensors +sensu +sensual +sensualisation +sensualise +sensualism +sensualist +sensualistic +sensualists +sensuality +sensualities +sensualization +sensualize +sensualized +sensualizing +sensually +sensualness +sensuism +sensuist +sensum +sensuosity +sensuous +sensuously +sensuousness +sensus +sent +sentence +sentenced +sentencer +sentences +sentencing +sententia +sentential +sententially +sententiary +sententiarian +sententiarist +sententiosity +sententious +sententiously +sententiousness +senti +sentience +sentiency +sentiendum +sentient +sentiently +sentients +sentiment +sentimental +sentimentalisation +sentimentaliser +sentimentalism +sentimentalist +sentimentalists +sentimentality +sentimentalities +sentimentalization +sentimentalize +sentimentalized +sentimentalizer +sentimentalizes +sentimentalizing +sentimentally +sentimenter +sentimentless +sentimento +sentiments +sentine +sentinel +sentineled +sentineling +sentinelled +sentinellike +sentinelling +sentinels +sentinelship +sentinelwise +sentisection +sentition +sentry +sentried +sentries +sentrying +sents +senufo +senusi +senusian +senusism +senvy +senza +seor +seora +seorita +seoul +sep +sepad +sepal +sepaled +sepaline +sepalled +sepalody +sepaloid +sepalous +sepals +separability +separable +separableness +separably +separata +separate +separated +separatedly +separately +separateness +separates +separatical +separating +separation +separationism +separationist +separations +separatism +separatist +separatistic +separatists +separative +separatively +separativeness +separator +separatory +separators +separatress +separatrices +separatrici +separatrix +separatum +separte +sepawn +sepd +sepg +sepharad +sephardi +sephardic +sephardim +sepharvites +sephen +sephira +sephirah +sephiric +sephiroth +sephirothic +sepia +sepiacean +sepiaceous +sepiae +sepialike +sepian +sepiary +sepiarian +sepias +sepic +sepicolous +sepiidae +sepiment +sepioid +sepioidea +sepiola +sepiolidae +sepiolite +sepion +sepiost +sepiostaire +sepium +sepn +sepoy +sepoys +sepone +sepose +seppa +seppuku +seppukus +seps +sepses +sepsid +sepsidae +sepsin +sepsine +sepsis +sept +septa +septaemia +septal +septan +septane +septangle +septangled +septangular +septangularness +septaria +septarian +septariate +septarium +septate +septated +septation +septatoarticulate +septaugintal +septavalent +septave +septcentenary +septectomy +septectomies +september +septemberer +septemberism +septemberist +septembral +septembrian +septembrist +septembrize +septembrizer +septemdecenary +septemdecillion +septemfid +septemfluous +septemfoliate +septemfoliolate +septemia +septempartite +septemplicate +septemvious +septemvir +septemviral +septemvirate +septemviri +septemvirs +septenar +septenary +septenarian +septenaries +septenarii +septenarius +septenate +septendecennial +septendecillion +septendecillions +septendecillionth +septendecimal +septennary +septennate +septenniad +septennial +septennialist +septenniality +septennially +septennium +septenous +septentrial +septentrio +septentrion +septentrional +septentrionality +septentrionally +septentrionate +septentrionic +septerium +septet +septets +septette +septettes +septfoil +septi +septibranchia +septibranchiata +septic +septicaemia +septicaemic +septical +septically +septicemia +septicemic +septicidal +septicidally +septicide +septicity +septicization +septicolored +septicopyemia +septicopyemic +septics +septier +septifarious +septiferous +septifluous +septifolious +septiform +septifragal +septifragally +septilateral +septile +septillion +septillions +septillionth +septimal +septimana +septimanae +septimanal +septimanarian +septime +septimes +septimetritis +septimole +septinsular +septipartite +septisyllabic +septisyllable +septivalent +septleva +septobasidium +septocylindrical +septocylindrium +septocosta +septodiarrhea +septogerm +septogloeum +septoic +septole +septolet +septomarginal +septomaxillary +septonasal +septoria +septotomy +septs +septship +septuagenary +septuagenarian +septuagenarianism +septuagenarians +septuagenaries +septuagesima +septuagesimal +septuagint +septuagintal +septula +septulate +septulum +septum +septums +septuncial +septuor +septuple +septupled +septuples +septuplet +septuplets +septuplicate +septuplication +septupling +sepuchral +sepulcher +sepulchered +sepulchering +sepulchers +sepulchral +sepulchralize +sepulchrally +sepulchre +sepulchred +sepulchring +sepulchrous +sepult +sepultural +sepulture +seq +seqed +seqence +seqfchk +seqq +seqrch +sequa +sequaces +sequacious +sequaciously +sequaciousness +sequacity +sequan +sequani +sequanian +sequel +sequela +sequelae +sequelant +sequels +sequence +sequenced +sequencer +sequencers +sequences +sequency +sequencies +sequencing +sequencings +sequent +sequential +sequentiality +sequentialize +sequentialized +sequentializes +sequentializing +sequentially +sequentialness +sequently +sequents +sequest +sequester +sequestered +sequestering +sequesterment +sequesters +sequestra +sequestrable +sequestral +sequestrant +sequestrate +sequestrated +sequestrates +sequestrating +sequestration +sequestrations +sequestrator +sequestratrices +sequestratrix +sequestrectomy +sequestrotomy +sequestrum +sequestrums +sequin +sequined +sequinned +sequins +sequitur +sequiturs +sequoia +sequoias +seqwl +ser +sera +serab +serabend +serac +seracs +seragli +seraglio +seraglios +serahuli +serai +seraya +serail +serails +seraing +serais +seral +seralbumen +seralbumin +seralbuminous +serang +serape +serapea +serapes +serapeum +seraph +seraphic +seraphical +seraphically +seraphicalness +seraphicism +seraphicness +seraphim +seraphims +seraphin +seraphina +seraphine +seraphism +seraphlike +seraphs +seraphtide +serapias +serapic +serapis +serapist +serasker +seraskerate +seraskier +seraskierat +serau +seraw +serb +serbdom +serbia +serbian +serbians +serbize +serbonian +serbophile +serbophobe +sercial +sercom +serdab +serdabs +serdar +sere +serean +sered +sereh +serein +sereins +serement +serena +serenade +serenaded +serenader +serenaders +serenades +serenading +serenata +serenatas +serenate +serendib +serendibite +serendipity +serendipitous +serendipitously +serendite +serene +serened +serenely +sereneness +serener +serenes +serenest +serenify +serenissime +serenissimi +serenissimo +serenity +serenities +serenize +sereno +serenoa +serer +seres +serest +sereward +serf +serfage +serfages +serfdom +serfdoms +serfhood +serfhoods +serfish +serfishly +serfishness +serfism +serflike +serfs +serfship +serg +serge +sergeancy +sergeancies +sergeant +sergeantcy +sergeantcies +sergeantess +sergeantfish +sergeantfishes +sergeanty +sergeantry +sergeants +sergeantship +sergeantships +sergedesoy +sergedusoy +sergei +sergelim +serger +serges +sergette +serging +sergings +sergio +sergipe +sergiu +sergius +serglobulin +sergt +seri +serial +serialisation +serialise +serialised +serialising +serialism +serialist +serialists +seriality +serializability +serializable +serialization +serializations +serialize +serialized +serializes +serializing +serially +serials +serian +seriary +seriate +seriated +seriately +seriates +seriatim +seriating +seriation +seriaunt +seric +sericana +sericate +sericated +sericea +sericeotomentose +sericeous +sericicultural +sericiculture +sericiculturist +sericin +sericins +sericipary +sericite +sericitic +sericitization +sericocarpus +sericon +serictery +sericteria +sericteries +sericterium +serictteria +sericultural +sericulture +sericulturist +seriema +seriemas +series +serieswound +serif +serific +seriform +serifs +serigraph +serigrapher +serigraphers +serigraphy +serigraphic +serigraphs +serimeter +serimpi +serin +serine +serines +serinette +sering +seringa +seringal +seringas +seringhi +serins +serinus +serio +seriocomedy +seriocomic +seriocomical +seriocomically +seriogrotesque +seriola +seriolidae +serioline +serioludicrous +seriopantomimic +serioridiculous +seriosity +seriosities +serioso +serious +seriously +seriousness +seriplane +seripositor +serjania +serjeancy +serjeant +serjeanty +serjeantry +serjeants +serment +sermo +sermocination +sermocinatrix +sermon +sermonary +sermoneer +sermoner +sermonesque +sermonet +sermonette +sermonettino +sermonic +sermonical +sermonically +sermonics +sermoning +sermonise +sermonised +sermoniser +sermonish +sermonising +sermonism +sermonist +sermonize +sermonized +sermonizer +sermonizes +sermonizing +sermonless +sermonoid +sermonolatry +sermonology +sermonproof +sermons +sermonwise +sermuncle +sernamby +sero +seroalbumin +seroalbuminuria +seroanaphylaxis +serobiological +serocyst +serocystic +serocolitis +serodermatosis +serodermitis +serodiagnosis +serodiagnostic +seroenteritis +seroenzyme +serofibrinous +serofibrous +serofluid +serogelatinous +serohemorrhagic +serohepatitis +seroimmunity +serolactescent +serolemma +serolin +serolipase +serology +serologic +serological +serologically +serologies +serologist +seromaniac +seromembranous +seromucous +seromuscular +seron +seronegative +seronegativity +seroon +seroot +seroperitoneum +serophysiology +serophthisis +seroplastic +seropneumothorax +seropositive +seroprevention +seroprognosis +seroprophylaxis +seroprotease +seropuriform +seropurulent +seropus +seroreaction +seroresistant +serosa +serosae +serosal +serosanguineous +serosanguinolent +serosas +seroscopy +serose +serosynovial +serosynovitis +serosity +serosities +serositis +serotherapeutic +serotherapeutics +serotherapy +serotherapist +serotina +serotinal +serotine +serotines +serotinous +serotype +serotypes +serotonergic +serotonin +serotoxin +serous +serousness +serovaccine +serow +serows +serozem +serozyme +serpari +serpedinous +serpens +serpent +serpentary +serpentaria +serpentarian +serpentarii +serpentarium +serpentarius +serpentcleide +serpenteau +serpentes +serpentess +serpentian +serpenticidal +serpenticide +serpentid +serpentiferous +serpentiform +serpentile +serpentin +serpentina +serpentine +serpentinely +serpentinian +serpentinic +serpentiningly +serpentinization +serpentinize +serpentinized +serpentinizing +serpentinoid +serpentinous +serpentis +serpentivorous +serpentize +serpently +serpentlike +serpentoid +serpentry +serpents +serpentwood +serpette +serphid +serphidae +serphoid +serphoidea +serpierite +serpigines +serpiginous +serpiginously +serpigo +serpigoes +serpivolant +serpolet +serpula +serpulae +serpulan +serpulid +serpulidae +serpulidan +serpuline +serpulite +serpulitic +serpuloid +serra +serradella +serrae +serrage +serrai +serran +serrana +serranid +serranidae +serranids +serrano +serranoid +serranos +serranus +serrasalmo +serrate +serrated +serrates +serratia +serratic +serratiform +serratile +serrating +serration +serratirostral +serratocrenate +serratodentate +serratodenticulate +serratoglandulous +serratospinose +serrature +serratus +serrefile +serrefine +serry +serricorn +serricornia +serridentines +serridentinus +serried +serriedly +serriedness +serries +serrifera +serriferous +serriform +serrying +serring +serriped +serrirostrate +serrula +serrulate +serrulated +serrulateed +serrulation +serrurerie +sers +sert +serta +serting +sertion +sertive +sertularia +sertularian +sertulariidae +sertularioid +sertularoid +sertule +sertulum +sertum +serule +serum +serumal +serumdiagnosis +serums +serut +serv +servable +servage +serval +servaline +servals +servant +servantcy +servantdom +servantess +servantless +servantlike +servantry +servants +servantship +servation +serve +served +servente +serventism +server +servery +servers +serves +servet +servetian +servetianism +servette +serviable +servian +service +serviceability +serviceable +serviceableness +serviceably +serviceberry +serviceberries +serviced +serviceless +servicelessness +serviceman +servicemen +servicer +servicers +services +servicewoman +servicewomen +servicing +servidor +servient +serviential +serviette +serviettes +servile +servilely +servileness +servilism +servility +servilities +servilize +serving +servingman +servings +servist +servite +serviteur +servitial +servitium +servitor +servitorial +servitors +servitorship +servitress +servitrix +servitude +serviture +servius +servo +servocontrol +servoed +servoing +servolab +servomechanical +servomechanically +servomechanics +servomechanism +servomechanisms +servomotor +servomotors +servos +servotab +servulate +servus +serwamby +sesame +sesames +sesamin +sesamine +sesamoid +sesamoidal +sesamoiditis +sesamoids +sesamol +sesamum +sesban +sesbania +sescuncia +sescuple +seseli +seshat +sesia +sesiidae +seskin +sesma +sesperal +sesqui +sesquialter +sesquialtera +sesquialteral +sesquialteran +sesquialterous +sesquibasic +sesquicarbonate +sesquicentenary +sesquicentennial +sesquicentennially +sesquicentennials +sesquichloride +sesquiduple +sesquiduplicate +sesquih +sesquihydrate +sesquihydrated +sesquinona +sesquinonal +sesquioctava +sesquioctaval +sesquioxide +sesquipedal +sesquipedalian +sesquipedalianism +sesquipedalism +sesquipedality +sesquiplane +sesquiplicate +sesquiquadrate +sesquiquarta +sesquiquartal +sesquiquartile +sesquiquinta +sesquiquintal +sesquiquintile +sesquisalt +sesquiseptimal +sesquisextal +sesquisilicate +sesquisquare +sesquisulphate +sesquisulphide +sesquisulphuret +sesquiterpene +sesquitertia +sesquitertial +sesquitertian +sesquitertianal +sess +sessa +sessed +sessile +sessility +sessiliventres +session +sessional +sessionally +sessionary +sessions +sesspool +sesspools +sesterce +sesterces +sestertia +sestertium +sestertius +sestet +sestets +sestetto +sesti +sestia +sestiad +sestian +sestina +sestinas +sestine +sestines +sestole +sestolet +seston +sestuor +sesuto +sesuvium +set +seta +setaceous +setaceously +setae +setal +setaria +setarid +setarious +setation +setback +setbacks +setbolt +setdown +setfast +seth +sethead +sethian +sethic +sethite +setibo +setier +setifera +setiferous +setiform +setiger +setigerous +setioerr +setiparous +setirostral +setline +setlines +setling +setness +setnet +setoff +setoffs +seton +setons +setophaga +setophaginae +setophagine +setose +setous +setout +setouts +setover +setpfx +sets +setscrew +setscrews +setsman +sett +settable +settaine +settecento +settee +settees +setter +settergrass +setters +setterwort +settima +settimo +setting +settings +settle +settleability +settleable +settled +settledly +settledness +settlement +settlements +settler +settlerdom +settlers +settles +settling +settlings +settlor +settlors +settos +settsman +setuid +setula +setulae +setule +setuliform +setulose +setulous +setup +setups +setwall +setwise +setwork +setworks +seudah +seugh +sevastopol +seve +seven +sevenbark +sevener +sevenfold +sevenfolded +sevenfoldness +sevennight +sevenpence +sevenpenny +sevens +sevenscore +seventeen +seventeenfold +seventeens +seventeenth +seventeenthly +seventeenths +seventh +seventhly +sevenths +seventy +seventies +seventieth +seventieths +seventyfold +sever +severability +severable +several +severalfold +severality +severalization +severalize +severalized +severalizing +severally +severalness +severals +severalth +severalty +severalties +severance +severate +severation +severe +severed +severedly +severely +severeness +severer +severers +severest +severy +severian +severies +severing +severingly +severish +severity +severities +severization +severize +severs +sevier +sevillanas +seville +sevillian +sevres +sevum +sew +sewable +sewage +sewages +sewan +sewans +sewar +sewars +sewed +sewellel +sewen +sewer +sewerage +sewerages +sewered +sewery +sewerless +sewerlike +sewerman +sewers +sewin +sewing +sewings +sewless +sewn +sewround +sews +sewster +sex +sexadecimal +sexagenary +sexagenarian +sexagenarianism +sexagenarians +sexagenaries +sexagene +sexagesima +sexagesimal +sexagesimally +sexagesimals +sexagonal +sexangle +sexangled +sexangular +sexangularly +sexannulate +sexarticulate +sexavalent +sexcentenary +sexcentenaries +sexcuspidate +sexdecillion +sexdecillions +sexdigital +sexdigitate +sexdigitated +sexdigitism +sexed +sexenary +sexennial +sexennially +sexennium +sexern +sexes +sexfarious +sexfid +sexfoil +sexhood +sexy +sexier +sexiest +sexifid +sexily +sexillion +sexiness +sexinesses +sexing +sexiped +sexipolar +sexisyllabic +sexisyllable +sexism +sexisms +sexist +sexists +sexitubercular +sexivalence +sexivalency +sexivalent +sexless +sexlessly +sexlessness +sexly +sexlike +sexlocular +sexology +sexologic +sexological +sexologies +sexologist +sexpartite +sexploitation +sexpot +sexpots +sexradiate +sext +sextactic +sextain +sextains +sextan +sextans +sextant +sextantal +sextants +sextar +sextary +sextarii +sextarius +sextennial +sextern +sextet +sextets +sextette +sextettes +sextic +sextile +sextiles +sextilis +sextillion +sextillions +sextillionth +sextipara +sextipartite +sextipartition +sextiply +sextipolar +sexto +sextodecimo +sextodecimos +sextole +sextolet +sexton +sextoness +sextons +sextonship +sextos +sextry +sexts +sextubercular +sextuberculate +sextula +sextulary +sextumvirate +sextuor +sextuple +sextupled +sextuples +sextuplet +sextuplets +sextuplex +sextuply +sextuplicate +sextuplicated +sextuplicating +sextupling +sextur +sextus +sexual +sexuale +sexualisation +sexualism +sexualist +sexuality +sexualities +sexualization +sexualize +sexualized +sexualizing +sexually +sexuous +sexupara +sexuparous +sezession +sf +sferics +sfm +sfogato +sfoot +sforzando +sforzandos +sforzato +sforzatos +sfree +sfumato +sfumatos +sfz +sg +sgabelli +sgabello +sgabellos +sgad +sgd +sgraffiato +sgraffiti +sgraffito +sh +sha +shaatnez +shab +shaban +shabandar +shabash +shabbat +shabbath +shabbed +shabby +shabbier +shabbiest +shabbify +shabbyish +shabbily +shabbiness +shabble +shabbos +shabeque +shabrack +shabracque +shabroon +shabunder +shabuoth +shachle +shachly +shack +shackanite +shackatory +shackbolt +shacked +shacker +shacky +shacking +shackings +shackland +shackle +shacklebone +shackled +shackledom +shackler +shacklers +shackles +shacklewise +shackly +shackling +shacko +shackoes +shackos +shacks +shad +shadbelly +shadberry +shadberries +shadbird +shadblow +shadblows +shadbush +shadbushes +shadchan +shadchanim +shadchans +shadchen +shaddock +shaddocks +shade +shaded +shadeful +shadeless +shadelessness +shader +shaders +shades +shadetail +shadfly +shadflies +shadflower +shady +shadier +shadiest +shadily +shadine +shadiness +shading +shadings +shadkan +shado +shadoof +shadoofs +shadow +shadowable +shadowbox +shadowboxed +shadowboxes +shadowboxing +shadowed +shadower +shadowers +shadowfoot +shadowgram +shadowgraph +shadowgraphy +shadowgraphic +shadowgraphist +shadowy +shadowier +shadowiest +shadowily +shadowiness +shadowing +shadowishly +shadowist +shadowland +shadowless +shadowlessness +shadowly +shadowlike +shadows +shadrach +shadrachs +shads +shaduf +shadufs +shaffle +shafii +shafiite +shaft +shafted +shafter +shaftfoot +shafty +shafting +shaftings +shaftless +shaftlike +shaftman +shaftment +shafts +shaftsman +shaftway +shag +shaganappi +shaganappy +shagbag +shagbark +shagbarks +shagbush +shagged +shaggedness +shaggy +shaggier +shaggiest +shaggily +shaggymane +shagginess +shagging +shagia +shaglet +shaglike +shagpate +shagrag +shagreen +shagreened +shagreens +shagroon +shags +shagtail +shah +shahaptian +shaharit +shaharith +shahdom +shahdoms +shahee +shaheen +shahi +shahid +shahidi +shahin +shahs +shahzada +shahzadah +shahzadi +shai +shay +shayed +shaigia +shaikh +shaykh +shaikhi +shaikiyeh +shaird +shairds +shairn +shairns +shays +shaysite +shaitan +shaitans +shaiva +shaivism +shaka +shakable +shakably +shake +shakeable +shakebly +shakedown +shakedowns +shakefork +shaken +shakenly +shakeout +shakeouts +shakeproof +shaker +shakerag +shakerdom +shakeress +shakerism +shakerlike +shakers +shakes +shakescene +shakespeare +shakespearean +shakespeareana +shakespeareanism +shakespeareanly +shakespeareans +shakespearian +shakespearize +shakespearolater +shakespearolatry +shakeup +shakeups +shakha +shaky +shakyamuni +shakier +shakiest +shakil +shakily +shakiness +shaking +shakingly +shakings +shako +shakoes +shakos +shaksheer +shaksperean +shaksperian +shakta +shakti +shaktis +shaktism +shaku +shakudo +shakuhachi +shalako +shalder +shale +shaled +shalee +shalelike +shaleman +shales +shaly +shalier +shaliest +shall +shallal +shally +shallon +shalloon +shalloons +shallop +shallopy +shallops +shallot +shallots +shallow +shallowbrain +shallowbrained +shallowed +shallower +shallowest +shallowhearted +shallowy +shallowing +shallowish +shallowist +shallowly +shallowness +shallowpate +shallowpated +shallows +shallu +shalom +shalt +shalwar +sham +shama +shamable +shamableness +shamably +shamal +shamalo +shaman +shamaness +shamanic +shamanism +shamanist +shamanistic +shamanize +shamans +shamash +shamateur +shamateurism +shamba +shambala +shamble +shambled +shambles +shambling +shamblingly +shambrier +shambu +shame +shameable +shamed +shameface +shamefaced +shamefacedly +shamefacedness +shamefast +shamefastly +shamefastness +shameful +shamefully +shamefulness +shameless +shamelessly +shamelessness +shameproof +shamer +shames +shamesick +shameworthy +shamiana +shamianah +shamim +shaming +shamir +shammar +shammas +shammash +shammashi +shammashim +shammasim +shammed +shammer +shammers +shammes +shammy +shammick +shammied +shammies +shammying +shamming +shammish +shammock +shammocky +shammocking +shammos +shammosim +shamoy +shamoyed +shamoying +shamois +shamoys +shamosim +shampoo +shampooed +shampooer +shampooers +shampooing +shampoos +shamrock +shamrocks +shamroot +shams +shamsheer +shamshir +shamus +shamuses +shan +shanachas +shanachie +shanachus +shandean +shandy +shandies +shandygaff +shandyism +shandite +shandry +shandrydan +shane +shang +shangalla +shangan +shanghai +shanghaied +shanghaier +shanghaiing +shanghais +shangy +shank +shankar +shanked +shanker +shanking +shankings +shankpiece +shanks +shanksman +shanna +shanny +shannies +shannon +shansa +shant +shantey +shanteys +shanti +shanty +shantied +shanties +shantih +shantihs +shantying +shantylike +shantyman +shantymen +shantis +shantytown +shantung +shantungs +shap +shapable +shape +shapeable +shaped +shapeful +shapeless +shapelessly +shapelessness +shapely +shapelier +shapeliest +shapeliness +shapen +shaper +shapers +shapes +shapeshifter +shapesmith +shapeup +shapeups +shapy +shapier +shapiest +shaping +shapingly +shapka +shapometer +shapoo +shaps +shaptan +shaptin +sharable +sharada +sharan +shard +shardana +sharded +shardy +sharding +shards +share +shareability +shareable +sharebone +sharebroker +sharecrop +sharecropped +sharecropper +sharecroppers +sharecropping +sharecrops +shared +shareef +sharefarmer +shareholder +shareholders +shareholdership +shareman +shareown +shareowner +sharepenny +sharer +sharers +shares +shareship +sharesman +sharesmen +sharewort +sharezer +shargar +sharger +shargoss +shari +sharia +shariat +sharif +sharifian +sharifs +sharing +sharira +shark +sharked +sharker +sharkers +sharkful +sharki +sharky +sharking +sharkish +sharkishly +sharkishness +sharklet +sharklike +sharks +sharkship +sharkskin +sharkskins +sharksucker +sharn +sharnbud +sharnbug +sharny +sharns +sharon +sharp +sharpbill +sharped +sharpen +sharpened +sharpener +sharpeners +sharpening +sharpens +sharper +sharpers +sharpest +sharpy +sharpie +sharpies +sharping +sharpish +sharpite +sharply +sharpling +sharpness +sharps +sharpsaw +sharpshin +sharpshod +sharpshoot +sharpshooter +sharpshooters +sharpshooting +sharpster +sharptail +sharpware +sharra +sharrag +sharry +shashlick +shashlik +shashliks +shaslick +shaslik +shasliks +shasta +shastaite +shastan +shaster +shastra +shastracara +shastraik +shastras +shastri +shastrik +shat +shatan +shathmont +shatter +shatterable +shatterbrain +shatterbrained +shattered +shatterer +shatterheaded +shattery +shattering +shatteringly +shatterment +shatterpated +shatterproof +shatters +shatterwit +shattuckite +shauchle +shaugh +shaughs +shaul +shaula +shauled +shauling +shauls +shaup +shauri +shauwe +shavable +shave +shaveable +shaved +shavee +shavegrass +shaveling +shaven +shaver +shavery +shavers +shaves +shavese +shavester +shavetail +shaveweed +shavian +shaviana +shavianism +shavians +shavie +shavies +shaving +shavings +shaw +shawabti +shawanese +shawano +shawed +shawfowl +shawy +shawing +shawl +shawled +shawling +shawlless +shawllike +shawls +shawlwise +shawm +shawms +shawn +shawnee +shawnees +shawneewood +shawny +shaws +shawwal +shazam +she +shea +sheading +sheaf +sheafage +sheafed +sheafy +sheafing +sheaflike +sheafripe +sheafs +sheal +shealing +shealings +sheals +shean +shear +shearbill +sheard +sheared +shearer +shearers +sheargrass +shearhog +shearing +shearlegs +shearless +shearling +shearman +shearmouse +shears +shearsman +sheartail +shearwater +shearwaters +sheas +sheat +sheatfish +sheatfishes +sheath +sheathbill +sheathe +sheathed +sheather +sheathery +sheathers +sheathes +sheathy +sheathier +sheathiest +sheathing +sheathless +sheathlike +sheaths +sheave +sheaved +sheaveless +sheaveman +sheaves +sheaving +shebang +shebangs +shebar +shebat +shebean +shebeans +shebeen +shebeener +shebeening +shebeens +shechem +shechemites +shechita +shechitah +shed +shedable +sheddable +shedded +shedder +shedders +shedding +sheder +shedhand +shedim +shedlike +shedman +sheds +shedu +shedwise +shee +sheefish +sheefishes +sheel +sheely +sheeling +sheen +sheened +sheeney +sheeneys +sheenful +sheeny +sheenie +sheenier +sheenies +sheeniest +sheening +sheenless +sheenly +sheens +sheep +sheepback +sheepbacks +sheepbell +sheepberry +sheepberries +sheepbine +sheepbiter +sheepbiting +sheepcot +sheepcote +sheepcrook +sheepdip +sheepdog +sheepdogs +sheepfaced +sheepfacedly +sheepfacedness +sheepfold +sheepfolds +sheepfoot +sheepfoots +sheepgate +sheephead +sheepheaded +sheepheads +sheephearted +sheepherder +sheepherding +sheephook +sheephouse +sheepy +sheepify +sheepified +sheepifying +sheepish +sheepishly +sheepishness +sheepkeeper +sheepkeeping +sheepkill +sheepless +sheeplet +sheeplike +sheepling +sheepman +sheepmaster +sheepmen +sheepmint +sheepmonger +sheepnose +sheepnut +sheeppen +sheepshank +sheepshead +sheepsheadism +sheepsheads +sheepshear +sheepshearer +sheepshearing +sheepshed +sheepskin +sheepskins +sheepsplit +sheepsteal +sheepstealer +sheepstealing +sheepwalk +sheepwalker +sheepweed +sheer +sheered +sheerer +sheerest +sheering +sheerlegs +sheerly +sheerness +sheers +sheet +sheetage +sheeted +sheeter +sheeters +sheetfed +sheetflood +sheetful +sheety +sheeting +sheetings +sheetless +sheetlet +sheetlike +sheetling +sheetrock +sheets +sheetways +sheetwash +sheetwise +sheetwork +sheetwriting +sheeve +sheeves +sheffield +shegets +shegetz +shehita +shehitah +sheik +sheikdom +sheikdoms +sheikh +sheikhdom +sheikhly +sheikhlike +sheikhs +sheikly +sheiklike +sheiks +sheila +sheyle +sheiling +sheitan +sheitans +sheitel +sheitlen +shekel +shekels +shekinah +shel +shela +shelah +sheld +sheldapple +shelder +sheldfowl +sheldrake +sheldrakes +shelduck +shelducks +shelf +shelfback +shelffellow +shelfful +shelffuls +shelfy +shelflike +shelflist +shelfmate +shelfpiece +shelfroom +shelfworn +shelyak +shell +shellac +shellack +shellacked +shellacker +shellackers +shellacking +shellackings +shellacks +shellacs +shellak +shellapple +shellback +shellbark +shellblow +shellblowing +shellbound +shellburst +shellcracker +shelleater +shelled +shelley +shelleyan +shelleyana +shelleyesque +sheller +shellers +shellfire +shellfish +shellfishery +shellfisheries +shellfishes +shellflower +shellful +shellhead +shelly +shellycoat +shellier +shelliest +shelliness +shelling +shellman +shellmen +shellmonger +shellpad +shellpot +shellproof +shells +shellshake +shellshocked +shellum +shellwork +shellworker +shelta +shelter +shelterage +shelterbelt +sheltered +shelterer +sheltery +sheltering +shelteringly +shelterless +shelterlessness +shelters +shelterwood +shelty +sheltie +shelties +sheltron +shelve +shelved +shelver +shelvers +shelves +shelvy +shelvier +shelviest +shelving +shelvingly +shelvingness +shelvings +shem +shema +shemaal +shemaka +sheminith +shemite +shemitic +shemitish +shemozzle +shemu +shen +shenanigan +shenanigans +shend +shendful +shending +shends +sheng +shenshai +shent +sheogue +sheol +sheolic +sheols +shepherd +shepherdage +shepherddom +shepherded +shepherdess +shepherdesses +shepherdhood +shepherdy +shepherdia +shepherding +shepherdish +shepherdism +shepherdize +shepherdless +shepherdly +shepherdlike +shepherdling +shepherdry +shepherds +sheppeck +sheppey +shepperding +sheppherded +sheppick +shepstare +shepster +sher +sherani +sherardia +sherardize +sherardized +sherardizer +sherardizing +sheratan +sheraton +sherbacha +sherbert +sherberts +sherbet +sherbetlee +sherbets +sherbetzide +sherd +sherds +shereef +shereefs +sheria +sheriat +sherif +sherifa +sherifate +sheriff +sheriffalty +sheriffcy +sheriffcies +sheriffdom +sheriffess +sheriffhood +sheriffry +sheriffs +sheriffship +sheriffwick +sherifi +sherify +sherifian +sherifs +sheriyat +sheristadar +sherlock +sherlocks +sherman +sheroot +sheroots +sherpa +sherpas +sherramoor +sherri +sherry +sherries +sherrymoor +sherris +sherrises +sherryvallies +sherwani +shes +shesha +sheth +shetland +shetlander +shetlandic +shetlands +sheuch +sheuchs +sheugh +sheughs +sheva +shevel +sheveled +sheveret +shevri +shew +shewa +shewbread +shewed +shewel +shewer +shewers +shewing +shewn +shews +shfsep +shh +shi +shy +shia +shiah +shiai +shyam +shiatsu +shibah +shibahs +shibar +shibbeen +shibboleth +shibbolethic +shibboleths +shibuichi +shice +shicer +shick +shicker +shickered +shicksa +shicksas +shide +shydepoke +shied +shiel +shield +shieldable +shieldboard +shielddrake +shielded +shielder +shielders +shieldfern +shieldflower +shielding +shieldings +shieldless +shieldlessly +shieldlessness +shieldlike +shieldling +shieldmay +shieldmaker +shields +shieldtail +shieling +shielings +shiels +shier +shyer +shiers +shyers +shies +shiest +shyest +shift +shiftability +shiftable +shiftage +shifted +shifter +shifters +shiftful +shiftfulness +shifty +shiftier +shiftiest +shiftily +shiftiness +shifting +shiftingly +shiftingness +shiftless +shiftlessly +shiftlessness +shiftman +shifts +shigella +shigellae +shigellas +shiggaion +shigionoth +shigram +shih +shying +shyish +shiism +shiite +shiitic +shik +shikar +shikara +shikaree +shikarees +shikargah +shikari +shikaris +shikarred +shikarring +shikars +shikasta +shikii +shikimi +shikimic +shikimol +shikimole +shikimotoxin +shikken +shikker +shiko +shikra +shiksa +shiksas +shikse +shikses +shilf +shilfa +shilh +shilha +shily +shyly +shilingi +shill +shilla +shillaber +shillala +shillalah +shillalas +shilled +shillelagh +shillelaghs +shillelah +shiller +shillet +shillety +shillhouse +shilly +shillibeer +shilling +shillingless +shillings +shillingsworth +shillyshally +shillyshallyer +shilloo +shills +shilluh +shilluk +shylock +shylocked +shylocking +shylockism +shylocks +shiloh +shilpit +shilpits +shim +shimal +shimei +shimmed +shimmey +shimmer +shimmered +shimmery +shimmering +shimmeringly +shimmers +shimmy +shimmied +shimmies +shimmying +shimming +shimonoseki +shimose +shimper +shims +shin +shina +shinaniging +shinarump +shinbone +shinbones +shindy +shindies +shindig +shindigs +shindys +shindle +shine +shined +shineless +shiner +shiners +shines +shyness +shynesses +shingle +shingled +shingler +shinglers +shingles +shinglewise +shinglewood +shingly +shingling +shingon +shinguard +shiny +shinier +shiniest +shinily +shininess +shining +shiningly +shiningness +shinkin +shinleaf +shinleafs +shinleaves +shinnecock +shinned +shinney +shinneys +shinner +shinnery +shinneries +shinny +shinnied +shinnies +shinnying +shinning +shinplaster +shins +shinsplints +shintai +shinty +shintyan +shintiyan +shinto +shintoism +shintoist +shintoistic +shintoists +shintoize +shinwari +shinwood +shinza +ship +shipboard +shipboy +shipborne +shipbound +shipbreaking +shipbroken +shipbuild +shipbuilder +shipbuilders +shipbuilding +shipcraft +shipentine +shipferd +shipfitter +shipful +shipfuls +shiphire +shipholder +shipyard +shipyards +shipkeeper +shiplap +shiplaps +shipless +shiplessly +shiplet +shipload +shiploads +shipman +shipmanship +shipmast +shipmaster +shipmate +shipmates +shipmatish +shipmen +shipment +shipments +shypoo +shipowner +shipowning +shippable +shippage +shipped +shippen +shippens +shipper +shippers +shippy +shipping +shippings +shipplane +shippo +shippon +shippons +shippound +shiprade +ships +shipshape +shipshapely +shipside +shipsides +shipsmith +shipt +shipway +shipways +shipward +shipwards +shipwork +shipworm +shipworms +shipwreck +shipwrecked +shipwrecky +shipwrecking +shipwrecks +shipwright +shipwrightery +shipwrightry +shipwrights +shirakashi +shiralee +shirallee +shiraz +shire +shirehouse +shireman +shiremen +shires +shirewick +shirk +shirked +shirker +shirkers +shirky +shirking +shirks +shirl +shirlcock +shirley +shirpit +shirr +shirra +shirred +shirrel +shirring +shirrings +shirrs +shirt +shirtband +shirtdress +shirtfront +shirty +shirtier +shirtiest +shirtiness +shirting +shirtings +shirtless +shirtlessness +shirtlike +shirtmake +shirtmaker +shirtmaking +shirtman +shirtmen +shirts +shirtsleeve +shirttail +shirtwaist +shirtwaister +shirvan +shish +shisham +shishya +shisn +shist +shyster +shysters +shists +shit +shita +shitepoke +shithead +shitheel +shither +shits +shittah +shittahs +shitted +shitten +shitty +shittier +shittiest +shittim +shittims +shittimwood +shittiness +shitting +shittle +shiv +shiva +shivah +shivahs +shivaism +shivaist +shivaistic +shivaite +shivaree +shivareed +shivareeing +shivarees +shivas +shive +shivey +shiver +shivered +shivereens +shiverer +shiverers +shivery +shivering +shiveringly +shiverproof +shivers +shiversome +shiverweed +shives +shivy +shivoo +shivoos +shivs +shivvy +shivzoku +shizoku +shkotzim +shkupetar +shlemiehl +shlemiel +shlemiels +shlemozzle +shlep +shlimazel +shlimazl +shlock +shlocks +shlu +shluh +shmaltz +shmaltzy +shmaltzier +shmaltziest +shmo +shmoes +shnaps +shnook +sho +shoa +shoad +shoader +shoal +shoalbrain +shoaled +shoaler +shoalest +shoaly +shoalier +shoaliest +shoaliness +shoaling +shoalness +shoals +shoalwise +shoat +shoats +shochet +shochetim +shochets +shock +shockability +shockable +shocked +shockedness +shocker +shockers +shockhead +shockheaded +shockheadedness +shocking +shockingly +shockingness +shocklike +shockproof +shocks +shockstall +shockwave +shod +shodden +shoddy +shoddydom +shoddied +shoddier +shoddies +shoddiest +shoddying +shoddyism +shoddyite +shoddily +shoddylike +shoddiness +shoddyward +shoddywards +shode +shoder +shoe +shoebill +shoebills +shoebinder +shoebindery +shoebinding +shoebird +shoeblack +shoeboy +shoebrush +shoecraft +shoed +shoeflower +shoehorn +shoehorned +shoehorning +shoehorns +shoeing +shoeingsmith +shoelace +shoelaces +shoeless +shoemake +shoemaker +shoemakers +shoemaking +shoeman +shoemold +shoepac +shoepack +shoepacks +shoepacs +shoer +shoers +shoes +shoescraper +shoeshine +shoeshop +shoesmith +shoestring +shoestrings +shoetree +shoetrees +shoewoman +shofar +shofars +shoffroth +shofroth +shoful +shog +shogaol +shogged +shoggie +shogging +shoggle +shoggly +shogi +shogs +shogun +shogunal +shogunate +shoguns +shohet +shohji +shohjis +shoya +shoyu +shoji +shojis +shojo +shola +shole +sholom +shona +shonde +shone +shoneen +shoneens +shonkinite +shoo +shood +shooed +shoofa +shoofly +shooflies +shoogle +shooi +shooing +shook +shooks +shool +shooldarry +shooled +shooler +shooling +shools +shoon +shoop +shoopiltie +shoor +shoos +shoot +shootable +shootboard +shootee +shooter +shooters +shoother +shooting +shootings +shootist +shootman +shootout +shootouts +shoots +shop +shopboard +shopboy +shopboys +shopbook +shopbreaker +shopbreaking +shope +shopfolk +shopful +shopfuls +shopgirl +shopgirlish +shopgirls +shophar +shophars +shophroth +shopkeep +shopkeeper +shopkeeperess +shopkeepery +shopkeeperish +shopkeeperism +shopkeepers +shopkeeping +shopland +shoplet +shoplift +shoplifted +shoplifter +shoplifters +shoplifting +shoplifts +shoplike +shopmaid +shopman +shopmark +shopmate +shopmen +shopocracy +shopocrat +shoppe +shopped +shopper +shoppers +shoppes +shoppy +shoppier +shoppiest +shopping +shoppings +shoppini +shoppish +shoppishness +shops +shopsoiled +shopster +shoptalk +shoptalks +shopwalker +shopwear +shopwife +shopwindow +shopwoman +shopwomen +shopwork +shopworker +shopworn +shoq +shor +shoran +shorans +shore +shorea +shoreberry +shorebird +shorebirds +shorebush +shored +shoreface +shorefish +shorefront +shoregoing +shoreyer +shoreland +shoreless +shoreline +shorelines +shoreman +shorer +shores +shoreside +shoresman +shoreward +shorewards +shoreweed +shoring +shorings +shorl +shorling +shorls +shorn +short +shortage +shortages +shortbread +shortcake +shortcakes +shortchange +shortchanged +shortchanger +shortchanges +shortchanging +shortclothes +shortcoat +shortcomer +shortcoming +shortcomings +shortcut +shortcuts +shorted +shorten +shortened +shortener +shorteners +shortening +shortenings +shortens +shorter +shortest +shortfall +shortfalls +shorthand +shorthanded +shorthandedness +shorthander +shorthandwriter +shorthead +shortheaded +shortheels +shorthorn +shorthorns +shorty +shortia +shortias +shortie +shorties +shorting +shortish +shortite +shortly +shortness +shorts +shortschat +shortsighted +shortsightedly +shortsightedness +shortsome +shortstaff +shortstop +shortstops +shorttail +shortwave +shortwaves +shortzy +shoshone +shoshonean +shoshonis +shoshonite +shot +shotbush +shotcrete +shote +shotes +shotgun +shotgunned +shotgunning +shotguns +shotless +shotlike +shotmaker +shotman +shotproof +shots +shotshell +shotsman +shotstar +shott +shotted +shotten +shotter +shotty +shotting +shotts +shotweld +shou +shough +should +shoulder +shouldered +shoulderer +shoulderette +shouldering +shoulders +shouldest +shouldn +shouldna +shouldnt +shouldst +shoulerd +shoupeltin +shouse +shout +shouted +shouter +shouters +shouther +shouting +shoutingly +shouts +shoval +shove +shoved +shovegroat +shovel +shovelard +shovelbill +shovelboard +shoveled +shoveler +shovelers +shovelfish +shovelful +shovelfuls +shovelhead +shoveling +shovelled +shoveller +shovelling +shovelmaker +shovelman +shovelnose +shovels +shovelsful +shovelweed +shover +shovers +shoves +shoving +show +showable +showance +showbird +showboard +showboat +showboater +showboating +showboats +showbread +showcase +showcased +showcases +showcasing +showd +showdom +showdown +showdowns +showed +shower +showered +showerer +showerful +showerhead +showery +showerier +showeriest +showeriness +showering +showerless +showerlike +showerproof +showers +showfolk +showful +showgirl +showgirls +showy +showyard +showier +showiest +showily +showiness +showing +showings +showish +showjumping +showless +showman +showmanism +showmanly +showmanry +showmanship +showmen +shown +showoff +showoffishness +showoffs +showpiece +showpieces +showplace +showplaces +showroom +showrooms +shows +showshop +showstopper +showup +showworthy +shp +shpt +shr +shrab +shradd +shraddha +shradh +shraf +shrag +shram +shrame +shrammed +shrank +shrap +shrape +shrapnel +shrave +shravey +shreadhead +shreading +shred +shredcock +shredded +shredder +shredders +shreddy +shredding +shredless +shredlike +shreds +shree +shreeve +shrend +shreveport +shrew +shrewd +shrewder +shrewdest +shrewdy +shrewdie +shrewdish +shrewdly +shrewdness +shrewdom +shrewed +shrewing +shrewish +shrewishly +shrewishness +shrewly +shrewlike +shrewmmice +shrewmouse +shrews +shrewsbury +shrewstruck +shri +shride +shriek +shrieked +shrieker +shriekery +shriekers +shrieky +shriekier +shriekiest +shriekily +shriekiness +shrieking +shriekingly +shriekproof +shrieks +shrieval +shrievalty +shrievalties +shrieve +shrieved +shrieves +shrieving +shrift +shriftless +shriftlessness +shrifts +shrike +shrikes +shrill +shrilled +shriller +shrillest +shrilly +shrilling +shrillish +shrillness +shrills +shrimp +shrimped +shrimper +shrimpers +shrimpfish +shrimpi +shrimpy +shrimpier +shrimpiest +shrimpiness +shrimping +shrimpish +shrimpishness +shrimplike +shrimps +shrimpton +shrinal +shrine +shrined +shrineless +shrinelet +shrinelike +shriner +shrines +shrining +shrink +shrinkable +shrinkage +shrinkageproof +shrinkages +shrinker +shrinkerg +shrinkers +shrinkhead +shrinky +shrinking +shrinkingly +shrinkingness +shrinkproof +shrinks +shrip +shris +shrite +shrive +shrived +shrivel +shriveled +shriveling +shrivelled +shrivelling +shrivels +shriven +shriver +shrivers +shrives +shriving +shroff +shroffed +shroffing +shroffs +shrog +shrogs +shropshire +shroud +shrouded +shroudy +shrouding +shroudless +shroudlike +shrouds +shrove +shroved +shrover +shrovetide +shrovy +shroving +shrrinkng +shrub +shrubbed +shrubbery +shrubberies +shrubby +shrubbier +shrubbiest +shrubbiness +shrubbish +shrubland +shrubless +shrublet +shrublike +shrubs +shrubwood +shruff +shrug +shrugged +shrugging +shruggingly +shrugs +shrunk +shrunken +shrups +shruti +sht +shtchee +shtetel +shtetl +shtetlach +shtg +shtick +shticks +shtokavski +shtreimel +shu +shuba +shubunkin +shuck +shucked +shucker +shuckers +shucking +shuckings +shuckins +shuckpen +shucks +shudder +shuddered +shudderful +shuddery +shudderiness +shuddering +shudderingly +shudders +shuddersome +shudna +shuff +shuffle +shuffleboard +shufflecap +shuffled +shuffler +shufflers +shuffles +shufflewing +shuffling +shufflingly +shufty +shug +shuggy +shuhali +shukria +shukulumbwe +shul +shulamite +shuler +shuln +shuls +shulwar +shulwaurs +shumac +shumal +shun +shunammite +shune +shunless +shunnable +shunned +shunner +shunners +shunning +shunpike +shunpiked +shunpiker +shunpikers +shunpikes +shunpiking +shuns +shunt +shunted +shunter +shunters +shunting +shunts +shuntwinding +shure +shurf +shurgee +shush +shushed +shusher +shushes +shushing +shuswap +shut +shutdown +shutdowns +shute +shuted +shuteye +shuteyes +shutes +shuting +shutness +shutoff +shutoffs +shutoku +shutout +shutouts +shuts +shuttance +shutten +shutter +shutterbug +shutterbugs +shuttered +shuttering +shutterless +shutters +shutterwise +shutting +shuttle +shuttlecock +shuttlecocked +shuttlecocking +shuttlecocks +shuttled +shuttleheaded +shuttlelike +shuttler +shuttles +shuttlewise +shuttling +shuvra +shwa +shwanpan +shwanpans +shwebo +si +sia +siacalle +siafu +syagush +siak +sial +sialaden +sialadenitis +sialadenoncus +sialagogic +sialagogue +sialagoguic +sialemesis +sialia +sialic +sialid +sialidae +sialidan +sialis +sialoangitis +sialogenous +sialogogic +sialogogue +sialoid +sialolith +sialolithiasis +sialology +sialorrhea +sialoschesis +sialosemeiology +sialosyrinx +sialosis +sialostenosis +sialozemia +sials +siam +siamang +siamangs +siamese +siameses +siamoise +siauliai +sib +sybarism +sybarist +sybarital +sybaritan +sybarite +sybarites +sybaritic +sybaritical +sybaritically +sybaritish +sybaritism +sibb +sibbaldus +sibbed +sibbendy +sibbens +sibber +sibby +sibbing +sibboleth +sibbs +siberia +siberian +siberians +siberic +siberite +sibyl +sybil +sibilance +sibilancy +sibilant +sibilantly +sibilants +sibilate +sibilated +sibilates +sibilating +sibilatingly +sibilation +sibilator +sibilatory +sibylesque +sibylic +sibylism +sibylla +sibyllae +sibyllic +sibylline +sibyllism +sibyllist +sibilous +sibyls +sibilus +sibiric +sibling +siblings +sibness +sybo +syboes +sybotic +sybotism +sybow +sibrede +sibs +sibship +sibships +sibucao +sic +sicambri +sicambrian +sycamine +sycamines +sycamore +sycamores +sicana +sicani +sicanian +sicarian +sicarii +sicarious +sicarius +sicc +sicca +siccan +siccaneous +siccant +siccar +siccate +siccated +siccating +siccation +siccative +sicced +siccimeter +siccing +siccity +sice +syce +sycee +sycees +sicel +siceliot +sicer +sices +syces +sich +sychee +sychnocarpous +sicht +sicily +sicilian +siciliana +sicilianism +siciliano +sicilianos +sicilians +sicilica +sicilicum +sicilienne +sicinnian +sicyonian +sicyonic +sicyos +sycite +sick +sickbay +sickbays +sickbed +sickbeds +sicked +sicken +sickened +sickener +sickeners +sickening +sickeningly +sickens +sicker +sickerly +sickerness +sickest +sicket +sickhearted +sickie +sicking +sickish +sickishly +sickishness +sickle +sicklebill +sickled +sicklelike +sickleman +sicklemen +sicklemia +sicklemic +sicklepod +sickler +sicklerite +sickles +sickless +sickleweed +sicklewise +sicklewort +sickly +sicklied +sicklier +sicklies +sickliest +sicklying +sicklily +sickliness +sickling +sickness +sicknesses +sicknessproof +sickout +sickouts +sickroom +sickrooms +sicks +sicle +siclike +sycoceric +sycock +sycoma +sycomancy +sycomore +sycomores +sycon +syconaria +syconarian +syconate +sycones +syconia +syconid +syconidae +syconium +syconoid +syconus +sycophancy +sycophancies +sycophant +sycophantic +sycophantical +sycophantically +sycophantish +sycophantishly +sycophantism +sycophantize +sycophantly +sycophantry +sycophants +sycoses +sycosiform +sycosis +sics +sicsac +sicula +sicular +siculi +siculian +sid +syd +sida +sidalcea +sidder +siddha +siddhanta +siddhartha +siddhi +syddir +siddow +siddur +siddurim +siddurs +side +sideage +sidearm +sidearms +sideband +sidebands +sidebar +sideboard +sideboards +sidebone +sidebones +sidebox +sideburn +sideburned +sideburns +sidecar +sidecarist +sidecars +sidechair +sidechairs +sidecheck +sidecutters +sided +sidedness +sidedress +sideflash +sidehead +sidehill +sidehills +sidehold +sidekick +sidekicker +sidekicks +sidelang +sideless +sidelight +sidelights +sideline +sidelined +sideliner +sidelines +sideling +sidelings +sidelingwise +sidelining +sidelins +sidelock +sidelong +sideman +sidemen +sideness +sidenote +sidepiece +sidepieces +sider +sideral +siderate +siderated +sideration +sidereal +siderealize +sidereally +siderean +siderin +siderism +siderite +siderites +sideritic +sideritis +siderocyte +siderognost +siderographer +siderography +siderographic +siderographical +siderographist +siderolite +siderology +sideroma +sideromagnetic +sideromancy +sideromelane +sideronatrite +sideronym +siderophilin +siderophobia +sideroscope +siderose +siderosilicosis +siderosis +siderostat +siderostatic +siderotechny +siderotic +siderous +sideroxylon +sidership +siderurgy +siderurgical +sides +sidesaddle +sidesaddles +sideshake +sideshow +sideshows +sideslip +sideslipped +sideslipping +sideslips +sidesman +sidesmen +sidespin +sidespins +sidesplitter +sidesplitting +sidesplittingly +sidest +sidestep +sidestepped +sidestepper +sidesteppers +sidestepping +sidesteps +sidestick +sidestroke +sidestrokes +sidesway +sideswipe +sideswiped +sideswiper +sideswipers +sideswipes +sideswiping +sidetrack +sidetracked +sidetracking +sidetracks +sideway +sideways +sidewalk +sidewalks +sidewall +sidewalls +sideward +sidewards +sidewash +sidewheel +sidewheeler +sidewinder +sidewinders +sidewipe +sidewiper +sidewise +sidhe +sidi +sidy +sidia +siding +sidings +sidion +sidle +sidled +sidler +sidlers +sidles +sidling +sidlingly +sidlins +sidney +sydney +sydneian +sydneyite +sidonian +sidrach +sidth +sie +sye +siecle +siecles +syed +siege +siegeable +siegecraft +sieged +siegenite +sieger +sieges +siegework +siegfried +sieging +sieglingia +siegmund +siegurd +siemens +siena +sienese +sienite +syenite +sienites +syenites +sienitic +syenitic +sienna +siennas +syenodiorite +syenogabbro +sier +siering +sierozem +sierozems +sierra +sierran +sierras +siest +siesta +siestaland +siestas +sieur +sieurs +sieva +sieve +sieved +sieveful +sievelike +sievelikeness +siever +sieversia +sieves +sievy +sieving +sievings +sifac +sifaka +sifatite +sife +siffilate +siffle +sifflement +sifflet +siffleur +siffleurs +siffleuse +siffleuses +sifflot +sift +siftage +sifted +sifter +sifters +sifting +siftings +syftn +sifts +sig +siganid +siganidae +siganids +siganus +sigatoka +sigaultian +sigfile +sigfiles +sigger +sigh +sighed +sigher +sighers +sighful +sighfully +sighing +sighingly +sighingness +sighless +sighlike +sighs +sight +sightable +sighted +sightedness +sighten +sightening +sighter +sighters +sightful +sightfulness +sighthole +sighty +sighting +sightings +sightless +sightlessly +sightlessness +sightly +sightlier +sightliest +sightlily +sightliness +sightproof +sights +sightsaw +sightscreen +sightsee +sightseeing +sightseen +sightseer +sightseers +sightsees +sightsman +sightworthy +sightworthiness +sigil +sigilative +sigilistic +sigill +sigillary +sigillaria +sigillariaceae +sigillariaceous +sigillarian +sigillarid +sigillarioid +sigillarist +sigillaroid +sigillate +sigillated +sigillation +sigillative +sigillistic +sigillographer +sigillography +sigillographical +sigillum +sigils +sigla +siglarian +sigloi +siglos +siglum +sigma +sigmas +sigmaspire +sigmate +sigmatic +sigmation +sigmatism +sigmodont +sigmodontes +sigmoid +sigmoidal +sigmoidally +sigmoidectomy +sigmoiditis +sigmoidopexy +sigmoidoproctostomy +sigmoidorectostomy +sigmoidoscope +sigmoidoscopy +sigmoidostomy +sigmoids +sigmund +sign +signa +signable +signacle +signal +signaled +signalee +signaler +signalers +signalese +signaletic +signaletics +signaling +signalise +signalised +signalising +signalism +signalist +signality +signalities +signalization +signalize +signalized +signalizes +signalizing +signalled +signaller +signally +signalling +signalman +signalmen +signalment +signals +signance +signary +signatary +signate +signation +signator +signatory +signatories +signatural +signature +signatured +signatureless +signatures +signaturing +signaturist +signboard +signboards +signed +signee +signer +signers +signet +signeted +signeting +signets +signetur +signetwise +signeur +signeury +signifer +signify +signifiable +signifiant +signific +significal +significance +significancy +significancies +significand +significant +significantly +significantness +significants +significate +signification +significations +significatist +significative +significatively +significativeness +significator +significatory +significatrix +significatum +significature +significavit +significian +significs +signifie +signified +signifier +signifies +signifying +signing +signior +signiori +signiory +signiories +signiors +signiorship +signist +signitor +signless +signlike +signman +signoff +signoi +signon +signons +signor +signora +signoras +signore +signori +signory +signoria +signorial +signories +signorina +signorinas +signorine +signorini +signorino +signorinos +signorize +signors +signorship +signpost +signposted +signposting +signposts +signs +signum +signwriter +sigrim +sigurd +sihasapa +sijill +sika +sikar +sikara +sikatch +sike +syke +siker +sikerly +sykerly +sikerness +sikes +sykes +siket +sikh +sikhara +sikhism +sikhra +sikhs +sikimi +sikinnis +sikkim +sikkimese +sikra +siksika +sil +syl +silage +silages +silaginoid +silane +silanes +silanga +silas +silbergroschen +silcrete +sild +silds +sile +silen +silenaceae +silenaceous +silenales +silence +silenced +silencer +silencers +silences +silency +silencing +silene +sylene +sileni +silenic +silent +silenter +silentest +silential +silentiary +silentio +silentious +silentish +silentium +silently +silentness +silents +silenus +silesia +silesian +silesias +siletz +silex +silexes +silexite +silgreen +silhouette +silhouetted +silhouettes +silhouetting +silhouettist +silhouettograph +silybum +silica +silicam +silicane +silicas +silicate +silicates +silication +silicatization +silicea +silicean +siliceocalcareous +siliceofelspathic +siliceofluoric +siliceous +silicic +silicicalcareous +silicicolous +silicide +silicides +silicidize +siliciferous +silicify +silicification +silicified +silicifies +silicifying +silicifluoric +silicifluoride +silicyl +siliciophite +silicious +silicispongiae +silicium +siliciums +siliciuret +siliciuretted +silicize +silicle +silicles +silico +silicoacetic +silicoalkaline +silicoaluminate +silicoarsenide +silicocalcareous +silicochloroform +silicocyanide +silicoethane +silicoferruginous +silicoflagellata +silicoflagellatae +silicoflagellate +silicoflagellidae +silicofluoric +silicofluoride +silicohydrocarbon +silicoidea +silicomagnesian +silicomanganese +silicomethane +silicon +silicone +silicones +siliconize +silicononane +silicons +silicopropane +silicoses +silicosis +silicospongiae +silicotalcose +silicothermic +silicotic +silicotitanate +silicotungstate +silicotungstic +silicula +silicular +silicule +siliculose +siliculous +sylid +silyl +syling +silipan +siliqua +siliquaceous +siliquae +siliquaria +siliquariidae +silique +siliques +siliquiferous +siliquiform +siliquose +siliquous +sylistically +silk +silkalene +silkaline +silked +silken +silker +silkflower +silkgrower +silky +silkie +silkier +silkiest +silkily +silkine +silkiness +silking +silklike +silkman +silkmen +silkness +silkolene +silkoline +silks +silkscreen +silkscreened +silkscreening +silkscreens +silksman +silkstone +silktail +silkweed +silkweeds +silkwoman +silkwood +silkwork +silkworker +silkworks +silkworm +silkworms +sill +syll +syllab +syllabary +syllabaria +syllabaries +syllabarium +syllabatim +syllabation +syllabe +syllabi +syllabic +syllabical +syllabically +syllabicate +syllabicated +syllabicating +syllabication +syllabicity +syllabicness +syllabics +syllabify +syllabification +syllabifications +syllabified +syllabifies +syllabifying +syllabise +syllabised +syllabising +syllabism +syllabize +syllabized +syllabizing +syllable +syllabled +syllables +syllabling +syllabogram +syllabography +sillabub +syllabub +sillabubs +syllabubs +syllabus +syllabuses +silladar +sillaginidae +sillago +sillandar +sillar +sillcock +syllepses +syllepsis +sylleptic +sylleptical +sylleptically +siller +sillery +sillers +silly +sillibib +sillibibs +sillibouk +sillibub +sillibubs +syllid +syllidae +syllidian +sillier +sillies +silliest +sillyhood +sillyhow +sillyish +sillyism +sillikin +sillily +sillimanite +silliness +syllis +sillyton +sillock +sylloge +syllogisation +syllogiser +syllogism +syllogisms +syllogist +syllogistic +syllogistical +syllogistically +syllogistics +syllogization +syllogize +syllogized +syllogizer +syllogizing +sillograph +sillographer +sillographist +sillometer +sillon +sills +silo +siloam +siloed +siloing +siloist +silos +siloxane +siloxanes +sylph +silpha +sylphy +sylphic +silphid +sylphid +silphidae +sylphidine +sylphids +sylphine +sylphish +silphium +sylphize +sylphlike +sylphon +sylphs +silt +siltage +siltation +silted +silty +siltier +siltiest +silting +siltlike +silts +siltstone +silundum +silure +silures +silurian +siluric +silurid +siluridae +siluridan +silurids +siluroid +siluroidei +siluroids +silurus +silva +sylva +silvae +sylvae +sylvage +silvan +sylvan +sylvanesque +sylvanite +silvanity +sylvanity +sylvanitic +sylvanize +sylvanly +silvanry +sylvanry +silvans +sylvans +silvanus +silvas +sylvas +sylvate +sylvatic +sylvatical +silvendy +silver +silverback +silverbeater +silverbelly +silverberry +silverberries +silverbiddy +silverbill +silverboom +silverbush +silvered +silvereye +silverer +silverers +silverfin +silverfish +silverfishes +silverhead +silvery +silverier +silveriest +silverily +silveriness +silvering +silverise +silverised +silverish +silverising +silverite +silverize +silverized +silverizer +silverizing +silverleaf +silverleaves +silverless +silverly +silverlike +silverling +silvern +silverness +silverpoint +silverrod +silvers +silverside +silversides +silverskin +silversmith +silversmithing +silversmiths +silverspot +silvertail +silvertip +silvertop +silvervine +silverware +silverweed +silverwing +silverwood +silverwork +silverworker +silvester +sylvester +sylvestral +sylvestrene +sylvestrian +sylvestrine +silvex +silvia +sylvia +sylvian +sylvic +silvical +sylvicolidae +sylvicoline +silvicolous +silvics +silvicultural +silviculturally +silviculture +sylviculture +silviculturist +sylviid +sylviidae +sylviinae +sylviine +sylvin +sylvine +sylvines +sylvinite +sylvins +sylvite +sylvites +silvius +sylvius +sim +sym +sima +simaba +simagre +simal +simar +simara +simarouba +simaroubaceae +simaroubaceous +simarre +simars +simaruba +simarubaceous +simarubas +simas +simazine +simazines +simba +simball +symbasic +symbasical +symbasically +symbasis +simbil +symbiogenesis +symbiogenetic +symbiogenetically +symbion +symbionic +symbions +symbiont +symbiontic +symbionticism +symbionts +symbioses +symbiosis +symbiot +symbiote +symbiotes +symbiotic +symbiotical +symbiotically +symbiotics +symbiotism +symbiotrophic +symbiots +symblepharon +simblin +simbling +simblot +simblum +symbol +symbolaeography +symbolater +symbolatry +symbolatrous +symboled +symbolic +symbolical +symbolically +symbolicalness +symbolicly +symbolics +symboling +symbolisation +symbolise +symbolised +symbolising +symbolism +symbolisms +symbolist +symbolistic +symbolistical +symbolistically +symbolization +symbolizations +symbolize +symbolized +symbolizer +symbolizes +symbolizing +symbolled +symbolling +symbolofideism +symbology +symbological +symbologist +symbolography +symbololatry +symbolology +symbolry +symbols +symbolum +symbouleutic +symbranch +symbranchia +symbranchiate +symbranchoid +symbranchous +simcon +sime +simeon +simeonism +simeonite +simia +simiad +simial +simian +simianity +simians +simiesque +simiid +simiidae +simiinae +similar +similary +similarily +similarity +similarities +similarize +similarly +similate +similative +simile +similes +similimum +similiter +simility +similitive +similitude +similitudinize +similize +similor +simioid +simious +simiousness +simitar +simitars +simity +simkin +simlin +simling +simlins +symmachy +symmedian +symmelia +symmelian +symmelus +simmer +simmered +simmering +simmeringly +simmers +symmetalism +symmetallism +symmetral +symmetry +symmetrian +symmetric +symmetrical +symmetricality +symmetrically +symmetricalness +symmetries +symmetrisation +symmetrise +symmetrised +symmetrising +symmetrist +symmetrization +symmetrize +symmetrized +symmetrizing +symmetroid +symmetrophobia +symmist +simmon +simmons +symmory +symmorphic +symmorphism +simnel +simnels +simnelwise +simoleon +simoleons +simon +simony +simoniac +simoniacal +simoniacally +simoniacs +simonial +simonian +simonianism +simonies +simonious +simonism +simonist +simonists +simonize +simonized +simonizes +simonizing +simool +simoom +simooms +simoon +simoons +simosaurus +simous +simp +simpai +sympalmograph +sympathectomy +sympathectomize +sympathetectomy +sympathetectomies +sympathetic +sympathetical +sympathetically +sympatheticism +sympatheticity +sympatheticness +sympatheticotonia +sympatheticotonic +sympathetoblast +sympathy +sympathic +sympathicoblast +sympathicotonia +sympathicotonic +sympathicotripsy +sympathies +sympathin +sympathique +sympathise +sympathised +sympathiser +sympathising +sympathisingly +sympathism +sympathist +sympathize +sympathized +sympathizer +sympathizers +sympathizes +sympathizing +sympathizingly +sympathoblast +sympatholysis +sympatholytic +sympathomimetic +simpatico +sympatry +sympatric +sympatrically +sympatries +simper +simpered +simperer +simperers +simpering +simperingly +simpers +sympetalae +sympetaly +sympetalous +symphalangus +symphenomena +symphenomenal +symphyantherous +symphycarpous +symphyla +symphylan +symphile +symphily +symphilic +symphilism +symphyllous +symphilous +symphylous +symphynote +symphyogenesis +symphyogenetic +symphyostemonous +symphyseal +symphyseotomy +symphyses +symphysy +symphysial +symphysian +symphysic +symphysion +symphysiotomy +symphysis +symphysodactylia +symphysotomy +symphystic +symphyta +symphytic +symphytically +symphytism +symphytize +symphytum +symphogenous +symphonetic +symphonette +symphony +symphonia +symphonic +symphonically +symphonies +symphonion +symphonious +symphoniously +symphonisation +symphonise +symphonised +symphonising +symphonist +symphonization +symphonize +symphonized +symphonizing +symphonous +symphoricarpos +symphoricarpous +symphrase +symphronistic +sympiesometer +symplasm +symplast +simple +simplectic +symplectic +simpled +symplegades +simplehearted +simpleheartedly +simpleheartedness +simpleminded +simplemindedly +simplemindedness +simpleness +simpler +simples +symplesite +simplesse +simplest +simpleton +simpletonian +simpletonianism +simpletonic +simpletonish +simpletonism +simpletons +simplex +simplexed +simplexes +simplexity +simply +simplices +simplicia +simplicial +simplicially +simplicident +simplicidentata +simplicidentate +simplicist +simplicitarian +simpliciter +simplicity +simplicities +simplicize +simplify +simplification +simplifications +simplificative +simplificator +simplified +simplifiedly +simplifier +simplifiers +simplifies +simplifying +simpling +simplism +simplisms +simplist +simplistic +simplistically +symplocaceae +symplocaceous +symplocarpus +symploce +symplocium +symplocos +simplum +sympode +sympodia +sympodial +sympodially +sympodium +sympolity +symposia +symposiac +symposiacal +symposial +symposiarch +symposiast +symposiastic +symposion +symposisia +symposisiums +symposium +symposiums +sympossia +simps +simpson +simptico +symptom +symptomatic +symptomatical +symptomatically +symptomaticness +symptomatics +symptomatize +symptomatography +symptomatology +symptomatologic +symptomatological +symptomatologically +symptomatologies +symptomical +symptomize +symptomless +symptomology +symptoms +symptosis +simpula +simpulum +simpulumla +sympus +sims +simsim +simson +symtab +symtomology +simul +simula +simulacra +simulacral +simulacrcra +simulacre +simulacrize +simulacrum +simulacrums +simulance +simulant +simulants +simular +simulars +simulate +simulated +simulates +simulating +simulation +simulations +simulative +simulatively +simulator +simulatory +simulators +simulcast +simulcasting +simulcasts +simule +simuler +simuliid +simuliidae +simulioid +simulium +simulize +simultaneity +simultaneous +simultaneously +simultaneousness +simulty +simurg +simurgh +sin +syn +sina +synacme +synacmy +synacmic +synactic +synadelphite +sinae +sinaean +synaeresis +synaesthesia +synaesthesis +synaesthetic +synagog +synagogal +synagogian +synagogical +synagogism +synagogist +synagogs +synagogue +synagogues +sinaic +sinaite +sinaitic +sinal +sinalbin +synalepha +synalephe +synalgia +synalgic +synallactic +synallagmatic +synallaxine +sinaloa +synaloepha +synaloephe +sinamay +sinamin +sinamine +synanastomosis +synange +synangia +synangial +synangic +synangium +synanthema +synantherology +synantherological +synantherologist +synantherous +synanthesis +synanthetic +synanthy +synanthic +synanthous +sinanthropus +synanthrose +sinapate +synaphe +synaphea +synapheia +sinapic +sinapin +sinapine +sinapinic +sinapis +sinapisine +sinapism +sinapisms +sinapize +sinapoline +synaposematic +synapse +synapsed +synapses +synapsid +synapsida +synapsidan +synapsing +synapsis +synaptai +synaptase +synapte +synaptene +synaptera +synapterous +synaptic +synaptical +synaptically +synaptychus +synapticula +synapticulae +synapticular +synapticulate +synapticulum +synaptid +synaptosauria +synaptosomal +synaptosome +synarchy +synarchical +sinarchism +synarchism +sinarchist +synarmogoid +synarmogoidea +sinarquism +synarquism +sinarquist +sinarquista +synarses +synartesis +synartete +synartetic +synarthrodia +synarthrodial +synarthrodially +synarthroses +synarthrosis +synascidiae +synascidian +synastry +sinatra +sinawa +synaxar +synaxary +synaxaria +synaxaries +synaxarion +synaxarist +synaxarium +synaxaxaria +synaxes +synaxis +sync +sincaline +sincamas +syncarida +syncaryon +syncarp +syncarpy +syncarpia +syncarpies +syncarpium +syncarpous +syncarps +syncategorem +syncategorematic +syncategorematical +syncategorematically +syncategoreme +since +synced +syncellus +syncephalic +syncephalus +sincere +syncerebral +syncerebrum +sincerely +sincereness +sincerer +sincerest +sincerity +sincerities +synch +synched +synching +synchysis +synchitic +synchytriaceae +synchytrium +synchondoses +synchondrosial +synchondrosially +synchondrosis +synchondrotomy +synchoresis +synchro +synchrocyclotron +synchroflash +synchromesh +synchromism +synchromist +synchronal +synchrone +synchroneity +synchrony +synchronic +synchronical +synchronically +synchronies +synchronisation +synchronise +synchronised +synchroniser +synchronising +synchronism +synchronistic +synchronistical +synchronistically +synchronizable +synchronization +synchronize +synchronized +synchronizer +synchronizers +synchronizes +synchronizing +synchronograph +synchronology +synchronological +synchronoscope +synchronous +synchronously +synchronousness +synchros +synchroscope +synchrotron +synchs +syncing +sincipita +sincipital +sinciput +sinciputs +syncytia +syncytial +syncytioma +syncytiomas +syncytiomata +syncytium +syncladous +synclastic +synclinal +synclinally +syncline +synclines +synclinical +synclinore +synclinorial +synclinorian +synclinorium +synclitic +syncliticism +synclitism +syncoelom +syncom +syncoms +syncopal +syncopare +syncopate +syncopated +syncopates +syncopating +syncopation +syncopations +syncopative +syncopator +syncope +syncopes +syncopic +syncopism +syncopist +syncopize +syncotyledonous +syncracy +syncraniate +syncranterian +syncranteric +syncrasy +syncretic +syncretical +syncreticism +syncretion +syncretism +syncretist +syncretistic +syncretistical +syncretize +syncretized +syncretizing +syncrypta +syncryptic +syncrisis +syncs +sind +synd +syndactyl +syndactyle +syndactyli +syndactyly +syndactylia +syndactylic +syndactylism +syndactylous +syndactylus +syndectomy +sinder +synderesis +syndeses +syndesis +syndesises +syndesmectopia +syndesmies +syndesmitis +syndesmography +syndesmology +syndesmoma +syndesmon +syndesmoplasty +syndesmorrhaphy +syndesmoses +syndesmosis +syndesmotic +syndesmotomy +syndet +syndetic +syndetical +syndetically +syndeton +syndets +sindhi +syndyasmian +syndic +syndical +syndicalism +syndicalist +syndicalistic +syndicalize +syndicat +syndicate +syndicated +syndicateer +syndicates +syndicating +syndication +syndications +syndicator +syndics +syndicship +syndyoceras +syndiotactic +sindle +sindoc +syndoc +sindon +sindry +syndrome +syndromes +syndromic +sine +syne +sinebada +synecdoche +synecdochic +synecdochical +synecdochically +synecdochism +synechdochism +synechia +synechiae +synechiology +synechiological +synechist +synechistic +synechology +synechological +synechotomy +synechthran +synechthry +synecious +synecology +synecologic +synecological +synecologically +synecphonesis +synectic +synectically +synecticity +synectics +sinecural +sinecure +sinecured +sinecures +sinecureship +sinecuring +sinecurism +sinecurist +synedra +synedral +synedria +synedrial +synedrian +synedrion +synedrium +synedrous +syneidesis +synema +synemata +synemmenon +synenergistic +synenergistical +synenergistically +synentognath +synentognathi +synentognathous +synephrine +syneresis +synergastic +synergetic +synergy +synergia +synergias +synergic +synergical +synergically +synergid +synergidae +synergidal +synergids +synergies +synergism +synergisms +synergist +synergistic +synergistical +synergistically +synergists +synergize +synerize +sines +sinesian +synesis +synesises +synesthesia +synesthetic +synethnic +synetic +sinew +sinewed +sinewy +sinewiness +sinewing +sinewless +sinewous +sinews +synezisis +sinfonia +sinfonie +sinfonietta +synfuel +synfuels +sinful +sinfully +sinfulness +sing +singability +singable +singableness +singally +syngamy +syngamic +syngamies +syngamous +singapore +singarip +singe +singed +singey +singeing +singeingly +syngeneic +syngenesia +syngenesian +syngenesious +syngenesis +syngenetic +syngenic +syngenism +syngenite +singer +singeress +singerie +singers +singes +singfest +singfo +singh +singhalese +singillatim +singing +singingfish +singingfishes +singingly +singkamas +single +singlebar +singled +singlehanded +singlehandedly +singlehandedness +singlehearted +singleheartedly +singleheartedness +singlehood +singlemindedly +singleness +singleprecision +singler +singles +singlestep +singlestick +singlesticker +singlet +singleton +singletons +singletree +singletrees +singlets +singly +singling +singlings +syngnatha +syngnathi +syngnathid +syngnathidae +syngnathoid +syngnathous +syngnathus +singpho +syngraph +sings +singsing +singsong +singsongy +singsongs +singspiel +singstress +singular +singularism +singularist +singularity +singularities +singularization +singularize +singularized +singularizing +singularly +singularness +singulars +singult +singultation +singultous +singultus +singultuses +sinh +sinhalese +sinhalite +sinhasan +sinhs +sinian +sinic +sinical +sinicism +sinicization +sinicize +sinicized +sinicizes +sinicizing +sinico +sinify +sinification +sinigrin +sinigrinase +sinigrosid +sinigroside +sinisian +sinism +sinister +sinisterly +sinisterness +sinisterwise +sinistra +sinistrad +sinistral +sinistrality +sinistrally +sinistration +sinistrin +sinistrocerebral +sinistrocular +sinistrocularity +sinistrodextral +sinistrogyrate +sinistrogyration +sinistrogyric +sinistromanual +sinistrorsal +sinistrorsally +sinistrorse +sinistrorsely +sinistrous +sinistrously +sinistruous +sinite +sinitic +synizesis +sinjer +sink +sinkable +sinkage +sinkages +synkaryon +synkaryonic +synkatathesis +sinkboat +sinkbox +sinked +sinker +sinkerless +sinkers +sinkfield +sinkhead +sinkhole +sinkholes +sinky +synkinesia +synkinesis +synkinetic +sinking +sinkingly +sinkiuse +sinkless +sinklike +sinkroom +sinks +sinkstone +sinless +sinlessly +sinlessness +sinlike +sinnable +sinnableness +sinned +synnema +synnemata +sinnen +sinner +sinneress +sinners +sinnership +sinnet +synneurosis +synneusis +sinning +sinningia +sinningly +sinningness +sinnowed +sinoatrial +sinoauricular +synocha +synochal +synochoid +synochous +synochus +synocreate +synod +synodal +synodalian +synodalist +synodally +synodian +synodic +synodical +synodically +synodicon +synodist +synodite +synodontid +synodontidae +synodontoid +synods +synodsman +synodsmen +synodus +synoecete +synoecy +synoeciosis +synoecious +synoeciously +synoeciousness +synoecism +synoecize +synoekete +synoeky +synoetic +sinogram +synoicous +synoicousness +sinoidal +sinolog +sinologer +sinology +sinological +sinologies +sinologist +sinologue +sinomenine +synomosy +sinon +synonym +synonymatic +synonyme +synonymes +synonymy +synonymic +synonymical +synonymicon +synonymics +synonymies +synonymise +synonymised +synonymising +synonymist +synonymity +synonymize +synonymized +synonymizing +synonymous +synonymously +synonymousness +synonyms +sinonism +synonomous +synonomously +synop +sinoper +sinophile +sinophilism +synophthalmia +synophthalmus +sinopia +sinopias +sinopic +sinopie +sinopis +sinopite +sinople +synopses +synopsy +synopsic +synopsis +synopsise +synopsised +synopsising +synopsize +synopsized +synopsizing +synoptic +synoptical +synoptically +synoptist +synoptistic +synorchidism +synorchism +sinorespiratory +synorthographic +synosteology +synosteoses +synosteosis +synostose +synostoses +synostosis +synostotic +synostotical +synostotically +synousiacs +synovectomy +synovia +synovial +synovially +synovias +synoviparous +synovitic +synovitis +synpelmous +sinproof +synrhabdosome +sins +synsacral +synsacrum +synsepalous +sinsiga +sinsyne +sinsion +synspermous +synsporous +sinsring +syntactially +syntactic +syntactical +syntactically +syntactician +syntactics +syntagm +syntagma +syntality +syntalities +syntan +syntasis +syntax +syntaxes +syntaxis +syntaxist +syntechnic +syntectic +syntectical +syntelome +syntenosis +sinter +sinterability +sintered +synteresis +sintering +sinters +syntexis +syntheme +synthermal +syntheses +synthesis +synthesise +synthesism +synthesist +synthesization +synthesize +synthesized +synthesizer +synthesizers +synthesizes +synthesizing +synthetase +synthete +synthetic +synthetical +synthetically +syntheticism +syntheticness +synthetics +synthetisation +synthetise +synthetised +synthetiser +synthetising +synthetism +synthetist +synthetization +synthetize +synthetizer +synthol +synthroni +synthronoi +synthronos +synthronus +syntype +syntypic +syntypicism +sinto +sintoc +sintoism +sintoist +syntomy +syntomia +syntone +syntony +syntonic +syntonical +syntonically +syntonies +syntonin +syntonisation +syntonise +syntonised +syntonising +syntonization +syntonize +syntonized +syntonizer +syntonizing +syntonolydian +syntonous +syntripsis +syntrope +syntrophic +syntrophoblast +syntrophoblastic +syntropy +syntropic +syntropical +sintsink +sintu +sinuate +sinuated +sinuatedentate +sinuately +sinuates +sinuating +sinuation +sinuatocontorted +sinuatodentate +sinuatodentated +sinuatopinnatifid +sinuatoserrated +sinuatoundulate +sinuatrial +sinuauricular +sinuitis +sinuose +sinuosely +sinuosity +sinuosities +sinuous +sinuously +sinuousness +sinupallia +sinupallial +sinupallialia +sinupalliata +sinupalliate +synura +synurae +sinus +sinusal +sinuses +synusia +synusiast +sinusitis +sinuslike +sinusoid +sinusoidal +sinusoidally +sinusoids +sinuventricular +sinward +sinzer +syodicon +siol +sion +sioning +sionite +siouan +sioux +sip +sipage +sipapu +sipe +siped +siper +sipers +sipes +syph +siphac +sypher +syphered +syphering +syphers +syphilid +syphilide +syphilidography +syphilidologist +syphiliphobia +syphilis +syphilisation +syphilise +syphilises +syphilitic +syphilitically +syphilitics +syphilization +syphilize +syphilized +syphilizing +syphiloderm +syphilodermatous +syphilogenesis +syphilogeny +syphilographer +syphilography +syphiloid +syphilology +syphilologist +syphiloma +syphilomatous +syphilophobe +syphilophobia +syphilophobic +syphilopsychosis +syphilosis +syphilous +siphoid +siphon +syphon +siphonaceous +siphonage +siphonal +siphonales +siphonaptera +siphonapterous +siphonaria +siphonariid +siphonariidae +siphonata +siphonate +siphonated +siphoneae +siphoned +syphoned +siphoneous +siphonet +siphonia +siphonial +siphoniata +siphonic +siphonifera +siphoniferous +siphoniform +siphoning +syphoning +siphonium +siphonless +siphonlike +siphonobranchiata +siphonobranchiate +siphonocladales +siphonocladiales +siphonogam +siphonogama +siphonogamy +siphonogamic +siphonogamous +siphonoglyph +siphonoglyphe +siphonognathid +siphonognathidae +siphonognathous +siphonognathus +siphonophora +siphonophoran +siphonophore +siphonophorous +siphonoplax +siphonopore +siphonorhinal +siphonorhine +siphonosome +siphonostele +siphonostely +siphonostelic +siphonostoma +siphonostomata +siphonostomatous +siphonostome +siphonostomous +siphonozooid +siphons +syphons +siphonula +siphorhinal +siphorhinian +siphosome +siphuncle +siphuncled +siphuncular +siphunculata +siphunculate +siphunculated +siphunculus +sipibo +sipid +sipidity +sipylite +siping +sipling +sipped +sipper +sippers +sippet +sippets +sippy +sipping +sippingly +sippio +sipple +sips +sipunculacea +sipunculacean +sipunculid +sipunculida +sipunculoid +sipunculoidea +sipunculus +sir +syr +syracusan +syracuse +sircar +sirdar +sirdars +sirdarship +sire +syre +sired +siredon +siree +sirees +sireless +siren +syren +sirene +sireny +sirenia +sirenian +sirenians +sirenic +sirenical +sirenically +sirenidae +sirening +sirenize +sirenlike +sirenoid +sirenoidea +sirenoidei +sirenomelus +sirens +syrens +sires +sireship +siress +syrette +sirex +sirgang +syria +syriac +syriacism +syriacist +sirian +siryan +syrian +sirianian +syrianic +syrianism +syrianize +syrians +syriarch +siriasis +syriasm +siricid +siricidae +siricoidea +syryenian +sirih +siring +syringa +syringadenous +syringas +syringe +syringeal +syringed +syringeful +syringes +syringin +syringing +syringitis +syringium +syringocele +syringocoele +syringomyelia +syringomyelic +syringotome +syringotomy +syrinx +syrinxes +syriologist +siriometer +sirione +siris +sirius +sirkar +sirkeer +sirki +sirky +sirloin +sirloiny +sirloins +syrma +syrmaea +sirmark +sirmian +syrmian +sirmuellera +syrnium +siroc +sirocco +siroccoish +siroccoishly +siroccos +sirop +syrophoenician +siros +sirpea +syrphian +syrphians +syrphid +syrphidae +syrphids +syrphus +sirple +sirpoon +sirra +sirrah +sirrahs +sirras +sirree +sirrees +syrringed +syrringing +sirs +sirship +syrt +syrtic +syrtis +siruaballi +siruelas +sirup +syrup +siruped +syruped +siruper +syruper +sirupy +syrupy +syrupiness +syruplike +sirups +syrups +syrus +sirvent +sirvente +sirventes +sis +sisal +sisalana +sisals +siscowet +sise +sisel +siserara +siserary +siserskite +sises +sish +sisham +sisi +sisymbrium +sysin +sisyphean +sisyphian +sisyphides +sisyphism +sisyphist +sisyphus +sisyrinchium +sisith +siskin +siskins +sisley +sislowet +sismotherapy +sysout +siss +syssarcosic +syssarcosis +syssarcotic +syssel +sysselman +sisseton +sissy +syssiderite +sissier +sissies +sissiest +sissify +sissification +sissified +sissyish +sissyism +sissiness +sissing +syssita +syssitia +syssition +sissone +sissonne +sissonnes +sissoo +sissu +sist +syst +systaltic +sistani +systasis +systatic +system +systematy +systematic +systematical +systematicality +systematically +systematicalness +systematician +systematicness +systematics +systematisation +systematise +systematised +systematiser +systematising +systematism +systematist +systematization +systematize +systematized +systematizer +systematizes +systematizing +systematology +systemed +systemic +systemically +systemics +systemisable +systemisation +systemise +systemised +systemiser +systemising +systemist +systemizable +systemization +systemize +systemized +systemizer +systemizes +systemizing +systemless +systemoid +systemproof +systems +systemwide +systemwise +sisten +sistence +sistency +sistent +sister +sistered +sisterhood +sisterhoods +sisterin +sistering +sisterize +sisterless +sisterly +sisterlike +sisterliness +sistern +sisters +sistership +systyle +systilius +systylous +sistine +sisting +sistle +systolated +systole +systoles +systolic +sistomensin +sistra +sistren +sistroid +sistrum +sistrums +sistrurus +sit +sita +sitao +sitar +sitarist +sitarists +sitars +sitatunga +sitatungas +sitch +sitcom +sitcoms +site +sited +sitella +sites +sitfast +sith +sithcund +sithe +sithement +sithen +sithence +sithens +sithes +siti +sitient +siting +sitio +sitiology +sitiomania +sitiophobia +sitka +sitkan +sitology +sitologies +sitomania +sitophilus +sitophobia +sitophobic +sitosterin +sitosterol +sitotoxism +sitrep +sitringee +sits +sitta +sittee +sitten +sitter +sitters +sittidae +sittinae +sittine +sitting +sittings +sittringy +situ +situal +situate +situated +situates +situating +situation +situational +situationally +situations +situla +situlae +situp +situps +situs +situses +situtunga +sitz +sitzbath +sitzkrieg +sitzmark +sitzmarks +syud +sium +siums +syun +siusi +siuslaw +siva +sivaism +sivaist +sivaistic +sivaite +sivan +sivapithecus +sivathere +sivatheriidae +sivatheriinae +sivatherioid +sivatherium +siver +sivers +sivvens +siwan +siwash +siwashed +siwashing +siwens +six +sixain +sixer +sixes +sixfoil +sixfold +sixfolds +sixgun +sixhaend +sixhynde +sixing +sixish +sixmo +sixmos +sixpence +sixpences +sixpenny +sixpennyworth +sixscore +sixsome +sixte +sixteen +sixteener +sixteenfold +sixteenmo +sixteenmos +sixteenpenny +sixteens +sixteenth +sixteenthly +sixteenths +sixtes +sixth +sixthet +sixthly +sixths +sixty +sixties +sixtieth +sixtieths +sixtyfold +sixtine +sixtypenny +sixtowns +sixtus +sizable +sizableness +sizably +sizal +sizar +sizars +sizarship +size +sizeable +sizeableness +sizeably +sized +sizeine +sizeman +sizer +sizers +sizes +sizy +sizier +siziest +siziests +syzygal +syzygetic +syzygetically +syzygy +sizygia +syzygia +syzygial +syzygies +sizygium +syzygium +siziness +sizinesses +sizing +sizings +sizz +sizzard +sizzing +sizzle +sizzled +sizzler +sizzlers +sizzles +sizzling +sizzlingly +sjaak +sjambok +sjomil +sjomila +sjouke +sk +skaalpund +skaamoog +skaddle +skaff +skaffie +skag +skags +skail +skayles +skaillie +skainsmate +skair +skaitbird +skaithy +skal +skalawag +skald +skaldic +skalds +skaldship +skalpund +skance +skanda +skandhas +skart +skasely +skat +skate +skateable +skateboard +skateboarded +skateboarder +skateboarders +skateboarding +skateboards +skated +skatemobile +skatepark +skater +skaters +skates +skatikas +skatiku +skating +skatings +skatist +skatol +skatole +skatoles +skatology +skatols +skatoma +skatoscopy +skatosine +skatoxyl +skats +skaw +skean +skeane +skeanes +skeanockle +skeans +skeat +sked +skedaddle +skedaddled +skedaddler +skedaddling +skedge +skedgewith +skedlock +skee +skeeball +skeech +skeed +skeeg +skeeing +skeel +skeely +skeeling +skeen +skeenyie +skeens +skeer +skeered +skeery +skees +skeesicks +skeet +skeeter +skeeters +skeets +skeezicks +skeezix +skef +skeg +skegger +skegs +skey +skeich +skeif +skeigh +skeighish +skeily +skein +skeined +skeiner +skeining +skeins +skeipp +skeyting +skel +skelder +skelderdrake +skeldock +skeldraik +skeldrake +skelet +skeletal +skeletally +skeletin +skeletogeny +skeletogenous +skeletomuscular +skeleton +skeletony +skeletonian +skeletonic +skeletonise +skeletonised +skeletonising +skeletonization +skeletonize +skeletonized +skeletonizer +skeletonizing +skeletonless +skeletonlike +skeletons +skeletonweed +skelf +skelgoose +skelic +skell +skellat +skeller +skelly +skelloch +skellum +skellums +skelp +skelped +skelper +skelpin +skelping +skelpit +skelps +skelter +skeltered +skeltering +skelters +skeltonian +skeltonic +skeltonical +skeltonics +skelvy +skemmel +skemp +sken +skenai +skene +skenes +skeo +skeough +skep +skepful +skepfuls +skeppe +skeppist +skeppund +skeps +skepsis +skepsises +skeptic +skeptical +skeptically +skepticalness +skepticism +skepticize +skepticized +skepticizing +skeptics +skeptophylaxia +skeptophylaxis +sker +skere +skerret +skerry +skerrick +skerries +skers +sket +sketch +sketchability +sketchable +sketchbook +sketched +sketchee +sketcher +sketchers +sketches +sketchy +sketchier +sketchiest +sketchily +sketchiness +sketching +sketchingly +sketchist +sketchlike +sketchpad +skete +sketiotai +skeuomorph +skeuomorphic +skevish +skew +skewback +skewbacked +skewbacks +skewbald +skewbalds +skewed +skewer +skewered +skewerer +skewering +skewers +skewerwood +skewy +skewing +skewings +skewl +skewly +skewness +skewnesses +skews +skewwhiff +skewwise +skhian +ski +sky +skiable +skiagram +skiagrams +skiagraph +skiagraphed +skiagrapher +skiagraphy +skiagraphic +skiagraphical +skiagraphically +skiagraphing +skiamachy +skiameter +skiametry +skiapod +skiapodous +skiascope +skiascopy +skiatron +skybal +skybald +skibbet +skibby +skibob +skibobber +skibobbing +skibobs +skyborne +skibslast +skycap +skycaps +skice +skycoach +skycraft +skid +skidded +skidder +skidders +skiddy +skiddycock +skiddier +skiddiest +skidding +skiddingly +skiddoo +skiddooed +skiddooing +skiddoos +skidi +skydive +skydived +skydiver +skydivers +skydives +skydiving +skidlid +skidoo +skidooed +skidooing +skidoos +skydove +skidpan +skidproof +skids +skidway +skidways +skye +skiech +skied +skyed +skiegh +skiey +skyey +skieppe +skiepper +skier +skiers +skies +skieur +skiff +skiffle +skiffled +skiffles +skiffless +skiffling +skiffs +skift +skyfte +skyful +skyhook +skyhooks +skyhoot +skiing +skying +skiings +skiis +skyish +skyjack +skyjacked +skyjacker +skyjackers +skyjacking +skyjacks +skijore +skijorer +skijorers +skijoring +skil +skylab +skylark +skylarked +skylarker +skylarkers +skylarking +skylarks +skilder +skildfel +skyless +skilfish +skilful +skilfully +skilfulness +skylight +skylights +skylike +skyline +skylined +skylines +skylining +skill +skillagalee +skilled +skillenton +skilless +skillessness +skillet +skilletfish +skilletfishes +skillets +skillful +skillfully +skillfulness +skilly +skilligalee +skilling +skillings +skillion +skillo +skills +skylook +skylounge +skilpot +skilty +skilts +skim +skyman +skimback +skime +skymen +skimmed +skimmelton +skimmer +skimmers +skimmerton +skimmia +skimming +skimmingly +skimmings +skimmington +skimmity +skimo +skimobile +skimos +skimp +skimped +skimpy +skimpier +skimpiest +skimpily +skimpiness +skimping +skimpingly +skimps +skims +skin +skinball +skinbound +skinch +skindive +skindiver +skindiving +skinflick +skinflint +skinflinty +skinflintily +skinflintiness +skinflints +skinful +skinfuls +skinhead +skinheads +skink +skinked +skinker +skinkers +skinking +skinkle +skinks +skinless +skinlike +skinned +skinner +skinnery +skinneries +skinners +skinny +skinnier +skinniest +skinniness +skinning +skins +skint +skintight +skintle +skintled +skintling +skinworm +skiogram +skiograph +skiophyte +skioring +skiorings +skip +skipbrain +skipdent +skipetar +skyphoi +skyphos +skypipe +skipjack +skipjackly +skipjacks +skipkennel +skiplane +skiplanes +skyplast +skipman +skyport +skippable +skipped +skippel +skipper +skipperage +skippered +skippery +skippering +skippers +skippership +skippet +skippets +skippy +skipping +skippingly +skipple +skippund +skips +skiptail +skipway +skyre +skyrgaliard +skyriding +skyrin +skirl +skirlcock +skirled +skirling +skirls +skirmish +skirmished +skirmisher +skirmishers +skirmishes +skirmishing +skirmishingly +skyrocket +skyrocketed +skyrockety +skyrocketing +skyrockets +skirp +skirr +skirred +skirreh +skirret +skirrets +skirring +skirrs +skirt +skirtboard +skirted +skirter +skirters +skirty +skirting +skirtingly +skirtings +skirtless +skirtlike +skirts +skirwhit +skirwort +skis +skys +skysail +skysails +skyscape +skyscrape +skyscraper +skyscrapers +skyscraping +skyshine +skystone +skysweeper +skit +skite +skyte +skited +skiter +skites +skither +skiting +skitishly +skits +skitswish +skittaget +skittagetan +skitter +skittered +skittery +skitterier +skitteriest +skittering +skitters +skitty +skittyboot +skittish +skittishly +skittishness +skittle +skittled +skittler +skittles +skittling +skyugle +skiv +skive +skived +skiver +skivers +skiverwood +skives +skivy +skivie +skivies +skiving +skivvy +skivvies +skyway +skyways +skyward +skywards +skywave +skiwear +skiwears +skiwy +skiwies +skywrite +skywriter +skywriters +skywrites +skywriting +skywritten +skywrote +sklate +sklater +sklent +sklented +sklenting +sklents +skleropelite +sklinter +skoal +skoaled +skoaling +skoals +skodaic +skogbolite +skoinolon +skokiaan +skokomish +skol +skolly +skomerite +skoo +skookum +skoot +skopets +skoptsy +skout +skouth +skraeling +skraelling +skraigh +skreegh +skreeghed +skreeghing +skreeghs +skreel +skreigh +skreighed +skreighing +skreighs +skryer +skrike +skrimshander +skrupul +skua +skuas +skulduggery +skulk +skulked +skulker +skulkers +skulking +skulkingly +skulks +skull +skullbanker +skullcap +skullcaps +skullduggery +skullduggeries +skulled +skullery +skullfish +skullful +skully +skulls +skulp +skun +skunk +skunkbill +skunkbush +skunkdom +skunked +skunkery +skunkhead +skunky +skunking +skunkish +skunklet +skunks +skunktop +skunkweed +skupshtina +skurry +skuse +skutterudite +sl +sla +slab +slabbed +slabber +slabbered +slabberer +slabbery +slabbering +slabbers +slabby +slabbiness +slabbing +slabline +slabman +slabness +slabs +slabstone +slabwood +slack +slackage +slacked +slacken +slackened +slackener +slackening +slackens +slacker +slackerism +slackers +slackest +slackie +slacking +slackingly +slackly +slackminded +slackmindedness +slackness +slacks +slackwitted +slackwittedness +slad +sladang +slade +slae +slag +slaggability +slaggable +slagged +slagger +slaggy +slaggier +slaggiest +slagging +slagless +slaglessness +slagman +slags +slay +slayable +slayed +slayer +slayers +slaying +slain +slainte +slays +slaister +slaistery +slait +slakable +slake +slakeable +slaked +slakeless +slaker +slakers +slakes +slaky +slakier +slakiest +slakin +slaking +slalom +slalomed +slaloming +slaloms +slam +slambang +slammakin +slammed +slammer +slammerkin +slamming +slammock +slammocky +slammocking +slamp +slampamp +slampant +slams +slander +slandered +slanderer +slanderers +slanderful +slanderfully +slandering +slanderingly +slanderous +slanderously +slanderousness +slanderproof +slanders +slane +slang +slanged +slangy +slangier +slangiest +slangily +slanginess +slanging +slangish +slangishly +slangism +slangkop +slangous +slangrell +slangs +slangster +slanguage +slangular +slangwhang +slank +slant +slanted +slanter +slantindicular +slantindicularly +slanting +slantingly +slantingways +slantly +slants +slantways +slantwise +slap +slapdab +slapdash +slapdashery +slapdasheries +slapdashes +slape +slaphappy +slaphappier +slaphappiest +slapjack +slapjacks +slapped +slapper +slappers +slappy +slapping +slaps +slapshot +slapstick +slapsticky +slapsticks +slare +slart +slarth +slartibartfast +slash +slashed +slasher +slashers +slashes +slashy +slashing +slashingly +slashings +slask +slat +slatch +slatches +slate +slated +slateful +slateyard +slatelike +slatemaker +slatemaking +slater +slaters +slates +slateworks +slath +slather +slathered +slathering +slathers +slaty +slatier +slatiest +slatify +slatified +slatifying +slatiness +slating +slatings +slatish +slats +slatted +slatter +slattered +slattery +slattering +slattern +slatternish +slatternly +slatternliness +slatternness +slatterns +slatting +slaughter +slaughterdom +slaughtered +slaughterer +slaughterers +slaughterhouse +slaughterhouses +slaughtery +slaughteryard +slaughtering +slaughteringly +slaughterman +slaughterous +slaughterously +slaughters +slaum +slaunchways +slav +slavdom +slave +slaveborn +slaved +slaveholder +slaveholding +slavey +slaveys +slaveland +slaveless +slavelet +slavelike +slaveling +slavemonger +slaveowner +slaveownership +slavepen +slaver +slavered +slaverer +slaverers +slavery +slaveries +slavering +slaveringly +slavers +slaves +slavi +slavian +slavic +slavicism +slavicist +slavicize +slavify +slavification +slavikite +slavin +slaving +slavish +slavishly +slavishness +slavism +slavist +slavistic +slavization +slavize +slavocracy +slavocracies +slavocrat +slavocratic +slavonian +slavonianize +slavonic +slavonically +slavonicize +slavonish +slavonism +slavonization +slavonize +slavophile +slavophilism +slavophobe +slavophobist +slavs +slaw +slawbank +slaws +sld +sleathy +sleave +sleaved +sleaves +sleaving +sleazy +sleazier +sleaziest +sleazily +sleaziness +sleb +sleck +sled +sledded +sledder +sledders +sledding +sleddings +sledful +sledge +sledged +sledgehammer +sledgehammering +sledgehammers +sledgeless +sledgemeter +sledger +sledges +sledging +sledlike +sleds +slee +sleech +sleechy +sleek +sleeked +sleeken +sleekened +sleekening +sleekens +sleeker +sleekest +sleeky +sleekier +sleekiest +sleeking +sleekit +sleekly +sleekness +sleeks +sleep +sleepcoat +sleeper +sleepered +sleepers +sleepful +sleepfulness +sleepy +sleepier +sleepiest +sleepify +sleepyhead +sleepyheads +sleepily +sleepiness +sleeping +sleepingly +sleepings +sleepish +sleepland +sleepless +sleeplessly +sleeplessness +sleeplike +sleepmarken +sleepproof +sleepry +sleeps +sleepwaker +sleepwaking +sleepwalk +sleepwalker +sleepwalkers +sleepwalking +sleepward +sleepwear +sleepwort +sleer +sleet +sleeted +sleety +sleetier +sleetiest +sleetiness +sleeting +sleetproof +sleets +sleeve +sleeveband +sleeveboard +sleeved +sleeveen +sleevefish +sleeveful +sleeveless +sleevelessness +sleevelet +sleevelike +sleever +sleeves +sleeving +sleezy +sley +sleided +sleyed +sleyer +sleigh +sleighed +sleigher +sleighers +sleighing +sleighs +sleight +sleightful +sleighty +sleightness +sleights +sleying +sleys +slendang +slender +slenderer +slenderest +slenderish +slenderization +slenderize +slenderized +slenderizes +slenderizing +slenderly +slenderness +slent +slepez +slept +slete +sleuth +sleuthdog +sleuthed +sleuthful +sleuthhound +sleuthing +sleuthlike +sleuths +slew +slewed +slewer +slewing +slewingslews +slews +slewth +sly +slibbersauce +slyboots +slice +sliceable +sliced +slicer +slicers +slices +slich +slicht +slicing +slicingly +slick +slicked +slicken +slickens +slickenside +slickensided +slicker +slickered +slickery +slickers +slickest +slicking +slickly +slickness +slickpaper +slicks +slickstone +slid +slidable +slidableness +slidably +slidage +slidden +slidder +sliddery +slidderness +sliddry +slide +slideable +slideableness +slideably +slided +slidefilm +slidegroat +slidehead +slideknot +slideman +slideproof +slider +sliders +slides +slideway +slideways +sliding +slidingly +slidingness +slidometer +slier +slyer +sliest +slyest +slifter +sliggeen +slight +slighted +slighten +slighter +slightest +slighty +slightier +slightiest +slightily +slightiness +slighting +slightingly +slightish +slightly +slightness +slights +slyish +slik +slily +slyly +slim +slime +slimed +slimeman +slimemen +slimepit +slimer +slimes +slimy +slimier +slimiest +slimily +sliminess +sliming +slimish +slimishness +slimly +slimline +slimmed +slimmer +slimmest +slimming +slimmish +slimness +slimnesses +slimpsy +slimpsier +slimpsiest +slims +slimsy +slimsier +slimsiest +sline +slyness +slynesses +sling +slingback +slingball +slinge +slinger +slingers +slinging +slingman +slings +slingshot +slingshots +slingsman +slingsmen +slingstone +slink +slinker +slinky +slinkier +slinkiest +slinkily +slinkiness +slinking +slinkingly +slinks +slinkskin +slinkweed +slinte +slip +slipback +slipband +slipboard +slipbody +slipbodies +slipcase +slipcases +slipcoach +slipcoat +slipcote +slipcover +slipcovers +slipe +slype +sliped +slipes +slypes +slipform +slipformed +slipforming +slipforms +slipgibbet +sliphalter +sliphorn +sliphouse +sliping +slipknot +slipknots +slipless +slipman +slipnoose +slipout +slipouts +slipover +slipovers +slippage +slippages +slipped +slipper +slippered +slipperflower +slippery +slipperyback +slipperier +slipperiest +slipperily +slipperiness +slipperyroot +slipperlike +slippers +slipperweed +slipperwort +slippy +slippier +slippiest +slippiness +slipping +slippingly +slipproof +sliprail +slips +slipsheet +slipshod +slipshoddy +slipshoddiness +slipshodness +slipshoe +slipskin +slipslap +slipslop +slipsloppish +slipsloppism +slipslops +slipsole +slipsoles +slipstep +slipstick +slipstone +slipstream +slipstring +slipt +sliptopped +slipup +slipups +slipway +slipways +slipware +slipwares +slirt +slish +slit +slitch +slite +slither +slithered +slithery +slithering +slitheroo +slithers +slithy +sliting +slitless +slitlike +slits +slitshell +slitted +slitter +slitters +slitty +slitting +slitwing +slitwise +slitwork +slive +sliver +slivered +sliverer +sliverers +slivery +slivering +sliverlike +sliverproof +slivers +sliving +slivovic +slivovics +slivovitz +sliwer +sloan +sloanea +sloat +slob +slobber +slobberchops +slobbered +slobberer +slobbery +slobbering +slobbers +slobby +slobbiness +slobbish +slobs +slock +slocken +slocker +slockingstone +slockster +slod +slodder +slodge +slodger +sloe +sloeberry +sloeberries +sloebush +sloes +sloetree +slog +slogan +sloganeer +sloganize +slogans +slogged +slogger +sloggers +slogging +sloggingly +slogs +slogwood +sloid +sloyd +sloids +sloyds +slojd +slojds +sloka +sloke +sloked +sloken +sloking +slommack +slommacky +slommock +slon +slone +slonk +sloo +sloom +sloomy +sloop +sloopman +sloopmen +sloops +sloosh +sloot +slop +slopdash +slope +sloped +slopely +slopeness +sloper +slopers +slopes +slopeways +slopewise +slopy +sloping +slopingly +slopingness +slopmaker +slopmaking +sloppage +slopped +sloppery +slopperies +sloppy +sloppier +sloppiest +sloppily +sloppiness +slopping +slops +slopseller +slopselling +slopshop +slopstone +slopwork +slopworker +slopworks +slorp +slosh +sloshed +slosher +sloshes +sloshy +sloshier +sloshiest +sloshily +sloshiness +sloshing +slot +slotback +slotbacks +slote +sloted +sloth +slothful +slothfully +slothfulness +slothfuls +slothound +sloths +slotman +slots +slotted +slotten +slotter +slottery +slotting +slotwise +sloubbie +slouch +slouched +sloucher +slouchers +slouches +slouchy +slouchier +slouchiest +slouchily +slouchiness +slouching +slouchingly +slough +sloughed +sloughy +sloughier +sloughiest +sloughiness +sloughing +sloughs +slounge +slounger +slour +sloush +slovak +slovakian +slovakish +slovaks +sloven +slovene +slovenian +slovenish +slovenly +slovenlier +slovenliest +slovenlike +slovenliness +slovenry +slovens +slovenwood +slovintzi +slow +slowback +slowbelly +slowbellied +slowbellies +slowcoach +slowdown +slowdowns +slowed +slower +slowest +slowful +slowgoing +slowheaded +slowhearted +slowheartedness +slowhound +slowing +slowish +slowly +slowmouthed +slowness +slownesses +slowpoke +slowpokes +slowrie +slows +slowup +slowwitted +slowwittedly +slowworm +slowworms +slt +slub +slubbed +slubber +slubberdegullion +slubbered +slubberer +slubbery +slubbering +slubberingly +slubberly +slubbers +slubby +slubbing +slubbings +slubs +slud +sludder +sluddery +sludge +sludged +sludger +sludges +sludgy +sludgier +sludgiest +sludginess +sludging +slue +slued +sluer +slues +sluff +sluffed +sluffing +sluffs +slug +slugabed +slugabeds +slugfest +slugfests +sluggard +sluggardy +sluggarding +sluggardize +sluggardly +sluggardliness +sluggardness +sluggardry +sluggards +slugged +slugger +sluggers +sluggy +slugging +sluggingly +sluggish +sluggishly +sluggishness +slughorn +sluglike +slugs +slugwood +sluice +sluiced +sluicegate +sluicelike +sluicer +sluices +sluiceway +sluicy +sluicing +sluig +sluing +sluit +slum +slumber +slumbered +slumberer +slumberers +slumberful +slumbery +slumbering +slumberingly +slumberland +slumberless +slumberous +slumberously +slumberousness +slumberproof +slumbers +slumbersome +slumbrous +slumdom +slumgullion +slumgum +slumgums +slumland +slumlike +slumlord +slumlords +slummage +slummed +slummer +slummers +slummy +slummier +slummiest +slumminess +slumming +slummock +slummocky +slump +slumped +slumpy +slumping +slumpproof +slumproof +slumps +slumpwork +slums +slumward +slumwise +slung +slungbody +slungbodies +slunge +slungshot +slunk +slunken +slup +slur +slurb +slurban +slurbow +slurbs +slurp +slurped +slurping +slurps +slurred +slurry +slurried +slurries +slurrying +slurring +slurringly +slurs +slurvian +slush +slushed +slusher +slushes +slushy +slushier +slushiest +slushily +slushiness +slushing +slushpit +slut +slutch +slutchy +sluther +sluthood +sluts +slutted +slutter +sluttered +sluttery +sluttering +slutty +sluttikin +slutting +sluttish +sluttishly +sluttishness +sm +sma +smachrie +smack +smacked +smackee +smacker +smackeroo +smackeroos +smackers +smackful +smacking +smackingly +smacks +smacksman +smacksmen +smaik +smalcaldian +smalcaldic +small +smallage +smallages +smallboy +smallclothes +smallcoal +smallen +smaller +smallest +smallhearted +smallholder +smallholding +smally +smalling +smallish +smallishness +smallmouth +smallmouthed +smallness +smallnesses +smallpox +smallpoxes +smalls +smallsword +smalltime +smallware +smalm +smalmed +smalming +smalt +smalter +smalti +smaltine +smaltines +smaltite +smaltites +smalto +smaltos +smaltost +smalts +smaltz +smaragd +smaragde +smaragdes +smaragdine +smaragdite +smaragds +smaragdus +smarm +smarmy +smarmier +smarmiest +smarms +smart +smartass +smarted +smarten +smartened +smartening +smartens +smarter +smartest +smarty +smartie +smarties +smarting +smartingly +smartish +smartism +smartless +smartly +smartness +smarts +smartweed +smash +smashable +smashage +smashboard +smashed +smasher +smashery +smashers +smashes +smashing +smashingly +smashment +smashup +smashups +smatch +smatchet +smatter +smattered +smatterer +smattery +smattering +smatteringly +smatterings +smatters +smaze +smazes +smear +smearcase +smeared +smearer +smearers +smeary +smearier +smeariest +smeariness +smearing +smearless +smears +smeath +smectic +smectymnuan +smectymnuus +smectis +smectite +smeddum +smeddums +smee +smeech +smeek +smeeked +smeeky +smeeking +smeeks +smeer +smeeth +smegma +smegmas +smegmatic +smell +smellable +smellage +smelled +smeller +smellers +smellful +smellfungi +smellfungus +smelly +smellie +smellier +smelliest +smelliness +smelling +smellproof +smells +smellsome +smelt +smelted +smelter +smeltery +smelteries +smelterman +smelters +smelting +smeltman +smelts +smerk +smerked +smerking +smerks +smervy +smeth +smethe +smeuse +smeuth +smew +smews +smich +smicker +smicket +smickly +smiddy +smiddie +smiddum +smidge +smidgen +smidgens +smidgeon +smidgeons +smidgin +smidgins +smiercase +smifligate +smifligation +smift +smiggins +smilacaceae +smilacaceous +smilaceae +smilaceous +smilacin +smilacina +smilax +smilaxes +smile +smileable +smileage +smiled +smileful +smilefulness +smiley +smileless +smilelessly +smilelessness +smilemaker +smilemaking +smileproof +smiler +smilers +smiles +smilet +smily +smiling +smilingly +smilingness +smilodon +smintheus +sminthian +sminthurid +sminthuridae +sminthurus +smirch +smirched +smircher +smirches +smirchy +smirching +smirchless +smiris +smirk +smirked +smirker +smirkers +smirky +smirkier +smirkiest +smirking +smirkingly +smirkish +smirkle +smirkly +smirks +smyrna +smyrnaite +smyrnean +smyrniot +smyrniote +smirtle +smit +smitable +smitch +smite +smiter +smiters +smites +smith +smyth +smitham +smithcraft +smither +smithereen +smithereens +smithery +smitheries +smithers +smithfield +smithy +smithian +smithianism +smithydander +smithied +smithier +smithies +smithying +smithing +smithite +smiths +smithsonian +smithsonite +smithum +smithwork +smiting +smytrie +smitten +smitter +smitting +smittle +smittleish +smittlish +sml +smock +smocked +smocker +smockface +smocking +smockings +smockless +smocklike +smocks +smog +smoggy +smoggier +smoggiest +smogless +smogs +smokable +smokables +smoke +smokeable +smokebox +smokebush +smokechaser +smoked +smokefarthings +smokeho +smokehole +smokehouse +smokehouses +smokey +smokejack +smokejumper +smokeless +smokelessly +smokelessness +smokelike +smokepot +smokepots +smokeproof +smoker +smokery +smokers +smokes +smokescreen +smokeshaft +smokestack +smokestacks +smokestone +smoketight +smokewood +smoky +smokier +smokies +smokiest +smokily +smokiness +smoking +smokings +smokyseeming +smokish +smoko +smokos +smolder +smoldered +smoldering +smolderingness +smolders +smolt +smolts +smooch +smooched +smooches +smoochy +smooching +smoochs +smoodge +smoodged +smoodger +smoodging +smooge +smook +smoorich +smoos +smoot +smooth +smoothable +smoothback +smoothboots +smoothbore +smoothbored +smoothcoat +smoothed +smoothen +smoothened +smoothening +smoothens +smoother +smoothers +smoothes +smoothest +smoothhound +smoothy +smoothie +smoothies +smoothify +smoothification +smoothing +smoothingly +smoothish +smoothly +smoothmouthed +smoothness +smoothpate +smooths +smoothtongue +smopple +smore +smorebro +smorgasbord +smorgasbords +smorzando +smorzato +smote +smother +smotherable +smotheration +smothered +smotherer +smothery +smotheriness +smothering +smotheringly +smothers +smotter +smouch +smoucher +smoulder +smouldered +smouldering +smoulders +smous +smouse +smouser +smout +smrgs +smriti +smrrebrd +smudder +smudge +smudged +smudgedly +smudgeless +smudgeproof +smudger +smudges +smudgy +smudgier +smudgiest +smudgily +smudginess +smudging +smug +smugger +smuggery +smuggest +smuggish +smuggishly +smuggishness +smuggle +smuggleable +smuggled +smuggler +smugglery +smugglers +smuggles +smuggling +smugism +smugly +smugness +smugnesses +smuisty +smur +smurks +smurr +smurry +smurtle +smuse +smush +smut +smutch +smutched +smutches +smutchy +smutchier +smutchiest +smutchin +smutching +smutchless +smutless +smutproof +smuts +smutted +smutter +smutty +smuttier +smuttiest +smuttily +smuttiness +smutting +sn +snab +snabby +snabbie +snabble +snack +snacked +snackette +snacky +snacking +snackle +snackman +snacks +snaff +snaffle +snafflebit +snaffled +snaffles +snaffling +snafu +snafued +snafuing +snafus +snag +snagbush +snagged +snagger +snaggy +snaggier +snaggiest +snagging +snaggle +snaggled +snaggleteeth +snaggletooth +snaggletoothed +snaglike +snagline +snagrel +snags +snail +snaileater +snailed +snailery +snailfish +snailfishessnailflower +snailflower +snaily +snailing +snailish +snailishly +snaillike +snails +snaith +snake +snakebark +snakeberry +snakebird +snakebite +snakeblenny +snakeblennies +snaked +snakefish +snakefishes +snakefly +snakeflies +snakeflower +snakehead +snakeholing +snakey +snakeleaf +snakeless +snakelet +snakelike +snakeling +snakemouth +snakemouths +snakeneck +snakeology +snakephobia +snakepiece +snakepipe +snakeproof +snaker +snakery +snakeroot +snakes +snakeship +snakeskin +snakestone +snakeweed +snakewise +snakewood +snakeworm +snakewort +snaky +snakier +snakiest +snakily +snakiness +snaking +snakish +snap +snapback +snapbacks +snapbag +snapberry +snapdragon +snapdragons +snape +snaper +snaphaan +snaphance +snaphead +snapholder +snapy +snapjack +snapless +snapline +snapout +snappable +snappage +snappe +snapped +snapper +snapperback +snappers +snappy +snappier +snappiest +snappily +snappiness +snapping +snappingly +snappish +snappishly +snappishness +snapps +snaps +snapsack +snapshare +snapshoot +snapshooter +snapshot +snapshots +snapshotted +snapshotter +snapshotting +snapweed +snapweeds +snapwood +snapwort +snare +snared +snareless +snarer +snarers +snares +snary +snaring +snaringly +snark +snarks +snarl +snarled +snarleyyow +snarleyow +snarler +snarlers +snarly +snarlier +snarliest +snarling +snarlingly +snarlish +snarls +snash +snashes +snast +snaste +snasty +snatch +snatchable +snatched +snatcher +snatchers +snatches +snatchy +snatchier +snatchiest +snatchily +snatching +snatchingly +snatchproof +snath +snathe +snathes +snaths +snattock +snavel +snavvle +snaw +snawed +snawing +snawle +snaws +snazzy +snazzier +snazziest +snazziness +snead +sneak +sneakbox +sneaked +sneaker +sneakered +sneakers +sneaky +sneakier +sneakiest +sneakily +sneakiness +sneaking +sneakingly +sneakingness +sneakish +sneakishly +sneakishness +sneaks +sneaksby +sneaksman +sneap +sneaped +sneaping +sneaps +sneath +sneathe +sneb +sneck +sneckdraw +sneckdrawing +sneckdrawn +snecked +snecker +snecket +snecking +snecks +sned +snedded +snedding +sneds +snee +sneer +sneered +sneerer +sneerers +sneerful +sneerfulness +sneery +sneering +sneeringly +sneerless +sneers +sneesh +sneeshes +sneeshing +sneest +sneesty +sneeze +sneezed +sneezeless +sneezeproof +sneezer +sneezers +sneezes +sneezeweed +sneezewood +sneezewort +sneezy +sneezier +sneeziest +sneezing +snell +sneller +snellest +snelly +snells +snemovna +snerp +snew +sny +snyaptic +snib +snibbed +snibbing +snibble +snibbled +snibbler +snibel +snibs +snicher +snick +snickdraw +snickdrawing +snicked +snickey +snicker +snickered +snickerer +snickery +snickering +snickeringly +snickers +snickersnee +snicket +snicking +snickle +snicks +sniddle +snide +snidely +snideness +snider +snidery +snidest +snye +snyed +snies +snyes +sniff +sniffable +sniffed +sniffer +sniffers +sniffy +sniffier +sniffiest +sniffily +sniffiness +sniffing +sniffingly +sniffish +sniffishly +sniffishness +sniffle +sniffled +sniffler +snifflers +sniffles +sniffly +sniffling +sniffs +snift +snifted +snifter +snifters +snifty +snifting +snig +snigged +snigger +sniggered +sniggerer +sniggering +sniggeringly +sniggers +snigging +sniggle +sniggled +sniggler +snigglers +sniggles +sniggling +sniggoringly +snight +snigs +snying +snip +snipe +snipebill +sniped +snipefish +snipefishes +snipelike +sniper +snipers +sniperscope +snipes +snipesbill +snipy +sniping +snipish +snipjack +snipnose +snipocracy +snipped +snipper +snipperado +snippers +snippersnapper +snipperty +snippet +snippety +snippetier +snippetiest +snippetiness +snippets +snippy +snippier +snippiest +snippily +snippiness +snipping +snippish +snips +snipsnapsnorum +sniptious +snirl +snirt +snirtle +snit +snitch +snitched +snitcher +snitchers +snitches +snitchy +snitchier +snitchiest +snitching +snite +snithe +snithy +snits +snittle +snitz +snivey +snivel +sniveled +sniveler +snivelers +snively +sniveling +snivelled +sniveller +snivelly +snivelling +snivels +snivy +snob +snobber +snobbery +snobberies +snobbers +snobbess +snobby +snobbier +snobbiest +snobbily +snobbiness +snobbing +snobbish +snobbishly +snobbishness +snobbism +snobbisms +snobdom +snobism +snobling +snobocracy +snobocrat +snobographer +snobography +snobol +snobologist +snobonomer +snobs +snobscat +snocat +snocher +snock +snocker +snod +snodly +snoek +snoeking +snog +snoga +snohomish +snoke +snollygoster +snonowas +snood +snooded +snooding +snoods +snook +snooked +snooker +snookered +snookers +snooking +snooks +snookums +snool +snooled +snooling +snools +snoop +snooped +snooper +snoopers +snooperscope +snoopy +snoopier +snoopiest +snoopily +snooping +snoops +snoose +snoot +snooted +snootful +snootfuls +snooty +snootier +snootiest +snootily +snootiness +snooting +snoots +snoove +snooze +snoozed +snoozer +snoozers +snoozes +snoozy +snoozier +snooziest +snooziness +snoozing +snoozle +snoozled +snoozles +snoozling +snop +snoqualmie +snoquamish +snore +snored +snoreless +snorer +snorers +snores +snoring +snoringly +snork +snorkel +snorkeled +snorkeler +snorkeling +snorkels +snorker +snort +snorted +snorter +snorters +snorty +snorting +snortingly +snortle +snorts +snot +snots +snotter +snottery +snotty +snottie +snottier +snottiest +snottily +snottiness +snouch +snout +snouted +snouter +snoutfair +snouty +snoutier +snoutiest +snouting +snoutish +snoutless +snoutlike +snouts +snow +snowball +snowballed +snowballing +snowballs +snowbank +snowbanks +snowbell +snowbells +snowbelt +snowberg +snowberry +snowberries +snowbird +snowbirds +snowblink +snowblower +snowbound +snowbreak +snowbridge +snowbroth +snowbrush +snowbush +snowbushes +snowcap +snowcapped +snowcaps +snowcraft +snowcreep +snowdon +snowdonian +snowdrift +snowdrifts +snowdrop +snowdrops +snowed +snowfall +snowfalls +snowfield +snowflake +snowflakes +snowflight +snowflower +snowfowl +snowhammer +snowhouse +snowy +snowie +snowier +snowiest +snowily +snowiness +snowing +snowish +snowk +snowl +snowland +snowlands +snowless +snowlike +snowmaker +snowmaking +snowman +snowmanship +snowmast +snowmelt +snowmelts +snowmen +snowmobile +snowmobiler +snowmobilers +snowmobiles +snowmobiling +snowpack +snowpacks +snowplough +snowplow +snowplowed +snowplowing +snowplows +snowproof +snows +snowscape +snowshade +snowshed +snowsheds +snowshine +snowshoe +snowshoed +snowshoeing +snowshoer +snowshoes +snowshoing +snowslide +snowslip +snowstorm +snowstorms +snowsuit +snowsuits +snowthrower +snowworm +snozzle +snub +snubbable +snubbed +snubbee +snubber +snubbers +snubby +snubbier +snubbiest +snubbiness +snubbing +snubbingly +snubbish +snubbishly +snubbishness +snubness +snubnesses +snubnose +snubproof +snubs +snuck +snudge +snudgery +snuff +snuffbox +snuffboxer +snuffboxes +snuffcolored +snuffed +snuffer +snuffers +snuffy +snuffier +snuffiest +snuffily +snuffiness +snuffing +snuffingly +snuffish +snuffkin +snuffle +snuffled +snuffler +snufflers +snuffles +snuffless +snuffly +snufflier +snuffliest +snuffliness +snuffling +snufflingly +snuffman +snuffs +snug +snugged +snugger +snuggery +snuggerie +snuggeries +snuggest +snuggies +snugging +snuggish +snuggle +snuggled +snuggles +snuggly +snuggling +snugify +snugly +snugness +snugnesses +snugs +snum +snup +snupper +snur +snurl +snurly +snurp +snurt +snuzzle +so +soak +soakage +soakages +soakaway +soaked +soaken +soaker +soakers +soaky +soaking +soakingly +soakman +soaks +soally +soallies +soam +soap +soapbark +soapbarks +soapberry +soapberries +soapbox +soapboxer +soapboxes +soapbubbly +soapbush +soaped +soaper +soapery +soaperies +soapers +soapfish +soapfishes +soapi +soapy +soapier +soapiest +soapily +soapiness +soaping +soaplees +soapless +soaplike +soapmaker +soapmaking +soapmonger +soapolallie +soaprock +soaproot +soaps +soapstone +soapstoner +soapstones +soapsud +soapsuddy +soapsuds +soapsudsy +soapweed +soapwood +soapworks +soapwort +soapworts +soar +soarability +soarable +soared +soarer +soarers +soary +soaring +soaringly +soarings +soars +soave +soavemente +soaves +sob +sobbed +sobber +sobbers +sobby +sobbing +sobbingly +sobeit +sober +sobered +soberer +soberest +sobering +soberingly +soberize +soberized +soberizes +soberizing +soberly +soberlike +soberness +sobers +sobersault +sobersided +sobersidedly +sobersidedness +sobersides +soberwise +sobful +sobole +soboles +soboliferous +sobproof +sobralia +sobralite +sobranje +sobrevest +sobriety +sobrieties +sobriquet +sobriquetical +sobriquets +sobs +soc +socage +socager +socagers +socages +soccage +soccages +soccer +soccerist +soccerite +soccers +soce +socht +sociability +sociabilities +sociable +sociableness +sociables +sociably +social +sociales +socialisation +socialise +socialised +socialising +socialism +socialist +socialistic +socialistically +socialists +socialite +socialites +sociality +socialities +socializable +socialization +socializations +socialize +socialized +socializer +socializers +socializes +socializing +socially +socialness +socials +sociate +sociation +sociative +socies +societal +societally +societary +societarian +societarianism +societas +societe +societeit +society +societies +societyese +societified +societyish +societyless +societism +societist +societology +societologist +socii +socinian +socinianism +socinianistic +socinianize +sociobiology +sociobiological +sociocentric +sociocentricity +sociocentrism +sociocracy +sociocrat +sociocratic +sociocultural +socioculturally +sociodrama +sociodramatic +socioeconomic +socioeconomically +socioeducational +sociogenesis +sociogenetic +sociogeny +sociogenic +sociogram +sociography +sociol +sociolatry +sociolegal +sociolinguistic +sociolinguistics +sociologese +sociology +sociologian +sociologic +sociological +sociologically +sociologies +sociologism +sociologist +sociologistic +sociologistically +sociologists +sociologize +sociologized +sociologizer +sociologizing +sociomedical +sociometry +sociometric +socionomy +socionomic +socionomics +sociopath +sociopathy +sociopathic +sociopathies +sociopaths +sociophagous +sociopolitical +sociopsychological +socioreligious +socioromantic +sociosexual +sociosexuality +sociosexualities +sociostatic +sociotechnical +socius +sock +sockdolager +sockdologer +socked +sockeye +sockeyes +socker +sockeroo +sockeroos +socket +socketed +socketful +socketing +socketless +sockets +sockhead +socky +socking +sockless +socklessness +sockmaker +sockmaking +sockman +sockmen +socko +socks +socle +socles +socman +socmanry +socmen +soco +socorrito +socotran +socotri +socotrine +socratean +socrates +socratic +socratical +socratically +socraticism +socratism +socratist +socratize +sod +soda +sodaclase +sodaic +sodaless +sodalist +sodalists +sodalite +sodalites +sodalithite +sodality +sodalities +sodamid +sodamide +sodamides +sodas +sodawater +sodbuster +sodded +sodden +soddened +soddening +soddenly +soddenness +soddens +soddy +soddier +soddies +soddiest +sodding +soddite +sody +sodic +sodio +sodioaluminic +sodioaurous +sodiocitrate +sodiohydric +sodioplatinic +sodiosalicylate +sodiotartrate +sodium +sodiums +sodless +sodoku +sodom +sodomy +sodomic +sodomies +sodomist +sodomite +sodomites +sodomitess +sodomitic +sodomitical +sodomitically +sodomitish +sodomize +sods +sodwork +soe +soekoe +soever +sofa +sofane +sofar +sofars +sofas +sofer +soffarid +soffione +soffioni +soffit +soffits +soffritto +sofia +sofkee +sofoklis +sofronia +soft +softa +softas +softback +softbacks +softball +softballs +softboard +softbound +softbrained +softcoal +soften +softened +softener +softeners +softening +softens +softer +softest +softhead +softheaded +softheadedly +softheadedness +softheads +softhearted +softheartedly +softheartedness +softhorn +softy +softie +softies +softish +softly +softling +softner +softness +softnesses +softs +softship +softsoap +softtack +software +softwares +softwood +softwoods +sog +soga +sogdian +sogdianese +sogdianian +sogdoite +soger +soget +soggarth +sogged +soggendalite +soggy +soggier +soggiest +soggily +sogginess +sogging +soh +soho +soy +soya +soyas +soyate +soybean +soybeans +soiesette +soign +soigne +soignee +soil +soilage +soilages +soilborne +soiled +soyled +soiledness +soily +soilier +soiliest +soiling +soilless +soilproof +soils +soilure +soilures +soyot +soir +soiree +soirees +soys +soixantine +soja +sojas +sojourn +sojourned +sojourney +sojourner +sojourners +sojourning +sojournment +sojourns +sok +soka +soke +sokeman +sokemanemot +sokemanry +sokemanries +sokemen +soken +sokes +soko +sokoki +sokotri +sokulk +sol +sola +solace +solaced +solaceful +solacement +solaceproof +solacer +solacers +solaces +solach +solacing +solacious +solaciously +solaciousness +solay +solan +solanaceae +solanaceous +solanal +solanales +soland +solander +solanders +solandra +solands +solanein +solaneine +solaneous +solania +solanicine +solanidin +solanidine +solanin +solanine +solanines +solanins +solano +solanoid +solanos +solans +solanum +solanums +solar +solary +solaria +solariego +solariia +solarimeter +solarise +solarised +solarises +solarising +solarism +solarisms +solarist +solaristic +solaristically +solaristics +solarium +solariums +solarization +solarize +solarized +solarizes +solarizing +solarometer +solate +solated +solates +solatia +solating +solation +solations +solatium +solattia +solazzi +sold +soldado +soldadoes +soldados +soldan +soldanel +soldanella +soldanelle +soldanrie +soldans +soldat +soldatesque +solder +solderability +soldered +solderer +solderers +soldering +solderless +solders +soldi +soldier +soldierbird +soldierbush +soldierdom +soldiered +soldieress +soldierfare +soldierfish +soldierfishes +soldierhearted +soldierhood +soldiery +soldieries +soldiering +soldierize +soldierly +soldierlike +soldierliness +soldierproof +soldiers +soldiership +soldierwise +soldierwood +soldo +sole +solea +soleas +solecise +solecised +solecises +solecising +solecism +solecisms +solecist +solecistic +solecistical +solecistically +solecists +solecize +solecized +solecizer +solecizes +solecizing +soled +soleidae +soleiform +soleil +solein +soleyn +soleyne +soleless +solely +solemn +solemncholy +solemner +solemness +solemnest +solemnify +solemnified +solemnifying +solemnise +solemnity +solemnities +solemnitude +solemnization +solemnize +solemnized +solemnizer +solemnizes +solemnizing +solemnly +solemnness +solen +solenacean +solenaceous +soleness +solenesses +solenette +solenial +solenidae +solenite +solenitis +solenium +solenne +solennemente +solenocyte +solenoconch +solenoconcha +solenodon +solenodont +solenodontidae +solenogaster +solenogastres +solenoglyph +solenoglypha +solenoglyphic +solenoid +solenoidal +solenoidally +solenoids +solenopsis +solenostele +solenostelic +solenostomid +solenostomidae +solenostomoid +solenostomous +solenostomus +solent +solentine +solepiece +soleplate +soleprint +soler +solera +soleret +solerets +solert +soles +soleus +solfa +solfatara +solfataric +solfege +solfeges +solfeggi +solfeggiare +solfeggio +solfeggios +solferino +solfge +solgel +soli +soliative +solicit +solicitant +solicitation +solicitationism +solicitations +solicited +solicitee +soliciter +soliciting +solicitor +solicitors +solicitorship +solicitous +solicitously +solicitousness +solicitress +solicitrix +solicits +solicitude +solicitudes +solicitudinous +solid +solidago +solidagos +solidare +solidary +solidaric +solidarily +solidarism +solidarist +solidaristic +solidarity +solidarities +solidarize +solidarized +solidarizing +solidate +solidated +solidating +solideo +solider +solidest +solidi +solidify +solidifiability +solidifiable +solidifiableness +solidification +solidified +solidifier +solidifies +solidifying +solidiform +solidillu +solidish +solidism +solidist +solidistic +solidity +solidities +solidly +solidness +solido +solidomind +solids +solidudi +solidum +solidungula +solidungular +solidungulate +solidus +solifidian +solifidianism +solifluction +solifluctional +soliform +solifugae +solifuge +solifugean +solifugid +solifugous +soliloquacious +soliloquy +soliloquies +soliloquise +soliloquised +soliloquiser +soliloquising +soliloquisingly +soliloquist +soliloquium +soliloquize +soliloquized +soliloquizer +soliloquizes +soliloquizing +soliloquizingly +solilunar +solyma +solymaean +soling +solio +solion +solions +soliped +solipedal +solipedous +solipsism +solipsismal +solipsist +solipsistic +solipsists +soliquid +soliquids +solist +soliste +solitaire +solitaires +solitary +solitarian +solitaries +solitarily +solitariness +soliterraneous +solitidal +soliton +solitons +solitude +solitudes +solitudinarian +solitudinize +solitudinized +solitudinizing +solitudinous +solivagant +solivagous +sollar +sollaria +soller +solleret +sollerets +sollya +sollicker +sollicking +solmizate +solmization +soln +solo +solod +solodi +solodization +solodize +soloecophanes +soloed +soloing +soloist +soloistic +soloists +solomon +solomonian +solomonic +solomonical +solomonitic +solon +solonchak +solonets +solonetses +solonetz +solonetzes +solonetzic +solonetzicity +solonian +solonic +solonist +solons +solos +soloth +solotink +solotnik +solpuga +solpugid +solpugida +solpugidea +solpugides +sols +solstice +solstices +solsticion +solstitia +solstitial +solstitially +solstitium +solubility +solubilities +solubilization +solubilize +solubilized +solubilizing +soluble +solubleness +solubles +solubly +solum +solums +solunar +solus +solute +solutes +solutio +solution +solutional +solutioner +solutionis +solutionist +solutions +solutive +solutize +solutizer +solutory +solutrean +solutus +solv +solvaated +solvability +solvable +solvabled +solvableness +solvabling +solvate +solvated +solvates +solvating +solvation +solve +solved +solvement +solvency +solvencies +solvend +solvent +solventless +solvently +solventproof +solvents +solver +solvers +solves +solving +solvolysis +solvolytic +solvolyze +solvolyzed +solvolyzing +solvsbergite +solvus +soma +somacule +somal +somali +somalia +somalo +somaplasm +somas +somaschian +somasthenia +somata +somatasthenia +somaten +somatenes +somateria +somatic +somatical +somatically +somaticosplanchnic +somaticovisceral +somatics +somatism +somatist +somatization +somatochrome +somatocyst +somatocystic +somatoderm +somatogenetic +somatogenic +somatognosis +somatognostic +somatology +somatologic +somatological +somatologically +somatologist +somatome +somatomic +somatophyte +somatophytic +somatoplasm +somatoplastic +somatopleural +somatopleure +somatopleuric +somatopsychic +somatosensory +somatosplanchnic +somatotype +somatotyper +somatotypy +somatotypic +somatotypically +somatotypology +somatotonia +somatotonic +somatotrophin +somatotropic +somatotropically +somatotropin +somatotropism +somatous +somatrophin +somber +somberish +somberly +somberness +sombre +sombreish +sombreite +sombrely +sombreness +sombrerite +sombrero +sombreroed +sombreros +sombrous +sombrously +sombrousness +somdel +somdiel +some +somebody +somebodies +somebodyll +someday +somedays +somedeal +somegate +somehow +someone +someonell +someones +somepart +someplace +somers +somersault +somersaulted +somersaulting +somersaults +somerset +somerseted +somersetian +somerseting +somersets +somersetted +somersetting +somervillite +somesthesia +somesthesis +somesthesises +somesthetic +somet +something +somethingness +sometime +sometimes +somever +someway +someways +somewhat +somewhatly +somewhatness +somewhats +somewhen +somewhence +somewhere +somewheres +somewhy +somewhile +somewhiles +somewhither +somewise +somital +somite +somites +somitic +somler +somma +sommaite +sommelier +sommeliers +sommite +somnambulance +somnambulancy +somnambulant +somnambular +somnambulary +somnambulate +somnambulated +somnambulating +somnambulation +somnambulator +somnambule +somnambulency +somnambulic +somnambulically +somnambulism +somnambulist +somnambulistic +somnambulistically +somnambulists +somnambulize +somnambulous +somne +somner +somnial +somniate +somniative +somniculous +somnifacient +somniferous +somniferously +somnify +somnific +somnifuge +somnifugous +somniloquacious +somniloquence +somniloquent +somniloquy +somniloquies +somniloquism +somniloquist +somniloquize +somniloquous +somniosus +somnipathy +somnipathist +somnivolency +somnivolent +somnolence +somnolences +somnolency +somnolencies +somnolent +somnolently +somnolescence +somnolescent +somnolism +somnolize +somnopathy +somnorific +somnus +sompay +sompne +sompner +sompnour +son +sonable +sonagram +sonance +sonances +sonancy +sonant +sonantal +sonantic +sonantina +sonantized +sonants +sonar +sonarman +sonarmen +sonars +sonata +sonatas +sonatina +sonatinas +sonatine +sonation +sonchus +soncy +sond +sondage +sondation +sonde +sondeli +sonder +sonderbund +sonderclass +sondergotter +sonders +sondes +sondylomorum +sone +soneri +sones +song +songbag +songbird +songbirds +songbook +songbooks +songcraft +songer +songfest +songfests +songful +songfully +songfulness +songhai +songy +songish +songkok +songland +songle +songless +songlessly +songlessness +songlet +songlike +songman +songo +songoi +songs +songsmith +songster +songsters +songstress +songstresses +songworthy +songwright +songwriter +songwriters +songwriting +sonhood +sonic +sonica +sonically +sonicate +sonicated +sonicates +sonicating +sonication +sonicator +sonics +soniferous +sonification +soning +soniou +sonja +sonk +sonless +sonly +sonlike +sonlikeness +sonneratia +sonneratiaceae +sonneratiaceous +sonnet +sonnetary +sonneted +sonneteer +sonneteeress +sonnetic +sonneting +sonnetisation +sonnetise +sonnetised +sonnetish +sonnetising +sonnetist +sonnetization +sonnetize +sonnetized +sonnetizing +sonnetlike +sonnetry +sonnets +sonnetted +sonnetting +sonnetwise +sonny +sonnies +sonnikins +sonnobuoy +sonobuoy +sonogram +sonography +sonometer +sonoran +sonorant +sonorants +sonores +sonorescence +sonorescent +sonoric +sonoriferous +sonoriferously +sonorific +sonority +sonorities +sonorize +sonorophone +sonorosity +sonorous +sonorously +sonorousness +sonovox +sonovoxes +sonrai +sons +sonship +sonships +sonsy +sonsie +sonsier +sonsiest +sontag +sontenna +soochong +soochongs +soodle +soodled +soodly +soodling +sooey +soogan +soogee +soogeed +soogeeing +soogeing +soohong +soojee +sook +sooke +sooky +sookie +sool +sooloos +soom +soon +sooner +sooners +soonest +soony +soonish +soonly +sooper +soorah +soorawn +soord +sooreyn +soorkee +soorki +soorky +soorma +soosoo +soot +sooted +sooter +sooterkin +sooth +soothe +soothed +soother +sootherer +soothers +soothes +soothest +soothfast +soothfastly +soothfastness +soothful +soothing +soothingly +soothingness +soothless +soothly +sooths +soothsay +soothsaid +soothsayer +soothsayers +soothsayership +soothsaying +soothsays +soothsaw +sooty +sootied +sootier +sootiest +sootying +sootily +sootylike +sootiness +sooting +sootish +sootless +sootlike +sootproof +soots +sop +sope +soph +sopheme +sophene +sopher +sopheric +sopherim +sophy +sophia +sophian +sophic +sophical +sophically +sophies +sophiology +sophiologic +sophism +sophisms +sophist +sophister +sophistic +sophistical +sophistically +sophisticalness +sophisticant +sophisticate +sophisticated +sophisticatedly +sophisticates +sophisticating +sophistication +sophisticative +sophisticator +sophisticism +sophistress +sophistry +sophistries +sophists +sophoclean +sophocles +sophomore +sophomores +sophomoric +sophomorical +sophomorically +sophora +sophoria +sophronia +sophronize +sophronized +sophronizing +sophrosyne +sophs +sophta +sopite +sopited +sopites +sopiting +sopition +sopor +soporate +soporiferous +soporiferously +soporiferousness +soporific +soporifical +soporifically +soporifics +soporifousness +soporose +soporous +sopors +sopped +sopper +soppy +soppier +soppiest +soppiness +sopping +soprani +sopranino +sopranist +soprano +sopranos +sops +sora +sorabian +sorage +soral +soralium +sorance +soras +sorb +sorbability +sorbable +sorbaria +sorbate +sorbates +sorbed +sorbefacient +sorbent +sorbents +sorbet +sorbets +sorbian +sorbic +sorbile +sorbin +sorbing +sorbinose +sorbish +sorbitan +sorbite +sorbitic +sorbitize +sorbitol +sorbitols +sorbol +sorbonic +sorbonical +sorbonist +sorbonne +sorbose +sorboses +sorbosid +sorboside +sorbs +sorbus +sorcer +sorcerer +sorcerers +sorceress +sorceresses +sorcery +sorceries +sorcering +sorcerize +sorcerous +sorcerously +sorchin +sord +sorda +sordamente +sordaria +sordariaceae +sordavalite +sordawalite +sordellina +sordello +sordes +sordid +sordidity +sordidly +sordidness +sordine +sordines +sordini +sordino +sordo +sordor +sords +sore +soreddia +soredia +soredial +sorediate +sorediferous +sorediform +soredioid +soredium +soree +sorefalcon +sorefoot +sorehawk +sorehead +soreheaded +soreheadedly +soreheadedness +soreheads +sorehearted +sorehon +sorel +sorely +sorels +sorema +soreness +sorenesses +sorer +sores +sorest +sorex +sorghe +sorgho +sorghos +sorghum +sorghums +sorgo +sorgos +sori +sory +soricid +soricidae +soricident +soricinae +soricine +soricoid +soricoidea +soriferous +sorite +sorites +soritic +soritical +sorn +sornare +sornari +sorned +sorner +sorners +sorning +sorns +soroban +soroche +soroches +soroptimist +sororal +sororate +sororates +sororial +sororially +sororicidal +sororicide +sorority +sororities +sororize +sorose +soroses +sorosil +sorosilicate +sorosis +sorosises +sorosphere +sorosporella +sorosporium +sorption +sorptions +sorptive +sorra +sorrance +sorrel +sorrels +sorren +sorrento +sorry +sorrier +sorriest +sorryhearted +sorryish +sorrily +sorriness +sorroa +sorrow +sorrowed +sorrower +sorrowers +sorrowful +sorrowfully +sorrowfulness +sorrowy +sorrowing +sorrowingly +sorrowless +sorrowlessly +sorrowlessness +sorrowproof +sorrows +sort +sortable +sortably +sortal +sortance +sortation +sorted +sorter +sorters +sortes +sorty +sortiary +sortie +sortied +sortieing +sorties +sortilege +sortileger +sortilegi +sortilegy +sortilegic +sortilegious +sortilegus +sortiment +sorting +sortita +sortition +sortly +sortlige +sortment +sorts +sortwith +sorus +sorva +sos +sosh +soshed +sosia +sosie +soso +sosoish +sospiro +sospita +sosquil +soss +sossiego +sossle +sostenendo +sostenente +sostenuti +sostenuto +sostenutos +sostinente +sostinento +sot +sotadean +sotadic +soter +soteres +soterial +soteriology +soteriologic +soteriological +soth +sothiac +sothiacal +sothic +sothis +sotho +soths +sotie +sotik +sotnia +sotnik +sotol +sotols +sots +sottage +sotted +sottedness +sotter +sottery +sottie +sotting +sottise +sottish +sottishly +sottishness +sotweed +sou +souagga +souamosa +souamula +souari +souaris +soubise +soubises +soubresaut +soubresauts +soubrette +soubrettes +soubrettish +soubriquet +soucar +soucars +souchet +souchy +souchie +souchong +souchongs +soud +soudagur +soudan +soudans +soudge +soudgy +soueak +soueef +soueege +souffl +souffle +souffleed +souffleing +souffles +souffleur +soufousse +sougan +sough +soughed +sougher +soughfully +soughing +soughless +soughs +sought +souhegan +souk +soul +soulack +soulbell +soulcake +souldie +souled +souletin +soulful +soulfully +soulfulness +soulheal +soulhealth +souly +soulical +soulish +soulless +soullessly +soullessness +soullike +soulmass +soulpence +soulpenny +souls +soulsaving +soulter +soultre +soulward +soulx +soulz +soum +soumak +soumansite +soumarque +sound +soundable +soundage +soundboard +soundboards +soundbox +soundboxes +sounded +sounder +sounders +soundest +soundful +soundheaded +soundheadedness +soundhearted +soundheartednes +soundheartedness +sounding +soundingly +soundingness +soundings +soundless +soundlessly +soundlessness +soundly +soundness +soundpost +soundproof +soundproofed +soundproofing +soundproofs +sounds +soundscape +soundstripe +soundtrack +soundtracks +soup +soupbone +soupcon +soupcons +souped +souper +soupfin +soupy +soupier +soupiere +soupieres +soupiest +souping +souple +soupled +soupless +souplike +soupling +soupmeat +soupon +soups +soupspoon +sour +sourball +sourballs +sourbelly +sourbellies +sourberry +sourberries +sourbread +sourbush +sourcake +source +sourceful +sourcefulness +sourceless +sources +sourcrout +sourd +sourdeline +sourdine +sourdines +sourdock +sourdook +sourdough +sourdoughs +sourdre +soured +souredness +souren +sourer +sourest +sourhearted +soury +souring +sourish +sourishly +sourishness +sourjack +sourly +sourling +sourness +sournesses +sourock +sourpuss +sourpussed +sourpusses +sours +soursop +soursops +sourtop +sourveld +sourweed +sourwood +sourwoods +sous +sousaphone +sousaphonist +souse +soused +souser +souses +sousewife +soushy +sousing +souslik +soutache +soutaches +soutage +soutane +soutanes +soutar +souteneur +soutenu +souter +souterly +souterrain +souters +south +southard +southbound +southcottian +southdown +southeast +southeaster +southeasterly +southeastern +southeasterner +southeasternmost +southeasters +southeastward +southeastwardly +southeastwards +southed +souther +southerland +southerly +southerlies +southerliness +southermost +southern +southerner +southerners +southernest +southernism +southernize +southernly +southernliness +southernmost +southernness +southerns +southernwood +southers +southing +southings +southland +southlander +southly +southmost +southness +southpaw +southpaws +southron +southronie +southrons +souths +southumbrian +southward +southwardly +southwards +southwest +southwester +southwesterly +southwesterlies +southwestern +southwesterner +southwesterners +southwesternmost +southwesters +southwestward +southwestwardly +southwestwards +southwood +soutter +souush +souushy +souvenir +souvenirs +souverain +souvlaki +souwester +sov +sovenance +sovenez +sovereign +sovereigness +sovereignize +sovereignly +sovereignness +sovereigns +sovereignship +sovereignty +sovereignties +soverty +soviet +sovietdom +sovietic +sovietism +sovietist +sovietistic +sovietization +sovietize +sovietized +sovietizes +sovietizing +soviets +sovite +sovkhos +sovkhose +sovkhoz +sovkhozes +sovkhozy +sovprene +sovran +sovranly +sovrans +sovranty +sovranties +sow +sowable +sowan +sowans +sowar +sowarree +sowarry +sowars +sowback +sowbacked +sowbane +sowbelly +sowbellies +sowbread +sowbreads +sowcar +sowcars +sowder +sowdones +sowed +sowel +sowens +sower +sowers +sowf +sowfoot +sowing +sowins +sowish +sowl +sowle +sowlike +sowlth +sown +sows +sowse +sowt +sowte +sox +soxhlet +sozin +sozine +sozines +sozins +sozly +sozolic +sozzle +sozzled +sozzly +sp +spa +spaad +space +spaceband +spaceborne +spacecraft +spaced +spaceflight +spaceflights +spaceful +spaceless +spaceman +spacemanship +spacemen +spaceport +spacer +spacers +spaces +spacesaving +spaceship +spaceships +spacesuit +spacesuits +spacetime +spacewalk +spacewalked +spacewalker +spacewalkers +spacewalking +spacewalks +spaceward +spacewoman +spacewomen +spacy +spacial +spaciality +spacially +spaciness +spacing +spacings +spaciosity +spaciotemporal +spacious +spaciously +spaciousness +spacistor +spack +spackle +spackled +spackling +spad +spadaite +spadassin +spaddle +spade +spadebone +spaded +spadefish +spadefoot +spadeful +spadefuls +spadelike +spademan +spademen +spader +spaders +spades +spadesman +spadewise +spadework +spadger +spadiard +spadiceous +spadices +spadicifloral +spadiciflorous +spadiciform +spadicose +spadilla +spadille +spadilles +spadillo +spading +spadish +spadix +spadixes +spado +spadone +spadones +spadonic +spadonism +spadrone +spadroon +spae +spaebook +spaecraft +spaed +spaedom +spaeing +spaeings +spaeman +spaer +spaes +spaetzle +spaewife +spaewoman +spaework +spaewright +spag +spagetti +spaghetti +spaghettini +spagyric +spagyrical +spagyrically +spagyrics +spagyrist +spagnuoli +spagnuolo +spahee +spahees +spahi +spahis +spay +spayad +spayard +spaid +spayed +spaying +spaik +spail +spails +spain +spair +spairge +spays +spait +spaits +spak +spake +spaked +spalacid +spalacidae +spalacine +spalax +spald +spalder +spalding +spale +spales +spall +spallable +spallation +spalled +spaller +spallers +spalling +spalls +spalpeen +spalpeens +spalt +spam +spammed +spamming +span +spanaemia +spanaemic +spancel +spanceled +spanceling +spancelled +spancelling +spancels +spandex +spandy +spandle +spandrel +spandrels +spandril +spandrils +spane +spaned +spanemy +spanemia +spanemic +spang +spanged +spanghew +spanging +spangle +spangled +spangler +spangles +spanglet +spangly +spanglier +spangliest +spangling +spangolite +spaniard +spaniardization +spaniardize +spaniardo +spaniards +spaniel +spaniellike +spaniels +spanielship +spaning +spaniol +spaniolate +spanioli +spaniolize +spanipelagic +spanish +spanishize +spanishly +spank +spanked +spanker +spankers +spanky +spankily +spanking +spankingly +spankings +spankled +spanks +spanless +spann +spanned +spannel +spanner +spannerman +spannermen +spanners +spanning +spanopnea +spanopnoea +spanpiece +spans +spanspek +spantoon +spanule +spanworm +spanworms +spar +sparable +sparables +sparada +sparadrap +sparage +sparagrass +sparagus +sparassis +sparassodont +sparassodonta +sparaxis +sparch +spare +spareable +spared +spareful +spareless +sparely +spareness +sparer +sparerib +spareribs +sparers +spares +sparesome +sparest +sparganiaceae +sparganium +sparganosis +sparganum +sparge +sparged +spargefication +sparger +spargers +sparges +sparging +spargosis +sparhawk +spary +sparid +sparidae +sparids +sparily +sparing +sparingly +sparingness +spark +sparkback +sparked +sparker +sparkers +sparky +sparkier +sparkiest +sparkily +sparkiness +sparking +sparkingly +sparkish +sparkishly +sparkishness +sparkle +sparkleberry +sparkled +sparkler +sparklers +sparkles +sparkless +sparklessly +sparklet +sparkly +sparklike +sparkliness +sparkling +sparklingly +sparklingness +sparkplug +sparkplugged +sparkplugging +sparkproof +sparks +sparlike +sparling +sparlings +sparm +sparmannia +sparnacian +sparoid +sparoids +sparpiece +sparple +sparpled +sparpling +sparred +sparrer +sparry +sparrier +sparriest +sparrygrass +sparring +sparringly +sparrow +sparrowbill +sparrowcide +sparrowdom +sparrowgrass +sparrowhawk +sparrowy +sparrowish +sparrowless +sparrowlike +sparrows +sparrowtail +sparrowtongue +sparrowwort +spars +sparse +sparsedly +sparsely +sparseness +sparser +sparsest +sparsile +sparsim +sparsioplast +sparsity +sparsities +spart +sparta +spartacan +spartacide +spartacism +spartacist +spartan +spartanhood +spartanic +spartanically +spartanism +spartanize +spartanly +spartanlike +spartans +spartein +sparteine +sparterie +sparth +spartiate +spartina +spartium +spartle +spartled +spartling +sparus +sparver +spas +spasm +spasmatic +spasmatical +spasmatomancy +spasmed +spasmic +spasmodic +spasmodical +spasmodically +spasmodicalness +spasmodism +spasmodist +spasmolysant +spasmolysis +spasmolytic +spasmolytically +spasmophile +spasmophilia +spasmophilic +spasmotin +spasmotoxin +spasmotoxine +spasmous +spasms +spasmus +spass +spastic +spastically +spasticity +spasticities +spastics +spat +spatalamancy +spatangida +spatangina +spatangoid +spatangoida +spatangoidea +spatangoidean +spatangus +spatchcock +spate +spated +spates +spath +spatha +spathaceous +spathae +spathal +spathe +spathed +spatheful +spathes +spathic +spathyema +spathiflorae +spathiform +spathilae +spathilla +spathillae +spathose +spathous +spathulate +spatial +spatialism +spatialist +spatiality +spatialization +spatialize +spatially +spatiate +spatiation +spatilomancy +spating +spatio +spatiography +spatiotemporal +spatiotemporally +spatium +spatling +spatlum +spats +spattania +spatted +spattee +spatter +spatterdash +spatterdashed +spatterdasher +spatterdashes +spatterdock +spattered +spattering +spatteringly +spatterproof +spatters +spatterware +spatterwork +spatting +spattle +spattled +spattlehoe +spattling +spatula +spatulamancy +spatular +spatulas +spatulate +spatulation +spatule +spatuliform +spatulose +spatulous +spatzle +spaught +spauld +spaulder +spauldrochy +spave +spaver +spavie +spavied +spavies +spaviet +spavin +spavindy +spavine +spavined +spavins +spavit +spawl +spawler +spawling +spawn +spawneater +spawned +spawner +spawners +spawny +spawning +spawns +speak +speakable +speakableness +speakably +speakablies +speakeasy +speakeasies +speaker +speakeress +speakerphone +speakers +speakership +speakhouse +speakie +speakies +speaking +speakingly +speakingness +speakings +speakless +speaklessly +speaks +speal +spealbone +spean +speaned +speaning +speans +spear +spearcast +speared +speareye +spearer +spearers +spearfish +spearfishes +spearflower +spearhead +spearheaded +spearheading +spearheads +speary +spearing +spearlike +spearman +spearmanship +spearmen +spearmint +spearmints +spearproof +spears +spearsman +spearsmen +spearwood +spearwort +speave +spec +specchie +spece +special +specialer +specialest +specialisation +specialise +specialised +specialising +specialism +specialist +specialistic +specialists +speciality +specialities +specialization +specializations +specialize +specialized +specializer +specializes +specializing +specially +specialness +specials +specialty +specialties +speciate +speciated +speciates +speciating +speciation +speciational +specie +species +speciesism +speciestaler +specif +specify +specifiable +specific +specifical +specificality +specifically +specificalness +specificate +specificated +specificating +specification +specifications +specificative +specificatively +specificity +specificities +specificize +specificized +specificizing +specificly +specificness +specifics +specified +specifier +specifiers +specifies +specifying +specifist +specillum +specimen +specimenize +specimenized +specimens +speciology +speciosity +speciosities +specious +speciously +speciousness +speck +specked +speckedness +speckfall +specky +speckier +speckiest +speckiness +specking +speckle +specklebelly +specklebreast +speckled +speckledbill +speckledy +speckledness +specklehead +speckles +speckless +specklessly +specklessness +speckly +speckliness +speckling +speckproof +specks +specksioneer +specs +specsartine +spect +spectacle +spectacled +spectacleless +spectaclelike +spectaclemaker +spectaclemaking +spectacles +spectacular +spectacularism +spectacularity +spectacularly +spectaculars +spectant +spectate +spectated +spectates +spectating +spectator +spectatordom +spectatory +spectatorial +spectators +spectatorship +spectatress +spectatrix +specter +spectered +specterlike +specters +specting +spector +spectra +spectral +spectralism +spectrality +spectrally +spectralness +spectre +spectred +spectres +spectry +spectrobolograph +spectrobolographic +spectrobolometer +spectrobolometric +spectrochemical +spectrochemistry +spectrocolorimetry +spectrocomparator +spectroelectric +spectrofluorimeter +spectrofluorometer +spectrofluorometry +spectrofluorometric +spectrogram +spectrograms +spectrograph +spectrographer +spectrography +spectrographic +spectrographically +spectrographies +spectrographs +spectroheliogram +spectroheliograph +spectroheliography +spectroheliographic +spectrohelioscope +spectrohelioscopic +spectrology +spectrological +spectrologically +spectrometer +spectrometers +spectrometry +spectrometric +spectrometries +spectromicroscope +spectromicroscopical +spectrophoby +spectrophobia +spectrophone +spectrophonic +spectrophotoelectric +spectrophotograph +spectrophotography +spectrophotometer +spectrophotometry +spectrophotometric +spectrophotometrical +spectrophotometrically +spectropyrheliometer +spectropyrometer +spectropolarimeter +spectropolariscope +spectroradiometer +spectroradiometry +spectroradiometric +spectroscope +spectroscopes +spectroscopy +spectroscopic +spectroscopical +spectroscopically +spectroscopies +spectroscopist +spectroscopists +spectrotelescope +spectrous +spectrum +spectrums +specttra +specula +specular +specularia +specularity +specularly +speculate +speculated +speculates +speculating +speculation +speculations +speculatist +speculative +speculatively +speculativeness +speculativism +speculator +speculatory +speculators +speculatrices +speculatrix +speculist +speculum +speculums +specus +sped +speece +speech +speechcraft +speecher +speeches +speechful +speechfulness +speechify +speechification +speechified +speechifier +speechifying +speeching +speechless +speechlessly +speechlessness +speechlore +speechmaker +speechmaking +speechment +speechway +speed +speedaway +speedball +speedboat +speedboater +speedboating +speedboatman +speedboats +speeded +speeder +speeders +speedful +speedfully +speedfulness +speedgun +speedy +speedier +speediest +speedily +speediness +speeding +speedingly +speedingness +speedings +speedless +speedly +speedlight +speedo +speedometer +speedometers +speeds +speedster +speedup +speedups +speedway +speedways +speedwalk +speedwell +speedwells +speel +speeled +speeling +speelken +speelless +speels +speen +speer +speered +speering +speerings +speerity +speers +speyeria +speight +speil +speiled +speiling +speils +speir +speired +speiring +speirs +speise +speises +speiskobalt +speiss +speisscobalt +speisses +spekboom +spekt +spelaean +spelaeology +spelbinding +spelbound +spelder +spelding +speldring +speldron +spelean +speleology +speleological +speleologist +speleologists +spelk +spell +spellable +spellbind +spellbinder +spellbinders +spellbinding +spellbinds +spellbound +spellcasting +spellcraft +spelldown +spelldowns +spelled +speller +spellers +spellful +spellican +spelling +spellingdown +spellingly +spellings +spellken +spellmonger +spellproof +spells +spellword +spellwork +spelman +spelt +spelter +spelterman +speltermen +spelters +speltoid +spelts +speltz +speltzes +speluncar +speluncean +spelunk +spelunked +spelunker +spelunkers +spelunking +spelunks +spence +spencean +spencer +spencerian +spencerianism +spencerism +spencerite +spencers +spences +spency +spencie +spend +spendable +spender +spenders +spendful +spendible +spending +spendings +spendless +spends +spendthrift +spendthrifty +spendthriftiness +spendthriftness +spendthrifts +spenerism +spenglerian +spense +spenserian +spent +speos +speotyto +sperable +sperage +speramtozoon +speranza +sperate +spere +spergillum +spergula +spergularia +sperity +sperket +sperling +sperm +sperma +spermaceti +spermacetilike +spermaduct +spermagonia +spermagonium +spermalist +spermania +spermaphyta +spermaphyte +spermaphytic +spermary +spermaries +spermarium +spermashion +spermata +spermatangium +spermatheca +spermathecae +spermathecal +spermatia +spermatial +spermatic +spermatically +spermatid +spermatiferous +spermatin +spermatiogenous +spermation +spermatiophore +spermatism +spermatist +spermatitis +spermatium +spermatize +spermatoblast +spermatoblastic +spermatocele +spermatocidal +spermatocide +spermatocyst +spermatocystic +spermatocystitis +spermatocytal +spermatocyte +spermatogemma +spermatogene +spermatogenesis +spermatogenetic +spermatogeny +spermatogenic +spermatogenous +spermatogonia +spermatogonial +spermatogonium +spermatoid +spermatolysis +spermatolytic +spermatophyta +spermatophyte +spermatophytic +spermatophobia +spermatophoral +spermatophore +spermatophorous +spermatoplasm +spermatoplasmic +spermatoplast +spermatorrhea +spermatorrhoea +spermatospore +spermatotheca +spermatova +spermatovum +spermatoxin +spermatozoa +spermatozoal +spermatozoan +spermatozoic +spermatozoid +spermatozoio +spermatozoon +spermatozzoa +spermaturia +spermy +spermic +spermicidal +spermicide +spermidin +spermidine +spermiducal +spermiduct +spermigerous +spermin +spermine +spermines +spermiogenesis +spermism +spermist +spermoblast +spermoblastic +spermocarp +spermocenter +spermoderm +spermoduct +spermogenesis +spermogenous +spermogone +spermogonia +spermogoniferous +spermogonium +spermogonnia +spermogonous +spermolysis +spermolytic +spermologer +spermology +spermological +spermologist +spermophile +spermophiline +spermophilus +spermophyta +spermophyte +spermophytic +spermophobia +spermophore +spermophorium +spermosphere +spermotheca +spermotoxin +spermous +spermoviduct +sperms +spermule +speron +speronara +speronaras +speronares +speronaro +speronaroes +speronaros +sperone +sperple +sperrylite +sperse +spessartine +spessartite +spet +spetch +spetches +spete +spetrophoby +spettle +speuchan +spew +spewed +spewer +spewers +spewy +spewier +spewiest +spewiness +spewing +spews +spex +sphacel +sphacelaria +sphacelariaceae +sphacelariaceous +sphacelariales +sphacelate +sphacelated +sphacelating +sphacelation +sphacelia +sphacelial +sphacelism +sphaceloderma +sphaceloma +sphacelotoxin +sphacelous +sphacelus +sphaeralcea +sphaeraphides +sphaerella +sphaerenchyma +sphaeriaceae +sphaeriaceous +sphaeriales +sphaeridia +sphaeridial +sphaeridium +sphaeriidae +sphaerioidaceae +sphaeripium +sphaeristeria +sphaeristerium +sphaerite +sphaerium +sphaeroblast +sphaerobolaceae +sphaerobolus +sphaerocarpaceae +sphaerocarpales +sphaerocarpus +sphaerocobaltite +sphaerococcaceae +sphaerococcaceous +sphaerococcus +sphaerolite +sphaerolitic +sphaeroma +sphaeromidae +sphaerophoraceae +sphaerophorus +sphaeropsidaceae +sphaeropsidales +sphaeropsis +sphaerosiderite +sphaerosome +sphaerospore +sphaerostilbe +sphaerotheca +sphaerotilus +sphagia +sphagion +sphagnaceae +sphagnaceous +sphagnales +sphagnicolous +sphagnology +sphagnologist +sphagnous +sphagnum +sphagnums +sphakiot +sphalerite +sphalm +sphalma +sphargis +sphecid +sphecidae +sphecina +sphecius +sphecoid +sphecoidea +spheges +sphegid +sphegidae +sphegoidea +sphendone +sphene +sphenes +sphenethmoid +sphenethmoidal +sphenic +sphenion +spheniscan +sphenisci +spheniscidae +sphenisciformes +spheniscine +spheniscomorph +spheniscomorphae +spheniscomorphic +spheniscus +sphenobasilar +sphenobasilic +sphenocephaly +sphenocephalia +sphenocephalic +sphenocephalous +sphenodon +sphenodont +sphenodontia +sphenodontidae +sphenoethmoid +sphenoethmoidal +sphenofrontal +sphenogram +sphenographer +sphenography +sphenographic +sphenographist +sphenoid +sphenoidal +sphenoiditis +sphenoids +sphenolith +sphenomalar +sphenomandibular +sphenomaxillary +sphenopalatine +sphenoparietal +sphenopetrosal +sphenophyllaceae +sphenophyllaceous +sphenophyllales +sphenophyllum +sphenophorus +sphenopsid +sphenopteris +sphenosquamosal +sphenotemporal +sphenotic +sphenotribe +sphenotripsy +sphenoturbinal +sphenovomerine +sphenozygomatic +spherable +spheradian +spheral +spherality +spheraster +spheration +sphere +sphered +sphereless +spherelike +spheres +sphery +spheric +spherical +sphericality +spherically +sphericalness +sphericist +sphericity +sphericities +sphericle +sphericocylindrical +sphericotetrahedral +sphericotriangular +spherics +spherier +spheriest +spherify +spheriform +sphering +spheroconic +spherocrystal +spherograph +spheroid +spheroidal +spheroidally +spheroidic +spheroidical +spheroidically +spheroidicity +spheroidism +spheroidity +spheroidize +spheroids +spherome +spheromere +spherometer +spheroplast +spheroquartic +spherosome +spherula +spherular +spherulate +spherule +spherules +spherulite +spherulitic +spherulitize +spheterize +sphex +sphexide +sphygmia +sphygmic +sphygmochronograph +sphygmodic +sphygmogram +sphygmograph +sphygmography +sphygmographic +sphygmographies +sphygmoid +sphygmology +sphygmomanometer +sphygmomanometers +sphygmomanometry +sphygmomanometric +sphygmomanometrically +sphygmometer +sphygmometric +sphygmophone +sphygmophonic +sphygmoscope +sphygmus +sphygmuses +sphincter +sphincteral +sphincteralgia +sphincterate +sphincterectomy +sphincterial +sphincteric +sphincterismus +sphincteroscope +sphincteroscopy +sphincterotomy +sphincters +sphindid +sphindidae +sphindus +sphingal +sphinges +sphingid +sphingidae +sphingids +sphingiform +sphingine +sphingoid +sphingometer +sphingomyelin +sphingosin +sphingosine +sphingurinae +sphingurus +sphinx +sphinxes +sphinxian +sphinxianness +sphinxine +sphinxlike +sphyraena +sphyraenid +sphyraenidae +sphyraenoid +sphyrapicus +sphyrna +sphyrnidae +sphoeroides +sphragide +sphragistic +sphragistics +spy +spial +spyboat +spic +spica +spicae +spical +spicant +spicaria +spicas +spicate +spicated +spiccato +spiccatos +spice +spiceable +spiceberry +spiceberries +spicebush +spicecake +spiced +spiceful +spicehouse +spicey +spiceland +spiceless +spicelike +spicer +spicery +spiceries +spicers +spices +spicewood +spicy +spicier +spiciest +spiciferous +spiciform +spicigerous +spicilege +spicily +spiciness +spicing +spick +spicket +spickle +spicknel +spicks +spicose +spicosity +spicous +spicousness +spics +spicula +spiculae +spicular +spiculate +spiculated +spiculation +spicule +spicules +spiculiferous +spiculiform +spiculigenous +spiculigerous +spiculofiber +spiculose +spiculous +spiculum +spiculumamoris +spider +spidered +spiderflower +spiderhunter +spidery +spiderier +spideriest +spiderish +spiderless +spiderlet +spiderly +spiderlike +spiderling +spiderman +spidermonkey +spiders +spiderweb +spiderwebbed +spiderwebbing +spiderwork +spiderwort +spidger +spydom +spied +spiegel +spiegeleisen +spiegels +spiel +spieled +spieler +spielers +spieling +spiels +spier +spyer +spiered +spiering +spiers +spies +spif +spyfault +spiff +spiffed +spiffy +spiffier +spiffiest +spiffily +spiffiness +spiffing +spifflicate +spifflicated +spifflication +spiflicate +spiflicated +spiflication +spig +spigelia +spigeliaceae +spigelian +spiggoty +spyglass +spyglasses +spignel +spignet +spignut +spigot +spigots +spyhole +spying +spyism +spik +spike +spikebill +spiked +spikedace +spikedaces +spikedness +spikefish +spikefishes +spikehole +spikehorn +spikelet +spikelets +spikelike +spikenard +spiker +spikers +spikes +spiketail +spiketop +spikeweed +spikewise +spiky +spikier +spikiest +spikily +spikiness +spiking +spiks +spilanthes +spile +spiled +spilehole +spiler +spiles +spileworm +spilikin +spilikins +spiling +spilings +spilite +spilitic +spill +spillable +spillage +spillages +spillbox +spilled +spiller +spillers +spillet +spilly +spillikin +spillikins +spilling +spillover +spillpipe +spillproof +spills +spillway +spillways +spilogale +spiloma +spilomas +spilosite +spilt +spilth +spilths +spilus +spin +spina +spinacene +spinaceous +spinach +spinaches +spinachlike +spinacia +spinae +spinage +spinages +spinal +spinales +spinalis +spinally +spinals +spinate +spincaster +spinder +spindlage +spindle +spindleage +spindled +spindleful +spindlehead +spindlelegs +spindlelike +spindler +spindlers +spindles +spindleshank +spindleshanks +spindletail +spindlewise +spindlewood +spindleworm +spindly +spindlier +spindliest +spindliness +spindling +spindrift +spine +spinebill +spinebone +spined +spinefinned +spinel +spineless +spinelessly +spinelessness +spinelet +spinelike +spinelle +spinelles +spinels +spines +spinescence +spinescent +spinet +spinetail +spinets +spingel +spiny +spinibulbar +spinicarpous +spinicerebellar +spinidentate +spinier +spiniest +spiniferous +spinifex +spinifexes +spiniform +spinifugal +spinigerous +spinigrade +spininess +spinipetal +spinitis +spinituberculate +spink +spinless +spinnability +spinnable +spinnaker +spinnakers +spinney +spinneys +spinnel +spinner +spinneret +spinnerette +spinnery +spinneries +spinners +spinnerular +spinnerule +spinny +spinnies +spinning +spinningly +spinnings +spinobulbar +spinocarpous +spinocerebellar +spinodal +spinode +spinoff +spinoffs +spinogalvanization +spinoglenoid +spinoid +spinomuscular +spinoneural +spinoperipheral +spinor +spinors +spinose +spinosely +spinoseness +spinosympathetic +spinosity +spinosodentate +spinosodenticulate +spinosotubercular +spinosotuberculate +spinotectal +spinothalamic +spinotuberculous +spinous +spinousness +spinout +spinouts +spinozism +spinozist +spinozistic +spinproof +spins +spinster +spinsterdom +spinsterhood +spinsterial +spinsterish +spinsterishly +spinsterism +spinsterly +spinsterlike +spinsterous +spinsters +spinstership +spinstress +spinstry +spintext +spinthariscope +spinthariscopic +spintherism +spintry +spinturnix +spinula +spinulae +spinulate +spinulated +spinulation +spinule +spinules +spinulescent +spinuliferous +spinuliform +spinulosa +spinulose +spinulosely +spinulosociliate +spinulosodentate +spinulosodenticulate +spinulosogranulate +spinulososerrate +spinulous +spionid +spionidae +spioniformia +spyproof +spira +spirable +spiracle +spiracles +spiracula +spiracular +spiraculate +spiraculiferous +spiraculiform +spiraculum +spirae +spiraea +spiraeaceae +spiraeas +spiral +spirale +spiraled +spiraliform +spiraling +spiralism +spirality +spiralization +spiralize +spiralled +spirally +spiralling +spiraloid +spirals +spiraltail +spiralwise +spiran +spirane +spirant +spirantal +spiranthes +spiranthy +spiranthic +spirantic +spirantism +spirantization +spirantize +spirantized +spirantizing +spirants +spiraster +spirate +spirated +spiration +spire +spirea +spireas +spired +spiregrass +spireless +spirelet +spirem +spireme +spiremes +spirems +spirepole +spires +spireward +spirewise +spiry +spiricle +spirifer +spirifera +spiriferacea +spiriferid +spiriferidae +spiriferoid +spiriferous +spiriform +spirignath +spirignathous +spirilla +spirillaceae +spirillaceous +spirillar +spirillolysis +spirillosis +spirillotropic +spirillotropism +spirillum +spiring +spirit +spirital +spiritally +spiritdom +spirited +spiritedly +spiritedness +spiriter +spiritful +spiritfully +spiritfulness +spirithood +spirity +spiriting +spiritism +spiritist +spiritistic +spiritize +spiritlamp +spiritland +spiritleaf +spiritless +spiritlessly +spiritlessness +spiritlevel +spiritlike +spiritmonger +spiritoso +spiritous +spiritrompe +spirits +spiritsome +spiritual +spiritualisation +spiritualise +spiritualiser +spiritualism +spiritualist +spiritualistic +spiritualistically +spiritualists +spirituality +spiritualities +spiritualization +spiritualize +spiritualized +spiritualizer +spiritualizes +spiritualizing +spiritually +spiritualness +spirituals +spiritualship +spiritualty +spiritualties +spirituel +spirituelle +spirituosity +spirituous +spirituously +spirituousness +spiritus +spiritweed +spirivalve +spirket +spirketing +spirketting +spirlie +spirling +spiro +spirobranchia +spirobranchiata +spirobranchiate +spirochaeta +spirochaetaceae +spirochaetae +spirochaetal +spirochaetales +spirochaete +spirochaetosis +spirochaetotic +spirochetal +spirochete +spirochetemia +spirochetes +spirochetic +spirocheticidal +spirocheticide +spirochetosis +spirochetotic +spirodela +spirogyra +spirogram +spirograph +spirography +spirographic +spirographidin +spirographin +spirographis +spiroid +spiroidal +spiroilic +spirol +spirole +spiroloculine +spirometer +spirometry +spirometric +spirometrical +spironema +spironolactone +spiropentane +spirophyton +spirorbis +spyros +spiroscope +spirosoma +spirous +spirt +spirted +spirting +spirtle +spirts +spirula +spirulae +spirulas +spirulate +spise +spyship +spiss +spissated +spissatus +spissy +spissitude +spissus +spisula +spit +spital +spitals +spitball +spitballer +spitballs +spitbox +spitchcock +spitchcocked +spitchcocking +spite +spited +spiteful +spitefuller +spitefullest +spitefully +spitefulness +spiteless +spiteproof +spites +spitfire +spitfires +spitfrog +spitful +spithamai +spithame +spiting +spitish +spitkid +spitkit +spitous +spytower +spitpoison +spits +spitscocked +spitstick +spitsticker +spitted +spitten +spitter +spitters +spitting +spittle +spittlebug +spittlefork +spittleman +spittlemen +spittles +spittlestaff +spittoon +spittoons +spitz +spitzenberg +spitzenburg +spitzer +spitzes +spitzflute +spitzkop +spiv +spivery +spivs +spivvy +spivving +spizella +spizzerinctum +spl +splachnaceae +splachnaceous +splachnoid +splachnum +splacknuck +splad +splay +splayed +splayer +splayfeet +splayfoot +splayfooted +splaying +splaymouth +splaymouthed +splaymouths +splairge +splays +splake +splakes +splanchnapophysial +splanchnapophysis +splanchnectopia +splanchnemphraxis +splanchnesthesia +splanchnesthetic +splanchnic +splanchnicectomy +splanchnicectomies +splanchnoblast +splanchnocoele +splanchnoderm +splanchnodiastasis +splanchnodynia +splanchnographer +splanchnography +splanchnographical +splanchnolith +splanchnology +splanchnologic +splanchnological +splanchnologist +splanchnomegaly +splanchnomegalia +splanchnopathy +splanchnopleural +splanchnopleure +splanchnopleuric +splanchnoptosia +splanchnoptosis +splanchnosclerosis +splanchnoscopy +splanchnoskeletal +splanchnoskeleton +splanchnosomatic +splanchnotomy +splanchnotomical +splanchnotribe +splash +splashback +splashboard +splashdown +splashdowns +splashed +splasher +splashers +splashes +splashy +splashier +splashiest +splashily +splashiness +splashing +splashingly +splashproof +splashs +splashwing +splat +splatch +splatcher +splatchy +splather +splathering +splats +splatter +splatterdash +splatterdock +splattered +splatterer +splatterfaced +splattering +splatters +splatterwork +spleen +spleened +spleenful +spleenfully +spleeny +spleenier +spleeniest +spleening +spleenish +spleenishly +spleenishness +spleenless +spleens +spleenwort +spleet +spleetnew +splenadenoma +splenalgy +splenalgia +splenalgic +splenative +splenatrophy +splenatrophia +splenauxe +splenculi +splenculus +splendaceous +splendacious +splendaciously +splendaciousness +splendatious +splendent +splendently +splender +splendescent +splendid +splendider +splendidest +splendidious +splendidly +splendidness +splendiferous +splendiferously +splendiferousness +splendor +splendorous +splendorously +splendorousness +splendorproof +splendors +splendour +splendourproof +splendrous +splendrously +splendrousness +splenectama +splenectasis +splenectomy +splenectomies +splenectomist +splenectomize +splenectomized +splenectomizing +splenectopy +splenectopia +splenelcosis +splenemia +splenemphraxis +spleneolus +splenepatitis +splenetic +splenetical +splenetically +splenetive +splenia +splenial +splenic +splenical +splenicterus +splenification +spleniform +splenii +spleninii +spleniti +splenitis +splenitises +splenitive +splenium +splenius +splenization +splenoblast +splenocele +splenoceratosis +splenocyte +splenocleisis +splenocolic +splenodiagnosis +splenodynia +splenography +splenohemia +splenoid +splenolaparotomy +splenolymph +splenolymphatic +splenolysin +splenolysis +splenology +splenoma +splenomalacia +splenomedullary +splenomegaly +splenomegalia +splenomegalic +splenomyelogenous +splenoncus +splenonephric +splenopancreatic +splenoparectama +splenoparectasis +splenopathy +splenopexy +splenopexia +splenopexis +splenophrenic +splenopneumonia +splenoptosia +splenoptosis +splenorrhagia +splenorrhaphy +splenotyphoid +splenotomy +splenotoxin +splent +splents +splenulus +splenunculus +splet +spleuchan +spleughan +splice +spliceable +spliced +splicer +splicers +splices +splicing +splicings +splinder +spline +splined +splines +splineway +splining +splint +splintage +splintbone +splinted +splinter +splinterd +splintered +splintery +splintering +splinterize +splinterless +splinternew +splinterproof +splinters +splinty +splinting +splints +splintwood +split +splitbeak +splite +splitfinger +splitfruit +splitmouth +splitnew +splitnut +splits +splitsaw +splittable +splittail +splitted +splitten +splitter +splitterman +splitters +splitting +splittings +splitworm +splodge +splodgy +sploit +splore +splores +splosh +sploshed +sploshes +sploshy +sploshing +splotch +splotched +splotches +splotchy +splotchier +splotchiest +splotchily +splotchiness +splotching +splother +splunge +splunt +splurge +splurged +splurges +splurgy +splurgier +splurgiest +splurgily +splurging +splurt +spluther +splutter +spluttered +splutterer +spluttery +spluttering +splutters +spninx +spninxes +spoach +spock +spode +spodes +spodiosite +spodium +spodogenic +spodogenous +spodomancy +spodomantic +spodumene +spoffy +spoffish +spoffle +spogel +spoil +spoilable +spoilage +spoilages +spoilate +spoilated +spoilation +spoilbank +spoiled +spoiler +spoilers +spoilfive +spoilful +spoiling +spoilless +spoilment +spoils +spoilsman +spoilsmen +spoilsmonger +spoilsport +spoilsports +spoilt +spokan +spokane +spoke +spoked +spokeless +spoken +spokes +spokeshave +spokesman +spokesmanship +spokesmen +spokesperson +spokester +spokeswoman +spokeswomanship +spokeswomen +spokewise +spoky +spoking +spole +spolia +spoliary +spoliaria +spoliarium +spoliate +spoliated +spoliates +spoliating +spoliation +spoliative +spoliator +spoliatory +spoliators +spolium +spondaic +spondaical +spondaics +spondaize +spondean +spondee +spondees +spondiac +spondiaceae +spondias +spondil +spondyl +spondylalgia +spondylarthritis +spondylarthrocace +spondyle +spondylexarthrosis +spondylic +spondylid +spondylidae +spondylioid +spondylitic +spondylitis +spondylium +spondylizema +spondylocace +spondylocladium +spondylodiagnosis +spondylodidymia +spondylodymus +spondyloid +spondylolisthesis +spondylolisthetic +spondylopathy +spondylopyosis +spondyloschisis +spondylosyndesis +spondylosis +spondylotherapeutics +spondylotherapy +spondylotherapist +spondylotomy +spondylous +spondylus +spondulicks +spondulics +spondulix +spong +sponge +spongecake +sponged +spongefly +spongeflies +spongeful +spongeless +spongelet +spongelike +spongeous +spongeproof +sponger +spongers +sponges +spongeware +spongewood +spongy +spongiae +spongian +spongicolous +spongiculture +spongida +spongier +spongiest +spongiferous +spongiform +spongiidae +spongily +spongilla +spongillafly +spongillaflies +spongillid +spongillidae +spongilline +spongin +sponginblast +sponginblastic +sponginess +sponging +spongingly +spongins +spongioblast +spongioblastic +spongioblastoma +spongiocyte +spongiole +spongiolin +spongiopilin +spongiopiline +spongioplasm +spongioplasmic +spongiose +spongiosity +spongious +spongiousness +spongiozoa +spongiozoon +spongoblast +spongoblastic +spongocoel +spongoid +spongology +spongophore +spongospora +sponsal +sponsalia +sponsibility +sponsible +sponsing +sponsion +sponsional +sponsions +sponson +sponsons +sponsor +sponsored +sponsorial +sponsoring +sponsors +sponsorship +sponsorships +sponspeck +spontaneity +spontaneities +spontaneous +spontaneously +spontaneousness +sponton +spontoon +spontoons +spoof +spoofed +spoofer +spoofery +spooferies +spoofing +spoofish +spoofs +spook +spookdom +spooked +spookery +spookeries +spooky +spookier +spookies +spookiest +spookily +spookiness +spooking +spookish +spookism +spookist +spookology +spookological +spookologist +spooks +spool +spooled +spooler +spoolers +spoolful +spooling +spoollike +spools +spoolwood +spoom +spoon +spoonback +spoonbait +spoonbill +spoonbills +spoonbread +spoondrift +spooned +spooney +spooneyism +spooneyly +spooneyness +spooneys +spooner +spoonerism +spoonerisms +spoonflower +spoonful +spoonfuls +spoonholder +spoonhutch +spoony +spoonier +spoonies +spooniest +spoonyism +spoonily +spooniness +spooning +spoonism +spoonless +spoonlike +spoonmaker +spoonmaking +spoons +spoonsful +spoonways +spoonwise +spoonwood +spoonwort +spoor +spoored +spoorer +spooring +spoorn +spoors +spoot +spor +sporabola +sporaceous +sporades +sporadial +sporadic +sporadical +sporadically +sporadicalness +sporadicity +sporadicness +sporadin +sporadism +sporadosiderite +sporal +sporange +sporangia +sporangial +sporangidium +sporangiferous +sporangiform +sporangigia +sporangioid +sporangiola +sporangiole +sporangiolum +sporangiophore +sporangiospore +sporangite +sporangites +sporangium +sporation +spore +spored +sporeformer +sporeforming +sporeling +spores +sporicidal +sporicide +sporid +sporidesm +sporidia +sporidial +sporidiferous +sporidiiferous +sporidiole +sporidiolum +sporidium +sporiferous +sporification +sporing +sporiparity +sporiparous +sporoblast +sporobolus +sporocarp +sporocarpia +sporocarpium +sporochnaceae +sporochnus +sporocyst +sporocystic +sporocystid +sporocyte +sporoderm +sporodochia +sporodochium +sporoduct +sporogen +sporogenesis +sporogeny +sporogenic +sporogenous +sporogone +sporogony +sporogonia +sporogonial +sporogonic +sporogonium +sporogonous +sporoid +sporologist +sporomycosis +sporonia +sporont +sporophydium +sporophyl +sporophyll +sporophyllary +sporophyllum +sporophyte +sporophytic +sporophore +sporophoric +sporophorous +sporoplasm +sporopollenin +sporosac +sporostegium +sporostrote +sporotrichosis +sporotrichotic +sporotrichum +sporous +sporozoa +sporozoal +sporozoan +sporozoic +sporozoid +sporozoite +sporozooid +sporozoon +sporran +sporrans +sport +sportability +sportable +sportance +sported +sporter +sporters +sportfisherman +sportfishing +sportful +sportfully +sportfulness +sporty +sportier +sportiest +sportily +sportiness +sporting +sportingly +sportive +sportively +sportiveness +sportless +sportly +sportling +sports +sportscast +sportscaster +sportscasters +sportscasts +sportsman +sportsmanly +sportsmanlike +sportsmanlikeness +sportsmanliness +sportsmanship +sportsmen +sportsome +sportswear +sportswoman +sportswomanly +sportswomanship +sportswomen +sportswrite +sportswriter +sportswriters +sportswriting +sportula +sportulae +sporular +sporulate +sporulated +sporulating +sporulation +sporulative +sporule +sporules +sporuliferous +sporuloid +sposh +sposhy +spot +spotless +spotlessly +spotlessness +spotlight +spotlighter +spotlights +spotlike +spotrump +spots +spotsman +spotsmen +spottable +spottail +spotted +spottedly +spottedness +spotteldy +spotter +spotters +spotty +spottier +spottiest +spottily +spottiness +spotting +spottle +spotwelder +spoucher +spousage +spousal +spousally +spousals +spouse +spoused +spousehood +spouseless +spouses +spousy +spousing +spout +spouted +spouter +spouters +spouty +spoutiness +spouting +spoutless +spoutlike +spoutman +spouts +spp +sprachgefuhl +sprachle +sprack +sprackish +sprackle +sprackly +sprackness +sprad +spraddle +spraddled +spraddles +spraddling +sprag +spragged +spragger +spragging +spraggly +spragman +sprags +spray +sprayboard +spraich +sprayed +sprayey +sprayer +sprayers +sprayful +sprayfully +spraying +sprayless +spraylike +sprain +sprained +spraing +spraining +sprains +spraint +spraints +sprayproof +sprays +spraith +sprang +sprangle +sprangled +sprangly +sprangling +sprank +sprat +sprats +spratted +spratter +spratty +spratting +sprattle +sprattled +sprattles +sprattling +sprauchle +sprauchled +sprauchling +sprawl +sprawled +sprawler +sprawlers +sprawly +sprawlier +sprawliest +sprawling +sprawlingly +sprawls +spread +spreadability +spreadable +spreadation +spreadboard +spreadeagle +spreaded +spreader +spreaders +spreadhead +spready +spreading +spreadingly +spreadingness +spreadings +spreadover +spreads +spreadsheet +spreadsheets +spreagh +spreaghery +spreath +spreathed +sprechgesang +sprechstimme +spreckle +spree +spreed +spreeing +sprees +spreeuw +sprekelia +spreng +sprenge +sprenging +sprent +spret +spretty +sprew +sprewl +sprezzatura +spry +spridhogue +spried +sprier +spryer +spriest +spryest +sprig +sprigged +sprigger +spriggers +spriggy +spriggier +spriggiest +sprigging +spright +sprighted +sprightful +sprightfully +sprightfulness +sprighty +sprightly +sprightlier +sprightliest +sprightlily +sprightliness +sprights +spriglet +sprigs +sprigtail +spryly +sprindge +spryness +sprynesses +spring +springal +springald +springals +springboard +springboards +springbok +springboks +springbuck +springe +springed +springeing +springer +springerle +springers +springes +springfield +springfinger +springfish +springfishes +springful +springgun +springhaas +springhalt +springhead +springhouse +springy +springier +springiest +springily +springiness +springing +springingly +springle +springled +springless +springlet +springly +springlike +springling +springlock +springmaker +springmaking +springs +springtail +springtide +springtime +springtrap +springwater +springwood +springworm +springwort +springwurzel +sprink +sprinkle +sprinkled +sprinkleproof +sprinkler +sprinklered +sprinklers +sprinkles +sprinkling +sprinklingly +sprinklings +sprint +sprinted +sprinter +sprinters +sprinting +sprints +sprit +sprite +spritehood +spriteless +spritely +spritelike +spriteliness +sprites +spritish +sprits +spritsail +sprittail +spritted +spritty +sprittie +spritting +spritz +spritzer +sproat +sprocket +sprockets +sprod +sprogue +sproil +sprong +sprose +sprot +sproty +sprottle +sprout +sproutage +sprouted +sprouter +sproutful +sprouting +sproutland +sproutling +sprouts +sprowsy +spruce +spruced +sprucely +spruceness +sprucer +sprucery +spruces +sprucest +sprucy +sprucier +spruciest +sprucify +sprucification +sprucing +sprue +spruer +sprues +sprug +sprugs +spruik +spruiker +spruit +sprung +sprunk +sprunny +sprunt +spruntly +sprusado +sprush +sps +spt +spud +spudboy +spudded +spudder +spudders +spuddy +spudding +spuddle +spuds +spue +spued +spues +spuffle +spug +spuggy +spuilyie +spuilzie +spuing +spuke +spulyie +spulyiement +spulzie +spumante +spume +spumed +spumes +spumescence +spumescent +spumy +spumier +spumiest +spumiferous +spumification +spumiform +spuming +spumoid +spumone +spumones +spumoni +spumonis +spumose +spumous +spun +spunch +spung +spunge +spunyarn +spunk +spunked +spunky +spunkie +spunkier +spunkies +spunkiest +spunkily +spunkiness +spunking +spunkless +spunklessly +spunklessness +spunks +spunny +spunnies +spunware +spur +spurdie +spurdog +spurflower +spurgall +spurgalled +spurgalling +spurgalls +spurge +spurges +spurgewort +spuria +spuriae +spuries +spuriosity +spurious +spuriously +spuriousness +spurius +spurl +spurless +spurlet +spurlike +spurling +spurluous +spurmaker +spurmoney +spurn +spurned +spurner +spurners +spurning +spurnpoint +spurns +spurnwater +spurproof +spurred +spurrey +spurreies +spurreys +spurrer +spurrers +spurry +spurrial +spurrier +spurriers +spurries +spurring +spurrings +spurrite +spurs +spurt +spurted +spurter +spurting +spurtive +spurtively +spurtle +spurtleblade +spurtles +spurts +spurway +spurwing +spurwinged +spurwort +sput +sputa +sputative +spute +sputnik +sputniks +sputta +sputter +sputtered +sputterer +sputterers +sputtery +sputtering +sputteringly +sputters +sputum +sputumary +sputumose +sputumous +sq +sqd +sqq +sqrt +squab +squabash +squabasher +squabbed +squabber +squabby +squabbier +squabbiest +squabbing +squabbish +squabble +squabbled +squabbler +squabblers +squabbles +squabbly +squabbling +squabblingly +squabs +squacco +squaccos +squad +squadded +squadder +squaddy +squadding +squader +squadrate +squadrism +squadrol +squadron +squadrone +squadroned +squadroning +squadrons +squads +squail +squailer +squails +squalene +squalenes +squali +squalid +squalida +squalidae +squalider +squalidest +squalidity +squalidly +squalidness +squaliform +squall +squalled +squaller +squallery +squallers +squally +squallier +squalliest +squalling +squallish +squalls +squalm +squalodon +squalodont +squalodontidae +squaloid +squaloidei +squalor +squalors +squalus +squam +squama +squamaceous +squamae +squamariaceae +squamata +squamate +squamated +squamatine +squamation +squamatogranulous +squamatotuberculate +squame +squamella +squamellae +squamellate +squamelliferous +squamelliform +squameous +squamy +squamiferous +squamify +squamiform +squamigerous +squamipennate +squamipennes +squamipinnate +squamipinnes +squamish +squamocellular +squamoepithelial +squamoid +squamomastoid +squamoparietal +squamopetrosal +squamosa +squamosal +squamose +squamosely +squamoseness +squamosis +squamosity +squamosodentated +squamosoimbricated +squamosomaxillary +squamosoparietal +squamosoradiate +squamosotemporal +squamosozygomatic +squamosphenoid +squamosphenoidal +squamotemporal +squamous +squamously +squamousness +squamozygomatic +squamscot +squamula +squamulae +squamulate +squamulation +squamule +squamuliform +squamulose +squander +squandered +squanderer +squanderers +squandering +squanderingly +squandermania +squandermaniac +squanders +squantum +squarable +square +squareage +squarecap +squared +squaredly +squareface +squareflipper +squarehead +squarely +squarelike +squareman +squaremen +squaremouth +squareness +squarer +squarers +squares +squarest +squaretail +squaretoed +squarewise +squary +squarier +squaring +squarish +squarishly +squarishness +squark +squarrose +squarrosely +squarrous +squarrulose +squarson +squarsonry +squash +squashberry +squashed +squasher +squashers +squashes +squashy +squashier +squashiest +squashily +squashiness +squashing +squashs +squassation +squat +squatarola +squatarole +squaterole +squatina +squatinid +squatinidae +squatinoid +squatinoidei +squatly +squatment +squatmore +squatness +squats +squattage +squatted +squatter +squatterarchy +squatterdom +squattered +squattering +squatterism +squatterproof +squatters +squattest +squatty +squattier +squattiest +squattily +squattiness +squatting +squattingly +squattish +squattle +squattocracy +squattocratic +squatwise +squaw +squawberry +squawberries +squawbush +squawdom +squawfish +squawfishes +squawflower +squawk +squawked +squawker +squawkers +squawky +squawkie +squawkier +squawkiest +squawking +squawkingly +squawks +squawl +squawler +squawmish +squawroot +squaws +squawtits +squawweed +squaxon +squdge +squdgy +squeak +squeaked +squeaker +squeakery +squeakers +squeaky +squeakier +squeakiest +squeakyish +squeakily +squeakiness +squeaking +squeakingly +squeaklet +squeakproof +squeaks +squeal +squeald +squealed +squealer +squealers +squealing +squeals +squeam +squeamy +squeamish +squeamishly +squeamishness +squeamous +squeasy +squedunk +squeege +squeegee +squeegeed +squeegeeing +squeegees +squeegeing +squeel +squeezability +squeezable +squeezableness +squeezably +squeeze +squeezed +squeezeman +squeezer +squeezers +squeezes +squeezy +squeezing +squeezingly +squeg +squegged +squegging +squegs +squelch +squelched +squelcher +squelchers +squelches +squelchy +squelchier +squelchiest +squelchily +squelchiness +squelching +squelchingly +squelchingness +squelette +squench +squencher +squet +squeteague +squetee +squib +squibbed +squibber +squibbery +squibbing +squibbish +squibcrack +squiblet +squibling +squibs +squibster +squid +squidded +squidder +squidding +squiddle +squidge +squidgereen +squidgy +squidgier +squidgiest +squids +squiffed +squiffer +squiffy +squiffier +squiffiest +squiggle +squiggled +squiggles +squiggly +squigglier +squiggliest +squiggling +squilgee +squilgeed +squilgeeing +squilgeer +squilgees +squilgeing +squill +squilla +squillae +squillagee +squillageed +squillageeing +squillageing +squillas +squillery +squillgee +squillgeed +squillgeeing +squillgeing +squillian +squillid +squillidae +squillitic +squilloid +squilloidea +squills +squimmidge +squin +squinacy +squinance +squinancy +squinant +squinch +squinched +squinches +squinching +squinny +squinnied +squinnier +squinnies +squinniest +squinnying +squinsy +squint +squinted +squinter +squinters +squintest +squinty +squintier +squintiest +squinting +squintingly +squintingness +squintly +squintness +squints +squirage +squiralty +squirarch +squirarchal +squirarchy +squirarchical +squirarchies +squire +squirearch +squirearchal +squirearchy +squirearchical +squirearchies +squired +squiredom +squireen +squireens +squirehood +squireless +squirelet +squirely +squirelike +squireling +squireocracy +squires +squireship +squiress +squiret +squirewise +squiring +squirish +squirism +squirk +squirl +squirm +squirmed +squirmer +squirmers +squirmy +squirmier +squirmiest +squirminess +squirming +squirmingly +squirms +squirr +squirrel +squirreled +squirrelfish +squirrelfishes +squirrely +squirrelian +squirreline +squirreling +squirrelish +squirrelled +squirrelly +squirrellike +squirrelling +squirrelproof +squirrels +squirrelsstagnate +squirreltail +squirt +squirted +squirter +squirters +squirty +squirtiness +squirting +squirtingly +squirtish +squirts +squish +squished +squishes +squishy +squishier +squishiest +squishiness +squishing +squiss +squit +squitch +squitchy +squitter +squiz +squoosh +squooshed +squooshes +squooshing +squoze +squshy +squshier +squshiest +squush +squushed +squushes +squushy +squushing +sr +srac +sraddha +sraddhas +sradha +sradhas +sramana +sravaka +sri +sridhar +sridharan +srikanth +srinivas +srinivasan +sriram +sris +srivatsan +sruti +ss +ssed +ssi +ssing +ssort +ssp +sstor +ssu +st +sta +staab +staatsraad +staatsrat +stab +stabbed +stabber +stabbers +stabbing +stabbingly +stabbingness +stabilate +stabile +stabiles +stabilify +stabiliment +stabilimeter +stabilisation +stabilise +stabilised +stabiliser +stabilising +stabilist +stabilitate +stability +stabilities +stabilivolt +stabilization +stabilizator +stabilize +stabilized +stabilizer +stabilizers +stabilizes +stabilizing +stable +stableboy +stabled +stableful +stablekeeper +stablelike +stableman +stablemate +stablemeal +stablemen +stableness +stabler +stablers +stables +stablest +stablestand +stableward +stablewards +stably +stabling +stablings +stablish +stablished +stablishes +stablishing +stablishment +staboy +stabproof +stabs +stabulate +stabulation +stabwort +stacc +staccado +staccati +staccato +staccatos +stacey +stacher +stachering +stachydrin +stachydrine +stachyose +stachys +stachytarpheta +stachyuraceae +stachyuraceous +stachyurus +stacy +stack +stackable +stackage +stacked +stackencloud +stacker +stackering +stackers +stacket +stackfreed +stackful +stackgarth +stackhousia +stackhousiaceae +stackhousiaceous +stackyard +stacking +stackless +stackman +stackmen +stacks +stackstand +stackup +stacte +stactes +stactometer +stad +stadda +staddle +staddles +staddlestone +staddling +stade +stader +stades +stadholder +stadholderate +stadholdership +stadhouse +stadia +stadial +stadias +stadic +stadie +stadimeter +stadiometer +stadion +stadium +stadiums +stadle +stadthaus +stadtholder +stadtholderate +stadtholdership +stadthouse +stafette +staff +staffage +staffed +staffelite +staffer +staffers +staffete +staffier +staffing +staffish +staffless +staffman +staffmen +stafford +staffs +staffstriker +stag +stagbush +stage +stageability +stageable +stageableness +stageably +stagecoach +stagecoaches +stagecoaching +stagecraft +staged +stagedom +stagefright +stagehand +stagehands +stagehouse +stagey +stageland +stagelike +stageman +stagemen +stager +stagery +stagers +stages +stagese +stagestruck +stagewise +stageworthy +stagewright +stagflation +staggard +staggards +staggart +staggarth +staggarts +stagged +stagger +staggerbush +staggered +staggerer +staggerers +staggery +staggering +staggeringly +staggers +staggerweed +staggerwort +staggy +staggie +staggier +staggies +staggiest +stagging +staghead +staghorn +staghound +staghunt +staghunter +staghunting +stagy +stagiary +stagier +stagiest +stagily +staginess +staging +stagings +stagion +stagirite +stagyrite +stagiritic +staglike +stagmometer +stagnance +stagnancy +stagnant +stagnantly +stagnantness +stagnate +stagnated +stagnates +stagnating +stagnation +stagnatory +stagnature +stagne +stagnicolous +stagnize +stagnum +stagonospora +stags +stagskin +stagworm +stahlhelm +stahlhelmer +stahlhelmist +stahlian +stahlianism +stahlism +stay +staia +stayable +staybolt +staid +staider +staidest +staidly +staidness +stayed +stayer +stayers +staig +staigs +staying +stail +staylace +stayless +staylessness +staymaker +staymaking +stain +stainability +stainabilities +stainable +stainableness +stainably +stained +stainer +stainers +stainful +stainierite +staynil +staining +stainless +stainlessly +stainlessness +stainproof +stains +staio +stayover +staypak +stair +stairbeak +stairbuilder +stairbuilding +staircase +staircases +staired +stairhead +stairy +stairless +stairlike +stairs +stairstep +stairway +stairways +stairwell +stairwells +stairwise +stairwork +stays +staysail +staysails +stayship +staith +staithe +staithman +staithmen +staiver +stake +staked +stakehead +stakeholder +stakemaster +stakeout +stakeouts +staker +stakerope +stakes +stakhanovism +stakhanovite +staking +stalace +stalactic +stalactical +stalactiform +stalactital +stalactite +stalactited +stalactites +stalactitic +stalactitical +stalactitically +stalactitied +stalactitiform +stalactitious +stalag +stalagma +stalagmite +stalagmites +stalagmitic +stalagmitical +stalagmitically +stalagmometer +stalagmometry +stalagmometric +stalags +stalder +stale +staled +stalely +stalemate +stalemated +stalemates +stalemating +staleness +staler +stales +stalest +stalin +staling +stalingrad +stalinism +stalinist +stalinists +stalinite +stalk +stalkable +stalked +stalker +stalkers +stalky +stalkier +stalkiest +stalkily +stalkiness +stalking +stalkingly +stalkless +stalklet +stalklike +stalko +stalkoes +stalks +stall +stallage +stalland +stallar +stallary +stallboard +stallboat +stalled +stallenger +staller +stallership +stalling +stallinger +stallingken +stallings +stallion +stallionize +stallions +stallkeeper +stallman +stallmen +stallment +stallon +stalls +stalwart +stalwartism +stalwartize +stalwartly +stalwartness +stalwarts +stalworth +stalworthly +stalworthness +stam +stamba +stambha +stambouline +stamen +stamened +stamens +stamin +stamina +staminal +staminas +staminate +stamindia +stamineal +stamineous +staminiferous +staminigerous +staminode +staminody +staminodia +staminodium +stammel +stammelcolor +stammels +stammer +stammered +stammerer +stammerers +stammering +stammeringly +stammeringness +stammers +stammerwort +stammrel +stamnoi +stamnos +stamp +stampable +stampage +stamped +stampedable +stampede +stampeded +stampeder +stampedes +stampeding +stampedingly +stampedo +stampee +stamper +stampery +stampers +stamphead +stampian +stamping +stample +stampless +stampman +stampmen +stamps +stampsman +stampsmen +stampweed +stan +stance +stances +stanch +stanchable +stanched +stanchel +stancheled +stancher +stanchers +stanches +stanchest +stanching +stanchion +stanchioned +stanchioning +stanchions +stanchless +stanchlessly +stanchly +stanchness +stand +standage +standard +standardbearer +standardbearers +standardbred +standardise +standardised +standardizable +standardization +standardize +standardized +standardizer +standardizes +standardizing +standardly +standardness +standards +standardwise +standaway +standback +standby +standbybys +standbys +standee +standees +standel +standelwelks +standelwort +stander +standergrass +standers +standerwort +standeth +standfast +standi +standing +standings +standish +standishes +standoff +standoffish +standoffishly +standoffishness +standoffs +standout +standouts +standpat +standpatism +standpatter +standpattism +standpipe +standpipes +standpoint +standpoints +standpost +stands +standstill +standup +stane +stanechat +staned +stanek +stanes +stanford +stang +stanged +stangeria +stanging +stangs +stanhope +stanhopea +stanhopes +staniel +stanine +staning +stanislaw +stanitsa +stanitza +stanjen +stank +stankie +stanks +stanley +stanly +stannane +stannary +stannaries +stannate +stannator +stannel +stanner +stannery +stanners +stannic +stannid +stannide +stanniferous +stannyl +stannite +stannites +stanno +stannotype +stannous +stannoxyl +stannum +stannums +stantibus +stanza +stanzaed +stanzaic +stanzaical +stanzaically +stanzas +stanze +stanzo +stap +stapedectomy +stapedectomized +stapedes +stapedez +stapedial +stapediform +stapediovestibular +stapedius +stapelia +stapelias +stapes +staph +staphyle +staphylea +staphyleaceae +staphyleaceous +staphylectomy +staphyledema +staphylematoma +staphylic +staphyline +staphylinic +staphylinid +staphylinidae +staphylinideous +staphylinoidea +staphylinus +staphylion +staphylitis +staphyloangina +staphylococcal +staphylococcemia +staphylococcemic +staphylococci +staphylococcic +staphylococcocci +staphylococcus +staphylodermatitis +staphylodialysis +staphyloedema +staphylohemia +staphylolysin +staphyloma +staphylomatic +staphylomatous +staphylomycosis +staphyloncus +staphyloplasty +staphyloplastic +staphyloptosia +staphyloptosis +staphyloraphic +staphylorrhaphy +staphylorrhaphic +staphylorrhaphies +staphyloschisis +staphylosis +staphylotome +staphylotomy +staphylotomies +staphylotoxin +staphisagria +staphs +staple +stapled +stapler +staplers +staples +staplewise +staplf +stapling +stapple +star +starblind +starbloom +starboard +starbolins +starbowlines +starbright +starbuck +starch +starchboard +starched +starchedly +starchedness +starcher +starches +starchflower +starchy +starchier +starchiest +starchily +starchiness +starching +starchless +starchly +starchlike +starchmaker +starchmaking +starchman +starchmen +starchness +starchroot +starchworks +starchwort +starcraft +stardom +stardoms +stardust +stardusts +stare +stared +staree +starer +starers +stares +starets +starfish +starfishes +starflower +starfruit +starful +stargaze +stargazed +stargazer +stargazers +stargazes +stargazing +stary +starik +staring +staringly +stark +starken +starker +starkest +starky +starkle +starkly +starkness +starless +starlessly +starlessness +starlet +starlets +starlight +starlighted +starlights +starlike +starling +starlings +starlit +starlite +starlitten +starmonger +starn +starnel +starny +starnie +starnose +starnoses +staroobriadtsi +starost +starosta +starosti +starosty +starquake +starr +starred +starry +starrier +starriest +starrify +starrily +starriness +starring +starringly +stars +starshake +starshine +starship +starshoot +starshot +starstone +starstroke +starstruck +start +started +starter +starters +startful +startfulness +starthroat +starty +starting +startingly +startingno +startish +startle +startled +startler +startlers +startles +startly +startling +startlingly +startlingness +startlish +startlishness +startor +starts +startsy +startup +startups +starvation +starve +starveacre +starved +starvedly +starveling +starvelings +starven +starver +starvers +starves +starvy +starving +starw +starward +starwise +starworm +starwort +starworts +stases +stash +stashed +stashes +stashie +stashing +stasidia +stasidion +stasima +stasimetric +stasimon +stasimorphy +stasiphobia +stasis +stasisidia +stasophobia +stassfurtite +stat +statable +statal +statampere +statant +statary +statcoulomb +state +stateable +statecraft +stated +statedly +stateful +statefully +statefulness +statehood +statehouse +statehouses +stateless +statelessness +statelet +stately +statelich +statelier +stateliest +statelily +stateliness +statement +statements +statemonger +statequake +stater +statera +stateroom +staterooms +staters +states +statesboy +stateship +stateside +statesider +statesman +statesmanese +statesmanly +statesmanlike +statesmanship +statesmen +statesmonger +stateswoman +stateswomen +stateway +statewide +statfarad +stathenry +stathenries +stathenrys +stathmoi +stathmos +static +statical +statically +statice +statices +staticproof +statics +stating +station +stational +stationary +stationaries +stationarily +stationariness +stationarity +stationed +stationer +stationery +stationeries +stationers +stationing +stationman +stationmaster +stations +statiscope +statism +statisms +statist +statistic +statistical +statistically +statistician +statisticians +statisticize +statistics +statistology +statists +stative +statives +statize +statoblast +statocyst +statocracy +statohm +statolatry +statolith +statolithic +statometer +stator +statoreceptor +statorhab +stators +statoscope +statospore +stats +statua +statuary +statuaries +statuarism +statuarist +statue +statuecraft +statued +statueless +statuelike +statues +statuesque +statuesquely +statuesqueness +statuette +statuettes +statuing +stature +statured +statures +status +statuses +statutable +statutableness +statutably +statutary +statute +statuted +statutes +statuting +statutory +statutorily +statutoriness +statutum +statvolt +staucher +stauk +staumer +staumeral +staumrel +staumrels +staun +staunch +staunchable +staunched +stauncher +staunches +staunchest +staunching +staunchly +staunchness +staup +stauracin +stauraxonia +stauraxonial +staurion +staurolatry +staurolatries +staurolite +staurolitic +staurology +stauromedusae +stauromedusan +stauropegia +stauropegial +stauropegion +stauropgia +stauroscope +stauroscopic +stauroscopically +staurotide +stauter +stavable +stave +staveable +staved +staveless +staver +stavers +staverwort +staves +stavesacre +stavewise +stavewood +staving +stavrite +staw +stawn +stawsome +staxis +stbd +stchi +std +stddmp +steaakhouse +stead +steadable +steaded +steadfast +steadfastly +steadfastness +steady +steadied +steadier +steadiers +steadies +steadiest +steadying +steadyingly +steadyish +steadily +steadiment +steadiness +steading +steadings +steadite +steadman +steads +steak +steakhouse +steakhouses +steaks +steal +stealability +stealable +stealage +stealages +stealed +stealer +stealers +stealy +stealing +stealingly +stealings +steals +stealth +stealthful +stealthfully +stealthy +stealthier +stealthiest +stealthily +stealthiness +stealthless +stealthlike +stealths +stealthwise +steam +steamboat +steamboating +steamboatman +steamboatmen +steamboats +steamcar +steamed +steamer +steamered +steamerful +steamering +steamerless +steamerload +steamers +steamfitter +steamfitting +steamy +steamie +steamier +steamiest +steamily +steaminess +steaming +steamless +steamlike +steampipe +steamproof +steamroll +steamroller +steamrollered +steamrollering +steamrollers +steams +steamship +steamships +steamtight +steamtightness +stean +steaning +steapsin +steapsins +stearate +stearates +stearic +steariform +stearyl +stearin +stearine +stearines +stearins +stearolactone +stearone +stearoptene +stearrhea +stearrhoea +steatin +steatite +steatites +steatitic +steatocele +steatogenous +steatolysis +steatolytic +steatoma +steatomas +steatomata +steatomatous +steatopathic +steatopyga +steatopygy +steatopygia +steatopygic +steatopygous +steatornis +steatornithes +steatornithidae +steatorrhea +steatorrhoea +steatoses +steatosis +stebbins +stech +stechados +stechling +steckling +steddle +stedfast +stedfastly +stedfastness +stedhorses +stedman +steeadying +steed +steedless +steedlike +steeds +steek +steeked +steeking +steekkan +steekkannen +steeks +steel +steelboy +steelbow +steele +steeled +steelen +steeler +steelers +steelhead +steelheads +steelhearted +steely +steelyard +steelyards +steelie +steelier +steelies +steeliest +steelify +steelification +steelified +steelifying +steeliness +steeling +steelless +steellike +steelmake +steelmaker +steelmaking +steelman +steelmen +steelproof +steels +steelware +steelwork +steelworker +steelworking +steelworks +steem +steen +steenboc +steenbock +steenbok +steenboks +steenbras +steenbrass +steenie +steening +steenkirk +steenstrupine +steenth +steep +steepdown +steeped +steepen +steepened +steepening +steepens +steeper +steepers +steepest +steepgrass +steepy +steepiness +steeping +steepish +steeple +steeplebush +steeplechase +steeplechaser +steeplechases +steeplechasing +steepled +steeplejack +steeplejacks +steepleless +steeplelike +steeples +steepletop +steeply +steepness +steeps +steepweed +steepwort +steer +steerability +steerable +steerage +steerages +steerageway +steered +steerer +steerers +steery +steering +steeringly +steerless +steerling +steerman +steermanship +steers +steersman +steersmate +steersmen +steerswoman +steeve +steeved +steevely +steever +steeves +steeving +steevings +stefan +steg +steganogram +steganography +steganographical +steganographist +steganophthalmata +steganophthalmate +steganophthalmatous +steganophthalmia +steganopod +steganopodan +steganopodes +steganopodous +stegh +stegnosis +stegnosisstegnotic +stegnotic +stegocarpous +stegocephalia +stegocephalian +stegocephalous +stegodon +stegodons +stegodont +stegodontine +stegomyia +stegomus +stegosaur +stegosauri +stegosauria +stegosaurian +stegosauroid +stegosaurs +stegosaurus +stey +steid +steigh +stein +steinberger +steinbock +steinbok +steinboks +steinbuck +steinerian +steinful +steyning +steinkirk +steins +steironema +stekan +stela +stelae +stelai +stelar +stele +stelene +steles +stelic +stell +stella +stellar +stellarator +stellary +stellaria +stellas +stellate +stellated +stellately +stellation +stellature +stelled +stellenbosch +stellerid +stelleridean +stellerine +stelliferous +stellify +stellification +stellified +stellifies +stellifying +stelliform +stelling +stellio +stellion +stellionate +stelliscript +stellite +stellular +stellularly +stellulate +stelography +stem +stema +stembok +stemform +stemhead +stemless +stemlet +stemlike +stemma +stemmas +stemmata +stemmatiform +stemmatous +stemmed +stemmer +stemmery +stemmeries +stemmers +stemmy +stemmier +stemmiest +stemming +stemona +stemonaceae +stemonaceous +stempel +stemple +stempost +stems +stemson +stemsons +stemwards +stemware +stemwares +sten +stenar +stench +stenchel +stenches +stenchful +stenchy +stenchier +stenchiest +stenching +stenchion +stencil +stenciled +stenciler +stenciling +stencilize +stencilled +stenciller +stencilling +stencilmaker +stencilmaking +stencils +stend +steng +stengah +stengahs +stenia +stenion +steno +stenobathic +stenobenthic +stenobragmatic +stenobregma +stenocardia +stenocardiac +stenocarpus +stenocephaly +stenocephalia +stenocephalic +stenocephalous +stenochoria +stenochoric +stenochrome +stenochromy +stenocoriasis +stenocranial +stenocrotaphia +stenofiber +stenog +stenogastry +stenogastric +stenoglossa +stenograph +stenographed +stenographer +stenographers +stenography +stenographic +stenographical +stenographically +stenographing +stenographist +stenohaline +stenometer +stenopaeic +stenopaic +stenopeic +stenopelmatidae +stenopetalous +stenophagous +stenophile +stenophyllous +stenophragma +stenorhyncous +stenos +stenosed +stenosepalous +stenoses +stenosis +stenosphere +stenostomatous +stenostomia +stenotaphrum +stenotelegraphy +stenotherm +stenothermal +stenothermy +stenothermophilic +stenothorax +stenotic +stenotype +stenotypy +stenotypic +stenotypist +stenotopic +stenotropic +stent +stenter +stenterer +stenting +stentmaster +stenton +stentor +stentoraphonic +stentorian +stentorianly +stentorine +stentorious +stentoriously +stentoriousness +stentoronic +stentorophonic +stentorphone +stentors +stentrel +step +stepaunt +stepbairn +stepbrother +stepbrotherhood +stepbrothers +stepchild +stepchildren +stepdame +stepdames +stepdance +stepdancer +stepdancing +stepdaughter +stepdaughters +stepdown +stepdowns +stepfather +stepfatherhood +stepfatherly +stepfathers +stepgrandchild +stepgrandfather +stepgrandmother +stepgrandson +stephan +stephana +stephane +stephanial +stephanian +stephanic +stephanie +stephanion +stephanite +stephanoceros +stephanokontae +stephanome +stephanos +stephanotis +stephanurus +stephe +stephead +stephen +stepladder +stepladders +stepless +steplike +stepminnie +stepmother +stepmotherhood +stepmotherless +stepmotherly +stepmotherliness +stepmothers +stepney +stepnephew +stepniece +stepony +stepparent +stepparents +steppe +stepped +steppeland +stepper +steppers +steppes +stepping +steppingstone +steppingstones +steprelation +steprelationship +steps +stepsire +stepsister +stepsisters +stepson +stepsons +stepstone +stepstool +stept +steptoe +stepuncle +stepup +stepups +stepway +stepwise +ster +steracle +sterad +steradian +stercobilin +stercolin +stercophagic +stercophagous +stercoraceous +stercoraemia +stercoral +stercoranism +stercoranist +stercorary +stercoraries +stercorariidae +stercorariinae +stercorarious +stercorarius +stercorate +stercoration +stercorean +stercoremia +stercoreous +stercorianism +stercoricolous +stercorin +stercorist +stercorite +stercorol +stercorous +stercovorous +sterculia +sterculiaceae +sterculiaceous +sterculiad +stere +stereagnosis +stereid +sterelmintha +sterelminthic +sterelminthous +sterelminthus +stereo +stereobate +stereobatic +stereoblastula +stereocamera +stereocampimeter +stereochemic +stereochemical +stereochemically +stereochemistry +stereochromatic +stereochromatically +stereochrome +stereochromy +stereochromic +stereochromically +stereocomparagraph +stereocomparator +stereoed +stereoelectric +stereofluoroscopy +stereofluoroscopic +stereogastrula +stereognosis +stereognostic +stereogoniometer +stereogram +stereograph +stereographer +stereography +stereographic +stereographical +stereographically +stereoing +stereoisomer +stereoisomeric +stereoisomerical +stereoisomeride +stereoisomerism +stereology +stereological +stereologically +stereom +stereomatrix +stereome +stereomer +stereomeric +stereomerical +stereomerism +stereometer +stereometry +stereometric +stereometrical +stereometrically +stereomicrometer +stereomicroscope +stereomicroscopy +stereomicroscopic +stereomicroscopically +stereomonoscope +stereoneural +stereopair +stereophantascope +stereophysics +stereophone +stereophony +stereophonic +stereophonically +stereophotogrammetry +stereophotograph +stereophotography +stereophotographic +stereophotomicrograph +stereophotomicrography +stereopicture +stereoplanigraph +stereoplanula +stereoplasm +stereoplasma +stereoplasmic +stereopsis +stereopter +stereoptican +stereoptician +stereopticon +stereoradiograph +stereoradiography +stereoregular +stereoregularity +stereornithes +stereornithic +stereoroentgenogram +stereoroentgenography +stereos +stereoscope +stereoscopes +stereoscopy +stereoscopic +stereoscopical +stereoscopically +stereoscopies +stereoscopism +stereoscopist +stereospecific +stereospecifically +stereospecificity +stereospondyli +stereospondylous +stereostatic +stereostatics +stereotactic +stereotactically +stereotape +stereotapes +stereotaxy +stereotaxic +stereotaxically +stereotaxis +stereotelemeter +stereotelescope +stereotypable +stereotype +stereotyped +stereotyper +stereotypery +stereotypers +stereotypes +stereotypy +stereotypic +stereotypical +stereotypically +stereotypies +stereotyping +stereotypist +stereotypographer +stereotypography +stereotomy +stereotomic +stereotomical +stereotomist +stereotropic +stereotropism +stereovision +steres +stereum +sterhydraulic +steri +steric +sterical +sterically +sterics +sterid +steride +sterigma +sterigmas +sterigmata +sterigmatic +sterilant +sterile +sterilely +sterileness +sterilisability +sterilisable +sterilise +sterilised +steriliser +sterilising +sterility +sterilities +sterilizability +sterilizable +sterilization +sterilizations +sterilize +sterilized +sterilizer +sterilizers +sterilizes +sterilizing +sterin +sterk +sterlet +sterlets +sterling +sterlingly +sterlingness +sterlings +stern +sterna +sternad +sternage +sternal +sternalis +sternbergia +sternbergite +sterncastle +sterneber +sternebra +sternebrae +sternebral +sterned +sterner +sternest +sternforemost +sternful +sternfully +sterninae +sternite +sternites +sternitic +sternknee +sternly +sternman +sternmen +sternmost +sternna +sternness +sterno +sternoclavicular +sternocleidomastoid +sternocleidomastoideus +sternoclidomastoid +sternocoracoid +sternocostal +sternofacial +sternofacialis +sternoglossal +sternohyoid +sternohyoidean +sternohumeral +sternomancy +sternomastoid +sternomaxillary +sternonuchal +sternopericardiac +sternopericardial +sternoscapular +sternothere +sternotherus +sternothyroid +sternotracheal +sternotribe +sternovertebral +sternoxiphoid +sternpost +sterns +sternson +sternsons +sternum +sternums +sternutaries +sternutate +sternutation +sternutative +sternutator +sternutatory +sternway +sternways +sternward +sternwards +sternwheel +sternwheeler +sternworks +stero +steroid +steroidal +steroidogenesis +steroidogenic +steroids +sterol +sterols +sterope +sterrinck +stert +stertor +stertorious +stertoriously +stertoriousness +stertorous +stertorously +stertorousness +stertors +sterve +stesichorean +stet +stetch +stethal +stetharteritis +stethy +stethogoniometer +stethograph +stethographic +stethokyrtograph +stethometer +stethometry +stethometric +stethoparalysis +stethophone +stethophonometer +stethoscope +stethoscoped +stethoscopes +stethoscopy +stethoscopic +stethoscopical +stethoscopically +stethoscopies +stethoscopist +stethospasm +stets +stetson +stetsons +stetted +stetting +steuben +stevan +steve +stevedorage +stevedore +stevedored +stevedores +stevedoring +stevel +steven +stevensonian +stevensoniana +stevia +stew +stewable +steward +stewarded +stewardess +stewardesses +stewarding +stewardly +stewardry +stewards +stewardship +stewart +stewarty +stewartia +stewartry +stewbum +stewbums +stewed +stewhouse +stewy +stewing +stewish +stewpan +stewpans +stewpond +stewpot +stews +stg +stge +sthene +sthenia +sthenias +sthenic +sthenochire +sty +stiacciato +styan +styany +stib +stibble +stibbler +stibblerig +stibethyl +stibial +stibialism +stibiate +stibiated +stibic +stibiconite +stibine +stibines +stibious +stibium +stibiums +stibnite +stibnites +stibonium +stibophen +styca +sticcado +styceric +stycerin +stycerinol +stich +stichado +sticharia +sticharion +stichcharia +stichel +sticheron +stichic +stichically +stichid +stichidia +stichidium +stichocrome +stichoi +stichomancy +stichometry +stichometric +stichometrical +stichometrically +stichomythy +stichomythia +stychomythia +stichomythic +stichos +stichs +stichwort +stick +stickability +stickable +stickadore +stickadove +stickage +stickball +stickboat +sticked +stickel +sticken +sticker +stickery +stickers +sticket +stickfast +stickful +stickfuls +stickhandler +sticky +stickybeak +stickier +stickiest +stickily +stickiness +sticking +stickit +stickjaw +sticklac +stickle +stickleaf +stickleback +stickled +stickler +sticklers +stickles +stickless +stickly +sticklike +stickling +stickman +stickmen +stickout +stickouts +stickpin +stickpins +sticks +stickseed +sticksmanship +sticktail +sticktight +stickum +stickums +stickup +stickups +stickwater +stickweed +stickwork +sticta +stictaceae +stictidaceae +stictiform +stictis +stid +stiddy +stye +stied +styed +sties +styes +stife +stiff +stiffed +stiffen +stiffened +stiffener +stiffeners +stiffening +stiffens +stiffer +stiffest +stiffhearted +stiffing +stiffish +stiffleg +stiffler +stiffly +stifflike +stiffneck +stiffneckedly +stiffneckedness +stiffness +stiffrump +stiffs +stifftail +stifle +stifled +stifledly +stifler +stiflers +stifles +stifling +stiflingly +styful +styfziekte +stygial +stygian +stygiophobia +stigma +stigmai +stigmal +stigmaria +stigmariae +stigmarian +stigmarioid +stigmas +stigmasterol +stigmat +stigmata +stigmatal +stigmatic +stigmatical +stigmatically +stigmaticalness +stigmatiferous +stigmatiform +stigmatypy +stigmatise +stigmatiser +stigmatism +stigmatist +stigmatization +stigmatize +stigmatized +stigmatizer +stigmatizes +stigmatizing +stigmatoid +stigmatose +stigme +stigmeology +stigmes +stigmonose +stigonomancy +stying +stikine +stylar +stylaster +stylasteridae +stylate +stilb +stilbaceae +stilbella +stilbene +stilbenes +stilbestrol +stilbite +stilbites +stilboestrol +stilbum +styldia +stile +style +stylebook +stylebooks +styled +styledom +styleless +stylelessness +stylelike +stileman +stilemen +styler +stylers +stiles +styles +stilet +stylet +stylets +stilette +stiletted +stiletto +stilettoed +stilettoes +stilettoing +stilettolike +stilettos +stylewort +styli +stilyaga +stilyagi +stylidiaceae +stylidiaceous +stylidium +styliferous +styliform +styline +styling +stylings +stylion +stylisation +stylise +stylised +styliser +stylisers +stylises +stylish +stylishly +stylishness +stylising +stylist +stylistic +stylistical +stylistically +stylistics +stylists +stylite +stylites +stylitic +stylitism +stylization +stylize +stylized +stylizer +stylizers +stylizes +stylizing +still +stillage +stillatitious +stillatory +stillbirth +stillbirths +stillborn +stilled +stiller +stillery +stillest +stillhouse +stilly +stylli +stillicide +stillicidium +stillier +stilliest +stilliform +stilling +stillingia +stillion +stillish +stillman +stillmen +stillness +stillroom +stills +stillstand +stillwater +stylo +styloauricularis +stylobata +stylobate +stylochus +styloglossal +styloglossus +stylogonidium +stylograph +stylography +stylographic +stylographical +stylographically +stylohyal +stylohyoid +stylohyoidean +stylohyoideus +styloid +stylolite +stylolitic +stylomandibular +stylomastoid +stylomaxillary +stylometer +stylomyloid +stylommatophora +stylommatophorous +stylonychia +stylonurus +stylopharyngeal +stylopharyngeus +stilophora +stilophoraceae +stylopid +stylopidae +stylopization +stylopize +stylopized +stylopod +stylopodia +stylopodium +stylops +stylosanthes +stylospore +stylosporous +stylostegium +stylostemon +stylostixis +stylotypite +stilpnomelane +stilpnosiderite +stilt +stiltbird +stilted +stiltedly +stiltedness +stilter +stilty +stiltier +stiltiest +stiltify +stiltified +stiltifying +stiltiness +stilting +stiltish +stiltlike +stilton +stilts +stylus +styluses +stim +stime +stimes +stimy +stymy +stymie +stimied +stymied +stymieing +stimies +stymies +stimying +stymying +stimpart +stimpert +stymphalian +stymphalid +stymphalides +stimulability +stimulable +stimulance +stimulancy +stimulant +stimulants +stimulate +stimulated +stimulater +stimulates +stimulating +stimulatingly +stimulation +stimulations +stimulative +stimulatives +stimulator +stimulatory +stimulatress +stimulatrix +stimuli +stimulogenous +stimulose +stimulus +stine +sting +stingaree +stingareeing +stingbull +stinge +stinger +stingers +stingfish +stingfishes +stingy +stingier +stingiest +stingily +stinginess +stinging +stingingly +stingingness +stingless +stingo +stingos +stingproof +stingray +stingrays +stings +stingtail +stink +stinkard +stinkardly +stinkards +stinkaroo +stinkball +stinkberry +stinkberries +stinkbird +stinkbug +stinkbugs +stinkbush +stinkdamp +stinker +stinkeroo +stinkeroos +stinkers +stinkhorn +stinky +stinkibus +stinkier +stinkiest +stinkyfoot +stinking +stinkingly +stinkingness +stinko +stinkpot +stinkpots +stinks +stinkstone +stinkweed +stinkwood +stinkwort +stint +stinted +stintedly +stintedness +stinter +stinters +stinty +stinting +stintingly +stintless +stints +stion +stionic +stioning +stipa +stipate +stipe +stiped +stipel +stipellate +stipels +stipend +stipendary +stipendia +stipendial +stipendiary +stipendiarian +stipendiaries +stipendiate +stipendium +stipendiums +stipendless +stipends +stipes +styphelia +styphnate +styphnic +stipiform +stipitate +stipites +stipitiform +stipiture +stipiturus +stipo +stipos +stippen +stipple +stippled +stippledness +stippler +stipplers +stipples +stipply +stippling +stypsis +stypsises +styptic +styptical +stypticalness +stypticin +stypticity +stypticness +styptics +stipula +stipulable +stipulaceous +stipulae +stipulant +stipular +stipulary +stipulate +stipulated +stipulates +stipulating +stipulatio +stipulation +stipulations +stipulator +stipulatory +stipulators +stipule +stipuled +stipules +stipuliferous +stipuliform +stir +stirabout +styracaceae +styracaceous +styracin +styrax +styraxes +stire +styrene +styrenes +stiria +styrian +styryl +styrylic +stirk +stirks +stirless +stirlessly +stirlessness +stirling +styrofoam +styrogallol +styrol +styrolene +styrone +stirp +stirpes +stirpicultural +stirpiculture +stirpiculturist +stirps +stirra +stirrable +stirrage +stirred +stirrer +stirrers +stirring +stirringly +stirrings +stirrup +stirrupless +stirruplike +stirrups +stirrupwise +stirs +stitch +stitchbird +stitchdown +stitched +stitcher +stitchery +stitchers +stitches +stitching +stitchlike +stitchwhile +stitchwork +stitchwort +stite +stith +stithe +stythe +stithy +stithied +stithies +stithying +stithly +stituted +stive +stiver +stivers +stivy +styward +styx +styxian +stizolobium +stk +stlg +stm +stoa +stoach +stoae +stoai +stoas +stoat +stoater +stoating +stoats +stob +stobball +stobbed +stobbing +stobs +stocah +stoccado +stoccados +stoccata +stoccatas +stochastic +stochastical +stochastically +stock +stockade +stockaded +stockades +stockading +stockado +stockage +stockannet +stockateer +stockbow +stockbreeder +stockbreeding +stockbridge +stockbroker +stockbrokerage +stockbrokers +stockbroking +stockcar +stockcars +stocked +stocker +stockers +stockfather +stockfish +stockfishes +stockholder +stockholders +stockholding +stockholdings +stockholm +stockhorn +stockhouse +stocky +stockyard +stockyards +stockier +stockiest +stockily +stockiness +stockinet +stockinets +stockinette +stocking +stockinged +stockinger +stockinging +stockingless +stockings +stockish +stockishly +stockishness +stockist +stockists +stockjobber +stockjobbery +stockjobbing +stockjudging +stockkeeper +stockkeeping +stockless +stocklike +stockmaker +stockmaking +stockman +stockmen +stockowner +stockpile +stockpiled +stockpiler +stockpiles +stockpiling +stockpot +stockpots +stockproof +stockrider +stockriding +stockroom +stockrooms +stocks +stockstone +stocktaker +stocktaking +stockton +stockwork +stockwright +stod +stodge +stodged +stodger +stodgery +stodges +stodgy +stodgier +stodgiest +stodgily +stodginess +stodging +stodtone +stoechas +stoechiology +stoechiometry +stoechiometrically +stoep +stof +stoff +stog +stoga +stogey +stogeies +stogeys +stogy +stogie +stogies +stoic +stoical +stoically +stoicalness +stoicharion +stoicheiology +stoicheiometry +stoicheiometrically +stoichiology +stoichiological +stoichiometry +stoichiometric +stoichiometrical +stoichiometrically +stoicism +stoicisms +stoics +stoit +stoiter +stokavci +stokavian +stokavski +stoke +stoked +stokehold +stokehole +stoker +stokerless +stokers +stokes +stokesia +stokesias +stokesite +stoking +stokroos +stokvis +stola +stolae +stolas +stold +stole +stoled +stolelike +stolen +stolenly +stolenness +stolenwise +stoles +stolewise +stolid +stolider +stolidest +stolidity +stolidly +stolidness +stolist +stolkjaerre +stollen +stollens +stolon +stolonate +stolonic +stoloniferous +stoloniferously +stolonization +stolonlike +stolons +stolzite +stoma +stomacace +stomach +stomachable +stomachache +stomachaches +stomachachy +stomachal +stomached +stomacher +stomachers +stomaches +stomachful +stomachfully +stomachfulness +stomachy +stomachic +stomachical +stomachically +stomachicness +stomaching +stomachless +stomachlessness +stomachous +stomachs +stomack +stomal +stomapod +stomapoda +stomapodiform +stomapodous +stomas +stomata +stomatal +stomatalgia +stomate +stomates +stomatic +stomatiferous +stomatitic +stomatitis +stomatitus +stomatocace +stomatoda +stomatodaeal +stomatodaeum +stomatode +stomatodeum +stomatodynia +stomatogastric +stomatograph +stomatography +stomatolalia +stomatology +stomatologic +stomatological +stomatologist +stomatomalacia +stomatomenia +stomatomy +stomatomycosis +stomatonecrosis +stomatopathy +stomatophora +stomatophorous +stomatoplasty +stomatoplastic +stomatopod +stomatopoda +stomatopodous +stomatorrhagia +stomatoscope +stomatoscopy +stomatose +stomatosepsis +stomatotyphus +stomatotomy +stomatotomies +stomatous +stomenorrhagia +stomion +stomium +stomodaea +stomodaeal +stomodaeudaea +stomodaeum +stomodaeums +stomode +stomodea +stomodeal +stomodeum +stomodeumdea +stomodeums +stomoisia +stomoxys +stomp +stomped +stomper +stompers +stomping +stompingly +stomps +stonable +stonage +stond +stone +stoneable +stonebass +stonebird +stonebiter +stoneblindness +stoneboat +stonebow +stonebrash +stonebreak +stonebrood +stonecast +stonecat +stonechat +stonecraft +stonecrop +stonecutter +stonecutting +stoned +stonedamp +stonefish +stonefishes +stonefly +stoneflies +stonegale +stonegall +stoneground +stonehand +stonehatch +stonehead +stonehearted +stonehenge +stoney +stoneyard +stoneite +stonelayer +stonelaying +stoneless +stonelessness +stonelike +stoneman +stonemason +stonemasonry +stonemasons +stonemen +stonemint +stonen +stonepecker +stoneput +stoner +stoneroller +stoneroot +stoners +stones +stoneseed +stonesfield +stoneshot +stonesmatch +stonesmich +stonesmitch +stonesmith +stonewall +stonewalled +stonewaller +stonewally +stonewalling +stonewalls +stoneware +stoneweed +stonewise +stonewood +stonework +stoneworker +stoneworks +stonewort +stong +stony +stonied +stonier +stoniest +stonify +stonifiable +stonyhearted +stonyheartedly +stonyheartedness +stonily +stoniness +stoning +stonish +stonished +stonishes +stonishing +stonishment +stonk +stonker +stonkered +stood +stooded +stooden +stoof +stooge +stooged +stooges +stooging +stook +stooked +stooker +stookers +stookie +stooking +stooks +stool +stoolball +stooled +stoolie +stoolies +stooling +stoollike +stools +stoon +stoond +stoop +stoopball +stooped +stooper +stoopers +stoopgallant +stooping +stoopingly +stoops +stoorey +stoory +stoot +stooter +stooth +stoothing +stop +stopa +stopback +stopband +stopblock +stopboard +stopcock +stopcocks +stopdice +stope +stoped +stopen +stoper +stopers +stopes +stopgap +stopgaps +stophound +stoping +stopless +stoplessness +stoplight +stoplights +stopover +stopovers +stoppability +stoppable +stoppableness +stoppably +stoppage +stoppages +stopped +stoppel +stopper +stoppered +stoppering +stopperless +stoppers +stoppeur +stopping +stoppit +stopple +stoppled +stopples +stoppling +stops +stopship +stopt +stopway +stopwatch +stopwatches +stopwater +stopwork +stor +storability +storable +storables +storage +storages +storay +storax +storaxes +store +stored +storeen +storefront +storefronts +storehouse +storehouseman +storehouses +storey +storeyed +storeys +storekeep +storekeeper +storekeepers +storekeeping +storeman +storemaster +storemen +storer +storeroom +storerooms +stores +storeship +storesman +storewide +storge +story +storial +storiate +storiated +storiation +storyboard +storybook +storybooks +storied +storier +stories +storiette +storify +storified +storifying +storying +storyless +storyline +storylines +storymaker +storymonger +storing +storiology +storiological +storiologist +storyteller +storytellers +storytelling +storywise +storywork +storywriter +stork +storken +storkish +storklike +storkling +storks +storksbill +storkwise +storm +stormable +stormbelt +stormberg +stormbird +stormbound +stormcock +stormed +stormer +stormful +stormfully +stormfulness +stormy +stormier +stormiest +stormily +storminess +storming +stormingly +stormish +stormless +stormlessly +stormlessness +stormlike +stormproof +storms +stormtide +stormtight +stormward +stormwind +stormwise +stornelli +stornello +storthing +storting +stosh +stoss +stosston +stot +stoter +stoting +stotinka +stotinki +stotious +stott +stotter +stotterel +stoun +stound +stounded +stounding +stoundmeal +stounds +stoup +stoupful +stoups +stour +stoure +stoures +stoury +stourie +stouring +stourly +stourliness +stourness +stours +stoush +stout +stouten +stoutened +stoutening +stoutens +stouter +stoutest +stouth +stouthearted +stoutheartedly +stoutheartedness +stouthrief +stouty +stoutish +stoutly +stoutness +stouts +stoutwood +stovaine +stove +stovebrush +stoved +stoveful +stovehouse +stoveless +stovemaker +stovemaking +stoveman +stovemen +stoven +stovepipe +stovepipes +stover +stovers +stoves +stovewood +stovies +stoving +stow +stowable +stowage +stowages +stowaway +stowaways +stowball +stowboard +stowbord +stowbordman +stowbordmen +stowce +stowdown +stowed +stower +stowing +stowlins +stownet +stownlins +stowp +stowps +stows +stowse +stowth +stowwood +str +stra +strabism +strabismal +strabismally +strabismic +strabismical +strabismies +strabismometer +strabismometry +strabismus +strabometer +strabometry +strabotome +strabotomy +strabotomies +stracchino +strack +strackling +stract +strad +stradametrical +straddle +straddleback +straddlebug +straddled +straddler +straddlers +straddles +straddleways +straddlewise +straddling +straddlingly +strade +stradico +stradine +stradiot +stradivari +stradivarius +stradl +stradld +stradlings +strae +strafe +strafed +strafer +strafers +strafes +straffordian +strafing +strag +strage +straggle +straggled +straggler +stragglers +straggles +straggly +stragglier +straggliest +straggling +stragglingly +stragular +stragulum +stray +strayaway +strayed +strayer +strayers +straight +straightabout +straightaway +straightbred +straighted +straightedge +straightedged +straightedges +straightedging +straighten +straightened +straightener +straighteners +straightening +straightens +straighter +straightest +straightforward +straightforwardly +straightforwardness +straightforwards +straightfoward +straighthead +straighting +straightish +straightjacket +straightlaced +straightly +straightness +straights +straighttail +straightup +straightway +straightways +straightwards +straightwise +straying +straik +straike +strail +strayling +strain +strainable +strainableness +strainably +strained +strainedly +strainedness +strainer +strainerman +strainermen +strainers +straining +strainingly +strainless +strainlessly +strainometer +strainproof +strains +strainslip +straint +strays +strait +straiten +straitened +straitening +straitens +straiter +straitest +straitjacket +straitlaced +straitlacedly +straitlacedness +straitlacing +straitly +straitness +straits +straitsman +straitsmen +straitwork +straka +strake +straked +strakes +straky +stralet +stram +stramash +stramashes +stramazon +stramineous +stramineously +strammel +strammer +stramony +stramonies +stramonium +stramp +strand +strandage +stranded +strandedness +strander +stranders +stranding +strandless +strandline +strandlooper +strands +strandward +strang +strange +strangely +strangeling +strangeness +stranger +strangerdom +strangered +strangerhood +strangering +strangerlike +strangers +strangership +strangerwise +strangest +strangle +strangleable +strangled +stranglehold +stranglement +strangler +stranglers +strangles +strangletare +strangleweed +strangling +stranglingly +stranglings +strangulable +strangulate +strangulated +strangulates +strangulating +strangulation +strangulations +strangulative +strangulatory +strangullion +strangury +strangurious +strany +stranner +strap +straphang +straphanger +straphanging +straphead +strapless +straplike +strapontin +strappable +strappado +strappadoes +strappan +strapped +strapper +strappers +strapping +strapple +straps +strapwork +strapwort +strasburg +strass +strasses +strata +stratagem +stratagematic +stratagematical +stratagematically +stratagematist +stratagemical +stratagemically +stratagems +stratal +stratameter +stratas +strate +stratege +strategetic +strategetical +strategetics +strategi +strategy +strategian +strategic +strategical +strategically +strategics +strategies +strategist +strategists +strategize +strategoi +strategos +strategus +stratfordian +strath +straths +strathspey +strathspeys +strati +stratic +straticulate +straticulation +stratify +stratification +stratifications +stratified +stratifies +stratifying +stratiform +stratiformis +stratig +stratigrapher +stratigraphy +stratigraphic +stratigraphical +stratigraphically +stratigraphist +stratiomyiidae +stratiote +stratiotes +stratlin +stratochamber +stratocracy +stratocracies +stratocrat +stratocratic +stratocumuli +stratocumulus +stratofreighter +stratography +stratographic +stratographical +stratographically +stratojet +stratonic +stratonical +stratopause +stratopedarch +stratoplane +stratose +stratosphere +stratospheric +stratospherical +stratotrainer +stratous +stratovision +stratum +stratums +stratus +straucht +strauchten +straught +strauss +stravagant +stravage +stravaged +stravages +stravaging +stravague +stravaig +stravaiged +stravaiger +stravaiging +stravaigs +strave +stravinsky +straw +strawberry +strawberries +strawberrylike +strawbill +strawboard +strawbreadth +strawed +strawen +strawer +strawflower +strawfork +strawhat +strawy +strawyard +strawier +strawiest +strawing +strawish +strawless +strawlike +strawman +strawmote +straws +strawsmall +strawsmear +strawstack +strawstacker +strawwalker +strawwork +strawworm +stre +streahte +streak +streaked +streakedly +streakedness +streaker +streakers +streaky +streakier +streakiest +streakily +streakiness +streaking +streaklike +streaks +streakwise +stream +streambed +streamed +streamer +streamers +streamful +streamhead +streamy +streamier +streamiest +streaminess +streaming +streamingly +streamless +streamlet +streamlets +streamlike +streamline +streamlined +streamliner +streamliners +streamlines +streamling +streamlining +streams +streamside +streamway +streamward +streamwort +streck +streckly +stree +streek +streeked +streeker +streekers +streeking +streeks +streel +streeler +streen +streep +street +streetage +streetcar +streetcars +streeters +streetfighter +streetful +streetless +streetlet +streetlight +streetlike +streets +streetscape +streetside +streetway +streetwalker +streetwalkers +streetwalking +streetward +streetwise +strey +streyne +streit +streite +streke +strelitz +strelitzi +strelitzia +streltzi +stremma +stremmas +stremmatograph +streng +strengite +strength +strengthed +strengthen +strengthened +strengthener +strengtheners +strengthening +strengtheningly +strengthens +strengthful +strengthfulness +strengthy +strengthily +strengthless +strengthlessly +strengthlessness +strengths +strent +strenth +strenuity +strenuosity +strenuous +strenuously +strenuousness +strep +strepen +strepent +strepera +streperous +strephonade +strephosymbolia +strepitant +strepitantly +strepitation +strepitoso +strepitous +strepor +streps +strepsiceros +strepsinema +strepsiptera +strepsipteral +strepsipteran +strepsipteron +strepsipterous +strepsis +strepsitene +streptaster +streptobacilli +streptobacillus +streptocarpus +streptococcal +streptococci +streptococcic +streptococcocci +streptococcus +streptodornase +streptokinase +streptolysin +streptomyces +streptomycete +streptomycetes +streptomycin +streptoneura +streptoneural +streptoneurous +streptosepticemia +streptothricial +streptothricin +streptothricosis +streptothrix +streptotrichal +streptotrichosis +stress +stressed +stresser +stresses +stressful +stressfully +stressfulness +stressing +stressless +stresslessness +stressor +stressors +stret +stretch +stretchability +stretchable +stretchberry +stretched +stretcher +stretcherman +stretchers +stretches +stretchy +stretchier +stretchiest +stretchiness +stretching +stretchneck +stretchpants +stretchproof +stretman +stretmen +stretta +strettas +strette +stretti +stretto +strettos +streusel +streuselkuchen +streusels +strew +strewage +strewed +strewer +strewers +strewing +strewment +strewn +strews +strewth +stria +striae +strial +striaria +striariaceae +striatal +striate +striated +striates +striating +striation +striations +striatum +striature +strich +strych +striche +strychnia +strychnic +strychnin +strychnina +strychnine +strychninic +strychninism +strychninization +strychninize +strychnize +strychnol +strychnos +strick +stricken +strickenly +strickenness +stricker +strickle +strickled +strickler +strickles +strickless +strickling +stricks +strict +stricter +strictest +striction +strictish +strictly +strictness +strictum +stricture +strictured +strictures +strid +stridden +striddle +stride +strideleg +stridelegs +stridence +stridency +strident +stridently +strider +striders +strides +strideways +stridhan +stridhana +stridhanum +striding +stridingly +stridling +stridlins +stridor +stridors +stridulant +stridulate +stridulated +stridulating +stridulation +stridulator +stridulatory +stridulent +stridulous +stridulously +stridulousness +strife +strifeful +strifeless +strifemaker +strifemaking +strifemonger +strifeproof +strifes +striffen +strift +strig +striga +strigae +strigal +strigate +striges +striggle +stright +strigidae +strigiform +strigiformes +strigil +strigilate +strigilation +strigilator +strigiles +strigilis +strigillose +strigilous +strigils +striginae +strigine +strigose +strigous +strigovite +strigula +strigulaceae +strigulose +strike +strikeboard +strikeboat +strikebound +strikebreak +strikebreaker +strikebreakers +strikebreaking +striked +strikeless +striken +strikeout +strikeouts +strikeover +striker +strikers +strikes +striking +strikingly +strikingness +strymon +strind +string +stringboard +stringcourse +stringed +stringency +stringencies +stringendo +stringendos +stringene +stringent +stringently +stringentness +stringer +stringers +stringful +stringhalt +stringhalted +stringhaltedness +stringhalty +stringholder +stringy +stringybark +stringier +stringiest +stringily +stringiness +stringing +stringless +stringlike +stringmaker +stringmaking +stringman +stringmen +stringpiece +strings +stringsman +stringsmen +stringways +stringwood +strinkle +striola +striolae +striolate +striolated +striolet +strip +stripe +strype +striped +stripeless +striper +stripers +stripes +stripfilm +stripy +stripier +stripiest +striping +stripings +striplet +striplight +stripling +striplings +strippable +strippage +stripped +stripper +strippers +stripping +strippit +strippler +strips +stript +striptease +stripteased +stripteaser +stripteasers +stripteases +stripteasing +stripteuse +strit +strive +strived +striven +striver +strivers +strives +strivy +striving +strivingly +strivings +strix +stroam +strobe +strobed +strobes +strobic +strobil +strobila +strobilaceous +strobilae +strobilar +strobilate +strobilation +strobile +strobiles +strobili +strobiliferous +strobiliform +strobiline +strobilization +strobiloid +strobilomyces +strobilophyta +strobils +strobilus +stroboradiograph +stroboscope +stroboscopes +stroboscopy +stroboscopic +stroboscopical +stroboscopically +strobotron +strockle +stroddle +strode +stroganoff +stroy +stroyed +stroyer +stroyers +stroygood +stroying +stroil +stroys +stroke +stroked +stroker +strokers +strokes +strokesman +stroky +stroking +strokings +strold +stroll +strolld +strolled +stroller +strollers +strolling +strolls +strom +stroma +stromal +stromata +stromatal +stromateid +stromateidae +stromateoid +stromatic +stromatiform +stromatolite +stromatolitic +stromatology +stromatopora +stromatoporidae +stromatoporoid +stromatoporoidea +stromatous +stromb +strombidae +strombiform +strombite +stromboid +strombolian +strombuliferous +strombuliform +strombus +strome +stromed +stromeyerite +stroming +stromming +stromuhr +strond +strone +strong +strongarmer +strongback +strongbark +strongbox +strongboxes +strongbrained +stronger +strongest +strongfully +stronghand +stronghanded +stronghead +strongheaded +strongheadedly +strongheadedness +strongheadness +stronghearted +stronghold +strongholds +strongyl +strongylate +strongyle +strongyliasis +strongylid +strongylidae +strongylidosis +strongyloid +strongyloides +strongyloidosis +strongylon +strongyloplasmata +strongylosis +strongyls +strongylus +strongish +strongly +stronglike +strongman +strongmen +strongness +strongpoint +strongroom +strongrooms +strontia +strontian +strontianiferous +strontianite +strontias +strontic +strontion +strontitic +strontium +strook +strooken +stroot +strop +strophaic +strophanhin +strophanthin +strophanthus +stropharia +strophe +strophes +strophic +strophical +strophically +strophiolate +strophiolated +strophiole +strophoid +strophomena +strophomenacea +strophomenid +strophomenidae +strophomenoid +strophosis +strophotaxis +strophulus +stropped +stropper +stroppy +stropping +stroppings +strops +strosser +stroth +strother +stroud +strouding +strouds +strounge +stroup +strout +strouthiocamel +strouthiocamelian +strouthocamelian +strove +strow +strowd +strowed +strowing +strown +strows +strub +strubbly +strucion +struck +strucken +struct +structed +struction +structional +structive +structural +structuralism +structuralist +structuralization +structuralize +structurally +structuration +structure +structured +structureless +structurelessness +structurely +structurer +structures +structuring +structurist +strude +strudel +strudels +strue +struggle +struggled +struggler +strugglers +struggles +struggling +strugglingly +struis +struissle +struldbrug +struldbruggian +struldbruggism +strum +struma +strumae +strumas +strumatic +strumaticness +strumectomy +strumella +strumiferous +strumiform +strumiprivic +strumiprivous +strumitis +strummed +strummer +strummers +strumming +strumose +strumous +strumousness +strumpet +strumpetlike +strumpetry +strumpets +strums +strumstrum +strumulose +strung +strunt +strunted +strunting +strunts +struse +strut +struth +struthian +struthiform +struthiiform +struthiin +struthin +struthio +struthioid +struthiomimus +struthiones +struthionidae +struthioniform +struthioniformes +struthionine +struthiopteris +struthious +struthonine +struts +strutted +strutter +strutters +strutting +struttingly +struv +struvite +stu +stuart +stuartia +stub +stubachite +stubb +stubbed +stubbedness +stubber +stubby +stubbier +stubbiest +stubbily +stubbiness +stubbing +stubble +stubbleberry +stubbled +stubbles +stubbleward +stubbly +stubblier +stubbliest +stubbliness +stubbling +stubboy +stubborn +stubborner +stubbornest +stubbornhearted +stubbornly +stubbornness +stubchen +stube +stuber +stubiest +stuboy +stubornly +stubrunner +stubs +stubwort +stucco +stuccoed +stuccoer +stuccoers +stuccoes +stuccoyer +stuccoing +stuccos +stuccowork +stuccoworker +stuck +stucken +stucking +stuckling +stucturelessness +stud +studbook +studbooks +studded +studder +studdery +studdy +studdie +studdies +studding +studdings +studdingsail +studdle +stude +student +studenthood +studentless +studentlike +studentry +students +studentship +studerite +studfish +studfishes +studflower +studhorse +studhorses +study +studia +studiable +studied +studiedly +studiedness +studier +studiers +studies +studying +studio +studios +studious +studiously +studiousness +studys +studite +studium +studs +studwork +studworks +stue +stuff +stuffage +stuffata +stuffed +stuffender +stuffer +stuffers +stuffgownsman +stuffy +stuffier +stuffiest +stuffily +stuffiness +stuffing +stuffings +stuffless +stuffs +stug +stuggy +stuiver +stuivers +stull +stuller +stulls +stulm +stulty +stultify +stultification +stultified +stultifier +stultifies +stultifying +stultiloquence +stultiloquently +stultiloquy +stultiloquious +stultioquy +stultloquent +stum +stumble +stumblebum +stumblebunny +stumbled +stumbler +stumblers +stumbles +stumbly +stumbling +stumblingly +stumer +stummed +stummel +stummer +stummy +stumming +stumor +stumour +stump +stumpage +stumpages +stumped +stumper +stumpers +stumpy +stumpier +stumpiest +stumpily +stumpiness +stumping +stumpish +stumpknocker +stumpless +stumplike +stumpling +stumpnose +stumps +stumpsucker +stumpwise +stums +stun +stundism +stundist +stung +stunk +stunkard +stunned +stunner +stunners +stunning +stunningly +stunpoll +stuns +stunsail +stunsails +stunsle +stunt +stunted +stuntedly +stuntedness +stunter +stunty +stuntiness +stunting +stuntingly +stuntist +stuntness +stunts +stupa +stupas +stupe +stuped +stupefacient +stupefaction +stupefactive +stupefactiveness +stupefy +stupefied +stupefiedness +stupefier +stupefies +stupefying +stupend +stupendious +stupendly +stupendous +stupendously +stupendousness +stupent +stupeous +stupes +stupex +stuphe +stupid +stupider +stupidest +stupidhead +stupidheaded +stupidish +stupidity +stupidities +stupidly +stupidness +stupids +stuping +stupor +stuporific +stuporose +stuporous +stupors +stupose +stupp +stuprate +stuprated +stuprating +stupration +stuprum +stupulose +sturble +sturdy +sturdied +sturdier +sturdiersturdies +sturdiest +sturdyhearted +sturdily +sturdiness +sturgeon +sturgeons +sturin +sturine +sturiones +sturionian +sturionine +sturk +sturmian +sturnella +sturnidae +sturniform +sturninae +sturnine +sturnoid +sturnus +sturoch +sturshum +sturt +sturtan +sturte +sturty +sturtin +sturtion +sturtite +sturts +stuss +stut +stutter +stuttered +stutterer +stutterers +stuttering +stutteringly +stutters +su +suability +suable +suably +suade +suaeda +suaharo +sualocin +suanitian +suant +suantly +suasibility +suasible +suasion +suasionist +suasions +suasive +suasively +suasiveness +suasory +suasoria +suavastika +suave +suavely +suaveness +suaveolent +suaver +suavest +suavify +suaviloquence +suaviloquent +suavity +suavities +sub +suba +subabbot +subabbots +subabdominal +subability +subabilities +subabsolute +subabsolutely +subabsoluteness +subacademic +subacademical +subacademically +subaccount +subacetabular +subacetate +subacid +subacidity +subacidly +subacidness +subacidulous +subacrid +subacridity +subacridly +subacridness +subacrodrome +subacrodromous +subacromial +subact +subaction +subacuminate +subacumination +subacute +subacutely +subadar +subadars +subadditive +subadditively +subadjacent +subadjacently +subadjutor +subadministrate +subadministrated +subadministrating +subadministration +subadministrative +subadministratively +subadministrator +subadult +subadultness +subadults +subaduncate +subadvocate +subaerate +subaerated +subaerating +subaeration +subaerial +subaerially +subaetheric +subaffluence +subaffluent +subaffluently +subage +subagency +subagencies +subagent +subagents +subaggregate +subaggregately +subaggregation +subaggregative +subah +subahdar +subahdary +subahdars +subahs +subahship +subaid +subakhmimic +subalar +subalary +subalate +subalated +subalbid +subalgebra +subalgebraic +subalgebraical +subalgebraically +subalgebraist +subalimentation +subalkaline +suballiance +suballiances +suballocate +suballocated +suballocating +subalmoner +subalpine +subaltern +subalternant +subalternate +subalternately +subalternating +subalternation +subalternity +subalterns +subamare +subanal +subanconeal +subandean +subangled +subangular +subangularity +subangularities +subangularly +subangularness +subangulate +subangulated +subangulately +subangulation +subanniversary +subantarctic +subantichrist +subantique +subantiquely +subantiqueness +subantiquity +subantiquities +subanun +subapical +subapically +subaponeurotic +subapostolic +subapparent +subapparently +subapparentness +subappearance +subappressed +subapprobatiness +subapprobation +subapprobative +subapprobativeness +subapprobatory +subapterous +subaqua +subaqual +subaquatic +subaquean +subaqueous +subarachnoid +subarachnoidal +subarachnoidean +subarboraceous +subarboreal +subarboreous +subarborescence +subarborescent +subarch +subarchesporial +subarchitect +subarctic +subarcuate +subarcuated +subarcuation +subarea +subareal +subareas +subareolar +subareolet +subarian +subarid +subarytenoid +subarytenoidal +subarmale +subarmor +subarousal +subarouse +subarration +subarrhation +subartesian +subarticle +subarticulate +subarticulately +subarticulateness +subarticulation +subarticulative +subas +subascending +subashi +subassemblage +subassembler +subassembly +subassemblies +subassociation +subassociational +subassociations +subassociative +subassociatively +subastragalar +subastragaloid +subastral +subastringent +subatmospheric +subatom +subatomic +subatoms +subattenuate +subattenuated +subattenuation +subattorney +subattorneys +subattorneyship +subaud +subaudibility +subaudible +subaudibleness +subaudibly +subaudition +subauditionist +subauditor +subauditur +subaural +subaurally +subauricular +subauriculate +subautomatic +subautomatically +subaverage +subaveragely +subaxial +subaxially +subaxile +subaxillar +subaxillary +subbailie +subbailiff +subbailiwick +subballast +subband +subbank +subbasal +subbasaltic +subbase +subbasement +subbasements +subbases +subbass +subbassa +subbasses +subbeadle +subbeau +subbed +subbias +subbifid +subbing +subbings +subbituminous +subbookkeeper +subboreal +subbourdon +subbrachial +subbrachian +subbrachiate +subbrachycephaly +subbrachycephalic +subbrachyskelic +subbranch +subbranched +subbranches +subbranchial +subbreed +subbreeds +subbrigade +subbrigadier +subbroker +subbromid +subbromide +subbronchial +subbronchially +subbureau +subbureaus +subbureaux +subcabinet +subcaecal +subcalcareous +subcalcarine +subcaliber +subcalibre +subcallosal +subcampanulate +subcancellate +subcancellous +subcandid +subcandidly +subcandidness +subcantor +subcapsular +subcaptain +subcaptaincy +subcaptainship +subcaption +subcarbide +subcarbonaceous +subcarbonate +subcarboniferous +subcarbureted +subcarburetted +subcardinal +subcardinally +subcarinate +subcarinated +subcartilaginous +subcase +subcash +subcashier +subcasing +subcasino +subcasinos +subcast +subcaste +subcategory +subcategories +subcaudal +subcaudate +subcaulescent +subcause +subcauses +subcavate +subcavity +subcavities +subcelestial +subcell +subcellar +subcellars +subcells +subcellular +subcenter +subcentral +subcentrally +subcentre +subception +subcerebellar +subcerebral +subch +subchairman +subchairmen +subchamberer +subchancel +subchannel +subchannels +subchanter +subchapter +subchapters +subchaser +subchela +subchelae +subchelate +subcheliform +subchief +subchiefs +subchloride +subchondral +subchordal +subchorioid +subchorioidal +subchorionic +subchoroid +subchoroidal +subchronic +subchronical +subchronically +subcyaneous +subcyanid +subcyanide +subcycle +subcycles +subcylindric +subcylindrical +subcinctoria +subcinctorium +subcincttoria +subcineritious +subcingulum +subcircuit +subcircular +subcircularity +subcircularly +subcision +subcity +subcities +subcivilization +subcivilizations +subcivilized +subclaim +subclamatores +subclan +subclans +subclass +subclassed +subclasses +subclassify +subclassification +subclassifications +subclassified +subclassifies +subclassifying +subclassing +subclausal +subclause +subclauses +subclavate +subclavia +subclavian +subclavicular +subclavii +subclavioaxillary +subclaviojugular +subclavius +subclei +subclerk +subclerks +subclerkship +subclimactic +subclimate +subclimatic +subclimax +subclinical +subclinically +subclique +subclone +subclover +subcoastal +subcoat +subcollateral +subcollector +subcollectorship +subcollege +subcollegial +subcollegiate +subcolumnar +subcommander +subcommanders +subcommandership +subcommendation +subcommendatory +subcommended +subcommissary +subcommissarial +subcommissaries +subcommissaryship +subcommission +subcommissioner +subcommissioners +subcommissionership +subcommissions +subcommit +subcommittee +subcommittees +subcommunity +subcompact +subcompacts +subcompany +subcompensate +subcompensated +subcompensating +subcompensation +subcompensational +subcompensative +subcompensatory +subcomplete +subcompletely +subcompleteness +subcompletion +subcomponent +subcomponents +subcompressed +subcomputation +subcomputations +subconcave +subconcavely +subconcaveness +subconcavity +subconcavities +subconcealed +subconcession +subconcessionaire +subconcessionary +subconcessionaries +subconcessioner +subconchoidal +subconference +subconferential +subconformability +subconformable +subconformableness +subconformably +subconic +subconical +subconically +subconjunctival +subconjunctive +subconjunctively +subconnate +subconnation +subconnect +subconnectedly +subconnivent +subconscience +subconscious +subconsciously +subconsciousness +subconservator +subconsideration +subconstable +subconstellation +subconsul +subconsular +subconsulship +subcontained +subcontest +subcontiguous +subcontinent +subcontinental +subcontinents +subcontinual +subcontinued +subcontinuous +subcontract +subcontracted +subcontracting +subcontractor +subcontractors +subcontracts +subcontraoctave +subcontrary +subcontraries +subcontrariety +subcontrarily +subcontrol +subcontrolled +subcontrolling +subconvex +subconvolute +subconvolutely +subcool +subcooled +subcooling +subcools +subcoracoid +subcordate +subcordately +subcordiform +subcoriaceous +subcorymbose +subcorymbosely +subcorneous +subcornual +subcorporation +subcortex +subcortical +subcortically +subcortices +subcosta +subcostae +subcostal +subcostalis +subcouncil +subcouncils +subcover +subcranial +subcranially +subcreative +subcreatively +subcreativeness +subcreek +subcrenate +subcrenated +subcrenately +subcrepitant +subcrepitation +subcrescentic +subcrest +subcriminal +subcriminally +subcript +subcrystalline +subcritical +subcrossing +subcruciform +subcrureal +subcrureus +subcrust +subcrustaceous +subcrustal +subcubic +subcubical +subcuboid +subcuboidal +subcultrate +subcultrated +subcultural +subculturally +subculture +subcultured +subcultures +subculturing +subcuneus +subcurate +subcurator +subcuratorial +subcurators +subcuratorship +subcurrent +subcutaneous +subcutaneously +subcutaneousness +subcutes +subcuticular +subcutis +subcutises +subdatary +subdataries +subdate +subdated +subdating +subdeacon +subdeaconate +subdeaconess +subdeaconry +subdeacons +subdeaconship +subdealer +subdean +subdeanery +subdeans +subdeb +subdebs +subdebutante +subdebutantes +subdecanal +subdecimal +subdecuple +subdeducible +subdefinition +subdefinitions +subdelegate +subdelegated +subdelegating +subdelegation +subdeliliria +subdeliria +subdelirium +subdeliriums +subdeltaic +subdeltoid +subdeltoidal +subdemonstrate +subdemonstrated +subdemonstrating +subdemonstration +subdendroid +subdendroidal +subdenomination +subdentate +subdentated +subdentation +subdented +subdenticulate +subdenticulated +subdepartment +subdepartmental +subdepartments +subdeposit +subdepository +subdepositories +subdepot +subdepots +subdepressed +subdeputy +subdeputies +subderivative +subdermal +subdermic +subdeterminant +subdevil +subdiaconal +subdiaconate +subdiaconus +subdial +subdialect +subdialectal +subdialectally +subdialects +subdiapason +subdiapasonic +subdiapente +subdiaphragmatic +subdiaphragmatically +subdichotomy +subdichotomies +subdichotomize +subdichotomous +subdichotomously +subdie +subdilated +subdirector +subdirectory +subdirectories +subdirectors +subdirectorship +subdiscipline +subdisciplines +subdiscoid +subdiscoidal +subdisjunctive +subdistich +subdistichous +subdistichously +subdistinction +subdistinctions +subdistinctive +subdistinctively +subdistinctiveness +subdistinguish +subdistinguished +subdistrict +subdistricts +subdit +subdititious +subdititiously +subdivecious +subdiversify +subdividable +subdivide +subdivided +subdivider +subdivides +subdividing +subdividingly +subdivine +subdivinely +subdivineness +subdivisible +subdivision +subdivisional +subdivisions +subdivisive +subdoctor +subdolent +subdolichocephaly +subdolichocephalic +subdolichocephalism +subdolichocephalous +subdolous +subdolously +subdolousness +subdomains +subdominance +subdominant +subdorsal +subdorsally +subdouble +subdrain +subdrainage +subdrill +subdruid +subduable +subduableness +subduably +subdual +subduals +subduce +subduced +subduces +subducing +subduct +subducted +subducting +subduction +subducts +subdue +subdued +subduedly +subduedness +subduement +subduer +subduers +subdues +subduing +subduingly +subduple +subduplicate +subdural +subdurally +subdure +subdwarf +subecho +subechoes +subectodermal +subectodermic +subedit +subedited +subediting +subeditor +subeditorial +subeditors +subeditorship +subedits +subeffective +subeffectively +subeffectiveness +subelaphine +subelection +subelectron +subelement +subelemental +subelementally +subelementary +subelliptic +subelliptical +subelongate +subelongated +subemarginate +subemarginated +subemployed +subemployment +subencephalon +subencephaltic +subendymal +subendocardial +subendorse +subendorsed +subendorsement +subendorsing +subendothelial +subenfeoff +subengineer +subentire +subentitle +subentitled +subentitling +subentry +subentries +subepidermal +subepiglottal +subepiglottic +subepithelial +subepoch +subepochs +subequal +subequality +subequalities +subequally +subequatorial +subequilateral +subequivalve +suber +suberane +suberate +suberect +suberectly +suberectness +subereous +suberic +suberiferous +suberification +suberiform +suberin +suberine +suberinization +suberinize +suberins +suberise +suberised +suberises +suberising +suberite +suberites +suberitidae +suberization +suberize +suberized +suberizes +suberizing +suberone +suberose +suberous +subers +subescheator +subesophageal +subessential +subessentially +subessentialness +subestuarine +subet +subeth +subetheric +subevergreen +subexaminer +subexcitation +subexcite +subexecutor +subexpression +subexpressions +subextensibility +subextensible +subextensibleness +subextensibness +subexternal +subexternally +subface +subfacies +subfactor +subfactory +subfactorial +subfactories +subfalcate +subfalcial +subfalciform +subfamily +subfamilies +subfascial +subfastigiate +subfastigiated +subfebrile +subferryman +subferrymen +subfestive +subfestively +subfestiveness +subfeu +subfeudation +subfeudatory +subfibrous +subfief +subfield +subfields +subfigure +subfigures +subfile +subfiles +subfissure +subfix +subfixes +subflavor +subflavour +subflexuose +subflexuous +subflexuously +subfloor +subflooring +subfloors +subflora +subfluid +subflush +subfluvial +subfocal +subfoliar +subfoliate +subfoliation +subforeman +subforemanship +subforemen +subform +subformation +subformative +subformatively +subformativeness +subfossil +subfossorial +subfoundation +subfraction +subfractional +subfractionally +subfractionary +subfractions +subframe +subfreezing +subfreshman +subfreshmen +subfrontal +subfrontally +subfulgent +subfulgently +subfumigation +subfumose +subfunction +subfunctional +subfunctionally +subfunctions +subfusc +subfuscous +subfusiform +subfusk +subg +subgalea +subgallate +subganger +subganoid +subgape +subgaped +subgaping +subgelatinization +subgelatinoid +subgelatinous +subgelatinously +subgelatinousness +subgenera +subgeneric +subgenerical +subgenerically +subgeniculate +subgeniculation +subgenital +subgens +subgentes +subgenual +subgenus +subgenuses +subgeometric +subgeometrical +subgeometrically +subgerminal +subgerminally +subget +subgiant +subgyre +subgyri +subgyrus +subgit +subglabrous +subglacial +subglacially +subglenoid +subgloboid +subglobose +subglobosely +subglobosity +subglobous +subglobular +subglobularity +subglobularly +subglobulose +subglossal +subglossitis +subglottal +subglottally +subglottic +subglumaceous +subgoal +subgoals +subgod +subgoverness +subgovernor +subgovernorship +subgrade +subgrades +subgranular +subgranularity +subgranularly +subgraph +subgraphs +subgrin +subgroup +subgroups +subgular +subgum +subgwely +subhalid +subhalide +subhall +subharmonic +subhastation +subhatchery +subhatcheries +subhead +subheading +subheadings +subheadquarters +subheads +subheadwaiter +subhealth +subhedral +subhemispheric +subhemispherical +subhemispherically +subhepatic +subherd +subhero +subheroes +subhexagonal +subhyalin +subhyaline +subhyaloid +subhymenial +subhymenium +subhyoid +subhyoidean +subhypotheses +subhypothesis +subhirsuness +subhirsute +subhirsuteness +subhysteria +subhooked +subhorizontal +subhorizontally +subhorizontalness +subhornblendic +subhouse +subhuman +subhumanly +subhumans +subhumeral +subhumid +subicle +subicteric +subicterical +subicular +subiculum +subidar +subidea +subideal +subideas +subiya +subilia +subililia +subilium +subimaginal +subimago +subimbricate +subimbricated +subimbricately +subimbricative +subimposed +subimpressed +subincandescent +subincident +subincise +subincision +subincomplete +subindex +subindexes +subindicate +subindicated +subindicating +subindication +subindicative +subindices +subindividual +subinduce +subinfection +subinfer +subinferior +subinferred +subinferring +subinfeud +subinfeudate +subinfeudated +subinfeudating +subinfeudation +subinfeudatory +subinfeudatories +subinflammation +subinflammatory +subinfluent +subinform +subingression +subinguinal +subinitial +subinoculate +subinoculation +subinsert +subinsertion +subinspector +subinspectorship +subintegumental +subintegumentary +subintellection +subintelligential +subintelligitur +subintent +subintention +subintentional +subintentionally +subintercessor +subinternal +subinternally +subinterval +subintervals +subintestinal +subintimal +subintrant +subintroduce +subintroduced +subintroducing +subintroduction +subintroductive +subintroductory +subinvolute +subinvoluted +subinvolution +subiodide +subirrigate +subirrigated +subirrigating +subirrigation +subitane +subitaneous +subitany +subitem +subitems +subito +subitous +subj +subjacency +subjacent +subjacently +subjack +subject +subjectability +subjectable +subjectdom +subjected +subjectedly +subjectedness +subjecthood +subjectibility +subjectible +subjectify +subjectification +subjectified +subjectifying +subjectile +subjecting +subjection +subjectional +subjectist +subjective +subjectively +subjectiveness +subjectivism +subjectivist +subjectivistic +subjectivistically +subjectivity +subjectivization +subjectivize +subjectivoidealistic +subjectless +subjectlike +subjectness +subjects +subjectship +subjee +subjicible +subjoin +subjoinder +subjoined +subjoining +subjoins +subjoint +subjudge +subjudgeship +subjudicial +subjudicially +subjudiciary +subjudiciaries +subjugable +subjugal +subjugate +subjugated +subjugates +subjugating +subjugation +subjugator +subjugators +subjugular +subjunct +subjunction +subjunctive +subjunctively +subjunctives +subjunior +subking +subkingdom +subkingdoms +sublabial +sublabially +sublaciniate +sublacunose +sublacustrine +sublayer +sublayers +sublanate +sublanceolate +sublanguage +sublanguages +sublapsar +sublapsary +sublapsarian +sublapsarianism +sublaryngal +sublaryngeal +sublaryngeally +sublate +sublated +sublateral +sublates +sublating +sublation +sublative +sublattices +sublavius +subleader +sublease +subleased +subleases +subleasing +sublecturer +sublegislation +sublegislature +sublenticular +sublenticulate +sublessee +sublessor +sublet +sublethal +sublethally +sublets +sublettable +subletter +subletting +sublevaminous +sublevate +sublevation +sublevel +sublevels +sublibrarian +sublibrarianship +sublicense +sublicensed +sublicensee +sublicenses +sublicensing +sublid +sublieutenancy +sublieutenant +subligation +sublighted +sublimable +sublimableness +sublimant +sublimate +sublimated +sublimates +sublimating +sublimation +sublimational +sublimationist +sublimations +sublimator +sublimatory +sublime +sublimed +sublimely +sublimeness +sublimer +sublimers +sublimes +sublimest +sublimification +subliminal +subliminally +subliming +sublimish +sublimitation +sublimity +sublimities +sublimize +subline +sublinear +sublineation +sublingua +sublinguae +sublingual +sublinguate +sublist +sublists +subliterary +subliterate +subliterature +sublittoral +sublobular +sublong +subloral +subloreal +sublot +sublumbar +sublunar +sublunary +sublunate +sublunated +sublustrous +sublustrously +sublustrousness +subluxate +subluxation +submachine +submaid +submain +submakroskelic +submammary +subman +submanager +submanagership +submandibular +submania +submaniacal +submaniacally +submanic +submanor +submarginal +submarginally +submarginate +submargined +submarine +submarined +submariner +submariners +submarines +submarining +submarinism +submarinist +submarshal +submaster +submatrices +submatrix +submatrixes +submaxilla +submaxillae +submaxillary +submaxillas +submaximal +submeaning +submedial +submedially +submedian +submediant +submediation +submediocre +submeeting +submember +submembers +submembranaceous +submembranous +submen +submeningeal +submenta +submental +submentum +submerge +submerged +submergement +submergence +submergences +submerges +submergibility +submergible +submerging +submerse +submersed +submerses +submersibility +submersible +submersibles +submersing +submersion +submersions +submetallic +submetaphoric +submetaphorical +submetaphorically +submeter +submetering +submicrogram +submicron +submicroscopic +submicroscopical +submicroscopically +submiliary +submind +subminiature +subminiaturization +subminiaturize +subminiaturized +subminiaturizes +subminiaturizing +subminimal +subminister +subministrant +submiss +submissible +submission +submissionist +submissions +submissit +submissive +submissively +submissiveness +submissly +submissness +submit +submytilacea +submitochondrial +submits +submittal +submittance +submitted +submitter +submitting +submittingly +submode +submodes +submodule +submodules +submolecular +submolecule +submonition +submontagne +submontane +submontanely +submontaneous +submorphous +submortgage +submotive +submountain +submucosa +submucosae +submucosal +submucosally +submucous +submucronate +submucronated +submultiple +submultiplexed +submundane +submuriate +submuscular +submuscularly +subnacreous +subnanosecond +subnarcotic +subnasal +subnascent +subnatural +subnaturally +subnaturalness +subnect +subnervian +subness +subnet +subnets +subnetwork +subnetworks +subneural +subnex +subnitrate +subnitrated +subniveal +subnivean +subnodal +subnode +subnodes +subnodulose +subnodulous +subnormal +subnormality +subnormally +subnotation +subnotational +subnote +subnotochordal +subnubilar +subnuclei +subnucleus +subnucleuses +subnude +subnumber +subnutritious +subnutritiously +subnutritiousness +subnuvolar +suboblique +subobliquely +subobliqueness +subobscure +subobscurely +subobscureness +subobsolete +subobsoletely +subobsoleteness +subobtuse +subobtusely +subobtuseness +suboccipital +subocean +suboceanic +suboctave +suboctile +suboctuple +subocular +subocularly +suboesophageal +suboffice +subofficer +subofficers +suboffices +subofficial +subofficially +subolive +subopaque +subopaquely +subopaqueness +subopercle +subopercular +suboperculum +subopposite +suboppositely +suboppositeness +suboptic +suboptical +suboptically +suboptima +suboptimal +suboptimally +suboptimization +suboptimum +suboptimuma +suboptimums +suboral +suborbicular +suborbicularity +suborbicularly +suborbiculate +suborbiculated +suborbital +suborbitar +suborbitary +subordain +suborder +suborders +subordinacy +subordinal +subordinary +subordinaries +subordinate +subordinated +subordinately +subordinateness +subordinates +subordinating +subordinatingly +subordination +subordinationism +subordinationist +subordinations +subordinative +subordinator +suborganic +suborganically +suborn +subornation +subornations +subornative +suborned +suborner +suborners +suborning +suborns +suboscines +suboval +subovarian +subovate +subovated +suboverseer +subovoid +suboxid +suboxidation +suboxide +suboxides +subpackage +subpagoda +subpallial +subpalmate +subpalmated +subpanation +subpanel +subpar +subparagraph +subparagraphs +subparalytic +subparallel +subparameter +subparameters +subparietal +subparliament +subpart +subparty +subparties +subpartition +subpartitioned +subpartitionment +subpartnership +subparts +subpass +subpassage +subpastor +subpastorship +subpatellar +subpatron +subpatronal +subpatroness +subpattern +subpavement +subpectinate +subpectinated +subpectination +subpectoral +subpeduncle +subpeduncled +subpeduncular +subpedunculate +subpedunculated +subpellucid +subpellucidity +subpellucidly +subpellucidness +subpeltate +subpeltated +subpeltately +subpena +subpenaed +subpenaing +subpenas +subpentagonal +subpentangular +subpericardiac +subpericardial +subpericranial +subperiod +subperiosteal +subperiosteally +subperitoneal +subperitoneally +subpermanent +subpermanently +subperpendicular +subpetiolar +subpetiolate +subpetiolated +subpetrosal +subpharyngal +subpharyngeal +subpharyngeally +subphases +subphyla +subphylar +subphylla +subphylum +subphosphate +subphratry +subphratries +subphrenic +subpial +subpilose +subpilosity +subpimp +subpyramidal +subpyramidic +subpyramidical +subpyriform +subpiston +subplacenta +subplacentae +subplacental +subplacentas +subplant +subplantigrade +subplat +subplate +subpleural +subplexal +subplinth +subplot +subplots +subplow +subpodophyllous +subpoena +subpoenaed +subpoenaing +subpoenal +subpoenas +subpolar +subpolygonal +subpolygonally +subpool +subpools +subpopular +subpopulation +subpopulations +subporphyritic +subport +subpost +subpostmaster +subpostmastership +subpostscript +subpotency +subpotencies +subpotent +subpreceptor +subpreceptoral +subpreceptorate +subpreceptorial +subpredicate +subpredication +subpredicative +subprefect +subprefectorial +subprefecture +subprehensile +subprehensility +subpreputial +subpress +subprimary +subprincipal +subprincipals +subprior +subprioress +subpriorship +subproblem +subproblems +subprocess +subprocesses +subproctor +subproctorial +subproctorship +subproduct +subprofessional +subprofessionally +subprofessor +subprofessorate +subprofessoriate +subprofessorship +subprofitable +subprofitableness +subprofitably +subprogram +subprograms +subproject +subproof +subproofs +subproportional +subproportionally +subprostatic +subprotector +subprotectorship +subprovince +subprovinces +subprovincial +subpubescent +subpubic +subpulmonary +subpulverizer +subpunch +subpunctuation +subpurchaser +subpurlin +subputation +subquadrangular +subquadrate +subquality +subqualities +subquarter +subquarterly +subquestion +subqueues +subquinquefid +subquintuple +subra +subrace +subraces +subradial +subradiance +subradiancy +subradiate +subradiative +subradical +subradicalness +subradicness +subradius +subradular +subrail +subrailway +subrameal +subramose +subramous +subrange +subranges +subrational +subreader +subreason +subrebellion +subrectal +subrectangular +subrector +subrectory +subrectories +subreference +subregent +subregion +subregional +subregions +subregular +subregularity +subreguli +subregulus +subrelation +subreligion +subreniform +subrent +subrents +subrepand +subrepent +subreport +subreptary +subreption +subreptitious +subreptitiously +subreptive +subreputable +subreputably +subresin +subresults +subretinal +subretractile +subrhombic +subrhombical +subrhomboid +subrhomboidal +subrictal +subrident +subridently +subrigid +subrigidity +subrigidly +subrigidness +subring +subrings +subrision +subrisive +subrisory +subrogate +subrogated +subrogating +subrogation +subrogee +subrogor +subroot +subrostral +subrotund +subrotundity +subrotundly +subrotundness +subround +subroutine +subroutines +subroutining +subrule +subruler +subrules +subs +subsacral +subsale +subsales +subsaline +subsalinity +subsalt +subsample +subsampled +subsampling +subsartorial +subsatellite +subsatiric +subsatirical +subsatirically +subsatiricalness +subsaturated +subsaturation +subscale +subscapular +subscapulary +subscapularis +subschedule +subschedules +subschema +subschemas +subscheme +subschool +subscience +subscleral +subsclerotic +subscribable +subscribe +subscribed +subscriber +subscribers +subscribership +subscribes +subscribing +subscript +subscripted +subscripting +subscription +subscriptionist +subscriptions +subscriptive +subscriptively +subscripts +subscripture +subscrive +subscriver +subsea +subsecive +subsecretary +subsecretarial +subsecretaries +subsecretaryship +subsect +subsection +subsections +subsects +subsecurity +subsecurities +subsecute +subsecutive +subsegment +subsegments +subsella +subsellia +subsellium +subsemifusa +subsemitone +subsensation +subsense +subsensible +subsensual +subsensually +subsensuous +subsensuously +subsensuousness +subsept +subseptate +subseptuple +subsequence +subsequences +subsequency +subsequent +subsequential +subsequentially +subsequently +subsequentness +subsere +subseres +subseries +subserosa +subserous +subserrate +subserrated +subserve +subserved +subserves +subserviate +subservience +subserviency +subservient +subserviently +subservientness +subserving +subsesqui +subsessile +subset +subsets +subsetting +subsewer +subsextuple +subshaft +subshafts +subshell +subsheriff +subshire +subshrub +subshrubby +subshrubs +subsibilance +subsibilancy +subsibilant +subsibilantly +subsicive +subside +subsided +subsidence +subsidency +subsident +subsider +subsiders +subsides +subsidy +subsidiary +subsidiarie +subsidiaries +subsidiarily +subsidiariness +subsidies +subsiding +subsidise +subsidist +subsidium +subsidizable +subsidization +subsidizations +subsidize +subsidized +subsidizer +subsidizes +subsidizing +subsign +subsilicate +subsilicic +subsill +subsimian +subsimilation +subsimious +subsimple +subsyndicate +subsyndication +subsynod +subsynodal +subsynodic +subsynodical +subsynodically +subsynovial +subsinuous +subsist +subsisted +subsystem +subsystems +subsistence +subsistency +subsistent +subsistential +subsister +subsisting +subsistingly +subsists +subsizar +subsizarship +subslot +subslots +subsmile +subsneer +subsocial +subsocially +subsoil +subsoiled +subsoiler +subsoiling +subsoils +subsolar +subsolid +subsonic +subsonically +subsonics +subsort +subsorter +subsovereign +subspace +subspaces +subspatulate +subspecialist +subspecialization +subspecialize +subspecialized +subspecializing +subspecialty +subspecialties +subspecies +subspecific +subspecifically +subsphenoid +subsphenoidal +subsphere +subspheric +subspherical +subspherically +subspinose +subspinous +subspiral +subspirally +subsplenial +subspontaneous +subspontaneously +subspontaneousness +subsquadron +subssellia +subst +substage +substages +substalagmite +substalagmitic +substance +substanced +substanceless +substances +substanch +substandard +substandardization +substandardize +substandardized +substandardizing +substanially +substant +substantia +substantiability +substantiable +substantiae +substantial +substantialia +substantialism +substantialist +substantiality +substantialization +substantialize +substantialized +substantializing +substantially +substantiallying +substantialness +substantiatable +substantiate +substantiated +substantiates +substantiating +substantiation +substantiations +substantiative +substantiator +substantify +substantious +substantival +substantivally +substantive +substantively +substantiveness +substantives +substantivity +substantivize +substantivized +substantivizing +substantize +substation +substations +substernal +substylar +substile +substyle +substituent +substitutability +substitutabilities +substitutable +substitute +substituted +substituter +substitutes +substituting +substitutingly +substitution +substitutional +substitutionally +substitutionary +substitutions +substitutive +substitutively +substock +substore +substoreroom +substory +substories +substract +substraction +substrat +substrata +substratal +substrate +substrates +substrati +substrative +substrator +substratose +substratosphere +substratospheric +substratum +substratums +substream +substriate +substriated +substring +substrings +substrstrata +substruct +substruction +substructional +substructural +substructure +substructured +substructures +subsulci +subsulcus +subsulfate +subsulfid +subsulfide +subsulphate +subsulphid +subsulphide +subsult +subsultive +subsultory +subsultorily +subsultorious +subsultorysubsultus +subsultus +subsumable +subsume +subsumed +subsumes +subsuming +subsumption +subsumptive +subsuperficial +subsuperficially +subsuperficialness +subsurety +subsureties +subsurface +subsurfaces +subtack +subtacksman +subtacksmen +subtangent +subtarget +subtarsal +subtartarean +subtask +subtasking +subtasks +subtaxer +subtectacle +subtectal +subteen +subteener +subteens +subtegminal +subtegulaneous +subtegumental +subtegumentary +subtemperate +subtemporal +subtenancy +subtenancies +subtenant +subtenants +subtend +subtended +subtending +subtends +subtense +subtentacular +subtenure +subtepid +subtepidity +subtepidly +subtepidness +subteraqueous +subterbrutish +subtercelestial +subterconscious +subtercutaneous +subterete +subterethereal +subterfluent +subterfluous +subterfuge +subterfuges +subterhuman +subterjacent +subtermarine +subterminal +subterminally +subternatural +subterpose +subterposition +subterrain +subterrane +subterraneal +subterranean +subterraneanize +subterraneanized +subterraneanizing +subterraneanly +subterraneity +subterraneous +subterraneously +subterraneousness +subterrany +subterranity +subterraqueous +subterrene +subterrestrial +subterritory +subterritorial +subterritories +subtersensual +subtersensuous +subtersuperlative +subtersurface +subtertian +subtetanic +subtetanical +subtext +subtexts +subthalamic +subthalamus +subthoracal +subthoracic +subthreshold +subthrill +subtile +subtilely +subtileness +subtiler +subtilest +subtiliate +subtiliation +subtilin +subtilis +subtilisation +subtilise +subtilised +subtiliser +subtilising +subtilism +subtilist +subtility +subtilities +subtilization +subtilize +subtilized +subtilizer +subtilizing +subtill +subtillage +subtilly +subtilty +subtilties +subtympanitic +subtype +subtypes +subtypical +subtitle +subtitled +subtitles +subtitling +subtitular +subtle +subtlely +subtleness +subtler +subtlest +subtlety +subtleties +subtly +subtlist +subtone +subtones +subtonic +subtonics +subtopia +subtopic +subtopics +subtorrid +subtotal +subtotaled +subtotaling +subtotalled +subtotally +subtotalling +subtotals +subtotem +subtotemic +subtower +subtract +subtracted +subtracter +subtracting +subtraction +subtractions +subtractive +subtractor +subtractors +subtracts +subtrahend +subtrahends +subtray +subtranslucence +subtranslucency +subtranslucent +subtransparent +subtransparently +subtransparentness +subtransversal +subtransversally +subtransverse +subtransversely +subtrapezoid +subtrapezoidal +subtread +subtreasurer +subtreasurership +subtreasury +subtreasuries +subtree +subtrees +subtrench +subtriangular +subtriangularity +subtriangulate +subtribal +subtribe +subtribes +subtribual +subtrifid +subtrigonal +subtrihedral +subtriplicate +subtriplicated +subtriplication +subtriquetrous +subtrist +subtrochanteric +subtrochlear +subtrochleariform +subtropic +subtropical +subtropics +subtrousers +subtrude +subtruncate +subtruncated +subtruncation +subtrunk +subtuberant +subtubiform +subtunic +subtunics +subtunnel +subturbary +subturriculate +subturriculated +subtutor +subtutorship +subtwined +subucula +subulate +subulated +subulicorn +subulicornia +subuliform +subultimate +subumbellar +subumbellate +subumbellated +subumbelliferous +subumbilical +subumbonal +subumbonate +subumbral +subumbrella +subumbrellar +subuncinal +subuncinate +subuncinated +subunequal +subunequally +subunequalness +subungual +subunguial +subungulata +subungulate +subunit +subunits +subuniversal +subuniverse +suburb +suburban +suburbandom +suburbanhood +suburbanisation +suburbanise +suburbanised +suburbanising +suburbanism +suburbanite +suburbanites +suburbanity +suburbanities +suburbanization +suburbanize +suburbanized +suburbanizing +suburbanly +suburbans +suburbed +suburbia +suburbian +suburbias +suburbican +suburbicary +suburbicarian +suburbs +suburethral +subursine +subutopian +subvaginal +subvaluation +subvarietal +subvariety +subvarieties +subvassal +subvassalage +subvein +subvendee +subvene +subvened +subvenes +subvening +subvenize +subvention +subventionary +subventioned +subventionize +subventions +subventitious +subventive +subventral +subventrally +subventricose +subventricous +subventricular +subvermiform +subversal +subverse +subversed +subversion +subversionary +subversions +subversive +subversively +subversiveness +subversives +subversivism +subvert +subvertebral +subvertebrate +subverted +subverter +subverters +subvertible +subvertical +subvertically +subverticalness +subverticilate +subverticilated +subverticillate +subverting +subverts +subvesicular +subvestment +subvicar +subvicars +subvicarship +subvii +subvillain +subviral +subvirate +subvirile +subvisible +subvitalisation +subvitalised +subvitalization +subvitalized +subvitreous +subvitreously +subvitreousness +subvocal +subvocally +subvola +subway +subways +subwar +subwarden +subwardenship +subwater +subwealthy +subweight +subwink +subworker +subworkman +subworkmen +subzero +subzygomatic +subzonal +subzonary +subzone +subzones +succade +succah +succahs +succedanea +succedaneous +succedaneum +succedaneums +succedent +succeed +succeedable +succeeded +succeeder +succeeders +succeeding +succeedingly +succeeds +succent +succentor +succenturiate +succenturiation +succes +succesful +succesive +success +successes +successful +successfully +successfulness +succession +successional +successionally +successionist +successionless +successions +successive +successively +successiveness +successivity +successless +successlessly +successlessness +successor +successoral +successory +successors +successorship +succi +succiferous +succin +succinamate +succinamic +succinamide +succinanil +succinate +succinct +succincter +succinctest +succinctly +succinctness +succinctory +succinctoria +succinctorium +succincture +succinea +succinic +succiniferous +succinyl +succinylcholine +succinyls +succinylsulfathiazole +succinylsulphathiazole +succinimid +succinimide +succinite +succinol +succinoresinol +succinosulphuric +succinous +succintorium +succinum +succisa +succise +succivorous +succor +succorable +succored +succorer +succorers +succorful +succory +succories +succoring +succorless +succorrhea +succorrhoea +succors +succose +succotash +succoth +succour +succourable +succoured +succourer +succourful +succouring +succourless +succours +succous +succub +succuba +succubae +succube +succubi +succubine +succubous +succubus +succubuses +succudry +succula +succulence +succulency +succulencies +succulent +succulently +succulentness +succulents +succulous +succumb +succumbed +succumbence +succumbency +succumbent +succumber +succumbers +succumbing +succumbs +succursal +succursale +succus +succuss +succussation +succussatory +succussed +succusses +succussing +succussion +succussive +such +suchlike +suchness +suchnesses +suchos +suchwise +suci +sucivilized +suck +suckable +suckabob +suckage +suckauhock +sucked +sucken +suckener +suckeny +sucker +suckered +suckerel +suckerfish +suckerfishes +suckering +suckerlike +suckers +sucket +suckfish +suckfishes +suckhole +sucking +suckle +sucklebush +suckled +suckler +sucklers +suckles +suckless +suckling +sucklings +sucks +suckstone +suclat +sucramin +sucramine +sucrase +sucrases +sucrate +sucre +sucres +sucrier +sucriers +sucroacid +sucrose +sucroses +suction +suctional +suctions +suctoria +suctorial +suctorian +suctorious +sucupira +sucuri +sucury +sucuriu +sucuruju +sud +sudadero +sudamen +sudamina +sudaminal +sudan +sudanese +sudani +sudanian +sudanic +sudary +sudaria +sudaries +sudarium +sudate +sudation +sudations +sudatory +sudatoria +sudatories +sudatorium +sudburian +sudburite +sudd +sudden +suddenly +suddenness +suddens +suddenty +sudder +suddy +suddle +sudds +sude +sudes +sudic +sudiform +sudor +sudoral +sudoresis +sudoric +sudoriferous +sudoriferousness +sudorific +sudoriparous +sudorous +sudors +sudra +suds +sudsed +sudser +sudsers +sudses +sudsy +sudsier +sudsiest +sudsing +sudsless +sudsman +sudsmen +sue +suecism +sued +suede +sueded +suedes +suedine +sueding +suegee +suey +suent +suer +suerre +suers +suerte +sues +suessiones +suet +suety +suets +sueve +suevi +suevian +suevic +suez +suf +sufeism +suff +suffari +suffaris +suffect +suffection +suffer +sufferable +sufferableness +sufferably +sufferance +sufferant +suffered +sufferer +sufferers +suffering +sufferingly +sufferings +suffers +suffete +suffetes +suffice +sufficeable +sufficed +sufficer +sufficers +suffices +sufficience +sufficiency +sufficiencies +sufficient +sufficiently +sufficientness +sufficing +sufficingly +sufficingness +suffiction +suffisance +suffisant +suffix +suffixal +suffixation +suffixed +suffixer +suffixes +suffixing +suffixion +suffixment +sufflaminate +sufflamination +sufflate +sufflated +sufflates +sufflating +sufflation +sufflue +suffocate +suffocated +suffocates +suffocating +suffocatingly +suffocation +suffocative +suffolk +suffragan +suffraganal +suffraganate +suffragancy +suffraganeous +suffragans +suffragant +suffragate +suffragatory +suffrage +suffrages +suffragette +suffragettes +suffragettism +suffragial +suffragism +suffragist +suffragistic +suffragistically +suffragists +suffragitis +suffrago +suffrain +suffront +suffrutescent +suffrutex +suffrutices +suffruticose +suffruticous +suffruticulose +suffumigate +suffumigated +suffumigating +suffumigation +suffusable +suffuse +suffused +suffusedly +suffuses +suffusing +suffusion +suffusions +suffusive +sufi +sufiism +sufiistic +sufism +sufistic +sugamo +sugan +sugann +sugar +sugarberry +sugarberries +sugarbird +sugarbush +sugarcane +sugarcoat +sugarcoated +sugarcoating +sugarcoats +sugared +sugarelly +sugarer +sugarhouse +sugarhouses +sugary +sugarier +sugaries +sugariest +sugariness +sugaring +sugarings +sugarless +sugarlike +sugarloaf +sugarplate +sugarplum +sugarplums +sugars +sugarsop +sugarsweet +sugarworks +sugat +sugent +sugescent +sugg +suggan +suggest +suggesta +suggestable +suggested +suggestedness +suggester +suggestibility +suggestible +suggestibleness +suggestibly +suggesting +suggestingly +suggestion +suggestionability +suggestionable +suggestionism +suggestionist +suggestionize +suggestions +suggestive +suggestively +suggestiveness +suggestivity +suggestment +suggestor +suggestress +suggests +suggestum +suggil +suggillate +suggillation +sugh +sughed +sughing +sughs +sugi +sugih +sugillate +sugis +sugsloot +suguaro +suhuaro +sui +suicidal +suicidalism +suicidally +suicidalwise +suicide +suicided +suicides +suicidical +suiciding +suicidism +suicidist +suicidology +suicism +suid +suidae +suidian +suiform +suikerbosch +suiline +suilline +suimate +suina +suine +suing +suingly +suint +suints +suyog +suiogoth +suiogothic +suiones +suisimilar +suisse +suist +suit +suitability +suitable +suitableness +suitably +suitcase +suitcases +suite +suited +suitedness +suiters +suites +suithold +suity +suiting +suitings +suitly +suitlike +suitor +suitoress +suitors +suitorship +suitress +suits +suivante +suivez +suji +suk +sukey +sukiyaki +sukiyakis +sukkah +sukkahs +sukkenye +sukkoth +suku +sula +sulaba +sulafat +sulaib +sulbasutra +sulcal +sulcalization +sulcalize +sulcar +sulcate +sulcated +sulcation +sulcatoareolate +sulcatocostate +sulcatorimose +sulci +sulciform +sulcomarginal +sulcular +sulculate +sulculus +sulcus +suld +suldan +suldans +sulea +sulfa +sulfacid +sulfadiazine +sulfadimethoxine +sulfaguanidine +sulfamate +sulfamerazin +sulfamerazine +sulfamethazine +sulfamethylthiazole +sulfamic +sulfamidate +sulfamide +sulfamidic +sulfamyl +sulfamine +sulfaminic +sulfanilamide +sulfanilic +sulfanilylguanidine +sulfantimonide +sulfapyrazine +sulfapyridine +sulfaquinoxaline +sulfarsenide +sulfarsenite +sulfarseniuret +sulfarsphenamine +sulfas +sulfasuxidine +sulfatase +sulfate +sulfated +sulfates +sulfathiazole +sulfatic +sulfating +sulfation +sulfatization +sulfatize +sulfatized +sulfatizing +sulfato +sulfazide +sulfhydrate +sulfhydric +sulfhydryl +sulfid +sulfide +sulfides +sulfids +sulfinate +sulfindigotate +sulfindigotic +sulfindylic +sulfine +sulfinic +sulfinide +sulfinyl +sulfinyls +sulfion +sulfionide +sulfisoxazole +sulfite +sulfites +sulfitic +sulfito +sulfo +sulfoacid +sulfoamide +sulfobenzide +sulfobenzoate +sulfobenzoic +sulfobismuthite +sulfoborite +sulfocarbamide +sulfocarbimide +sulfocarbolate +sulfocarbolic +sulfochloride +sulfocyan +sulfocyanide +sulfofication +sulfogermanate +sulfohalite +sulfohydrate +sulfoindigotate +sulfoleic +sulfolysis +sulfomethylic +sulfonal +sulfonals +sulfonamic +sulfonamide +sulfonate +sulfonated +sulfonating +sulfonation +sulfonator +sulfone +sulfonephthalein +sulfones +sulfonethylmethane +sulfonic +sulfonyl +sulfonyls +sulfonylurea +sulfonium +sulfonmethane +sulfophthalein +sulfopurpurate +sulfopurpuric +sulforicinate +sulforicinic +sulforicinoleate +sulforicinoleic +sulfoselenide +sulfosilicide +sulfostannide +sulfotelluride +sulfourea +sulfovinate +sulfovinic +sulfowolframic +sulfoxide +sulfoxylate +sulfoxylic +sulfoxism +sulfur +sulfurage +sulfuran +sulfurate +sulfuration +sulfurator +sulfurea +sulfured +sulfureous +sulfureously +sulfureousness +sulfuret +sulfureted +sulfureting +sulfurets +sulfuretted +sulfuretting +sulfury +sulfuric +sulfuryl +sulfuryls +sulfuring +sulfurization +sulfurize +sulfurized +sulfurizing +sulfurosyl +sulfurous +sulfurously +sulfurousness +sulfurs +sulidae +sulides +suling +suliote +sulk +sulka +sulked +sulker +sulkers +sulky +sulkier +sulkies +sulkiest +sulkily +sulkylike +sulkiness +sulking +sulks +sull +sulla +sullage +sullages +sullan +sullen +sullener +sullenest +sullenhearted +sullenly +sullenness +sullens +sully +sulliable +sulliage +sullied +sulliedness +sullies +sullying +sullow +sulpha +sulphacid +sulphadiazine +sulphaguanidine +sulphaldehyde +sulphamate +sulphamerazine +sulphamic +sulphamid +sulphamidate +sulphamide +sulphamidic +sulphamyl +sulphamin +sulphamine +sulphaminic +sulphamino +sulphammonium +sulphanilamide +sulphanilate +sulphanilic +sulphantimonate +sulphantimonial +sulphantimonic +sulphantimonide +sulphantimonious +sulphantimonite +sulphapyrazine +sulphapyridine +sulpharsenate +sulpharseniate +sulpharsenic +sulpharsenid +sulpharsenide +sulpharsenious +sulpharsenite +sulpharseniuret +sulpharsphenamine +sulphas +sulphatase +sulphate +sulphated +sulphates +sulphathiazole +sulphatic +sulphating +sulphation +sulphatization +sulphatize +sulphatized +sulphatizing +sulphato +sulphatoacetic +sulphatocarbonic +sulphazid +sulphazide +sulphazotize +sulphbismuthite +sulphethylate +sulphethylic +sulphhemoglobin +sulphichthyolate +sulphid +sulphidation +sulphide +sulphides +sulphidic +sulphidize +sulphydrate +sulphydric +sulphydryl +sulphids +sulphimide +sulphin +sulphinate +sulphindigotate +sulphindigotic +sulphine +sulphinic +sulphinide +sulphinyl +sulphion +sulphisoxazole +sulphitation +sulphite +sulphites +sulphitic +sulphito +sulphmethemoglobin +sulpho +sulphoacetic +sulphoamid +sulphoamide +sulphoantimonate +sulphoantimonic +sulphoantimonious +sulphoantimonite +sulphoarsenic +sulphoarsenious +sulphoarsenite +sulphoazotize +sulphobenzid +sulphobenzide +sulphobenzoate +sulphobenzoic +sulphobismuthite +sulphoborite +sulphobutyric +sulphocarbamic +sulphocarbamide +sulphocarbanilide +sulphocarbimide +sulphocarbolate +sulphocarbolic +sulphocarbonate +sulphocarbonic +sulphochloride +sulphochromic +sulphocyan +sulphocyanate +sulphocyanic +sulphocyanide +sulphocyanogen +sulphocinnamic +sulphodichloramine +sulphofy +sulphofication +sulphogallic +sulphogel +sulphogermanate +sulphogermanic +sulphohalite +sulphohaloid +sulphohydrate +sulphoichthyolate +sulphoichthyolic +sulphoindigotate +sulphoindigotic +sulpholeate +sulpholeic +sulpholipin +sulpholysis +sulphonal +sulphonalism +sulphonamic +sulphonamid +sulphonamide +sulphonamido +sulphonamine +sulphonaphthoic +sulphonate +sulphonated +sulphonating +sulphonation +sulphonator +sulphoncyanine +sulphone +sulphonephthalein +sulphones +sulphonethylmethane +sulphonic +sulphonyl +sulphonium +sulphonmethane +sulphonphthalein +sulphoparaldehyde +sulphophenyl +sulphophosphate +sulphophosphite +sulphophosphoric +sulphophosphorous +sulphophthalein +sulphophthalic +sulphopropionic +sulphoproteid +sulphopupuric +sulphopurpurate +sulphopurpuric +sulphoricinate +sulphoricinic +sulphoricinoleate +sulphoricinoleic +sulphosalicylic +sulphoselenide +sulphoselenium +sulphosilicide +sulphosol +sulphostannate +sulphostannic +sulphostannide +sulphostannite +sulphostannous +sulphosuccinic +sulphosulphurous +sulphotannic +sulphotelluride +sulphoterephthalic +sulphothionyl +sulphotoluic +sulphotungstate +sulphotungstic +sulphouinic +sulphourea +sulphovanadate +sulphovinate +sulphovinic +sulphowolframic +sulphoxid +sulphoxide +sulphoxylate +sulphoxylic +sulphoxyphosphate +sulphoxism +sulphozincate +sulphur +sulphurage +sulphuran +sulphurate +sulphurated +sulphurating +sulphuration +sulphurator +sulphurea +sulphurean +sulphured +sulphureity +sulphureonitrous +sulphureosaline +sulphureosuffused +sulphureous +sulphureously +sulphureousness +sulphureovirescent +sulphuret +sulphureted +sulphureting +sulphuretted +sulphuretting +sulphury +sulphuric +sulphuriferous +sulphuryl +sulphuring +sulphurious +sulphurity +sulphurization +sulphurize +sulphurized +sulphurizing +sulphurless +sulphurlike +sulphurosyl +sulphurou +sulphurous +sulphurously +sulphurousness +sulphurproof +sulphurs +sulphurweed +sulphurwort +sulpician +sultam +sultan +sultana +sultanas +sultanaship +sultanate +sultanates +sultane +sultanesque +sultaness +sultany +sultanian +sultanic +sultanin +sultanism +sultanist +sultanize +sultanlike +sultanry +sultans +sultanship +sultone +sultry +sultrier +sultriest +sultrily +sultriness +sulu +suluan +sulung +sulvanite +sulvasutra +sum +sumac +sumach +sumachs +sumacs +sumage +sumak +sumass +sumatra +sumatran +sumatrans +sumbal +sumbul +sumbulic +sumdum +sumen +sumerian +sumerology +sumi +sumitro +sumless +sumlessness +summa +summability +summable +summae +summage +summand +summands +summar +summary +summaries +summarily +summariness +summarisable +summarisation +summarise +summarised +summariser +summarising +summarist +summarizable +summarization +summarizations +summarize +summarized +summarizer +summarizes +summarizing +summas +summat +summate +summated +summates +summating +summation +summational +summations +summative +summatory +summed +summer +summerbird +summercastle +summered +summerer +summergame +summerhead +summerhouse +summerhouses +summery +summerier +summeriest +summeriness +summering +summerings +summerish +summerite +summerize +summerlay +summerland +summerless +summerly +summerlike +summerliness +summerling +summerproof +summerroom +summers +summersault +summerset +summertide +summertime +summertree +summerward +summerweight +summerwood +summing +summings +summist +summit +summital +summity +summitless +summitry +summitries +summits +summon +summonable +summoned +summoner +summoners +summoning +summoningly +summons +summonsed +summonses +summonsing +summula +summulae +summulist +summut +sumner +sumo +sumoist +sumos +sump +sumpage +sumper +sumph +sumphy +sumphish +sumphishly +sumphishness +sumpit +sumpitan +sumple +sumpman +sumps +sumpsimus +sumpt +sumpter +sumpters +sumption +sumptious +sumptuary +sumptuosity +sumptuous +sumptuously +sumptuousness +sumpture +sumpweed +sumpweeds +sums +sun +sunback +sunbake +sunbaked +sunbath +sunbathe +sunbathed +sunbather +sunbathers +sunbathes +sunbathing +sunbaths +sunbeam +sunbeamed +sunbeamy +sunbeams +sunbelt +sunberry +sunberries +sunbird +sunbirds +sunblind +sunblink +sunbonnet +sunbonneted +sunbonnets +sunbow +sunbows +sunbreak +sunbreaker +sunburn +sunburned +sunburnedness +sunburning +sunburnproof +sunburns +sunburnt +sunburntness +sunburst +sunbursts +suncherchor +suncke +suncup +sundae +sundaes +sunday +sundayfied +sundayish +sundayism +sundaylike +sundayness +sundayproof +sundays +sundanese +sundanesian +sundang +sundar +sundaresan +sundari +sundek +sunder +sunderable +sunderance +sundered +sunderer +sunderers +sundering +sunderly +sunderment +sunders +sunderwise +sundew +sundews +sundial +sundials +sundik +sundog +sundogs +sundown +sundowner +sundowning +sundowns +sundra +sundress +sundri +sundry +sundries +sundriesman +sundrily +sundryman +sundrymen +sundriness +sundrops +sune +sunfall +sunfast +sunfish +sunfisher +sunfishery +sunfishes +sunflower +sunflowers +sunfoil +sung +sungar +sungha +sunglade +sunglass +sunglasses +sunglo +sunglow +sunglows +sungrebe +sunhat +sunyata +sunyie +sunil +sunk +sunken +sunket +sunkets +sunkie +sunkland +sunlamp +sunlamps +sunland +sunlands +sunless +sunlessly +sunlessness +sunlet +sunlight +sunlighted +sunlights +sunlike +sunlit +sunn +sunna +sunnas +sunned +sunni +sunny +sunniah +sunnyasee +sunnyasse +sunnier +sunniest +sunnyhearted +sunnyheartedness +sunnily +sunniness +sunning +sunnism +sunnite +sunns +sunnud +sunproof +sunquake +sunray +sunrise +sunrises +sunrising +sunroof +sunroofs +sunroom +sunrooms +sunrose +suns +sunscald +sunscalds +sunscorch +sunscreen +sunscreening +sunseeker +sunset +sunsets +sunsetty +sunsetting +sunshade +sunshades +sunshine +sunshineless +sunshines +sunshiny +sunshining +sunsmit +sunsmitten +sunspot +sunspots +sunspotted +sunspottedness +sunspottery +sunspotty +sunsquall +sunstay +sunstar +sunstead +sunstone +sunstones +sunstricken +sunstroke +sunstrokes +sunstruck +sunsuit +sunsuits +sunt +suntan +suntanned +suntanning +suntans +suntrap +sunup +sunups +sunway +sunways +sunward +sunwards +sunweed +sunwise +suomi +suomic +suovetaurilia +sup +supa +supai +supari +supawn +supe +supellectile +supellex +super +superabduction +superabhor +superability +superable +superableness +superably +superabnormal +superabnormally +superabominable +superabominableness +superabominably +superabomination +superabound +superabstract +superabstractly +superabstractness +superabsurd +superabsurdity +superabsurdly +superabsurdness +superabundance +superabundancy +superabundant +superabundantly +superaccession +superaccessory +superaccommodating +superaccomplished +superaccrue +superaccrued +superaccruing +superaccumulate +superaccumulated +superaccumulating +superaccumulation +superaccurate +superaccurately +superaccurateness +superacetate +superachievement +superacid +superacidity +superacidulated +superacknowledgment +superacquisition +superacromial +superactivate +superactivated +superactivating +superactive +superactively +superactiveness +superactivity +superactivities +superacute +superacutely +superacuteness +superadaptable +superadaptableness +superadaptably +superadd +superadded +superadding +superaddition +superadditional +superadds +superadequate +superadequately +superadequateness +superadjacent +superadjacently +superadministration +superadmirable +superadmirableness +superadmirably +superadmiration +superadorn +superadornment +superaerial +superaerially +superaerodynamics +superaesthetical +superaesthetically +superaffiliation +superaffiuence +superaffluence +superaffluent +superaffluently +superaffusion +superagency +superagencies +superaggravation +superagitation +superagrarian +superalbal +superalbuminosis +superalimentation +superalkaline +superalkalinity +superalloy +superallowance +superaltar +superaltern +superambition +superambitious +superambitiously +superambitiousness +superambulacral +superanal +superangelic +superangelical +superangelically +superanimal +superanimality +superannate +superannated +superannuate +superannuated +superannuating +superannuation +superannuitant +superannuity +superannuities +superapology +superapologies +superappreciation +superaqual +superaqueous +superarbiter +superarbitrary +superarctic +superarduous +superarduously +superarduousness +superarrogance +superarrogant +superarrogantly +superarseniate +superartificial +superartificiality +superartificially +superaspiration +superassertion +superassociate +superassume +superassumed +superassuming +superassumption +superastonish +superastonishment +superate +superattachment +superattainable +superattainableness +superattainably +superattendant +superattraction +superattractive +superattractively +superattractiveness +superauditor +superaural +superaverage +superaverageness +superaveraness +superavit +superaward +superaxillary +superazotation +superb +superbazaar +superbazooka +superbelief +superbelievable +superbelievableness +superbelievably +superbeloved +superbenefit +superbenevolence +superbenevolent +superbenevolently +superbenign +superbenignly +superber +superbest +superbia +superbias +superbious +superbity +superblessed +superblessedness +superbly +superblock +superblunder +superbness +superbold +superboldly +superboldness +superbomb +superborrow +superbrain +superbrave +superbravely +superbraveness +superbrute +superbuild +superbungalow +superbusy +superbusily +supercabinet +supercalender +supercallosal +supercandid +supercandidly +supercandidness +supercanine +supercanonical +supercanonization +supercanopy +supercanopies +supercapability +supercapabilities +supercapable +supercapableness +supercapably +supercapital +supercaption +supercarbonate +supercarbonization +supercarbonize +supercarbureted +supercargo +supercargoes +supercargos +supercargoship +supercarpal +supercarrier +supercatastrophe +supercatastrophic +supercatholic +supercatholically +supercausal +supercaution +supercavitation +supercede +superceded +supercedes +superceding +supercelestial +supercelestially +supercensure +supercentral +supercentrifuge +supercerebellar +supercerebral +supercerebrally +superceremonious +superceremoniously +superceremoniousness +supercharge +supercharged +supercharger +superchargers +supercharges +supercharging +superchemical +superchemically +superchery +supercherie +superchivalrous +superchivalrously +superchivalrousness +supercicilia +supercycle +supercilia +superciliary +superciliosity +supercilious +superciliously +superciliousness +supercilium +supercynical +supercynically +supercynicalness +supercity +supercivil +supercivilization +supercivilized +supercivilly +superclaim +superclass +superclassified +supercloth +supercluster +supercoincidence +supercoincident +supercoincidently +supercolossal +supercolossally +supercolumnar +supercolumniation +supercombination +supercombing +supercommendation +supercommentary +supercommentaries +supercommentator +supercommercial +supercommercially +supercommercialness +supercompetition +supercomplete +supercomplex +supercomplexity +supercomplexities +supercomprehension +supercompression +supercomputer +supercomputers +superconception +superconduct +superconducting +superconduction +superconductive +superconductivity +superconductor +superconductors +superconfidence +superconfident +superconfidently +superconfirmation +superconformable +superconformableness +superconformably +superconformist +superconformity +superconfused +superconfusion +supercongested +supercongestion +superconscious +superconsciousness +superconsecrated +superconsequence +superconsequency +superconservative +superconservatively +superconservativeness +superconstitutional +superconstitutionally +supercontest +supercontribution +supercontrol +supercool +supercooled +supercordial +supercordially +supercordialness +supercorporation +supercow +supercredit +supercrescence +supercrescent +supercretaceous +supercrime +supercriminal +supercriminally +supercritic +supercritical +supercritically +supercriticalness +supercrowned +supercrust +supercube +supercultivated +superculture +supercurious +supercuriously +supercuriousness +superdainty +superdanger +superdebt +superdeclamatory +superdecorated +superdecoration +superdeficit +superdeity +superdeities +superdejection +superdelegate +superdelicate +superdelicately +superdelicateness +superdemand +superdemocratic +superdemocratically +superdemonic +superdemonstration +superdensity +superdeposit +superdesirous +superdesirously +superdevelopment +superdevilish +superdevilishly +superdevilishness +superdevotion +superdiabolical +superdiabolically +superdiabolicalness +superdicrotic +superdifficult +superdifficultly +superdying +superdiplomacy +superdirection +superdiscount +superdistention +superdistribution +superdividend +superdivine +superdivision +superdoctor +superdominant +superdomineering +superdonation +superdose +superdramatist +superdreadnought +superdubious +superdubiously +superdubiousness +superduper +superduplication +superdural +superearthly +supereconomy +supereconomies +supered +superedify +superedification +supereducated +supereducation +supereffective +supereffectively +supereffectiveness +supereffluence +supereffluent +supereffluently +superego +superegos +superelaborate +superelaborately +superelaborateness +superelastic +superelastically +superelated +superelegance +superelegancy +superelegancies +superelegant +superelegantly +superelementary +superelevate +superelevated +superelevation +supereligibility +supereligible +supereligibleness +supereligibly +supereloquence +supereloquent +supereloquently +supereminence +supereminency +supereminent +supereminently +superemphasis +superemphasize +superemphasized +superemphasizing +superempirical +superencipher +superencipherment +superendorse +superendorsed +superendorsement +superendorsing +superendow +superenergetic +superenergetically +superenforcement +superengrave +superengraved +superengraving +superenrollment +superepic +superepoch +superequivalent +supererogant +supererogantly +supererogate +supererogated +supererogating +supererogation +supererogative +supererogator +supererogatory +supererogatorily +superespecial +superessential +superessentially +superessive +superestablish +superestablishment +supereternity +superether +superethical +superethically +superethicalness +superethmoidal +superette +superevangelical +superevangelically +superevidence +superevident +superevidently +superexacting +superexalt +superexaltation +superexaminer +superexceed +superexceeding +superexcellence +superexcellency +superexcellent +superexcellently +superexceptional +superexceptionally +superexcitation +superexcited +superexcitement +superexcrescence +superexcrescent +superexcrescently +superexert +superexertion +superexiguity +superexist +superexistent +superexpand +superexpansion +superexpectation +superexpenditure +superexplicit +superexplicitly +superexport +superexpression +superexpressive +superexpressively +superexpressiveness +superexquisite +superexquisitely +superexquisiteness +superextend +superextension +superextol +superextoll +superextreme +superextremely +superextremeness +superextremity +superextremities +superfamily +superfamilies +superfancy +superfantastic +superfantastically +superfarm +superfat +superfecta +superfecundation +superfecundity +superfee +superfemale +superfeminine +superfemininity +superfervent +superfervently +superfetate +superfetated +superfetation +superfete +superfeudation +superfibrination +superfice +superficial +superficialism +superficialist +superficiality +superficialities +superficialize +superficially +superficialness +superficiary +superficiaries +superficie +superficies +superfidel +superfinance +superfinanced +superfinancing +superfine +superfineness +superfinical +superfinish +superfinite +superfinitely +superfiniteness +superfissure +superfit +superfitted +superfitting +superfix +superfixes +superfleet +superflexion +superfluent +superfluid +superfluidity +superfluitance +superfluity +superfluities +superfluous +superfluously +superfluousness +superflux +superfoliaceous +superfoliation +superfolly +superfollies +superformal +superformally +superformalness +superformation +superformidable +superformidableness +superformidably +superfortunate +superfortunately +superfriendly +superfrontal +superfructified +superfulfill +superfulfillment +superfunction +superfunctional +superfuse +superfused +superfusibility +superfusible +superfusing +superfusion +supergaiety +supergalactic +supergalaxy +supergalaxies +supergallant +supergallantly +supergallantness +supergene +supergeneric +supergenerically +supergenerosity +supergenerous +supergenerously +supergenual +supergiant +supergyre +superglacial +superglorious +supergloriously +supergloriousness +superglottal +superglottally +superglottic +supergoddess +supergoodness +supergovern +supergovernment +supergraduate +supergrant +supergratify +supergratification +supergratified +supergratifying +supergravitate +supergravitated +supergravitating +supergravitation +supergroup +supergroups +superguarantee +superguaranteed +superguaranteeing +supergun +superhandsome +superhearty +superheartily +superheartiness +superheat +superheated +superheatedness +superheater +superheating +superheavy +superhelix +superheresy +superheresies +superhero +superheroes +superheroic +superheroically +superhet +superheterodyne +superhigh +superhighway +superhighways +superhypocrite +superhirudine +superhistoric +superhistorical +superhistorically +superhive +superhuman +superhumanity +superhumanize +superhumanized +superhumanizing +superhumanly +superhumanness +superhumeral +superi +superyacht +superial +superideal +superideally +superidealness +superignorant +superignorantly +superillustrate +superillustrated +superillustrating +superillustration +superimpend +superimpending +superimpersonal +superimpersonally +superimply +superimplied +superimplying +superimportant +superimportantly +superimposable +superimpose +superimposed +superimposes +superimposing +superimposition +superimpositions +superimposure +superimpregnated +superimpregnation +superimprobable +superimprobableness +superimprobably +superimproved +superincentive +superinclination +superinclusive +superinclusively +superinclusiveness +superincomprehensible +superincomprehensibleness +superincomprehensibly +superincrease +superincreased +superincreasing +superincumbence +superincumbency +superincumbent +superincumbently +superindependence +superindependent +superindependently +superindiction +superindictment +superindifference +superindifferent +superindifferently +superindignant +superindignantly +superindividual +superindividualism +superindividualist +superindividually +superinduce +superinduced +superinducement +superinducing +superinduct +superinduction +superindue +superindulgence +superindulgent +superindulgently +superindustry +superindustries +superindustrious +superindustriously +superindustriousness +superinenarrable +superinfection +superinfer +superinference +superinferred +superinferring +superinfeudation +superinfinite +superinfinitely +superinfiniteness +superinfirmity +superinfirmities +superinfluence +superinfluenced +superinfluencing +superinformal +superinformality +superinformalities +superinformally +superinfuse +superinfused +superinfusing +superinfusion +supering +superingenious +superingeniously +superingeniousness +superingenuity +superingenuities +superinitiative +superinjection +superinjustice +superinnocence +superinnocent +superinnocently +superinquisitive +superinquisitively +superinquisitiveness +superinsaniated +superinscribe +superinscribed +superinscribing +superinscription +superinsist +superinsistence +superinsistent +superinsistently +superinsscribed +superinsscribing +superinstitute +superinstitution +superintellectual +superintellectually +superintend +superintendant +superintended +superintendence +superintendency +superintendencies +superintendent +superintendential +superintendents +superintendentship +superintender +superintending +superintends +superintense +superintensely +superintenseness +superintensity +superintolerable +superintolerableness +superintolerably +superinundation +superinvolution +superior +superioress +superiority +superiorities +superiorly +superiorness +superiors +superiorship +superirritability +superius +superjacent +superjet +superjets +superjoined +superjudicial +superjudicially +superjunction +superjurisdiction +superjustification +superknowledge +superl +superlabial +superlaborious +superlaboriously +superlaboriousness +superlactation +superlay +superlain +superlapsarian +superlaryngeal +superlaryngeally +superlation +superlative +superlatively +superlativeness +superlatives +superlenient +superleniently +superlie +superlied +superlies +superlying +superlikelihood +superline +superliner +superload +superlocal +superlocally +superlogical +superlogicality +superlogicalities +superlogically +superloyal +superloyally +superlucky +superlunar +superlunary +superlunatical +superluxurious +superluxuriously +superluxuriousness +supermagnificent +supermagnificently +supermalate +supermale +superman +supermanhood +supermanifest +supermanism +supermanly +supermanliness +supermannish +supermarginal +supermarginally +supermarine +supermarket +supermarkets +supermarvelous +supermarvelously +supermarvelousness +supermasculine +supermasculinity +supermaterial +supermathematical +supermathematically +supermaxilla +supermaxillary +supermechanical +supermechanically +supermedial +supermedially +supermedicine +supermediocre +supermen +supermental +supermentality +supermentally +supermetropolitan +supermilitary +supermini +superminis +supermishap +supermystery +supermysteries +supermixture +supermodest +supermodestly +supermoisten +supermolecular +supermolecule +supermolten +supermoral +supermorally +supermorose +supermorosely +supermoroseness +supermotility +supermundane +supermunicipal +supermuscan +supernacular +supernaculum +supernal +supernalize +supernally +supernatant +supernatation +supernation +supernational +supernationalism +supernationalisms +supernationalist +supernationally +supernatural +supernaturaldom +supernaturalise +supernaturalised +supernaturalising +supernaturalism +supernaturalist +supernaturalistic +supernaturality +supernaturalize +supernaturalized +supernaturalizing +supernaturally +supernaturalness +supernature +supernecessity +supernecessities +supernegligence +supernegligent +supernegligently +supernormal +supernormality +supernormally +supernormalness +supernotable +supernotableness +supernotably +supernova +supernovae +supernovas +supernuity +supernumeral +supernumerary +supernumeraries +supernumerariness +supernumeraryship +supernumerous +supernumerously +supernumerousness +supernutrition +superoanterior +superobedience +superobedient +superobediently +superobese +superobject +superobjection +superobjectionable +superobjectionably +superobligation +superobstinate +superobstinately +superobstinateness +superoccipital +superoctave +superocular +superocularly +superodorsal +superoexternal +superoffensive +superoffensively +superoffensiveness +superofficious +superofficiously +superofficiousness +superofrontal +superointernal +superolateral +superomedial +superoposterior +superopposition +superoptimal +superoptimist +superoratorical +superoratorically +superorbital +superordain +superorder +superordinal +superordinary +superordinate +superordinated +superordinating +superordination +superorganic +superorganism +superorganization +superorganize +superornament +superornamental +superornamentally +superosculate +superoutput +superovulation +superoxalate +superoxide +superoxygenate +superoxygenated +superoxygenating +superoxygenation +superparamount +superparasite +superparasitic +superparasitism +superparliamentary +superparticular +superpartient +superpassage +superpatience +superpatient +superpatiently +superpatriot +superpatriotic +superpatriotically +superpatriotism +superperfect +superperfection +superperfectly +superperson +superpersonal +superpersonalism +superpersonally +superpetrosal +superpetrous +superphysical +superphysicalness +superphysicposed +superphysicposing +superphlogisticate +superphlogistication +superphosphate +superpiety +superpigmentation +superpious +superpiously +superpiousness +superplant +superplausible +superplausibleness +superplausibly +superplease +superplus +superpolymer +superpolite +superpolitely +superpoliteness +superpolitic +superponderance +superponderancy +superponderant +superpopulated +superpopulatedly +superpopulatedness +superpopulation +superposable +superpose +superposed +superposes +superposing +superposition +superpositions +superpositive +superpositively +superpositiveness +superpossition +superpower +superpowered +superpowers +superpraise +superpraised +superpraising +superprecarious +superprecariously +superprecariousness +superprecise +superprecisely +superpreciseness +superprelatical +superpreparation +superprepared +superpressure +superprinting +superprobability +superproduce +superproduced +superproducing +superproduction +superproportion +superprosperous +superpublicity +superpure +superpurgation +superpurity +superquadrupetal +superqualify +superqualified +superqualifying +superquote +superquoted +superquoting +superrace +superradical +superradically +superradicalness +superrational +superrationally +superreaction +superrealism +superrealist +superrefine +superrefined +superrefinement +superrefining +superreflection +superreform +superreformation +superrefraction +superregal +superregally +superregeneration +superregenerative +superregistration +superregulation +superreliance +superremuneration +superrenal +superrequirement +superrespectability +superrespectable +superrespectableness +superrespectably +superresponsibility +superresponsible +superresponsibleness +superresponsibly +superrestriction +superreward +superrheumatized +superrighteous +superrighteously +superrighteousness +superroyal +superromantic +superromantically +supers +supersacerdotal +supersacerdotally +supersacral +supersacred +supersacrifice +supersafe +supersafely +supersafeness +supersafety +supersagacious +supersagaciously +supersagaciousness +supersaint +supersaintly +supersalesman +supersalesmanship +supersalesmen +supersaliency +supersalient +supersalt +supersanction +supersanguine +supersanguinity +supersanity +supersarcasm +supersarcastic +supersarcastically +supersatisfaction +supersatisfy +supersatisfied +supersatisfying +supersaturate +supersaturated +supersaturates +supersaturating +supersaturation +superscandal +superscandalous +superscandalously +superscholarly +superscientific +superscientifically +superscribe +superscribed +superscribes +superscribing +superscript +superscripted +superscripting +superscription +superscriptions +superscripts +superscrive +superseaman +superseamen +supersecret +supersecretion +supersecretive +supersecretively +supersecretiveness +supersecular +supersecularly +supersecure +supersecurely +supersecureness +supersedable +supersede +supersedeas +superseded +supersedence +superseder +supersedere +supersedes +superseding +supersedure +superselect +superselection +superseminate +supersemination +superseminator +superseniority +supersensible +supersensibleness +supersensibly +supersensitisation +supersensitise +supersensitised +supersensitiser +supersensitising +supersensitive +supersensitiveness +supersensitivity +supersensitization +supersensitize +supersensitized +supersensitizing +supersensory +supersensual +supersensualism +supersensualist +supersensualistic +supersensuality +supersensually +supersensuous +supersensuously +supersensuousness +supersentimental +supersentimentally +superseptal +superseptuaginarian +superseraphic +superseraphical +superseraphically +superserious +superseriously +superseriousness +superservice +superserviceable +superserviceableness +superserviceably +supersesquitertial +supersession +supersessive +superset +supersets +supersevere +superseverely +supersevereness +superseverity +supersex +supersexes +supersexual +supershipment +supersignificant +supersignificantly +supersilent +supersilently +supersympathetic +supersympathy +supersympathies +supersimplicity +supersimplify +supersimplified +supersimplifying +supersincerity +supersyndicate +supersingular +supersystem +supersistent +supersize +supersmart +supersmartly +supersmartness +supersocial +supersoil +supersolar +supersolemn +supersolemness +supersolemnity +supersolemnly +supersolemnness +supersolicit +supersolicitation +supersolid +supersonant +supersonic +supersonically +supersonics +supersovereign +supersovereignty +superspecialize +superspecialized +superspecializing +superspecies +superspecification +supersphenoid +supersphenoidal +superspinous +superspiritual +superspirituality +superspiritually +supersquamosal +superstage +superstamp +superstandard +superstar +superstate +superstatesman +superstatesmen +superstylish +superstylishly +superstylishness +superstimulate +superstimulated +superstimulating +superstimulation +superstition +superstitionist +superstitionless +superstitions +superstitious +superstitiously +superstitiousness +superstoical +superstoically +superstrain +superstrata +superstratum +superstratums +superstrenuous +superstrenuously +superstrenuousness +superstrict +superstrictly +superstrictness +superstrong +superstruct +superstructed +superstructing +superstruction +superstructive +superstructor +superstructory +superstructral +superstructural +superstructure +superstructures +superstuff +supersublimated +supersuborder +supersubsist +supersubstantial +supersubstantiality +supersubstantially +supersubstantiate +supersubtilized +supersubtle +supersubtlety +supersufficiency +supersufficient +supersufficiently +supersulcus +supersulfate +supersulfureted +supersulfurize +supersulfurized +supersulfurizing +supersulphate +supersulphuret +supersulphureted +supersulphurize +supersulphurized +supersulphurizing +supersuperabundance +supersuperabundant +supersuperabundantly +supersuperb +supersuperior +supersupremacy +supersupreme +supersurprise +supersuspicion +supersuspicious +supersuspiciously +supersuspiciousness +supersweet +supersweetly +supersweetness +supertanker +supertare +supertartrate +supertax +supertaxation +supertaxes +supertemporal +supertempt +supertemptation +supertension +superterranean +superterraneous +superterrene +superterrestial +superterrestrial +superthankful +superthankfully +superthankfulness +superthyroidism +superthorough +superthoroughly +superthoroughness +supertoleration +supertonic +supertotal +supertower +supertragedy +supertragedies +supertragic +supertragical +supertragically +supertrain +supertramp +supertranscendent +supertranscendently +supertranscendentness +supertreason +supertrivial +supertuchun +supertunic +supertutelary +superugly +superultrafrostified +superunfit +superunit +superunity +superuniversal +superuniversally +superuniversalness +superuniverse +superurgency +superurgent +superurgently +superuser +supervalue +supervalued +supervaluing +supervast +supervastly +supervastness +supervene +supervened +supervenes +supervenience +supervenient +supervening +supervenosity +supervention +supervestment +supervexation +supervictory +supervictories +supervictorious +supervictoriously +supervictoriousness +supervigilance +supervigilant +supervigilantly +supervigorous +supervigorously +supervigorousness +supervirulent +supervirulently +supervisal +supervisance +supervise +supervised +supervisee +supervises +supervising +supervision +supervisionary +supervisive +supervisor +supervisory +supervisorial +supervisors +supervisorship +supervisual +supervisually +supervisure +supervital +supervitality +supervitally +supervitalness +supervive +supervolition +supervoluminous +supervoluminously +supervolute +superwager +superwealthy +superweening +superwise +superwoman +superwomen +superworldly +superworldliness +superwrought +superzealous +superzealously +superzealousness +supes +supinate +supinated +supinates +supinating +supination +supinator +supine +supinely +supineness +supines +supinity +suplex +suporvisory +supp +suppable +suppage +supped +suppedanea +suppedaneous +suppedaneum +suppedit +suppeditate +suppeditation +supper +suppering +supperless +suppers +suppertime +supperward +supperwards +supping +suppl +supplace +supplant +supplantation +supplanted +supplanter +supplanters +supplanting +supplantment +supplants +supple +suppled +supplejack +supplely +supplement +supplemental +supplementally +supplementals +supplementary +supplementaries +supplementarily +supplementation +supplemented +supplementer +supplementing +supplements +suppleness +suppler +supples +supplest +suppletion +suppletive +suppletively +suppletory +suppletories +suppletorily +supply +suppliable +supplial +suppliance +suppliancy +suppliancies +suppliant +suppliantly +suppliantness +suppliants +supplicancy +supplicant +supplicantly +supplicants +supplicat +supplicate +supplicated +supplicates +supplicating +supplicatingly +supplication +supplicationer +supplications +supplicative +supplicator +supplicatory +supplicavit +supplice +supplied +supplier +suppliers +supplies +supplying +suppling +suppnea +suppone +support +supportability +supportable +supportableness +supportably +supportance +supportasse +supportation +supported +supporter +supporters +supportful +supporting +supportingly +supportive +supportively +supportless +supportlessly +supportress +supports +suppos +supposable +supposableness +supposably +supposal +supposals +suppose +supposed +supposedly +supposer +supposers +supposes +supposing +supposital +supposition +suppositional +suppositionally +suppositionary +suppositionless +suppositions +suppositious +supposititious +supposititiously +supposititiousness +suppositive +suppositively +suppositor +suppository +suppositories +suppositum +suppost +suppresion +suppresive +suppress +suppressal +suppressant +suppressants +suppressed +suppressedly +suppressen +suppresser +suppresses +suppressibility +suppressible +suppressing +suppression +suppressionist +suppressions +suppressive +suppressively +suppressiveness +suppressor +suppressors +supprime +supprise +suppurant +suppurate +suppurated +suppurates +suppurating +suppuration +suppurations +suppurative +suppuratory +supputation +suppute +supr +supra +suprabasidorsal +suprabranchial +suprabuccal +supracaecal +supracargo +supracaudal +supracensorious +supracentenarian +suprachorioid +suprachorioidal +suprachorioidea +suprachoroid +suprachoroidal +suprachoroidea +supraciliary +supraclavicle +supraclavicular +supraclusion +supracommissure +supracondylar +supracondyloid +supraconduction +supraconductor +supraconscious +supraconsciousness +supracoralline +supracostal +supracoxal +supracranial +supracretaceous +supradecompound +supradental +supradorsal +supradural +suprafeminine +suprafine +suprafoliaceous +suprafoliar +supraglacial +supraglenoid +supraglottal +supraglottic +supragovernmental +suprahepatic +suprahyoid +suprahistorical +suprahuman +suprahumanity +suprailiac +suprailium +supraintellectual +suprainterdorsal +suprajural +supralabial +supralapsarian +supralapsarianism +supralateral +supralegal +supraliminal +supraliminally +supralineal +supralinear +supralittoral +supralocal +supralocally +supraloral +supralunar +supralunary +supramammary +supramarginal +supramarine +supramastoid +supramaxilla +supramaxillary +supramaximal +suprameatal +supramechanical +supramedial +supramental +supramolecular +supramoral +supramortal +supramundane +supranasal +supranational +supranationalism +supranationalist +supranationality +supranatural +supranaturalism +supranaturalist +supranaturalistic +supranature +supranervian +supraneural +supranormal +supranuclear +supraoccipital +supraocclusion +supraocular +supraoesophagal +supraoesophageal +supraoptimal +supraoptional +supraoral +supraorbital +supraorbitar +supraordinary +supraordinate +supraordination +supraorganism +suprapapillary +suprapedal +suprapharyngeal +suprapygal +supraposition +supraprotest +suprapubian +suprapubic +supraquantivalence +supraquantivalent +suprarational +suprarationalism +suprarationality +suprarenal +suprarenalectomy +suprarenalectomize +suprarenalin +suprarenin +suprarenine +suprarimal +suprasaturate +suprascapula +suprascapular +suprascapulary +suprascript +suprasegmental +suprasensible +suprasensitive +suprasensual +suprasensuous +supraseptal +suprasolar +suprasoriferous +suprasphanoidal +supraspinal +supraspinate +supraspinatus +supraspinous +suprasquamosal +suprastandard +suprastapedial +suprastate +suprasternal +suprastigmal +suprasubtle +supratemporal +supraterraneous +supraterrestrial +suprathoracic +supratympanic +supratonsillar +supratrochlear +supratropical +supravaginal +supraventricular +supraversion +supravise +supravital +supravitally +supraworld +supremacy +supremacies +supremacist +supremacists +suprematism +suprematist +supreme +supremely +supremeness +supremer +supremest +supremity +supremities +supremo +supremum +suprerogative +supressed +suprising +sups +supt +suption +supulchre +supvr +suq +sur +sura +suraddition +surah +surahee +surahi +surahs +sural +suralimentation +suramin +suranal +surance +surangular +suras +surat +surbase +surbased +surbasement +surbases +surbate +surbater +surbed +surbedded +surbedding +surcease +surceased +surceases +surceasing +surcharge +surcharged +surcharger +surchargers +surcharges +surcharging +surcingle +surcingled +surcingles +surcingling +surcle +surcloy +surcoat +surcoats +surcrue +surculi +surculigerous +surculose +surculous +surculus +surd +surdation +surdeline +surdent +surdimutism +surdity +surdomute +surds +sure +surebutted +sured +surefire +surefooted +surefootedly +surefootedness +surely +surement +sureness +surenesses +surer +sures +suresby +suresh +surest +surety +sureties +suretyship +surette +surexcitation +surf +surfable +surface +surfaced +surfacedly +surfaceless +surfacely +surfaceman +surfacemen +surfaceness +surfacer +surfacers +surfaces +surfacy +surfacing +surfactant +surfbird +surfbirds +surfboard +surfboarder +surfboarding +surfboards +surfboat +surfboatman +surfboats +surfcaster +surfcasting +surfed +surfeit +surfeited +surfeitedness +surfeiter +surfeiting +surfeits +surfer +surfers +surffish +surffishes +surfy +surficial +surfie +surfier +surfiest +surfing +surfings +surfle +surflike +surfman +surfmanship +surfmen +surfperch +surfperches +surfrappe +surfrider +surfriding +surfs +surfuse +surfusion +surg +surge +surged +surgeful +surgeless +surgency +surgent +surgeon +surgeoncy +surgeoncies +surgeoness +surgeonfish +surgeonfishes +surgeonless +surgeons +surgeonship +surgeproof +surger +surgery +surgeries +surgerize +surgers +surges +surgy +surgical +surgically +surgicotherapy +surgier +surgiest +surginess +surging +surhai +surya +suriana +surianaceae +suricat +suricata +suricate +suricates +suriga +surinam +surinamine +surique +surjection +surjective +surly +surlier +surliest +surlily +surliness +surma +surmark +surmaster +surmenage +surmisable +surmisal +surmisant +surmise +surmised +surmisedly +surmiser +surmisers +surmises +surmising +surmit +surmount +surmountability +surmountable +surmountableness +surmountal +surmounted +surmounter +surmounting +surmounts +surmullet +surmullets +surnai +surnay +surname +surnamed +surnamer +surnamers +surnames +surnaming +surnap +surnape +surnominal +surnoun +surpass +surpassable +surpassed +surpasser +surpasses +surpassing +surpassingly +surpassingness +surpeopled +surphul +surplice +surpliced +surplices +surplicewise +surplician +surplus +surplusage +surpluses +surplusing +surpoose +surpreciation +surprint +surprinted +surprinting +surprints +surprisable +surprisal +surprise +surprised +surprisedly +surprisement +surpriseproof +surpriser +surprisers +surprises +surprising +surprisingly +surprisingness +surprizal +surprize +surprized +surprizes +surprizing +surquedry +surquidy +surquidry +surra +surrah +surras +surreal +surrealism +surrealist +surrealistic +surrealistically +surrealists +surrebound +surrebut +surrebuttal +surrebutter +surrebutting +surrection +surrey +surrein +surreys +surrejoin +surrejoinder +surrejoinders +surrenal +surrender +surrendered +surrenderee +surrenderer +surrendering +surrenderor +surrenders +surrendry +surrept +surreption +surreptitious +surreptitiously +surreptitiousness +surreverence +surreverently +surrogacy +surrogacies +surrogate +surrogated +surrogates +surrogateship +surrogating +surrogation +surroyal +surroyals +surrosion +surround +surrounded +surroundedly +surrounder +surrounding +surroundings +surrounds +sursaturation +sursise +sursize +sursolid +surstyle +sursumduction +sursumvergence +sursumversion +surtax +surtaxed +surtaxes +surtaxing +surtout +surtouts +surturbrand +surucucu +surv +survey +surveyable +surveyage +surveyal +surveyance +surveyed +surveying +surveil +surveiled +surveiling +surveillance +surveillant +surveils +surveyor +surveyors +surveyorship +surveys +surview +survigrous +survise +survivability +survivable +survival +survivalism +survivalist +survivals +survivance +survivancy +survivant +survive +survived +surviver +survivers +survives +surviving +survivor +survivoress +survivors +survivorship +surwan +sus +susan +susanchite +susanee +susanna +susanne +susannite +susans +suscept +susceptance +susceptibility +susceptibilities +susceptible +susceptibleness +susceptibly +susception +susceptive +susceptiveness +susceptivity +susceptor +suscipient +suscitate +suscitation +suscite +sushi +susi +susian +susianian +susie +suslik +susliks +susotoxin +suspect +suspectable +suspected +suspectedly +suspectedness +suspecter +suspectful +suspectfulness +suspectible +suspecting +suspection +suspectless +suspector +suspects +suspend +suspended +suspender +suspenderless +suspenders +suspendibility +suspendible +suspending +suspends +suspensation +suspense +suspenseful +suspensefulness +suspensely +suspenses +suspensibility +suspensible +suspension +suspensions +suspensive +suspensively +suspensiveness +suspensoid +suspensor +suspensory +suspensoria +suspensorial +suspensories +suspensorium +suspercollate +suspicable +suspicion +suspicionable +suspicional +suspicioned +suspicionful +suspicioning +suspicionless +suspicions +suspicious +suspiciously +suspiciousness +suspiral +suspiration +suspiratious +suspirative +suspire +suspired +suspires +suspiring +suspirious +susquehanna +suss +sussex +sussexite +sussexman +sussy +susso +sussultatory +sussultorial +sustain +sustainable +sustained +sustainedly +sustainer +sustaining +sustainingly +sustainment +sustains +sustanedly +sustenance +sustenanceless +sustenant +sustentacula +sustentacular +sustentaculum +sustentate +sustentation +sustentational +sustentative +sustentator +sustention +sustentive +sustentor +sustinent +susu +susuhunan +susuidae +susumu +susurr +susurrant +susurrate +susurrated +susurrating +susurration +susurrations +susurringly +susurrous +susurrus +susurruses +sutaio +suterbery +suterberry +suterberries +suther +sutherlandia +sutile +sutler +sutlerage +sutleress +sutlery +sutlers +sutlership +suto +sutor +sutoria +sutorial +sutorian +sutorious +sutra +sutras +sutta +suttapitaka +suttas +suttee +sutteeism +suttees +sutten +sutter +suttin +suttle +sutu +sutural +suturally +suturation +suture +sutured +sutures +suturing +suu +suum +suwandi +suwarro +suwe +suz +suzan +suzanne +suzerain +suzeraine +suzerains +suzerainship +suzerainty +suzerainties +suzette +suzettes +suzy +suzuki +sv +svabite +svamin +svan +svanetian +svanish +svante +svantovit +svarabhakti +svarabhaktic +svaraj +svarajes +svarajs +svarloka +svastika +svc +svce +svedberg +svedbergs +svelt +svelte +sveltely +svelteness +svelter +sveltest +svengali +svetambara +svgs +sviatonosite +sw +swa +swab +swabbed +swabber +swabberly +swabbers +swabby +swabbie +swabbies +swabbing +swabble +swabian +swabs +swack +swacked +swacken +swacking +swad +swadder +swaddy +swaddish +swaddle +swaddlebill +swaddled +swaddler +swaddles +swaddling +swadeshi +swadeshism +swag +swagbelly +swagbellied +swagbellies +swage +swaged +swager +swagers +swages +swagged +swagger +swaggered +swaggerer +swaggerers +swaggering +swaggeringly +swaggers +swaggi +swaggy +swaggie +swagging +swaggir +swaging +swaglike +swagman +swagmen +swags +swagsman +swagsmen +swahilese +swahili +swahilian +swahilize +sway +swayable +swayableness +swayback +swaybacked +swaybacks +swayed +swayer +swayers +swayful +swaying +swayingly +swail +swayless +swails +swaimous +swain +swainish +swainishness +swainmote +swains +swainship +swainsona +swaird +sways +swale +swaler +swales +swaling +swalingly +swallet +swallo +swallow +swallowable +swallowed +swallower +swallowing +swallowlike +swallowling +swallowpipe +swallows +swallowtail +swallowtailed +swallowtails +swallowwort +swam +swami +swamy +swamies +swamis +swamp +swampable +swampberry +swampberries +swamped +swamper +swampers +swamphen +swampy +swampier +swampiest +swampine +swampiness +swamping +swampish +swampishness +swampland +swampless +swamps +swampside +swampweed +swampwood +swan +swandown +swanflower +swang +swangy +swanherd +swanherds +swanhood +swanimote +swank +swanked +swankey +swanker +swankest +swanky +swankie +swankier +swankiest +swankily +swankiness +swanking +swankness +swankpot +swanks +swanlike +swanmark +swanmarker +swanmarking +swanmote +swanneck +swannecked +swanned +swanner +swannery +swanneries +swannet +swanny +swanning +swannish +swanpan +swanpans +swans +swansdown +swanskin +swanskins +swantevit +swanweed +swanwort +swap +swape +swapped +swapper +swappers +swapping +swaps +swaraj +swarajes +swarajism +swarajist +swarbie +sward +swarded +swardy +swarding +swards +sware +swarf +swarfer +swarfs +swarga +swarm +swarmed +swarmer +swarmers +swarmy +swarming +swarmingness +swarms +swarry +swart +swartback +swarth +swarthy +swarthier +swarthiest +swarthily +swarthiness +swarthness +swarths +swarty +swartish +swartly +swartness +swartrutter +swartrutting +swartzbois +swartzia +swartzite +swarve +swash +swashbuckle +swashbuckler +swashbucklerdom +swashbucklery +swashbucklering +swashbucklers +swashbuckling +swashed +swasher +swashers +swashes +swashy +swashing +swashingly +swashway +swashwork +swastica +swasticas +swastika +swastikaed +swastikas +swat +swatch +swatchel +swatcher +swatches +swatchway +swath +swathable +swathband +swathe +swatheable +swathed +swather +swathers +swathes +swathy +swathing +swaths +swati +swatow +swats +swatted +swatter +swatters +swatting +swattle +swaver +swazi +swaziland +sweal +sweamish +swear +swearer +swearers +swearing +swearingly +swears +swearword +sweat +sweatband +sweatbox +sweatboxes +sweated +sweater +sweaters +sweatful +sweath +sweathouse +sweaty +sweatier +sweatiest +sweatily +sweatiness +sweating +sweatless +sweatproof +sweats +sweatshirt +sweatshop +sweatshops +sweatweed +swede +sweden +swedenborgian +swedenborgianism +swedenborgism +swedes +swedge +swedger +swedish +swedru +sweeny +sweenies +sweens +sweep +sweepable +sweepage +sweepback +sweepboard +sweepdom +sweeper +sweeperess +sweepers +sweepforward +sweepy +sweepier +sweepiest +sweeping +sweepingly +sweepingness +sweepings +sweeps +sweepstake +sweepstakes +sweepup +sweepwasher +sweepwashings +sweer +sweered +sweert +sweese +sweeswee +sweet +sweetbells +sweetberry +sweetbread +sweetbreads +sweetbriar +sweetbrier +sweetbriery +sweetbriers +sweetclover +sweeten +sweetened +sweetener +sweeteners +sweetening +sweetenings +sweetens +sweeter +sweetest +sweetfish +sweetful +sweetheart +sweetheartdom +sweethearted +sweetheartedness +sweethearting +sweethearts +sweetheartship +sweety +sweetie +sweeties +sweetiewife +sweeting +sweetings +sweetish +sweetishly +sweetishness +sweetkins +sweetleaf +sweetless +sweetly +sweetlike +sweetling +sweetmaker +sweetman +sweetmeal +sweetmeat +sweetmeats +sweetmouthed +sweetness +sweetroot +sweets +sweetshop +sweetsome +sweetsop +sweetsops +sweetwater +sweetweed +sweetwood +sweetwort +swego +swelchie +swell +swellage +swelldom +swelldoodle +swelled +sweller +swellest +swellfish +swellfishes +swellhead +swellheaded +swellheadedness +swellheads +swelly +swelling +swellings +swellish +swellishness +swellmobsman +swellness +swells +swelltoad +swelp +swelt +swelter +sweltered +swelterer +sweltering +swelteringly +swelters +swelth +swelty +sweltry +sweltrier +sweltriest +swep +swept +sweptback +sweptwing +swerd +swertia +swervable +swerve +swerved +swerveless +swerver +swervers +swerves +swervily +swerving +sweven +swevens +swy +swick +swidden +swidge +swietenia +swift +swiften +swifter +swifters +swiftest +swiftfoot +swifty +swiftian +swiftie +swiftlet +swiftly +swiftlier +swiftliest +swiftlike +swiftness +swifts +swig +swigged +swigger +swiggers +swigging +swiggle +swigs +swile +swilkie +swill +swillbelly +swillbowl +swilled +swiller +swillers +swilling +swillpot +swills +swilltub +swim +swimbel +swimy +swimmable +swimmer +swimmeret +swimmerette +swimmers +swimmy +swimmier +swimmiest +swimmily +swimminess +swimming +swimmingly +swimmingness +swimmings +swimmist +swims +swimsuit +swimsuits +swinburnesque +swinburnian +swindle +swindleable +swindled +swindledom +swindler +swindlery +swindlers +swindlership +swindles +swindling +swindlingly +swine +swinebread +swinecote +swinehead +swineherd +swineherdship +swinehood +swinehull +swiney +swinely +swinelike +swinepipe +swinepox +swinepoxes +swinery +swinesty +swinestone +swing +swingable +swingably +swingaround +swingback +swingboat +swingdevil +swingdingle +swinge +swinged +swingeing +swingeingly +swingel +swingeour +swinger +swingers +swinges +swingy +swingier +swingiest +swinging +swingingly +swingism +swingknife +swingle +swinglebar +swingled +swingles +swingletail +swingletree +swingling +swingman +swingometer +swings +swingstock +swingtree +swinish +swinishly +swinishness +swink +swinked +swinker +swinking +swinks +swinney +swinneys +swipe +swiped +swiper +swipes +swipy +swiping +swiple +swiples +swipper +swipple +swipples +swird +swire +swirl +swirled +swirly +swirlier +swirliest +swirling +swirlingly +swirls +swirrer +swirring +swish +swished +swisher +swishers +swishes +swishy +swishier +swishiest +swishing +swishingly +swiss +swisser +swisses +swissess +swissing +switch +switchable +switchback +switchbacker +switchbacks +switchblade +switchblades +switchboard +switchboards +switched +switchel +switcher +switcheroo +switchers +switches +switchgear +switchgirl +switchy +switchyard +switching +switchings +switchkeeper +switchlike +switchman +switchmen +switchover +switchtail +swith +swithe +swythe +swithen +swither +swithered +swithering +swithers +swithin +swithly +switzer +switzeress +switzerland +swive +swived +swivel +swiveled +swiveleye +swiveleyed +swiveling +swivelled +swivellike +swivelling +swivels +swiveltail +swiver +swives +swivet +swivets +swivetty +swiving +swiwet +swiz +swizz +swizzle +swizzled +swizzler +swizzlers +swizzles +swizzling +swleaves +swob +swobbed +swobber +swobbers +swobbing +swobs +swollen +swollenly +swollenness +swoln +swom +swonk +swonken +swoon +swooned +swooner +swooners +swoony +swooning +swooningly +swoons +swoop +swooped +swooper +swoopers +swooping +swoops +swoopstake +swoose +swooses +swoosh +swooshed +swooshes +swooshing +swop +swopped +swopping +swops +sword +swordbearer +swordbill +swordcraft +sworded +sworder +swordfish +swordfishery +swordfisherman +swordfishes +swordfishing +swordgrass +swordick +swording +swordknot +swordless +swordlet +swordlike +swordmaker +swordmaking +swordman +swordmanship +swordmen +swordplay +swordplayer +swordproof +swords +swordslipper +swordsman +swordsmanship +swordsmen +swordsmith +swordster +swordstick +swordswoman +swordtail +swordweed +swore +sworn +swosh +swot +swots +swotted +swotter +swotters +swotting +swough +swoun +swound +swounded +swounding +swounds +swouned +swouning +swouns +swow +swum +swung +swungen +swure +szaibelyite +szekler +szlachta +szopelka +t +ta +taa +taal +taalbond +taar +taata +tab +tabac +tabacco +tabacin +tabacism +tabacosis +tabacum +tabagie +tabagism +taband +tabanid +tabanidae +tabanids +tabaniform +tabanuco +tabanus +tabard +tabarded +tabardillo +tabards +tabaret +tabarets +tabasco +tabasheer +tabashir +tabatiere +tabaxir +tabbarea +tabbed +tabber +tabby +tabbied +tabbies +tabbying +tabbinet +tabbing +tabbis +tabbises +tabebuia +tabefaction +tabefy +tabel +tabella +tabellaria +tabellariaceae +tabellion +taber +taberdar +tabered +tabering +taberna +tabernacle +tabernacled +tabernacler +tabernacles +tabernacling +tabernacular +tabernae +tabernaemontana +tabernariae +tabers +tabes +tabescence +tabescent +tabet +tabetic +tabetics +tabetiform +tabetless +tabi +tabic +tabid +tabidly +tabidness +tabific +tabifical +tabinet +tabira +tabis +tabitha +tabitude +tabla +tablas +tablature +table +tableau +tableaus +tableaux +tablecloth +tableclothy +tablecloths +tableclothwise +tabled +tablefellow +tablefellowship +tableful +tablefuls +tablehopped +tablehopping +tableity +tableland +tablelands +tableless +tablelike +tablemaid +tablemaker +tablemaking +tableman +tablemate +tablement +tablemount +tabler +tables +tablesful +tablespoon +tablespoonful +tablespoonfuls +tablespoons +tablespoonsful +tablet +tabletary +tableted +tableting +tabletop +tabletops +tablets +tabletted +tabletting +tableware +tablewise +tablier +tablina +tabling +tablinum +tablita +tabloid +tabloids +tabog +taboo +tabooed +tabooing +tabooism +tabooist +taboos +taboot +taboparalysis +taboparesis +taboparetic +tabophobia +tabor +tabored +taborer +taborers +taboret +taborets +taborin +taborine +taborines +taboring +taborins +taborite +tabors +tabour +taboured +tabourer +tabourers +tabouret +tabourets +tabourin +tabourine +tabouring +tabours +tabret +tabriz +tabs +tabstop +tabstops +tabu +tabued +tabuing +tabula +tabulable +tabulae +tabular +tabulare +tabulary +tabularia +tabularisation +tabularise +tabularised +tabularising +tabularium +tabularization +tabularize +tabularized +tabularizing +tabularly +tabulata +tabulate +tabulated +tabulates +tabulating +tabulation +tabulations +tabulator +tabulatory +tabulators +tabule +tabuliform +tabus +tabut +tacahout +tacamahac +tacamahaca +tacamahack +tacan +tacana +tacanan +tacca +taccaceae +taccaceous +taccada +tace +taces +tacet +tach +tachardia +tachardiinae +tache +tacheless +tacheography +tacheometer +tacheometry +tacheometric +taches +tacheture +tachhydrite +tachi +tachyauxesis +tachyauxetic +tachibana +tachycardia +tachycardiac +tachygen +tachygenesis +tachygenetic +tachygenic +tachyglossal +tachyglossate +tachyglossidae +tachyglossus +tachygraph +tachygrapher +tachygraphy +tachygraphic +tachygraphical +tachygraphically +tachygraphist +tachygraphometer +tachygraphometry +tachyhydrite +tachyiatry +tachylalia +tachylite +tachylyte +tachylytic +tachymeter +tachymetry +tachymetric +tachina +tachinaria +tachinarian +tachinid +tachinidae +tachinids +tachiol +tachyon +tachyphagia +tachyphasia +tachyphemia +tachyphylactic +tachyphylaxia +tachyphylaxis +tachyphrasia +tachyphrenia +tachypnea +tachypneic +tachypnoea +tachypnoeic +tachyscope +tachyseism +tachysystole +tachism +tachisme +tachisms +tachist +tachiste +tachysterol +tachistes +tachistoscope +tachistoscopic +tachistoscopically +tachists +tachytely +tachytelic +tachythanatous +tachytype +tachytomy +tachogram +tachograph +tachometer +tachometers +tachometry +tachometric +tachophobia +tachoscope +tachs +tacit +tacitean +tacitly +tacitness +taciturn +taciturnist +taciturnity +taciturnities +taciturnly +tack +tackboard +tacked +tackey +tacker +tackers +tacket +tacketed +tackety +tackets +tacky +tackier +tackies +tackiest +tackify +tackified +tackifier +tackifies +tackifying +tackily +tackiness +tacking +tackingly +tackle +tackled +tackleless +tackleman +tackler +tacklers +tackles +tackless +tackling +tacklings +tackproof +tacks +tacksman +tacksmen +taclocus +tacmahack +tacnode +tacnodes +taco +tacoma +taconian +taconic +taconite +taconites +tacos +tacpoint +tacso +tacsonia +tact +tactable +tactful +tactfully +tactfulness +tactic +tactical +tactically +tactician +tacticians +tactics +tactile +tactilely +tactilist +tactility +tactilities +tactilogical +tactinvariant +taction +tactions +tactite +tactive +tactless +tactlessly +tactlessness +tactoid +tactometer +tactor +tactosol +tacts +tactual +tactualist +tactuality +tactually +tactus +tacuacine +taculli +tad +tadbhava +tade +tadjik +tadousac +tadpole +tadpoledom +tadpolehood +tadpolelike +tadpoles +tadpolism +tads +tae +tael +taels +taen +taenia +taeniacidal +taeniacide +taeniada +taeniae +taeniafuge +taenial +taenian +taenias +taeniasis +taeniata +taeniate +taenicide +taenidia +taenidial +taenidium +taeniform +taenifuge +taeniiform +taeninidia +taeniobranchia +taeniobranchiate +taeniodonta +taeniodontia +taeniodontidae +taenioglossa +taenioglossate +taenioid +taeniola +taeniosome +taeniosomi +taeniosomous +taenite +taennin +taetsia +taffarel +taffarels +tafferel +tafferels +taffeta +taffetas +taffety +taffetized +taffy +taffia +taffias +taffies +taffylike +taffymaker +taffymaking +taffywise +taffle +taffrail +taffrails +tafia +tafias +tafinagh +taft +tafwiz +tag +tagabilis +tagakaolo +tagal +tagala +tagalize +tagalo +tagalog +tagalogs +tagalong +tagalongs +tagasaste +tagassu +tagassuidae +tagatose +tagaur +tagbanua +tagboard +tagboards +tagel +tagetes +tagetol +tagetone +tagged +tagger +taggers +taggy +tagging +taggle +taghairm +taghlik +tagilite +tagish +taglet +taglia +tagliacotian +tagliacozzian +tagliarini +tagliatelle +taglike +taglioni +taglock +tagmeme +tagmemes +tagmemic +tagmemics +tagnicati +tagrag +tagraggery +tagrags +tags +tagsore +tagster +tagtail +tagua +taguan +tagula +tagus +tagwerk +taha +tahali +tahami +tahanun +tahar +taharah +taheen +tahgook +tahil +tahin +tahina +tahiti +tahitian +tahitians +tahkhana +tahltan +tahona +tahr +tahrs +tahseeldar +tahsil +tahsildar +tahsils +tahsin +tahua +tai +tay +taiaha +tayassu +tayassuid +tayassuidae +taich +tayer +taig +taiga +taigas +taygeta +taiglach +taigle +taiglesome +taihoa +taiyal +tayir +taikhana +taikih +taikun +tail +tailage +tailback +tailbacks +tailband +tailboard +tailbone +tailbones +tailcoat +tailcoated +tailcoats +tailed +tailender +tailer +tailers +tailet +tailfan +tailfirst +tailflower +tailforemost +tailgate +tailgated +tailgater +tailgates +tailgating +tailge +tailgunner +tailhead +taily +tailye +tailing +tailings +taille +tailles +tailless +taillessly +taillessness +tailleur +taillie +taillight +taillights +taillike +tailloir +tailor +taylor +tailorage +tailorbird +tailorcraft +tailordom +tailored +tailoress +tailorhood +tailory +tailoring +tailorism +taylorism +taylorite +tailorization +tailorize +taylorize +tailorless +tailorly +tailorlike +tailorman +tailors +tailorship +tailorwise +tailpiece +tailpin +tailpipe +tailpipes +tailplane +tailrace +tailraces +tails +tailshaft +tailsheet +tailskid +tailskids +tailsman +tailspin +tailspins +tailstock +tailte +tailward +tailwards +tailwater +tailwind +tailwinds +tailwise +tailzee +tailzie +tailzied +taimen +taimyrite +tain +tainan +taino +tainos +tains +taint +taintable +tainte +tainted +taintedness +tainting +taintless +taintlessly +taintlessness +taintment +taintor +taintproof +taints +tainture +taintworm +tainui +taipan +taipans +taipei +taipi +taiping +taipo +tayra +tairge +tairger +tairn +tayrona +taysaam +taisch +taise +taish +taisho +taysmm +taissle +taistrel +taistril +tait +taiver +taivers +taivert +taiwan +taiwanese +taiwanhemp +taj +tajes +tajik +tajiki +taka +takable +takahe +takahes +takayuki +takamaka +takao +takar +take +takeable +takeaway +taked +takedown +takedownable +takedowns +takeful +takeing +takelma +taken +takeoff +takeoffs +takeout +takeouts +takeover +takeovers +taker +takers +takes +taketh +takeuchi +takhaar +takhtadjy +taky +takilman +takin +taking +takingly +takingness +takings +takins +takyr +takitumu +takkanah +takosis +takrouri +takt +taku +tal +tala +talabon +talahib +talaing +talayot +talayoti +talaje +talak +talalgia +talamanca +talamancan +talanton +talao +talapoin +talapoins +talar +talari +talaria +talaric +talars +talas +talbot +talbotype +talbotypist +talc +talced +talcer +talcher +talcing +talck +talcked +talcky +talcking +talclike +talcochlorite +talcoid +talcomicaceous +talcose +talcous +talcs +talcum +talcums +tald +tale +talebearer +talebearers +talebearing +talebook +talecarrier +talecarrying +taled +taleful +talegalla +talegallinae +talegallus +taleysim +talemaster +talemonger +talemongering +talent +talented +talenter +talenting +talentless +talents +talepyet +taler +talers +tales +talesman +talesmen +taleteller +taletelling +talewise +tali +taliacotian +taliage +taliation +taliera +taligrade +talinum +talio +talion +talionic +talionis +talions +talipat +taliped +talipedic +talipeds +talipes +talipomanus +talipot +talipots +talis +talisay +talishi +talyshin +talisman +talismanic +talismanical +talismanically +talismanist +talismanni +talismans +talite +talitha +talitol +talk +talkability +talkable +talkathon +talkative +talkatively +talkativeness +talked +talkee +talker +talkers +talkfest +talkful +talky +talkie +talkier +talkies +talkiest +talkiness +talking +talkings +talks +talkworthy +tall +tallage +tallageability +tallageable +tallaged +tallages +tallaging +tallahassee +tallaisim +tallaism +tallapoi +tallate +tallboy +tallboys +tallegalane +taller +tallero +talles +tallest +tallet +talli +tally +talliable +talliage +talliar +talliate +talliated +talliating +talliatum +tallied +tallier +talliers +tallies +tallyho +tallyhoed +tallyhoing +tallyhos +tallying +tallyman +tallymanship +tallymen +tallis +tallish +tallyshop +tallit +tallith +tallithes +tallithim +tallitoth +tallywag +tallywalka +tallywoman +tallywomen +tallness +tallnesses +talloel +tallol +tallols +tallote +tallow +tallowberry +tallowberries +tallowed +tallower +tallowy +tallowiness +tallowing +tallowish +tallowlike +tallowmaker +tallowmaking +tallowman +tallowroot +tallows +tallowweed +tallowwood +tallwood +talma +talmas +talmouse +talmud +talmudic +talmudical +talmudism +talmudist +talmudistic +talmudistical +talmudists +talmudization +talmudize +talocalcaneal +talocalcanean +talocrural +talofibular +talon +talonavicular +taloned +talonic +talonid +talons +talooka +talookas +taloscaphoid +talose +talotibial +talpa +talpacoti +talpatate +talpetate +talpicide +talpid +talpidae +talpify +talpiform +talpine +talpoid +talshide +taltarum +talter +talthib +taltushtuntude +taluche +taluhet +taluk +taluka +talukas +talukdar +talukdari +taluks +talus +taluses +taluto +talwar +talweg +talwood +tam +tama +tamability +tamable +tamableness +tamably +tamaceae +tamachek +tamacoare +tamal +tamale +tamales +tamals +tamanac +tamanaca +tamanaco +tamandu +tamandua +tamanduas +tamanduy +tamandus +tamanoas +tamanoir +tamanowus +tamanu +tamara +tamarack +tamaracks +tamaraite +tamarao +tamaraos +tamarau +tamaraus +tamaricaceae +tamaricaceous +tamarin +tamarind +tamarinds +tamarindus +tamarins +tamarisk +tamarisks +tamarix +tamaroa +tamas +tamasha +tamashas +tamashek +tamasic +tamaulipecan +tambac +tambacs +tambala +tambalas +tambaroora +tamber +tambo +tamboo +tambookie +tambor +tambouki +tambour +tamboura +tambouras +tamboured +tambourer +tambouret +tambourgi +tambourin +tambourinade +tambourine +tambourines +tambouring +tambourins +tambourist +tambours +tambreet +tambuki +tambur +tambura +tamburan +tamburas +tamburello +tamburitza +tamburone +tamburs +tame +tameability +tameable +tameableness +tamed +tamehearted +tameheartedness +tamein +tameins +tameless +tamelessly +tamelessness +tamely +tamenes +tameness +tamenesses +tamer +tamerlanism +tamers +tames +tamest +tamias +tamidine +tamil +tamilian +tamilic +tamine +taming +taminy +tamis +tamise +tamises +tamlung +tammany +tammanial +tammanyism +tammanyite +tammanyize +tammanize +tammar +tammy +tammie +tammies +tammock +tammuz +tamoyo +tamonea +tamp +tampa +tampala +tampalas +tampan +tampang +tampans +tamped +tamper +tampered +tamperer +tamperers +tampering +tamperproof +tampers +tampin +tamping +tampion +tampioned +tampions +tampoe +tampoy +tampon +tamponade +tamponage +tamponed +tamponing +tamponment +tampons +tampoon +tamps +tampur +tams +tamul +tamulian +tamulic +tamure +tamus +tamworth +tamzine +tan +tana +tanacetyl +tanacetin +tanacetone +tanacetum +tanach +tanadar +tanager +tanagers +tanagra +tanagraean +tanagridae +tanagrine +tanagroid +tanaidacea +tanaist +tanak +tanaka +tanala +tanan +tanbark +tanbarks +tanbur +tancel +tanchelmian +tanchoir +tandan +tandava +tandem +tandemer +tandemist +tandemize +tandems +tandemwise +tandy +tandle +tandoor +tandoori +tandour +tandsticka +tandstickor +tane +tanega +tanekaha +tang +tanga +tangaloa +tangalung +tangantangan +tangaridae +tangaroa +tangaroan +tanged +tangeite +tangelo +tangelos +tangence +tangences +tangency +tangencies +tangent +tangental +tangentally +tangential +tangentiality +tangentially +tangently +tangents +tanger +tangerine +tangerines +tangfish +tangfishes +tangham +tanghan +tanghin +tanghinia +tanghinin +tangi +tangy +tangibile +tangibility +tangible +tangibleness +tangibles +tangibly +tangie +tangier +tangiest +tangile +tangilin +tanginess +tanging +tangipahoa +tangka +tanglad +tangle +tangleberry +tangleberries +tangled +tanglefish +tanglefishes +tanglefoot +tanglehead +tanglement +tangleproof +tangler +tangleroot +tanglers +tangles +tanglesome +tangless +tanglewrack +tangly +tanglier +tangliest +tangling +tanglingly +tango +tangoed +tangoing +tangoreceptor +tangos +tangram +tangrams +tangs +tangue +tanguile +tanguin +tangum +tangun +tangut +tanh +tanha +tanhouse +tania +tanya +tanyard +tanyards +tanica +tanier +taniko +taniness +tanyoan +tanist +tanistic +tanystomata +tanystomatous +tanystome +tanistry +tanistries +tanists +tanistship +tanite +tanitic +tanjib +tanjong +tank +tanka +tankage +tankages +tankah +tankard +tankards +tankas +tanked +tanker +tankerabogus +tankers +tankert +tankette +tankful +tankfuls +tankie +tanking +tankka +tankle +tankless +tanklike +tankmaker +tankmaking +tankman +tankodrome +tankroom +tanks +tankship +tankships +tankwise +tanling +tanna +tannable +tannadar +tannage +tannages +tannaic +tannaim +tannaitic +tannalbin +tannase +tannate +tannates +tanned +tanner +tannery +tanneries +tanners +tannest +tannhauser +tanny +tannic +tannid +tannide +tanniferous +tannigen +tannyl +tannin +tannined +tanning +tannings +tanninlike +tannins +tannish +tannocaffeic +tannogallate +tannogallic +tannogelatin +tannogen +tannoid +tannometer +tano +tanoa +tanoan +tanproof +tanquam +tanquelinian +tanquen +tanrec +tanrecs +tans +tansey +tansel +tansy +tansies +tanstuff +tantadlin +tantafflin +tantalate +tantalean +tantalian +tantalic +tantaliferous +tantalifluoride +tantalisation +tantalise +tantalised +tantaliser +tantalising +tantalisingly +tantalite +tantalization +tantalize +tantalized +tantalizer +tantalizers +tantalizes +tantalizing +tantalizingly +tantalizingness +tantalofluoride +tantalous +tantalum +tantalums +tantalus +tantaluses +tantamount +tantara +tantarabobus +tantarara +tantaras +tantawy +tanti +tantieme +tantivy +tantivies +tantle +tanto +tantony +tantra +tantras +tantric +tantrik +tantrism +tantrist +tantrum +tantrums +tantum +tanwood +tanworks +tanzania +tanzanian +tanzanians +tanzanite +tanzeb +tanzy +tanzib +tanzine +tao +taoiya +taoyin +taoism +taoist +taoistic +taoists +taonurus +taos +taotai +tap +tapa +tapachula +tapachulteca +tapacolo +tapaculo +tapaculos +tapacura +tapadera +tapaderas +tapadero +tapaderos +tapayaxin +tapajo +tapalo +tapalos +tapamaker +tapamaking +tapas +tapasvi +tape +tapeats +tapecopy +taped +tapedrives +tapeinocephaly +tapeinocephalic +tapeinocephalism +tapeless +tapelike +tapeline +tapelines +tapemaker +tapemaking +tapeman +tapemarks +tapemen +tapemove +tapen +taper +taperbearer +tapered +taperer +taperers +tapery +tapering +taperingly +taperly +tapermaker +tapermaking +taperness +tapers +taperstick +taperwise +tapes +tapesium +tapester +tapestry +tapestried +tapestries +tapestrying +tapestrylike +tapestring +tapet +tapeta +tapetal +tapete +tapeti +tapetis +tapetless +tapetta +tapetum +tapework +tapeworm +tapeworms +taphephobia +taphole +tapholes +taphouse +taphouses +taphria +taphrina +taphrinaceae +tapia +tapidero +tapijulapane +tapinceophalism +taping +tapings +tapinocephaly +tapinocephalic +tapinoma +tapinophoby +tapinophobia +tapinosis +tapioca +tapiocas +tapiolite +tapir +tapiridae +tapiridian +tapirine +tapiro +tapiroid +tapirs +tapirus +tapis +tapiser +tapises +tapism +tapisser +tapissery +tapisserie +tapissier +tapist +tapit +taplash +tapleyism +taplet +tapling +tapmost +tapnet +tapoa +taposa +tapotement +tapoun +tappa +tappable +tappableness +tappall +tappaul +tapped +tappen +tapper +tapperer +tappers +tappertitian +tappet +tappets +tappietoorie +tapping +tappings +tappish +tappit +tappoon +taprobane +taproom +taprooms +taproot +taprooted +taproots +taps +tapsalteerie +tapsman +tapster +tapsterly +tapsterlike +tapsters +tapstress +tapu +tapuya +tapuyan +tapuyo +tapul +tapwort +taqlid +taqua +tar +tara +tarabooka +taracahitian +taradiddle +taraf +tarafdar +tarage +tarahumar +tarahumara +tarahumare +tarahumari +tarai +tarairi +tarakihi +taraktogenos +taramasalata +taramellite +taramembe +taranchi +tarand +tarandean +tarandian +tarantara +tarantarize +tarantas +tarantases +tarantass +tarantella +tarantelle +tarantism +tarantist +tarantula +tarantulae +tarantular +tarantulary +tarantulas +tarantulated +tarantulid +tarantulidae +tarantulism +tarantulite +tarantulous +tarapatch +taraph +tarapin +tarapon +tarasc +tarascan +tarasco +tarassis +tarata +taratah +taratantara +taratantarize +tarau +taraxacerin +taraxacin +taraxacum +tarazed +tarbadillo +tarbagan +tarbet +tarble +tarboard +tarbogan +tarboggin +tarboy +tarboosh +tarbooshed +tarbooshes +tarbox +tarbrush +tarbush +tarbushes +tarbuttite +tarcel +tarchon +tardamente +tardando +tardant +tarde +tardenoisian +tardy +tardier +tardies +tardiest +tardigrada +tardigrade +tardigradous +tardily +tardiloquent +tardiloquy +tardiloquous +tardiness +tardity +tarditude +tardive +tardle +tardo +tare +tarea +tared +tarefa +tarefitch +tarentala +tarente +tarentine +tarentism +tarentola +tarepatch +tareq +tares +tarfa +tarflower +targe +targed +targeman +targer +targes +target +targeted +targeteer +targetier +targeting +targetless +targetlike +targetman +targets +targetshooter +targing +targum +targumic +targumical +targumist +targumistic +targumize +tarheel +tarheeler +tarhood +tari +tariana +taryard +taryba +tarie +tariff +tariffable +tariffed +tariffication +tariffing +tariffism +tariffist +tariffite +tariffize +tariffless +tariffs +tarin +taring +tariqa +tariqat +tariri +tariric +taririnic +tarish +tarkalani +tarkani +tarkashi +tarkeean +tarkhan +tarlatan +tarlataned +tarlatans +tarleather +tarletan +tarletans +tarlies +tarlike +tarltonize +tarmac +tarmacadam +tarmacs +tarman +tarmi +tarmined +tarmosined +tarn +tarnal +tarnally +tarnation +tarnish +tarnishable +tarnished +tarnisher +tarnishes +tarnishing +tarnishment +tarnishproof +tarnkappe +tarnlike +tarns +tarnside +taro +taroc +tarocco +tarocs +tarogato +tarogatos +tarok +taroks +taropatch +taros +tarot +tarots +tarp +tarpan +tarpans +tarpaper +tarpapered +tarpapers +tarpaulian +tarpaulin +tarpaulinmaker +tarpaulins +tarpeia +tarpeian +tarpon +tarpons +tarpot +tarps +tarpum +tarquin +tarquinish +tarr +tarraba +tarrack +tarradiddle +tarradiddler +tarragon +tarragona +tarragons +tarras +tarrass +tarrateen +tarratine +tarre +tarred +tarrer +tarres +tarri +tarry +tarriance +tarrie +tarried +tarrier +tarriers +tarries +tarriest +tarrify +tarryiest +tarrying +tarryingly +tarryingness +tarrily +tarriness +tarring +tarrish +tarrock +tarrow +tars +tarsadenitis +tarsal +tarsale +tarsalgia +tarsalia +tarsals +tarse +tarsectomy +tarsectopia +tarsi +tarsia +tarsias +tarsier +tarsiers +tarsiidae +tarsioid +tarsipedidae +tarsipedinae +tarsipes +tarsitis +tarsius +tarsochiloplasty +tarsoclasis +tarsomalacia +tarsome +tarsometatarsal +tarsometatarsi +tarsometatarsus +tarsonemid +tarsonemidae +tarsonemus +tarsophalangeal +tarsophyma +tarsoplasia +tarsoplasty +tarsoptosis +tarsorrhaphy +tarsotarsal +tarsotibal +tarsotomy +tarsus +tart +tartago +tartan +tartana +tartanas +tartane +tartans +tartar +tartarated +tartare +tartarean +tartareous +tartaret +tartary +tartarian +tartaric +tartarin +tartarine +tartarish +tartarism +tartarization +tartarize +tartarized +tartarizing +tartarly +tartarlike +tartarology +tartarous +tartarproof +tartars +tartarum +tartarus +tarte +tarted +tartemorion +tarten +tarter +tartest +tartine +tarting +tartish +tartishly +tartishness +tartle +tartlet +tartlets +tartly +tartness +tartnesses +tartralic +tartramate +tartramic +tartramid +tartramide +tartrate +tartrated +tartrates +tartratoferric +tartrazin +tartrazine +tartrazinic +tartrelic +tartryl +tartrylic +tartro +tartronate +tartronic +tartronyl +tartronylurea +tartrous +tarts +tartufe +tartufery +tartufes +tartuffe +tartuffery +tartuffes +tartuffian +tartuffish +tartuffishly +tartuffism +tartufian +tartufish +tartufishly +tartufism +tartwoman +tartwomen +taruma +tarumari +tarve +tarvia +tarweed +tarweeds +tarwhine +tarwood +tarworks +tarzan +tarzanish +tarzans +tas +tasajillo +tasajillos +tasajo +tasbih +tascal +tasco +taseometer +tash +tasheriff +tashie +tashlik +tashnagist +tashnakist +tashreef +tashrif +tasian +tasimeter +tasimetry +tasimetric +task +taskage +tasked +tasker +tasking +taskit +taskless +tasklike +taskmaster +taskmasters +taskmastership +taskmistress +tasks +tasksetter +tasksetting +taskwork +taskworks +taslet +tasmanian +tasmanite +tass +tassago +tassah +tassal +tassard +tasse +tassel +tasseled +tasseler +tasselet +tasselfish +tassely +tasseling +tasselled +tasseller +tasselly +tasselling +tassellus +tasselmaker +tasselmaking +tassels +tasser +tasses +tasset +tassets +tassie +tassies +tassoo +tastable +tastableness +tastably +taste +tasteable +tasteableness +tasteably +tastebuds +tasted +tasteful +tastefully +tastefulness +tastekin +tasteless +tastelessly +tastelessness +tastemaker +tasten +taster +tasters +tastes +tasty +tastier +tastiest +tastily +tastiness +tasting +tastingly +tastings +tasu +tat +tatami +tatamis +tatar +tatary +tatarian +tataric +tatarization +tatarize +tataupa +tatbeb +tatchy +tate +tater +taters +tates +tath +tathata +tatian +tatianist +tatie +tatinek +tatler +tatmjolk +tatoo +tatoos +tatou +tatouay +tatouays +tatpurusha +tats +tatsanottine +tatsman +tatta +tatted +tatter +tatterdemalion +tatterdemalionism +tatterdemalionry +tatterdemalions +tattered +tatteredly +tatteredness +tattery +tattering +tatterly +tatters +tattersall +tattersalls +tatterwag +tatterwallop +tatther +tatty +tattie +tattied +tattier +tatties +tattiest +tattily +tattiness +tatting +tattings +tattle +tattled +tattlement +tattler +tattlery +tattlers +tattles +tattletale +tattletales +tattling +tattlingly +tattoo +tattooage +tattooed +tattooer +tattooers +tattooing +tattooist +tattooists +tattooment +tattoos +tattva +tatu +tatuasu +tatukira +tatusia +tatusiidae +tau +taube +tauchnitz +taught +taula +taulch +tauli +taulia +taum +taun +taungthu +taunt +taunted +taunter +taunters +taunting +tauntingly +tauntingness +taunton +tauntress +taunts +taupe +taupes +taupo +taupou +taur +tauranga +taurean +tauri +taurian +tauric +tauricide +tauricornous +taurid +tauridian +tauriferous +tauriform +tauryl +taurylic +taurin +taurine +taurines +taurini +taurite +tauroboly +taurobolia +taurobolium +taurocephalous +taurocholate +taurocholic +taurocol +taurocolla +tauroctonus +taurodont +tauroesque +taurokathapsia +taurolatry +tauromachy +tauromachia +tauromachian +tauromachic +tauromaquia +tauromorphic +tauromorphous +taurophile +taurophobe +taurophobia +tauropolos +taurotragus +taurus +tauruses +taus +taut +tautaug +tautaugs +tauted +tautegory +tautegorical +tauten +tautened +tautening +tautens +tauter +tautest +tauting +tautirite +tautit +tautly +tautness +tautnesses +tautochrone +tautochronism +tautochronous +tautog +tautogs +tautoisomerism +tautology +tautologic +tautological +tautologically +tautologicalness +tautologies +tautologise +tautologised +tautologising +tautologism +tautologist +tautologize +tautologized +tautologizer +tautologizing +tautologous +tautologously +tautomer +tautomeral +tautomery +tautomeric +tautomerism +tautomerizable +tautomerization +tautomerize +tautomerized +tautomerizing +tautomers +tautometer +tautometric +tautometrical +tautomorphous +tautonym +tautonymy +tautonymic +tautonymies +tautonymous +tautonyms +tautoousian +tautoousious +tautophony +tautophonic +tautophonical +tautopody +tautopodic +tautosyllabic +tautotype +tautourea +tautousian +tautousious +tautozonal +tautozonality +tauts +tav +tavast +tavastian +tave +tavell +taver +tavern +taverna +taverner +taverners +tavernize +tavernless +tavernly +tavernlike +tavernous +tavernry +taverns +tavernwards +tavers +tavert +tavestock +tavghi +tavy +tavistockite +tavoy +tavola +tavolatite +tavs +taw +tawa +tawdered +tawdry +tawdrier +tawdries +tawdriest +tawdrily +tawdriness +tawed +tawer +tawery +tawers +tawgi +tawhai +tawhid +tawie +tawyer +tawing +tawite +tawkee +tawkin +tawn +tawney +tawneier +tawneiest +tawneys +tawny +tawnie +tawnier +tawnies +tawniest +tawnily +tawniness +tawnle +tawpi +tawpy +tawpie +tawpies +taws +tawse +tawsed +tawses +tawsing +tawtie +tax +taxa +taxability +taxable +taxableness +taxables +taxably +taxaceae +taxaceous +taxameter +taxaspidean +taxation +taxational +taxations +taxative +taxatively +taxator +taxeater +taxeating +taxed +taxeme +taxemes +taxemic +taxeopod +taxeopoda +taxeopody +taxeopodous +taxer +taxers +taxes +taxgatherer +taxgathering +taxi +taxy +taxiable +taxiarch +taxiauto +taxibus +taxicab +taxicabs +taxicorn +taxidea +taxidermal +taxidermy +taxidermic +taxidermist +taxidermists +taxidermize +taxidriver +taxied +taxies +taxiing +taxying +taximan +taximen +taximeter +taximetered +taxin +taxine +taxing +taxingly +taxinomy +taxinomic +taxinomist +taxiplane +taxir +taxis +taxistand +taxite +taxites +taxitic +taxiway +taxiways +taxless +taxlessly +taxlessness +taxman +taxmen +taxodiaceae +taxodium +taxodont +taxology +taxometer +taxon +taxonomer +taxonomy +taxonomic +taxonomical +taxonomically +taxonomies +taxonomist +taxonomists +taxons +taxor +taxpaid +taxpayer +taxpayers +taxpaying +taxus +taxwax +taxwise +tazeea +tazia +tazza +tazzas +tazze +tb +tbs +tbsp +tbssaraglot +tc +tcawi +tch +tchai +tchaikovsky +tchapan +tcharik +tchast +tche +tcheckup +tcheirek +tcheka +tcherkess +tchervonets +tchervonetz +tchervontzi +tchetchentsish +tchetnitsi +tchetvert +tchi +tchick +tchincou +tchr +tchu +tchwi +tck +td +tdr +te +tea +teaberry +teaberries +teaboard +teaboards +teaboy +teabowl +teabowls +teabox +teaboxes +teacake +teacakes +teacart +teacarts +teach +teachability +teachable +teachableness +teachably +teache +teached +teacher +teacherage +teacherdom +teacheress +teacherhood +teachery +teacherish +teacherless +teacherly +teacherlike +teachers +teachership +teaches +teachy +teaching +teachingly +teachings +teachless +teachment +teacup +teacupful +teacupfuls +teacups +teacupsful +tead +teadish +teaey +teaer +teagardeny +teagle +teague +teagueland +teaguelander +teahouse +teahouses +teaing +teaish +teaism +teak +teakettle +teakettles +teaks +teakwood +teakwoods +teal +tealeafy +tealery +tealess +teallite +teals +team +teamaker +teamakers +teamaking +teaman +teamed +teameo +teamer +teaming +teamland +teamless +teamman +teammate +teammates +teams +teamsman +teamster +teamsters +teamwise +teamwork +teamworks +tean +teanal +teap +teapoy +teapoys +teapot +teapotful +teapots +teapottykin +tear +tearable +tearableness +tearably +tearage +tearcat +teardown +teardowns +teardrop +teardrops +teared +tearer +tearers +tearful +tearfully +tearfulness +teargas +teargases +teargassed +teargasses +teargassing +teary +tearier +teariest +tearily +teariness +tearing +tearingly +tearjerker +tearjerkers +tearless +tearlessly +tearlessness +tearlet +tearlike +tearoom +tearooms +tearpit +tearproof +tears +tearstain +tearstained +teart +tearthroat +tearthumb +teas +teasable +teasableness +teasably +tease +teaseable +teaseableness +teaseably +teased +teasehole +teasel +teaseled +teaseler +teaselers +teaseling +teaselled +teaseller +teasellike +teaselling +teasels +teaselwort +teasement +teaser +teasers +teases +teashop +teashops +teasy +teasiness +teasing +teasingly +teasle +teasler +teaspoon +teaspoonful +teaspoonfuls +teaspoons +teaspoonsful +teat +teataster +teated +teatfish +teathe +teather +teaty +teatime +teatimes +teatlike +teatling +teatman +teats +teave +teaware +teawares +teaze +teazel +teazeled +teazeling +teazelled +teazelling +teazels +teazer +teazle +teazled +teazles +teazling +tebbad +tebbet +tebeldi +tebet +tebeth +tebu +tec +teca +tecali +tecassir +tech +teched +techy +techie +techier +techies +techiest +techily +techiness +techne +technetium +technetronic +technic +technica +technical +technicalism +technicalist +technicality +technicalities +technicalization +technicalize +technically +technicalness +technician +technicians +technicism +technicist +technicology +technicological +technicolor +technicolored +technicon +technics +techniphone +technique +techniquer +techniques +technism +technist +technocausis +technochemical +technochemistry +technocracy +technocracies +technocrat +technocratic +technocrats +technographer +technography +technographic +technographical +technographically +technol +technolithic +technology +technologic +technological +technologically +technologies +technologist +technologists +technologize +technologue +technonomy +technonomic +technopsychology +technostructure +techous +teck +tecla +tecnoctonia +tecnology +teco +tecoma +tecomin +tecon +tecpanec +tecta +tectal +tectibranch +tectibranchia +tectibranchian +tectibranchiata +tectibranchiate +tectiform +tectocephaly +tectocephalic +tectology +tectological +tectona +tectonic +tectonically +tectonics +tectonism +tectorial +tectorium +tectosages +tectosphere +tectospinal +tectospondyli +tectospondylic +tectospondylous +tectrices +tectricial +tectrix +tectum +tecture +tecum +tecuma +tecuna +ted +teda +tedded +tedder +tedders +teddy +teddies +tedding +tedesca +tedescan +tedesche +tedeschi +tedesco +tedge +tediosity +tedious +tediously +tediousness +tediousome +tedisome +tedium +tediums +teds +tee +teecall +teed +teedle +teeing +teel +teem +teemed +teemer +teemers +teemful +teemfulness +teeming +teemingly +teemingness +teemless +teems +teen +teenage +teenaged +teenager +teenagers +teener +teeners +teenet +teenful +teenfully +teenfuls +teeny +teenybopper +teenyboppers +teenie +teenier +teeniest +teenish +teens +teensy +teensier +teensiest +teenty +teentsy +teentsier +teentsiest +teepee +teepees +teer +teerer +tees +teest +teeswater +teet +teetaller +teetan +teetee +teeter +teeterboard +teetered +teeterer +teetery +teetering +teeteringly +teeters +teetertail +teeth +teethache +teethbrush +teethe +teethed +teether +teethers +teethes +teethful +teethy +teethier +teethiest +teethily +teething +teethings +teethless +teethlike +teethridge +teety +teeting +teetotal +teetotaled +teetotaler +teetotalers +teetotaling +teetotalism +teetotalist +teetotalled +teetotaller +teetotally +teetotalling +teetotals +teetotum +teetotumism +teetotumize +teetotums +teetotumwise +teetsook +teevee +teewhaap +tef +teff +teffs +tefillin +teflon +teg +tega +tegean +tegeticula +tegg +tegmen +tegment +tegmenta +tegmental +tegmentum +tegmina +tegminal +tegmine +tegs +tegua +teguas +teguexin +teguguria +teguima +tegula +tegulae +tegular +tegularly +tegulated +tegumen +tegument +tegumenta +tegumental +tegumentary +teguments +tegumentum +tegumina +teguria +tegurium +tehee +teheran +tehseel +tehseeldar +tehsil +tehsildar +tehuantepecan +tehueco +tehuelche +tehuelchean +tehuelet +teian +teicher +teichopsia +teiglach +teiglech +teihte +teiid +teiidae +teiids +teil +teind +teindable +teinder +teinds +teinland +teinoscope +teioid +teiresias +teise +tejano +tejon +teju +tekedye +tekya +tekiah +tekintsi +tekke +tekken +tekkintzi +teknonymy +teknonymous +teknonymously +tektite +tektites +tektitic +tektos +tektosi +tektosil +tektosilicate +tel +tela +telacoustic +telae +telaesthesia +telaesthetic +telakucha +telamon +telamones +telang +telangiectases +telangiectasy +telangiectasia +telangiectasis +telangiectatic +telangiosis +telanthera +telar +telary +telarian +telarly +telautogram +telautograph +telautography +telautographic +telautographist +telautomatic +telautomatically +telautomatics +telchines +telchinic +tele +teleanemograph +teleangiectasia +telebarograph +telebarometer +teleblem +telecamera +telecast +telecasted +telecaster +telecasters +telecasting +telecasts +telechemic +telechirograph +telecinematography +telecode +telecomm +telecommunicate +telecommunication +telecommunicational +telecommunications +telecomputer +telecomputing +telecon +teleconference +telecourse +telecryptograph +telectrograph +telectroscope +teledendrion +teledendrite +teledendron +teledu +teledus +telefacsimile +telefilm +telefilms +teleg +telega +telegas +telegenic +telegenically +telegn +telegnosis +telegnostic +telegony +telegonic +telegonies +telegonous +telegraf +telegram +telegrammatic +telegramme +telegrammed +telegrammic +telegramming +telegrams +telegraph +telegraphed +telegraphee +telegrapheme +telegrapher +telegraphers +telegraphese +telegraphy +telegraphic +telegraphical +telegraphically +telegraphics +telegraphing +telegraphist +telegraphists +telegraphone +telegraphonograph +telegraphophone +telegraphoscope +telegraphs +telegu +telehydrobarometer +telei +teleia +teleianthous +teleiosis +telekinematography +telekineses +telekinesis +telekinetic +telekinetically +telelectric +telelectrograph +telelectroscope +telelens +telemachus +teleman +telemanometer +telemark +telemarks +telembi +telemechanic +telemechanics +telemechanism +telemen +telemetacarpal +telemeteorograph +telemeteorography +telemeteorographic +telemeter +telemetered +telemetering +telemeters +telemetry +telemetric +telemetrical +telemetrically +telemetries +telemetrist +telemetrograph +telemetrography +telemetrographic +telemotor +telencephal +telencephala +telencephalic +telencephalla +telencephalon +telencephalons +telenergy +telenergic +teleneurite +teleneuron +telenget +telengiscope +telenomus +teleobjective +teleocephali +teleocephalous +teleoceras +teleodesmacea +teleodesmacean +teleodesmaceous +teleodont +teleology +teleologic +teleological +teleologically +teleologies +teleologism +teleologist +teleometer +teleophyte +teleophobia +teleophore +teleoptile +teleorganic +teleoroentgenogram +teleoroentgenography +teleosaur +teleosaurian +teleosauridae +teleosaurus +teleost +teleostean +teleostei +teleosteous +teleostomate +teleostome +teleostomi +teleostomian +teleostomous +teleosts +teleotemporal +teleotrocha +teleozoic +teleozoon +telepath +telepathy +telepathic +telepathically +telepathies +telepathist +telepathize +teleph +telepheme +telephone +telephoned +telephoner +telephoners +telephones +telephony +telephonic +telephonical +telephonically +telephonics +telephoning +telephonist +telephonists +telephonograph +telephonographic +telephonophobia +telephote +telephoty +telephoto +telephotograph +telephotographed +telephotography +telephotographic +telephotographing +telephotographs +telephotometer +telephus +telepicture +teleplay +teleplays +teleplasm +teleplasmic +teleplastic +teleport +teleportation +teleported +teleporting +teleports +telepost +teleprinter +teleprinters +teleprocessing +teleprompter +teleradiography +teleradiophone +teleran +telerans +telergy +telergic +telergical +telergically +teles +telescope +telescoped +telescopes +telescopy +telescopic +telescopical +telescopically +telescopiform +telescoping +telescopist +telescopium +telescreen +telescribe +telescript +telescriptor +teleseism +teleseismic +teleseismology +teleseme +teleses +telesia +telesis +telesiurgic +telesm +telesmatic +telesmatical +telesmeter +telesomatic +telespectroscope +telestereograph +telestereography +telestereoscope +telesteria +telesterion +telesthesia +telesthetic +telestial +telestic +telestich +teletactile +teletactor +teletape +teletex +teletext +teletherapy +telethermogram +telethermograph +telethermometer +telethermometry +telethermoscope +telethon +telethons +teletype +teletyped +teletyper +teletypes +teletypesetter +teletypesetting +teletypewrite +teletypewriter +teletypewriters +teletypewriting +teletyping +teletypist +teletypists +teletopometer +teletranscription +teletube +teleut +teleuto +teleutoform +teleutosori +teleutosorus +teleutosorusori +teleutospore +teleutosporic +teleutosporiferous +teleview +televiewed +televiewer +televiewing +televiews +televise +televised +televises +televising +television +televisional +televisionally +televisionary +televisions +televisor +televisors +televisual +televocal +televox +telewriter +telex +telexed +telexes +telexing +telfairia +telfairic +telfer +telferage +telfered +telfering +telfers +telford +telfordize +telfordized +telfordizing +telfords +telharmony +telharmonic +telharmonium +teli +telia +telial +telic +telical +telically +teliferous +telyn +telinga +teliosorus +teliospore +teliosporic +teliosporiferous +teliostage +telium +tell +tellable +tellach +tellee +tellen +teller +tellers +tellership +telly +tellies +tellieses +telligraph +tellima +tellin +tellina +tellinacea +tellinacean +tellinaceous +telling +tellingly +tellinidae +tellinoid +tells +tellsome +tellt +telltale +telltalely +telltales +telltruth +tellural +tellurate +telluret +tellureted +tellurethyl +telluretted +tellurhydric +tellurian +telluric +telluride +telluriferous +tellurion +tellurism +tellurist +tellurite +tellurium +tellurize +tellurized +tellurizing +tellurometer +telluronium +tellurous +tellus +telmatology +telmatological +teloblast +teloblastic +telocentric +telodendria +telodendrion +telodendron +telodynamic +teloi +telokinesis +telolecithal +telolemma +telolemmata +telome +telomerization +telomes +telomic +telomitic +telonism +teloogoo +telopea +telophase +telophasic +telophragma +telopsis +teloptic +telos +telosynapsis +telosynaptic +telosynaptist +telotaxis +teloteropathy +teloteropathic +teloteropathically +telotype +telotremata +telotrematous +telotroch +telotrocha +telotrochal +telotrochous +telotrophic +telpath +telpher +telpherage +telphered +telpheric +telphering +telpherman +telphermen +telphers +telpherway +telson +telsonic +telsons +telt +telugu +telurgy +tem +tema +temacha +temadau +temalacatl +teman +temanite +tembe +tembeitera +tembeta +tembetara +temblor +temblores +temblors +tembu +temene +temenos +temerarious +temerariously +temerariousness +temerate +temerity +temerities +temeritous +temerous +temerously +temerousness +temescal +temiak +temin +temiskaming +temne +temnospondyli +temnospondylous +temp +tempe +tempean +tempeh +tempehs +temper +tempera +temperability +temperable +temperably +temperality +temperament +temperamental +temperamentalist +temperamentally +temperamentalness +temperamented +temperaments +temperance +temperas +temperate +temperately +temperateness +temperative +temperature +temperatures +tempered +temperedly +temperedness +temperer +temperers +tempery +tempering +temperish +temperless +tempers +tempersome +tempest +tempested +tempesty +tempestical +tempesting +tempestive +tempestively +tempestivity +tempests +tempestuous +tempestuously +tempestuousness +tempete +tempi +tempyo +templar +templardom +templary +templarism +templarlike +templarlikeness +templars +template +templater +templates +temple +templed +templeful +templeless +templelike +temples +templet +templetonia +templets +templeward +templize +templon +templum +tempo +tempora +temporal +temporale +temporalis +temporalism +temporalist +temporality +temporalities +temporalize +temporally +temporalness +temporals +temporalty +temporalties +temporaneous +temporaneously +temporaneousness +temporary +temporaries +temporarily +temporariness +temporator +tempore +temporisation +temporise +temporised +temporiser +temporising +temporisingly +temporist +temporization +temporize +temporized +temporizer +temporizers +temporizes +temporizing +temporizingly +temporoalar +temporoauricular +temporocentral +temporocerebellar +temporofacial +temporofrontal +temporohyoid +temporomalar +temporomandibular +temporomastoid +temporomaxillary +temporooccipital +temporoparietal +temporopontine +temporosphenoid +temporosphenoidal +temporozygomatic +tempos +tempre +temprely +temps +tempt +temptability +temptable +temptableness +temptation +temptational +temptationless +temptations +temptatious +temptatory +tempted +tempter +tempters +tempting +temptingly +temptingness +temptress +temptresses +tempts +temptsome +tempura +tempuras +tempus +temse +temsebread +temseloaf +temser +temulence +temulency +temulent +temulentive +temulently +ten +tenability +tenable +tenableness +tenably +tenace +tenaces +tenacy +tenacious +tenaciously +tenaciousness +tenacity +tenacities +tenacle +tenacula +tenaculum +tenaculums +tenai +tenail +tenaille +tenailles +tenaillon +tenails +tenaim +tenaktak +tenalgia +tenancy +tenancies +tenant +tenantable +tenantableness +tenanted +tenanter +tenanting +tenantism +tenantless +tenantlike +tenantry +tenantries +tenants +tenantship +tench +tenches +tenchweed +tencteri +tend +tendable +tendance +tendances +tendant +tended +tendejon +tendence +tendences +tendency +tendencies +tendencious +tendenciously +tendenciousness +tendent +tendential +tendentially +tendentious +tendentiously +tendentiousness +tender +tenderability +tenderable +tenderably +tendered +tenderee +tenderer +tenderers +tenderest +tenderfeet +tenderfoot +tenderfootish +tenderfoots +tenderful +tenderfully +tenderheart +tenderhearted +tenderheartedly +tenderheartedness +tendering +tenderisation +tenderise +tenderised +tenderiser +tenderish +tenderising +tenderization +tenderize +tenderized +tenderizer +tenderizers +tenderizes +tenderizing +tenderly +tenderling +tenderloin +tenderloins +tenderness +tenderometer +tenders +tendersome +tendicle +tendido +tendinal +tendineal +tending +tendingly +tendinitis +tendinous +tendinousness +tendment +tendo +tendomucin +tendomucoid +tendon +tendonitis +tendonous +tendons +tendoor +tendoplasty +tendosynovitis +tendotome +tendotomy +tendour +tendovaginal +tendovaginitis +tendrac +tendre +tendrel +tendresse +tendry +tendril +tendriled +tendriliferous +tendrillar +tendrilled +tendrilly +tendrilous +tendrils +tendron +tends +tenebra +tenebrae +tenebres +tenebricose +tenebrific +tenebrificate +tenebrio +tenebrion +tenebrionid +tenebrionidae +tenebrious +tenebriously +tenebriousness +tenebrism +tenebrist +tenebrity +tenebrose +tenebrosi +tenebrosity +tenebrous +tenebrously +tenebrousness +tenectomy +tenement +tenemental +tenementary +tenemented +tenementer +tenementization +tenementize +tenements +tenementum +tenenda +tenendas +tenendum +tenent +teneral +teneramente +teneriffe +tenerity +tenesmic +tenesmus +tenesmuses +tenet +tenets +tenez +tenfold +tenfoldness +tenfolds +teng +tengere +tengerite +tenggerese +tengu +tenia +teniacidal +teniacide +teniae +teniafuge +tenias +teniasis +teniasises +tenible +teniente +tenino +tenio +tenla +tenline +tenmantale +tennantite +tenne +tenner +tenners +tennessean +tennesseans +tennessee +tennesseeans +tennis +tennisdom +tennises +tennisy +tennyson +tennysonian +tennysonianism +tennist +tennists +tenno +tennu +tenochtitlan +tenodesis +tenodynia +tenography +tenology +tenomyoplasty +tenomyotomy +tenon +tenonectomy +tenoned +tenoner +tenoners +tenonian +tenoning +tenonitis +tenonostosis +tenons +tenontagra +tenontitis +tenontodynia +tenontography +tenontolemmitis +tenontology +tenontomyoplasty +tenontomyotomy +tenontophyma +tenontoplasty +tenontothecitis +tenontotomy +tenophyte +tenophony +tenoplasty +tenoplastic +tenor +tenore +tenorino +tenorist +tenorister +tenorite +tenorites +tenorless +tenoroon +tenorrhaphy +tenorrhaphies +tenors +tenosynovitis +tenositis +tenostosis +tenosuture +tenotome +tenotomy +tenotomies +tenotomist +tenotomize +tenour +tenours +tenovaginitis +tenpence +tenpences +tenpenny +tenpin +tenpins +tenpounder +tenrec +tenrecidae +tenrecs +tens +tensas +tensaw +tense +tensed +tensegrity +tenseless +tenselessly +tenselessness +tensely +tenseness +tenser +tenses +tensest +tensibility +tensible +tensibleness +tensibly +tensify +tensile +tensilely +tensileness +tensility +tensimeter +tensing +tensiometer +tensiometry +tensiometric +tension +tensional +tensioned +tensioner +tensioning +tensionless +tensions +tensity +tensities +tensive +tenso +tensome +tensometer +tenson +tensor +tensorial +tensors +tensorship +tenspot +tensure +tent +tentability +tentable +tentacle +tentacled +tentaclelike +tentacles +tentacula +tentacular +tentaculata +tentaculate +tentaculated +tentaculifera +tentaculite +tentaculites +tentaculitidae +tentaculocyst +tentaculoid +tentaculum +tentage +tentages +tentamen +tentation +tentative +tentatively +tentativeness +tented +tenter +tenterbelly +tentered +tenterer +tenterhook +tenterhooks +tentering +tenters +tentful +tenth +tenthly +tenthmeter +tenthmetre +tenthredinid +tenthredinidae +tenthredinoid +tenthredinoidea +tenthredo +tenths +tenty +tenticle +tentie +tentier +tentiest +tentiform +tentigo +tentily +tentilla +tentillum +tenting +tention +tentless +tentlet +tentlike +tentmaker +tentmaking +tentmate +tentor +tentory +tentoria +tentorial +tentorium +tentortoria +tents +tenture +tentwards +tentwise +tentwork +tentwort +tenuate +tenue +tenues +tenuicostate +tenuifasciate +tenuiflorous +tenuifolious +tenuious +tenuiroster +tenuirostral +tenuirostrate +tenuirostres +tenuis +tenuistriate +tenuit +tenuity +tenuities +tenuous +tenuously +tenuousness +tenure +tenured +tenures +tenury +tenurial +tenurially +tenuti +tenuto +tenutos +tenzon +tenzone +teocalli +teocallis +teonanacatl +teopan +teopans +teosinte +teosintes +teotihuacan +tepa +tepache +tepal +tepals +tepanec +tepary +teparies +tepas +tepe +tepecano +tepee +tepees +tepefaction +tepefy +tepefied +tepefies +tepefying +tepehua +tepehuane +tepetate +tephillah +tephillim +tephillin +tephra +tephramancy +tephras +tephrite +tephrites +tephritic +tephroite +tephromalacia +tephromancy +tephromyelitic +tephrosia +tephrosis +tepid +tepidaria +tepidarium +tepidity +tepidities +tepidly +tepidness +tepomporize +teponaztli +tepor +tequila +tequilas +tequilla +tequistlateca +tequistlatecan +ter +tera +teraglin +terahertz +terahertzes +terai +terais +terakihi +teramorphous +teraohm +teraohms +terap +teraph +teraphim +teras +terass +terata +teratic +teratical +teratism +teratisms +teratoblastoma +teratogen +teratogenesis +teratogenetic +teratogeny +teratogenic +teratogenicity +teratogenous +teratoid +teratology +teratologic +teratological +teratologies +teratologist +teratoma +teratomas +teratomata +teratomatous +teratophobia +teratoscopy +teratosis +terbia +terbias +terbic +terbium +terbiums +terce +tercel +tercelet +tercelets +tercels +tercentenary +tercentenarian +tercentenaries +tercentenarize +tercentennial +tercentennials +tercer +terceron +terceroon +terces +tercet +tercets +terchloride +tercia +tercine +tercio +terdiurnal +terebate +terebella +terebellid +terebellidae +terebelloid +terebellum +terebene +terebenes +terebenic +terebenthene +terebic +terebilic +terebinic +terebinth +terebinthaceae +terebinthial +terebinthian +terebinthic +terebinthina +terebinthinate +terebinthine +terebinthinous +terebinthus +terebra +terebrae +terebral +terebrant +terebrantia +terebras +terebrate +terebration +terebratula +terebratular +terebratulid +terebratulidae +terebratuliform +terebratuline +terebratulite +terebratuloid +terebridae +teredines +teredinidae +teredo +teredos +terefah +terek +terence +terentian +terephah +terephthalate +terephthalic +terephthallic +teres +teresa +teresian +teresina +terete +teretial +tereticaudate +teretifolious +teretipronator +teretiscapular +teretiscapularis +teretish +teretism +tereu +tereus +terfez +terfezia +terfeziaceae +terga +tergal +tergant +tergeminal +tergeminate +tergeminous +tergiferous +tergite +tergites +tergitic +tergiversant +tergiversate +tergiversated +tergiversating +tergiversation +tergiversator +tergiversatory +tergiverse +tergolateral +tergum +teri +teriann +teriyaki +teriyakis +terlinguaite +term +terma +termagancy +termagant +termagantish +termagantism +termagantly +termagants +termage +termal +terman +termatic +termed +termen +termer +termers +termes +termillenary +termin +terminability +terminable +terminableness +terminably +terminal +terminalia +terminaliaceae +terminalis +terminalization +terminalized +terminally +terminals +terminant +terminate +terminated +terminates +terminating +termination +terminational +terminations +terminative +terminatively +terminator +terminatory +terminators +termine +terminer +terming +termini +terminine +terminism +terminist +terministic +terminize +termino +terminology +terminological +terminologically +terminologies +terminologist +terminologists +terminus +terminuses +termital +termitary +termitaria +termitarium +termite +termites +termitic +termitid +termitidae +termitophagous +termitophile +termitophilous +termless +termlessly +termlessness +termly +termolecular +termon +termor +termors +terms +termtime +termtimes +termwise +tern +terna +ternal +ternar +ternary +ternariant +ternaries +ternarious +ternate +ternately +ternatipinnate +ternatisect +ternatopinnate +terne +terned +terneplate +terner +ternery +ternes +terning +ternion +ternions +ternize +ternlet +terns +ternstroemia +ternstroemiaceae +terotechnology +teroxide +terp +terpadiene +terpane +terpen +terpene +terpeneless +terpenes +terpenic +terpenoid +terphenyl +terpilene +terpin +terpine +terpinene +terpineol +terpinol +terpinolene +terpinols +terpodion +terpolymer +terpsichore +terpsichoreal +terpsichoreally +terpsichorean +terr +terra +terraba +terrace +terraced +terraceless +terraceous +terracer +terraces +terracette +terracewards +terracewise +terracework +terraciform +terracing +terraculture +terrae +terraefilial +terraefilian +terrage +terrain +terrains +terral +terramara +terramare +terramycin +terran +terrance +terrane +terranean +terraneous +terranes +terrapene +terrapin +terrapins +terraquean +terraquedus +terraqueous +terraqueousness +terrar +terraria +terrariia +terrariiums +terrarium +terrariums +terras +terrases +terrasse +terrazzo +terrazzos +terre +terreen +terreens +terreity +terrella +terrellas +terremotive +terrence +terrene +terrenely +terreneness +terrenes +terreno +terreous +terreplein +terrestrial +terrestrialism +terrestriality +terrestrialize +terrestrially +terrestrialness +terrestrials +terrestricity +terrestrify +terrestrious +terret +terreted +terrets +terri +terry +terribilita +terribility +terrible +terribleness +terribles +terribly +terricole +terricoline +terricolist +terricolous +terrie +terrier +terrierlike +terriers +terries +terrify +terrific +terrifical +terrifically +terrification +terrificly +terrificness +terrified +terrifiedly +terrifier +terrifiers +terrifies +terrifying +terrifyingly +terrigene +terrigenous +terriginous +terrine +terrines +territ +territelae +territelarian +territorality +territory +territorial +territorialisation +territorialise +territorialised +territorialising +territorialism +territorialist +territoriality +territorialization +territorialize +territorialized +territorializing +territorially +territorian +territoried +territories +territs +terron +terror +terrorful +terrorific +terrorisation +terrorise +terrorised +terroriser +terrorising +terrorism +terrorist +terroristic +terroristical +terrorists +terrorization +terrorize +terrorized +terrorizer +terrorizes +terrorizing +terrorless +terrorproof +terrors +terrorsome +terse +tersely +terseness +terser +tersest +tersion +tersulfid +tersulfide +tersulphate +tersulphid +tersulphide +tersulphuret +tertenant +tertia +tertial +tertials +tertian +tertiana +tertians +tertianship +tertiary +tertiarian +tertiaries +tertiate +tertii +tertio +tertium +tertius +terton +tertrinal +tertulia +tertullianism +tertullianist +teruah +teruyuki +teruncius +terutero +teruteru +tervalence +tervalency +tervalent +tervariant +tervee +terzet +terzetto +terzettos +terzina +terzio +terzo +tesack +tesarovitch +tescaria +teschenite +teschermacherite +teskere +teskeria +tesla +teslas +tess +tessara +tessarace +tessaraconter +tessaradecad +tessaraglot +tessaraphthong +tessarescaedecahedron +tessel +tesselate +tesselated +tesselating +tesselation +tessella +tessellae +tessellar +tessellate +tessellated +tessellates +tessellating +tessellation +tessellations +tessellite +tessera +tesseract +tesseradecade +tesserae +tesseraic +tesseral +tesserants +tesserarian +tesserate +tesserated +tesseratomy +tesseratomic +tessitura +tessituras +tessiture +tessular +test +testa +testability +testable +testacea +testacean +testaceography +testaceology +testaceous +testaceousness +testacy +testacies +testae +testament +testamenta +testamental +testamentally +testamentalness +testamentary +testamentarily +testamentate +testamentation +testaments +testamentum +testamur +testandi +testao +testar +testata +testate +testation +testator +testatory +testators +testatorship +testatrices +testatrix +testatrixes +testatum +testbed +testcross +teste +tested +testee +testees +tester +testers +testes +testy +testibrachial +testibrachium +testicardinate +testicardine +testicardines +testicle +testicles +testicond +testicular +testiculate +testiculated +testier +testiere +testiest +testify +testificate +testification +testificator +testificatory +testified +testifier +testifiers +testifies +testifying +testily +testimony +testimonia +testimonial +testimonialising +testimonialist +testimonialization +testimonialize +testimonialized +testimonializer +testimonializing +testimonials +testimonies +testimonium +testiness +testing +testingly +testings +testis +testitis +testmatch +teston +testone +testons +testoon +testoons +testor +testosterone +testril +tests +testudinal +testudinaria +testudinarian +testudinarious +testudinata +testudinate +testudinated +testudineal +testudineous +testudines +testudinidae +testudinous +testudo +testudos +testule +tesuque +tesvino +tetanal +tetany +tetania +tetanic +tetanical +tetanically +tetanics +tetanies +tetaniform +tetanigenous +tetanilla +tetanine +tetanisation +tetanise +tetanised +tetanises +tetanising +tetanism +tetanization +tetanize +tetanized +tetanizes +tetanizing +tetanoid +tetanolysin +tetanomotor +tetanospasmin +tetanotoxin +tetanus +tetanuses +tetarcone +tetarconid +tetard +tetartemorion +tetartocone +tetartoconid +tetartohedral +tetartohedrally +tetartohedrism +tetartohedron +tetartoid +tetartosymmetry +tetch +tetched +tetchy +tetchier +tetchiest +tetchily +tetchiness +tete +tetel +teterrimous +teth +tethelin +tether +tetherball +tethered +tethery +tethering +tethers +tethydan +tethys +teths +teton +tetotum +tetotums +tetra +tetraamylose +tetrabasic +tetrabasicity +tetrabelodon +tetrabelodont +tetrabiblos +tetraborate +tetraboric +tetrabrach +tetrabranch +tetrabranchia +tetrabranchiate +tetrabromid +tetrabromide +tetrabromo +tetrabromoethane +tetrabromofluorescein +tetracadactylity +tetracaine +tetracarboxylate +tetracarboxylic +tetracarpellary +tetracene +tetraceratous +tetracerous +tetracerus +tetrachical +tetrachlorid +tetrachloride +tetrachlorides +tetrachloro +tetrachloroethane +tetrachloroethylene +tetrachloromethane +tetrachord +tetrachordal +tetrachordon +tetrachoric +tetrachotomous +tetrachromatic +tetrachromic +tetrachronous +tetracyclic +tetracycline +tetracid +tetracids +tetracocci +tetracoccous +tetracoccus +tetracolic +tetracolon +tetracoral +tetracoralla +tetracoralline +tetracosane +tetract +tetractinal +tetractine +tetractinellid +tetractinellida +tetractinellidan +tetractinelline +tetractinose +tetractys +tetrad +tetradactyl +tetradactyle +tetradactyly +tetradactylous +tetradarchy +tetradecane +tetradecanoic +tetradecapod +tetradecapoda +tetradecapodan +tetradecapodous +tetradecyl +tetradesmus +tetradiapason +tetradic +tetradymite +tetradynamia +tetradynamian +tetradynamious +tetradynamous +tetradite +tetradrachm +tetradrachma +tetradrachmal +tetradrachmon +tetrads +tetraedron +tetraedrum +tetraethyl +tetraethyllead +tetraethylsilane +tetrafluoride +tetrafluoroethylene +tetrafluouride +tetrafolious +tetragamy +tetragenous +tetragyn +tetragynia +tetragynian +tetragynous +tetraglot +tetraglottic +tetragon +tetragonal +tetragonally +tetragonalness +tetragonia +tetragoniaceae +tetragonidium +tetragonous +tetragons +tetragonus +tetragram +tetragrammatic +tetragrammaton +tetragrammatonic +tetragrid +tetrahedra +tetrahedral +tetrahedrally +tetrahedric +tetrahedrite +tetrahedroid +tetrahedron +tetrahedrons +tetrahexahedral +tetrahexahedron +tetrahydrate +tetrahydrated +tetrahydric +tetrahydrid +tetrahydride +tetrahydro +tetrahydrocannabinol +tetrahydrofuran +tetrahydropyrrole +tetrahydroxy +tetrahymena +tetraiodid +tetraiodide +tetraiodo +tetraiodophenolphthalein +tetraiodopyrrole +tetrakaidecahedron +tetraketone +tetrakis +tetrakisazo +tetrakishexahedron +tetralemma +tetralin +tetralite +tetralogy +tetralogic +tetralogies +tetralogue +tetralophodont +tetramastia +tetramastigote +tetramer +tetramera +tetrameral +tetrameralian +tetrameric +tetramerism +tetramerous +tetramers +tetrameter +tetrameters +tetramethyl +tetramethylammonium +tetramethyldiarsine +tetramethylene +tetramethylium +tetramethyllead +tetramethylsilane +tetramin +tetramine +tetrammine +tetramorph +tetramorphic +tetramorphism +tetramorphous +tetrander +tetrandria +tetrandrian +tetrandrous +tetrane +tetranychus +tetranitrate +tetranitro +tetranitroaniline +tetranitromethane +tetrant +tetranuclear +tetrao +tetraodon +tetraodont +tetraodontidae +tetraonid +tetraonidae +tetraoninae +tetraonine +tetrapanax +tetrapartite +tetrapetalous +tetraphalangeate +tetrapharmacal +tetrapharmacon +tetraphenol +tetraphyllous +tetraphony +tetraphosphate +tetrapyla +tetrapylon +tetrapyramid +tetrapyrenous +tetrapyrrole +tetrapla +tetraplegia +tetrapleuron +tetraploid +tetraploidy +tetraploidic +tetraplous +tetrapneumona +tetrapneumones +tetrapneumonian +tetrapneumonous +tetrapod +tetrapoda +tetrapody +tetrapodic +tetrapodies +tetrapodous +tetrapods +tetrapolar +tetrapolis +tetrapolitan +tetrapous +tetraprostyle +tetrapteran +tetrapteron +tetrapterous +tetraptych +tetraptote +tetrapturus +tetraquetrous +tetrarch +tetrarchate +tetrarchy +tetrarchic +tetrarchical +tetrarchies +tetrarchs +tetras +tetrasaccharide +tetrasalicylide +tetraselenodont +tetraseme +tetrasemic +tetrasepalous +tetrasyllabic +tetrasyllabical +tetrasyllable +tetrasymmetry +tetraskele +tetraskelion +tetrasome +tetrasomy +tetrasomic +tetraspermal +tetraspermatous +tetraspermous +tetraspgia +tetraspheric +tetrasporange +tetrasporangia +tetrasporangiate +tetrasporangium +tetraspore +tetrasporic +tetrasporiferous +tetrasporous +tetraster +tetrastich +tetrastichal +tetrastichic +tetrastichidae +tetrastichous +tetrastichus +tetrastyle +tetrastylic +tetrastylos +tetrastylous +tetrastoon +tetrasubstituted +tetrasubstitution +tetrasulfid +tetrasulfide +tetrasulphid +tetrasulphide +tetrathecal +tetratheism +tetratheist +tetratheite +tetrathionates +tetrathionic +tetratomic +tetratone +tetravalence +tetravalency +tetravalent +tetraxial +tetraxile +tetraxon +tetraxonia +tetraxonian +tetraxonid +tetraxonida +tetrazane +tetrazene +tetrazyl +tetrazin +tetrazine +tetrazo +tetrazole +tetrazolyl +tetrazolium +tetrazone +tetrazotization +tetrazotize +tetrazzini +tetrdra +tetremimeral +tetrevangelium +tetric +tetrical +tetricalness +tetricity +tetricous +tetrifol +tetrigid +tetrigidae +tetryl +tetrylene +tetryls +tetriodide +tetrix +tetrobol +tetrobolon +tetrode +tetrodes +tetrodon +tetrodont +tetrodontidae +tetrodotoxin +tetrol +tetrole +tetrolic +tetronic +tetronymal +tetrose +tetrous +tetroxalate +tetroxid +tetroxide +tetroxids +tetrsyllabical +tetter +tettered +tettery +tettering +tetterish +tetterous +tetters +tetterworm +tetterwort +tetty +tettigidae +tettigoniid +tettigoniidae +tettish +tettix +tetum +teucer +teuch +teuchit +teucri +teucrian +teucrin +teucrium +teufit +teugh +teughly +teughness +teuk +teutolatry +teutomania +teutomaniac +teuton +teutondom +teutonesque +teutonia +teutonic +teutonically +teutonicism +teutonism +teutonist +teutonity +teutonization +teutonize +teutonomania +teutonophobe +teutonophobia +teutons +teutophil +teutophile +teutophilism +teutophobe +teutophobia +teutophobism +teviss +tew +tewa +tewart +tewed +tewel +tewer +tewhit +tewing +tewit +tewly +tews +tewsome +tewtaw +tewter +tex +texaco +texan +texans +texas +texases +texcocan +texguino +text +textarian +textbook +textbookish +textbookless +textbooks +textiferous +textile +textiles +textilist +textless +textlet +textman +textorial +textrine +texts +textual +textualism +textualist +textuality +textually +textuary +textuaries +textuarist +textuist +textural +texturally +texture +textured +textureless +textures +texturing +textus +tez +tezcatlipoca +tezcatzoncatl +tezcucan +tezkere +tezkirah +tfr +tg +tgn +tgt +th +tha +thack +thacked +thacker +thackerayan +thackerayana +thackerayesque +thacking +thackless +thackoor +thacks +thad +thaddeus +thae +thai +thailand +thairm +thairms +thais +thak +thakur +thakurate +thala +thalamencephala +thalamencephalic +thalamencephalon +thalamencephalons +thalami +thalamia +thalamic +thalamically +thalamiflorae +thalamifloral +thalamiflorous +thalamite +thalamium +thalamiumia +thalamocele +thalamocoele +thalamocortical +thalamocrural +thalamolenticular +thalamomammillary +thalamopeduncular +thalamophora +thalamotegmental +thalamotomy +thalamotomies +thalamus +thalarctos +thalassa +thalassal +thalassarctos +thalassemia +thalassian +thalassiarch +thalassic +thalassical +thalassinian +thalassinid +thalassinidea +thalassinidian +thalassinoid +thalassiophyte +thalassiophytous +thalasso +thalassochelys +thalassocracy +thalassocrat +thalassographer +thalassography +thalassographic +thalassographical +thalassometer +thalassophilous +thalassophobia +thalassotherapy +thalatta +thalattology +thalenite +thaler +thalerophagous +thalers +thalesia +thalesian +thalessa +thalia +thaliacea +thaliacean +thalian +thaliard +thalictrum +thalidomide +thalli +thallic +thalliferous +thalliform +thallin +thalline +thallious +thallium +thalliums +thallochlore +thallodal +thallodic +thallogen +thallogenic +thallogenous +thallogens +thalloid +thalloidal +thallome +thallophyta +thallophyte +thallophytes +thallophytic +thallose +thallous +thallus +thalluses +thalposis +thalpotic +thalthan +thalweg +thamakau +thameng +thames +thamesis +thamin +thamyras +thammuz +thamnidium +thamnium +thamnophile +thamnophilinae +thamnophiline +thamnophilus +thamnophis +thamudean +thamudene +thamudic +thamuria +thamus +than +thana +thanadar +thanage +thanages +thanah +thanan +thanatism +thanatist +thanatobiologic +thanatognomonic +thanatographer +thanatography +thanatoid +thanatology +thanatological +thanatologies +thanatologist +thanatomantic +thanatometer +thanatophidia +thanatophidian +thanatophobe +thanatophoby +thanatophobia +thanatophobiac +thanatopsis +thanatos +thanatoses +thanatosis +thanatotic +thanatousia +thane +thanedom +thanehood +thaneland +thanes +thaneship +thaness +thank +thanked +thankee +thanker +thankers +thankful +thankfuller +thankfullest +thankfully +thankfulness +thanking +thankyou +thankless +thanklessly +thanklessness +thanks +thanksgiver +thanksgiving +thanksgivings +thankworthy +thankworthily +thankworthiness +thannadar +thapes +thapsia +thar +tharen +tharf +tharfcake +thargelion +tharginyah +tharm +tharms +thasian +thaspium +that +thataway +thatch +thatched +thatcher +thatchers +thatches +thatchy +thatching +thatchless +thatchwood +thatchwork +thatd +thatll +thatn +thatness +thats +thaught +thaumantian +thaumantias +thaumasite +thaumatogeny +thaumatography +thaumatolatry +thaumatology +thaumatologies +thaumatrope +thaumatropical +thaumaturge +thaumaturgi +thaumaturgy +thaumaturgia +thaumaturgic +thaumaturgical +thaumaturgics +thaumaturgism +thaumaturgist +thaumaturgus +thaumoscopic +thave +thaw +thawable +thawed +thawer +thawers +thawy +thawier +thawiest +thawing +thawless +thawn +thaws +the +thea +theaceae +theaceous +theah +theandric +theanthropy +theanthropic +theanthropical +theanthropism +theanthropist +theanthropology +theanthropophagy +theanthropos +theanthroposophy +thearchy +thearchic +thearchies +theasum +theat +theater +theatercraft +theatergoer +theatergoers +theatergoing +theaterless +theaterlike +theaters +theaterward +theaterwards +theaterwise +theatine +theatral +theatre +theatregoer +theatregoing +theatres +theatry +theatric +theatricable +theatrical +theatricalisation +theatricalise +theatricalised +theatricalising +theatricalism +theatricality +theatricalization +theatricalize +theatricalized +theatricalizing +theatrically +theatricalness +theatricals +theatrician +theatricism +theatricize +theatrics +theatrize +theatrocracy +theatrograph +theatromania +theatromaniac +theatron +theatrophile +theatrophobia +theatrophone +theatrophonic +theatropolis +theatroscope +theatticalism +theave +theb +thebaic +thebaid +thebain +thebaine +thebaines +thebais +thebaism +theban +theberge +thebesian +theca +thecae +thecal +thecamoebae +thecaphore +thecasporal +thecaspore +thecaspored +thecasporous +thecata +thecate +thecia +thecial +thecitis +thecium +thecla +theclan +thecodont +thecoglossate +thecoid +thecoidea +thecophora +thecosomata +thecosomatous +thed +thee +theedom +theek +theeked +theeker +theeking +theelin +theelins +theelol +theelols +theemim +theer +theet +theetsee +theezan +theft +theftbote +theftdom +theftless +theftproof +thefts +theftuous +theftuously +thegether +thegidder +thegither +thegn +thegndom +thegnhood +thegnland +thegnly +thegnlike +thegns +thegnship +thegnworthy +they +theyaou +theyd +theiform +theileria +theyll +thein +theine +theines +theinism +theins +their +theyre +theirn +theirs +theirselves +theirsens +theism +theisms +theist +theistic +theistical +theistically +theists +theyve +thelalgia +thelemite +thelephora +thelephoraceae +thelyblast +thelyblastic +theligonaceae +theligonaceous +theligonum +thelion +thelyotoky +thelyotokous +thelyphonidae +thelyphonus +thelyplasty +thelitis +thelitises +thelytocia +thelytoky +thelytokous +thelytonic +thelium +thelodontidae +thelodus +theloncus +thelorrhagia +thelphusa +thelphusian +thelphusidae +them +thema +themata +thematic +thematical +thematically +thematist +theme +themed +themeless +themelet +themer +themes +theming +themis +themistian +themsel +themselves +then +thenabouts +thenad +thenadays +thenage +thenages +thenal +thenar +thenardite +thenars +thence +thenceafter +thenceforth +thenceforward +thenceforwards +thencefoward +thencefrom +thenceward +thenne +thenness +thens +theo +theoanthropomorphic +theoanthropomorphism +theoastrological +theobald +theobroma +theobromic +theobromin +theobromine +theocentric +theocentricism +theocentricity +theocentrism +theochristic +theocollectivism +theocollectivist +theocracy +theocracies +theocrasy +theocrasia +theocrasical +theocrasies +theocrat +theocratic +theocratical +theocratically +theocratist +theocrats +theocritan +theocritean +theodemocracy +theody +theodicaea +theodicean +theodicy +theodicies +theodidact +theodolite +theodolitic +theodora +theodore +theodoric +theodosia +theodosian +theodosianus +theodotian +theodrama +theogamy +theogeological +theognostic +theogonal +theogony +theogonic +theogonical +theogonies +theogonism +theogonist +theohuman +theokrasia +theoktony +theoktonic +theol +theolatry +theolatrous +theolepsy +theoleptic +theolog +theologal +theologaster +theologastric +theologate +theologeion +theologer +theologi +theology +theologian +theologians +theologic +theological +theologically +theologician +theologicoastronomical +theologicoethical +theologicohistorical +theologicometaphysical +theologicomilitary +theologicomoral +theologiconatural +theologicopolitical +theologics +theologies +theologisation +theologise +theologised +theologiser +theologising +theologism +theologist +theologium +theologization +theologize +theologized +theologizer +theologizing +theologoumena +theologoumenon +theologs +theologue +theologus +theomachy +theomachia +theomachies +theomachist +theomagy +theomagic +theomagical +theomagics +theomammomist +theomancy +theomania +theomaniac +theomantic +theomastix +theomicrist +theomisanthropist +theomythologer +theomythology +theomorphic +theomorphism +theomorphize +theonomy +theonomies +theonomous +theonomously +theopantism +theopaschist +theopaschitally +theopaschite +theopaschitic +theopaschitism +theopathetic +theopathy +theopathic +theopathies +theophagy +theophagic +theophagite +theophagous +theophany +theophania +theophanic +theophanies +theophanism +theophanous +theophila +theophilanthrope +theophilanthropy +theophilanthropic +theophilanthropism +theophilanthropist +theophile +theophilist +theophyllin +theophylline +theophilosophic +theophilus +theophysical +theophobia +theophoric +theophorous +theophrastaceae +theophrastaceous +theophrastan +theophrastean +theopneust +theopneusted +theopneusty +theopneustia +theopneustic +theopolity +theopolitician +theopolitics +theopsychism +theor +theorbist +theorbo +theorbos +theorem +theorematic +theorematical +theorematically +theorematist +theoremic +theorems +theoretic +theoretical +theoreticalism +theoretically +theoreticalness +theoretician +theoreticians +theoreticopractical +theoretics +theory +theoria +theoriai +theoric +theorica +theorical +theorically +theorician +theoricon +theorics +theories +theoryless +theorymonger +theorisation +theorise +theorised +theoriser +theorises +theorising +theorism +theorist +theorists +theorization +theorizations +theorize +theorized +theorizer +theorizers +theorizes +theorizies +theorizing +theorum +theos +theosoph +theosopheme +theosopher +theosophy +theosophic +theosophical +theosophically +theosophies +theosophism +theosophist +theosophistic +theosophistical +theosophists +theosophize +theotechny +theotechnic +theotechnist +theoteleology +theoteleological +theotherapy +theotherapist +theotokos +theow +theowdom +theowman +theowmen +theraean +theralite +therap +therapeuses +therapeusis +therapeutae +therapeutic +therapeutical +therapeutically +therapeutics +therapeutism +therapeutist +theraphosa +theraphose +theraphosid +theraphosidae +theraphosoid +therapy +therapia +therapies +therapist +therapists +therapsid +therapsida +theraputant +theravada +therblig +there +thereabout +thereabouts +thereabove +thereacross +thereafter +thereafterward +thereagainst +thereamong +thereamongst +thereanent +thereanents +therearound +thereas +thereat +thereaway +thereaways +therebefore +thereben +therebeside +therebesides +therebetween +thereby +therebiforn +thereckly +thered +therefor +therefore +therefrom +therehence +therein +thereinafter +thereinbefore +thereinto +therell +theremin +theremins +therence +thereness +thereof +thereoid +thereology +thereologist +thereon +thereonto +thereout +thereover +thereright +theres +theresa +therese +therethrough +theretil +theretill +thereto +theretofore +theretoward +thereunder +thereuntil +thereunto +thereup +thereupon +thereva +therevid +therevidae +therewhile +therewhiles +therewhilst +therewith +therewithal +therewithin +theria +theriac +theriaca +theriacal +theriacas +theriacs +therial +therian +therianthropic +therianthropism +theriatrics +thericlean +theridiid +theridiidae +theridion +theriodic +theriodont +theriodonta +theriodontia +theriolater +theriolatry +theriomancy +theriomaniac +theriomimicry +theriomorph +theriomorphic +theriomorphism +theriomorphosis +theriomorphous +theriotheism +theriotheist +theriotrophical +theriozoic +therm +thermacogenesis +thermae +thermaesthesia +thermaic +thermal +thermalgesia +thermality +thermalization +thermalize +thermalized +thermalizes +thermalizing +thermally +thermals +thermanalgesia +thermanesthesia +thermantic +thermantidote +thermatology +thermatologic +thermatologist +therme +thermel +thermels +thermes +thermesthesia +thermesthesiometer +thermetograph +thermetrograph +thermic +thermical +thermically +thermidor +thermidorian +thermion +thermionic +thermionically +thermionics +thermions +thermistor +thermistors +thermit +thermite +thermites +thermits +thermo +thermoammeter +thermoanalgesia +thermoanesthesia +thermobarograph +thermobarometer +thermobattery +thermocautery +thermocauteries +thermochemic +thermochemical +thermochemically +thermochemist +thermochemistry +thermochroic +thermochromism +thermochrosy +thermoclinal +thermocline +thermocoagulation +thermocouple +thermocurrent +thermodiffusion +thermodynam +thermodynamic +thermodynamical +thermodynamically +thermodynamician +thermodynamicist +thermodynamics +thermodynamist +thermoduric +thermoelastic +thermoelectric +thermoelectrical +thermoelectrically +thermoelectricity +thermoelectrometer +thermoelectromotive +thermoelectron +thermoelectronic +thermoelement +thermoesthesia +thermoexcitory +thermoform +thermoformable +thermogalvanometer +thermogen +thermogenerator +thermogenesis +thermogenetic +thermogeny +thermogenic +thermogenous +thermogeography +thermogeographical +thermogram +thermograph +thermographer +thermography +thermographic +thermographically +thermohaline +thermohyperesthesia +thermojunction +thermokinematics +thermolabile +thermolability +thermolysis +thermolytic +thermolyze +thermolyzed +thermolyzing +thermology +thermological +thermoluminescence +thermoluminescent +thermomagnetic +thermomagnetically +thermomagnetism +thermometamorphic +thermometamorphism +thermometer +thermometerize +thermometers +thermometry +thermometric +thermometrical +thermometrically +thermometrograph +thermomigrate +thermomotive +thermomotor +thermomultiplier +thermonasty +thermonastic +thermonatrite +thermoneurosis +thermoneutrality +thermonous +thermonuclear +thermopair +thermopalpation +thermopenetration +thermoperiod +thermoperiodic +thermoperiodicity +thermoperiodism +thermophil +thermophile +thermophilic +thermophilous +thermophobia +thermophobous +thermophone +thermophore +thermophosphor +thermophosphorescence +thermophosphorescent +thermopile +thermoplastic +thermoplasticity +thermoplastics +thermoplegia +thermopleion +thermopolymerization +thermopolypnea +thermopolypneic +thermopower +thermopsis +thermoradiotherapy +thermoreceptor +thermoreduction +thermoregulation +thermoregulator +thermoregulatory +thermoremanence +thermoremanent +thermoresistance +thermoresistant +thermos +thermoscope +thermoscopic +thermoscopical +thermoscopically +thermosensitive +thermoses +thermoset +thermosetting +thermosynthesis +thermosiphon +thermosystaltic +thermosystaltism +thermosphere +thermospheres +thermospheric +thermostability +thermostable +thermostat +thermostated +thermostatic +thermostatically +thermostatics +thermostating +thermostats +thermostatted +thermostatting +thermostimulation +thermoswitch +thermotactic +thermotank +thermotaxic +thermotaxis +thermotelephone +thermotelephonic +thermotensile +thermotension +thermotherapeutics +thermotherapy +thermotic +thermotical +thermotically +thermotics +thermotype +thermotypy +thermotypic +thermotropy +thermotropic +thermotropism +thermovoltaic +therms +therodont +theroid +therolater +therolatry +therology +therologic +therological +therologist +theromora +theromores +theromorph +theromorpha +theromorphia +theromorphic +theromorphism +theromorphology +theromorphological +theromorphous +theron +therophyte +theropod +theropoda +theropodan +theropodous +theropods +thersitean +thersites +thersitical +thesaur +thesaural +thesauri +thesaury +thesauris +thesaurismosis +thesaurus +thesaurusauri +thesauruses +these +thesean +theses +theseum +theseus +thesial +thesicle +thesis +thesium +thesmophoria +thesmophorian +thesmophoric +thesmothetae +thesmothete +thesmothetes +thesocyte +thespesia +thespesius +thespian +thespians +thessalian +thessalonian +thessalonians +thester +thestreen +theta +thetas +thetch +thete +thetic +thetical +thetically +thetics +thetin +thetine +thetis +theurgy +theurgic +theurgical +theurgically +theurgies +theurgist +thevetia +thevetin +thew +thewed +thewy +thewier +thewiest +thewiness +thewless +thewlike +thewness +thews +thy +thiabendazole +thiacetic +thiadiazole +thialdin +thialdine +thiamid +thiamide +thiamin +thiaminase +thiamine +thiamines +thiamins +thianthrene +thiasi +thiasine +thiasite +thiasoi +thiasos +thiasote +thiasus +thiasusi +thiazide +thiazides +thiazin +thiazine +thiazines +thiazins +thiazol +thiazole +thiazoles +thiazoline +thiazols +thibet +thible +thick +thickbrained +thicke +thicken +thickened +thickener +thickeners +thickening +thickens +thicker +thickest +thicket +thicketed +thicketful +thickety +thickets +thickhead +thickheaded +thickheadedly +thickheadedness +thicky +thickish +thickleaf +thickleaves +thickly +thicklips +thickneck +thickness +thicknesses +thicknessing +thicks +thickset +thicksets +thickskin +thickskull +thickskulled +thickwind +thickwit +thief +thiefcraft +thiefdom +thiefland +thiefly +thiefmaker +thiefmaking +thiefproof +thieftaker +thiefwise +thielavia +thielaviopsis +thienyl +thienone +thierry +thyestean +thyestes +thievable +thieve +thieved +thieveless +thiever +thievery +thieveries +thieves +thieving +thievingly +thievish +thievishly +thievishness +thig +thigged +thigger +thigging +thigh +thighbone +thighbones +thighed +thighs +thight +thightness +thigmonegative +thigmopositive +thigmotactic +thigmotactically +thigmotaxis +thigmotropic +thigmotropically +thigmotropism +thyiad +thyine +thylacine +thylacynus +thylacitis +thylacoleo +thylakoid +thilanottine +thilk +thill +thiller +thilly +thills +thymacetin +thymallidae +thymallus +thymate +thimber +thimble +thimbleberry +thimbleberries +thimbled +thimbleflower +thimbleful +thimblefuls +thimblelike +thimblemaker +thimblemaking +thimbleman +thimblerig +thimblerigged +thimblerigger +thimbleriggery +thimblerigging +thimbles +thimbleweed +thimblewit +thyme +thymectomy +thymectomize +thymegol +thymey +thymelaea +thymelaeaceae +thymelaeaceous +thymelaeales +thymelcosis +thymele +thymelic +thymelical +thymelici +thymene +thimerosal +thymes +thymetic +thymi +thymy +thymiama +thymic +thymicolymphatic +thymidine +thymier +thymiest +thymyl +thymylic +thymin +thymine +thymines +thymiosis +thymitis +thymocyte +thymogenic +thymol +thymolate +thymolize +thymolphthalein +thymols +thymolsulphonephthalein +thymoma +thymomata +thymonucleic +thymopathy +thymoprivic +thymoprivous +thymopsyche +thymoquinone +thymotactic +thymotic +thymotinic +thyms +thymus +thymuses +thin +thinbrained +thinclad +thinclads +thindown +thindowns +thine +thing +thingal +thingamabob +thingamajig +thinghood +thingy +thinginess +thingish +thingless +thinglet +thingly +thinglike +thinglikeness +thingliness +thingman +thingness +things +thingstead +thingum +thingumabob +thingumadad +thingumadoodle +thingumajig +thingumajigger +thingumaree +thingumbob +thingummy +thingut +think +thinkability +thinkable +thinkableness +thinkably +thinker +thinkers +thinkful +thinking +thinkingly +thinkingness +thinkingpart +thinkings +thinkling +thinks +thinly +thinned +thinner +thinners +thinness +thinnesses +thinnest +thynnid +thynnidae +thinning +thinnish +thinocoridae +thinocorus +thinolite +thins +thio +thioacet +thioacetal +thioacetic +thioalcohol +thioaldehyde +thioamid +thioamide +thioantimonate +thioantimoniate +thioantimonious +thioantimonite +thioarsenate +thioarseniate +thioarsenic +thioarsenious +thioarsenite +thiobaccilli +thiobacilli +thiobacillus +thiobacteria +thiobacteriales +thiobismuthite +thiocarbamic +thiocarbamide +thiocarbamyl +thiocarbanilide +thiocarbimide +thiocarbonate +thiocarbonic +thiocarbonyl +thiochloride +thiochrome +thiocyanate +thiocyanation +thiocyanic +thiocyanide +thiocyano +thiocyanogen +thiocresol +thiodiazole +thiodiphenylamine +thioester +thiofuran +thiofurane +thiofurfuran +thiofurfurane +thiogycolic +thioguanine +thiohydrate +thiohydrolysis +thiohydrolyze +thioindigo +thioketone +thiokol +thiol +thiolacetic +thiolactic +thiolic +thiolics +thiols +thionamic +thionaphthene +thionate +thionates +thionation +thioneine +thionic +thionyl +thionylamine +thionyls +thionin +thionine +thionines +thionins +thionitrite +thionium +thionobenzoic +thionthiolic +thionurate +thiopental +thiopentone +thiophen +thiophene +thiophenic +thiophenol +thiophens +thiophosgene +thiophosphate +thiophosphite +thiophosphoric +thiophosphoryl +thiophthene +thiopyran +thioresorcinol +thioridazine +thiosinamine +thiospira +thiostannate +thiostannic +thiostannite +thiostannous +thiosulfate +thiosulfates +thiosulfuric +thiosulphate +thiosulphonic +thiosulphuric +thiotepa +thiotepas +thiothrix +thiotolene +thiotungstate +thiotungstic +thiouracil +thiourea +thioureas +thiourethan +thiourethane +thioxene +thiozone +thiozonid +thiozonide +thir +thyraden +thiram +thirams +thyratron +third +thirdborough +thirdendeal +thirdhand +thirdings +thirdly +thirdling +thirdness +thirds +thirdsman +thirdstream +thyreoadenitis +thyreoantitoxin +thyreoarytenoid +thyreoarytenoideus +thyreocervical +thyreocolloid +thyreocoridae +thyreoepiglottic +thyreogenic +thyreogenous +thyreoglobulin +thyreoglossal +thyreohyal +thyreohyoid +thyreoid +thyreoidal +thyreoideal +thyreoidean +thyreoidectomy +thyreoiditis +thyreoitis +thyreolingual +thyreoprotein +thyreosis +thyreotomy +thyreotoxicosis +thyreotropic +thyridia +thyridial +thyrididae +thyridium +thyris +thyrisiferous +thyristor +thirl +thirlage +thirlages +thirled +thirling +thirls +thyroadenitis +thyroantitoxin +thyroarytenoid +thyroarytenoideus +thyrocalcitonin +thyrocardiac +thyrocarditis +thyrocele +thyrocervical +thyrocolloid +thyrocricoid +thyroepiglottic +thyroepiglottidean +thyrogenic +thyrogenous +thyroglobulin +thyroglossal +thyrohyal +thyrohyoid +thyrohyoidean +thyroid +thyroidal +thyroidea +thyroideal +thyroidean +thyroidectomy +thyroidectomies +thyroidectomize +thyroidectomized +thyroidism +thyroiditis +thyroidization +thyroidless +thyroidotomy +thyroidotomies +thyroids +thyroiodin +thyrold +thyrolingual +thyronin +thyronine +thyroparathyroidectomy +thyroparathyroidectomize +thyroprival +thyroprivia +thyroprivic +thyroprivous +thyroprotein +thyroria +thyrorion +thyrorroria +thyrosis +thyrostraca +thyrostracan +thyrotherapy +thyrotome +thyrotomy +thyrotoxic +thyrotoxicity +thyrotoxicosis +thyrotrophic +thyrotrophin +thyrotropic +thyrotropin +thyroxin +thyroxine +thyroxinic +thyroxins +thyrse +thyrses +thyrsi +thyrsiflorous +thyrsiform +thyrsoid +thyrsoidal +thirst +thirsted +thirster +thirsters +thirstful +thirsty +thirstier +thirstiest +thirstily +thirstiness +thirsting +thirstingly +thirstland +thirstle +thirstless +thirstlessness +thirstproof +thirsts +thyrsus +thyrsusi +thirt +thirteen +thirteener +thirteenfold +thirteens +thirteenth +thirteenthly +thirteenths +thirty +thirties +thirtieth +thirtieths +thirtyfold +thirtyish +thirtypenny +thirtytwomo +this +thysanocarpus +thysanopter +thysanoptera +thysanopteran +thysanopteron +thysanopterous +thysanoura +thysanouran +thysanourous +thysanura +thysanuran +thysanurian +thysanuriform +thysanurous +thisbe +thysel +thyself +thysen +thishow +thislike +thisll +thisn +thisness +thissen +thistle +thistlebird +thistled +thistledown +thistlelike +thistleproof +thistlery +thistles +thistlewarp +thistly +thistlish +thiswise +thither +thitherto +thitherward +thitherwards +thitka +thitsi +thitsiol +thiuram +thivel +thixle +thixolabile +thixophobia +thixotropy +thixotropic +thlaspi +thlingchadinne +thlinget +thlipsis +tho +thob +thocht +thof +thoft +thoftfellow +thoght +thoke +thokish +tholance +thole +tholed +tholeiite +tholeiitic +tholeite +tholemod +tholepin +tholepins +tholes +tholi +tholing +tholli +tholoi +tholos +tholus +thomaean +thoman +thomas +thomasa +thomasine +thomasing +thomasite +thomisid +thomisidae +thomism +thomist +thomistic +thomistical +thomite +thomomys +thompson +thomsenolite +thomsonian +thomsonianism +thomsonite +thon +thonder +thondracians +thondraki +thondrakians +thone +thong +thonga +thonged +thongy +thongman +thongs +thoo +thooid +thoom +thor +thoracal +thoracalgia +thoracaorta +thoracectomy +thoracectomies +thoracentesis +thoraces +thoracic +thoracica +thoracical +thoracically +thoracicoabdominal +thoracicoacromial +thoracicohumeral +thoracicolumbar +thoraciform +thoracispinal +thoracoabdominal +thoracoacromial +thoracobronchotomy +thoracoceloschisis +thoracocentesis +thoracocyllosis +thoracocyrtosis +thoracodelphus +thoracodidymus +thoracodynia +thoracodorsal +thoracogastroschisis +thoracograph +thoracohumeral +thoracolysis +thoracolumbar +thoracomelus +thoracometer +thoracometry +thoracomyodynia +thoracopagus +thoracoplasty +thoracoplasties +thoracoschisis +thoracoscope +thoracoscopy +thoracostei +thoracostenosis +thoracostomy +thoracostomies +thoracostraca +thoracostracan +thoracostracous +thoracotomy +thoracotomies +thoral +thorascope +thorax +thoraxes +thore +thoria +thorianite +thorias +thoriate +thoric +thoriferous +thorina +thorite +thorites +thorium +thoriums +thorn +thornback +thornbill +thornbush +thorned +thornen +thornhead +thorny +thornier +thorniest +thornily +thorniness +thorning +thornless +thornlessness +thornlet +thornlike +thornproof +thorns +thornstone +thorntail +thoro +thorocopagous +thorogummite +thoron +thorons +thorough +thoroughbass +thoroughbrace +thoroughbred +thoroughbredness +thoroughbreds +thorougher +thoroughest +thoroughfare +thoroughfarer +thoroughfares +thoroughfaresome +thoroughfoot +thoroughfooted +thoroughfooting +thoroughgoing +thoroughgoingly +thoroughgoingness +thoroughgrowth +thoroughly +thoroughness +thoroughpaced +thoroughpin +thoroughsped +thoroughstem +thoroughstitch +thoroughstitched +thoroughway +thoroughwax +thoroughwort +thorp +thorpe +thorpes +thorps +thort +thorter +thortveitite +thos +those +thou +thoued +though +thought +thoughted +thoughten +thoughtfree +thoughtfreeness +thoughtful +thoughtfully +thoughtfulness +thoughty +thoughtkin +thoughtless +thoughtlessly +thoughtlessness +thoughtlet +thoughtness +thoughts +thoughtsick +thoughtway +thouing +thous +thousand +thousandfold +thousandfoldly +thousands +thousandth +thousandths +thousandweight +thouse +thow +thowel +thowless +thowt +thraces +thracian +thrack +thraep +thrail +thrain +thraldom +thraldoms +thrall +thrallborn +thralldom +thralled +thralling +thralls +thram +thrammle +thrang +thrangity +thranite +thranitic +thrap +thrapple +thrash +thrashed +thrashel +thrasher +thrasherman +thrashers +thrashes +thrashing +thraso +thrasonic +thrasonical +thrasonically +thrast +thratch +thraupidae +thrave +thraver +thraves +thraw +thrawart +thrawartlike +thrawartness +thrawcrook +thrawed +thrawing +thrawn +thrawneen +thrawnly +thrawnness +thraws +thrax +thread +threadbare +threadbareness +threadbarity +threaded +threaden +threader +threaders +threadfin +threadfish +threadfishes +threadflower +threadfoot +thready +threadier +threadiest +threadiness +threading +threadle +threadless +threadlet +threadlike +threadmaker +threadmaking +threads +threadway +threadweed +threadworm +threap +threaped +threapen +threaper +threapers +threaping +threaps +threat +threated +threaten +threatenable +threatened +threatener +threateners +threatening +threateningly +threateningness +threatens +threatful +threatfully +threatfulness +threating +threatless +threatproof +threats +threave +three +threedimensionality +threefold +threefolded +threefoldedness +threefoldly +threefoldness +threeling +threeness +threep +threeped +threepence +threepences +threepenny +threepennyworth +threeping +threeps +threes +threescore +threesome +threesomes +threip +thremmatology +threne +threnetic +threnetical +threnode +threnodes +threnody +threnodial +threnodian +threnodic +threnodical +threnodies +threnodist +threnos +threonin +threonine +threose +threpe +threpsology +threptic +thresh +threshal +threshed +threshel +thresher +thresherman +threshers +threshes +threshing +threshingtime +threshold +thresholds +threskiornithidae +threskiornithinae +threstle +threw +thribble +thrice +thricecock +thridace +thridacium +thrift +thriftbox +thrifty +thriftier +thriftiest +thriftily +thriftiness +thriftless +thriftlessly +thriftlessness +thriftlike +thrifts +thriftshop +thrill +thrillant +thrilled +thriller +thrillers +thrillful +thrillfully +thrilly +thrillier +thrilliest +thrilling +thrillingly +thrillingness +thrillproof +thrills +thrillsome +thrimble +thrimp +thrimsa +thrymsa +thrinax +thring +thringing +thrinter +thrioboly +thryonomys +thrip +thripel +thripid +thripidae +thrippence +thripple +thrips +thrist +thrive +thrived +thriveless +thriven +thriver +thrivers +thrives +thriving +thrivingly +thrivingness +thro +throat +throatal +throatband +throatboll +throated +throatful +throaty +throatier +throatiest +throatily +throatiness +throating +throatlash +throatlatch +throatless +throatlet +throatlike +throatroot +throats +throatstrap +throatwort +throb +throbbed +throbber +throbbers +throbbing +throbbingly +throbless +throbs +throck +throdden +throddy +throe +throed +throeing +throes +thrombase +thrombectomy +thrombectomies +thrombi +thrombin +thrombins +thromboangiitis +thromboarteritis +thrombocyst +thrombocyte +thrombocytic +thrombocytopenia +thrombocytopenic +thromboclasis +thromboclastic +thromboembolic +thromboembolism +thrombogen +thrombogenic +thromboid +thrombokinase +thrombolymphangitis +thrombolysis +thrombolytic +thrombopenia +thrombophlebitis +thromboplastic +thromboplastically +thromboplastin +thrombose +thrombosed +thromboses +thrombosing +thrombosis +thrombostasis +thrombotic +thrombus +thronal +throne +throned +thronedom +throneless +thronelet +thronelike +thrones +throneward +throng +thronged +thronger +throngful +thronging +throngingly +throngs +throning +thronize +thronoi +thronos +thrope +thropple +throroughly +throstle +throstlelike +throstles +throttle +throttleable +throttled +throttlehold +throttler +throttlers +throttles +throttling +throttlingly +throu +throuch +throucht +through +throughbear +throughbred +throughcome +throughgang +throughganging +throughgoing +throughgrow +throughither +throughknow +throughly +throughother +throughout +throughput +throughway +throughways +throve +throw +throwaway +throwaways +throwback +throwbacks +throwdown +thrower +throwers +throwing +thrown +throwoff +throwout +throws +throwst +throwster +throwwort +thru +thrum +thrumble +thrummed +thrummer +thrummers +thrummy +thrummier +thrummiest +thrumming +thrums +thrumwort +thruout +thruppence +thruput +thruputs +thrush +thrushel +thrusher +thrushes +thrushy +thrushlike +thrust +thrusted +thruster +thrusters +thrustful +thrustfulness +thrusting +thrustings +thrustle +thrustor +thrustors +thrustpush +thrusts +thrutch +thrutchings +thruthvang +thruv +thruway +thruways +thsant +thuan +thuban +thucydidean +thud +thudded +thudding +thuddingly +thuds +thug +thugdom +thugged +thuggee +thuggeeism +thuggees +thuggery +thuggeries +thuggess +thugging +thuggish +thuggism +thugs +thuya +thuyas +thuidium +thuyopsis +thuja +thujas +thujene +thujyl +thujin +thujone +thujopsis +thule +thulia +thulias +thulir +thulite +thulium +thuliums +thulr +thuluth +thumb +thumbbird +thumbed +thumber +thumbhole +thumby +thumbikin +thumbikins +thumbing +thumbkin +thumbkins +thumble +thumbless +thumblike +thumbling +thumbmark +thumbnail +thumbnails +thumbnut +thumbnuts +thumbpiece +thumbprint +thumbrope +thumbs +thumbscrew +thumbscrews +thumbstall +thumbstring +thumbtack +thumbtacked +thumbtacking +thumbtacks +thumlungur +thummin +thump +thumped +thumper +thumpers +thumping +thumpingly +thumps +thunar +thunbergia +thunbergilene +thund +thunder +thunderation +thunderball +thunderbearer +thunderbearing +thunderbird +thunderblast +thunderbolt +thunderbolts +thunderbox +thunderburst +thunderclap +thunderclaps +thundercloud +thunderclouds +thundercrack +thundered +thunderer +thunderers +thunderfish +thunderfishes +thunderflower +thunderful +thunderhead +thunderheaded +thunderheads +thundery +thundering +thunderingly +thunderless +thunderlight +thunderlike +thunderous +thunderously +thunderousness +thunderpeal +thunderplump +thunderproof +thunderpump +thunders +thundershower +thundershowers +thundersmite +thundersmiting +thundersmote +thundersquall +thunderstick +thunderstone +thunderstorm +thunderstorms +thunderstricken +thunderstrike +thunderstroke +thunderstruck +thunderwood +thunderworm +thunderwort +thundrous +thundrously +thung +thunge +thunnidae +thunnus +thunor +thuoc +thurberia +thurgi +thurible +thuribles +thuribuler +thuribulum +thurifer +thuriferous +thurifers +thurify +thurificate +thurificati +thurification +thuringian +thuringite +thurio +thurl +thurle +thurls +thurm +thurmus +thurnia +thurniaceae +thurrock +thursday +thursdays +thurse +thurst +thurt +thus +thusgate +thushi +thusly +thusness +thuswise +thutter +thwack +thwacked +thwacker +thwackers +thwacking +thwackingly +thwacks +thwackstave +thwait +thwaite +thwart +thwarted +thwartedly +thwarteous +thwarter +thwarters +thwarting +thwartingly +thwartly +thwartman +thwartmen +thwartness +thwartover +thwarts +thwartsaw +thwartship +thwartships +thwartways +thwartwise +thwite +thwittle +thworl +ti +tiahuanacan +tiam +tiang +tiangue +tiao +tiar +tiara +tiaraed +tiaralike +tiaras +tiarella +tiatinagua +tyauve +tib +tybalt +tibby +tibbie +tibbit +tibbu +tibey +tiber +tiberian +tiberine +tiberius +tibert +tibet +tibetan +tibetans +tibia +tibiad +tibiae +tibial +tibiale +tibialia +tibialis +tibias +tibicen +tibicinist +tibiocalcanean +tibiofemoral +tibiofibula +tibiofibular +tibiometatarsal +tibionavicular +tibiopopliteal +tibioscaphoid +tibiotarsal +tibiotarsi +tibiotarsus +tibiotarsusi +tibouchina +tibourbou +tyburn +tyburnian +tiburon +tiburtine +tic +tical +ticals +ticca +ticchen +tice +ticement +ticer +tyche +tichel +tychism +tychistic +tychite +tichodroma +tichodrome +tychonian +tychonic +tychoparthenogenesis +tychopotamic +tichorhine +tichorrhine +tick +tickbean +tickbird +tickeater +ticked +tickey +ticken +ticker +tickers +ticket +ticketed +ticketer +ticketing +ticketless +ticketmonger +tickets +ticky +tickicide +tickie +ticking +tickings +tickle +tickleback +ticklebrain +tickled +ticklely +ticklenburg +ticklenburgs +tickleness +tickleproof +tickler +ticklers +tickles +ticklesome +tickless +tickleweed +tickly +tickliness +tickling +ticklingly +ticklish +ticklishly +ticklishness +tickney +tickproof +ticks +tickseed +tickseeded +tickseeds +ticktack +ticktacked +ticktacker +ticktacking +ticktacks +ticktacktoe +ticktacktoo +ticktick +ticktock +ticktocked +ticktocking +ticktocks +tickweed +tycoon +tycoonate +tycoons +tics +tictac +tictacked +tictacking +tictacs +tictactoe +tictic +tictoc +tictocked +tictocking +tictocs +ticul +ticuna +ticunan +tid +tidal +tidally +tidbit +tidbits +tydden +tidder +tiddy +tyddyn +tiddle +tiddledywinks +tiddley +tiddleywink +tiddler +tiddly +tiddling +tiddlywink +tiddlywinker +tiddlywinking +tiddlywinks +tide +tidecoach +tided +tideful +tidehead +tideland +tidelands +tideless +tidelessness +tidely +tidelike +tideling +tidemaker +tidemaking +tidemark +tidemarks +tiderace +tiderip +tiderips +tiderode +tides +tidesman +tidesurveyor +tideswell +tydeus +tideway +tideways +tidewaiter +tidewaitership +tideward +tidewater +tidewaters +tidi +tidy +tidiable +tydie +tidied +tidier +tidies +tidiest +tidife +tidying +tidyism +tidily +tidiness +tidinesses +tiding +tidingless +tidings +tidiose +tidytips +tidley +tidling +tidology +tidological +tie +tye +tieback +tiebacks +tieboy +tiebreaker +tieclasp +tieclasps +tied +tiedog +tyee +tyees +tiefenthal +tieing +tieless +tiemaker +tiemaking +tiemannite +tien +tienda +tiens +tienta +tiento +tiepin +tiepins +tier +tierce +tierced +tiercel +tiercels +tierceron +tierces +tiered +tierer +tiering +tierlike +tierras +tiers +tiersman +ties +tyes +tietick +tievine +tiewig +tiewigged +tiff +tiffany +tiffanies +tiffanyite +tiffed +tiffy +tiffie +tiffin +tiffined +tiffing +tiffining +tiffins +tiffish +tiffle +tiffs +tifinagh +tift +tifter +tig +tyg +tige +tigella +tigellate +tigelle +tigellum +tigellus +tiger +tigerbird +tigereye +tigereyes +tigerfish +tigerfishes +tigerflower +tigerfoot +tigerhearted +tigerhood +tigery +tigerish +tigerishly +tigerishness +tigerism +tigerkin +tigerly +tigerlike +tigerling +tigernut +tigerproof +tigers +tigerwood +tigger +tight +tighten +tightened +tightener +tighteners +tightening +tightenings +tightens +tighter +tightest +tightfisted +tightfistedly +tightfistedness +tightfitting +tightish +tightknit +tightly +tightlier +tightliest +tightlipped +tightness +tightrope +tightroped +tightropes +tightroping +tights +tightwad +tightwads +tightwire +tiglaldehyde +tiglic +tiglinic +tiglon +tiglons +tignon +tignum +tigon +tigons +tigrai +tigre +tigrean +tigress +tigresses +tigresslike +tigridia +tigrina +tigrine +tigrinya +tigris +tigrish +tigroid +tigrolysis +tigrolytic +tigrone +tigtag +tigua +tigurine +tyigh +tying +tike +tyke +tyken +tikes +tykes +tykhana +tiki +tyking +tikis +tikitiki +tikka +tikker +tikkun +tiklin +tikolosh +tikoloshe +tikoor +tikor +tikur +til +tilaite +tilak +tilaka +tilaks +tilapia +tilapias +tylari +tylarus +tilasite +tylaster +tilbury +tilburies +tilda +tilde +tilden +tildes +tile +tyleberry +tiled +tilefish +tilefishes +tileyard +tilelike +tilemaker +tilemaking +tylenchus +tiler +tyler +tilery +tileries +tylerism +tylerite +tylerize +tileroot +tilers +tiles +tileseed +tilesherd +tilestone +tilette +tileways +tilework +tileworks +tilewright +tilia +tiliaceae +tiliaceous +tilicetum +tilyer +tilikum +tiling +tilings +tylion +till +tillable +tillaea +tillaeastrum +tillage +tillages +tillamook +tillandsia +tilled +tilley +tiller +tillered +tillering +tillerless +tillerman +tillermen +tillers +tillet +tilletia +tilletiaceae +tilletiaceous +tilly +tillicum +tilling +tillite +tillman +tillodont +tillodontia +tillodontidae +tillot +tillotter +tills +tilmus +tylocin +tyloma +tylopod +tylopoda +tylopodous +tylosaurus +tylose +tyloses +tylosis +tylosoid +tylosteresis +tylostylar +tylostyle +tylostylote +tylostylus +tylostoma +tylostomaceae +tylosurus +tylotate +tylote +tylotic +tylotoxea +tylotoxeate +tylotus +tilpah +tils +tilsit +tilt +tiltable +tiltboard +tilted +tilter +tilters +tilth +tilthead +tilths +tilty +tiltyard +tiltyards +tilting +tiltlike +tiltmaker +tiltmaking +tiltmeter +tilts +tiltup +tilture +tylus +tim +timable +timaeus +timalia +timaliidae +timaliinae +timaliine +timaline +timani +timar +timarau +timaraus +timariot +timarri +timaua +timawa +timazite +timbal +tymbal +timbale +timbales +tymbalon +timbals +tymbals +timbang +timbe +timber +timberdoodle +timbered +timberer +timberhead +timbery +timberyard +timbering +timberjack +timberland +timberlands +timberless +timberlike +timberline +timberlines +timberling +timberman +timbermen +timbermonger +timbern +timbers +timbersome +timbertuned +timberwood +timberwork +timberwright +timbestere +timbira +timbo +timbre +timbrel +timbreled +timbreler +timbrelled +timbreller +timbrels +timbres +timbrology +timbrologist +timbromania +timbromaniac +timbromanist +timbrophily +timbrophilic +timbrophilism +timbrophilist +time +timeable +timebinding +timecard +timecards +timed +timeful +timefully +timefulness +timekeep +timekeeper +timekeepers +timekeepership +timekeeping +timeless +timelessly +timelessness +timely +timelia +timelier +timeliest +timeliidae +timeliine +timelily +timeliness +timeling +timenoguy +timeous +timeously +timeout +timeouts +timepiece +timepieces +timepleaser +timeproof +timer +timerau +timerity +timers +times +timesaver +timesavers +timesaving +timescale +timeserver +timeservers +timeserving +timeservingness +timeshare +timeshares +timesharing +timestamp +timestamps +timet +timetable +timetables +timetaker +timetaking +timetrp +timeward +timework +timeworker +timeworks +timeworn +timias +timid +timider +timidest +timidity +timidities +timidly +timidness +timidous +timing +timings +timish +timist +timmer +timne +timo +timocracy +timocracies +timocratic +timocratical +timon +timoneer +timonian +timonism +timonist +timonize +timor +timorese +timoroso +timorous +timorously +timorousness +timorousnous +timorsome +timote +timotean +timothean +timothy +timothies +tymp +tympan +timpana +tympana +tympanal +tympanam +tympanectomy +timpani +tympani +tympany +tympanic +tympanichord +tympanichordal +tympanicity +tympanies +tympaniform +tympaning +tympanism +timpanist +tympanist +timpanists +tympanites +tympanitic +tympanitis +tympanize +timpano +tympano +tympanocervical +tympanohyal +tympanomalleal +tympanomandibular +tympanomastoid +tympanomaxillary +tympanon +tympanoperiotic +tympanosis +tympanosquamosal +tympanostapedial +tympanotemporal +tympanotomy +tympans +tympanuchus +timpanum +tympanum +timpanums +tympanums +timucua +timucuan +timuquan +timuquanan +timwhisky +tin +tina +tinage +tinaja +tinamidae +tinamine +tinamou +tinamous +tinampipi +tinbergen +tinc +tincal +tincals +tinchel +tinchill +tinclad +tinct +tincted +tincting +tinction +tinctorial +tinctorially +tinctorious +tincts +tinctumutation +tincture +tinctured +tinctures +tincturing +tind +tynd +tindal +tyndallization +tyndallize +tyndallmeter +tindalo +tinder +tinderbox +tinderboxes +tindered +tindery +tinderish +tinderlike +tinderous +tinders +tine +tyne +tinea +tineal +tinean +tineas +tined +tyned +tinegrass +tineid +tineidae +tineids +tineina +tineine +tineman +tinemen +tineoid +tineoidea +tineola +tinerer +tines +tynes +tinetare +tinety +tineweed +tinfoil +tinfoils +tinful +tinfuls +ting +tinge +tinged +tingeing +tingent +tinger +tinges +tinggian +tingi +tingibility +tingible +tingid +tingidae +tinging +tingis +tingitid +tingitidae +tinglass +tingle +tingled +tingler +tinglers +tingles +tingletangle +tingly +tinglier +tingliest +tingling +tinglingly +tinglish +tings +tingtang +tinguaite +tinguaitic +tinguy +tinguian +tinhorn +tinhorns +tinhouse +tiny +tinier +tiniest +tinily +tininess +tininesses +tining +tyning +tink +tinker +tinkerbird +tinkerdom +tinkered +tinkerer +tinkerers +tinkering +tinkerly +tinkerlike +tinkers +tinkershere +tinkershire +tinkershue +tinkerwise +tinkle +tinkled +tinkler +tinklerman +tinkles +tinkly +tinklier +tinkliest +tinkling +tinklingly +tinklings +tinlet +tinlike +tinman +tinmen +tinne +tinned +tinnen +tinner +tinnery +tinners +tinnet +tinni +tinny +tinnient +tinnier +tinniest +tinnified +tinnily +tinniness +tinning +tinnitus +tinnituses +tinnock +tino +tinoceras +tinoceratid +tinosa +tinplate +tinplates +tinpot +tins +tinsel +tinseled +tinseling +tinselled +tinselly +tinsellike +tinselling +tinselmaker +tinselmaking +tinselry +tinsels +tinselweaver +tinselwork +tinsy +tinsman +tinsmen +tinsmith +tinsmithy +tinsmithing +tinsmiths +tinstone +tinstones +tinstuff +tint +tinta +tintack +tintage +tintamar +tintamarre +tintarron +tinted +tinter +tinternell +tinters +tinty +tintie +tintiness +tinting +tintingly +tintings +tintinnabula +tintinnabulant +tintinnabular +tintinnabulary +tintinnabulate +tintinnabulation +tintinnabulations +tintinnabulatory +tintinnabulism +tintinnabulist +tintinnabulous +tintinnabulum +tintype +tintyper +tintypes +tintist +tintless +tintlessness +tintometer +tintometry +tintometric +tints +tinwald +tynwald +tinware +tinwares +tinwoman +tinwork +tinworker +tinworking +tinworks +tinzenite +tionontates +tionontati +tiou +tip +typ +typable +typal +typarchical +tipburn +tipcart +tipcarts +tipcat +tipcats +tipe +type +typeable +typebar +typebars +typecase +typecases +typecast +typecasting +typecasts +typed +typees +typeface +typefaces +typeform +typefounder +typefounders +typefounding +typefoundry +typehead +typeholder +typey +typeless +typeout +typer +types +typescript +typescripts +typeset +typeseting +typesets +typesetter +typesetters +typesetting +typesof +typewrite +typewriter +typewriters +typewrites +typewriting +typewritten +typewrote +tipful +typha +typhaceae +typhaceous +typhaemia +tiphead +typhemia +tiphia +typhia +typhic +tiphiidae +typhinia +typhization +typhlatony +typhlatonia +typhlectasis +typhlectomy +typhlenteritis +typhlitic +typhlitis +typhloalbuminuria +typhlocele +typhloempyema +typhloenteritis +typhlohepatitis +typhlolexia +typhlolithiasis +typhlology +typhlologies +typhlomegaly +typhlomolge +typhlon +typhlopexy +typhlopexia +typhlophile +typhlopid +typhlopidae +typhlops +typhloptosis +typhlosis +typhlosolar +typhlosole +typhlostenosis +typhlostomy +typhlotomy +typhoaemia +typhobacillosis +typhoean +typhoemia +typhoeus +typhogenic +typhoid +typhoidal +typhoidin +typhoidlike +typhoids +typholysin +typhomalaria +typhomalarial +typhomania +typhon +typhonia +typhonian +typhonic +typhons +typhoon +typhoonish +typhoons +typhopneumonia +typhose +typhosepsis +typhosis +typhotoxine +typhous +typhula +typhus +typhuses +tipi +typy +typic +typica +typical +typicality +typically +typicalness +typicon +typicum +typier +typiest +typify +typification +typified +typifier +typifiers +typifies +typifying +typika +typikon +typikons +typing +tipis +typist +typists +tipit +tipiti +tiple +tipless +tiplet +tipman +tipmen +tipmost +typo +typobar +typocosmy +tipoff +tipoffs +typograph +typographer +typographers +typography +typographia +typographic +typographical +typographically +typographies +typographist +typolithography +typolithographic +typology +typologic +typological +typologically +typologies +typologist +typomania +typometry +tiponi +typonym +typonymal +typonymic +typonymous +typophile +typorama +typos +typoscript +typotelegraph +typotelegraphy +typothere +typotheria +typotheriidae +typothetae +typp +tippable +tipped +tippee +tipper +tippers +tippet +tippets +tippy +tippier +tippiest +tipping +tippytoe +tipple +tippled +tippleman +tippler +tipplers +tipples +tipply +tippling +tipproof +typps +tipree +tips +tipsy +tipsier +tipsiest +tipsify +tipsification +tipsifier +tipsily +tipsiness +tipstaff +tipstaffs +tipstaves +tipster +tipsters +tipstock +tipstocks +tiptail +tipteerer +tiptilt +tiptoe +tiptoed +tiptoeing +tiptoeingly +tiptoes +tiptoing +typtology +typtological +typtologist +tiptop +tiptopness +tiptopper +tiptoppish +tiptoppishness +tiptops +tiptopsome +tipula +tipularia +tipulid +tipulidae +tipuloid +tipuloidea +tipup +tipura +typw +tiqueur +tyr +tirade +tirades +tirage +tirailleur +tiralee +tyramin +tyramine +tyramines +tyranness +tyranni +tyranny +tyrannial +tyrannic +tyrannical +tyrannically +tyrannicalness +tyrannicidal +tyrannicide +tyrannicly +tyrannidae +tyrannides +tyrannies +tyranninae +tyrannine +tyrannis +tyrannise +tyrannised +tyranniser +tyrannising +tyrannisingly +tyrannism +tyrannize +tyrannized +tyrannizer +tyrannizers +tyrannizes +tyrannizing +tyrannizingly +tyrannoid +tyrannophobia +tyrannosaur +tyrannosaurs +tyrannosaurus +tyrannosauruses +tyrannous +tyrannously +tyrannousness +tyrannus +tyrant +tyrantcraft +tyrantlike +tyrants +tyrantship +tyrasole +tirasse +tiraz +tire +tyre +tired +tyred +tireder +tiredest +tiredly +tiredness +tiredom +tirehouse +tireless +tirelessly +tirelessness +tireling +tiremaid +tiremaker +tiremaking +tireman +tiremen +tirement +tyremesis +tirer +tireroom +tires +tyres +tiresias +tiresmith +tiresol +tiresome +tiresomely +tiresomeness +tiresomeweed +tirewoman +tirewomen +tirhutia +tyrian +tyriasis +tiriba +tiring +tyring +tiringly +tirl +tirled +tirling +tirls +tirma +tiro +tyro +tyrocidin +tyrocidine +tirocinia +tirocinium +tyroglyphid +tyroglyphidae +tyroglyphus +tyroid +tirolean +tyrolean +tirolese +tyrolese +tyrolienne +tyrolite +tyrology +tyroma +tyromancy +tyromas +tyromata +tyromatous +tyrone +tironian +tyronic +tyronism +tiros +tyros +tyrosyl +tyrosinase +tyrosine +tyrosines +tyrosinuria +tyrothricin +tyrotoxicon +tyrotoxine +tirr +tyrr +tirracke +tirralirra +tirret +tyrrhene +tyrrheni +tyrrhenian +tirribi +tirrit +tirrivee +tirrivees +tirrivie +tirrlie +tirrwirr +tyrsenoi +tirshatha +tyrtaean +tirthankara +tirurai +tirve +tirwit +tis +tisane +tisanes +tisar +tishiya +tishri +tisic +tisiphone +tysonite +tissu +tissual +tissue +tissued +tissuey +tissueless +tissuelike +tissues +tissuing +tisswood +tyste +tystie +tiswin +tit +tyt +titan +titanate +titanates +titanaugite +titanesque +titaness +titanesses +titania +titanian +titanias +titanic +titanical +titanically +titanichthyidae +titanichthys +titaniferous +titanifluoride +titanyl +titanism +titanisms +titanite +titanites +titanitic +titanium +titaniums +titanlike +titano +titanocyanide +titanocolumbate +titanofluoride +titanolater +titanolatry +titanomachy +titanomachia +titanomagnetite +titanoniobate +titanosaur +titanosaurus +titanosilicate +titanothere +titanotheridae +titanotherium +titanous +titans +titar +titbit +titbits +titbitty +tite +titer +titeration +titers +titfer +titfish +tithable +tithal +tithe +tythe +tithebook +tithed +tythed +titheless +tithemonger +tithepayer +tither +titheright +tithers +tithes +tythes +tithymal +tithymalopsis +tithymalus +tithing +tything +tithingman +tithingmen +tithingpenny +tithings +tithonia +tithonias +tithonic +tithonicity +tithonographic +tithonometer +tithonus +titi +titian +titianesque +titianic +titians +titien +tities +titilate +titillability +titillant +titillate +titillated +titillater +titillates +titillating +titillatingly +titillation +titillations +titillative +titillator +titillatory +titis +titivate +titivated +titivates +titivating +titivation +titivator +titivil +titiviller +titlark +titlarks +title +titleboard +titled +titledom +titleholder +titleless +titlene +titleproof +titler +titles +titleship +titlike +titling +titlist +titlists +titmal +titmall +titman +titmarsh +titmarshian +titmen +titmice +titmmice +titmouse +tyto +titoism +titoist +titoki +tytonidae +titrable +titrant +titrants +titratable +titrate +titrated +titrates +titrating +titration +titrator +titrators +titre +titres +titrimetry +titrimetric +titrimetrically +tits +titter +titteration +tittered +titterel +titterer +titterers +tittery +tittering +titteringly +titters +titty +tittie +titties +tittymouse +tittivate +tittivated +tittivating +tittivation +tittivator +tittle +tittlebat +tittler +tittles +tittlin +tittup +tittuped +tittupy +tittuping +tittupped +tittuppy +tittupping +tittups +titubancy +titubant +titubantly +titubate +titubation +titulado +titular +titulary +titularies +titularity +titularly +titulars +titulation +titule +tituli +titulus +titurel +titus +tiu +tyum +tiver +tivy +tivoli +tiwaz +tiza +tizeur +tizwin +tizzy +tizzies +tjaele +tjandi +tjanting +tjenkal +tji +tjosite +tjurunga +tk +tkt +tlaco +tlakluit +tlapallan +tlascalan +tlingit +tln +tlo +tlr +tm +tmema +tmemata +tmeses +tmesipteris +tmesis +tmh +tn +tng +tnpk +tnt +to +toa +toad +toadback +toadeat +toadeater +toadeating +toader +toadery +toadess +toadfish +toadfishes +toadflax +toadflaxes +toadflower +toadhead +toady +toadied +toadier +toadies +toadying +toadyish +toadyism +toadyisms +toadish +toadyship +toadishness +toadless +toadlet +toadlike +toadlikeness +toadling +toadpipe +toadpipes +toadroot +toads +toadship +toadstone +toadstool +toadstoollike +toadstools +toadwise +toag +toarcian +toast +toastable +toasted +toastee +toaster +toasters +toasty +toastier +toastiest +toastiness +toasting +toastmaster +toastmastery +toastmasters +toastmistress +toastmistresses +toasts +toat +toatoa +tob +toba +tobacco +tobaccoes +tobaccofied +tobaccoy +tobaccoism +tobaccoite +tobaccoless +tobaccolike +tobaccoman +tobaccomen +tobacconalian +tobacconing +tobacconist +tobacconistical +tobacconists +tobacconize +tobaccophil +tobaccoroot +tobaccos +tobaccosim +tobaccoweed +tobaccowood +tobe +toby +tobiah +tobias +tobies +tobikhar +tobyman +tobymen +tobine +tobira +toboggan +tobogganed +tobogganeer +tobogganer +tobogganing +tobogganist +tobogganists +toboggans +tocalote +toccata +toccatas +toccate +toccatina +toch +tocharese +tocharian +tocharic +tocharish +tocher +tochered +tochering +tocherless +tochers +tock +toco +tocobaga +tocodynamometer +tocogenetic +tocogony +tocokinin +tocology +tocological +tocologies +tocologist +tocome +tocometer +tocopherol +tocophobia +tocororo +tocsin +tocsins +tocusso +tod +toda +today +todayish +todayll +todays +todd +todder +toddy +toddick +toddies +toddyize +toddyman +toddymen +toddite +toddle +toddled +toddlekins +toddler +toddlers +toddles +toddling +tode +todea +todelike +tody +todidae +todies +todlowrie +tods +todus +toe +toea +toeboard +toecap +toecapped +toecaps +toed +toehold +toeholds +toey +toeing +toeless +toelike +toellite +toenail +toenailed +toenailing +toenails +toepiece +toepieces +toeplate +toeplates +toerless +toernebohmite +toes +toeshoe +toeshoes +toetoe +toff +toffee +toffeeman +toffees +toffy +toffies +toffyman +toffymen +toffing +toffish +toffs +tofieldia +tofile +tofore +toforn +toft +tofter +toftman +toftmen +tofts +toftstead +tofu +tofus +tog +toga +togae +togaed +togalike +togas +togata +togate +togated +togawise +toged +togeman +together +togetherhood +togetheriness +togetherness +togethers +togged +toggel +togger +toggery +toggeries +togging +toggle +toggled +toggler +togglers +toggles +toggling +togless +togo +togs +togt +togue +togues +toher +toheroa +toho +tohome +tohubohu +tohunga +toi +toy +toydom +toyed +toyer +toyers +toyful +toyfulness +toyhouse +toying +toyingly +toyish +toyishly +toyishness +toil +toyland +toile +toiled +toiler +toilers +toiles +toyless +toilet +toileted +toileting +toiletry +toiletries +toilets +toilette +toiletted +toilettes +toiletware +toilful +toilfully +toylike +toilinet +toilinette +toiling +toilingly +toilless +toillessness +toils +toilsome +toilsomely +toilsomeness +toilworn +toymaker +toymaking +toyman +toymen +toyo +toyon +toyons +toyos +toyota +toyotas +toys +toise +toisech +toised +toyshop +toising +toysome +toison +toist +toit +toited +toity +toiting +toitish +toitoi +toytown +toits +toivel +toywoman +toywort +tokay +tokays +tokamak +toke +toked +tokelau +token +tokened +tokening +tokenism +tokenisms +tokenize +tokenless +tokens +tokenworth +tokes +tokharian +toking +tokyo +tokyoite +tokyoites +toko +tokodynamometer +tokology +tokologies +tokoloshe +tokonoma +tokonomas +tokopat +toktokje +tol +tola +tolamine +tolan +tolane +tolanes +tolans +tolas +tolbooth +tolbooths +tolbutamide +told +tolderia +toldo +tole +toled +toledan +toledo +toledoan +toledos +tolerability +tolerable +tolerableness +tolerably +tolerablish +tolerance +tolerances +tolerancy +tolerant +tolerantism +tolerantly +tolerate +tolerated +tolerates +tolerating +toleration +tolerationism +tolerationist +tolerative +tolerator +tolerators +tolerism +toles +toletan +toleware +tolfraedic +tolguacha +tolidin +tolidine +tolidines +tolidins +tolyl +tolylene +tolylenediamine +tolyls +toling +tolipane +tolypeutes +tolypeutine +tolite +toll +tollable +tollage +tollages +tollbar +tollbars +tollbook +tollbooth +tollbooths +tolled +tollefsen +tollent +toller +tollery +tollers +tollgate +tollgates +tollgatherer +tollhall +tollhouse +tollhouses +tolly +tollies +tolliker +tolling +tollkeeper +tollman +tollmaster +tollmen +tollon +tollpenny +tolls +tolltaker +tollway +tollways +tolmen +tolowa +tolpatch +tolpatchery +tolsey +tolsel +tolsester +tolstoy +tolstoyan +tolstoyism +tolstoyist +tolt +toltec +toltecan +tolter +tolu +tolualdehyde +toluate +toluates +toluene +toluenes +toluic +toluid +toluide +toluides +toluidide +toluidin +toluidine +toluidino +toluidins +toluido +toluids +toluifera +toluyl +toluylene +toluylenediamine +toluylic +toluyls +tolunitrile +toluol +toluole +toluoles +toluols +toluquinaldine +tolus +tolusafranine +tolutation +tolzey +tom +toma +tomahawk +tomahawked +tomahawker +tomahawking +tomahawks +tomalley +tomalleys +toman +tomand +tomans +tomas +tomatillo +tomatilloes +tomatillos +tomato +tomatoes +tomb +tombac +tomback +tombacks +tombacs +tombak +tombaks +tombal +tombe +tombed +tombic +tombing +tombless +tomblet +tomblike +tomboy +tomboyful +tomboyish +tomboyishly +tomboyishness +tomboyism +tomboys +tombola +tombolo +tombolos +tombs +tombstone +tombstones +tomcat +tomcats +tomcatted +tomcatting +tomcod +tomcods +tome +tomeful +tomelet +toment +tomenta +tomentose +tomentous +tomentulose +tomentum +tomes +tomfool +tomfoolery +tomfooleries +tomfoolish +tomfoolishness +tomfools +tomia +tomial +tomin +tomines +tomish +tomistoma +tomium +tomiumia +tomjohn +tomjon +tomkin +tommed +tommer +tommy +tommybag +tommycod +tommies +tomming +tommyrot +tommyrots +tomnoddy +tomnorry +tomnoup +tomogram +tomograms +tomograph +tomography +tomographic +tomographies +tomolo +tomomania +tomopteridae +tomopteris +tomorn +tomorrow +tomorrower +tomorrowing +tomorrowness +tomorrows +tomosis +tompion +tompions +tompiper +tompon +tomrig +toms +tomtate +tomtit +tomtitmouse +tomtits +ton +tonada +tonal +tonalamatl +tonalist +tonalite +tonality +tonalities +tonalitive +tonally +tonalmatl +tonant +tonation +tondi +tondino +tondo +tone +toned +tonedeafness +tonelada +toneladas +toneless +tonelessly +tonelessness +toneme +tonemes +tonemic +toneproof +toner +toners +tones +tonetic +tonetically +tonetician +tonetics +tonette +tonettes +tong +tonga +tongan +tongas +tonged +tonger +tongers +tonging +tongkang +tongman +tongmen +tongrian +tongs +tongsman +tongsmen +tongue +tonguebird +tonguecraft +tongued +tonguedoughty +tonguefence +tonguefencer +tonguefish +tonguefishes +tongueflower +tongueful +tonguefuls +tonguey +tongueless +tonguelessness +tonguelet +tonguelike +tongueman +tonguemanship +tonguemen +tongueplay +tongueproof +tonguer +tongues +tongueshot +tonguesman +tonguesore +tonguester +tonguetip +tonguy +tonguiness +tonguing +tonguings +tony +tonic +tonical +tonically +tonicity +tonicities +tonicize +tonicked +tonicking +tonicobalsamic +tonicoclonic +tonicostimulant +tonics +tonier +tonies +toniest +tonify +tonight +tonights +tonyhoop +tonikan +toning +tonish +tonishly +tonishness +tonite +tonitrocirrus +tonitrophobia +tonitrual +tonitruant +tonitruone +tonitruous +tonjon +tonk +tonka +tonkawa +tonkawan +tonkin +tonkinese +tonlet +tonlets +tonn +tonna +tonnage +tonnages +tonne +tonneau +tonneaued +tonneaus +tonneaux +tonnelle +tonner +tonners +tonnes +tonnish +tonnishly +tonnishness +tonnland +tonoclonic +tonogram +tonograph +tonology +tonological +tonometer +tonometry +tonometric +tonophant +tonoplast +tonoscope +tonotactic +tonotaxis +tonous +tons +tonsbergite +tonsil +tonsilar +tonsile +tonsilectomy +tonsilitic +tonsilitis +tonsillar +tonsillary +tonsillectome +tonsillectomy +tonsillectomic +tonsillectomies +tonsillectomize +tonsillith +tonsillitic +tonsillitis +tonsillolith +tonsillotome +tonsillotomy +tonsillotomies +tonsilomycosis +tonsils +tonsor +tonsorial +tonsurate +tonsure +tonsured +tonsures +tonsuring +tontine +tontiner +tontines +tonto +tonus +tonuses +too +tooart +toodle +toodleloodle +took +tooken +tool +toolach +toolbox +toolboxes +toolbuilder +toolbuilding +tooled +tooler +toolers +toolhead +toolheads +toolholder +toolholding +toolhouse +tooling +toolings +toolkit +toolless +toolmake +toolmaker +toolmakers +toolmaking +toolman +toolmark +toolmarking +toolmen +toolplate +toolroom +toolrooms +tools +toolsetter +toolshed +toolsheds +toolsi +toolsy +toolslide +toolsmith +toolstock +toolstone +toom +toomly +toon +toona +toons +toonwood +toop +toorie +toorock +tooroo +toosh +toosie +toot +tooted +tooter +tooters +tooth +toothache +toothaches +toothachy +toothaching +toothbill +toothbrush +toothbrushes +toothbrushy +toothbrushing +toothchiseled +toothcomb +toothcup +toothdrawer +toothdrawing +toothed +toother +toothflower +toothful +toothy +toothier +toothiest +toothily +toothill +toothing +toothless +toothlessly +toothlessness +toothlet +toothleted +toothlike +toothpaste +toothpastes +toothpick +toothpicks +toothplate +toothpowder +toothproof +tooths +toothshell +toothsome +toothsomely +toothsomeness +toothstick +toothwash +toothwork +toothwort +tooting +tootinghole +tootle +tootled +tootler +tootlers +tootles +tootling +tootlish +tootmoot +toots +tootses +tootsy +tootsie +tootsies +toozle +toozoo +top +topaesthesia +topalgia +toparch +toparchy +toparchia +toparchiae +toparchical +toparchies +topas +topass +topato +topatopa +topau +topaz +topazes +topazfels +topazy +topazine +topazite +topazolite +topcap +topcast +topcastle +topchrome +topcoat +topcoating +topcoats +topcross +topcrosses +topdress +topdressing +tope +topechee +topectomy +topectomies +toped +topee +topees +topeewallah +topeka +topeng +topepo +toper +toperdom +topers +topes +topesthesia +topfilled +topflight +topflighter +topful +topfull +topgallant +toph +tophaceous +tophaike +tophamper +tophe +tophes +tophet +tophetic +tophetical +tophetize +tophi +tophyperidrosis +tophous +tophphi +tophs +tophus +topi +topia +topiary +topiaria +topiarian +topiaries +topiarist +topiarius +topic +topical +topicality +topicalities +topically +topics +topinambou +toping +topinish +topis +topiwala +topkick +topkicks +topknot +topknots +topknotted +topless +toplessness +toplighted +toplike +topline +topliner +toplofty +toploftical +toploftier +toploftiest +toploftily +toploftiness +topmaker +topmaking +topman +topmast +topmasts +topmaul +topmen +topminnow +topminnows +topmost +topmostly +topnet +topnotch +topnotcher +topo +topoalgia +topocentric +topochemical +topochemistry +topodeme +topog +topognosia +topognosis +topograph +topographer +topographers +topography +topographic +topographical +topographically +topographics +topographies +topographist +topographize +topographometric +topoi +topolatry +topology +topologic +topological +topologically +topologies +topologist +topologize +toponarcosis +toponeural +toponeurosis +toponym +toponymal +toponymy +toponymic +toponymical +toponymics +toponymies +toponymist +toponymous +toponyms +topophobia +topophone +topopolitan +topos +topotactic +topotaxis +topotype +topotypes +topotypic +topotypical +topped +topper +toppers +toppy +toppiece +topping +toppingly +toppingness +toppings +topple +toppled +toppler +topples +topply +toppling +toprail +toprope +tops +topsail +topsailite +topsails +topsy +topside +topsider +topsiders +topsides +topsyturn +topsyturviness +topsl +topsman +topsmelt +topsmelts +topsmen +topsoil +topsoiled +topsoiling +topsoils +topspin +topssmelt +topstitch +topstone +topstones +topswarm +toptail +topwise +topwork +topworked +topworking +topworks +toque +toques +toquet +toquets +toquilla +tor +tora +torah +torahs +toraja +toral +toran +torana +toras +torbanite +torbanitic +torbernite +torc +torcel +torch +torchbearer +torchbearers +torchbearing +torched +torcher +torchere +torcheres +torches +torchet +torchy +torchier +torchiers +torchiest +torching +torchless +torchlight +torchlighted +torchlike +torchlit +torchman +torchon +torchons +torchweed +torchwood +torchwort +torcs +torcular +torculus +tordion +tordrillite +tore +toreador +toreadors +tored +torenia +torero +toreros +tores +toret +toreumatography +toreumatology +toreutic +toreutics +torfaceous +torfel +torfle +torgoch +torgot +tori +tory +toric +torydom +tories +toryess +toriest +toryfy +toryfication +torified +toryhillite +torii +toryish +toryism +toryistic +toryize +torilis +torinese +toriness +toryship +toryweed +torma +tormae +tormen +torment +tormenta +tormentable +tormentation +tormentative +tormented +tormentedly +tormenter +tormenters +tormentful +tormentil +tormentilla +tormenting +tormentingly +tormentingness +tormentive +tormentor +tormentors +tormentous +tormentress +tormentry +torments +tormentum +tormina +torminal +torminous +tormodont +torn +tornachile +tornada +tornade +tornadic +tornado +tornadoes +tornadoesque +tornadolike +tornadoproof +tornados +tornal +tornaria +tornariae +tornarian +tornarias +torney +tornese +tornesi +tornilla +tornillo +tornillos +tornit +tornote +tornus +toro +toroid +toroidal +toroidally +toroids +torolillo +toromona +toronja +toronto +torontonian +tororokombu +toros +torosaurus +torose +torosity +torosities +toroth +torotoro +torous +torpedineer +torpedinidae +torpedinous +torpedo +torpedoed +torpedoer +torpedoes +torpedoing +torpedoist +torpedolike +torpedoman +torpedomen +torpedoplane +torpedoproof +torpedos +torpent +torpescence +torpescent +torpex +torpid +torpidity +torpidities +torpidly +torpidness +torpids +torpify +torpified +torpifying +torpitude +torpor +torporific +torporize +torpors +torquate +torquated +torque +torqued +torquer +torquers +torques +torqueses +torquing +torr +torrefacation +torrefaction +torrefy +torrefication +torrefied +torrefies +torrefying +torreya +torrens +torrent +torrentful +torrentfulness +torrential +torrentiality +torrentially +torrentine +torrentless +torrentlike +torrents +torrentuous +torrentwise +torret +torricellian +torrid +torrider +torridest +torridity +torridly +torridness +torridonian +torrify +torrified +torrifies +torrifying +torrone +torrubia +tors +torsade +torsades +torsalo +torse +torsel +torses +torsi +torsibility +torsigraph +torsile +torsimeter +torsiogram +torsiograph +torsiometer +torsion +torsional +torsionally +torsioning +torsionless +torsions +torsive +torsk +torsks +torso +torsoclusion +torsoes +torsometer +torsoocclusion +torsos +torsten +tort +torta +tortays +torte +torteau +torteaus +torteaux +tortellini +torten +tortes +tortfeasor +tortfeasors +torticollar +torticollis +torticone +tortie +tortil +tortile +tortility +tortilla +tortillas +tortille +tortillions +tortillon +tortious +tortiously +tortis +tortive +tortoise +tortoiselike +tortoises +tortoiseshell +tortoni +tortonian +tortonis +tortor +tortrices +tortricid +tortricidae +tortricina +tortricine +tortricoid +tortricoidea +tortrix +tortrixes +torts +tortue +tortula +tortulaceae +tortulaceous +tortulous +tortuose +tortuosity +tortuosities +tortuous +tortuously +tortuousness +torturable +torturableness +torture +tortured +torturedly +tortureproof +torturer +torturers +tortures +torturesome +torturesomeness +torturing +torturingly +torturous +torturously +torturousness +toru +torula +torulaceous +torulae +torulaform +torulas +toruli +toruliform +torulin +toruloid +torulose +torulosis +torulous +torulus +torus +toruses +torve +torvid +torvity +torvous +tos +tosaphist +tosaphoth +tosca +toscanite +tosephta +tosephtas +tosh +toshakhana +tosher +toshery +toshes +toshy +toshly +toshnail +tosy +tosily +tosk +toskish +toss +tossed +tosser +tossers +tosses +tossy +tossicated +tossily +tossing +tossingly +tossment +tosspot +tosspots +tossup +tossups +tossut +tost +tostada +tostado +tostamente +tostao +tosticate +tosticated +tosticating +tostication +toston +tot +totable +total +totaled +totaling +totalisator +totalise +totalised +totalises +totalising +totalism +totalisms +totalistic +totalitarian +totalitarianism +totalitarianize +totalitarianized +totalitarianizing +totalitarians +totality +totalities +totalitizer +totalization +totalizator +totalizators +totalize +totalized +totalizer +totalizes +totalizing +totalled +totaller +totallers +totally +totalling +totalness +totals +totanine +totanus +totaquin +totaquina +totaquine +totara +totchka +tote +toted +toteload +totem +totemy +totemic +totemically +totemism +totemisms +totemist +totemistic +totemists +totemite +totemites +totemization +totems +toter +totery +toters +totes +tother +toty +totient +totyman +toting +totipalmatae +totipalmate +totipalmation +totipotence +totipotency +totipotencies +totipotent +totipotential +totipotentiality +totitive +toto +totoaba +totonac +totonacan +totonaco +totora +totoro +totquot +tots +totted +totten +totter +tottered +totterer +totterers +tottergrass +tottery +totteriness +tottering +totteringly +totterish +totters +totty +tottie +tottyhead +totting +tottle +tottlish +tottum +totuava +totum +tou +touareg +touart +toucan +toucanet +toucanid +toucans +touch +touchability +touchable +touchableness +touchback +touchbell +touchbox +touchdown +touchdowns +touche +touched +touchedness +toucher +touchers +touches +touchhole +touchy +touchier +touchiest +touchily +touchiness +touching +touchingly +touchingness +touchless +touchline +touchmark +touchous +touchpan +touchpiece +touchstone +touchstones +touchup +touchups +touchwood +toufic +toug +tough +toughen +toughened +toughener +tougheners +toughening +toughens +tougher +toughest +toughhead +toughhearted +toughy +toughie +toughies +toughish +toughly +toughness +toughra +toughs +tought +tould +toumnah +tounatea +toup +toupee +toupeed +toupees +toupet +tour +touraco +touracos +tourbe +tourbillion +tourbillon +toured +tourelle +tourelles +tourer +tourers +touret +tourette +touring +tourings +tourism +tourisms +tourist +touristdom +touristy +touristic +touristical +touristically +touristproof +touristry +tourists +touristship +tourize +tourmalin +tourmaline +tourmalinic +tourmaliniferous +tourmalinization +tourmalinize +tourmalite +tourmente +tourn +tournai +tournay +tournament +tournamental +tournaments +tournant +tournasin +tourne +tournedos +tournee +tournefortia +tournefortian +tourney +tourneyed +tourneyer +tourneying +tourneys +tournel +tournette +tourneur +tourniquet +tourniquets +tournois +tournure +tours +tourt +tourte +tousche +touse +toused +tousel +touser +touses +tousy +tousing +tousle +tousled +tousles +tously +tousling +toust +toustie +tout +touted +touter +touters +touting +touts +touzle +touzled +touzles +touzling +tov +tovah +tovar +tovaria +tovariaceae +tovariaceous +tovarich +tovariches +tovarisch +tovarish +tovarishes +tovet +tow +towability +towable +towage +towages +towai +towan +toward +towardly +towardliness +towardness +towards +towaway +towaways +towbar +towboat +towboats +towcock +towd +towdie +towed +towel +toweled +towelette +toweling +towelings +towelled +towelling +towelry +towels +tower +towered +towery +towerier +toweriest +towering +toweringly +toweringness +towerless +towerlet +towerlike +towerman +towermen +towerproof +towers +towerwise +towerwork +towerwort +towght +towhead +towheaded +towheads +towhee +towhees +towy +towie +towies +towing +towkay +towlike +towline +towlines +towmast +towmond +towmonds +towmont +towmonts +town +towned +townee +townees +towner +townet +townfaring +townfolk +townfolks +townful +towngate +townhood +townhouse +townhouses +towny +townie +townies +townify +townified +townifying +towniness +townish +townishly +townishness +townist +townland +townless +townlet +townlets +townly +townlike +townling +townman +townmen +towns +townsboy +townscape +townsendi +townsendia +townsendite +townsfellow +townsfolk +township +townships +townside +townsite +townsman +townsmen +townspeople +townswoman +townswomen +townward +townwards +townwear +townwears +towpath +towpaths +towrope +towropes +tows +towser +towsy +towson +towzie +tox +toxa +toxaemia +toxaemias +toxaemic +toxalbumic +toxalbumin +toxalbumose +toxamin +toxanaemia +toxanemia +toxaphene +toxcatl +toxemia +toxemias +toxemic +toxic +toxicaemia +toxical +toxically +toxicant +toxicants +toxicarol +toxicate +toxication +toxicemia +toxicity +toxicities +toxicodendrol +toxicodendron +toxicoderma +toxicodermatitis +toxicodermatosis +toxicodermia +toxicodermitis +toxicogenic +toxicognath +toxicohaemia +toxicohemia +toxicoid +toxicol +toxicology +toxicologic +toxicological +toxicologically +toxicologist +toxicologists +toxicomania +toxicon +toxicopathy +toxicopathic +toxicophagy +toxicophagous +toxicophidia +toxicophobia +toxicoses +toxicosis +toxicotraumatic +toxicum +toxidermic +toxidermitis +toxifer +toxifera +toxiferous +toxify +toxified +toxifying +toxigenic +toxigenicity +toxigenicities +toxihaemia +toxihemia +toxiinfection +toxiinfectious +toxylon +toxin +toxinaemia +toxine +toxinemia +toxines +toxinfection +toxinfectious +toxinosis +toxins +toxiphagi +toxiphagus +toxiphobia +toxiphobiac +toxiphoric +toxitabellae +toxity +toxodon +toxodont +toxodontia +toxogenesis +toxoglossa +toxoglossate +toxoid +toxoids +toxolysis +toxology +toxon +toxone +toxonosis +toxophil +toxophile +toxophily +toxophilism +toxophilite +toxophilitic +toxophilitism +toxophilous +toxophobia +toxophoric +toxophorous +toxoplasma +toxoplasmic +toxoplasmosis +toxosis +toxosozin +toxostoma +toxotae +toxotes +toxotidae +toze +tozee +tozer +tp +tpd +tph +tpi +tpk +tpke +tpm +tps +tr +tra +trabacoli +trabacolo +trabacolos +trabal +trabant +trabascolo +trabea +trabeae +trabeatae +trabeate +trabeated +trabeation +trabecula +trabeculae +trabecular +trabecularism +trabeculas +trabeculate +trabeculated +trabeculation +trabecule +trabes +trabu +trabuch +trabucho +trabuco +trabucos +trac +tracasserie +tracasseries +tracaulon +trace +traceability +traceable +traceableness +traceably +traceback +traced +tracey +traceless +tracelessly +tracer +tracery +traceried +traceries +tracers +traces +trachea +tracheae +tracheaectasy +tracheal +trachealgia +trachealis +trachean +tracheary +trachearia +trachearian +tracheas +tracheata +tracheate +tracheated +tracheation +trachecheae +trachecheas +tracheid +tracheidal +tracheide +tracheids +tracheitis +trachelagra +trachelate +trachelectomy +trachelectomopexia +trachelia +trachelismus +trachelitis +trachelium +tracheloacromialis +trachelobregmatic +trachelocyllosis +tracheloclavicular +trachelodynia +trachelology +trachelomastoid +trachelopexia +tracheloplasty +trachelorrhaphy +tracheloscapular +trachelospermum +trachelotomy +trachenchyma +tracheobronchial +tracheobronchitis +tracheocele +tracheochromatic +tracheoesophageal +tracheofissure +tracheolar +tracheolaryngeal +tracheolaryngotomy +tracheole +tracheolingual +tracheopathy +tracheopathia +tracheopharyngeal +tracheophyte +tracheophonae +tracheophone +tracheophonesis +tracheophony +tracheophonine +tracheopyosis +tracheoplasty +tracheorrhagia +tracheoschisis +tracheoscopy +tracheoscopic +tracheoscopist +tracheostenosis +tracheostomy +tracheostomies +tracheotome +tracheotomy +tracheotomies +tracheotomist +tracheotomize +tracheotomized +tracheotomizing +trachyandesite +trachybasalt +trachycarpous +trachycarpus +trachychromatic +trachydolerite +trachyglossate +trachile +trachylinae +trachyline +trachymedusae +trachymedusan +trachinidae +trachinoid +trachinus +trachyphonia +trachyphonous +trachypteridae +trachypteroid +trachypterus +trachyspermous +trachyte +trachytes +trachytic +trachitis +trachytoid +trachle +trachled +trachles +trachling +trachodon +trachodont +trachodontid +trachodontidae +trachoma +trachomas +trachomatous +trachomedusae +trachomedusan +tracy +tracing +tracingly +tracings +track +trackable +trackage +trackages +trackbarrow +tracked +tracker +trackers +trackhound +tracking +trackings +trackingscout +tracklayer +tracklaying +trackless +tracklessly +tracklessness +trackman +trackmanship +trackmaster +trackmen +trackpot +tracks +trackscout +trackshifter +tracksick +trackside +tracksuit +trackway +trackwalker +trackwork +traclia +tract +tractability +tractabilities +tractable +tractableness +tractably +tractarian +tractarianism +tractarianize +tractate +tractates +tractation +tractator +tractatule +tractellate +tractellum +tractiferous +tractile +tractility +traction +tractional +tractioneering +tractions +tractism +tractite +tractitian +tractive +tractlet +tractor +tractoration +tractory +tractorism +tractorist +tractorization +tractorize +tractors +tractrices +tractrix +tracts +tractus +trad +tradable +tradal +trade +tradeable +tradecraft +traded +tradeful +tradeless +trademark +trademarks +trademaster +tradename +tradeoff +tradeoffs +trader +traders +tradership +trades +tradescantia +tradesfolk +tradesman +tradesmanlike +tradesmanship +tradesmanwise +tradesmen +tradespeople +tradesperson +tradeswoman +tradeswomen +tradevman +trady +tradiment +trading +tradite +tradition +traditional +traditionalism +traditionalist +traditionalistic +traditionalists +traditionality +traditionalize +traditionalized +traditionally +traditionary +traditionaries +traditionarily +traditionate +traditionately +traditioner +traditionism +traditionist +traditionitis +traditionize +traditionless +traditionmonger +traditions +traditious +traditive +traditor +traditores +traditorship +traduce +traduced +traducement +traducements +traducent +traducer +traducers +traduces +traducian +traducianism +traducianist +traducianistic +traducible +traducing +traducingly +traduct +traduction +traductionist +traductive +traffic +trafficability +trafficable +trafficableness +trafficator +traffick +trafficked +trafficker +traffickers +trafficking +trafficks +trafficless +traffics +trafficway +trafflicker +trafflike +trag +tragacanth +tragacantha +tragacanthin +tragal +tragasol +tragedy +tragedial +tragedian +tragedianess +tragedians +tragedical +tragedienne +tragediennes +tragedies +tragedietta +tragedious +tragedist +tragedization +tragedize +tragelaph +tragelaphine +tragelaphus +tragi +tragia +tragic +tragical +tragicality +tragically +tragicalness +tragicaster +tragicize +tragicly +tragicness +tragicofarcical +tragicoheroicomic +tragicolored +tragicomedy +tragicomedian +tragicomedies +tragicomic +tragicomical +tragicomicality +tragicomically +tragicomipastoral +tragicoromantic +tragicose +tragion +tragions +tragoedia +tragopan +tragopans +tragopogon +tragule +tragulidae +tragulina +traguline +traguloid +traguloidea +tragulus +tragus +trah +traheen +trahison +tray +trayful +trayfuls +traik +traiked +traiky +traiking +traiks +trail +trailbaston +trailblaze +trailblazer +trailblazers +trailblazing +trailboard +trailbreaker +trailed +trailer +trailerable +trailered +trailery +trailering +trailerist +trailerite +trailerload +trailers +trailership +trailhead +traily +traylike +trailiness +trailing +trailingly +trailings +trailless +trailmaker +trailmaking +trailman +trails +trailside +trailsman +trailsmen +trailway +traymobile +train +trainability +trainable +trainableness +trainage +trainagraph +trainant +trainante +trainband +trainbearer +trainboy +trainbolt +trayne +traineau +trained +trainee +trainees +traineeship +trainel +trainer +trainers +trainful +trainfuls +trainy +training +trainings +trainless +trainline +trainload +trainman +trainmaster +trainmen +trainpipe +trains +trainshed +trainsick +trainsickness +trainster +traintime +trainway +trainways +traipse +traipsed +traipses +traipsing +trays +traist +trait +traiteur +traiteurs +traitless +traitor +traitoress +traitorhood +traitory +traitorism +traitorize +traitorly +traitorlike +traitorling +traitorous +traitorously +traitorousness +traitors +traitorship +traitorwise +traitress +traitresses +traits +traject +trajected +trajectile +trajecting +trajection +trajectitious +trajectory +trajectories +trajects +trajet +tralatician +tralaticiary +tralatition +tralatitious +tralatitiously +tralineate +tralira +trallian +tralucency +tralucent +tram +trama +tramal +tramcar +tramcars +trame +tramel +trameled +trameling +tramell +tramelled +tramelling +tramells +tramels +trametes +tramful +tramyard +tramless +tramline +tramlines +tramman +trammed +trammel +trammeled +trammeler +trammelhead +trammeling +trammelingly +trammelled +trammeller +trammelling +trammellingly +trammels +trammer +trammie +tramming +trammon +tramontana +tramontanas +tramontane +tramp +trampage +trampcock +trampdom +tramped +tramper +trampers +trampess +tramphood +tramping +trampish +trampishly +trampism +trample +trampled +trampler +tramplers +tramples +tramplike +trampling +trampolin +trampoline +trampoliner +trampoliners +trampolines +trampolining +trampolinist +trampolinists +trampoose +tramposo +trampot +tramps +tramroad +tramroads +trams +tramsmith +tramway +tramwayman +tramwaymen +tramways +tran +trance +tranced +trancedly +tranceful +trancelike +trances +tranchant +tranchante +tranche +tranchefer +tranchet +tranchoir +trancing +trancoidal +traneau +traneen +tranfd +trangam +trangams +trank +tranka +tranker +tranky +trankum +tranmissibility +trannie +tranquil +tranquiler +tranquilest +tranquility +tranquilization +tranquilize +tranquilized +tranquilizer +tranquilizers +tranquilizes +tranquilizing +tranquilizingly +tranquiller +tranquillest +tranquilly +tranquillise +tranquilliser +tranquillity +tranquillization +tranquillize +tranquillized +tranquillizer +tranquillizing +tranquillo +tranquilness +trans +transaccidentation +transact +transacted +transacting +transactinide +transaction +transactional +transactionally +transactioneer +transactions +transactor +transacts +transalpine +transalpinely +transalpiner +transaminase +transamination +transanimate +transanimation +transannular +transapical +transappalachian +transaquatic +transarctic +transatlantic +transatlantically +transatlantican +transatlanticism +transaudient +transaxle +transbay +transbaikal +transbaikalian +transboard +transborder +transcalency +transcalent +transcalescency +transcalescent +transcaucasian +transceive +transceiver +transceivers +transcend +transcendant +transcended +transcendence +transcendency +transcendent +transcendental +transcendentalisation +transcendentalism +transcendentalist +transcendentalistic +transcendentalists +transcendentality +transcendentalization +transcendentalize +transcendentalized +transcendentalizing +transcendentalizm +transcendentally +transcendentals +transcendently +transcendentness +transcendible +transcending +transcendingly +transcendingness +transcends +transcension +transchange +transchanged +transchanger +transchanging +transchannel +transcience +transcolor +transcoloration +transcolour +transcolouration +transcondylar +transcondyloid +transconductance +transconscious +transcontinental +transcontinentally +transcorporate +transcorporeal +transcortical +transcreate +transcribable +transcribble +transcribbler +transcribe +transcribed +transcriber +transcribers +transcribes +transcribing +transcript +transcriptase +transcription +transcriptional +transcriptionally +transcriptions +transcriptitious +transcriptive +transcriptively +transcripts +transcriptural +transcrystalline +transcultural +transculturally +transculturation +transcur +transcurrent +transcurrently +transcursion +transcursive +transcursively +transcurvation +transcutaneous +transdermic +transdesert +transdialect +transdiaphragmatic +transdiurnal +transduce +transduced +transducer +transducers +transducing +transduction +transductional +transe +transect +transected +transecting +transection +transects +transelement +transelemental +transelementary +transelementate +transelementated +transelementating +transelementation +transempirical +transenna +transennae +transept +transeptal +transeptally +transepts +transequatorial +transequatorially +transessentiate +transessentiated +transessentiating +transeunt +transexperiental +transexperiential +transf +transfashion +transfd +transfeature +transfeatured +transfeaturing +transfer +transferability +transferable +transferableness +transferably +transferal +transferals +transferase +transferee +transference +transferent +transferential +transferer +transferography +transferor +transferotype +transferrable +transferral +transferrals +transferred +transferrer +transferrers +transferribility +transferring +transferrins +transferror +transferrotype +transfers +transfigurate +transfiguration +transfigurations +transfigurative +transfigure +transfigured +transfigurement +transfigures +transfiguring +transfiltration +transfinite +transfission +transfix +transfixation +transfixed +transfixes +transfixing +transfixion +transfixt +transfixture +transfluent +transfluvial +transflux +transforation +transform +transformability +transformable +transformance +transformation +transformational +transformationalist +transformationist +transformations +transformative +transformator +transformed +transformer +transformers +transforming +transformingly +transformism +transformist +transformistic +transforms +transfretation +transfrontal +transfrontier +transfuge +transfugitive +transfusable +transfuse +transfused +transfuser +transfusers +transfuses +transfusible +transfusing +transfusion +transfusional +transfusionist +transfusions +transfusive +transfusively +transgender +transgeneration +transgenerations +transgredient +transgress +transgressed +transgresses +transgressible +transgressing +transgressingly +transgression +transgressional +transgressions +transgressive +transgressively +transgressor +transgressors +transhape +tranship +transhipment +transhipped +transhipping +tranships +transhuman +transhumanate +transhumanation +transhumance +transhumanize +transhumant +transience +transiency +transiencies +transient +transiently +transientness +transients +transigence +transigent +transiliac +transilience +transiliency +transilient +transilluminate +transilluminated +transilluminating +transillumination +transilluminator +transylvanian +transimpression +transincorporation +transindividual +transinsular +transire +transischiac +transisthmian +transistor +transistorization +transistorize +transistorized +transistorizes +transistorizing +transistors +transit +transitable +transited +transiter +transiting +transition +transitional +transitionally +transitionalness +transitionary +transitioned +transitionist +transitions +transitival +transitive +transitively +transitiveness +transitivism +transitivity +transitivities +transitman +transitmen +transitory +transitorily +transitoriness +transitron +transits +transitu +transitus +transjordanian +transl +translade +translay +translatability +translatable +translatableness +translate +translated +translater +translates +translating +translation +translational +translationally +translations +translative +translator +translatorese +translatory +translatorial +translators +translatorship +translatress +translatrix +transleithan +transletter +translight +translinguate +transliterate +transliterated +transliterates +transliterating +transliteration +transliterations +transliterator +translocalization +translocate +translocated +translocating +translocation +translocations +translocatory +transluce +translucence +translucency +translucencies +translucent +translucently +translucid +translucidity +translucidus +translunar +translunary +transmade +transmake +transmaking +transmarginal +transmarginally +transmarine +transmaterial +transmateriation +transmedial +transmedian +transmembrane +transmen +transmental +transmentally +transmentation +transmeridional +transmeridionally +transmethylation +transmew +transmigrant +transmigrate +transmigrated +transmigrates +transmigrating +transmigration +transmigrationism +transmigrationist +transmigrations +transmigrative +transmigratively +transmigrator +transmigratory +transmigrators +transmissibility +transmissible +transmission +transmissional +transmissionist +transmissions +transmissive +transmissively +transmissiveness +transmissivity +transmissometer +transmissory +transmit +transmits +transmittability +transmittable +transmittal +transmittals +transmittance +transmittances +transmittancy +transmittant +transmitted +transmitter +transmitters +transmittible +transmitting +transmogrify +transmogrification +transmogrifications +transmogrified +transmogrifier +transmogrifies +transmogrifying +transmold +transmontane +transmorphism +transmould +transmountain +transmue +transmundane +transmural +transmuscle +transmutability +transmutable +transmutableness +transmutably +transmutate +transmutation +transmutational +transmutationist +transmutations +transmutative +transmutatory +transmute +transmuted +transmuter +transmutes +transmuting +transmutive +transmutual +transmutually +transnatation +transnational +transnationally +transnatural +transnaturation +transnature +transnihilation +transnormal +transnormally +transocean +transoceanic +transocular +transom +transomed +transoms +transonic +transorbital +transovarian +transp +transpacific +transpadane +transpalatine +transpalmar +transpanamic +transparence +transparency +transparencies +transparent +transparentize +transparently +transparentness +transparietal +transparish +transpass +transpassional +transpatronized +transpatronizing +transpeciate +transpeciation +transpeer +transpenetrable +transpenetration +transpeninsular +transpenisular +transpeptidation +transperitoneal +transperitoneally +transpersonal +transpersonally +transphenomenal +transphysical +transphysically +transpicuity +transpicuous +transpicuously +transpicuousness +transpierce +transpierced +transpiercing +transpyloric +transpirability +transpirable +transpiration +transpirative +transpiratory +transpire +transpired +transpires +transpiring +transpirometer +transplace +transplacement +transplacental +transplacentally +transplanetary +transplant +transplantability +transplantable +transplantar +transplantation +transplantations +transplanted +transplantee +transplanter +transplanters +transplanting +transplants +transplendency +transplendent +transplendently +transpleural +transpleurally +transpolar +transpond +transponder +transponders +transpondor +transponibility +transponible +transpontine +transport +transportability +transportable +transportableness +transportables +transportal +transportance +transportation +transportational +transportationist +transportative +transported +transportedly +transportedness +transportee +transporter +transporters +transporting +transportingly +transportive +transportment +transports +transposability +transposable +transposableness +transposal +transpose +transposed +transposer +transposes +transposing +transposition +transpositional +transpositions +transpositive +transpositively +transpositor +transpository +transpour +transprint +transprocess +transprose +transproser +transpulmonary +transput +transradiable +transrational +transrationally +transreal +transrectification +transrhenane +transrhodanian +transriverina +transriverine +transscriber +transsegmental +transsegmentally +transsensual +transsensually +transseptal +transsepulchral +transsexual +transsexualism +transsexuality +transsexuals +transshape +transshaped +transshaping +transshift +transship +transshipment +transshipped +transshipping +transships +transsocietal +transsolid +transsonic +transstellar +transsubjective +transtemporal +transteverine +transthalamic +transthoracic +transthoracically +transtracheal +transubstantial +transubstantially +transubstantiate +transubstantiated +transubstantiating +transubstantiation +transubstantiationalist +transubstantiationite +transubstantiative +transubstantiatively +transubstantiatory +transudate +transudation +transudative +transudatory +transude +transuded +transudes +transuding +transume +transumed +transuming +transumpt +transumption +transumptive +transuranian +transuranic +transuranium +transurethral +transuterine +transvaal +transvaaler +transvaalian +transvaluate +transvaluation +transvalue +transvalued +transvaluing +transvasate +transvasation +transvase +transvectant +transvection +transvenom +transverbate +transverbation +transverberate +transverberation +transversal +transversale +transversalis +transversality +transversally +transversan +transversary +transverse +transversely +transverseness +transverser +transverses +transversion +transversive +transversocubital +transversomedial +transversospinal +transversovertical +transversum +transversus +transvert +transverter +transvest +transvestism +transvestite +transvestites +transvestitism +transvolation +transwritten +trant +tranter +trantlum +tranvia +tranzschelia +trap +trapa +trapaceae +trapaceous +trapan +trapanned +trapanner +trapanning +trapans +trapball +trapballs +trapdoor +trapdoors +trapes +trapesed +trapeses +trapesing +trapezate +trapeze +trapezes +trapezia +trapezial +trapezian +trapeziform +trapezing +trapeziometacarpal +trapezist +trapezium +trapeziums +trapezius +trapeziuses +trapezohedra +trapezohedral +trapezohedron +trapezohedrons +trapezoid +trapezoidal +trapezoidiform +trapezoids +trapezophora +trapezophoron +trapezophozophora +trapfall +traphole +trapiche +trapiferous +trapish +traplight +traplike +trapmaker +trapmaking +trapnest +trapnested +trapnesting +trapnests +trappability +trappabilities +trappable +trappean +trapped +trapper +trapperlike +trappers +trappy +trappier +trappiest +trappiness +trapping +trappingly +trappings +trappist +trappistine +trappoid +trappose +trappous +traprock +traprocks +traps +trapshoot +trapshooter +trapshooting +trapstick +trapt +trapunto +trapuntos +trasformism +trash +trashed +trashery +trashes +trashy +trashier +trashiest +trashify +trashily +trashiness +trashing +traship +trashless +trashman +trashmen +trashrack +trashtrie +trasy +trass +trasses +trastevere +trasteverine +tratler +trattle +trattoria +trauchle +trauchled +trauchles +trauchling +traulism +trauma +traumas +traumasthenia +traumata +traumatic +traumatically +traumaticin +traumaticine +traumatism +traumatization +traumatize +traumatized +traumatizes +traumatizing +traumatology +traumatologies +traumatonesis +traumatopyra +traumatopnea +traumatosis +traumatotactic +traumatotaxis +traumatropic +traumatropism +trautvetteria +trav +travado +travail +travailed +travailer +travailing +travailous +travails +travale +travally +travated +trave +travel +travelability +travelable +traveldom +traveled +traveler +traveleress +travelerlike +travelers +traveling +travelings +travellability +travellable +travelled +traveller +travellers +travelling +travelog +travelogs +travelogue +traveloguer +travelogues +travels +traveltime +traversable +traversal +traversals +traversary +traverse +traversed +traversely +traverser +traverses +traversewise +traversework +traversing +traversion +travertin +travertine +traves +travest +travesty +travestied +travestier +travesties +travestying +travestiment +travis +traviss +travoy +travois +travoise +travoises +trawl +trawlability +trawlable +trawlboat +trawled +trawley +trawleys +trawler +trawlerman +trawlermen +trawlers +trawling +trawlnet +trawls +trazia +treacher +treachery +treacheries +treacherous +treacherously +treacherousness +treachousness +treacle +treacleberry +treacleberries +treaclelike +treacles +treaclewort +treacly +treacliness +tread +treadboard +treaded +treader +treaders +treading +treadle +treadled +treadler +treadlers +treadles +treadless +treadling +treadmill +treadmills +treadplate +treads +treadwheel +treague +treas +treason +treasonable +treasonableness +treasonably +treasonful +treasonish +treasonist +treasonless +treasonmonger +treasonous +treasonously +treasonproof +treasons +treasr +treasurable +treasure +treasured +treasureless +treasurer +treasurers +treasurership +treasures +treasuress +treasury +treasuries +treasuring +treasuryship +treasurous +treat +treatability +treatabilities +treatable +treatableness +treatably +treated +treatee +treater +treaters +treaty +treaties +treatyist +treatyite +treatyless +treating +treatise +treatiser +treatises +treatment +treatments +treator +treats +trebellian +treble +trebled +trebleness +trebles +treblet +trebletree +trebly +trebling +trebuchet +trebucket +trecentist +trecento +trecentos +trechmannite +treckpot +treckschuyt +treculia +treddle +treddled +treddles +treddling +tredecaphobia +tredecile +tredecillion +tredecillions +tredecillionth +tredefowel +tredille +tredrille +tree +treebeard +treebine +treed +treefish +treefishes +treeful +treehair +treehood +treehopper +treey +treeify +treeiness +treeing +treeless +treelessness +treelet +treelike +treelikeness +treelined +treeling +treemaker +treemaking +treeman +treen +treenail +treenails +treenware +trees +treescape +treeship +treespeeler +treetise +treetop +treetops +treeward +treewards +tref +trefa +trefah +trefgordd +trefle +treflee +trefoil +trefoiled +trefoillike +trefoils +trefoilwise +tregadyne +tregerg +treget +tregetour +tregohm +trehala +trehalas +trehalase +trehalose +trey +treillage +treille +treys +treitour +treitre +trek +trekboer +trekked +trekker +trekkers +trekking +trekometer +trekpath +treks +trekschuit +trellis +trellised +trellises +trellising +trellislike +trelliswork +trema +tremandra +tremandraceae +tremandraceous +trematoda +trematode +trematodea +trematodes +trematoid +trematosaurus +tremble +trembled +tremblement +trembler +tremblers +trembles +trembly +tremblier +trembliest +trembling +tremblingly +tremblingness +tremblor +tremeline +tremella +tremellaceae +tremellaceous +tremellales +tremelliform +tremelline +tremellineous +tremelloid +tremellose +tremendous +tremendously +tremendousness +tremenousness +tremens +tremetol +tremex +tremie +tremogram +tremolando +tremolant +tremolist +tremolite +tremolitic +tremolo +tremolos +tremoloso +tremophobia +tremor +tremorless +tremorlessly +tremors +tremplin +tremulando +tremulant +tremulate +tremulation +tremulent +tremulous +tremulously +tremulousness +trenail +trenails +trench +trenchancy +trenchant +trenchantly +trenchantness +trenchboard +trenchcoats +trenched +trencher +trenchering +trencherless +trencherlike +trenchermaker +trenchermaking +trencherman +trenchermen +trenchers +trencherside +trencherwise +trencherwoman +trenches +trenchful +trenching +trenchlet +trenchlike +trenchmaster +trenchmore +trenchward +trenchwise +trenchwork +trend +trended +trendel +trendy +trendier +trendiest +trendily +trendiness +trending +trendle +trends +trent +trental +trentepohlia +trentepohliaceae +trentepohliaceous +trentine +trenton +trepak +trepan +trepanation +trepang +trepangs +trepanize +trepanned +trepanner +trepanning +trepanningly +trepans +trephination +trephine +trephined +trephiner +trephines +trephining +trephocyte +trephone +trepid +trepidancy +trepidant +trepidate +trepidation +trepidations +trepidatory +trepidity +trepidly +trepidness +treponema +treponemal +treponemas +treponemata +treponematosis +treponematous +treponeme +treponemiasis +treponemiatic +treponemicidal +treponemicide +trepostomata +trepostomatous +treppe +treron +treronidae +treroninae +tres +tresaiel +tresance +tresche +tresillo +tresis +trespass +trespassage +trespassed +trespasser +trespassers +trespasses +trespassing +trespassory +tress +tressed +tressel +tressels +tresses +tressful +tressy +tressier +tressiest +tressilate +tressilation +tressless +tresslet +tresslike +tresson +tressour +tressours +tressure +tressured +tressures +trest +trestle +trestles +trestletree +trestlewise +trestlework +trestling +tret +tretis +trets +trevally +trevet +trevets +trevette +trevis +trevor +trewage +trewel +trews +trewsman +trewsmen +trf +tri +try +triable +triableness +triac +triace +triacetamide +triacetate +triacetyloleandomycin +triacetonamine +triachenium +triacid +triacids +triacontad +triacontaeterid +triacontane +triaconter +triact +triactinal +triactine +triad +triadelphous +triadenum +triadic +triadical +triadically +triadics +triadism +triadisms +triadist +triads +triaene +triaenose +triage +triages +triagonal +triakid +triakisicosahedral +triakisicosahedron +triakisoctahedral +triakisoctahedrid +triakisoctahedron +triakistetrahedral +triakistetrahedron +trial +trialate +trialism +trialist +triality +trialogue +trials +triamcinolone +triamid +triamide +triamylose +triamin +triamine +triamino +triammonium +triamorph +triamorphous +triander +triandria +triandrian +triandrous +triangle +triangled +triangler +triangles +triangleways +trianglewise +trianglework +triangula +triangular +triangularis +triangularity +triangularly +triangulate +triangulated +triangulately +triangulates +triangulating +triangulation +triangulations +triangulator +triangulid +trianguloid +triangulopyramidal +triangulotriangular +triangulum +triannual +triannulate +trianon +triantaphyllos +triantelope +trianthous +triapsal +triapsidal +triarch +triarchate +triarchy +triarchies +triarctic +triarcuated +triareal +triary +triarian +triarii +triaryl +triarthrus +triarticulate +trias +triassic +triaster +triatic +triatoma +triatomic +triatomically +triatomicity +triaxal +triaxial +triaxiality +triaxon +triaxonian +triazane +triazin +triazine +triazines +triazins +triazo +triazoic +triazole +triazoles +triazolic +trib +tribade +tribades +tribady +tribadic +tribadism +tribadistic +tribal +tribalism +tribalist +tribally +tribarred +tribase +tribasic +tribasicity +tribasilar +tribble +tribe +tribeless +tribelet +tribelike +tribes +tribesfolk +tribeship +tribesman +tribesmanship +tribesmen +tribespeople +tribeswoman +tribeswomen +triblastic +triblet +triboelectric +triboelectricity +tribofluorescence +tribofluorescent +tribolium +tribology +tribological +tribologist +triboluminescence +triboluminescent +tribometer +tribonema +tribonemaceae +tribophysics +tribophosphorescence +tribophosphorescent +tribophosphoroscope +triborough +tribrac +tribrach +tribrachial +tribrachic +tribrachs +tribracteate +tribracteolate +tribromacetic +tribromid +tribromide +tribromoacetaldehyde +tribromoethanol +tribromophenol +tribromphenate +tribromphenol +tribual +tribually +tribular +tribulate +tribulation +tribulations +tribuloid +tribulus +tribuna +tribunal +tribunals +tribunary +tribunate +tribune +tribunes +tribuneship +tribunicial +tribunician +tribunitial +tribunitian +tribunitiary +tribunitive +tributable +tributary +tributaries +tributarily +tributariness +tribute +tributed +tributer +tributes +tributing +tributyrin +tributist +tributorian +trica +tricae +tricalcic +tricalcium +tricapsular +tricar +tricarballylic +tricarbimide +tricarbon +tricarboxylic +tricarinate +tricarinated +tricarpellary +tricarpellate +tricarpous +tricaudal +tricaudate +trice +triced +tricellular +tricenary +tricenaries +tricenarious +tricenarium +tricennial +tricentenary +tricentenarian +tricentennial +tricentennials +tricentral +tricephal +tricephalic +tricephalous +tricephalus +triceps +tricepses +triceratops +triceratopses +triceria +tricerion +tricerium +trices +trichatrophia +trichauxis +trichechidae +trichechine +trichechodont +trichechus +trichevron +trichi +trichy +trichia +trichiasis +trichilia +trichina +trichinae +trichinal +trichinas +trichinella +trichiniasis +trichiniferous +trichinisation +trichinise +trichinised +trichinising +trichinization +trichinize +trichinized +trichinizing +trichinoid +trichinophobia +trichinopoli +trichinopoly +trichinoscope +trichinoscopy +trichinosed +trichinoses +trichinosis +trichinotic +trichinous +trichion +trichions +trichite +trichites +trichitic +trichitis +trichiurid +trichiuridae +trichiuroid +trichiurus +trichlorethylene +trichlorethylenes +trichlorfon +trichlorid +trichloride +trichlormethane +trichloro +trichloroacetaldehyde +trichloroacetic +trichloroethane +trichloroethylene +trichloromethane +trichloromethanes +trichloromethyl +trichloronitromethane +trichobacteria +trichobezoar +trichoblast +trichobranchia +trichobranchiate +trichocarpous +trichocephaliasis +trichocephalus +trichocyst +trichocystic +trichoclasia +trichoclasis +trichode +trichoderma +trichodesmium +trichodontidae +trichoepithelioma +trichogen +trichogenous +trichogyne +trichogynial +trichogynic +trichoglossia +trichoglossidae +trichoglossinae +trichoglossine +trichogramma +trichogrammatidae +trichoid +tricholaena +trichology +trichological +trichologist +tricholoma +trichoma +trichomanes +trichomaphyte +trichomatose +trichomatosis +trichomatous +trichome +trichomes +trichomic +trichomycosis +trichomonacidal +trichomonacide +trichomonad +trichomonadal +trichomonadidae +trichomonal +trichomonas +trichomoniasis +trichonosis +trichonosus +trichonotid +trichopathy +trichopathic +trichopathophobia +trichophyllous +trichophyte +trichophytia +trichophytic +trichophyton +trichophytosis +trichophobia +trichophore +trichophoric +trichoplax +trichopore +trichopter +trichoptera +trichopteran +trichopterygid +trichopterygidae +trichopteron +trichopterous +trichord +trichorrhea +trichorrhexic +trichorrhexis +trichosanthes +trichoschisis +trichoschistic +trichoschistism +trichosis +trichosporange +trichosporangial +trichosporangium +trichosporum +trichostasis +trichostema +trichostrongyle +trichostrongylid +trichostrongylus +trichothallic +trichotillomania +trichotomy +trichotomic +trichotomies +trichotomism +trichotomist +trichotomize +trichotomous +trichotomously +trichroic +trichroism +trichromat +trichromate +trichromatic +trichromatism +trichromatist +trichromatopsia +trichrome +trichromic +trichronous +trichuriases +trichuriasis +trichuris +tricia +tricyanide +tricycle +tricycled +tricyclene +tricycler +tricycles +tricyclic +tricycling +tricyclist +tricing +tricinium +tricipital +tricircular +tricyrtis +trick +tricked +tricker +trickery +trickeries +trickers +trickful +tricky +trickie +trickier +trickiest +trickily +trickiness +tricking +trickingly +trickish +trickishly +trickishness +trickle +trickled +trickles +trickless +tricklet +trickly +tricklier +trickliest +tricklike +trickling +tricklingly +trickment +trickproof +tricks +tricksy +tricksical +tricksier +tricksiest +tricksily +tricksiness +tricksome +trickster +trickstering +tricksters +trickstress +tricktrack +triclad +tricladida +triclads +triclclinia +triclinate +triclinia +triclinial +tricliniarch +tricliniary +triclinic +triclinium +triclinohedric +tricoccose +tricoccous +tricolette +tricolic +tricolon +tricolor +tricolored +tricolors +tricolour +tricolumnar +tricompound +tricon +triconch +triconodon +triconodont +triconodonta +triconodonty +triconodontid +triconodontoid +triconsonantal +triconsonantalism +tricophorous +tricoryphean +tricorn +tricorne +tricornered +tricornes +tricorns +tricornute +tricorporal +tricorporate +tricosane +tricosanone +tricosyl +tricosylic +tricostate +tricot +tricotee +tricotyledonous +tricotine +tricots +tricouni +tricresol +tricrotic +tricrotism +tricrotous +tricrural +trictrac +trictracs +tricurvate +tricuspal +tricuspid +tricuspidal +tricuspidate +tricuspidated +tricussate +trid +tridacna +tridacnidae +tridactyl +tridactylous +tridaily +triddler +tridecane +tridecene +tridecyl +tridecilateral +tridecylene +tridecylic +tridecoic +trident +tridental +tridentate +tridentated +tridentiferous +tridentine +tridentinian +tridentlike +tridents +tridepside +tridermic +tridiagonal +tridiametral +tridiapason +tridigitate +tridii +tridimensional +tridimensionality +tridimensionally +tridimensioned +tridymite +tridynamous +tridiurnal +tridominium +tridra +tridrachm +triduam +triduan +triduo +triduum +triduums +triecious +trieciously +tried +triedly +triedness +trieennia +trielaidin +triene +trienes +triennia +triennial +trienniality +triennially +triennias +triennium +trienniums +triens +triental +trientalis +trientes +triequal +trier +trierarch +trierarchal +trierarchy +trierarchic +trierarchies +triers +trierucin +tries +trieteric +trieterics +triethanolamine +triethyl +triethylamine +triethylstibine +trifa +trifacial +trifanious +trifarious +trifasciated +trifecta +triferous +trifid +trifilar +trifistulary +triflagellate +trifle +trifled +trifledom +trifler +triflers +trifles +triflet +trifly +trifling +triflingly +triflingness +triflings +trifloral +triflorate +triflorous +trifluoperazine +trifluoride +trifluorochloromethane +trifluouride +trifluralin +trifocal +trifocals +trifoil +trifold +trifoly +trifoliate +trifoliated +trifoliolate +trifoliosis +trifolium +triforia +triforial +triforium +triform +triformed +triformin +triformity +triformous +trifornia +trifoveolate +trifuran +trifurcal +trifurcate +trifurcated +trifurcating +trifurcation +trig +triga +trigae +trigamy +trigamist +trigamous +trigatron +trigeminal +trigemini +trigeminous +trigeminus +trigeneric +trigesimal +trigged +trigger +triggered +triggerfish +triggerfishes +triggering +triggerless +triggerman +triggers +triggest +trigging +trigyn +trigynia +trigynian +trigynous +trigintal +trigintennial +trigla +triglandular +trigly +triglyceride +triglycerides +triglyceryl +triglid +triglidae +triglyph +triglyphal +triglyphed +triglyphic +triglyphical +triglyphs +triglochid +triglochin +triglot +trigness +trignesses +trigo +trigon +trygon +trigona +trigonal +trigonally +trigone +trigonella +trigonellin +trigonelline +trigoneutic +trigoneutism +trigonia +trigoniaceae +trigoniacean +trigoniaceous +trigonic +trigonid +trygonidae +trigoniidae +trigonite +trigonitis +trigonocephaly +trigonocephalic +trigonocephalous +trigonocephalus +trigonocerous +trigonododecahedron +trigonodont +trigonoid +trigonometer +trigonometry +trigonometria +trigonometric +trigonometrical +trigonometrically +trigonometrician +trigonometries +trigonon +trigonotype +trigonous +trigons +trigonum +trigos +trigram +trigrammatic +trigrammatism +trigrammic +trigrams +trigraph +trigraphic +trigraphs +trigs +triguttulate +trihalid +trihalide +trihedra +trihedral +trihedron +trihedrons +trihemeral +trihemimer +trihemimeral +trihemimeris +trihemiobol +trihemiobolion +trihemitetartemorion +trihybrid +trihydrate +trihydrated +trihydric +trihydride +trihydrol +trihydroxy +trihypostatic +trihoral +trihourly +tryhouse +trying +tryingly +tryingness +triiodomethane +triiodothyronine +trijet +trijets +trijugate +trijugous +trijunction +trikaya +trike +triker +trikeria +trikerion +triketo +triketone +trikir +trilabe +trilabiate +trilamellar +trilamellated +trilaminar +trilaminate +trilarcenous +trilateral +trilaterality +trilaterally +trilateralness +trilateration +trilaurin +trilby +trilbies +trilemma +trilinear +trilineate +trilineated +trilingual +trilingualism +trilingually +trilinguar +trilinolate +trilinoleate +trilinolenate +trilinolenin +trilisa +trilit +trilite +triliteral +triliteralism +triliterality +triliterally +triliteralness +trilith +trilithic +trilithon +trilium +trill +trillachan +trillado +trillando +trilled +triller +trillers +trillet +trilleto +trilletto +trilli +trilliaceae +trilliaceous +trillibub +trilliin +trillil +trilling +trillion +trillionaire +trillionize +trillions +trillionth +trillionths +trillium +trilliums +trillo +trilloes +trills +trilobal +trilobate +trilobated +trilobation +trilobe +trilobed +trilobita +trilobite +trilobitic +trilocular +triloculate +trilogy +trilogic +trilogical +trilogies +trilogist +trilophodon +trilophodont +triluminar +triluminous +trim +tryma +trimacer +trimacular +trimaculate +trimaculated +trimaran +trimarans +trimargarate +trimargarin +trimastigate +trymata +trimellic +trimellitic +trimembral +trimensual +trimer +trimera +trimercuric +trimeresurus +trimeric +trimeride +trimerite +trimerization +trimerous +trimers +trimesic +trimesyl +trimesinic +trimesitic +trimesitinic +trimester +trimesters +trimestral +trimestrial +trimetalism +trimetallic +trimetallism +trimeter +trimeters +trimethadione +trimethyl +trimethylacetic +trimethylamine +trimethylbenzene +trimethylene +trimethylglycine +trimethylmethane +trimethylstibine +trimethoxy +trimetric +trimetrical +trimetrogon +trimyristate +trimyristin +trimly +trimmed +trimmer +trimmers +trimmest +trimming +trimmingly +trimmings +trimness +trimnesses +trimodal +trimodality +trimolecular +trimonthly +trimoric +trimorph +trimorphic +trimorphism +trimorphous +trimorphs +trimotor +trimotored +trimotors +trims +tryms +trimscript +trimscripts +trimstone +trimtram +trimucronatus +trimurti +trimuscular +trin +trina +trinacrian +trinal +trinality +trinalize +trinary +trination +trinational +trinchera +trindle +trindled +trindles +trindling +trine +trined +trinely +trinervate +trinerve +trinerved +trines +trineural +tringa +tringine +tringle +tringoid +trinidad +trinidadian +trinidado +trinil +trining +trinitarian +trinitarianism +trinitarians +trinity +trinities +trinityhood +trinitytide +trinitrate +trinitration +trinitrid +trinitride +trinitrin +trinitro +trinitroaniline +trinitrobenzene +trinitrocarbolic +trinitrocellulose +trinitrocresol +trinitroglycerin +trinitromethane +trinitrophenylmethylnitramine +trinitrophenol +trinitroresorcin +trinitrotoluene +trinitrotoluol +trinitroxylene +trinitroxylol +trink +trinkerman +trinkermen +trinket +trinketed +trinketer +trinkety +trinketing +trinketry +trinketries +trinkets +trinkle +trinklement +trinklet +trinkum +trinkums +trinobantes +trinoctial +trinoctile +trinocular +trinodal +trinode +trinodine +trinol +trinomen +trinomial +trinomialism +trinomialist +trinomiality +trinomially +trinopticon +trinorantum +trinovant +trinovantes +trintle +trinucleate +trinucleotide +trinucleus +trinunity +trio +triobol +triobolon +trioctile +triocular +triode +triodes +triodia +triodion +triodon +triodontes +triodontidae +triodontoid +triodontoidea +triodontoidei +triodontophorus +trioecia +trioecious +trioeciously +trioecism +trioecs +trioicous +triol +triolcous +triole +trioleate +triolefin +triolefine +trioleic +triolein +triolet +triolets +triology +triols +trional +triones +trionfi +trionfo +trionychid +trionychidae +trionychoid +trionychoideachid +trionychoidean +trionym +trionymal +trionyx +trioperculate +triopidae +triops +trior +triorchis +triorchism +triorthogonal +trios +triose +trioses +triosteum +tryout +tryouts +triovulate +trioxazine +trioxid +trioxide +trioxides +trioxids +trioxymethylene +triozonid +triozonide +trip +tryp +trypa +tripack +tripacks +trypaflavine +tripal +tripaleolate +tripalmitate +tripalmitin +trypan +trypaneid +trypaneidae +trypanocidal +trypanocide +trypanolysin +trypanolysis +trypanolytic +trypanophobia +trypanosoma +trypanosomacidal +trypanosomacide +trypanosomal +trypanosomatic +trypanosomatidae +trypanosomatosis +trypanosomatous +trypanosome +trypanosomiasis +trypanosomic +tripara +tryparsamide +tripart +triparted +tripartedly +tripartible +tripartient +tripartite +tripartitely +tripartition +tripaschal +tripe +tripedal +tripel +tripelennamine +tripelike +tripeman +tripemonger +tripennate +tripenny +tripeptide +tripery +triperies +tripersonal +tripersonalism +tripersonalist +tripersonality +tripersonally +tripes +tripeshop +tripestone +trypeta +tripetaloid +tripetalous +trypetid +trypetidae +tripewife +tripewoman +triphammer +triphane +triphase +triphaser +triphasia +triphasic +tryphena +triphenyl +triphenylamine +triphenylated +triphenylcarbinol +triphenylmethane +triphenylmethyl +triphenylphosphine +triphibian +triphibious +triphyletic +triphyline +triphylite +triphyllous +triphysite +triphony +triphora +tryphosa +triphosphate +triphthong +triphthongal +tripy +trypiate +tripylaea +tripylaean +tripylarian +tripylean +tripinnate +tripinnated +tripinnately +tripinnatifid +tripinnatisect +tripyrenous +tripitaka +tripl +tripla +triplane +triplanes +triplaris +triplasian +triplasic +triple +tripleback +tripled +triplefold +triplegia +tripleness +tripler +triples +triplet +tripletail +tripletree +triplets +triplewise +triplex +triplexes +triplexity +triply +triplicate +triplicated +triplicately +triplicates +triplicating +triplication +triplications +triplicative +triplicature +triplice +triplicist +triplicity +triplicities +triplicostate +tripliform +triplinerved +tripling +triplite +triplites +triploblastic +triplocaulescent +triplocaulous +triplochitonaceae +triploid +triploidy +triploidic +triploidite +triploids +triplopy +triplopia +triplum +triplumbic +tripmadam +tripod +tripodal +trypodendron +tripody +tripodial +tripodian +tripodic +tripodical +tripodies +tripods +trypograph +trypographic +tripointed +tripolar +tripoli +tripoline +tripolis +tripolitan +tripolite +tripos +triposes +tripot +tripotage +tripotassium +tripoter +trippant +tripped +tripper +trippers +trippet +trippets +tripping +trippingly +trippingness +trippings +trippist +tripple +trippler +trips +tripsacum +tripsill +trypsin +trypsinize +trypsinogen +trypsins +tripsis +tripsome +tripsomely +tript +tryptamine +triptane +triptanes +tryptase +tripterous +tryptic +triptyca +triptycas +triptych +triptychs +triptyque +tryptogen +tryptone +tryptonize +tryptophan +tryptophane +triptote +tripudia +tripudial +tripudiant +tripudiary +tripudiate +tripudiation +tripudist +tripudium +tripunctal +tripunctate +tripwire +triquadrantal +triquet +triquetra +triquetral +triquetric +triquetrous +triquetrously +triquetrum +triquinate +triquinoyl +triradial +triradially +triradiate +triradiated +triradiately +triradiation +triradii +triradius +triradiuses +triratna +trirectangular +triregnum +trireme +triremes +trirhombohedral +trirhomboidal +triricinolein +trisaccharide +trisaccharose +trisacramentarian +trisagion +trysail +trysails +trisalt +trisazo +triscele +trisceles +trisceptral +trisect +trisected +trisecting +trisection +trisections +trisector +trisectrix +trisects +triseme +trisemes +trisemic +trisensory +trisepalous +triseptate +triserial +triserially +triseriate +triseriatim +trisetose +trisetum +trisha +trishaw +trishna +trisylabic +trisilane +trisilicane +trisilicate +trisilicic +trisyllabic +trisyllabical +trisyllabically +trisyllabism +trisyllabity +trisyllable +trisinuate +trisinuated +triskaidekaphobe +triskaidekaphobes +triskaidekaphobia +triskele +triskeles +triskelia +triskelion +trismegist +trismegistic +trismic +trismus +trismuses +trisoctahedral +trisoctahedron +trisodium +trisome +trisomes +trisomy +trisomic +trisomics +trisomies +trisonant +trisotropis +trispast +trispaston +trispermous +trispinose +trisplanchnic +trisporic +trisporous +trisquare +trist +tryst +tristachyous +tristam +tristan +tristania +tristate +triste +tryste +tristearate +tristearin +trysted +tristeness +tryster +trysters +trystes +tristesse +tristetrahedron +tristeza +tristezas +tristful +tristfully +tristfulness +tristich +tristichaceae +tristichic +tristichous +tristichs +tristigmatic +tristigmatose +tristyly +tristiloquy +tristylous +tristimulus +trysting +tristisonous +tristive +tristram +trysts +trisubstituted +trisubstitution +trisul +trisula +trisulc +trisulcate +trisulcated +trisulfate +trisulfid +trisulfide +trisulfone +trisulfoxid +trisulfoxide +trisulphate +trisulphid +trisulphide +trisulphone +trisulphonic +trisulphoxid +trisulphoxide +trit +tryt +tritactic +tritagonist +tritangent +tritangential +tritanope +tritanopia +tritanopic +tritanopsia +tritanoptic +tritaph +trite +triteleia +tritely +tritemorion +tritencephalon +triteness +triter +triternate +triternately +triterpene +triterpenoid +tritest +tritetartemorion +tritheism +tritheist +tritheistic +tritheistical +tritheite +tritheocracy +trithing +trithings +trithioaldehyde +trithiocarbonate +trithiocarbonic +trithionate +trithionates +trithionic +trithrinax +tritiate +tritiated +tritical +triticale +triticality +tritically +triticalness +triticeous +triticeum +triticin +triticism +triticoid +triticum +triticums +trityl +tritylodon +tritish +tritium +tritiums +tritocerebral +tritocerebrum +tritocone +tritoconid +tritogeneia +tritolo +tritoma +tritomas +tritomite +triton +tritonal +tritonality +tritone +tritones +tritoness +tritonia +tritonic +tritonidae +tritonymph +tritonymphal +tritonoid +tritonous +tritons +tritopatores +trytophan +tritopine +tritor +tritoral +tritorium +tritoxide +tritozooid +tritriacontane +trittichan +tritubercular +trituberculata +trituberculy +trituberculism +triturable +tritural +triturate +triturated +triturates +triturating +trituration +triturator +triturators +triturature +triture +triturium +triturus +triumf +triumfetta +triumph +triumphal +triumphance +triumphancy +triumphant +triumphantly +triumphator +triumphed +triumpher +triumphing +triumphs +triumphwise +triumvir +triumviral +triumvirate +triumvirates +triumviri +triumviry +triumvirs +triumvirship +triunal +triune +triunes +triungulin +triunification +triunion +triunitarian +triunity +triunities +triunsaturated +triurid +triuridaceae +triuridales +triuris +trivalence +trivalency +trivalent +trivalerin +trivalve +trivalves +trivalvular +trivant +trivantly +trivariant +trivat +triverbal +triverbial +trivet +trivets +trivette +trivetwise +trivia +trivial +trivialisation +trivialise +trivialised +trivialising +trivialism +trivialist +triviality +trivialities +trivialization +trivialize +trivializing +trivially +trivialness +trivirga +trivirgate +trivium +trivoltine +trivvet +triweekly +triweeklies +triweekliess +triwet +tryworks +trix +trixy +trixie +trizoic +trizomal +trizonal +trizone +trizonia +troad +troak +troaked +troaking +troaks +troat +trobador +troca +trocaical +trocar +trocars +troch +trocha +trochaic +trochaicality +trochaically +trochaics +trochal +trochalopod +trochalopoda +trochalopodous +trochanter +trochanteral +trochanteric +trochanterion +trochantin +trochantine +trochantinian +trochar +trochars +trochart +trochate +troche +trocheameter +troched +trochee +trocheeize +trochees +trochelminth +trochelminthes +troches +trocheus +trochi +trochid +trochidae +trochiferous +trochiform +trochil +trochila +trochili +trochilic +trochilics +trochilidae +trochilidine +trochilidist +trochiline +trochilopodous +trochilos +trochils +trochiluli +trochilus +troching +trochiscation +trochisci +trochiscus +trochisk +trochite +trochitic +trochius +trochlea +trochleae +trochlear +trochleary +trochleariform +trochlearis +trochleas +trochleate +trochleiform +trochocephaly +trochocephalia +trochocephalic +trochocephalus +trochodendraceae +trochodendraceous +trochodendron +trochoid +trochoidal +trochoidally +trochoides +trochoids +trochometer +trochophore +trochosphaera +trochosphaerida +trochosphere +trochospherical +trochozoa +trochozoic +trochozoon +trochus +trock +trocked +trockery +trocking +trocks +troco +troctolite +trod +trodden +trode +troegerite +troezenian +troffer +troffers +troft +trog +trogerite +trogger +troggin +troggs +troglodytal +troglodyte +troglodytes +troglodytic +troglodytical +troglodytidae +troglodytinae +troglodytish +troglodytism +trogon +trogones +trogonidae +trogoniformes +trogonoid +trogons +trogs +trogue +troy +troiades +troic +troika +troikas +troilism +troilite +troilites +troilus +troiluses +troynovant +trois +troys +troytown +trojan +trojans +troke +troked +troker +trokes +troking +troland +trolands +trolatitious +troll +trolldom +trolled +trolley +trolleybus +trolleyed +trolleyer +trolleyful +trolleying +trolleyman +trolleymen +trolleys +trolleite +troller +trollers +trollflower +trolly +trollied +trollies +trollying +trollyman +trollymen +trollimog +trolling +trollings +trollius +trollman +trollmen +trollol +trollop +trollopean +trollopeanism +trollopy +trollopian +trolloping +trollopish +trollops +trolls +tromba +trombash +trombe +trombiculid +trombidiasis +trombidiidae +trombidiosis +trombidium +trombone +trombones +trombony +trombonist +trombonists +trommel +trommels +tromometer +tromometry +tromometric +tromometrical +tromp +trompe +tromped +trompes +trompil +trompillo +tromping +tromple +tromps +tron +trona +tronador +tronage +tronas +tronc +trondhjemite +trone +troner +trones +tronk +troodont +trooly +troolie +troop +trooped +trooper +trooperess +troopers +troopfowl +troopial +troopials +trooping +troops +troopship +troopships +troopwise +trooshlach +troostite +troostitic +troot +trooz +trop +tropacocaine +tropaeola +tropaeolaceae +tropaeolaceous +tropaeoli +tropaeolin +tropaeolum +tropaeolums +tropaia +tropaion +tropal +tropary +troparia +troparion +tropate +trope +tropeic +tropein +tropeine +tropeolin +troper +tropes +tropesis +trophaea +trophaeum +trophal +trophallactic +trophallaxis +trophectoderm +trophedema +trophema +trophesy +trophesial +trophi +trophy +trophic +trophical +trophically +trophicity +trophied +trophies +trophying +trophyless +trophis +trophism +trophywort +trophobiont +trophobiosis +trophobiotic +trophoblast +trophoblastic +trophochromatin +trophocyte +trophoderm +trophodynamic +trophodynamics +trophodisc +trophogenesis +trophogeny +trophogenic +trophology +trophon +trophonema +trophoneurosis +trophoneurotic +trophonian +trophonucleus +trophopathy +trophophyte +trophophore +trophophorous +trophoplasm +trophoplasmatic +trophoplasmic +trophoplast +trophosomal +trophosome +trophosperm +trophosphere +trophospongia +trophospongial +trophospongium +trophospore +trophotaxis +trophotherapy +trophothylax +trophotropic +trophotropism +trophozoite +trophozooid +tropia +tropic +tropical +tropicalia +tropicalian +tropicalih +tropicalisation +tropicalise +tropicalised +tropicalising +tropicality +tropicalization +tropicalize +tropicalized +tropicalizing +tropically +tropicbird +tropicopolitan +tropics +tropidine +tropidoleptus +tropyl +tropin +tropine +tropines +tropins +tropism +tropismatic +tropisms +tropist +tropistic +tropocaine +tropocollagen +tropoyl +tropology +tropologic +tropological +tropologically +tropologies +tropologize +tropologized +tropologizing +tropometer +tropomyosin +tropopause +tropophil +tropophilous +tropophyte +tropophytic +troposphere +tropospheric +tropostereoscope +tropotaxis +troppaia +troppo +troptometer +trostera +trot +trotcozy +troth +trothed +trothful +trothing +trothless +trothlessness +trothlike +trothplight +troths +trotyl +trotyls +trotlet +trotline +trotlines +trotol +trots +trotskyism +trotted +trotter +trotters +trotteur +trotty +trottie +trotting +trottles +trottoir +trottoired +troubador +troubadour +troubadourish +troubadourism +troubadourist +troubadours +trouble +troubled +troubledly +troubledness +troublemaker +troublemakers +troublemaking +troublement +troubleproof +troubler +troublers +troubles +troubleshoot +troubleshooted +troubleshooter +troubleshooters +troubleshooting +troubleshoots +troubleshot +troublesome +troublesomely +troublesomeness +troublesshot +troubly +troubling +troublingly +troublous +troublously +troublousness +troue +trough +troughed +troughful +troughy +troughing +troughlike +troughs +troughster +troughway +troughwise +trounce +trounced +trouncer +trouncers +trounces +trouncing +troupand +troupe +trouped +trouper +troupers +troupes +troupial +troupials +trouping +trouse +trouser +trouserdom +trousered +trouserettes +trouserian +trousering +trouserless +trousers +trouss +trousse +trousseau +trousseaus +trousseaux +trout +troutbird +trouter +troutflower +troutful +trouty +troutier +troutiest +troutiness +troutless +troutlet +troutlike +troutling +trouts +trouv +trouvaille +trouvailles +trouvere +trouveres +trouveur +trouveurs +trouvre +trovatore +trove +troveless +trover +trovers +troves +trow +trowable +trowane +trowed +trowel +trowelbeak +troweled +troweler +trowelers +trowelful +troweling +trowelled +troweller +trowelling +trowelman +trowels +trowie +trowing +trowlesworthite +trowman +trows +trowsers +trowth +trowths +trp +trpset +trs +trt +truancy +truancies +truandise +truant +truantcy +truanted +truanting +truantism +truantly +truantlike +truantness +truantry +truantries +truants +truantship +trub +trubu +truce +trucebreaker +trucebreaking +truced +truceless +trucemaker +trucemaking +truces +trucha +truchman +trucial +trucidation +trucing +truck +truckage +truckages +truckdriver +trucked +trucker +truckers +truckful +truckie +trucking +truckings +truckle +truckled +truckler +trucklers +truckles +trucklike +truckline +truckling +trucklingly +truckload +truckloads +truckman +truckmaster +truckmen +trucks +truckster +truckway +truculence +truculency +truculent +truculental +truculently +truculentness +truddo +trudellite +trudge +trudged +trudgen +trudgens +trudgeon +trudgeons +trudger +trudgers +trudges +trudging +trudy +true +trueblue +trueblues +trueborn +truebred +trued +truehearted +trueheartedly +trueheartedness +trueing +truelike +truelove +trueloves +trueman +trueness +truenesses +truepenny +truer +trues +truest +truewood +truff +truffe +truffes +truffle +truffled +trufflelike +truffler +truffles +trufflesque +trug +trugmallion +truing +truish +truism +truismatic +truisms +truistic +truistical +truistically +truly +trull +trullan +truller +trulli +trullisatio +trullisatios +trullization +trullo +trulls +truman +trumbash +trumeau +trumeaux +trummel +trump +trumped +trumper +trumpery +trumperies +trumperiness +trumpet +trumpetbush +trumpeted +trumpeter +trumpeters +trumpetfish +trumpetfishes +trumpety +trumpeting +trumpetleaf +trumpetless +trumpetlike +trumpetry +trumpets +trumpetweed +trumpetwood +trumph +trumpie +trumping +trumpless +trumplike +trumps +trumscheit +trun +truncage +truncal +truncate +truncated +truncately +truncatella +truncatellidae +truncates +truncating +truncation +truncations +truncator +truncatorotund +truncatosinuate +truncature +trunch +trunched +truncheon +truncheoned +truncheoner +truncheoning +truncheons +truncher +trunchman +truncus +trundle +trundled +trundlehead +trundler +trundlers +trundles +trundleshot +trundletail +trundling +trunk +trunkback +trunked +trunkfish +trunkfishes +trunkful +trunkfuls +trunking +trunkless +trunkmaker +trunknose +trunks +trunkway +trunkwork +trunnel +trunnels +trunnion +trunnioned +trunnionless +trunnions +truong +trush +trusion +truss +trussed +trussell +trusser +trussery +trussers +trusses +trussing +trussings +trussmaker +trussmaking +trusswork +trust +trustability +trustable +trustableness +trustably +trustbuster +trustbusting +trusted +trustee +trusteed +trusteeing +trusteeism +trustees +trusteeship +trusteeships +trusteing +trusten +truster +trusters +trustful +trustfully +trustfulness +trusty +trustier +trusties +trustiest +trustify +trustification +trustified +trustifying +trustihood +trustily +trustiness +trusting +trustingly +trustingness +trustle +trustless +trustlessly +trustlessness +trustman +trustmen +trustmonger +trustor +trusts +trustwoman +trustwomen +trustworthy +trustworthier +trustworthiest +trustworthily +trustworthiness +truth +truthable +truthful +truthfully +truthfulness +truthy +truthify +truthiness +truthless +truthlessly +truthlessness +truthlike +truthlikeness +truths +truthsman +truthteller +truthtelling +trutinate +trutination +trutine +trutta +truttaceous +truvat +truxillic +truxillin +truxilline +ts +tsade +tsades +tsadi +tsadik +tsadis +tsamba +tsantsa +tsar +tsardom +tsardoms +tsarevitch +tsarevna +tsarevnas +tsarina +tsarinas +tsarism +tsarisms +tsarist +tsaristic +tsarists +tsaritza +tsaritzas +tsars +tsarship +tsatlee +tsattine +tscharik +tscheffkinite +tscherkess +tschernosem +tsere +tsessebe +tsetse +tsetses +tshi +tshiluba +tsi +tsia +tsiltaden +tsimmes +tsimshian +tsine +tsingtauite +tsiology +tsitsith +tsk +tsked +tsking +tsks +tsktsk +tsktsked +tsktsking +tsktsks +tsoneca +tsonecan +tsotsi +tsp +tss +tst +tsuba +tsubo +tsuga +tsukupin +tsuma +tsumebite +tsun +tsunami +tsunamic +tsunamis +tsungtu +tsures +tsuris +tsurugi +tsutsutsi +tswana +tty +tu +tua +tualati +tuamotu +tuamotuan +tuan +tuant +tuareg +tuarn +tuart +tuatara +tuataras +tuatera +tuateras +tuath +tub +tuba +tubae +tubage +tubal +tubaphone +tubar +tubaron +tubas +tubate +tubatoxin +tubatulabal +tubba +tubbable +tubbal +tubbeck +tubbed +tubber +tubbers +tubby +tubbie +tubbier +tubbiest +tubbiness +tubbing +tubbish +tubbist +tubboe +tube +tubectomy +tubectomies +tubed +tubeflower +tubeform +tubeful +tubehead +tubehearted +tubeless +tubelet +tubelike +tubemaker +tubemaking +tubeman +tubemen +tubenose +tuber +tuberaceae +tuberaceous +tuberales +tuberation +tubercle +tubercled +tuberclelike +tubercles +tubercula +tubercular +tubercularia +tuberculariaceae +tuberculariaceous +tubercularisation +tubercularise +tubercularised +tubercularising +tubercularization +tubercularize +tubercularized +tubercularizing +tubercularly +tubercularness +tuberculate +tuberculated +tuberculatedly +tuberculately +tuberculation +tuberculatogibbous +tuberculatonodose +tuberculatoradiate +tuberculatospinous +tubercule +tuberculed +tuberculid +tuberculide +tuberculiferous +tuberculiform +tuberculin +tuberculination +tuberculine +tuberculinic +tuberculinisation +tuberculinise +tuberculinised +tuberculinising +tuberculinization +tuberculinize +tuberculinized +tuberculinizing +tuberculisation +tuberculise +tuberculised +tuberculising +tuberculization +tuberculize +tuberculocele +tuberculocidin +tuberculoderma +tuberculoid +tuberculoma +tuberculomania +tuberculomas +tuberculomata +tuberculophobia +tuberculoprotein +tuberculose +tuberculosectorial +tuberculosed +tuberculoses +tuberculosis +tuberculotherapy +tuberculotherapist +tuberculotoxin +tuberculotrophic +tuberculous +tuberculously +tuberculousness +tuberculum +tuberiferous +tuberiform +tuberin +tuberization +tuberize +tuberless +tuberoid +tuberose +tuberoses +tuberosity +tuberosities +tuberous +tuberously +tuberousness +tubers +tuberuculate +tubes +tubesmith +tubesnout +tubework +tubeworks +tubfish +tubfishes +tubful +tubfuls +tubhunter +tubicen +tubicinate +tubicination +tubicola +tubicolae +tubicolar +tubicolous +tubicorn +tubicornous +tubifacient +tubifer +tubiferous +tubifex +tubifexes +tubificid +tubificidae +tubiflorales +tubiflorous +tubiform +tubig +tubik +tubilingual +tubinares +tubinarial +tubinarine +tubing +tubingen +tubings +tubiparous +tubipora +tubipore +tubiporid +tubiporidae +tubiporoid +tubiporous +tublet +tublike +tubmaker +tubmaking +tubman +tubmen +tuboabdominal +tubocurarine +tuboid +tubolabellate +tuboligamentous +tuboovarial +tuboovarian +tuboperitoneal +tuborrhea +tubotympanal +tubovaginal +tubs +tubster +tubtail +tubular +tubularia +tubulariae +tubularian +tubularida +tubularidan +tubulariidae +tubularity +tubularly +tubulate +tubulated +tubulates +tubulating +tubulation +tubulator +tubulature +tubule +tubules +tubulet +tubuli +tubulibranch +tubulibranchian +tubulibranchiata +tubulibranchiate +tubulidentata +tubulidentate +tubulifera +tubuliferan +tubuliferous +tubulifloral +tubuliflorous +tubuliform +tubulipora +tubulipore +tubuliporid +tubuliporidae +tubuliporoid +tubulization +tubulodermoid +tubuloracemose +tubulosaccular +tubulose +tubulostriato +tubulous +tubulously +tubulousness +tubulure +tubulures +tubulus +tubuphone +tubwoman +tucana +tucanae +tucandera +tucano +tuchis +tuchit +tuchun +tuchunate +tuchunism +tuchunize +tuchuns +tuck +tuckahoe +tuckahoes +tucked +tucker +tuckered +tuckering +tuckermanity +tuckers +tucket +tuckets +tucky +tucking +tuckner +tucks +tuckshop +tucktoo +tucotuco +tucson +tucum +tucuma +tucuman +tucuna +tucutucu +tudel +tudesque +tudor +tudoresque +tue +tuebor +tuedian +tueiron +tuesday +tuesdays +tufa +tufaceous +tufalike +tufan +tufas +tuff +tuffaceous +tuffet +tuffets +tuffing +tuffoon +tuffs +tuft +tuftaffeta +tufted +tufter +tufters +tufthunter +tufthunting +tufty +tuftier +tuftiest +tuftily +tufting +tuftlet +tufts +tug +tugboat +tugboatman +tugboatmen +tugboats +tugged +tugger +tuggery +tuggers +tugging +tuggingly +tughra +tugless +tuglike +tugman +tugrik +tugriks +tugs +tugui +tuguria +tugurium +tui +tuy +tuyer +tuyere +tuyeres +tuyers +tuik +tuilyie +tuille +tuilles +tuillette +tuilzie +tuinga +tuis +tuism +tuition +tuitional +tuitionary +tuitionless +tuitions +tuitive +tuyuneiri +tuke +tukra +tukuler +tukulor +tukutuku +tula +tuladi +tuladis +tulalip +tularaemia +tularaemic +tulare +tularemia +tularemic +tulasi +tulbaghia +tulcan +tulchan +tulchin +tule +tules +tuliac +tulip +tulipa +tulipant +tulipflower +tulipi +tulipy +tulipiferous +tulipist +tuliplike +tulipomania +tulipomaniac +tulips +tulipwood +tulisan +tulisanes +tulkepaia +tulle +tulles +tullian +tullibee +tullibees +tulnic +tulostoma +tulsa +tulsi +tulu +tulwar +tulwaur +tum +tumain +tumasha +tumatakuru +tumatukuru +tumbak +tumbaki +tumbek +tumbeki +tumbester +tumble +tumblebug +tumbled +tumbledown +tumbledung +tumblehome +tumbler +tumblerful +tumblerlike +tumblers +tumblerwise +tumbles +tumbleweed +tumbleweeds +tumbly +tumblification +tumbling +tumblingly +tumblings +tumboa +tumbrel +tumbrels +tumbril +tumbrils +tume +tumefacient +tumefaction +tumefactive +tumefy +tumefied +tumefies +tumefying +tumeric +tumescence +tumescent +tumfie +tumid +tumidily +tumidity +tumidities +tumidly +tumidness +tumion +tumli +tummals +tummed +tummel +tummeler +tummels +tummer +tummy +tummies +tumming +tummock +tummuler +tumor +tumoral +tumored +tumorigenic +tumorigenicity +tumorlike +tumorous +tumors +tumour +tumoured +tumours +tump +tumphy +tumpline +tumplines +tumps +tumtum +tumular +tumulary +tumulate +tumulation +tumuli +tumulose +tumulosity +tumulous +tumult +tumulter +tumults +tumultuary +tumultuaries +tumultuarily +tumultuariness +tumultuate +tumultuation +tumultuoso +tumultuous +tumultuously +tumultuousness +tumultus +tumulus +tumuluses +tumupasa +tun +tuna +tunability +tunable +tunableness +tunably +tunaburger +tunal +tunas +tunbelly +tunbellied +tunca +tund +tundagslatta +tundation +tunder +tundish +tundishes +tundra +tundras +tundun +tune +tuneable +tuneableness +tuneably +tunebo +tuned +tuneful +tunefully +tunefulness +tuneless +tunelessly +tunelessness +tunemaker +tunemaking +tuner +tuners +tunes +tunesmith +tunesome +tunester +tuneup +tuneups +tunful +tung +tunga +tungah +tungan +tungate +tungo +tungos +tungs +tungstate +tungsten +tungstenic +tungsteniferous +tungstenite +tungstens +tungstic +tungstite +tungstosilicate +tungstosilicic +tungstous +tungus +tungusian +tungusic +tunhoof +tuny +tunic +tunica +tunicae +tunican +tunicary +tunicata +tunicate +tunicated +tunicates +tunicin +tunicked +tunicle +tunicles +tunicless +tunics +tuniness +tuning +tunings +tunis +tunish +tunisia +tunisian +tunisians +tunist +tunk +tunka +tunker +tunket +tunland +tunlike +tunmoot +tunna +tunnage +tunnages +tunned +tunney +tunnel +tunneled +tunneler +tunnelers +tunneling +tunnelist +tunnelite +tunnelled +tunneller +tunnellers +tunnelly +tunnellike +tunnelling +tunnellite +tunnelmaker +tunnelmaking +tunnelman +tunnelmen +tunnels +tunnelway +tunner +tunnery +tunneries +tunny +tunnies +tunning +tunnit +tunnland +tunnor +tuno +tuns +tunu +tup +tupaia +tupaiid +tupaiidae +tupakihi +tupanship +tupara +tupek +tupelo +tupelos +tupi +tupian +tupik +tupiks +tupinamba +tupinaqui +tuple +tuples +tupman +tupmen +tupped +tuppence +tuppences +tuppeny +tuppenny +tupperian +tupperish +tupperism +tupperize +tupping +tups +tupuna +tuque +tuques +tuquoque +tur +turacin +turaco +turacos +turacou +turacous +turacoverdin +turacus +turakoo +turanian +turanianism +turanism +turanite +turanose +turb +turban +turbaned +turbanesque +turbanette +turbanless +turbanlike +turbanned +turbans +turbanto +turbantop +turbanwise +turbary +turbaries +turbeh +turbellaria +turbellarian +turbellariform +turbescency +turbeth +turbeths +turbid +turbidimeter +turbidimetry +turbidimetric +turbidimetrically +turbidite +turbidity +turbidities +turbidly +turbidness +turbinaceous +turbinage +turbinal +turbinals +turbinate +turbinated +turbination +turbinatocylindrical +turbinatoconcave +turbinatoglobose +turbinatostipitate +turbine +turbinectomy +turbined +turbinelike +turbinella +turbinellidae +turbinelloid +turbiner +turbines +turbinidae +turbiniform +turbinite +turbinoid +turbinotome +turbinotomy +turbit +turbith +turbiths +turbits +turbitteen +turble +turbo +turboalternator +turboblower +turbocar +turbocars +turbocharge +turbocharger +turbocompressor +turbodynamo +turboelectric +turboexciter +turbofan +turbofans +turbogenerator +turbojet +turbojets +turbomachine +turbomotor +turboprop +turboprops +turbopump +turbos +turboshaft +turbosupercharge +turbosupercharged +turbosupercharger +turbot +turbotlike +turbots +turboventilator +turbulator +turbulence +turbulency +turbulent +turbulently +turbulentness +turcian +turcic +turcification +turcism +turcize +turco +turcois +turcoman +turcophilism +turcopole +turcopolier +turd +turdetan +turdidae +turdiform +turdinae +turdine +turdoid +turds +turdus +tureen +tureenful +tureens +turf +turfage +turfdom +turfed +turfen +turfy +turfier +turfiest +turfiness +turfing +turfite +turfless +turflike +turfman +turfmen +turfs +turfski +turfskiing +turfskis +turfwise +turgency +turgencies +turgent +turgently +turgesce +turgesced +turgescence +turgescency +turgescent +turgescently +turgescible +turgescing +turgy +turgid +turgidity +turgidities +turgidly +turgidness +turgite +turgites +turgoid +turgor +turgors +turi +turicata +turing +turio +turion +turioniferous +turistas +turjaite +turjite +turk +turkana +turkdom +turkeer +turkey +turkeyback +turkeyberry +turkeybush +turkeydom +turkeyfish +turkeyfishes +turkeyfoot +turkeyism +turkeylike +turkeys +turken +turkery +turkess +turki +turkic +turkicize +turkify +turkification +turkis +turkish +turkishly +turkishness +turkism +turkize +turkle +turklike +turkman +turkmen +turkmenian +turkois +turkoises +turkology +turkologist +turkoman +turkomania +turkomanic +turkomanize +turkophil +turkophile +turkophilia +turkophilism +turkophobe +turkophobist +turks +turlough +turlupin +turm +turma +turmaline +turment +turmeric +turmerics +turmerol +turmet +turmit +turmoil +turmoiled +turmoiler +turmoiling +turmoils +turmut +turn +turnable +turnabout +turnabouts +turnagain +turnaround +turnarounds +turnaway +turnback +turnbout +turnbroach +turnbuckle +turnbuckles +turncap +turncoat +turncoatism +turncoats +turncock +turndown +turndowns +turndun +turned +turney +turnel +turner +turnera +turneraceae +turneraceous +turneresque +turnery +turnerian +turneries +turnerism +turnerite +turners +turngate +turnhall +turnhalle +turnhalls +turnices +turnicidae +turnicine +turnicomorphae +turnicomorphic +turning +turningness +turnings +turnip +turnipy +turniplike +turnips +turnipweed +turnipwise +turnipwood +turnix +turnkey +turnkeys +turnmeter +turnoff +turnoffs +turnor +turnout +turnouts +turnover +turnovers +turnpike +turnpiker +turnpikes +turnpin +turnplate +turnplough +turnplow +turnpoke +turnrow +turns +turnscrew +turnsheet +turnskin +turnsole +turnsoles +turnspit +turnspits +turnstile +turnstiles +turnstone +turntable +turntables +turntail +turntale +turnup +turnups +turnverein +turnway +turnwrest +turnwrist +turonian +turophile +turp +turpantineweed +turpentine +turpentined +turpentineweed +turpentiny +turpentinic +turpentining +turpentinous +turpeth +turpethin +turpeths +turpid +turpidly +turpify +turpinite +turpis +turpitude +turps +turquet +turquois +turquoise +turquoiseberry +turquoiselike +turquoises +turr +turrel +turrell +turret +turreted +turrethead +turreting +turretless +turretlike +turrets +turrical +turricle +turricula +turriculae +turricular +turriculate +turriculated +turriferous +turriform +turrigerous +turrilepas +turrilite +turrilites +turriliticone +turrilitidae +turrion +turrited +turritella +turritellid +turritellidae +turritelloid +turrum +turse +tursenoi +tursha +tursio +tursiops +turtan +turtle +turtleback +turtlebloom +turtled +turtledom +turtledove +turtledoved +turtledoves +turtledoving +turtlehead +turtleize +turtlelike +turtleneck +turtlenecks +turtlepeg +turtler +turtlers +turtles +turtlestone +turtlet +turtling +turtlings +turtosa +turtur +tururi +turus +turveydrop +turveydropdom +turveydropian +turves +turvy +turwar +tusayan +tuscan +tuscany +tuscanism +tuscanize +tuscanlike +tuscarora +tusche +tusches +tusculan +tush +tushed +tushepaw +tusher +tushery +tushes +tushy +tushie +tushies +tushing +tushs +tusk +tuskar +tusked +tuskegee +tusker +tuskers +tusky +tuskier +tuskiest +tusking +tuskish +tuskless +tusklike +tusks +tuskwise +tussah +tussahs +tussal +tussar +tussars +tusseh +tussehs +tusser +tussers +tussicular +tussilago +tussis +tussises +tussive +tussle +tussled +tussler +tussles +tussling +tussock +tussocked +tussocker +tussocky +tussocks +tussor +tussore +tussores +tussors +tussuck +tussucks +tussur +tussurs +tut +tutament +tutania +tutankhamen +tutball +tute +tutee +tutees +tutela +tutelae +tutelage +tutelages +tutelar +tutelary +tutelaries +tutelars +tutele +tutelo +tutenag +tutenague +tuth +tutin +tutiorism +tutiorist +tutler +tutly +tutman +tutmen +tutoyed +tutoiement +tutoyer +tutoyered +tutoyering +tutoyers +tutor +tutorage +tutorages +tutored +tutorer +tutoress +tutoresses +tutorhood +tutory +tutorial +tutorially +tutorials +tutoriate +tutoring +tutorism +tutorization +tutorize +tutorless +tutorly +tutors +tutorship +tutress +tutrice +tutrix +tuts +tutsan +tutster +tutted +tutti +tutty +tutties +tuttiman +tuttyman +tutting +tuttis +tutto +tutu +tutulus +tutus +tututni +tutwork +tutworker +tutworkman +tuum +tuwi +tux +tuxedo +tuxedoes +tuxedos +tuxes +tuza +tuzla +tuzzle +tv +twa +twaddell +twaddy +twaddle +twaddled +twaddledom +twaddleize +twaddlement +twaddlemonger +twaddler +twaddlers +twaddles +twaddlesome +twaddly +twaddlier +twaddliest +twaddling +twaddlingly +twae +twaes +twaesome +twafauld +twagger +tway +twayblade +twain +twains +twait +twaite +twal +twale +twalpenny +twalpennyworth +twalt +twana +twang +twanged +twanger +twangy +twangier +twangiest +twanginess +twanging +twangle +twangled +twangler +twanglers +twangles +twangling +twangs +twank +twankay +twanker +twanky +twankies +twanking +twankingly +twankle +twant +twarly +twas +twasome +twasomes +twat +twatchel +twats +twatterlight +twattle +twattled +twattler +twattles +twattling +twazzy +tweag +tweak +tweaked +tweaker +tweaky +tweakier +tweakiest +tweaking +tweaks +twee +tweed +tweeded +tweedy +tweedier +tweediest +tweediness +tweedle +tweedled +tweedledee +tweedledum +tweedles +tweedling +tweeds +tweeg +tweel +tween +tweeny +tweenies +tweenlight +tweese +tweesh +tweesht +tweest +tweet +tweeted +tweeter +tweeters +tweeting +tweets +tweeze +tweezed +tweezer +tweezered +tweezering +tweezers +tweezes +tweezing +tweyfold +tweil +twelfhynde +twelfhyndeman +twelfth +twelfthly +twelfths +twelfthtide +twelve +twelvefold +twelvehynde +twelvehyndeman +twelvemo +twelvemonth +twelvemonths +twelvemos +twelvepence +twelvepenny +twelves +twelvescore +twenty +twenties +twentieth +twentiethly +twentieths +twentyfold +twentyfourmo +twentymo +twentypenny +twere +twerp +twerps +twi +twibil +twibill +twibilled +twibills +twibils +twyblade +twice +twicer +twicet +twichild +twick +twiddle +twiddled +twiddler +twiddlers +twiddles +twiddly +twiddling +twie +twier +twyer +twiers +twyers +twifallow +twifoil +twifold +twifoldly +twig +twigful +twigged +twiggen +twigger +twiggy +twiggier +twiggiest +twigginess +twigging +twigless +twiglet +twiglike +twigs +twigsome +twigwithy +twyhynde +twilight +twilighty +twilightless +twilightlike +twilights +twilit +twill +twilled +twiller +twilly +twilling +twillings +twills +twilt +twin +twinable +twinberry +twinberries +twinborn +twindle +twine +twineable +twinebush +twined +twineless +twinelike +twinemaker +twinemaking +twiner +twiners +twines +twinflower +twinfold +twinge +twinged +twingeing +twinges +twinging +twingle +twinhood +twiny +twinier +twiniest +twinight +twinighter +twinighters +twining +twiningly +twinism +twink +twinkle +twinkled +twinkledum +twinkleproof +twinkler +twinklers +twinkles +twinkless +twinkly +twinkling +twinklingly +twinleaf +twinly +twinlike +twinling +twinned +twinner +twinness +twinning +twinnings +twins +twinship +twinships +twinsomeness +twint +twinter +twire +twirk +twirl +twirled +twirler +twirlers +twirly +twirlier +twirliest +twirligig +twirling +twirls +twirp +twirps +twiscar +twisel +twist +twistability +twistable +twisted +twistedly +twistened +twister +twisterer +twisters +twisthand +twisty +twistical +twistification +twistily +twistiness +twisting +twistingly +twistings +twistiways +twistiwise +twistle +twistless +twists +twit +twitch +twitched +twitchel +twitcheling +twitcher +twitchers +twitches +twitchet +twitchety +twitchfire +twitchy +twitchier +twitchiest +twitchily +twitchiness +twitching +twitchingly +twite +twitlark +twits +twitted +twitten +twitter +twitteration +twitterboned +twittered +twitterer +twittery +twittering +twitteringly +twitterly +twitters +twitty +twitting +twittingly +twittle +twyver +twixt +twixtbrain +twizzened +twizzle +two +twodecker +twoes +twofer +twofers +twofold +twofoldly +twofoldness +twofolds +twohandedness +twolegged +twoling +twoness +twopence +twopences +twopenny +twos +twoscore +twosome +twosomes +twp +tx +txt +tzaam +tzaddik +tzaddikim +tzapotec +tzar +tzardom +tzardoms +tzarevich +tzarevitch +tzarevna +tzarevnas +tzarina +tzarinas +tzarism +tzarisms +tzarist +tzaristic +tzarists +tzaritza +tzaritzas +tzars +tzedakah +tzendal +tzental +tzetse +tzetze +tzetzes +tzigane +tziganes +tzimmes +tzitzis +tzitzith +tzolkin +tzontle +tzotzil +tzuris +tzutuhil +u +uayeb +uakari +ualis +uang +uaraycu +uarekena +uaupe +ubangi +ubbenite +ubbonite +ubc +uberant +uberous +uberously +uberousness +uberrima +uberty +uberties +ubi +ubication +ubiety +ubieties +ubii +ubiquarian +ubique +ubiquious +ubiquist +ubiquit +ubiquitary +ubiquitarian +ubiquitarianism +ubiquitaries +ubiquitariness +ubiquity +ubiquities +ubiquitism +ubiquitist +ubiquitous +ubiquitously +ubiquitousness +ubound +ubussu +uc +uca +ucayale +ucal +uchean +uchee +uckers +uckia +ucuuba +ud +udal +udaler +udaller +udalman +udasi +udder +uddered +udderful +udderless +udderlike +udders +udell +udi +udic +udish +udo +udographic +udolphoish +udom +udometer +udometers +udometry +udometric +udometries +udomograph +udos +uds +ueueteotl +ufer +ufo +ufology +ufologies +ufologist +ufos +ufs +ug +ugali +uganda +ugandan +ugandans +ugaritic +ugarono +ugglesome +ugh +ughs +ughten +ugli +ugly +uglier +ugliest +uglify +uglification +uglified +uglifier +uglifiers +uglifies +uglifying +uglily +ugliness +uglinesses +uglis +uglisome +ugrian +ugrianize +ugric +ugroid +ugsome +ugsomely +ugsomeness +ugt +uh +uhlan +uhlans +uhllo +uhs +uhtensang +uhtsong +uhuru +ui +uighur +uigur +uigurian +uiguric +uily +uinal +uinta +uintahite +uintaite +uintaites +uintathere +uintatheriidae +uintatherium +uintjie +uirina +uit +uitlander +uitotan +uitspan +uji +ukase +ukases +uke +ukelele +ukeleles +ukes +ukiyoe +ukiyoye +ukraine +ukrainer +ukrainian +ukrainians +ukranian +ukulele +ukuleles +ula +ulama +ulamas +ulan +ulans +ulatrophy +ulatrophia +ulaula +ulcer +ulcerable +ulcerate +ulcerated +ulcerates +ulcerating +ulceration +ulcerations +ulcerative +ulcered +ulcery +ulcering +ulceromembranous +ulcerous +ulcerously +ulcerousness +ulcers +ulcus +ulcuscle +ulcuscule +ule +ulema +ulemas +ulemorrhagia +ulerythema +uletic +ulex +ulexine +ulexite +ulexites +ulicon +ulidia +ulidian +uliginose +uliginous +ulyssean +ulysses +ulitis +ull +ulla +ullage +ullaged +ullages +ullagone +uller +ulling +ullmannite +ulluco +ullucu +ulmaceae +ulmaceous +ulmaria +ulmate +ulmic +ulmin +ulminic +ulmo +ulmous +ulmus +ulna +ulnad +ulnae +ulnage +ulnar +ulnare +ulnaria +ulnas +ulnocarpal +ulnocondylar +ulnometacarpal +ulnoradial +uloborid +uloboridae +uloborus +ulocarcinoma +uloid +ulonata +uloncus +ulophocinae +ulorrhagy +ulorrhagia +ulorrhea +ulothrix +ulotrichaceae +ulotrichaceous +ulotrichales +ulotrichan +ulotriches +ulotrichi +ulotrichy +ulotrichous +ulpan +ulpanim +ulrichite +ulster +ulstered +ulsterette +ulsterian +ulstering +ulsterite +ulsterman +ulsters +ult +ulta +ulterior +ulteriorly +ultima +ultimacy +ultimacies +ultimas +ultimata +ultimate +ultimated +ultimately +ultimateness +ultimates +ultimating +ultimation +ultimatum +ultimatums +ultime +ultimity +ultimo +ultimobranchial +ultimogenitary +ultimogeniture +ultimum +ultion +ulto +ultonian +ultra +ultrabasic +ultrabasite +ultrabelieving +ultrabenevolent +ultrabrachycephaly +ultrabrachycephalic +ultrabrilliant +ultracentenarian +ultracentenarianism +ultracentralizer +ultracentrifugal +ultracentrifugally +ultracentrifugation +ultracentrifuge +ultracentrifuged +ultracentrifuging +ultraceremonious +ultrachurchism +ultracivil +ultracomplex +ultraconcomitant +ultracondenser +ultraconfident +ultraconscientious +ultraconservatism +ultraconservative +ultraconservatives +ultracordial +ultracosmopolitan +ultracredulous +ultracrepidarian +ultracrepidarianism +ultracrepidate +ultracritical +ultradandyism +ultradeclamatory +ultrademocratic +ultradespotic +ultradignified +ultradiscipline +ultradolichocephaly +ultradolichocephalic +ultradolichocranial +ultradry +ultraeducationist +ultraeligible +ultraelliptic +ultraemphasis +ultraenergetic +ultraenforcement +ultraenthusiasm +ultraenthusiastic +ultraepiscopal +ultraevangelical +ultraexcessive +ultraexclusive +ultraexpeditious +ultrafantastic +ultrafashionable +ultrafast +ultrafastidious +ultrafederalist +ultrafeudal +ultrafiche +ultrafiches +ultrafidian +ultrafidianism +ultrafilter +ultrafilterability +ultrafilterable +ultrafiltrate +ultrafiltration +ultraformal +ultrafrivolous +ultragallant +ultragaseous +ultragenteel +ultragood +ultragrave +ultrahazardous +ultraheroic +ultrahigh +ultrahonorable +ultrahot +ultrahuman +ultraimperialism +ultraimperialist +ultraimpersonal +ultrainclusive +ultraindifferent +ultraindulgent +ultraingenious +ultrainsistent +ultraintimate +ultrainvolved +ultrayoung +ultraism +ultraisms +ultraist +ultraistic +ultraists +ultralaborious +ultralegality +ultralenient +ultraliberal +ultraliberalism +ultralogical +ultraloyal +ultralow +ultraluxurious +ultramarine +ultramasculine +ultramasculinity +ultramaternal +ultramaximal +ultramelancholy +ultrametamorphism +ultramicro +ultramicrobe +ultramicrochemical +ultramicrochemist +ultramicrochemistry +ultramicrometer +ultramicron +ultramicroscope +ultramicroscopy +ultramicroscopic +ultramicroscopical +ultramicroscopically +ultramicrotome +ultraminiature +ultraminute +ultramoderate +ultramodern +ultramodernism +ultramodernist +ultramodernistic +ultramodest +ultramontane +ultramontanism +ultramontanist +ultramorose +ultramulish +ultramundane +ultranational +ultranationalism +ultranationalist +ultranationalistic +ultranationalistically +ultranatural +ultranegligent +ultranet +ultranice +ultranonsensical +ultraobscure +ultraobstinate +ultraofficious +ultraoptimistic +ultraorganized +ultraornate +ultraorthodox +ultraorthodoxy +ultraoutrageous +ultrapapist +ultraparallel +ultraperfect +ultrapersuasive +ultraphotomicrograph +ultrapious +ultraplanetary +ultraplausible +ultrapopish +ultraproud +ultraprudent +ultrapure +ultraradical +ultraradicalism +ultrarapid +ultrareactionary +ultrared +ultrareds +ultrarefined +ultrarefinement +ultrareligious +ultraremuneration +ultrarepublican +ultrarevolutionary +ultrarevolutionist +ultraritualism +ultraroyalism +ultraroyalist +ultraromantic +ultras +ultrasanguine +ultrascholastic +ultrasecret +ultraselect +ultraservile +ultrasevere +ultrashort +ultrashrewd +ultrasimian +ultrasystematic +ultrasmart +ultrasolemn +ultrasonic +ultrasonically +ultrasonics +ultrasonogram +ultrasonography +ultrasound +ultraspartan +ultraspecialization +ultraspiritualism +ultrasplendid +ultrastandardization +ultrastellar +ultrasterile +ultrastylish +ultrastrenuous +ultrastrict +ultrastructural +ultrastructure +ultrasubtle +ultrasuede +ultratechnical +ultratense +ultraterrene +ultraterrestrial +ultratotal +ultratrivial +ultratropical +ultraugly +ultrauncommon +ultraurgent +ultravicious +ultraviolent +ultraviolet +ultravirtuous +ultravirus +ultraviruses +ultravisible +ultrawealthy +ultrawise +ultrazealous +ultrazealousness +ultrazodiacal +ultroneous +ultroneously +ultroneousness +ulu +ulua +uluhi +ululant +ululate +ululated +ululates +ululating +ululation +ululations +ululative +ululatory +ululu +ulus +ulva +ulvaceae +ulvaceous +ulvales +ulvan +ulvas +um +umangite +umangites +umatilla +umaua +umbecast +umbeclad +umbel +umbelap +umbeled +umbella +umbellales +umbellar +umbellate +umbellated +umbellately +umbelled +umbellet +umbellets +umbellic +umbellifer +umbelliferae +umbelliferone +umbelliferous +umbelliflorous +umbelliform +umbelloid +umbellula +umbellularia +umbellulate +umbellule +umbellulidae +umbelluliferous +umbels +umbelwort +umber +umbered +umberima +umbering +umbers +umberty +umbeset +umbethink +umbibilici +umbilectomy +umbilic +umbilical +umbilically +umbilicar +umbilicaria +umbilicate +umbilicated +umbilication +umbilici +umbiliciform +umbilicus +umbilicuses +umbiliform +umbilroot +umble +umbles +umbo +umbolateral +umbonal +umbonate +umbonated +umbonation +umbone +umbones +umbonial +umbonic +umbonulate +umbonule +umbos +umbra +umbracious +umbraciousness +umbracle +umbraculate +umbraculiferous +umbraculiform +umbraculum +umbrae +umbrage +umbrageous +umbrageously +umbrageousness +umbrages +umbraid +umbral +umbrally +umbrana +umbras +umbrate +umbrated +umbratic +umbratical +umbratile +umbre +umbrel +umbrella +umbrellaed +umbrellaing +umbrellaless +umbrellalike +umbrellas +umbrellawise +umbrellawort +umbrere +umbret +umbrette +umbrettes +umbrian +umbriel +umbriferous +umbriferously +umbriferousness +umbril +umbrina +umbrine +umbrose +umbrosity +umbrous +umbundu +ume +umest +umfaan +umgang +umiac +umiack +umiacks +umiacs +umiak +umiaks +umiaq +umiaqs +umimpeded +umiri +umist +umland +umlaut +umlauted +umlauting +umlauts +umload +umm +ummps +umouhile +ump +umped +umph +umpy +umping +umpirage +umpirages +umpire +umpired +umpirer +umpires +umpireship +umpiress +umpiring +umpirism +umppired +umppiring +umpqua +umps +umpsteen +umpteen +umpteens +umpteenth +umptekite +umpty +umptieth +umquhile +umset +umstroke +umteen +umteenth +umu +un +una +unabandoned +unabandoning +unabased +unabasedly +unabashable +unabashed +unabashedly +unabasing +unabatable +unabated +unabatedly +unabating +unabatingly +unabbreviated +unabdicated +unabdicating +unabdicative +unabducted +unabetted +unabettedness +unabetting +unabhorred +unabhorrently +unabiding +unabidingly +unabidingness +unability +unabject +unabjective +unabjectly +unabjectness +unabjuratory +unabjured +unablative +unable +unableness +unably +unabnegated +unabnegating +unabolishable +unabolished +unaborted +unabortive +unabortively +unabortiveness +unabraded +unabrased +unabrasive +unabrasively +unabridgable +unabridged +unabrogable +unabrogated +unabrogative +unabrupt +unabruptly +unabscessed +unabsent +unabsentmindedness +unabsolute +unabsolvable +unabsolved +unabsolvedness +unabsorb +unabsorbable +unabsorbed +unabsorbent +unabsorbing +unabsorbingly +unabsorptiness +unabsorptive +unabsorptiveness +unabstemious +unabstemiously +unabstemiousness +unabstentious +unabstract +unabstracted +unabstractedly +unabstractedness +unabstractive +unabstractively +unabsurd +unabundance +unabundant +unabundantly +unabusable +unabused +unabusive +unabusively +unabusiveness +unabutting +unacademic +unacademical +unacademically +unacceding +unaccelerated +unaccelerative +unaccent +unaccented +unaccentuated +unaccept +unacceptability +unacceptable +unacceptableness +unacceptably +unacceptance +unacceptant +unaccepted +unaccepting +unaccessibility +unaccessible +unaccessibleness +unaccessibly +unaccessional +unaccessory +unaccidental +unaccidentally +unaccidented +unacclaimate +unacclaimed +unacclimated +unacclimation +unacclimatised +unacclimatization +unacclimatized +unacclivitous +unacclivitously +unaccommodable +unaccommodated +unaccommodatedness +unaccommodating +unaccommodatingly +unaccommodatingness +unaccompanable +unaccompanied +unaccompanying +unaccomplishable +unaccomplished +unaccomplishedness +unaccord +unaccordable +unaccordance +unaccordant +unaccorded +unaccording +unaccordingly +unaccostable +unaccosted +unaccountability +unaccountable +unaccountableness +unaccountably +unaccounted +unaccoutered +unaccoutred +unaccreditated +unaccredited +unaccrued +unaccumulable +unaccumulate +unaccumulated +unaccumulation +unaccumulative +unaccumulatively +unaccumulativeness +unaccuracy +unaccurate +unaccurately +unaccurateness +unaccursed +unaccusable +unaccusably +unaccuse +unaccused +unaccusing +unaccusingly +unaccustom +unaccustomed +unaccustomedly +unaccustomedness +unacerbic +unacerbically +unacetic +unachievability +unachievable +unachieved +unaching +unachingly +unacidic +unacidulated +unacknowledged +unacknowledgedness +unacknowledging +unacknowledgment +unacoustic +unacoustical +unacoustically +unacquaint +unacquaintable +unacquaintance +unacquainted +unacquaintedly +unacquaintedness +unacquiescent +unacquiescently +unacquirability +unacquirable +unacquirableness +unacquirably +unacquired +unacquisitive +unacquisitively +unacquisitiveness +unacquit +unacquittable +unacquitted +unacquittedness +unacrimonious +unacrimoniously +unacrimoniousness +unact +unactability +unactable +unacted +unacting +unactinic +unaction +unactionable +unactivated +unactive +unactively +unactiveness +unactivity +unactorlike +unactual +unactuality +unactually +unactuated +unacuminous +unacute +unacutely +unadamant +unadapt +unadaptability +unadaptable +unadaptableness +unadaptably +unadaptabness +unadapted +unadaptedly +unadaptedness +unadaptive +unadaptively +unadaptiveness +unadd +unaddable +unadded +unaddible +unaddicted +unaddictedness +unadditional +unadditioned +unaddled +unaddress +unaddressed +unadduceable +unadduced +unadducible +unadept +unadeptly +unadeptness +unadequate +unadequately +unadequateness +unadherence +unadherent +unadherently +unadhering +unadhesive +unadhesively +unadhesiveness +unadjacent +unadjacently +unadjectived +unadjoined +unadjoining +unadjourned +unadjournment +unadjudged +unadjudicated +unadjunctive +unadjunctively +unadjust +unadjustable +unadjustably +unadjusted +unadjustment +unadministered +unadministrable +unadministrative +unadministratively +unadmirable +unadmirableness +unadmirably +unadmire +unadmired +unadmiring +unadmiringly +unadmissible +unadmissibleness +unadmissibly +unadmission +unadmissive +unadmittable +unadmittableness +unadmittably +unadmitted +unadmittedly +unadmitting +unadmonished +unadmonitory +unadopt +unadoptable +unadoptably +unadopted +unadoption +unadoptional +unadoptive +unadoptively +unadorable +unadorableness +unadorably +unadoration +unadored +unadoring +unadoringly +unadorn +unadornable +unadorned +unadornedly +unadornedness +unadornment +unadroit +unadroitly +unadroitness +unadulating +unadulatory +unadult +unadulterate +unadulterated +unadulteratedly +unadulteratedness +unadulterately +unadulteration +unadulterous +unadulterously +unadvanced +unadvancedly +unadvancedness +unadvancement +unadvancing +unadvantaged +unadvantageous +unadvantageously +unadvantageousness +unadventured +unadventuring +unadventurous +unadventurously +unadventurousness +unadverse +unadversely +unadverseness +unadvertency +unadvertised +unadvertisement +unadvertising +unadvisability +unadvisable +unadvisableness +unadvisably +unadvised +unadvisedly +unadvisedness +unadvocated +unaerated +unaesthetic +unaesthetical +unaesthetically +unaestheticism +unaestheticness +unafeard +unafeared +unaffability +unaffable +unaffableness +unaffably +unaffectation +unaffected +unaffectedly +unaffectedness +unaffecting +unaffectionate +unaffectionately +unaffectionateness +unaffectioned +unaffianced +unaffied +unaffiliated +unaffiliation +unaffirmation +unaffirmed +unaffixed +unafflicted +unafflictedly +unafflictedness +unafflicting +unaffliction +unaffordable +unafforded +unaffranchised +unaffrighted +unaffrightedly +unaffronted +unafire +unafloat +unaflow +unafraid +unafraidness +unaged +unageing +unagglomerative +unaggravated +unaggravating +unaggregated +unaggression +unaggressive +unaggressively +unaggressiveness +unaghast +unagile +unagilely +unagility +unaging +unagitated +unagitatedly +unagitatedness +unagitation +unagonize +unagrarian +unagreeable +unagreeableness +unagreeably +unagreed +unagreeing +unagreement +unagricultural +unagriculturally +unai +unaidable +unaided +unaidedly +unaiding +unailing +unaimed +unaiming +unairable +unaired +unairily +unais +unaisled +unakhotana +unakin +unakite +unal +unalachtigo +unalacritous +unalarm +unalarmed +unalarming +unalarmingly +unalaska +unalcoholised +unalcoholized +unaldermanly +unalert +unalerted +unalertly +unalertness +unalgebraical +unalienability +unalienable +unalienableness +unalienably +unalienated +unalienating +unalignable +unaligned +unalike +unalimentary +unalimentative +unalist +unalive +unallayable +unallayably +unallayed +unalleged +unallegedly +unallegorical +unallegorically +unallegorized +unallergic +unalleviably +unalleviated +unalleviatedly +unalleviating +unalleviatingly +unalleviation +unalleviative +unalliable +unallied +unalliedly +unalliedness +unalliterated +unalliterative +unallocated +unalloyed +unallotment +unallotted +unallow +unallowable +unallowably +unallowed +unallowedly +unallowing +unallurable +unallured +unalluring +unalluringly +unallusive +unallusively +unallusiveness +unalmsed +unalone +unaloud +unalphabeted +unalphabetic +unalphabetical +unalphabetised +unalphabetized +unalterability +unalterable +unalterableness +unalterably +unalteration +unalterative +unaltered +unaltering +unalternated +unalternating +unaltruistic +unaltruistically +unamalgamable +unamalgamated +unamalgamating +unamalgamative +unamassed +unamative +unamatively +unamazed +unamazedly +unamazedness +unamazement +unambidextrousness +unambient +unambiently +unambiguity +unambiguous +unambiguously +unambiguousness +unambition +unambitious +unambitiously +unambitiousness +unambrosial +unambulant +unambush +unameliorable +unameliorated +unameliorative +unamenability +unamenable +unamenableness +unamenably +unamend +unamendable +unamended +unamendedly +unamending +unamendment +unamerceable +unamerced +unami +unamiability +unamiable +unamiableness +unamiably +unamicability +unamicable +unamicableness +unamicably +unamiss +unammoniated +unamo +unamorous +unamorously +unamorousness +unamortization +unamortized +unample +unamply +unamplifiable +unamplified +unamputated +unamputative +unamusable +unamusably +unamused +unamusement +unamusing +unamusingly +unamusingness +unamusive +unanachronistic +unanachronistical +unanachronistically +unanachronous +unanachronously +unanaemic +unanalagous +unanalagously +unanalagousness +unanalytic +unanalytical +unanalytically +unanalyzable +unanalyzably +unanalyzed +unanalyzing +unanalogical +unanalogically +unanalogized +unanalogous +unanalogously +unanalogousness +unanarchic +unanarchistic +unanatomisable +unanatomised +unanatomizable +unanatomized +unancestored +unancestried +unanchylosed +unanchor +unanchored +unanchoring +unanchors +unancient +unanecdotal +unanecdotally +unaneled +unanemic +unangelic +unangelical +unangelicalness +unangered +unangry +unangrily +unanguished +unangular +unangularly +unangularness +unanimalized +unanimate +unanimated +unanimatedly +unanimatedness +unanimately +unanimating +unanimatingly +unanime +unanimism +unanimist +unanimistic +unanimistically +unanimiter +unanimity +unanimities +unanimous +unanimously +unanimousness +unannealed +unannex +unannexable +unannexed +unannexedly +unannexedness +unannihilable +unannihilated +unannihilative +unannihilatory +unannoyed +unannoying +unannoyingly +unannotated +unannounced +unannullable +unannulled +unannunciable +unannunciative +unanointed +unanswerability +unanswerable +unanswerableness +unanswerably +unanswered +unanswering +unantagonisable +unantagonised +unantagonising +unantagonistic +unantagonizable +unantagonized +unantagonizing +unanthologized +unanticipated +unanticipatedly +unanticipating +unanticipatingly +unanticipation +unanticipative +unantiquated +unantiquatedness +unantique +unantiquity +unantlered +unanxiety +unanxious +unanxiously +unanxiousness +unapart +unaphasic +unapocryphal +unapologetic +unapologetically +unapologizing +unapostatized +unapostolic +unapostolical +unapostolically +unapostrophized +unappalled +unappalling +unappallingly +unapparel +unappareled +unapparelled +unapparent +unapparently +unapparentness +unappealable +unappealableness +unappealably +unappealed +unappealing +unappealingly +unappealingness +unappeasable +unappeasableness +unappeasably +unappeased +unappeasedly +unappeasedness +unappeasing +unappeasingly +unappendaged +unappended +unapperceived +unapperceptive +unappertaining +unappetising +unappetisingly +unappetizing +unappetizingly +unapplaudable +unapplauded +unapplauding +unapplausive +unappliable +unappliableness +unappliably +unapplianced +unapplicability +unapplicable +unapplicableness +unapplicably +unapplicative +unapplied +unapplying +unappliqued +unappoint +unappointable +unappointableness +unappointed +unapportioned +unapposable +unapposite +unappositely +unappositeness +unappraised +unappreciable +unappreciableness +unappreciably +unappreciated +unappreciating +unappreciation +unappreciative +unappreciatively +unappreciativeness +unapprehendable +unapprehendableness +unapprehendably +unapprehended +unapprehending +unapprehendingness +unapprehensible +unapprehensibleness +unapprehension +unapprehensive +unapprehensively +unapprehensiveness +unapprenticed +unapprised +unapprisedly +unapprisedness +unapprized +unapproachability +unapproachable +unapproachableness +unapproachably +unapproached +unapproaching +unapprobation +unappropriable +unappropriate +unappropriated +unappropriately +unappropriateness +unappropriation +unapprovable +unapprovableness +unapprovably +unapproved +unapproving +unapprovingly +unapproximate +unapproximately +unaproned +unapropos +unapt +unaptitude +unaptly +unaptness +unarbitrary +unarbitrarily +unarbitrariness +unarbitrated +unarbitrative +unarbored +unarboured +unarch +unarchdeacon +unarched +unarching +unarchitected +unarchitectural +unarchitecturally +unarchly +unarduous +unarduously +unarduousness +unarguable +unarguableness +unarguably +unargued +unarguing +unargumentative +unargumentatively +unargumentativeness +unary +unarisen +unarising +unaristocratic +unaristocratically +unarithmetical +unarithmetically +unark +unarm +unarmed +unarmedly +unarmedness +unarming +unarmored +unarmorial +unarmoured +unarms +unaromatic +unaromatically +unaromatized +unarousable +unaroused +unarousing +unarray +unarrayed +unarraignable +unarraignableness +unarraigned +unarranged +unarrestable +unarrested +unarresting +unarrestive +unarrival +unarrived +unarriving +unarrogance +unarrogant +unarrogantly +unarrogated +unarrogating +unarted +unartful +unartfully +unartfulness +unarticled +unarticulate +unarticulated +unarticulately +unarticulative +unarticulatory +unartificial +unartificiality +unartificially +unartificialness +unartistic +unartistical +unartistically +unartistlike +unascendable +unascendableness +unascendant +unascended +unascendent +unascertainable +unascertainableness +unascertainably +unascertained +unascetic +unascetically +unascribed +unashamed +unashamedly +unashamedness +unasinous +unaskable +unasked +unasking +unaskingly +unasleep +unaspersed +unaspersive +unasphalted +unaspirated +unaspiring +unaspiringly +unaspiringness +unassayed +unassaying +unassailability +unassailable +unassailableness +unassailably +unassailed +unassailing +unassassinated +unassaultable +unassaulted +unassembled +unassented +unassenting +unassentive +unasserted +unassertive +unassertively +unassertiveness +unassessable +unassessableness +unassessed +unassibilated +unassiduous +unassiduously +unassiduousness +unassignable +unassignably +unassigned +unassimilable +unassimilated +unassimilating +unassimilative +unassistant +unassisted +unassisting +unassociable +unassociably +unassociated +unassociative +unassociatively +unassociativeness +unassoiled +unassorted +unassuageable +unassuaged +unassuaging +unassuasive +unassuetude +unassumable +unassumed +unassumedly +unassuming +unassumingly +unassumingness +unassured +unassuredly +unassuredness +unassuring +unasterisk +unasthmatic +unastonish +unastonished +unastonishment +unastounded +unastray +unathirst +unathletic +unathletically +unatmospheric +unatonable +unatoned +unatoning +unatrophied +unattach +unattachable +unattached +unattackable +unattackableness +unattackably +unattacked +unattainability +unattainable +unattainableness +unattainably +unattained +unattaining +unattainment +unattaint +unattainted +unattaintedly +unattempered +unattemptable +unattempted +unattempting +unattendance +unattendant +unattended +unattentive +unattentively +unattentiveness +unattenuated +unattenuatedly +unattestable +unattested +unattestedness +unattire +unattired +unattractable +unattractableness +unattracted +unattracting +unattractive +unattractively +unattractiveness +unattributable +unattributably +unattributed +unattributive +unattributively +unattributiveness +unattuned +unau +unauctioned +unaudacious +unaudaciously +unaudaciousness +unaudible +unaudibleness +unaudibly +unaudienced +unaudited +unauditioned +unaugmentable +unaugmentative +unaugmented +unaus +unauspicious +unauspiciously +unauspiciousness +unaustere +unausterely +unaustereness +unauthentic +unauthentical +unauthentically +unauthenticalness +unauthenticated +unauthenticity +unauthorised +unauthorish +unauthoritative +unauthoritatively +unauthoritativeness +unauthoritied +unauthoritiveness +unauthorizable +unauthorization +unauthorize +unauthorized +unauthorizedly +unauthorizedness +unautistic +unautographed +unautomatic +unautomatically +unautoritied +unautumnal +unavailability +unavailable +unavailableness +unavailably +unavailed +unavailful +unavailing +unavailingly +unavailingness +unavengeable +unavenged +unavenging +unavengingly +unavenued +unaverage +unaveraged +unaverred +unaverse +unaverted +unavertible +unavertibleness +unavertibly +unavian +unavid +unavidly +unavidness +unavoidability +unavoidable +unavoidableness +unavoidably +unavoidal +unavoided +unavoiding +unavouchable +unavouchableness +unavouchably +unavouched +unavowable +unavowableness +unavowably +unavowed +unavowedly +unaway +unawakable +unawakableness +unawake +unawaked +unawakened +unawakenedness +unawakening +unawaking +unawardable +unawardableness +unawardably +unawarded +unaware +unawared +unawaredly +unawarely +unawareness +unawares +unawed +unawful +unawfully +unawfulness +unawkward +unawkwardly +unawkwardness +unawned +unaxed +unaxiomatic +unaxiomatically +unaxised +unaxled +unazotized +unb +unbackboarded +unbacked +unbackward +unbacterial +unbadged +unbadgered +unbadgering +unbaffled +unbaffling +unbafflingly +unbag +unbagged +unbay +unbailable +unbailableness +unbailed +unbain +unbait +unbaited +unbaized +unbaked +unbalance +unbalanceable +unbalanceably +unbalanced +unbalancement +unbalancing +unbalconied +unbale +unbaled +unbaling +unbalked +unbalking +unbalkingly +unballast +unballasted +unballasting +unballoted +unbandage +unbandaged +unbandaging +unbanded +unbane +unbangled +unbanished +unbank +unbankable +unbankableness +unbankably +unbanked +unbankrupt +unbanned +unbannered +unbantering +unbanteringly +unbaptised +unbaptize +unbaptized +unbar +unbarb +unbarbarise +unbarbarised +unbarbarising +unbarbarize +unbarbarized +unbarbarizing +unbarbarous +unbarbarously +unbarbarousness +unbarbed +unbarbered +unbarded +unbare +unbargained +unbark +unbarking +unbaronet +unbarrable +unbarred +unbarrel +unbarreled +unbarrelled +unbarren +unbarrenly +unbarrenness +unbarricade +unbarricaded +unbarricading +unbarricadoed +unbarring +unbars +unbartered +unbartering +unbase +unbased +unbasedness +unbashful +unbashfully +unbashfulness +unbasket +unbasketlike +unbastardised +unbastardized +unbaste +unbasted +unbastilled +unbastinadoed +unbated +unbathed +unbating +unbatted +unbatten +unbatterable +unbattered +unbattling +unbe +unbeached +unbeaconed +unbeaded +unbeamed +unbeaming +unbear +unbearable +unbearableness +unbearably +unbeard +unbearded +unbeared +unbearing +unbears +unbeast +unbeatable +unbeatableness +unbeatably +unbeaten +unbeaued +unbeauteous +unbeauteously +unbeauteousness +unbeautify +unbeautified +unbeautiful +unbeautifully +unbeautifulness +unbeavered +unbeckoned +unbeclogged +unbeclouded +unbecome +unbecoming +unbecomingly +unbecomingness +unbed +unbedabbled +unbedaggled +unbedashed +unbedaubed +unbedded +unbedecked +unbedewed +unbedimmed +unbedinned +unbedizened +unbedraggled +unbefit +unbefitting +unbefittingly +unbefittingness +unbefool +unbefriend +unbefriended +unbefringed +unbeget +unbeggar +unbeggarly +unbegged +unbegilt +unbeginning +unbeginningly +unbeginningness +unbegirded +unbegirt +unbegot +unbegotten +unbegottenly +unbegottenness +unbegreased +unbegrimed +unbegrudged +unbeguile +unbeguiled +unbeguileful +unbeguiling +unbegun +unbehaving +unbeheaded +unbeheld +unbeholdable +unbeholden +unbeholdenness +unbeholding +unbehoveful +unbehoving +unbeing +unbejuggled +unbeknown +unbeknownst +unbelied +unbelief +unbeliefful +unbelieffulness +unbeliefs +unbelievability +unbelievable +unbelievableness +unbelievably +unbelieve +unbelieved +unbeliever +unbelievers +unbelieving +unbelievingly +unbelievingness +unbell +unbellicose +unbelligerent +unbelligerently +unbelonging +unbeloved +unbelt +unbelted +unbelting +unbelts +unbemoaned +unbemourned +unbench +unbend +unbendable +unbendableness +unbendably +unbended +unbender +unbending +unbendingly +unbendingness +unbends +unbendsome +unbeneficed +unbeneficent +unbeneficently +unbeneficial +unbeneficially +unbeneficialness +unbenefitable +unbenefited +unbenefiting +unbenetted +unbenevolence +unbenevolent +unbenevolently +unbenevolentness +unbenight +unbenighted +unbenign +unbenignant +unbenignantly +unbenignity +unbenignly +unbenignness +unbent +unbenumb +unbenumbed +unbequeathable +unbequeathed +unbereaved +unbereaven +unbereft +unberouged +unberth +unberufen +unbeseeching +unbeseechingly +unbeseem +unbeseeming +unbeseemingly +unbeseemingness +unbeseemly +unbeset +unbesieged +unbesmeared +unbesmirched +unbesmutted +unbesot +unbesotted +unbesought +unbespeak +unbespoke +unbespoken +unbesprinkled +unbestarred +unbestowed +unbet +unbeteared +unbethink +unbethought +unbetide +unbetoken +unbetray +unbetrayed +unbetraying +unbetrothed +unbetterable +unbettered +unbeveled +unbevelled +unbewailed +unbewailing +unbeware +unbewilder +unbewildered +unbewilderedly +unbewildering +unbewilderingly +unbewilled +unbewitch +unbewitched +unbewitching +unbewitchingly +unbewrayed +unbewritten +unbias +unbiasable +unbiased +unbiasedly +unbiasedness +unbiasing +unbiassable +unbiassed +unbiassedly +unbiassing +unbiblical +unbibulous +unbibulously +unbibulousness +unbickered +unbickering +unbid +unbidable +unbiddable +unbidden +unbigamous +unbigamously +unbigged +unbigoted +unbigotedness +unbilious +unbiliously +unbiliousness +unbillable +unbilled +unbillet +unbilleted +unbind +unbindable +unbinding +unbinds +unbinned +unbiographical +unbiographically +unbiological +unbiologically +unbirdly +unbirdlike +unbirdlimed +unbirthday +unbishop +unbishoped +unbishoply +unbit +unbiting +unbitt +unbitted +unbitten +unbitter +unbitting +unblacked +unblackened +unblade +unbladed +unblading +unblamability +unblamable +unblamableness +unblamably +unblamed +unblameworthy +unblameworthiness +unblaming +unblanched +unblanketed +unblasphemed +unblasted +unblazoned +unbleached +unbleaching +unbled +unbleeding +unblemishable +unblemished +unblemishedness +unblemishing +unblenched +unblenching +unblenchingly +unblendable +unblended +unblent +unbless +unblessed +unblessedness +unblest +unblighted +unblightedly +unblightedness +unblind +unblinded +unblindfold +unblindfolded +unblinding +unblinking +unblinkingly +unbliss +unblissful +unblissfully +unblissfulness +unblistered +unblithe +unblithely +unblock +unblockaded +unblocked +unblocking +unblocks +unblooded +unbloody +unbloodied +unbloodily +unbloodiness +unbloom +unbloomed +unblooming +unblossomed +unblossoming +unblotted +unblottedness +unbloused +unblown +unblued +unbluestockingish +unbluffable +unbluffed +unbluffing +unblunder +unblundered +unblundering +unblunted +unblurred +unblush +unblushing +unblushingly +unblushingness +unblusterous +unblusterously +unboarded +unboasted +unboastful +unboastfully +unboastfulness +unboasting +unboat +unbobbed +unbody +unbodied +unbodily +unbodylike +unbodiliness +unboding +unbodkined +unbog +unboggy +unbohemianize +unboy +unboyish +unboyishly +unboyishness +unboiled +unboylike +unboisterous +unboisterously +unboisterousness +unbokel +unbold +unbolden +unboldly +unboldness +unbolled +unbolster +unbolstered +unbolt +unbolted +unbolting +unbolts +unbombarded +unbombast +unbombastic +unbombastically +unbombed +unbondable +unbondableness +unbonded +unbone +unboned +unbonnet +unbonneted +unbonneting +unbonnets +unbonny +unbooked +unbookish +unbookishly +unbookishness +unbooklearned +unboot +unbooted +unboraxed +unborder +unbordered +unbored +unboring +unborn +unborne +unborough +unborrowed +unborrowing +unbosom +unbosomed +unbosomer +unbosoming +unbosoms +unbossed +unbotanical +unbothered +unbothering +unbottle +unbottled +unbottling +unbottom +unbottomed +unbought +unbouncy +unbound +unboundable +unboundableness +unboundably +unbounded +unboundedly +unboundedness +unboundless +unbounteous +unbounteously +unbounteousness +unbountiful +unbountifully +unbountifulness +unbow +unbowable +unbowdlerized +unbowed +unbowel +unboweled +unbowelled +unbowered +unbowing +unbowingness +unbowled +unbowsome +unbox +unboxed +unboxes +unboxing +unbrace +unbraced +unbracedness +unbracelet +unbraceleted +unbraces +unbracing +unbracketed +unbragged +unbragging +unbraid +unbraided +unbraiding +unbraids +unbrailed +unbrained +unbran +unbranched +unbranching +unbrand +unbranded +unbrandied +unbrave +unbraved +unbravely +unbraveness +unbrawling +unbrawny +unbraze +unbrazen +unbrazenly +unbrazenness +unbreachable +unbreachableness +unbreachably +unbreached +unbreaded +unbreakability +unbreakable +unbreakableness +unbreakably +unbreakfasted +unbreaking +unbreast +unbreath +unbreathable +unbreathableness +unbreatheable +unbreathed +unbreathing +unbred +unbreech +unbreeched +unbreeches +unbreeching +unbreezy +unbrent +unbrewed +unbribable +unbribableness +unbribably +unbribed +unbribing +unbrick +unbricked +unbridegroomlike +unbridgeable +unbridged +unbridle +unbridled +unbridledly +unbridledness +unbridles +unbridling +unbrief +unbriefed +unbriefly +unbriefness +unbright +unbrightened +unbrightly +unbrightness +unbrilliant +unbrilliantly +unbrilliantness +unbrimming +unbrined +unbristled +unbrittle +unbrittleness +unbrittness +unbroached +unbroad +unbroadcast +unbroadcasted +unbroadened +unbrocaded +unbroid +unbroidered +unbroiled +unbroke +unbroken +unbrokenly +unbrokenness +unbronzed +unbrooch +unbrooded +unbrooding +unbrookable +unbrookably +unbrothered +unbrotherly +unbrotherlike +unbrotherliness +unbrought +unbrown +unbrowned +unbrowsing +unbruised +unbrushable +unbrushed +unbrutalise +unbrutalised +unbrutalising +unbrutalize +unbrutalized +unbrutalizing +unbrute +unbrutelike +unbrutify +unbrutise +unbrutised +unbrutising +unbrutize +unbrutized +unbrutizing +unbuckle +unbuckled +unbuckles +unbuckling +unbuckramed +unbud +unbudded +unbudding +unbudgeability +unbudgeable +unbudgeableness +unbudgeably +unbudged +unbudgeted +unbudging +unbudgingly +unbuffed +unbuffered +unbuffeted +unbuyable +unbuyableness +unbuying +unbuild +unbuilded +unbuilding +unbuilds +unbuilt +unbulky +unbulled +unbulletined +unbullied +unbullying +unbumped +unbumptious +unbumptiously +unbumptiousness +unbunched +unbundle +unbundled +unbundles +unbundling +unbung +unbungling +unbuoyant +unbuoyantly +unbuoyed +unburden +unburdened +unburdening +unburdenment +unburdens +unburdensome +unburdensomeness +unbureaucratic +unbureaucratically +unburgessed +unburglarized +unbury +unburiable +unburial +unburied +unburlesqued +unburly +unburn +unburnable +unburnableness +unburned +unburning +unburnished +unburnt +unburrow +unburrowed +unburst +unburstable +unburstableness +unburthen +unbush +unbusy +unbusied +unbusily +unbusiness +unbusinesslike +unbusk +unbuskin +unbuskined +unbusted +unbustling +unbutchered +unbutcherlike +unbuttered +unbutton +unbuttoned +unbuttoning +unbuttonment +unbuttons +unbuttressed +unbuxom +unbuxomly +unbuxomness +unc +unca +uncabined +uncabled +uncacophonous +uncadenced +uncage +uncaged +uncages +uncaging +uncajoling +uncake +uncaked +uncakes +uncaking +uncalamitous +uncalamitously +uncalcareous +uncalcified +uncalcined +uncalculable +uncalculableness +uncalculably +uncalculated +uncalculatedly +uncalculatedness +uncalculating +uncalculatingly +uncalculative +uncalendared +uncalendered +uncalibrated +uncalk +uncalked +uncall +uncalled +uncallous +uncallously +uncallousness +uncallow +uncallower +uncallused +uncalm +uncalmative +uncalmed +uncalmly +uncalmness +uncalorific +uncalumniated +uncalumniative +uncalumnious +uncalumniously +uncambered +uncamerated +uncamouflaged +uncamp +uncampaigning +uncamped +uncamphorated +uncanalized +uncancelable +uncanceled +uncancellable +uncancelled +uncancerous +uncandid +uncandidly +uncandidness +uncandied +uncandled +uncandor +uncandour +uncaned +uncankered +uncanned +uncanny +uncannier +uncanniest +uncannily +uncanniness +uncanonic +uncanonical +uncanonically +uncanonicalness +uncanonicity +uncanonisation +uncanonise +uncanonised +uncanonising +uncanonization +uncanonize +uncanonized +uncanonizing +uncanopied +uncantoned +uncantonized +uncanvassably +uncanvassed +uncap +uncapable +uncapableness +uncapably +uncapacious +uncapaciously +uncapaciousness +uncapacitate +uncaparisoned +uncaped +uncapering +uncapitalised +uncapitalistic +uncapitalized +uncapitulated +uncapitulating +uncapped +uncapper +uncapping +uncapricious +uncapriciously +uncapriciousness +uncaps +uncapsizable +uncapsized +uncapsuled +uncaptained +uncaptioned +uncaptious +uncaptiously +uncaptiousness +uncaptivate +uncaptivated +uncaptivating +uncaptivative +uncaptived +uncapturable +uncaptured +uncaramelised +uncaramelized +uncarbonated +uncarboned +uncarbonized +uncarbureted +uncarburetted +uncarded +uncardinal +uncardinally +uncareful +uncarefully +uncarefulness +uncaressed +uncaressing +uncaressingly +uncargoed +uncaria +uncaricatured +uncaring +uncarnate +uncarnivorous +uncarnivorously +uncarnivorousness +uncaroled +uncarolled +uncarousing +uncarpentered +uncarpeted +uncarriageable +uncarried +uncart +uncarted +uncartooned +uncarved +uncascaded +uncascading +uncase +uncased +uncasemated +uncases +uncashed +uncasing +uncask +uncasked +uncasketed +uncasque +uncassock +uncast +uncaste +uncastigated +uncastigative +uncastle +uncastled +uncastrated +uncasual +uncasually +uncasualness +uncataloged +uncatalogued +uncatastrophic +uncatastrophically +uncatchable +uncatchy +uncate +uncatechised +uncatechisedness +uncatechized +uncatechizedness +uncategorical +uncategorically +uncategoricalness +uncategorised +uncategorized +uncatenated +uncatered +uncatering +uncathartic +uncathedraled +uncatholcity +uncatholic +uncatholical +uncatholicalness +uncatholicise +uncatholicised +uncatholicising +uncatholicity +uncatholicize +uncatholicized +uncatholicizing +uncatholicly +uncaucusable +uncaught +uncausable +uncausal +uncausative +uncausatively +uncausativeness +uncause +uncaused +uncaustic +uncaustically +uncautelous +uncauterized +uncautioned +uncautious +uncautiously +uncautiousness +uncavalier +uncavalierly +uncave +uncavernous +uncavernously +uncaviling +uncavilling +uncavitied +unceasable +unceased +unceasing +unceasingly +unceasingness +unceded +unceiled +unceilinged +uncelebrated +uncelebrating +uncelestial +uncelestialized +uncelibate +uncellar +uncement +uncemented +uncementing +uncensorable +uncensored +uncensorious +uncensoriously +uncensoriousness +uncensurability +uncensurable +uncensurableness +uncensured +uncensuring +uncenter +uncentered +uncentral +uncentralised +uncentrality +uncentralized +uncentrally +uncentre +uncentred +uncentric +uncentrical +uncentripetal +uncentury +uncephalic +uncerated +uncerebric +uncereclothed +unceremented +unceremonial +unceremonially +unceremonious +unceremoniously +unceremoniousness +unceriferous +uncertain +uncertainly +uncertainness +uncertainty +uncertainties +uncertifiable +uncertifiablely +uncertifiableness +uncertificated +uncertified +uncertifying +uncertitude +uncessant +uncessantly +uncessantness +unchafed +unchaffed +unchaffing +unchagrined +unchain +unchainable +unchained +unchaining +unchains +unchair +unchaired +unchalked +unchalky +unchallengable +unchallengeable +unchallengeableness +unchallengeably +unchallenged +unchallenging +unchambered +unchamfered +unchampioned +unchance +unchanceable +unchanced +unchancellor +unchancy +unchange +unchangeability +unchangeable +unchangeableness +unchangeably +unchanged +unchangedness +unchangeful +unchangefully +unchangefulness +unchanging +unchangingly +unchangingness +unchanneled +unchannelized +unchannelled +unchanted +unchaotic +unchaotically +unchaperoned +unchaplain +unchapleted +unchapped +unchapter +unchaptered +uncharacter +uncharactered +uncharacterised +uncharacteristic +uncharacteristically +uncharacterized +uncharge +unchargeable +uncharged +uncharges +uncharging +unchary +uncharily +unchariness +unchariot +uncharitable +uncharitableness +uncharitably +uncharity +uncharm +uncharmable +uncharmed +uncharming +uncharnel +uncharred +uncharted +unchartered +unchased +unchaste +unchastely +unchastened +unchasteness +unchastisable +unchastised +unchastising +unchastity +unchastities +unchatteled +unchattering +unchauffeured +unchauvinistic +unchawed +uncheapened +uncheaply +uncheat +uncheated +uncheating +uncheck +uncheckable +unchecked +uncheckered +uncheckmated +uncheerable +uncheered +uncheerful +uncheerfully +uncheerfulness +uncheery +uncheerily +uncheeriness +uncheering +unchemical +unchemically +uncherished +uncherishing +unchested +unchevroned +unchewable +unchewableness +unchewed +unchic +unchicly +unchid +unchidden +unchided +unchiding +unchidingly +unchild +unchildish +unchildishly +unchildishness +unchildlike +unchilled +unchiming +unchinked +unchippable +unchipped +unchipping +unchiseled +unchiselled +unchivalry +unchivalric +unchivalrous +unchivalrously +unchivalrousness +unchloridized +unchlorinated +unchoicely +unchokable +unchoke +unchoked +unchokes +unchoking +uncholeric +unchoosable +unchopped +unchoral +unchorded +unchosen +unchrisom +unchrist +unchristen +unchristened +unchristian +unchristianity +unchristianize +unchristianized +unchristianly +unchristianlike +unchristianliness +unchristianness +unchromatic +unchromed +unchronic +unchronically +unchronicled +unchronological +unchronologically +unchurch +unchurched +unchurches +unchurching +unchurchly +unchurchlike +unchurlish +unchurlishly +unchurlishness +unchurn +unchurned +unci +uncia +unciae +uncial +uncialize +uncially +uncials +unciatim +uncicatrized +unciferous +unciform +unciforms +unciliated +uncinal +uncinaria +uncinariasis +uncinariatic +uncinata +uncinate +uncinated +uncinatum +uncinch +uncinct +uncinctured +uncini +uncynical +uncynically +uncinula +uncinus +uncipher +uncypress +uncircled +uncircuitous +uncircuitously +uncircuitousness +uncircular +uncircularised +uncircularized +uncircularly +uncirculated +uncirculating +uncirculative +uncircumcised +uncircumcisedness +uncircumcision +uncircumlocutory +uncircumscribable +uncircumscribed +uncircumscribedness +uncircumscript +uncircumscriptible +uncircumscription +uncircumspect +uncircumspection +uncircumspective +uncircumspectly +uncircumspectness +uncircumstanced +uncircumstantial +uncircumstantialy +uncircumstantially +uncircumvented +uncirostrate +uncitable +uncite +unciteable +uncited +uncity +uncitied +uncitizen +uncitizenly +uncitizenlike +uncivic +uncivil +uncivilisable +uncivilish +uncivility +uncivilizable +uncivilization +uncivilize +uncivilized +uncivilizedly +uncivilizedness +uncivilizing +uncivilly +uncivilness +unclad +unclay +unclayed +unclaimed +unclaiming +unclamorous +unclamorously +unclamorousness +unclamp +unclamped +unclamping +unclamps +unclandestinely +unclannish +unclannishly +unclannishness +unclarified +unclarifying +unclarity +unclashing +unclasp +unclasped +unclasping +unclasps +unclassable +unclassableness +unclassably +unclassed +unclassible +unclassical +unclassically +unclassify +unclassifiable +unclassifiableness +unclassifiably +unclassification +unclassified +unclassifying +unclawed +uncle +unclead +unclean +uncleanable +uncleaned +uncleaner +uncleanest +uncleanly +uncleanlily +uncleanliness +uncleanness +uncleansable +uncleanse +uncleansed +uncleansedness +unclear +unclearable +uncleared +unclearer +unclearest +unclearing +unclearly +unclearness +uncleavable +uncleave +uncledom +uncleft +unclehood +unclement +unclemently +unclementness +unclench +unclenched +unclenches +unclenching +unclergy +unclergyable +unclerical +unclericalize +unclerically +unclericalness +unclerkly +unclerklike +uncles +uncleship +unclever +uncleverly +uncleverness +unclew +unclick +uncliented +unclify +unclimactic +unclimaxed +unclimb +unclimbable +unclimbableness +unclimbably +unclimbed +unclimbing +unclinch +unclinched +unclinches +unclinching +uncling +unclinging +unclinical +unclip +unclipped +unclipper +unclipping +uncloak +uncloakable +uncloaked +uncloaking +uncloaks +unclog +unclogged +unclogging +unclogs +uncloyable +uncloyed +uncloying +uncloister +uncloistered +uncloistral +unclosable +unclose +unclosed +uncloses +uncloseted +unclosing +unclot +unclothe +unclothed +unclothedly +unclothedness +unclothes +unclothing +unclotted +unclotting +uncloud +unclouded +uncloudedly +uncloudedness +uncloudy +unclouding +unclouds +unclout +uncloven +unclub +unclubable +unclubbable +unclubby +unclustered +unclustering +unclutch +unclutchable +unclutched +unclutter +uncluttered +uncluttering +unco +uncoach +uncoachable +uncoachableness +uncoached +uncoacted +uncoagulable +uncoagulated +uncoagulating +uncoagulative +uncoalescent +uncoarse +uncoarsely +uncoarseness +uncoat +uncoated +uncoatedness +uncoaxable +uncoaxal +uncoaxed +uncoaxial +uncoaxing +uncobbled +uncock +uncocked +uncocking +uncockneyfy +uncocks +uncocted +uncodded +uncoddled +uncoded +uncodified +uncoerced +uncoffer +uncoffin +uncoffined +uncoffining +uncoffins +uncoffle +uncoft +uncogent +uncogently +uncogged +uncogitable +uncognisable +uncognizable +uncognizant +uncognized +uncognoscibility +uncognoscible +uncoguidism +uncoherent +uncoherently +uncoherentness +uncohesive +uncohesively +uncohesiveness +uncoy +uncoif +uncoifed +uncoiffed +uncoil +uncoiled +uncoyly +uncoiling +uncoils +uncoin +uncoincided +uncoincident +uncoincidental +uncoincidentally +uncoincidently +uncoinciding +uncoined +uncoyness +uncoked +uncoking +uncoly +uncolike +uncollaborative +uncollaboratively +uncollapsable +uncollapsed +uncollapsible +uncollar +uncollared +uncollaring +uncollated +uncollatedness +uncollectable +uncollected +uncollectedly +uncollectedness +uncollectible +uncollectibleness +uncollectibles +uncollectibly +uncollective +uncollectively +uncolleged +uncollegian +uncollegiate +uncolloquial +uncolloquially +uncollusive +uncolonellike +uncolonial +uncolonise +uncolonised +uncolonising +uncolonize +uncolonized +uncolonizing +uncolorable +uncolorably +uncolored +uncoloredly +uncoloredness +uncolourable +uncolourably +uncoloured +uncolouredly +uncolouredness +uncolt +uncombable +uncombatable +uncombatant +uncombated +uncombative +uncombed +uncombinable +uncombinableness +uncombinably +uncombinational +uncombinative +uncombine +uncombined +uncombining +uncombiningness +uncombustible +uncombustive +uncome +uncomely +uncomelier +uncomeliest +uncomelily +uncomeliness +uncomfy +uncomfort +uncomfortable +uncomfortableness +uncomfortably +uncomforted +uncomforting +uncomic +uncomical +uncomically +uncommanded +uncommandedness +uncommanderlike +uncommemorated +uncommemorative +uncommemoratively +uncommenced +uncommendable +uncommendableness +uncommendably +uncommendatory +uncommended +uncommensurability +uncommensurable +uncommensurableness +uncommensurate +uncommensurately +uncommented +uncommenting +uncommerciable +uncommercial +uncommercially +uncommercialness +uncommingled +uncomminuted +uncommiserated +uncommiserating +uncommiserative +uncommiseratively +uncommissioned +uncommitted +uncommitting +uncommixed +uncommodious +uncommodiously +uncommodiousness +uncommon +uncommonable +uncommoner +uncommones +uncommonest +uncommonly +uncommonness +uncommonplace +uncommunicable +uncommunicableness +uncommunicably +uncommunicated +uncommunicating +uncommunicative +uncommunicatively +uncommunicativeness +uncommutable +uncommutative +uncommutatively +uncommutativeness +uncommuted +uncompact +uncompacted +uncompahgre +uncompahgrite +uncompaniable +uncompanied +uncompanionability +uncompanionable +uncompanioned +uncomparable +uncomparableness +uncomparably +uncompared +uncompartmentalize +uncompartmentalized +uncompartmentalizes +uncompass +uncompassability +uncompassable +uncompassed +uncompassion +uncompassionate +uncompassionated +uncompassionately +uncompassionateness +uncompassionating +uncompassioned +uncompatible +uncompatibly +uncompellable +uncompelled +uncompelling +uncompendious +uncompensable +uncompensated +uncompensating +uncompensative +uncompensatory +uncompetent +uncompetently +uncompetitive +uncompetitively +uncompetitiveness +uncompiled +uncomplacent +uncomplacently +uncomplained +uncomplaining +uncomplainingly +uncomplainingness +uncomplaint +uncomplaisance +uncomplaisant +uncomplaisantly +uncomplemental +uncomplementally +uncomplementary +uncomplemented +uncompletable +uncomplete +uncompleted +uncompletely +uncompleteness +uncomplex +uncomplexity +uncomplexly +uncomplexness +uncompliability +uncompliable +uncompliableness +uncompliably +uncompliance +uncompliant +uncompliantly +uncomplicated +uncomplicatedness +uncomplication +uncomplying +uncomplimentary +uncomplimented +uncomplimenting +uncomportable +uncomposable +uncomposeable +uncomposed +uncompound +uncompoundable +uncompounded +uncompoundedly +uncompoundedness +uncompounding +uncomprehend +uncomprehended +uncomprehending +uncomprehendingly +uncomprehendingness +uncomprehened +uncomprehensible +uncomprehensibleness +uncomprehensibly +uncomprehension +uncomprehensive +uncomprehensively +uncomprehensiveness +uncompressed +uncompressible +uncomprised +uncomprising +uncomprisingly +uncompromisable +uncompromised +uncompromising +uncompromisingly +uncompromisingness +uncompt +uncompulsive +uncompulsively +uncompulsory +uncomputable +uncomputableness +uncomputably +uncomputed +uncomraded +unconcatenated +unconcatenating +unconcealable +unconcealableness +unconcealably +unconcealed +unconcealedly +unconcealing +unconcealingly +unconcealment +unconceded +unconceding +unconceited +unconceitedly +unconceivable +unconceivableness +unconceivably +unconceived +unconceiving +unconcentrated +unconcentratedly +unconcentrative +unconcentric +unconcentrically +unconceptual +unconceptualized +unconceptually +unconcern +unconcerned +unconcernedly +unconcernedness +unconcerning +unconcernment +unconcertable +unconcerted +unconcertedly +unconcertedness +unconcessible +unconciliable +unconciliated +unconciliatedness +unconciliating +unconciliative +unconciliatory +unconcludable +unconcluded +unconcludent +unconcluding +unconcludingness +unconclusive +unconclusively +unconclusiveness +unconcocted +unconcordant +unconcordantly +unconcrete +unconcreted +unconcretely +unconcreteness +unconcurred +unconcurrent +unconcurrently +unconcurring +uncondemnable +uncondemned +uncondemning +uncondemningly +uncondensable +uncondensableness +uncondensably +uncondensational +uncondensed +uncondensing +uncondescending +uncondescendingly +uncondescension +uncondited +uncondition +unconditional +unconditionality +unconditionally +unconditionalness +unconditionate +unconditionated +unconditionately +unconditioned +unconditionedly +unconditionedness +uncondolatory +uncondoled +uncondoling +uncondoned +uncondoning +unconducing +unconducive +unconducively +unconduciveness +unconducted +unconductible +unconductive +unconductiveness +unconfected +unconfederated +unconferred +unconfess +unconfessed +unconfessing +unconfided +unconfidence +unconfident +unconfidential +unconfidentialness +unconfidently +unconfiding +unconfinable +unconfine +unconfined +unconfinedly +unconfinedness +unconfinement +unconfining +unconfirm +unconfirmability +unconfirmable +unconfirmative +unconfirmatory +unconfirmed +unconfirming +unconfiscable +unconfiscated +unconfiscatory +unconflicting +unconflictingly +unconflictingness +unconflictive +unconform +unconformability +unconformable +unconformableness +unconformably +unconformed +unconformedly +unconforming +unconformism +unconformist +unconformity +unconformities +unconfound +unconfounded +unconfoundedly +unconfounding +unconfoundingly +unconfrontable +unconfronted +unconfusable +unconfusably +unconfused +unconfusedly +unconfusing +unconfutability +unconfutable +unconfutative +unconfuted +unconfuting +uncongeal +uncongealable +uncongealed +uncongenial +uncongeniality +uncongenially +uncongested +uncongestive +unconglobated +unconglomerated +unconglutinated +unconglutinative +uncongratulate +uncongratulated +uncongratulating +uncongratulatory +uncongregated +uncongregational +uncongregative +uncongressional +uncongruous +uncongruously +uncongruousness +unconical +unconjecturable +unconjectural +unconjectured +unconjoined +unconjugal +unconjugated +unconjunctive +unconjured +unconnected +unconnectedly +unconnectedness +unconned +unconnived +unconniving +unconnotative +unconquerable +unconquerableness +unconquerably +unconquered +unconquest +unconscienced +unconscient +unconscientious +unconscientiously +unconscientiousness +unconscionability +unconscionable +unconscionableness +unconscionably +unconscious +unconsciously +unconsciousness +unconsecrate +unconsecrated +unconsecratedly +unconsecratedness +unconsecration +unconsecrative +unconsecutive +unconsecutively +unconsent +unconsentaneous +unconsentaneously +unconsentaneousness +unconsented +unconsentient +unconsenting +unconsequential +unconsequentially +unconsequentialness +unconservable +unconservative +unconservatively +unconservativeness +unconserved +unconserving +unconsiderable +unconsiderablely +unconsiderate +unconsiderately +unconsiderateness +unconsidered +unconsideredly +unconsideredness +unconsidering +unconsideringly +unconsignable +unconsigned +unconsistent +unconsociable +unconsociated +unconsolability +unconsolable +unconsolably +unconsolatory +unconsoled +unconsolidated +unconsolidating +unconsolidation +unconsoling +unconsolingly +unconsonancy +unconsonant +unconsonantly +unconsonous +unconspicuous +unconspicuously +unconspicuousness +unconspired +unconspiring +unconspiringly +unconspiringness +unconstancy +unconstant +unconstantly +unconstantness +unconstellated +unconsternated +unconstipated +unconstituted +unconstitutional +unconstitutionalism +unconstitutionality +unconstitutionally +unconstrainable +unconstrained +unconstrainedly +unconstrainedness +unconstraining +unconstraint +unconstricted +unconstrictive +unconstruable +unconstructed +unconstructive +unconstructively +unconstructural +unconstrued +unconsular +unconsult +unconsultable +unconsultative +unconsultatory +unconsulted +unconsulting +unconsumable +unconsumed +unconsuming +unconsummate +unconsummated +unconsummately +unconsummative +unconsumptive +unconsumptively +uncontacted +uncontagious +uncontagiously +uncontainable +uncontainableness +uncontainably +uncontained +uncontaminable +uncontaminate +uncontaminated +uncontaminative +uncontemned +uncontemnedly +uncontemning +uncontemningly +uncontemplable +uncontemplated +uncontemplative +uncontemplatively +uncontemplativeness +uncontemporaneous +uncontemporaneously +uncontemporaneousness +uncontemporary +uncontemptibility +uncontemptible +uncontemptibleness +uncontemptibly +uncontemptuous +uncontemptuously +uncontemptuousness +uncontended +uncontending +uncontent +uncontentable +uncontented +uncontentedly +uncontentedness +uncontenting +uncontentingness +uncontentious +uncontentiously +uncontentiousness +uncontestability +uncontestable +uncontestablely +uncontestableness +uncontestably +uncontestant +uncontested +uncontestedly +uncontestedness +uncontiguous +uncontiguously +uncontiguousness +uncontinence +uncontinent +uncontinental +uncontinented +uncontinently +uncontingent +uncontingently +uncontinual +uncontinually +uncontinued +uncontinuous +uncontinuously +uncontorted +uncontortedly +uncontortioned +uncontortive +uncontoured +uncontract +uncontracted +uncontractedness +uncontractile +uncontradictable +uncontradictablely +uncontradictableness +uncontradictably +uncontradicted +uncontradictedly +uncontradictious +uncontradictive +uncontradictory +uncontrastable +uncontrastably +uncontrasted +uncontrasting +uncontrastive +uncontrastively +uncontributed +uncontributing +uncontributive +uncontributively +uncontributiveness +uncontributory +uncontrite +uncontriteness +uncontrived +uncontriving +uncontrol +uncontrollability +uncontrollable +uncontrollableness +uncontrollably +uncontrolled +uncontrolledly +uncontrolledness +uncontrolling +uncontroversial +uncontroversially +uncontrovertable +uncontrovertableness +uncontrovertably +uncontroverted +uncontrovertedly +uncontrovertible +uncontrovertibleness +uncontrovertibly +uncontumacious +uncontumaciously +uncontumaciousness +unconveyable +unconveyed +unconvenable +unconvened +unconvenial +unconvenience +unconvenient +unconveniently +unconvening +unconventional +unconventionalism +unconventionality +unconventionalities +unconventionalize +unconventionalized +unconventionalizes +unconventionally +unconventioned +unconverged +unconvergent +unconverging +unconversable +unconversableness +unconversably +unconversance +unconversant +unconversational +unconversing +unconversion +unconvert +unconverted +unconvertedly +unconvertedness +unconvertibility +unconvertible +unconvertibleness +unconvertibly +unconvicted +unconvicting +unconvictive +unconvince +unconvinced +unconvincedly +unconvincedness +unconvincibility +unconvincible +unconvincing +unconvincingly +unconvincingness +unconvoyed +unconvolute +unconvoluted +unconvolutely +unconvulsed +unconvulsive +unconvulsively +unconvulsiveness +uncookable +uncooked +uncool +uncooled +uncoop +uncooped +uncooperating +uncooperative +uncooperatively +uncooperativeness +uncoopered +uncooping +uncoordinate +uncoordinated +uncoordinately +uncoordinateness +uncope +uncopiable +uncopyable +uncopied +uncopious +uncopyrighted +uncoquettish +uncoquettishly +uncoquettishness +uncord +uncorded +uncordial +uncordiality +uncordially +uncordialness +uncording +uncore +uncored +uncoring +uncork +uncorked +uncorker +uncorking +uncorks +uncorned +uncorner +uncornered +uncoronated +uncoroneted +uncorporal +uncorpulent +uncorpulently +uncorrect +uncorrectable +uncorrectablely +uncorrected +uncorrectible +uncorrective +uncorrectly +uncorrectness +uncorrelated +uncorrelatedly +uncorrelative +uncorrelatively +uncorrelativeness +uncorrelativity +uncorrespondency +uncorrespondent +uncorresponding +uncorrespondingly +uncorridored +uncorrigible +uncorrigibleness +uncorrigibly +uncorroborant +uncorroborated +uncorroborative +uncorroboratively +uncorroboratory +uncorroded +uncorrugated +uncorrupt +uncorrupted +uncorruptedly +uncorruptedness +uncorruptibility +uncorruptible +uncorruptibleness +uncorruptibly +uncorrupting +uncorruption +uncorruptive +uncorruptly +uncorruptness +uncorseted +uncorven +uncos +uncosseted +uncost +uncostly +uncostliness +uncostumed +uncottoned +uncouch +uncouched +uncouching +uncounselable +uncounseled +uncounsellable +uncounselled +uncountable +uncountableness +uncountably +uncounted +uncountenanced +uncounteracted +uncounterbalanced +uncounterfeit +uncounterfeited +uncountermandable +uncountermanded +uncountervailed +uncountess +uncountrified +uncouple +uncoupled +uncoupler +uncouples +uncoupling +uncourageous +uncourageously +uncourageousness +uncoursed +uncourted +uncourteous +uncourteously +uncourteousness +uncourtesy +uncourtesies +uncourtierlike +uncourting +uncourtly +uncourtlike +uncourtliness +uncous +uncousinly +uncouth +uncouthie +uncouthly +uncouthness +uncouthsome +uncovenable +uncovenant +uncovenanted +uncover +uncoverable +uncovered +uncoveredly +uncovering +uncovers +uncoveted +uncoveting +uncovetingly +uncovetous +uncovetously +uncovetousness +uncow +uncowed +uncowl +uncracked +uncradled +uncrafty +uncraftily +uncraftiness +uncraggy +uncram +uncramp +uncramped +uncrampedness +uncranked +uncrannied +uncrate +uncrated +uncrates +uncrating +uncravatted +uncraven +uncraving +uncravingly +uncrazed +uncrazy +uncream +uncreased +uncreatability +uncreatable +uncreatableness +uncreate +uncreated +uncreatedness +uncreates +uncreating +uncreation +uncreative +uncreatively +uncreativeness +uncreativity +uncreaturely +uncredentialed +uncredentialled +uncredibility +uncredible +uncredibly +uncredit +uncreditable +uncreditableness +uncreditably +uncredited +uncrediting +uncredulous +uncredulously +uncredulousness +uncreeping +uncreosoted +uncrest +uncrested +uncrevassed +uncrib +uncribbed +uncribbing +uncried +uncrying +uncrime +uncriminal +uncriminally +uncringing +uncrinkle +uncrinkled +uncrinkling +uncrippled +uncrisp +uncrystaled +uncrystalled +uncrystalline +uncrystallisable +uncrystallizability +uncrystallizable +uncrystallized +uncritical +uncritically +uncriticalness +uncriticisable +uncriticisably +uncriticised +uncriticising +uncriticisingly +uncriticism +uncriticizable +uncriticizably +uncriticized +uncriticizing +uncriticizingly +uncrochety +uncrook +uncrooked +uncrookedly +uncrooking +uncropped +uncropt +uncross +uncrossable +uncrossableness +uncrossed +uncrosses +uncrossexaminable +uncrossexamined +uncrossing +uncrossly +uncrowded +uncrown +uncrowned +uncrowning +uncrowns +uncrucified +uncrudded +uncrude +uncrudely +uncrudeness +uncrudity +uncruel +uncruelly +uncruelness +uncrumbled +uncrumple +uncrumpled +uncrumpling +uncrushable +uncrushed +uncrusted +uncs +unct +unction +unctional +unctioneer +unctionless +unctions +unctious +unctiousness +unctorian +unctorium +unctuarium +unctuose +unctuosity +unctuous +unctuously +unctuousness +uncubbed +uncubic +uncubical +uncubically +uncubicalness +uncuckold +uncuckolded +uncudgeled +uncudgelled +uncuffed +uncular +unculled +uncullibility +uncullible +unculpable +unculted +uncultivability +uncultivable +uncultivatable +uncultivate +uncultivated +uncultivatedness +uncultivation +unculturable +unculture +uncultured +unculturedness +uncumber +uncumbered +uncumbrous +uncumbrously +uncumbrousness +uncumulative +uncunning +uncunningly +uncunningness +uncupped +uncurable +uncurableness +uncurably +uncurb +uncurbable +uncurbed +uncurbedly +uncurbing +uncurbs +uncurd +uncurdled +uncurdling +uncured +uncurious +uncuriously +uncurl +uncurled +uncurling +uncurls +uncurrent +uncurrently +uncurrentness +uncurricularized +uncurried +uncurse +uncursed +uncursing +uncurst +uncurtailable +uncurtailably +uncurtailed +uncurtain +uncurtained +uncurved +uncurving +uncus +uncushioned +uncusped +uncustomable +uncustomary +uncustomarily +uncustomariness +uncustomed +uncut +uncute +uncuth +uncuticulate +uncuttable +undabbled +undaggled +undaily +undainty +undaintily +undaintiness +undallying +undam +undamageable +undamaged +undamaging +undamasked +undammed +undamming +undamn +undamnified +undampable +undamped +undampened +undanceable +undancing +undandiacal +undandled +undangered +undangerous +undangerously +undangerousness +undapper +undappled +undared +undaring +undaringly +undark +undarken +undarkened +undarned +undashed +undatable +undate +undateable +undated +undatedness +undaub +undaubed +undaughter +undaughterly +undaughterliness +undauntable +undaunted +undauntedly +undauntedness +undaunting +undawned +undawning +undazed +undazing +undazzle +undazzled +undazzling +unde +undead +undeadened +undeadly +undeadlocked +undeaf +undealable +undealt +undean +undear +undebarred +undebased +undebatable +undebatably +undebated +undebating +undebauched +undebauchedness +undebilitated +undebilitating +undebilitative +undebited +undecadent +undecadently +undecagon +undecayable +undecayableness +undecayed +undecayedness +undecaying +undecanaphthene +undecane +undecatoic +undeceased +undeceitful +undeceitfully +undeceitfulness +undeceivability +undeceivable +undeceivableness +undeceivably +undeceive +undeceived +undeceiver +undeceives +undeceiving +undecency +undecennary +undecennial +undecent +undecently +undeception +undeceptious +undeceptitious +undeceptive +undeceptively +undeceptiveness +undecidable +undecide +undecided +undecidedly +undecidedness +undeciding +undecyl +undecylene +undecylenic +undecylic +undecillion +undecillionth +undecimal +undeciman +undecimole +undecipher +undecipherability +undecipherable +undecipherably +undeciphered +undecision +undecisive +undecisively +undecisiveness +undeck +undecked +undeclaimed +undeclaiming +undeclamatory +undeclarable +undeclarative +undeclare +undeclared +undeclinable +undeclinableness +undeclinably +undeclined +undeclining +undecocted +undecoic +undecoyed +undecolic +undecomposable +undecomposed +undecompounded +undecorated +undecorative +undecorous +undecorously +undecorousness +undecorticated +undecreased +undecreasing +undecreasingly +undecree +undecreed +undecrepit +undecretive +undecretory +undecried +undedicate +undedicated +undeduced +undeducible +undeducted +undeductible +undeductive +undeductively +undee +undeeded +undeemed +undeemous +undeemously +undeep +undeepened +undeeply +undefaceable +undefaced +undefalcated +undefamatory +undefamed +undefaming +undefatigable +undefaulted +undefaulting +undefeasible +undefeat +undefeatable +undefeatableness +undefeatably +undefeated +undefeatedly +undefeatedness +undefecated +undefectible +undefective +undefectively +undefectiveness +undefendable +undefendableness +undefendably +undefendant +undefended +undefending +undefense +undefensed +undefensible +undefensibleness +undefensibly +undefensive +undefensively +undefensiveness +undeferential +undeferentially +undeferrable +undeferrably +undeferred +undefiable +undefiably +undefiant +undefiantly +undeficient +undeficiently +undefied +undefilable +undefiled +undefiledly +undefiledness +undefinability +undefinable +undefinableness +undefinably +undefine +undefined +undefinedly +undefinedness +undefinite +undefinitely +undefiniteness +undefinitive +undefinitively +undefinitiveness +undeflectability +undeflectable +undeflected +undeflective +undeflowered +undeformable +undeformed +undeformedness +undefrayed +undefrauded +undeft +undeftly +undeftness +undegeneracy +undegenerate +undegenerated +undegenerateness +undegenerating +undegenerative +undegraded +undegrading +undeify +undeification +undeified +undeifying +undeistical +undejected +undejectedly +undejectedness +undelayable +undelayed +undelayedly +undelaying +undelayingly +undelated +undelectability +undelectable +undelectably +undelegated +undeleted +undeleterious +undeleteriously +undeleteriousness +undeliberate +undeliberated +undeliberately +undeliberateness +undeliberating +undeliberatingly +undeliberative +undeliberatively +undeliberativeness +undelible +undelicious +undeliciously +undelight +undelighted +undelightedly +undelightful +undelightfully +undelightfulness +undelighting +undelightsome +undelylene +undelimited +undelineable +undelineated +undelineative +undelinquent +undelinquently +undelirious +undeliriously +undeliverable +undeliverableness +undelivered +undelivery +undeludable +undelude +undeluded +undeludedly +undeluding +undeluged +undelusive +undelusively +undelusiveness +undelusory +undelve +undelved +undemagnetizable +undemanded +undemanding +undemandingness +undemised +undemocratic +undemocratically +undemocratisation +undemocratise +undemocratised +undemocratising +undemocratization +undemocratize +undemocratized +undemocratizing +undemolishable +undemolished +undemonstrable +undemonstrableness +undemonstrably +undemonstratable +undemonstrated +undemonstrational +undemonstrative +undemonstratively +undemonstrativeness +undemoralized +undemure +undemurely +undemureness +undemurring +unden +undeniability +undeniable +undeniableness +undeniably +undenied +undeniedly +undenizened +undenominated +undenominational +undenominationalism +undenominationalist +undenominationalize +undenominationally +undenotable +undenotative +undenotatively +undenoted +undenounced +undented +undenuded +undenunciated +undenunciatory +undepartableness +undepartably +undeparted +undeparting +undependability +undependable +undependableness +undependably +undependent +undepending +undephlegmated +undepicted +undepleted +undeplored +undeported +undeposable +undeposed +undeposited +undepraved +undepravedness +undeprecated +undeprecating +undeprecatingly +undeprecative +undeprecatively +undepreciable +undepreciated +undepreciative +undepreciatory +undepressed +undepressible +undepressing +undepressive +undepressively +undepressiveness +undeprivable +undeprived +undepurated +undeputed +undeputized +under +underabyss +underaccident +underaccommodated +underachieve +underachieved +underachievement +underachiever +underachievers +underachieves +underachieving +underact +underacted +underacting +underaction +underactivity +underactor +underacts +underadjustment +underadmiral +underadventurer +underage +underagency +underagent +underages +underagitation +underaid +underaim +underair +underalderman +underaldermen +underanged +underappreciated +underarch +underargue +underarm +underarming +underarms +underassessed +underassessment +underate +underaverage +underback +underbailiff +underbake +underbaked +underbaking +underbalance +underbalanced +underbalancing +underballast +underbank +underbarber +underbarring +underbasal +underbeadle +underbeak +underbeam +underbear +underbearer +underbearing +underbeat +underbeaten +underbed +underbedding +underbeing +underbelly +underbellies +underbeveling +underbevelling +underbid +underbidder +underbidders +underbidding +underbids +underbill +underbillow +underbind +underbishop +underbishopric +underbit +underbite +underbitted +underbitten +underboard +underboated +underbody +underbodice +underbodies +underboy +underboil +underboom +underborn +underborne +underbottom +underbough +underbought +underbound +underbowed +underbowser +underbox +underbrace +underbraced +underbracing +underbranch +underbreath +underbreathing +underbred +underbreeding +underbrew +underbridge +underbridged +underbridging +underbrigadier +underbright +underbrim +underbrush +underbubble +underbud +underbudde +underbudded +underbudding +underbudgeted +underbuds +underbuy +underbuying +underbuild +underbuilder +underbuilding +underbuilt +underbuys +underbuoy +underbury +underburn +underburned +underburnt +underbursar +underbush +underbutler +undercanopy +undercanvass +undercap +undercapitaled +undercapitalization +undercapitalize +undercapitalized +undercapitalizing +undercaptain +undercarder +undercarry +undercarriage +undercarriages +undercarried +undercarrying +undercart +undercarter +undercarve +undercarved +undercarving +undercase +undercasing +undercast +undercause +underceiling +undercellar +undercellarer +underchamber +underchamberlain +underchancellor +underchanter +underchap +undercharge +undercharged +undercharges +undercharging +underchief +underchime +underchin +underchord +underchurched +undercircle +undercircled +undercircling +undercitizen +undercitizenry +undercitizenries +underclad +undercladding +underclay +underclass +underclassman +underclassmen +underclearer +underclerk +underclerks +underclerkship +undercliff +underclift +undercloak +undercloth +underclothe +underclothed +underclothes +underclothing +underclub +underclutch +undercoachman +undercoachmen +undercoat +undercoated +undercoater +undercoating +undercoatings +undercoats +undercollector +undercolor +undercolored +undercoloring +undercommander +undercomment +undercompounded +underconcerned +undercondition +underconsciousness +underconstable +underconstumble +underconsume +underconsumed +underconsuming +underconsumption +undercook +undercooked +undercooking +undercooks +undercool +undercooled +undercooper +undercorrect +undercountenance +undercourse +undercoursed +undercoursing +undercourtier +undercover +undercovering +undercovert +undercraft +undercrawl +undercreep +undercrest +undercry +undercrier +undercrypt +undercroft +undercrop +undercrossing +undercrust +undercumstand +undercup +undercurl +undercurrent +undercurrents +undercurve +undercurved +undercurving +undercut +undercuts +undercutter +undercutting +underdauber +underdeacon +underdead +underdealer +underdealing +underdebauchee +underdeck +underdegreed +underdepth +underdevelop +underdevelope +underdeveloped +underdevelopement +underdeveloping +underdevelopment +underdevil +underdialogue +underdid +underdig +underdigging +underdip +underdish +underdistinction +underdistributor +underditch +underdive +underdo +underdoctor +underdoer +underdoes +underdog +underdogs +underdoing +underdone +underdose +underdosed +underdosing +underdot +underdotted +underdotting +underdown +underdraft +underdrag +underdrain +underdrainage +underdrainer +underdraught +underdraw +underdrawers +underdrawing +underdrawn +underdress +underdressed +underdresses +underdressing +underdrew +underdry +underdried +underdrift +underdrying +underdrive +underdriven +underdrudgery +underdrumming +underdug +underdunged +underearth +undereat +undereate +undereaten +undereating +undereats +underedge +undereducated +undereducation +undereye +undereyed +undereying +underemphasis +underemphasize +underemphasized +underemphasizes +underemphasizing +underemployed +underemployment +underengraver +underenter +underer +underescheator +underestimate +underestimated +underestimates +underestimating +underestimation +underestimations +underexcited +underexercise +underexercised +underexercising +underexpose +underexposed +underexposes +underexposing +underexposure +underexposures +underface +underfaced +underfacing +underfaction +underfactor +underfaculty +underfalconer +underfall +underfarmer +underfeathering +underfeature +underfed +underfeed +underfeeder +underfeeding +underfeeds +underfeel +underfeeling +underfeet +underfellow +underfelt +underffed +underfiend +underfill +underfilling +underfinance +underfinanced +underfinances +underfinancing +underfind +underfire +underfired +underfitting +underflame +underflannel +underfleece +underflood +underfloor +underflooring +underflow +underflowed +underflowing +underflows +underfo +underfold +underfolded +underfong +underfoot +underfootage +underfootman +underfootmen +underforebody +underform +underfortify +underfortified +underfortifying +underframe +underframework +underframing +underfreight +underfrequency +underfrequencies +underfringe +underfrock +underfur +underfurnish +underfurnished +underfurnisher +underfurrow +underfurs +undergabble +undergage +undergamekeeper +undergaoler +undergarb +undergardener +undergarment +undergarments +undergarnish +undergauge +undergear +undergeneral +undergentleman +undergentlemen +undergird +undergirded +undergirder +undergirding +undergirdle +undergirds +undergirt +undergirth +underglaze +undergloom +underglow +undergnaw +undergo +undergod +undergods +undergoer +undergoes +undergoing +undergone +undergore +undergos +undergoverness +undergovernment +undergovernor +undergown +undergrad +undergrade +undergrads +undergraduate +undergraduatedom +undergraduateness +undergraduates +undergraduateship +undergraduatish +undergraduette +undergraining +undergrass +undergreen +undergrieve +undergroan +undergrope +underground +undergrounder +undergroundling +undergroundness +undergrounds +undergrove +undergrow +undergrowl +undergrown +undergrowth +undergrub +underguard +underguardian +undergunner +underhabit +underhammer +underhand +underhanded +underhandedly +underhandedness +underhang +underhanging +underhangman +underhangmen +underhatch +underhead +underheat +underheaven +underhelp +underhew +underhid +underhill +underhint +underhistory +underhive +underhold +underhole +underhonest +underhorse +underhorsed +underhorseman +underhorsemen +underhorsing +underhoused +underhousemaid +underhum +underhung +underided +underyield +underinstrument +underinsurance +underinsured +underyoke +underisible +underisive +underisively +underisiveness +underisory +underissue +underivable +underivative +underivatively +underived +underivedly +underivedness +underjacket +underjailer +underjanitor +underjaw +underjawed +underjaws +underjobbing +underjoin +underjoint +underjudge +underjudged +underjudging +underjungle +underkeel +underkeep +underkeeper +underkind +underking +underkingdom +underlaborer +underlabourer +underlay +underlaid +underlayer +underlayers +underlaying +underlayment +underlain +underlays +underland +underlanguaged +underlap +underlapped +underlapper +underlapping +underlaps +underlash +underlaundress +underlawyer +underleaf +underlease +underleased +underleasing +underleather +underlegate +underlessee +underlet +underlets +underletter +underletting +underlevel +underlever +underli +underly +underlid +underlie +underlye +underlielay +underlier +underlies +underlieutenant +underlife +underlift +underlight +underlying +underlyingly +underliking +underlimbed +underlimit +underline +underlineation +underlined +underlineman +underlinemen +underlinement +underlinen +underliner +underlines +underling +underlings +underlining +underlinings +underlip +underlips +underlit +underlive +underload +underloaded +underlock +underlodging +underloft +underlook +underlooker +underlout +underlunged +undermade +undermaid +undermaker +underman +undermanager +undermanned +undermanning +undermark +undermarshal +undermarshalman +undermarshalmen +undermasted +undermaster +undermatch +undermatched +undermate +undermath +undermeal +undermeaning +undermeasure +undermeasured +undermeasuring +undermediator +undermelody +undermelodies +undermentioned +undermiller +undermimic +underminable +undermine +undermined +underminer +undermines +undermining +underminingly +underminister +underministry +undermirth +undermist +undermoated +undermoney +undermoral +undermost +undermotion +undermount +undermountain +undermusic +undermuslin +undern +undernam +undername +undernamed +undernatural +underneath +underness +underniceness +undernim +undernome +undernomen +undernote +undernoted +undernourish +undernourished +undernourishment +undernsong +underntide +underntime +undernumen +undernurse +undernutrition +underoccupied +underofficer +underofficered +underofficial +underofficials +underogating +underogative +underogatively +underogatory +underopinion +underorb +underorganisation +underorganization +underorseman +underoverlooker +underoxidise +underoxidised +underoxidising +underoxidize +underoxidized +underoxidizing +underpacking +underpay +underpaid +underpaying +underpayment +underpain +underpainting +underpays +underpan +underpants +underpart +underparticipation +underpartner +underparts +underpass +underpasses +underpassion +underpeep +underpeer +underpen +underpeopled +underpetticoat +underpetticoated +underpick +underpicked +underpier +underpilaster +underpile +underpin +underpinned +underpinner +underpinning +underpinnings +underpins +underpitch +underpitched +underplay +underplayed +underplaying +underplain +underplays +underplan +underplant +underplanted +underplanting +underplate +underply +underplot +underplotter +underpoint +underpole +underpopulate +underpopulated +underpopulating +underpopulation +underporch +underporter +underpose +underpossessor +underpot +underpower +underpowered +underpraise +underpraised +underprefect +underprentice +underprepared +underpresence +underpresser +underpressure +underpry +underprice +underpriced +underprices +underpricing +underpriest +underprincipal +underprint +underprior +underprivileged +underprize +underprized +underprizing +underproduce +underproduced +underproducer +underproduces +underproducing +underproduction +underproductive +underproficient +underprompt +underprompter +underproof +underprop +underproportion +underproportioned +underproposition +underpropped +underpropper +underpropping +underprospect +underpuke +underpull +underpuller +underput +underqualified +underqueen +underquote +underquoted +underquoting +underran +underranger +underrate +underrated +underratement +underrates +underrating +underreach +underread +underreader +underrealise +underrealised +underrealising +underrealize +underrealized +underrealizing +underrealm +underream +underreamer +underreceiver +underreckon +underreckoning +underrecompense +underrecompensed +underrecompensing +underregion +underregistration +underrent +underrented +underrenting +underreport +underrepresent +underrepresentation +underrepresented +underrespected +underriddle +underriding +underrigged +underring +underripe +underripened +underriver +underroarer +underroast +underrobe +underrogue +underroll +underroller +underroof +underroom +underroot +underrooted +underrower +underrule +underruled +underruler +underruling +underrun +underrunning +underruns +undersacristan +undersay +undersail +undersailed +undersally +undersap +undersatisfaction +undersaturate +undersaturated +undersaturation +undersavior +undersaw +undersawyer +underscale +underscheme +underschool +underscoop +underscore +underscored +underscores +underscoring +underscribe +underscriber +underscript +underscrub +underscrupulous +underscrupulously +undersea +underseal +underseam +underseaman +undersearch +underseas +underseated +undersecretary +undersecretariat +undersecretaries +undersecretaryship +undersect +undersee +underseeded +underseedman +underseeing +underseen +undersell +underseller +underselling +undersells +undersense +undersequence +underservant +underserve +underservice +underset +undersets +undersetter +undersetting +undersettle +undersettler +undersettling +undersexed +undersexton +undershapen +undersharp +undersheathing +undershepherd +undersheriff +undersheriffry +undersheriffship +undersheriffwick +undershield +undershine +undershining +undershire +undershirt +undershirts +undershoe +undershone +undershoot +undershooting +undershore +undershored +undershoring +undershorten +undershorts +undershot +undershrievalty +undershrieve +undershrievery +undershrub +undershrubby +undershrubbiness +undershrubs +undershunter +undershut +underside +undersides +undersight +undersighted +undersign +undersignalman +undersignalmen +undersigned +undersigner +undersill +undersinging +undersitter +undersize +undersized +undersky +underskin +underskirt +underskirts +undersleep +undersleeping +undersleeve +underslept +underslip +underslope +undersluice +underslung +undersneer +undersociety +undersoil +undersold +undersole +undersomething +undersong +undersorcerer +undersort +undersoul +undersound +undersovereign +undersow +underspan +underspar +undersparred +underspecies +underspecify +underspecified +underspecifying +underspend +underspending +underspends +underspent +undersphere +underspin +underspinner +undersplice +underspliced +undersplicing +underspore +underspread +underspreading +underspring +undersprout +underspurleather +undersquare +undersshot +understaff +understaffed +understage +understay +understain +understairs +understamp +understand +understandability +understandable +understandableness +understandably +understanded +understander +understanding +understandingly +understandingness +understandings +understands +understate +understated +understatement +understatements +understates +understating +understeer +understem +understep +understeward +understewardship +understimuli +understimulus +understock +understocking +understood +understory +understrain +understrap +understrapped +understrapper +understrapping +understrata +understratum +understratums +understream +understrength +understress +understrew +understrewed +understricken +understride +understriding +understrife +understrike +understriking +understring +understroke +understruck +understruction +understructure +understructures +understrung +understudy +understudied +understudies +understudying +understuff +understuffing +undersuck +undersuggestion +undersuit +undersupply +undersupplied +undersupplies +undersupplying +undersupport +undersurface +underswain +underswamp +undersward +underswearer +undersweat +undersweep +undersweeping +underswell +underswept +undertakable +undertake +undertakement +undertaken +undertaker +undertakery +undertakerish +undertakerly +undertakerlike +undertakers +undertakes +undertaking +undertakingly +undertakings +undertalk +undertapster +undertaught +undertax +undertaxed +undertaxes +undertaxing +underteach +underteacher +underteaching +underteamed +underteller +undertenancy +undertenant +undertenter +undertenure +underterrestrial +undertest +underthane +underthaw +underthief +underthing +underthings +underthink +underthirst +underthought +underthroating +underthrob +underthrust +undertide +undertided +undertie +undertied +undertying +undertime +undertimed +undertint +undertype +undertyrant +undertitle +undertone +undertoned +undertones +undertook +undertow +undertows +undertrade +undertraded +undertrader +undertrading +undertrain +undertrained +undertread +undertreasurer +undertreat +undertribe +undertrick +undertrodden +undertruck +undertrump +undertruss +undertub +undertune +undertuned +undertunic +undertuning +underturf +underturn +underturnkey +undertutor +undertwig +underused +underusher +underutilization +underutilize +undervaluation +undervalue +undervalued +undervaluement +undervaluer +undervalues +undervaluing +undervaluingly +undervaluinglike +undervalve +undervassal +undervaulted +undervaulting +undervegetation +underventilate +underventilated +underventilating +underventilation +underverse +undervest +undervicar +underviewer +undervillain +undervinedresser +undervitalized +undervocabularied +undervoice +undervoltage +underwage +underway +underwaist +underwaistcoat +underwaists +underwalk +underward +underwarden +underwarmth +underwarp +underwash +underwatch +underwatcher +underwater +underwaters +underwave +underwaving +underweapon +underwear +underweft +underweigh +underweight +underweighted +underwent +underwheel +underwhistle +underwind +underwinding +underwinds +underwing +underwit +underwitch +underwitted +underwood +underwooded +underwool +underwork +underworked +underworker +underworking +underworkman +underworkmen +underworld +underwound +underwrap +underwrapped +underwrapping +underwrit +underwrite +underwriter +underwriters +underwrites +underwriting +underwritten +underwrote +underwrought +underzeal +underzealot +underzealous +underzealously +underzealousness +undescendable +undescended +undescendent +undescendible +undescending +undescribable +undescribableness +undescribably +undescribed +undescried +undescrying +undescript +undescriptive +undescriptively +undescriptiveness +undesecrated +undesert +undeserted +undeserting +undeserve +undeserved +undeservedly +undeservedness +undeserver +undeserving +undeservingly +undeservingness +undesiccated +undesign +undesignated +undesignative +undesigned +undesignedly +undesignedness +undesigning +undesigningly +undesigningness +undesirability +undesirable +undesirableness +undesirably +undesire +undesired +undesiredly +undesiring +undesirous +undesirously +undesirousness +undesisting +undespaired +undespairing +undespairingly +undespatched +undespised +undespising +undespoiled +undespondent +undespondently +undesponding +undespondingly +undespotic +undespotically +undestined +undestitute +undestroyable +undestroyed +undestructible +undestructibleness +undestructibly +undestructive +undestructively +undestructiveness +undetachable +undetached +undetachment +undetailed +undetainable +undetained +undetectable +undetectably +undetected +undetectible +undeteriorated +undeteriorating +undeteriorative +undeterminable +undeterminableness +undeterminably +undeterminate +undetermination +undetermined +undeterminedly +undeterminedness +undetermining +undeterrability +undeterrable +undeterrably +undeterred +undeterring +undetestability +undetestable +undetestableness +undetestably +undetested +undetesting +undethronable +undethroned +undetonated +undetracting +undetractingly +undetractive +undetractively +undetractory +undetrimental +undetrimentally +undevastated +undevastating +undevastatingly +undevelopable +undeveloped +undeveloping +undevelopment +undevelopmental +undevelopmentally +undeviable +undeviated +undeviating +undeviatingly +undeviation +undevil +undevilish +undevious +undeviously +undeviousness +undevisable +undevised +undevoted +undevotion +undevotional +undevoured +undevout +undevoutly +undevoutness +undewed +undewy +undewily +undewiness +undexterous +undexterously +undexterousness +undextrous +undextrously +undextrousness +undflow +undy +undiabetic +undyable +undiademed +undiagnosable +undiagnosed +undiagramed +undiagrammatic +undiagrammatical +undiagrammatically +undiagrammed +undialed +undialyzed +undialled +undiametric +undiametrical +undiametrically +undiamonded +undiapered +undiaphanous +undiaphanously +undiaphanousness +undiatonic +undiatonically +undichotomous +undichotomously +undictated +undictatorial +undictatorially +undid +undidactic +undye +undyeable +undyed +undies +undieted +undifferenced +undifferent +undifferentiable +undifferentiably +undifferential +undifferentiated +undifferentiating +undifferentiation +undifferently +undiffering +undifficult +undifficultly +undiffident +undiffidently +undiffracted +undiffractive +undiffractively +undiffractiveness +undiffused +undiffusible +undiffusive +undiffusively +undiffusiveness +undig +undigenous +undigest +undigestable +undigested +undigestible +undigesting +undigestion +undigged +undight +undighted +undigitated +undigne +undignify +undignified +undignifiedly +undignifiedness +undigressive +undigressively +undigressiveness +undying +undyingly +undyingness +undiked +undilapidated +undilatable +undilated +undilating +undilative +undilatory +undilatorily +undiligent +undiligently +undilute +undiluted +undiluting +undilution +undiluvial +undiluvian +undim +undimensioned +undimerous +undimidiate +undimidiated +undiminishable +undiminishableness +undiminishably +undiminished +undiminishing +undiminutive +undimly +undimmed +undimpled +undynamic +undynamically +undynamited +undine +undined +undines +undinted +undiocesed +undiphthongize +undiplomaed +undiplomatic +undiplomatically +undipped +undirect +undirected +undirectional +undirectly +undirectness +undirk +undisabled +undisadvantageous +undisagreeable +undisappearing +undisappointable +undisappointed +undisappointing +undisarmed +undisastrous +undisastrously +undisbanded +undisbarred +undisburdened +undisbursed +undiscardable +undiscarded +undiscernable +undiscernably +undiscerned +undiscernedly +undiscernible +undiscernibleness +undiscernibly +undiscerning +undiscerningly +undiscerningness +undischargeable +undischarged +undiscipled +undisciplinable +undiscipline +undisciplined +undisciplinedness +undisclaimed +undisclosable +undisclose +undisclosed +undisclosing +undiscolored +undiscoloured +undiscomfitable +undiscomfited +undiscomposed +undisconcerted +undisconnected +undisconnectedly +undiscontinued +undiscordant +undiscordantly +undiscording +undiscountable +undiscounted +undiscourageable +undiscouraged +undiscouraging +undiscouragingly +undiscoursed +undiscoverability +undiscoverable +undiscoverableness +undiscoverably +undiscovered +undiscreditable +undiscredited +undiscreet +undiscreetly +undiscreetness +undiscretion +undiscriminated +undiscriminating +undiscriminatingly +undiscriminatingness +undiscriminative +undiscriminativeness +undiscriminatory +undiscursive +undiscussable +undiscussed +undisdained +undisdaining +undiseased +undisestablished +undisfigured +undisfranchised +undisfulfilled +undisgorged +undisgraced +undisguisable +undisguise +undisguised +undisguisedly +undisguisedness +undisguising +undisgusted +undisheartened +undished +undisheveled +undishonored +undisillusioned +undisinfected +undisinheritable +undisinherited +undisintegrated +undisinterested +undisjoined +undisjointed +undisliked +undislocated +undislodgeable +undislodged +undismay +undismayable +undismayed +undismayedly +undismantled +undismembered +undismissed +undismounted +undisobedient +undisobeyed +undisobliging +undisordered +undisorderly +undisorganized +undisowned +undisowning +undisparaged +undisparity +undispassionate +undispassionately +undispassionateness +undispatchable +undispatched +undispatching +undispellable +undispelled +undispensable +undispensed +undispensing +undispersed +undispersing +undisplaceable +undisplaced +undisplay +undisplayable +undisplayed +undisplaying +undisplanted +undispleased +undispose +undisposed +undisposedness +undisprivacied +undisprovable +undisproved +undisproving +undisputable +undisputableness +undisputably +undisputatious +undisputatiously +undisputatiousness +undisputed +undisputedly +undisputedness +undisputing +undisqualifiable +undisqualified +undisquieted +undisreputable +undisrobed +undisrupted +undissected +undissembled +undissembledness +undissembling +undissemblingly +undisseminated +undissenting +undissevered +undissimulated +undissimulating +undissipated +undissociated +undissoluble +undissolute +undissoluteness +undissolvable +undissolved +undissolving +undissonant +undissonantly +undissuadable +undissuadably +undissuade +undistanced +undistant +undistantly +undistasted +undistasteful +undistempered +undistend +undistended +undistilled +undistinct +undistinctive +undistinctly +undistinctness +undistinguish +undistinguishable +undistinguishableness +undistinguishably +undistinguished +undistinguishedness +undistinguishing +undistinguishingly +undistorted +undistortedly +undistorting +undistracted +undistractedly +undistractedness +undistracting +undistractingly +undistrained +undistraught +undistress +undistressed +undistributed +undistrusted +undistrustful +undistrustfully +undistrustfulness +undisturbable +undisturbance +undisturbed +undisturbedly +undisturbedness +undisturbing +undisturbingly +unditched +undithyrambic +undittoed +undiuretic +undiurnal +undiurnally +undivable +undivergent +undivergently +undiverging +undiverse +undiversely +undiverseness +undiversified +undiverted +undivertible +undivertibly +undiverting +undivertive +undivested +undivestedly +undividable +undividableness +undividably +undivided +undividedly +undividedness +undividing +undividual +undivinable +undivined +undivinely +undivinelike +undivining +undivisible +undivisive +undivisively +undivisiveness +undivorceable +undivorced +undivorcedness +undivorcing +undivulgable +undivulgeable +undivulged +undivulging +undizened +undizzied +undo +undoable +undocible +undock +undocked +undocketed +undocking +undocks +undoctor +undoctored +undoctrinal +undoctrinally +undoctrined +undocumentary +undocumented +undocumentedness +undodged +undoer +undoers +undoes +undoffed +undog +undogmatic +undogmatical +undogmatically +undoing +undoingness +undoings +undolled +undolorous +undolorously +undolorousness +undomed +undomestic +undomesticable +undomestically +undomesticate +undomesticated +undomestication +undomicilable +undomiciled +undominated +undominative +undomineering +undominical +undominoed +undon +undonated +undonating +undone +undoneness +undonkey +undonnish +undoomed +undoped +undormant +undose +undosed +undoting +undotted +undouble +undoubled +undoubles +undoubling +undoubtable +undoubtableness +undoubtably +undoubted +undoubtedly +undoubtedness +undoubtful +undoubtfully +undoubtfulness +undoubting +undoubtingly +undoubtingness +undouched +undoughty +undovelike +undoweled +undowelled +undowered +undowned +undowny +undrab +undraftable +undrafted +undrag +undragoned +undragooned +undrainable +undrained +undramatic +undramatical +undramatically +undramatisable +undramatizable +undramatized +undrape +undraped +undraperied +undrapes +undraping +undraw +undrawable +undrawing +undrawn +undraws +undreaded +undreadful +undreadfully +undreading +undreamed +undreamy +undreaming +undreamlike +undreamt +undredged +undreggy +undrenched +undress +undressed +undresses +undressing +undrest +undrew +undry +undryable +undried +undrifting +undrying +undrillable +undrilled +undrinkable +undrinkableness +undrinkably +undrinking +undripping +undrivable +undrivableness +undriven +undronelike +undrooping +undropped +undropsical +undrossy +undrossily +undrossiness +undrowned +undrubbed +undrugged +undrunk +undrunken +undrunkenness +undualistic +undualistically +undualize +undub +undubbed +undubious +undubiously +undubiousness +undubitable +undubitably +undubitative +undubitatively +unducal +unduchess +unductile +undue +unduelling +undueness +undug +unduke +undulance +undulancy +undulant +undular +undularly +undulatance +undulate +undulated +undulately +undulates +undulating +undulatingly +undulation +undulationist +undulations +undulative +undulator +undulatory +undulatus +unduly +undull +undulled +undullness +unduloid +undulose +undulous +undumbfounded +undumped +unduncelike +undunged +undupability +undupable +unduped +unduplicability +unduplicable +unduplicated +unduplicative +unduplicity +undurability +undurable +undurableness +undurably +undure +undust +undusted +undusty +unduteous +unduteously +unduteousness +unduty +undutiable +undutiful +undutifully +undutifulness +undwarfed +undwellable +undwelt +undwindling +uneager +uneagerly +uneagerness +uneagled +uneared +unearly +unearned +unearnest +unearnestly +unearnestness +unearth +unearthed +unearthing +unearthly +unearthliness +unearths +unease +uneaseful +uneasefulness +uneases +uneasy +uneasier +uneasiest +uneasily +uneasiness +uneastern +uneatable +uneatableness +uneated +uneaten +uneath +uneaths +uneating +uneaved +unebbed +unebbing +unebriate +unebullient +uneccentric +uneccentrically +unecclesiastic +unecclesiastical +unecclesiastically +unechoed +unechoic +unechoing +uneclectic +uneclectically +uneclipsed +uneclipsing +unecliptic +unecliptical +unecliptically +uneconomic +uneconomical +uneconomically +uneconomicalness +uneconomizing +unecstatic +unecstatically +unedacious +unedaciously +uneddied +uneddying +unedge +unedged +unedging +unedible +unedibleness +unedibly +unedificial +unedified +unedifying +uneditable +unedited +uneducable +uneducableness +uneducably +uneducate +uneducated +uneducatedly +uneducatedness +uneducative +uneduced +uneffable +uneffaceable +uneffaceably +uneffaced +uneffected +uneffectible +uneffective +uneffectively +uneffectiveness +uneffectless +uneffectual +uneffectually +uneffectualness +uneffectuated +uneffeminate +uneffeminated +uneffeminately +uneffeness +uneffervescent +uneffervescently +uneffete +uneffeteness +unefficacious +unefficaciously +unefficient +uneffigiated +uneffulgent +uneffulgently +uneffused +uneffusing +uneffusive +uneffusively +uneffusiveness +unegal +unegally +unegalness +unegoist +unegoistical +unegoistically +unegotistical +unegotistically +unegregious +unegregiously +unegregiousness +uneye +uneyeable +uneyed +unejaculated +unejected +unejective +unelaborate +unelaborated +unelaborately +unelaborateness +unelapsed +unelastic +unelastically +unelasticity +unelated +unelating +unelbowed +unelderly +unelect +unelectable +unelected +unelective +unelectric +unelectrical +unelectrically +unelectrify +unelectrified +unelectrifying +unelectrized +unelectronic +uneleemosynary +unelegant +unelegantly +unelegantness +unelemental +unelementally +unelementary +unelevated +unelicitable +unelicited +unelided +unelidible +uneligibility +uneligible +uneligibly +uneliminated +unelliptical +unelongated +uneloped +uneloping +uneloquent +uneloquently +unelucidated +unelucidating +unelucidative +uneludable +uneluded +unelusive +unelusively +unelusiveness +unelusory +unemaciated +unemanative +unemancipable +unemancipated +unemancipative +unemasculated +unemasculative +unemasculatory +unembayed +unembalmed +unembanked +unembarassed +unembarrassed +unembarrassedly +unembarrassedness +unembarrassing +unembarrassment +unembased +unembattled +unembellished +unembellishedness +unembellishment +unembezzled +unembittered +unemblazoned +unembodied +unembodiment +unembossed +unemboweled +unembowelled +unembowered +unembraceable +unembraced +unembryonal +unembryonic +unembroidered +unembroiled +unemendable +unemended +unemerged +unemergent +unemerging +unemigrant +unemigrating +uneminent +uneminently +unemissive +unemitted +unemitting +unemolumentary +unemolumented +unemotional +unemotionalism +unemotionally +unemotionalness +unemotioned +unemotive +unemotively +unemotiveness +unempaneled +unempanelled +unemphasized +unemphasizing +unemphatic +unemphatical +unemphatically +unempirical +unempirically +unemploy +unemployability +unemployable +unemployableness +unemployably +unemployed +unemployment +unempoisoned +unempowered +unempt +unempty +unemptiable +unemptied +unemulative +unemulous +unemulsified +unenabled +unenacted +unenameled +unenamelled +unenamored +unenamoured +unencamped +unenchafed +unenchant +unenchanted +unenciphered +unencircled +unencysted +unenclosed +unencompassed +unencored +unencounterable +unencountered +unencouraged +unencouraging +unencrypted +unencroached +unencroaching +unencumber +unencumbered +unencumberedly +unencumberedness +unencumbering +unendable +unendamaged +unendangered +unendeared +unendeavored +unended +unendemic +unending +unendingly +unendingness +unendly +unendorsable +unendorsed +unendowed +unendowing +unendued +unendurability +unendurable +unendurableness +unendurably +unendured +unenduring +unenduringly +unenergetic +unenergetically +unenergized +unenervated +unenfeebled +unenfiladed +unenforceability +unenforceable +unenforced +unenforcedly +unenforcedness +unenforcibility +unenfranchised +unengaged +unengaging +unengagingness +unengendered +unengineered +unenglish +unenglished +unengraved +unengraven +unengrossed +unengrossing +unenhanced +unenigmatic +unenigmatical +unenigmatically +unenjoyable +unenjoyableness +unenjoyably +unenjoyed +unenjoying +unenjoyingly +unenjoined +unenkindled +unenlarged +unenlarging +unenlightened +unenlightening +unenlightenment +unenlisted +unenlivened +unenlivening +unennobled +unennobling +unenounced +unenquired +unenquiring +unenraged +unenraptured +unenrichable +unenrichableness +unenriched +unenriching +unenrobed +unenrolled +unenshrined +unenslave +unenslaved +unensnared +unensouled +unensured +unentailed +unentangle +unentangleable +unentangled +unentanglement +unentangler +unentangling +unenterable +unentered +unentering +unenterprise +unenterprised +unenterprising +unenterprisingly +unenterprisingness +unentertainable +unentertained +unentertaining +unentertainingly +unentertainingness +unenthralled +unenthralling +unenthroned +unenthused +unenthusiasm +unenthusiastic +unenthusiastically +unenticeable +unenticed +unenticing +unentire +unentitled +unentitledness +unentitlement +unentombed +unentomological +unentrance +unentranced +unentrapped +unentreatable +unentreated +unentreating +unentrenched +unentwined +unenumerable +unenumerated +unenumerative +unenunciable +unenunciated +unenunciative +unenveloped +unenvenomed +unenviability +unenviable +unenviably +unenvied +unenviedly +unenvying +unenvyingly +unenvious +unenviously +unenvironed +unenwoven +unepauleted +unepauletted +unephemeral +unephemerally +unepic +unepicurean +unepigrammatic +unepigrammatically +unepilogued +unepiscopal +unepiscopally +unepistolary +unepitaphed +unepithelial +unepitomised +unepitomized +unepochal +unequability +unequable +unequableness +unequably +unequal +unequalable +unequaled +unequalise +unequalised +unequalising +unequality +unequalize +unequalized +unequalizing +unequalled +unequally +unequalness +unequals +unequated +unequatorial +unequestrian +unequiangular +unequiaxed +unequilateral +unequilaterally +unequilibrated +unequine +unequipped +unequitable +unequitableness +unequitably +unequivalent +unequivalently +unequivalve +unequivalved +unequivocably +unequivocal +unequivocally +unequivocalness +unequivocating +uneradicable +uneradicated +uneradicative +unerasable +unerased +unerasing +unerect +unerected +unermined +unerodable +uneroded +unerodent +uneroding +unerosive +unerotic +unerrable +unerrableness +unerrably +unerrancy +unerrant +unerrantly +unerratic +unerring +unerringly +unerringness +unerroneous +unerroneously +unerroneousness +unerudite +unerupted +uneruptive +unescaladed +unescalloped +unescapable +unescapableness +unescapably +unescaped +unescheatable +unescheated +uneschewable +uneschewably +uneschewed +unesco +unescorted +unescutcheoned +unesoteric +unespied +unespousable +unespoused +unessayed +unessence +unessential +unessentially +unessentialness +unestablish +unestablishable +unestablished +unestablishment +unesteemed +unesthetic +unestimable +unestimableness +unestimably +unestimated +unestopped +unestranged +unetched +uneternal +uneternized +unethereal +unethereally +unetherealness +unethic +unethical +unethically +unethicalness +unethylated +unethnologic +unethnological +unethnologically +unetymologic +unetymological +unetymologically +unetymologizable +uneucharistical +uneugenic +uneugenical +uneugenically +uneulogised +uneulogized +uneuphemistic +uneuphemistical +uneuphemistically +uneuphonic +uneuphonious +uneuphoniously +uneuphoniousness +unevacuated +unevadable +unevaded +unevadible +unevading +unevaluated +unevanescent +unevanescently +unevangelic +unevangelical +unevangelically +unevangelised +unevangelized +unevaporate +unevaporated +unevaporative +unevasive +unevasively +unevasiveness +uneven +unevener +unevenest +unevenly +unevenness +uneventful +uneventfully +uneventfulness +uneversible +uneverted +unevicted +unevidenced +unevident +unevidential +unevil +unevilly +unevinced +unevincible +unevirated +uneviscerated +unevitable +unevitably +unevocable +unevocative +unevokable +unevoked +unevolutional +unevolutionary +unevolved +unexacerbated +unexacerbating +unexact +unexacted +unexactedly +unexacting +unexactingly +unexactingness +unexactly +unexactness +unexaggerable +unexaggerated +unexaggerating +unexaggerative +unexaggeratory +unexalted +unexalting +unexaminable +unexamined +unexamining +unexampled +unexampledness +unexasperated +unexasperating +unexcavated +unexceedable +unexceeded +unexcelled +unexcellent +unexcellently +unexcelling +unexceptable +unexcepted +unexcepting +unexceptionability +unexceptionable +unexceptionableness +unexceptionably +unexceptional +unexceptionality +unexceptionally +unexceptionalness +unexceptive +unexcerpted +unexcessive +unexcessively +unexcessiveness +unexchangeable +unexchangeableness +unexchangeabness +unexchanged +unexcised +unexcitability +unexcitable +unexcitablely +unexcitableness +unexcited +unexciting +unexclaiming +unexcludable +unexcluded +unexcluding +unexclusive +unexclusively +unexclusiveness +unexcogitable +unexcogitated +unexcogitative +unexcommunicated +unexcoriated +unexcorticated +unexcrescent +unexcrescently +unexcreted +unexcruciating +unexculpable +unexculpably +unexculpated +unexcursive +unexcursively +unexcusable +unexcusableness +unexcusably +unexcused +unexcusedly +unexcusedness +unexcusing +unexecrated +unexecutable +unexecuted +unexecuting +unexecutorial +unexemplary +unexemplifiable +unexemplified +unexempt +unexemptable +unexempted +unexemptible +unexempting +unexercisable +unexercise +unexercised +unexerted +unexhalable +unexhaled +unexhausted +unexhaustedly +unexhaustedness +unexhaustible +unexhaustibleness +unexhaustibly +unexhaustion +unexhaustive +unexhaustively +unexhaustiveness +unexhibitable +unexhibitableness +unexhibited +unexhilarated +unexhilarating +unexhilarative +unexhortative +unexhorted +unexhumed +unexigent +unexigently +unexigible +unexilable +unexiled +unexistence +unexistent +unexistential +unexistentially +unexisting +unexonerable +unexonerated +unexonerative +unexorable +unexorableness +unexorbitant +unexorbitantly +unexorcisable +unexorcisably +unexorcised +unexotic +unexotically +unexpandable +unexpanded +unexpanding +unexpansible +unexpansive +unexpansively +unexpansiveness +unexpect +unexpectability +unexpectable +unexpectably +unexpectant +unexpectantly +unexpected +unexpectedly +unexpectedness +unexpecteds +unexpecting +unexpectingly +unexpectorated +unexpedient +unexpediently +unexpeditable +unexpeditated +unexpedited +unexpeditious +unexpeditiously +unexpeditiousness +unexpellable +unexpelled +unexpendable +unexpended +unexpensive +unexpensively +unexpensiveness +unexperience +unexperienced +unexperiencedness +unexperient +unexperiential +unexperientially +unexperimental +unexperimentally +unexperimented +unexpert +unexpertly +unexpertness +unexpiable +unexpiated +unexpired +unexpiring +unexplainable +unexplainableness +unexplainably +unexplained +unexplainedly +unexplainedness +unexplaining +unexplanatory +unexplicable +unexplicableness +unexplicably +unexplicated +unexplicative +unexplicit +unexplicitly +unexplicitness +unexplodable +unexploded +unexploitable +unexploitation +unexploitative +unexploited +unexplorable +unexplorative +unexploratory +unexplored +unexplosive +unexplosively +unexplosiveness +unexponible +unexportable +unexported +unexporting +unexposable +unexposed +unexpostulating +unexpoundable +unexpounded +unexpress +unexpressable +unexpressableness +unexpressably +unexpressed +unexpressedly +unexpressible +unexpressibleness +unexpressibly +unexpressive +unexpressively +unexpressiveness +unexpressly +unexpropriable +unexpropriated +unexpugnable +unexpunged +unexpurgated +unexpurgatedly +unexpurgatedness +unextendable +unextended +unextendedly +unextendedness +unextendibility +unextendible +unextensibility +unextensible +unextenuable +unextenuated +unextenuating +unexterminable +unexterminated +unexternal +unexternality +unexterritoriality +unextinct +unextinctness +unextinguishable +unextinguishableness +unextinguishably +unextinguished +unextirpable +unextirpated +unextolled +unextortable +unextorted +unextractable +unextracted +unextradited +unextraneous +unextraneously +unextraordinary +unextravagance +unextravagant +unextravagantly +unextravagating +unextravasated +unextreme +unextremeness +unextricable +unextricated +unextrinsic +unextruded +unexuberant +unexuberantly +unexudative +unexuded +unexultant +unexultantly +unfabled +unfabling +unfabricated +unfabulous +unfabulously +unfacaded +unface +unfaceable +unfaced +unfaceted +unfacetious +unfacetiously +unfacetiousness +unfacile +unfacilely +unfacilitated +unfact +unfactional +unfactious +unfactiously +unfactitious +unfactorable +unfactored +unfactual +unfactually +unfactualness +unfadable +unfaded +unfading +unfadingly +unfadingness +unfagged +unfagoted +unfailable +unfailableness +unfailably +unfailed +unfailing +unfailingly +unfailingness +unfain +unfaint +unfainting +unfaintly +unfair +unfairer +unfairest +unfairylike +unfairly +unfairminded +unfairness +unfaith +unfaithful +unfaithfully +unfaithfulness +unfaiths +unfaithworthy +unfaithworthiness +unfakable +unfaked +unfalcated +unfallacious +unfallaciously +unfallaciousness +unfallen +unfallenness +unfallible +unfallibleness +unfallibly +unfalling +unfallowed +unfalse +unfalseness +unfalsifiable +unfalsified +unfalsifiedness +unfalsity +unfaltering +unfalteringly +unfamed +unfamiliar +unfamiliarised +unfamiliarity +unfamiliarized +unfamiliarly +unfamous +unfanatical +unfanatically +unfancy +unfanciable +unfancied +unfanciful +unfancifulness +unfanciness +unfanged +unfanned +unfantastic +unfantastical +unfantastically +unfar +unfarced +unfarcical +unfardle +unfarewelled +unfarmable +unfarmed +unfarming +unfarrowed +unfarsighted +unfasciate +unfasciated +unfascinate +unfascinated +unfascinating +unfashion +unfashionable +unfashionableness +unfashionably +unfashioned +unfast +unfasten +unfastenable +unfastened +unfastener +unfastening +unfastens +unfastidious +unfastidiously +unfastidiousness +unfasting +unfatalistic +unfatalistically +unfated +unfather +unfathered +unfatherly +unfatherlike +unfatherliness +unfathomability +unfathomable +unfathomableness +unfathomably +unfathomed +unfatigable +unfatigue +unfatigueable +unfatigued +unfatiguing +unfattable +unfatted +unfatten +unfatty +unfatuitous +unfatuitously +unfauceted +unfaultable +unfaultfinding +unfaulty +unfavorable +unfavorableness +unfavorably +unfavored +unfavoring +unfavorite +unfavourable +unfavourableness +unfavourably +unfavoured +unfavouring +unfavourite +unfawning +unfazed +unfazedness +unfealty +unfeared +unfearful +unfearfully +unfearfulness +unfeary +unfearing +unfearingly +unfearingness +unfeasable +unfeasableness +unfeasably +unfeasibility +unfeasible +unfeasibleness +unfeasibly +unfeasted +unfeastly +unfeather +unfeathered +unfeaty +unfeatured +unfebrile +unfecund +unfecundated +unfed +unfederal +unfederated +unfederative +unfederatively +unfeeble +unfeebleness +unfeebly +unfeed +unfeedable +unfeeding +unfeeing +unfeel +unfeelable +unfeeling +unfeelingly +unfeelingness +unfeignable +unfeignableness +unfeignably +unfeigned +unfeignedly +unfeignedness +unfeigning +unfeigningly +unfeigningness +unfele +unfelicitated +unfelicitating +unfelicitous +unfelicitously +unfelicitousness +unfeline +unfellable +unfelled +unfellied +unfellow +unfellowed +unfellowly +unfellowlike +unfellowshiped +unfelon +unfelony +unfelonious +unfeloniously +unfelt +unfelted +unfemale +unfeminine +unfemininely +unfeminineness +unfemininity +unfeminise +unfeminised +unfeminising +unfeminist +unfeminize +unfeminized +unfeminizing +unfence +unfenced +unfences +unfencing +unfended +unfendered +unfenestral +unfenestrated +unfeoffed +unfermentable +unfermentableness +unfermentably +unfermentative +unfermented +unfermenting +unfernlike +unferocious +unferociously +unferreted +unferreting +unferried +unfertile +unfertileness +unfertilisable +unfertilised +unfertilising +unfertility +unfertilizable +unfertilized +unfertilizing +unfervent +unfervently +unfervid +unfervidly +unfester +unfestered +unfestering +unfestival +unfestive +unfestively +unfestooned +unfetchable +unfetched +unfetching +unfeted +unfetter +unfettered +unfettering +unfetters +unfettled +unfeudal +unfeudalise +unfeudalised +unfeudalising +unfeudalize +unfeudalized +unfeudalizing +unfeudally +unfeued +unfevered +unfeverish +unfew +unffroze +unfibbed +unfibbing +unfiber +unfibered +unfibred +unfibrous +unfibrously +unfickle +unfictitious +unfictitiously +unfictitiousness +unfidelity +unfidgeting +unfiducial +unfielded +unfiend +unfiendlike +unfierce +unfiercely +unfiery +unfight +unfightable +unfighting +unfigurable +unfigurative +unfigured +unfilamentous +unfilched +unfile +unfiled +unfilial +unfilially +unfilialness +unfiling +unfill +unfillable +unfilled +unfilleted +unfilling +unfilm +unfilmed +unfilterable +unfiltered +unfiltering +unfiltrated +unfimbriated +unfinable +unfinanced +unfinancial +unfindable +unfine +unfineable +unfined +unfinessed +unfingered +unfingured +unfinical +unfinicalness +unfinish +unfinishable +unfinished +unfinishedly +unfinishedness +unfinite +unfired +unfireproof +unfiring +unfirm +unfirmamented +unfirmly +unfirmness +unfiscal +unfiscally +unfishable +unfished +unfishing +unfishlike +unfissile +unfistulous +unfit +unfitly +unfitness +unfits +unfittable +unfitted +unfittedness +unfitten +unfitty +unfitting +unfittingly +unfittingness +unfix +unfixable +unfixated +unfixative +unfixed +unfixedness +unfixes +unfixing +unfixity +unfixt +unflag +unflagged +unflagging +unflaggingly +unflaggingness +unflagitious +unflagrant +unflagrantly +unflayed +unflaked +unflaky +unflaking +unflamboyant +unflamboyantly +unflame +unflaming +unflanged +unflank +unflanked +unflappability +unflappable +unflappably +unflapping +unflared +unflaring +unflashy +unflashing +unflat +unflated +unflatted +unflattened +unflatterable +unflattered +unflattering +unflatteringly +unflaunted +unflaunting +unflauntingly +unflavored +unflavorous +unflavoured +unflavourous +unflawed +unflead +unflecked +unfledge +unfledged +unfledgedness +unfleece +unfleeced +unfleeing +unfleeting +unflesh +unfleshed +unfleshy +unfleshly +unfleshliness +unfletched +unflexed +unflexibility +unflexible +unflexibleness +unflexibly +unflickering +unflickeringly +unflighty +unflying +unflinching +unflinchingly +unflinchingness +unflintify +unflippant +unflippantly +unflirtatious +unflirtatiously +unflirtatiousness +unflitched +unfloatable +unfloating +unflock +unfloggable +unflogged +unflooded +unfloor +unfloored +unflorid +unflossy +unflounced +unfloundering +unfloured +unflourished +unflourishing +unflouted +unflower +unflowered +unflowery +unflowering +unflowing +unflown +unfluctuant +unfluctuating +unfluent +unfluently +unfluffed +unfluffy +unfluid +unfluked +unflunked +unfluorescent +unfluorinated +unflurried +unflush +unflushed +unflustered +unfluted +unflutterable +unfluttered +unfluttering +unfluvial +unfluxile +unfoaled +unfoamed +unfoaming +unfocused +unfocusing +unfocussed +unfocussing +unfogged +unfoggy +unfogging +unfoilable +unfoiled +unfoisted +unfold +unfoldable +unfolded +unfolden +unfolder +unfolders +unfolding +unfoldment +unfolds +unfoldure +unfoliaged +unfoliated +unfollowable +unfollowed +unfollowing +unfomented +unfond +unfondled +unfondly +unfondness +unfoodful +unfool +unfoolable +unfooled +unfooling +unfoolish +unfoolishly +unfoolishness +unfooted +unfootsore +unfoppish +unforaged +unforbade +unforbearance +unforbearing +unforbid +unforbidded +unforbidden +unforbiddenly +unforbiddenness +unforbidding +unforceable +unforced +unforcedly +unforcedness +unforceful +unforcefully +unforcible +unforcibleness +unforcibly +unforcing +unfordable +unfordableness +unforded +unforeboded +unforeboding +unforecast +unforecasted +unforegone +unforeign +unforeknowable +unforeknown +unforensic +unforensically +unforeordained +unforesee +unforeseeable +unforeseeableness +unforeseeably +unforeseeing +unforeseeingly +unforeseen +unforeseenly +unforeseenness +unforeshortened +unforest +unforestallable +unforestalled +unforested +unforetellable +unforethought +unforethoughtful +unforetold +unforewarned +unforewarnedness +unforfeit +unforfeitable +unforfeited +unforfeiting +unforgeability +unforgeable +unforged +unforget +unforgetful +unforgetfully +unforgetfulness +unforgettability +unforgettable +unforgettableness +unforgettably +unforgetting +unforgettingly +unforgivable +unforgivableness +unforgivably +unforgiven +unforgiveness +unforgiver +unforgiving +unforgivingly +unforgivingness +unforgoable +unforgone +unforgot +unforgotten +unfork +unforked +unforkedness +unforlorn +unform +unformal +unformalised +unformalistic +unformality +unformalized +unformally +unformalness +unformative +unformatted +unformed +unformidable +unformidableness +unformidably +unformulable +unformularizable +unformularize +unformulated +unformulistic +unforsaken +unforsaking +unforseen +unforsook +unforsworn +unforthright +unfortify +unfortifiable +unfortified +unfortuitous +unfortuitously +unfortuitousness +unfortunate +unfortunately +unfortunateness +unfortunates +unfortune +unforward +unforwarded +unforwardly +unfossiliferous +unfossilised +unfossilized +unfostered +unfostering +unfought +unfoughten +unfoul +unfoulable +unfouled +unfouling +unfoully +unfound +unfounded +unfoundedly +unfoundedness +unfoundered +unfoundering +unfountained +unfowllike +unfoxed +unfoxy +unfractious +unfractiously +unfractiousness +unfractured +unfragile +unfragmented +unfragrance +unfragrant +unfragrantly +unfrayed +unfrail +unframable +unframableness +unframably +unframe +unframeable +unframed +unfranchised +unfrangible +unfrank +unfrankable +unfranked +unfrankly +unfrankness +unfraternal +unfraternally +unfraternised +unfraternized +unfraternizing +unfraudulent +unfraudulently +unfraught +unfrazzled +unfreakish +unfreakishly +unfreakishness +unfreckled +unfree +unfreed +unfreedom +unfreehold +unfreeing +unfreeingly +unfreely +unfreeman +unfreeness +unfrees +unfreezable +unfreeze +unfreezes +unfreezing +unfreight +unfreighted +unfreighting +unfrenchified +unfrenzied +unfrequency +unfrequent +unfrequentable +unfrequentative +unfrequented +unfrequentedness +unfrequently +unfrequentness +unfret +unfretful +unfretfully +unfretted +unfretty +unfretting +unfriable +unfriableness +unfriarlike +unfricative +unfrictional +unfrictionally +unfrictioned +unfried +unfriend +unfriended +unfriendedness +unfriending +unfriendly +unfriendlier +unfriendliest +unfriendlike +unfriendlily +unfriendliness +unfriendship +unfrighted +unfrightenable +unfrightened +unfrightenedness +unfrightening +unfrightful +unfrigid +unfrigidity +unfrigidly +unfrigidness +unfrill +unfrilled +unfrilly +unfringe +unfringed +unfringing +unfrisky +unfrisking +unfrittered +unfrivolous +unfrivolously +unfrivolousness +unfrizz +unfrizzy +unfrizzled +unfrizzly +unfrock +unfrocked +unfrocking +unfrocks +unfroglike +unfrolicsome +unfronted +unfrost +unfrosted +unfrosty +unfrothed +unfrothing +unfrounced +unfroward +unfrowardly +unfrowning +unfroze +unfrozen +unfructed +unfructify +unfructified +unfructuous +unfructuously +unfrugal +unfrugality +unfrugally +unfrugalness +unfruitful +unfruitfully +unfruitfulness +unfruity +unfrustrable +unfrustrably +unfrustratable +unfrustrated +unfrutuosity +unfuddled +unfudged +unfueled +unfuelled +unfugal +unfugally +unfugitive +unfugitively +unfulfil +unfulfill +unfulfillable +unfulfilled +unfulfilling +unfulfillment +unfulfilment +unfulgent +unfulgently +unfull +unfulled +unfully +unfulminant +unfulminated +unfulminating +unfulsome +unfumbled +unfumbling +unfumed +unfumigated +unfuming +unfunctional +unfunctionally +unfunctioning +unfundable +unfundamental +unfundamentally +unfunded +unfunereal +unfunereally +unfungible +unfunny +unfunnily +unfunniness +unfur +unfurbelowed +unfurbished +unfurcate +unfurious +unfurl +unfurlable +unfurled +unfurling +unfurls +unfurnish +unfurnished +unfurnishedness +unfurnitured +unfurred +unfurrow +unfurrowable +unfurrowed +unfurthersome +unfused +unfusibility +unfusible +unfusibleness +unfusibly +unfusibness +unfussed +unfussy +unfussily +unfussiness +unfussing +unfutile +unfuturistic +ung +ungabled +ungag +ungaged +ungagged +ungagging +ungain +ungainable +ungained +ungainful +ungainfully +ungainfulness +ungaining +ungainly +ungainlier +ungainliest +ungainlike +ungainliness +ungainness +ungainsayable +ungainsayably +ungainsaid +ungainsaying +ungainsome +ungainsomely +ungaite +ungaited +ungallant +ungallantly +ungallantness +ungalled +ungalleried +ungalling +ungalloping +ungalvanized +ungambled +ungambling +ungamboled +ungamboling +ungambolled +ungambolling +ungamelike +ungamy +unganged +ungangrened +ungangrenous +ungaping +ungaraged +ungarbed +ungarbled +ungardened +ungargled +ungarland +ungarlanded +ungarment +ungarmented +ungarnered +ungarnish +ungarnished +ungaro +ungarrisoned +ungarrulous +ungarrulously +ungarrulousness +ungarter +ungartered +ungashed +ungassed +ungastric +ungated +ungathered +ungaudy +ungaudily +ungaudiness +ungauged +ungauntlet +ungauntleted +ungazetted +ungazing +ungear +ungeared +ungelatinizable +ungelatinized +ungelatinous +ungelatinously +ungelatinousness +ungelded +ungelt +ungeminated +ungendered +ungenerable +ungeneral +ungeneraled +ungeneralised +ungeneralising +ungeneralized +ungeneralizing +ungenerate +ungenerated +ungenerating +ungenerative +ungeneric +ungenerical +ungenerically +ungenerosity +ungenerous +ungenerously +ungenerousness +ungenial +ungeniality +ungenially +ungenialness +ungenitive +ungenitured +ungenius +ungenteel +ungenteely +ungenteelly +ungenteelness +ungentile +ungentility +ungentilize +ungentle +ungentled +ungentleman +ungentlemanize +ungentlemanly +ungentlemanlike +ungentlemanlikeness +ungentlemanliness +ungentleness +ungentlewomanlike +ungently +ungenuine +ungenuinely +ungenuineness +ungeodetic +ungeodetical +ungeodetically +ungeographic +ungeographical +ungeographically +ungeological +ungeologically +ungeometric +ungeometrical +ungeometrically +ungeometricalness +ungermane +ungerminant +ungerminated +ungerminating +ungerminative +ungermlike +ungerontic +ungesticular +ungesticulating +ungesticulative +ungesticulatory +ungesting +ungestural +ungesturing +unget +ungetable +ungetatable +ungettable +ungeuntary +ungeuntarium +unghostly +unghostlike +ungiant +ungibbet +ungiddy +ungift +ungifted +ungiftedness +ungild +ungilded +ungill +ungilled +ungilt +ungymnastic +ungingled +unginned +ungypsylike +ungyrating +ungird +ungirded +ungirding +ungirdle +ungirdled +ungirdling +ungirds +ungirlish +ungirlishly +ungirlishness +ungirt +ungirth +ungirthed +ungivable +ungive +ungyve +ungiveable +ungyved +ungiven +ungiving +ungivingness +ungka +unglacial +unglacially +unglaciated +unglad +ungladden +ungladdened +ungladly +ungladness +ungladsome +unglamorous +unglamorously +unglamorousness +unglamourous +unglamourously +unglandular +unglaring +unglassed +unglassy +unglaze +unglazed +ungleaming +ungleaned +unglee +ungleeful +ungleefully +unglib +unglibly +ungliding +unglimpsed +unglistening +unglittery +unglittering +ungloating +unglobe +unglobular +unglobularly +ungloom +ungloomed +ungloomy +ungloomily +unglory +unglorify +unglorified +unglorifying +unglorious +ungloriously +ungloriousness +unglosed +ungloss +unglossaried +unglossed +unglossy +unglossily +unglossiness +unglove +ungloved +ungloves +ungloving +unglowering +ungloweringly +unglowing +unglozed +unglue +unglued +unglues +ungluing +unglutinate +unglutinosity +unglutinous +unglutinously +unglutinousness +unglutted +ungluttonous +ungnarled +ungnarred +ungnaw +ungnawed +ungnawn +ungnostic +ungoaded +ungoatlike +ungod +ungoddess +ungodly +ungodlier +ungodliest +ungodlike +ungodlily +ungodliness +ungodmothered +ungoggled +ungoitered +ungold +ungolden +ungone +ungood +ungoodly +ungoodliness +ungoodness +ungored +ungorge +ungorged +ungorgeous +ungospel +ungospelized +ungospelled +ungospellike +ungossipy +ungossiping +ungot +ungothic +ungotten +ungouged +ungouty +ungovernability +ungovernable +ungovernableness +ungovernably +ungoverned +ungovernedness +ungoverning +ungovernmental +ungovernmentally +ungown +ungowned +ungrabbing +ungrace +ungraced +ungraceful +ungracefully +ungracefulness +ungracious +ungraciously +ungraciousness +ungradated +ungradating +ungraded +ungradual +ungradually +ungraduated +ungraduating +ungraft +ungrafted +ungrayed +ungrain +ungrainable +ungrained +ungrammar +ungrammared +ungrammatic +ungrammatical +ungrammaticality +ungrammatically +ungrammaticalness +ungrammaticism +ungrand +ungrantable +ungranted +ungranular +ungranulated +ungraphable +ungraphic +ungraphical +ungraphically +ungraphitized +ungrapple +ungrappled +ungrappler +ungrappling +ungrasp +ungraspable +ungrasped +ungrasping +ungrassed +ungrassy +ungrated +ungrateful +ungratefully +ungratefulness +ungratifiable +ungratification +ungratified +ungratifying +ungratifyingly +ungrating +ungratitude +ungratuitous +ungratuitously +ungratuitousness +ungrave +ungraved +ungraveled +ungravely +ungravelled +ungravelly +ungraven +ungravitating +ungravitational +ungravitative +ungrazed +ungreased +ungreasy +ungreat +ungreatly +ungreatness +ungreeable +ungreedy +ungreen +ungreenable +ungreened +ungreeted +ungregarious +ungregariously +ungregariousness +ungreyed +ungrid +ungrieve +ungrieved +ungrieving +ungrilled +ungrimed +ungrindable +ungrinned +ungrip +ungripe +ungripped +ungripping +ungritty +ungrizzled +ungroaning +ungroined +ungroomed +ungrooved +ungropeable +ungross +ungrotesque +unground +ungroundable +ungroundably +ungrounded +ungroundedly +ungroundedness +ungroupable +ungrouped +ungroveling +ungrovelling +ungrow +ungrowing +ungrowling +ungrown +ungrubbed +ungrudged +ungrudging +ungrudgingly +ungrudgingness +ungruesome +ungruff +ungrumbling +ungrumblingly +ungrumpy +ungt +ungual +unguals +unguaranteed +unguard +unguardable +unguarded +unguardedly +unguardedness +unguarding +unguards +ungueal +unguent +unguenta +unguentary +unguentaria +unguentarian +unguentarium +unguentiferous +unguento +unguentous +unguents +unguentum +unguerdoned +ungues +unguessable +unguessableness +unguessed +unguessing +unguical +unguicorn +unguicular +unguiculata +unguiculate +unguiculated +unguicule +unguidable +unguidableness +unguidably +unguided +unguidedly +unguyed +unguiferous +unguiform +unguiled +unguileful +unguilefully +unguilefulness +unguillotined +unguilty +unguiltily +unguiltiness +unguiltless +unguinal +unguinous +unguirostral +unguis +ungula +ungulae +ungular +ungulata +ungulate +ungulated +ungulates +unguled +unguligrade +ungulite +ungull +ungullibility +ungullible +ungulous +ungulp +ungum +ungummed +ungushing +ungustatory +ungutted +unguttural +ungutturally +ungutturalness +unguzzled +unhabile +unhabit +unhabitability +unhabitable +unhabitableness +unhabitably +unhabited +unhabitual +unhabitually +unhabituate +unhabituated +unhabituatedness +unhacked +unhackled +unhackneyed +unhackneyedness +unhad +unhaft +unhafted +unhaggled +unhaggling +unhayed +unhailable +unhailed +unhair +unhaired +unhairer +unhairy +unhairily +unhairiness +unhairing +unhairs +unhale +unhallooed +unhallow +unhallowed +unhallowedness +unhallowing +unhallows +unhallucinated +unhallucinating +unhallucinatory +unhaloed +unhalsed +unhalted +unhalter +unhaltered +unhaltering +unhalting +unhaltingly +unhalved +unhammered +unhamper +unhampered +unhampering +unhand +unhandcuff +unhandcuffed +unhanded +unhandy +unhandicapped +unhandier +unhandiest +unhandily +unhandiness +unhanding +unhandled +unhands +unhandseled +unhandselled +unhandsome +unhandsomely +unhandsomeness +unhang +unhanged +unhanging +unhangs +unhanked +unhap +unhappen +unhappi +unhappy +unhappier +unhappiest +unhappily +unhappiness +unharangued +unharassed +unharbor +unharbored +unharbour +unharboured +unhard +unharden +unhardenable +unhardened +unhardy +unhardihood +unhardily +unhardiness +unhardness +unharked +unharmable +unharmed +unharmful +unharmfully +unharming +unharmony +unharmonic +unharmonical +unharmonically +unharmonious +unharmoniously +unharmoniousness +unharmonise +unharmonised +unharmonising +unharmonize +unharmonized +unharmonizing +unharness +unharnessed +unharnesses +unharnessing +unharped +unharping +unharried +unharrowed +unharsh +unharshly +unharshness +unharvested +unhashed +unhasp +unhasped +unhaste +unhasted +unhastened +unhasty +unhastily +unhastiness +unhasting +unhat +unhatchability +unhatchable +unhatched +unhatcheled +unhate +unhated +unhateful +unhating +unhatingly +unhats +unhatted +unhatting +unhauled +unhaunt +unhaunted +unhave +unhawked +unhazarded +unhazarding +unhazardous +unhazardously +unhazardousness +unhazed +unhazy +unhazily +unhaziness +unhead +unheaded +unheader +unheady +unheal +unhealable +unhealableness +unhealably +unhealed +unhealing +unhealth +unhealthful +unhealthfully +unhealthfulness +unhealthy +unhealthier +unhealthiest +unhealthily +unhealthiness +unhealthsome +unhealthsomeness +unheaped +unhearable +unheard +unhearing +unhearse +unhearsed +unheart +unhearten +unhearty +unheartily +unheartsome +unheatable +unheated +unheathen +unheaved +unheaven +unheavenly +unheavy +unheavily +unheaviness +unhectic +unhectically +unhectored +unhedge +unhedged +unhedging +unhedonistic +unhedonistically +unheed +unheeded +unheededly +unheedful +unheedfully +unheedfulness +unheedy +unheeding +unheedingly +unheeled +unheelpieced +unhefted +unheightened +unheired +unheld +unhele +unheler +unhelm +unhelmed +unhelmet +unhelmeted +unhelming +unhelms +unhelp +unhelpable +unhelpableness +unhelped +unhelpful +unhelpfully +unhelpfulness +unhelping +unhelved +unhemmed +unhende +unhent +unheppen +unheralded +unheraldic +unherbaceous +unherd +unherded +unhereditary +unheretical +unheritable +unhermetic +unhermitic +unhermitical +unhermitically +unhero +unheroic +unheroical +unheroically +unheroicalness +unheroicness +unheroism +unheroize +unherolike +unhesitant +unhesitantly +unhesitating +unhesitatingly +unhesitatingness +unhesitative +unhesitatively +unheuristic +unheuristically +unhewable +unhewed +unhewn +unhex +unhid +unhidable +unhidableness +unhidably +unhidated +unhidden +unhide +unhideable +unhideably +unhidebound +unhideboundness +unhideous +unhideously +unhideousness +unhydrated +unhydraulic +unhydrolized +unhydrolyzed +unhieratic +unhieratical +unhieratically +unhygenic +unhigh +unhygienic +unhygienically +unhygrometric +unhilarious +unhilariously +unhilariousness +unhilly +unhymeneal +unhymned +unhinderable +unhinderably +unhindered +unhindering +unhinderingly +unhinge +unhinged +unhingement +unhinges +unhinging +unhinted +unhip +unhyphenable +unhyphenated +unhyphened +unhypnotic +unhypnotically +unhypnotisable +unhypnotise +unhypnotised +unhypnotising +unhypnotizable +unhypnotize +unhypnotized +unhypnotizing +unhypocritical +unhypocritically +unhypothecated +unhypothetical +unhypothetically +unhipped +unhired +unhissed +unhysterical +unhysterically +unhistory +unhistoric +unhistorical +unhistorically +unhistoried +unhistrionic +unhit +unhitch +unhitched +unhitches +unhitching +unhittable +unhive +unhoard +unhoarded +unhoarding +unhoary +unhoaxability +unhoaxable +unhoaxed +unhobble +unhobbling +unhocked +unhoed +unhogged +unhoist +unhoisted +unhold +unholy +unholiday +unholier +unholiest +unholily +unholiness +unhollow +unhollowed +unholpen +unhome +unhomely +unhomelike +unhomelikeness +unhomeliness +unhomicidal +unhomiletic +unhomiletical +unhomiletically +unhomish +unhomogeneity +unhomogeneous +unhomogeneously +unhomogeneousness +unhomogenized +unhomologic +unhomological +unhomologically +unhomologized +unhomologous +unhoned +unhoneyed +unhonest +unhonesty +unhonestly +unhonied +unhonorable +unhonorably +unhonored +unhonourable +unhonourably +unhonoured +unhood +unhooded +unhooding +unhoods +unhoodwink +unhoodwinked +unhoofed +unhook +unhooked +unhooking +unhooks +unhoop +unhoopable +unhooped +unhooper +unhooted +unhope +unhoped +unhopedly +unhopedness +unhopeful +unhopefully +unhopefulness +unhoping +unhopingly +unhopped +unhoppled +unhorizoned +unhorizontal +unhorizontally +unhorned +unhorny +unhoroscopic +unhorrified +unhorse +unhorsed +unhorses +unhorsing +unhortative +unhortatively +unhose +unhosed +unhospitable +unhospitableness +unhospitably +unhospital +unhospitalized +unhostile +unhostilely +unhostileness +unhostility +unhot +unhounded +unhoundlike +unhouse +unhoused +unhouseled +unhouselike +unhouses +unhousewifely +unhousing +unhubristic +unhuddle +unhuddled +unhuddling +unhued +unhugged +unhull +unhulled +unhuman +unhumane +unhumanely +unhumaneness +unhumanise +unhumanised +unhumanising +unhumanistic +unhumanitarian +unhumanize +unhumanized +unhumanizing +unhumanly +unhumanness +unhumble +unhumbled +unhumbledness +unhumbleness +unhumbly +unhumbugged +unhumid +unhumidified +unhumidifying +unhumiliated +unhumiliating +unhumiliatingly +unhumored +unhumorous +unhumorously +unhumorousness +unhumoured +unhumourous +unhumourously +unhung +unhuntable +unhunted +unhurdled +unhurled +unhurried +unhurriedly +unhurriedness +unhurrying +unhurryingly +unhurt +unhurted +unhurtful +unhurtfully +unhurtfulness +unhurting +unhusbanded +unhusbandly +unhushable +unhushed +unhushing +unhusk +unhuskable +unhusked +unhusking +unhusks +unhustled +unhustling +unhutched +unhuzzaed +uni +unyachtsmanlike +unialgal +uniambic +uniambically +uniangulate +uniarticular +uniarticulate +uniat +uniate +uniatism +uniauriculate +uniauriculated +uniaxal +uniaxally +uniaxial +uniaxially +unibasal +unibivalent +unible +unibracteate +unibracteolate +unibranchiate +unicalcarate +unicameral +unicameralism +unicameralist +unicamerally +unicamerate +unicapsular +unicarinate +unicarinated +unice +uniced +unicef +unicell +unicellate +unicelled +unicellular +unicellularity +unicentral +unichord +unicycle +unicycles +unicyclist +uniciliate +unicing +unicism +unicist +unicity +uniclinal +unicolor +unicolorate +unicolored +unicolorous +unicolour +uniconoclastic +uniconoclastically +uniconstant +unicorn +unicorneal +unicornic +unicornlike +unicornous +unicorns +unicornuted +unicostate +unicotyledonous +unicum +unicursal +unicursality +unicursally +unicuspid +unicuspidate +unidactyl +unidactyle +unidactylous +unideaed +unideal +unidealised +unidealism +unidealist +unidealistic +unidealistically +unidealized +unideated +unideating +unideational +unidentate +unidentated +unidentical +unidentically +unidenticulate +unidentifiable +unidentifiableness +unidentifiably +unidentified +unidentifiedly +unidentifying +unideographic +unideographical +unideographically +unidextral +unidextrality +unidigitate +unidyllic +unidimensional +unidiomatic +unidiomatically +unidirect +unidirected +unidirection +unidirectional +unidirectionality +unidirectionally +unidle +unidleness +unidly +unidling +unidolatrous +unidolised +unidolized +unie +unyeaned +unyearned +unyearning +uniembryonate +uniequivalent +uniface +unifaced +unifaces +unifacial +unifactoral +unifactorial +unifarious +unify +unifiable +unific +unification +unificationist +unifications +unificator +unified +unifiedly +unifiedness +unifier +unifiers +unifies +unifying +unifilar +uniflagellate +unifloral +uniflorate +uniflorous +uniflow +uniflowered +unifocal +unifoliar +unifoliate +unifoliolate +unifolium +uniform +uniformal +uniformalization +uniformalize +uniformally +uniformation +uniformed +uniformer +uniformest +uniforming +uniformisation +uniformise +uniformised +uniformising +uniformist +uniformitarian +uniformitarianism +uniformity +uniformities +uniformization +uniformize +uniformized +uniformizing +uniformless +uniformly +uniformness +uniforms +unigenesis +unigenetic +unigenist +unigenistic +unigenital +unigeniture +unigenous +uniglandular +uniglobular +unignitable +unignited +unignitible +unigniting +unignominious +unignominiously +unignominiousness +unignorant +unignorantly +unignored +unignoring +unigravida +uniguttulate +unyielded +unyielding +unyieldingly +unyieldingness +unijugate +unijugous +unilabiate +unilabiated +unilamellar +unilamellate +unilaminar +unilaminate +unilateral +unilateralism +unilateralist +unilaterality +unilateralization +unilateralize +unilaterally +unilinear +unilingual +unilingualism +uniliteral +unilluded +unilludedly +unillumed +unilluminant +unilluminated +unilluminating +unillumination +unilluminative +unillumined +unillusioned +unillusive +unillusory +unillustrated +unillustrative +unillustrious +unillustriously +unillustriousness +unilobal +unilobar +unilobate +unilobe +unilobed +unilobular +unilocular +unilocularity +uniloculate +unimacular +unimaged +unimaginability +unimaginable +unimaginableness +unimaginably +unimaginary +unimaginative +unimaginatively +unimaginativeness +unimagine +unimagined +unimanual +unimbanked +unimbellished +unimbezzled +unimbibed +unimbibing +unimbittered +unimbodied +unimboldened +unimbordered +unimbosomed +unimbowed +unimbowered +unimbroiled +unimbrowned +unimbrued +unimbued +unimedial +unimitable +unimitableness +unimitably +unimitated +unimitating +unimitative +unimmaculate +unimmaculately +unimmaculateness +unimmanent +unimmanently +unimmediate +unimmediately +unimmediateness +unimmerged +unimmergible +unimmersed +unimmigrating +unimminent +unimmolated +unimmortal +unimmortalize +unimmortalized +unimmovable +unimmunised +unimmunized +unimmured +unimodal +unimodality +unimodular +unimolecular +unimolecularity +unimpacted +unimpair +unimpairable +unimpaired +unimpartable +unimparted +unimpartial +unimpartially +unimpartible +unimpassionate +unimpassionately +unimpassioned +unimpassionedly +unimpassionedness +unimpatient +unimpatiently +unimpawned +unimpeachability +unimpeachable +unimpeachableness +unimpeachably +unimpeached +unimpearled +unimped +unimpeded +unimpededly +unimpedible +unimpeding +unimpedingly +unimpedness +unimpelled +unimpenetrable +unimperative +unimperatively +unimperial +unimperialistic +unimperially +unimperious +unimperiously +unimpertinent +unimpertinently +unimpinging +unimplanted +unimplemented +unimplicable +unimplicate +unimplicated +unimplicit +unimplicitly +unimplied +unimplorable +unimplored +unimpoisoned +unimportance +unimportant +unimportantly +unimportantness +unimported +unimporting +unimportunate +unimportunately +unimportunateness +unimportuned +unimposed +unimposedly +unimposing +unimpostrous +unimpounded +unimpoverished +unimpowered +unimprecated +unimpregnable +unimpregnate +unimpregnated +unimpressed +unimpressibility +unimpressible +unimpressibleness +unimpressibly +unimpressionability +unimpressionable +unimpressionableness +unimpressive +unimpressively +unimpressiveness +unimprinted +unimprison +unimprisonable +unimprisoned +unimpropriated +unimprovable +unimprovableness +unimprovably +unimproved +unimprovedly +unimprovedness +unimprovement +unimproving +unimprovised +unimpugnable +unimpugned +unimpulsive +unimpulsively +unimpurpled +unimputable +unimputed +unimucronate +unimultiplex +unimuscular +uninaugurated +unincantoned +unincarcerated +unincarnate +unincarnated +unincensed +uninceptive +uninceptively +unincestuous +unincestuously +uninchoative +unincidental +unincidentally +unincinerated +unincised +unincisive +unincisively +unincisiveness +unincited +uninclinable +uninclined +uninclining +uninclosed +uninclosedness +unincludable +unincluded +unincludible +uninclusive +uninclusiveness +uninconvenienced +unincorporate +unincorporated +unincorporatedly +unincorporatedness +unincreasable +unincreased +unincreasing +unincriminated +unincriminating +unincubated +uninculcated +unincumbered +unindebted +unindebtedly +unindebtedness +unindemnified +unindentable +unindented +unindentured +unindexed +unindicable +unindicated +unindicative +unindicatively +unindictable +unindictableness +unindicted +unindifference +unindifferency +unindifferent +unindifferently +unindigenous +unindigenously +unindigent +unindignant +unindividual +unindividualize +unindividualized +unindividuated +unindoctrinated +unindorsed +uninduced +uninducible +uninducted +uninductive +unindulged +unindulgent +unindulgently +unindulging +unindurate +unindurated +unindurative +unindustrial +unindustrialized +unindustrious +unindustriously +unindwellable +uninebriate +uninebriated +uninebriatedness +uninebriating +uninebrious +uninert +uninertly +uninervate +uninerved +uninfallibility +uninfallible +uninfatuated +uninfectable +uninfected +uninfectious +uninfectiously +uninfectiousness +uninfective +uninfeft +uninferable +uninferably +uninferential +uninferentially +uninferrable +uninferrably +uninferred +uninferrible +uninferribly +uninfested +uninfiltrated +uninfinite +uninfinitely +uninfiniteness +uninfixed +uninflamed +uninflammability +uninflammable +uninflated +uninflected +uninflectedness +uninflective +uninflicted +uninfluenceability +uninfluenceable +uninfluenced +uninfluencing +uninfluencive +uninfluential +uninfluentiality +uninfluentially +uninfolded +uninformative +uninformatively +uninformed +uninforming +uninfracted +uninfringeable +uninfringed +uninfringible +uninfuriated +uninfused +uninfusing +uninfusive +uningenious +uningeniously +uningeniousness +uningenuity +uningenuous +uningenuously +uningenuousness +uningested +uningestive +uningrafted +uningrained +uningratiating +uninhabitability +uninhabitable +uninhabitableness +uninhabitably +uninhabited +uninhabitedness +uninhaled +uninherent +uninherently +uninheritability +uninheritable +uninherited +uninhibited +uninhibitedly +uninhibitedness +uninhibiting +uninhibitive +uninhumed +uninimical +uninimically +uniniquitous +uniniquitously +uniniquitousness +uninitialed +uninitialized +uninitialled +uninitiate +uninitiated +uninitiatedness +uninitiation +uninitiative +uninjectable +uninjected +uninjurable +uninjured +uninjuredness +uninjuring +uninjurious +uninjuriously +uninjuriousness +uninked +uninlaid +uninn +uninnate +uninnately +uninnateness +uninnocence +uninnocent +uninnocently +uninnocuous +uninnocuously +uninnocuousness +uninnovating +uninnovative +uninoculable +uninoculated +uninoculative +uninodal +uninominal +uninquired +uninquiring +uninquisitive +uninquisitively +uninquisitiveness +uninquisitorial +uninquisitorially +uninsane +uninsatiable +uninscribed +uninserted +uninshrined +uninsidious +uninsidiously +uninsidiousness +uninsightful +uninsinuated +uninsinuating +uninsinuative +uninsistent +uninsistently +uninsolated +uninsolating +uninsolvent +uninspected +uninspirable +uninspired +uninspiring +uninspiringly +uninspirited +uninspissated +uninstalled +uninstanced +uninstated +uninstigated +uninstigative +uninstilled +uninstinctive +uninstinctively +uninstinctiveness +uninstituted +uninstitutional +uninstitutionally +uninstitutive +uninstitutively +uninstructed +uninstructedly +uninstructedness +uninstructible +uninstructing +uninstructive +uninstructively +uninstructiveness +uninstrumental +uninstrumentally +uninsular +uninsulate +uninsulated +uninsulating +uninsultable +uninsulted +uninsulting +uninsurability +uninsurable +uninsured +unintegrable +unintegral +unintegrally +unintegrated +unintegrative +unintellective +unintellectual +unintellectualism +unintellectuality +unintellectually +unintelligence +unintelligent +unintelligently +unintelligentsia +unintelligibility +unintelligible +unintelligibleness +unintelligibly +unintended +unintendedly +unintensified +unintensive +unintensively +unintent +unintentional +unintentionality +unintentionally +unintentionalness +unintentiveness +unintently +unintentness +unintercalated +unintercepted +unintercepting +uninterchangeable +uninterdicted +uninterested +uninterestedly +uninterestedness +uninteresting +uninterestingly +uninterestingness +uninterferedwith +uninterjected +uninterlaced +uninterlarded +uninterleave +uninterleaved +uninterlined +uninterlinked +uninterlocked +unintermarrying +unintermediate +unintermediately +unintermediateness +unintermingled +unintermission +unintermissive +unintermitted +unintermittedly +unintermittedness +unintermittent +unintermittently +unintermitting +unintermittingly +unintermittingness +unintermixed +uninternalized +uninternational +uninterpleaded +uninterpolated +uninterpolative +uninterposed +uninterposing +uninterpretability +uninterpretable +uninterpretative +uninterpreted +uninterpretive +uninterpretively +uninterred +uninterrogable +uninterrogated +uninterrogative +uninterrogatively +uninterrogatory +uninterruptable +uninterrupted +uninterruptedly +uninterruptedness +uninterruptible +uninterruptibleness +uninterrupting +uninterruption +uninterruptive +unintersected +unintersecting +uninterspersed +unintervening +uninterviewed +unintervolved +uninterwoven +uninthralled +uninthroned +unintialized +unintimate +unintimated +unintimately +unintimidated +unintimidating +unintitled +unintombed +unintoned +unintoxicated +unintoxicatedness +unintoxicating +unintrenchable +unintrenched +unintrepid +unintrepidly +unintrepidness +unintricate +unintricately +unintricateness +unintrigued +unintriguing +unintrlined +unintroduced +unintroducible +unintroductive +unintroductory +unintroitive +unintromitted +unintromittive +unintrospective +unintrospectively +unintroversive +unintroverted +unintruded +unintruding +unintrudingly +unintrusive +unintrusively +unintrusted +unintuitable +unintuitional +unintuitive +unintuitively +unintwined +uninuclear +uninucleate +uninucleated +uninundated +uninured +uninurned +uninvadable +uninvaded +uninvaginated +uninvalidated +uninvasive +uninvective +uninveighing +uninveigled +uninvented +uninventful +uninventibleness +uninventive +uninventively +uninventiveness +uninverted +uninvertible +uninvestable +uninvested +uninvestigable +uninvestigated +uninvestigating +uninvestigative +uninvestigatory +uninvidious +uninvidiously +uninvigorated +uninvigorating +uninvigorative +uninvigoratively +uninvincible +uninvincibleness +uninvincibly +uninvite +uninvited +uninvitedly +uninviting +uninvitingly +uninvitingness +uninvocative +uninvoiced +uninvokable +uninvoked +uninvoluted +uninvolved +uninvolvement +uninweaved +uninwoven +uninwrapped +uninwreathed +unio +uniocular +unioid +unyoke +unyoked +unyokes +unyoking +uniola +unyolden +union +unioned +unionic +unionid +unionidae +unioniform +unionisation +unionise +unionised +unionises +unionising +unionism +unionisms +unionist +unionistic +unionists +unionization +unionize +unionized +unionizer +unionizers +unionizes +unionizing +unionoid +unions +unyoung +unyouthful +unyouthfully +unyouthfulness +unioval +uniovular +uniovulate +unipara +uniparental +uniparentally +uniparient +uniparous +unipart +unipartite +uniped +unipeltate +uniperiodic +unipersonal +unipersonalist +unipersonality +unipetalous +uniphase +uniphaser +uniphonous +uniplanar +uniplex +uniplicate +unipod +unipods +unipolar +unipolarity +uniporous +unipotence +unipotent +unipotential +uniprocessor +uniprocessorunix +unipulse +uniquantic +unique +uniquely +uniqueness +uniquer +uniques +uniquest +uniquity +uniradial +uniradiate +uniradiated +uniradical +uniramose +uniramous +unirascibility +unirascible +unireme +unirenic +unirhyme +uniridescent +uniridescently +unironed +unironical +unironically +unirradiated +unirradiative +unirrigable +unirrigated +unirritable +unirritableness +unirritably +unirritant +unirritated +unirritatedly +unirritating +unirritative +unirrupted +unirruptive +unisepalous +uniseptate +uniserial +uniserially +uniseriate +uniseriately +uniserrate +uniserrulate +unisex +unisexed +unisexes +unisexual +unisexuality +unisexually +unisilicate +unism +unisoil +unisolable +unisolate +unisolated +unisolating +unisolationist +unisolative +unisomeric +unisometrical +unisomorphic +unison +unisonal +unisonally +unisonance +unisonant +unisonous +unisons +unisotropic +unisotropous +unisparker +unispiculate +unispinose +unispiral +unissuable +unissuant +unissued +unist +unistylist +unisulcate +unit +unitable +unitage +unitages +unital +unitalicized +unitary +unitarian +unitarianism +unitarianize +unitarians +unitarily +unitariness +unitarism +unitarist +unite +uniteability +uniteable +uniteably +united +unitedly +unitedness +unitemized +unitentacular +uniter +uniterated +uniterative +uniters +unites +unity +unities +unitinerant +uniting +unitingly +unition +unitism +unitistic +unitive +unitively +unitiveness +unitization +unitize +unitized +unitizes +unitizing +unitooth +unitrivalent +unitrope +units +unituberculate +unitude +uniunguiculate +uniungulate +unius +univ +univalence +univalency +univalent +univalvate +univalve +univalved +univalves +univalvular +univariant +univariate +univerbal +universal +universalia +universalian +universalis +universalisation +universalise +universalised +universaliser +universalising +universalism +universalist +universalistic +universalisties +universalists +universality +universalization +universalize +universalized +universalizer +universalizes +universalizing +universally +universalness +universals +universanimous +universe +universeful +universes +universitary +universitarian +universitarianism +universitas +universitatis +universite +university +universities +universityless +universitylike +universityship +universitize +universology +universological +universologist +univied +univocability +univocacy +univocal +univocality +univocalized +univocally +univocals +univocity +univoltine +univorous +uniwear +unix +unjacketed +unjaded +unjagged +unjailed +unjam +unjammed +unjamming +unjapanned +unjarred +unjarring +unjaundiced +unjaunty +unjealous +unjealoused +unjealously +unjeered +unjeering +unjelled +unjellied +unjeopardised +unjeopardized +unjesting +unjestingly +unjesuited +unjesuitical +unjesuitically +unjewel +unjeweled +unjewelled +unjewish +unjilted +unjocose +unjocosely +unjocoseness +unjocund +unjogged +unjogging +unjoyed +unjoyful +unjoyfully +unjoyfulness +unjoin +unjoinable +unjoined +unjoint +unjointed +unjointedness +unjointing +unjointured +unjoyous +unjoyously +unjoyousness +unjoking +unjokingly +unjolly +unjolted +unjostled +unjournalistic +unjournalized +unjovial +unjovially +unjubilant +unjubilantly +unjudgable +unjudge +unjudgeable +unjudged +unjudgelike +unjudging +unjudicable +unjudicative +unjudiciable +unjudicial +unjudicially +unjudicious +unjudiciously +unjudiciousness +unjuggled +unjuiced +unjuicy +unjuicily +unjumbled +unjumpable +unjuridic +unjuridical +unjuridically +unjust +unjustice +unjusticiable +unjustify +unjustifiability +unjustifiable +unjustifiableness +unjustifiably +unjustification +unjustified +unjustifiedly +unjustifiedness +unjustled +unjustly +unjustness +unjuvenile +unjuvenilely +unjuvenileness +unkaiserlike +unkamed +unked +unkeeled +unkey +unkeyed +unkembed +unkempt +unkemptly +unkemptness +unken +unkend +unkenned +unkennedness +unkennel +unkenneled +unkenneling +unkennelled +unkennelling +unkennels +unkenning +unkensome +unkent +unkept +unkerchiefed +unket +unkicked +unkid +unkidnaped +unkidnapped +unkill +unkillability +unkillable +unkilled +unkilling +unkilned +unkin +unkind +unkinder +unkindest +unkindhearted +unkindled +unkindledness +unkindly +unkindlier +unkindliest +unkindlily +unkindliness +unkindling +unkindness +unkindred +unkindredly +unking +unkingdom +unkinged +unkinger +unkingly +unkinglike +unkink +unkinlike +unkirk +unkiss +unkissed +unkist +unknave +unkneaded +unkneeling +unknelled +unknew +unknight +unknighted +unknightly +unknightlike +unknightliness +unknit +unknits +unknittable +unknitted +unknitting +unknocked +unknocking +unknot +unknots +unknotted +unknotty +unknotting +unknow +unknowability +unknowable +unknowableness +unknowably +unknowen +unknowing +unknowingly +unknowingness +unknowledgeable +unknown +unknownly +unknownness +unknowns +unknownst +unkodaked +unkosher +unkoshered +unl +unlabeled +unlabelled +unlabialise +unlabialised +unlabialising +unlabialize +unlabialized +unlabializing +unlabiate +unlaborable +unlabored +unlaboring +unlaborious +unlaboriously +unlaboriousness +unlaboured +unlabouring +unlace +unlaced +unlacerated +unlacerating +unlaces +unlacing +unlackeyed +unlaconic +unlacquered +unlade +unladed +unladen +unlades +unladyfied +unladylike +unlading +unladled +unlagging +unlay +unlayable +unlaid +unlaying +unlays +unlame +unlamed +unlamentable +unlamented +unlaminated +unlampooned +unlanced +unland +unlanded +unlandmarked +unlanguaged +unlanguid +unlanguidly +unlanguidness +unlanguishing +unlanterned +unlap +unlapped +unlapsed +unlapsing +unlarcenous +unlarcenously +unlarded +unlarge +unlash +unlashed +unlasher +unlashes +unlashing +unlassoed +unlasting +unlatch +unlatched +unlatches +unlatching +unlath +unlathed +unlathered +unlatinized +unlatticed +unlaudable +unlaudableness +unlaudably +unlaudative +unlaudatory +unlauded +unlaugh +unlaughing +unlaunched +unlaundered +unlaureled +unlaurelled +unlaved +unlaving +unlavish +unlavished +unlaw +unlawed +unlawful +unlawfully +unlawfulness +unlawyered +unlawyerlike +unlawlearned +unlawly +unlawlike +unlax +unleached +unlead +unleaded +unleaderly +unleading +unleads +unleaf +unleafed +unleaflike +unleagued +unleaguer +unleakable +unleaky +unleal +unlean +unleared +unlearn +unlearnability +unlearnable +unlearnableness +unlearned +unlearnedly +unlearnedness +unlearning +unlearns +unlearnt +unleasable +unleased +unleash +unleashed +unleashes +unleashing +unleathered +unleave +unleaved +unleavenable +unleavened +unlecherous +unlecherously +unlecherousness +unlectured +unled +unledged +unleft +unlegacied +unlegal +unlegalised +unlegalized +unlegally +unlegalness +unlegate +unlegible +unlegislated +unlegislative +unlegislatively +unleisured +unleisuredness +unleisurely +unlengthened +unlenient +unleniently +unlensed +unlent +unless +unlessened +unlessoned +unlet +unlethal +unlethally +unlethargic +unlethargical +unlethargically +unlettable +unletted +unlettered +unletteredly +unletteredness +unlettering +unletterlike +unlevel +unleveled +unleveling +unlevelled +unlevelly +unlevelling +unlevelness +unlevels +unleviable +unlevied +unlevigated +unlexicographical +unlexicographically +unliability +unliable +unlibeled +unlibelled +unlibellous +unlibellously +unlibelous +unlibelously +unliberal +unliberalised +unliberalized +unliberally +unliberated +unlibidinous +unlibidinously +unlycanthropize +unlicensed +unlicentiated +unlicentious +unlicentiously +unlicentiousness +unlichened +unlickable +unlicked +unlid +unlidded +unlie +unlifelike +unliftable +unlifted +unlifting +unligable +unligatured +unlight +unlighted +unlightedly +unlightedness +unlightened +unlignified +unlying +unlikable +unlikableness +unlikably +unlike +unlikeable +unlikeableness +unlikeably +unliked +unlikely +unlikelier +unlikeliest +unlikelihood +unlikeliness +unliken +unlikened +unlikeness +unliking +unlimb +unlimber +unlimbered +unlimbering +unlimberness +unlimbers +unlime +unlimed +unlimitable +unlimitableness +unlimitably +unlimited +unlimitedly +unlimitedness +unlimitless +unlimned +unlimp +unline +unlineal +unlined +unlingering +unlink +unlinked +unlinking +unlinks +unlionised +unlionized +unlionlike +unliquefiable +unliquefied +unliquescent +unliquid +unliquidatable +unliquidated +unliquidating +unliquidation +unliquored +unlyric +unlyrical +unlyrically +unlyricalness +unlisping +unlist +unlisted +unlistened +unlistening +unlisty +unlit +unliteral +unliteralised +unliteralized +unliterally +unliteralness +unliterary +unliterate +unlithographic +unlitigated +unlitigating +unlitigious +unlitigiously +unlitigiousness +unlitten +unlittered +unliturgical +unliturgize +unlivability +unlivable +unlivableness +unlivably +unlive +unliveable +unliveableness +unliveably +unlived +unlively +unliveliness +unliver +unlivery +unliveried +unliveries +unlives +unliving +unlizardlike +unload +unloaded +unloaden +unloader +unloaders +unloading +unloads +unloafing +unloanably +unloaned +unloaning +unloath +unloathed +unloathful +unloathly +unloathness +unloathsome +unlobbied +unlobbying +unlobed +unlocal +unlocalisable +unlocalise +unlocalised +unlocalising +unlocalizable +unlocalize +unlocalized +unlocalizing +unlocally +unlocated +unlocative +unlock +unlockable +unlocked +unlocker +unlocking +unlocks +unlocomotive +unlodge +unlodged +unlofty +unlogged +unlogic +unlogical +unlogically +unlogicalness +unlogistic +unlogistical +unloyal +unloyally +unloyalty +unlonely +unlook +unlooked +unloop +unlooped +unloosable +unloosably +unloose +unloosed +unloosen +unloosened +unloosening +unloosens +unlooses +unloosing +unlooted +unlopped +unloquacious +unloquaciously +unloquaciousness +unlord +unlorded +unlordly +unlosable +unlosableness +unlost +unlotted +unloudly +unlouken +unlounging +unlousy +unlovable +unlovableness +unlovably +unlove +unloveable +unloveableness +unloveably +unloved +unlovely +unlovelier +unloveliest +unlovelily +unloveliness +unloverly +unloverlike +unlovesome +unloving +unlovingly +unlovingness +unlowered +unlowly +unltraconservative +unlubricant +unlubricated +unlubricating +unlubricative +unlubricious +unlucent +unlucid +unlucidly +unlucidness +unluck +unluckful +unlucky +unluckier +unluckiest +unluckily +unluckiness +unluckly +unlucrative +unludicrous +unludicrously +unludicrousness +unluffed +unlugged +unlugubrious +unlugubriously +unlugubriousness +unlumbering +unluminescent +unluminiferous +unluminous +unluminously +unluminousness +unlumped +unlumpy +unlunar +unlunate +unlunated +unlured +unlurking +unlush +unlust +unlustered +unlustful +unlustfully +unlusty +unlustie +unlustier +unlustiest +unlustily +unlustiness +unlusting +unlustred +unlustrous +unlustrously +unlute +unluted +unluxated +unluxuriant +unluxuriantly +unluxuriating +unluxurious +unluxuriously +unmacadamized +unmacerated +unmachinable +unmachinated +unmachinating +unmachineable +unmachined +unmackly +unmad +unmadded +unmaddened +unmade +unmagic +unmagical +unmagically +unmagisterial +unmagistrate +unmagistratelike +unmagnanimous +unmagnanimously +unmagnanimousness +unmagnetic +unmagnetical +unmagnetised +unmagnetized +unmagnify +unmagnified +unmagnifying +unmaid +unmaiden +unmaidenly +unmaidenlike +unmaidenliness +unmail +unmailable +unmailableness +unmailed +unmaimable +unmaimed +unmaintainable +unmaintained +unmajestic +unmajestically +unmakable +unmake +unmaker +unmakers +unmakes +unmaking +unmalarial +unmaledictive +unmaledictory +unmalevolent +unmalevolently +unmalicious +unmaliciously +unmalignant +unmalignantly +unmaligned +unmalleability +unmalleable +unmalleableness +unmalled +unmaltable +unmalted +unmammalian +unmammonized +unman +unmanacle +unmanacled +unmanacling +unmanageability +unmanageable +unmanageableness +unmanageably +unmanaged +unmancipated +unmandated +unmandatory +unmanducated +unmaned +unmaneged +unmaneuverable +unmaneuvered +unmanful +unmanfully +unmanfulness +unmangled +unmanhood +unmaniable +unmaniac +unmaniacal +unmaniacally +unmanicured +unmanifest +unmanifestative +unmanifested +unmanipulable +unmanipulatable +unmanipulated +unmanipulative +unmanipulatory +unmanly +unmanlier +unmanliest +unmanlike +unmanlily +unmanliness +unmanned +unmanner +unmannered +unmanneredly +unmannerly +unmannerliness +unmanning +unmannish +unmannishly +unmannishness +unmanoeuvred +unmanored +unmans +unmantle +unmantled +unmanual +unmanually +unmanufacturable +unmanufactured +unmanumissible +unmanumitted +unmanurable +unmanured +unmappable +unmapped +unmarbelize +unmarbelized +unmarbelizing +unmarbled +unmarbleize +unmarbleized +unmarbleizing +unmarch +unmarching +unmarginal +unmarginally +unmarginated +unmarine +unmaritime +unmarkable +unmarked +unmarketable +unmarketed +unmarking +unmarled +unmarred +unmarry +unmarriable +unmarriageability +unmarriageable +unmarried +unmarrying +unmarring +unmarshaled +unmarshalled +unmartial +unmartyr +unmartyred +unmarveling +unmarvellous +unmarvellously +unmarvellousness +unmarvelous +unmarvelously +unmarvelousness +unmasculine +unmasculinely +unmashed +unmask +unmasked +unmasker +unmaskers +unmasking +unmasks +unmasquerade +unmassacred +unmassed +unmast +unmaster +unmasterable +unmastered +unmasterful +unmasterfully +unmasticable +unmasticated +unmasticatory +unmatchable +unmatchableness +unmatchably +unmatched +unmatchedness +unmatching +unmate +unmated +unmaterial +unmaterialised +unmaterialistic +unmaterialistically +unmaterialized +unmaterially +unmateriate +unmaternal +unmaternally +unmathematical +unmathematically +unmating +unmatriculated +unmatrimonial +unmatrimonially +unmatronlike +unmatted +unmaturative +unmature +unmatured +unmaturely +unmatureness +unmaturing +unmaturity +unmaudlin +unmaudlinly +unmauled +unmaze +unmeandering +unmeanderingly +unmeaning +unmeaningful +unmeaningfully +unmeaningfulness +unmeaningly +unmeaningness +unmeant +unmeasurability +unmeasurable +unmeasurableness +unmeasurably +unmeasured +unmeasuredly +unmeasuredness +unmeasurely +unmeated +unmechanic +unmechanical +unmechanically +unmechanised +unmechanistic +unmechanize +unmechanized +unmedaled +unmedalled +unmeddle +unmeddled +unmeddlesome +unmeddling +unmeddlingly +unmeddlingness +unmediaeval +unmediated +unmediating +unmediative +unmediatized +unmedicable +unmedical +unmedically +unmedicated +unmedicative +unmedicinable +unmedicinal +unmedicinally +unmedieval +unmeditated +unmeditating +unmeditative +unmeditatively +unmediumistic +unmedullated +unmeedful +unmeedy +unmeek +unmeekly +unmeekness +unmeet +unmeetable +unmeetly +unmeetness +unmelancholy +unmelancholic +unmelancholically +unmeliorated +unmellifluent +unmellifluently +unmellifluous +unmellifluously +unmellow +unmellowed +unmelodic +unmelodically +unmelodious +unmelodiously +unmelodiousness +unmelodised +unmelodized +unmelodramatic +unmelodramatically +unmelt +unmeltable +unmeltableness +unmeltably +unmelted +unmeltedness +unmelting +unmember +unmemoired +unmemorable +unmemorably +unmemorialised +unmemorialized +unmemoried +unmemorized +unmenaced +unmenacing +unmendable +unmendableness +unmendably +unmendacious +unmendaciously +unmended +unmenial +unmenially +unmenseful +unmenstruating +unmensurable +unmental +unmentally +unmentholated +unmentionability +unmentionable +unmentionableness +unmentionables +unmentionably +unmentioned +unmercantile +unmercenary +unmercenarily +unmercenariness +unmercerized +unmerchandised +unmerchantable +unmerchantly +unmerchantlike +unmerciable +unmerciably +unmercied +unmerciful +unmercifully +unmercifulness +unmerciless +unmercurial +unmercurially +unmercurialness +unmeretricious +unmeretriciously +unmeretriciousness +unmerge +unmerged +unmerging +unmeridional +unmeridionally +unmeringued +unmeritability +unmeritable +unmerited +unmeritedly +unmeritedness +unmeriting +unmeritorious +unmeritoriously +unmeritoriousness +unmerry +unmerrily +unmesh +unmesmeric +unmesmerically +unmesmerised +unmesmerize +unmesmerized +unmet +unmetaled +unmetalised +unmetalized +unmetalled +unmetallic +unmetallically +unmetallurgic +unmetallurgical +unmetallurgically +unmetamorphic +unmetamorphosed +unmetaphysic +unmetaphysical +unmetaphysically +unmetaphorical +unmete +unmeted +unmeteorologic +unmeteorological +unmeteorologically +unmetered +unmeth +unmethylated +unmethodic +unmethodical +unmethodically +unmethodicalness +unmethodised +unmethodising +unmethodized +unmethodizing +unmeticulous +unmeticulously +unmeticulousness +unmetred +unmetric +unmetrical +unmetrically +unmetricalness +unmetrified +unmetropolitan +unmettle +unmew +unmewed +unmewing +unmews +unmiasmal +unmiasmatic +unmiasmatical +unmiasmic +unmicaceous +unmicrobial +unmicrobic +unmicroscopic +unmicroscopically +unmidwifed +unmyelinated +unmight +unmighty +unmigrant +unmigrating +unmigrative +unmigratory +unmild +unmildewed +unmildness +unmilitant +unmilitantly +unmilitary +unmilitarily +unmilitariness +unmilitarised +unmilitaristic +unmilitaristically +unmilitarized +unmilked +unmilled +unmillinered +unmilted +unmimeographed +unmimetic +unmimetically +unmimicked +unminable +unminced +unmincing +unmind +unminded +unmindful +unmindfully +unmindfulness +unminding +unmined +unmineralised +unmineralized +unmingle +unmingleable +unmingled +unmingles +unmingling +unminimised +unminimising +unminimized +unminimizing +unminished +unminister +unministered +unministerial +unministerially +unministrant +unministrative +unminted +unminuted +unmyopic +unmiracled +unmiraculous +unmiraculously +unmired +unmiry +unmirrored +unmirthful +unmirthfully +unmirthfulness +unmisanthropic +unmisanthropical +unmisanthropically +unmiscarrying +unmischievous +unmischievously +unmiscible +unmisconceivable +unmiserly +unmisgiving +unmisgivingly +unmisguided +unmisguidedly +unmisinterpretable +unmisled +unmissable +unmissed +unmissionary +unmissionized +unmist +unmistakable +unmistakableness +unmistakably +unmistakedly +unmistaken +unmistaking +unmistakingly +unmystery +unmysterious +unmysteriously +unmysteriousness +unmystic +unmystical +unmystically +unmysticalness +unmysticise +unmysticised +unmysticising +unmysticize +unmysticized +unmysticizing +unmystified +unmistressed +unmistrusted +unmistrustful +unmistrustfully +unmistrusting +unmisunderstandable +unmisunderstanding +unmisunderstood +unmiter +unmitered +unmitering +unmiters +unmythical +unmythically +unmythological +unmythologically +unmitigability +unmitigable +unmitigated +unmitigatedly +unmitigatedness +unmitigative +unmitre +unmitred +unmitres +unmitring +unmittened +unmix +unmixable +unmixableness +unmixed +unmixedly +unmixedness +unmixt +unmoaned +unmoaning +unmoated +unmobbed +unmobile +unmobilised +unmobilized +unmoble +unmocked +unmocking +unmockingly +unmodel +unmodeled +unmodelled +unmoderate +unmoderated +unmoderately +unmoderateness +unmoderating +unmodern +unmodernised +unmodernity +unmodernize +unmodernized +unmodest +unmodestly +unmodestness +unmodifiability +unmodifiable +unmodifiableness +unmodifiably +unmodificative +unmodified +unmodifiedness +unmodish +unmodishly +unmodulated +unmodulative +unmoiled +unmoist +unmoisten +unmold +unmoldable +unmoldableness +unmolded +unmoldered +unmoldering +unmoldy +unmolding +unmolds +unmolest +unmolested +unmolestedly +unmolesting +unmolified +unmollifiable +unmollifiably +unmollified +unmollifying +unmolten +unmomentary +unmomentous +unmomentously +unmomentousness +unmonarch +unmonarchic +unmonarchical +unmonarchically +unmonastic +unmonastically +unmoneyed +unmonetary +unmonistic +unmonitored +unmonkish +unmonkly +unmonogrammed +unmonopolised +unmonopolising +unmonopolize +unmonopolized +unmonopolizing +unmonotonous +unmonotonously +unmonumental +unmonumented +unmoody +unmoor +unmoored +unmooring +unmoors +unmooted +unmopped +unmoral +unmoralising +unmoralist +unmoralistic +unmorality +unmoralize +unmoralized +unmoralizing +unmorally +unmoralness +unmorbid +unmorbidly +unmorbidness +unmordant +unmordanted +unmordantly +unmoribund +unmoribundly +unmorose +unmorosely +unmoroseness +unmorphological +unmorphologically +unmorrised +unmortal +unmortalize +unmortared +unmortgage +unmortgageable +unmortgaged +unmortgaging +unmortified +unmortifiedly +unmortifiedness +unmortise +unmortised +unmortising +unmossed +unmossy +unmothered +unmotherly +unmotile +unmotionable +unmotioned +unmotioning +unmotivated +unmotivatedly +unmotivatedness +unmotivating +unmotived +unmotored +unmotorised +unmotorized +unmottled +unmould +unmouldable +unmouldered +unmouldering +unmouldy +unmounded +unmount +unmountable +unmountainous +unmounted +unmounting +unmourned +unmournful +unmournfully +unmourning +unmouthable +unmouthed +unmouthpieced +unmovability +unmovable +unmovableness +unmovablety +unmovably +unmoveable +unmoved +unmovedly +unmoving +unmovingly +unmovingness +unmowed +unmown +unmucilaged +unmudded +unmuddy +unmuddied +unmuddle +unmuddled +unmuffle +unmuffled +unmuffles +unmuffling +unmulcted +unmulish +unmulled +unmullioned +unmultiply +unmultipliable +unmultiplicable +unmultiplicative +unmultiplied +unmultipliedly +unmultiplying +unmumbled +unmumbling +unmummied +unmummify +unmummified +unmummifying +unmunched +unmundane +unmundanely +unmundified +unmunicipalised +unmunicipalized +unmunificent +unmunificently +unmunitioned +unmurmured +unmurmuring +unmurmuringly +unmurmurous +unmurmurously +unmuscled +unmuscular +unmuscularly +unmusical +unmusicality +unmusically +unmusicalness +unmusicianly +unmusing +unmusked +unmussed +unmusted +unmusterable +unmustered +unmutable +unmutant +unmutated +unmutation +unmutational +unmutative +unmuted +unmutilated +unmutilative +unmutinous +unmutinously +unmutinousness +unmuttered +unmuttering +unmutteringly +unmutual +unmutualised +unmutualized +unmutually +unmuzzle +unmuzzled +unmuzzles +unmuzzling +unn +unnabbed +unnacreous +unnagged +unnagging +unnaggingly +unnail +unnailed +unnailing +unnails +unnaive +unnaively +unnaked +unnamability +unnamable +unnamableness +unnamably +unname +unnameability +unnameable +unnameableness +unnameably +unnamed +unnapkined +unnapped +unnapt +unnarcissistic +unnarcotic +unnarratable +unnarrated +unnarrative +unnarrow +unnarrowed +unnarrowly +unnasal +unnasally +unnascent +unnation +unnational +unnationalised +unnationalistic +unnationalistically +unnationalized +unnationally +unnative +unnatural +unnaturalise +unnaturalised +unnaturalising +unnaturalism +unnaturalist +unnaturalistic +unnaturality +unnaturalizable +unnaturalize +unnaturalized +unnaturalizing +unnaturally +unnaturalness +unnature +unnauseated +unnauseating +unnautical +unnavigability +unnavigable +unnavigableness +unnavigably +unnavigated +unnealed +unneaped +unnear +unnearable +unneared +unnearly +unnearness +unneat +unneath +unneatly +unneatness +unnebulous +unneccessary +unnecessary +unnecessaries +unnecessarily +unnecessariness +unnecessitated +unnecessitating +unnecessity +unnecessitous +unnecessitously +unnecessitousness +unnectareous +unnectarial +unneeded +unneedful +unneedfully +unneedfulness +unneedy +unnefarious +unnefariously +unnefariousness +unnegated +unneglected +unneglectful +unneglectfully +unnegligent +unnegotiable +unnegotiableness +unnegotiably +unnegotiated +unnegro +unneighbored +unneighborly +unneighborlike +unneighborliness +unneighbourly +unneighbourliness +unnephritic +unnerve +unnerved +unnerves +unnerving +unnervingly +unnervous +unnervously +unnervousness +unness +unnest +unnestle +unnestled +unnet +unneth +unnethe +unnethes +unnethis +unnetted +unnettled +unneural +unneuralgic +unneurotic +unneurotically +unneutered +unneutral +unneutralise +unneutralised +unneutralising +unneutrality +unneutralize +unneutralized +unneutralizing +unneutrally +unnew +unnewly +unnewness +unnewsed +unnibbed +unnibbied +unnibbled +unnice +unnicely +unniceness +unniched +unnicked +unnickeled +unnickelled +unnicknamed +unniggard +unniggardly +unnigh +unnihilistic +unnimbed +unnimble +unnimbleness +unnimbly +unnymphal +unnymphean +unnymphlike +unnipped +unnitrogenised +unnitrogenized +unnitrogenous +unnobilitated +unnobility +unnoble +unnobleness +unnobly +unnocturnal +unnocturnally +unnodding +unnoddingly +unnoised +unnoisy +unnoisily +unnomadic +unnomadically +unnominal +unnominalistic +unnominally +unnominated +unnominative +unnonsensical +unnooked +unnoosed +unnormal +unnormalised +unnormalising +unnormalized +unnormalizing +unnormally +unnormalness +unnormative +unnorthern +unnose +unnosed +unnotable +unnotational +unnotched +unnoted +unnoteworthy +unnoteworthiness +unnoticeable +unnoticeableness +unnoticeably +unnoticed +unnoticing +unnotify +unnotified +unnoting +unnotional +unnotionally +unnotioned +unnourishable +unnourished +unnourishing +unnovel +unnovercal +unnucleated +unnullified +unnumbed +unnumber +unnumberable +unnumberableness +unnumberably +unnumbered +unnumberedness +unnumerable +unnumerated +unnumerical +unnumerous +unnumerously +unnumerousness +unnurtured +unnutritious +unnutritiously +unnutritive +unnuzzled +unoared +unobdurate +unobdurately +unobdurateness +unobedience +unobedient +unobediently +unobeyed +unobeying +unobese +unobesely +unobeseness +unobfuscated +unobjected +unobjectified +unobjectionability +unobjectionable +unobjectionableness +unobjectionably +unobjectional +unobjective +unobjectively +unobjectivized +unobligated +unobligating +unobligative +unobligatory +unobliged +unobliging +unobligingly +unobligingness +unobliterable +unobliterated +unoblivious +unobliviously +unobliviousness +unobnoxious +unobnoxiously +unobnoxiousness +unobscene +unobscenely +unobsceneness +unobscure +unobscured +unobscurely +unobscureness +unobsequious +unobsequiously +unobsequiousness +unobservable +unobservance +unobservant +unobservantly +unobservantness +unobserved +unobservedly +unobserving +unobservingly +unobsessed +unobsolete +unobstinate +unobstinately +unobstruct +unobstructed +unobstructedly +unobstructedness +unobstructive +unobstruent +unobstruently +unobtainability +unobtainable +unobtainableness +unobtainably +unobtained +unobtruded +unobtruding +unobtrusive +unobtrusively +unobtrusiveness +unobtunded +unobumbrated +unobverted +unobviable +unobviated +unobvious +unobviously +unobviousness +unoccasional +unoccasionally +unoccasioned +unoccidental +unoccidentally +unoccluded +unoccupancy +unoccupation +unoccupiable +unoccupied +unoccupiedly +unoccupiedness +unoccurring +unoceanic +unocular +unode +unodious +unodiously +unodiousness +unodored +unodoriferous +unodoriferously +unodoriferousness +unodorous +unodorously +unodorousness +unoecumenic +unoecumenical +unoffendable +unoffended +unoffendedly +unoffender +unoffending +unoffendingly +unoffensive +unoffensively +unoffensiveness +unoffered +unofficed +unofficered +unofficerlike +unofficial +unofficialdom +unofficially +unofficialness +unofficiated +unofficiating +unofficinal +unofficious +unofficiously +unofficiousness +unoffset +unoften +unogled +unoil +unoiled +unoily +unoiling +unold +unomened +unominous +unominously +unominousness +unomitted +unomnipotent +unomnipotently +unomniscient +unomnisciently +unona +unonerous +unonerously +unonerousness +unontological +unopaque +unoped +unopen +unopenable +unopened +unopening +unopenly +unopenness +unoperably +unoperatable +unoperated +unoperatic +unoperatically +unoperating +unoperative +unoperculate +unoperculated +unopiated +unopiatic +unopined +unopinionated +unopinionatedness +unopinioned +unoppignorated +unopportune +unopportunely +unopportuneness +unopportunistic +unopposable +unopposed +unopposedly +unopposedness +unopposing +unopposite +unoppositional +unoppressed +unoppressive +unoppressively +unoppressiveness +unopprobrious +unopprobriously +unopprobriousness +unoppugned +unopressible +unopted +unoptimistic +unoptimistical +unoptimistically +unoptimized +unoptional +unoptionally +unopulence +unopulent +unopulently +unoral +unorally +unorational +unoratorial +unoratorical +unoratorically +unorbed +unorbital +unorbitally +unorchestrated +unordain +unordainable +unordained +unorder +unorderable +unordered +unorderly +unordinal +unordinary +unordinarily +unordinariness +unordinate +unordinately +unordinateness +unordnanced +unorganed +unorganic +unorganical +unorganically +unorganicalness +unorganisable +unorganised +unorganizable +unorganized +unorganizedly +unorganizedness +unoriental +unorientally +unorientalness +unoriented +unoriginal +unoriginality +unoriginally +unoriginalness +unoriginate +unoriginated +unoriginatedness +unoriginately +unoriginateness +unorigination +unoriginative +unoriginatively +unoriginativeness +unorn +unornamental +unornamentally +unornamentalness +unornamentation +unornamented +unornate +unornately +unornateness +unornithological +unornly +unorphaned +unorthodox +unorthodoxy +unorthodoxically +unorthodoxly +unorthodoxness +unorthographical +unorthographically +unoscillating +unosculated +unosmotic +unossified +unossifying +unostensible +unostensibly +unostensive +unostensively +unostentation +unostentatious +unostentatiously +unostentatiousness +unousted +unoutgrown +unoutlawed +unoutraged +unoutspeakable +unoutspoken +unoutworn +unoverclouded +unovercomable +unovercome +unoverdone +unoverdrawn +unoverflowing +unoverhauled +unoverleaped +unoverlooked +unoverpaid +unoverpowered +unoverruled +unovert +unovertaken +unoverthrown +unovervalued +unoverwhelmed +unowed +unowing +unown +unowned +unoxidable +unoxidated +unoxidative +unoxidisable +unoxidised +unoxidizable +unoxidized +unoxygenated +unoxygenized +unp +unpacable +unpaced +unpacifiable +unpacific +unpacified +unpacifiedly +unpacifiedness +unpacifist +unpacifistic +unpack +unpackaged +unpacked +unpacker +unpackers +unpacking +unpacks +unpadded +unpadlocked +unpagan +unpaganize +unpaganized +unpaganizing +unpaged +unpaginal +unpaginated +unpay +unpayable +unpayableness +unpayably +unpaid +unpaying +unpayment +unpained +unpainful +unpainfully +unpaining +unpainstaking +unpaint +unpaintability +unpaintable +unpaintableness +unpaintably +unpainted +unpaintedly +unpaintedness +unpaired +unpaised +unpalatability +unpalatable +unpalatableness +unpalatably +unpalatal +unpalatalized +unpalatally +unpalatial +unpale +unpaled +unpalisaded +unpalisadoed +unpalled +unpalliable +unpalliated +unpalliative +unpalpable +unpalpablely +unpalped +unpalpitating +unpalsied +unpaltry +unpampered +unpanegyrised +unpanegyrized +unpanel +unpaneled +unpanelled +unpanged +unpanicky +unpannel +unpanniered +unpanoplied +unpantheistic +unpantheistical +unpantheistically +unpanting +unpapal +unpapaverous +unpaper +unpapered +unparaded +unparadise +unparadox +unparadoxal +unparadoxical +unparadoxically +unparagoned +unparagonized +unparagraphed +unparalysed +unparalyzed +unparallel +unparallelable +unparalleled +unparalleledly +unparalleledness +unparallelled +unparallelness +unparametrized +unparaphrased +unparasitic +unparasitical +unparasitically +unparcel +unparceled +unparceling +unparcelled +unparcelling +unparch +unparched +unparching +unpardon +unpardonability +unpardonable +unpardonableness +unpardonably +unpardoned +unpardonedness +unpardoning +unpared +unparegal +unparental +unparentally +unparented +unparenthesised +unparenthesized +unparenthetic +unparenthetical +unparenthetically +unparfit +unpargeted +unpark +unparked +unparking +unparliamentary +unparliamented +unparochial +unparochialism +unparochially +unparodied +unparolable +unparoled +unparrel +unparriable +unparried +unparrying +unparroted +unparsed +unparser +unparsimonious +unparsimoniously +unparsonic +unparsonical +unpartable +unpartableness +unpartably +unpartaken +unpartaking +unparted +unparty +unpartial +unpartiality +unpartially +unpartialness +unpartible +unparticipant +unparticipated +unparticipating +unparticipative +unparticular +unparticularised +unparticularising +unparticularized +unparticularizing +unparticularness +unpartisan +unpartitioned +unpartitive +unpartizan +unpartnered +unpartook +unpass +unpassable +unpassableness +unpassably +unpassed +unpassing +unpassionate +unpassionately +unpassionateness +unpassioned +unpassive +unpassively +unpaste +unpasted +unpasteurised +unpasteurized +unpasting +unpastor +unpastoral +unpastorally +unpastured +unpatched +unpatent +unpatentable +unpatented +unpaternal +unpaternally +unpathed +unpathetic +unpathetically +unpathological +unpathologically +unpathwayed +unpatience +unpatient +unpatiently +unpatientness +unpatinated +unpatriarchal +unpatriarchally +unpatrician +unpatriotic +unpatriotically +unpatriotism +unpatristic +unpatristical +unpatristically +unpatrolled +unpatronisable +unpatronizable +unpatronized +unpatronizing +unpatronizingly +unpatted +unpatterned +unpatternized +unpaunch +unpaunched +unpauperized +unpausing +unpausingly +unpave +unpaved +unpavilioned +unpaving +unpawed +unpawn +unpawned +unpeace +unpeaceable +unpeaceableness +unpeaceably +unpeaceful +unpeacefully +unpeacefulness +unpeaked +unpealed +unpearled +unpebbled +unpeccable +unpecked +unpeculating +unpeculiar +unpeculiarly +unpecuniarily +unpedagogic +unpedagogical +unpedagogically +unpedantic +unpedantical +unpeddled +unpedestal +unpedestaled +unpedestaling +unpedigreed +unpeel +unpeelable +unpeelableness +unpeeled +unpeeling +unpeerable +unpeered +unpeevish +unpeevishly +unpeevishness +unpeg +unpegged +unpegging +unpegs +unpejorative +unpejoratively +unpelagic +unpelted +unpen +unpenal +unpenalised +unpenalized +unpenally +unpenanced +unpenciled +unpencilled +unpendant +unpendent +unpending +unpendulous +unpendulously +unpendulousness +unpenetrable +unpenetrably +unpenetrant +unpenetrated +unpenetrating +unpenetratingly +unpenetrative +unpenetratively +unpenitent +unpenitential +unpenitentially +unpenitently +unpenitentness +unpenned +unpennied +unpenning +unpennoned +unpens +unpensionable +unpensionableness +unpensioned +unpensioning +unpent +unpenurious +unpenuriously +unpenuriousness +unpeople +unpeopled +unpeoples +unpeopling +unpeppered +unpeppery +unperceivability +unperceivable +unperceivably +unperceived +unperceivedly +unperceiving +unperceptible +unperceptibleness +unperceptibly +unperceptional +unperceptive +unperceptively +unperceptiveness +unperceptual +unperceptually +unperch +unperched +unpercipient +unpercolated +unpercussed +unpercussive +unperdurable +unperdurably +unperemptory +unperemptorily +unperemptoriness +unperfect +unperfected +unperfectedly +unperfectedness +unperfectible +unperfection +unperfective +unperfectively +unperfectiveness +unperfectly +unperfectness +unperfidious +unperfidiously +unperfidiousness +unperflated +unperforable +unperforate +unperforated +unperforating +unperforative +unperformability +unperformable +unperformance +unperformed +unperforming +unperfumed +unperilous +unperilously +unperiodic +unperiodical +unperiodically +unperipheral +unperipherally +unperiphrased +unperiphrastic +unperiphrastically +unperishable +unperishableness +unperishably +unperished +unperishing +unperjured +unperjuring +unpermanency +unpermanent +unpermanently +unpermeable +unpermeant +unpermeated +unpermeating +unpermeative +unpermissible +unpermissibly +unpermissive +unpermit +unpermits +unpermitted +unpermitting +unpermixed +unpernicious +unperniciously +unperpendicular +unperpendicularly +unperpetrated +unperpetuable +unperpetuated +unperpetuating +unperplex +unperplexed +unperplexing +unpersecuted +unpersecuting +unpersecutive +unperseverance +unpersevering +unperseveringly +unperseveringness +unpersisting +unperson +unpersonable +unpersonableness +unpersonal +unpersonalised +unpersonalising +unpersonality +unpersonalized +unpersonalizing +unpersonally +unpersonify +unpersonified +unpersonifying +unpersons +unperspicuous +unperspicuously +unperspicuousness +unperspirable +unperspired +unperspiring +unpersuadability +unpersuadable +unpersuadableness +unpersuadably +unpersuade +unpersuaded +unpersuadedness +unpersuasibility +unpersuasible +unpersuasibleness +unpersuasion +unpersuasive +unpersuasively +unpersuasiveness +unpertaining +unpertinent +unpertinently +unperturbable +unperturbably +unperturbed +unperturbedly +unperturbedness +unperturbing +unperuked +unperusable +unperused +unpervaded +unpervading +unpervasive +unpervasively +unpervasiveness +unperverse +unperversely +unperversive +unpervert +unperverted +unpervertedly +unpervious +unperviously +unperviousness +unpessimistic +unpessimistically +unpestered +unpesterous +unpestilent +unpestilential +unpestilently +unpetal +unpetaled +unpetalled +unpetitioned +unpetrify +unpetrified +unpetrifying +unpetted +unpetticoated +unpetulant +unpetulantly +unpharasaic +unpharasaical +unphased +unphenomenal +unphenomenally +unphilanthropic +unphilanthropically +unphilologic +unphilological +unphilosophy +unphilosophic +unphilosophical +unphilosophically +unphilosophicalness +unphilosophize +unphilosophized +unphysical +unphysically +unphysicianlike +unphysicked +unphysiological +unphysiologically +unphlegmatic +unphlegmatical +unphlegmatically +unphonetic +unphoneticness +unphonnetical +unphonnetically +unphonographed +unphosphatised +unphosphatized +unphotographable +unphotographed +unphotographic +unphrasable +unphrasableness +unphrased +unphrenological +unpicaresque +unpick +unpickable +unpicked +unpicketed +unpicking +unpickled +unpicks +unpictorial +unpictorialise +unpictorialised +unpictorialising +unpictorialize +unpictorialized +unpictorializing +unpictorially +unpicturability +unpicturable +unpictured +unpicturesque +unpicturesquely +unpicturesqueness +unpiece +unpieced +unpierceable +unpierced +unpiercing +unpiety +unpigmented +unpile +unpiled +unpiles +unpilfered +unpilgrimlike +unpiling +unpillaged +unpillared +unpilled +unpilloried +unpillowed +unpiloted +unpimpled +unpin +unpinched +unpining +unpinion +unpinioned +unpinked +unpinned +unpinning +unpins +unpioneering +unpious +unpiously +unpiped +unpiqued +unpirated +unpiratical +unpiratically +unpitched +unpited +unpiteous +unpiteously +unpiteousness +unpity +unpitiable +unpitiably +unpitied +unpitiedly +unpitiedness +unpitiful +unpitifully +unpitifulness +unpitying +unpityingly +unpityingness +unpitted +unplacable +unplacably +unplacated +unplacatory +unplace +unplaced +unplacement +unplacid +unplacidly +unplacidness +unplagiarised +unplagiarized +unplagued +unplayable +unplaid +unplayed +unplayful +unplayfully +unplaying +unplain +unplained +unplainly +unplainness +unplait +unplaited +unplaiting +unplaits +unplan +unplaned +unplanished +unplank +unplanked +unplanned +unplannedly +unplannedness +unplanning +unplant +unplantable +unplanted +unplantlike +unplashed +unplaster +unplastered +unplastic +unplat +unplated +unplatitudinous +unplatitudinously +unplatitudinousness +unplatted +unplausible +unplausibleness +unplausibly +unplausive +unpleached +unpleadable +unpleaded +unpleading +unpleasable +unpleasant +unpleasantish +unpleasantly +unpleasantness +unpleasantry +unpleasantries +unpleased +unpleasing +unpleasingly +unpleasingness +unpleasive +unpleasurable +unpleasurably +unpleasure +unpleat +unpleated +unplebeian +unpledged +unplenished +unplenteous +unplenteously +unplentiful +unplentifully +unplentifulness +unpliability +unpliable +unpliableness +unpliably +unpliancy +unpliant +unpliantly +unpliantness +unplied +unplight +unplighted +unplodding +unplotted +unplotting +unplough +unploughed +unplow +unplowed +unplucked +unplug +unplugged +unplugging +unplugs +unplumb +unplumbed +unplume +unplumed +unplummeted +unplump +unplundered +unplunderous +unplunderously +unplunge +unplunged +unpluralised +unpluralistic +unpluralized +unplutocratic +unplutocratical +unplutocratically +unpneumatic +unpneumatically +unpoached +unpocket +unpocketed +unpodded +unpoetic +unpoetical +unpoetically +unpoeticalness +unpoeticised +unpoeticized +unpoetize +unpoetized +unpoignant +unpoignantly +unpoignard +unpointed +unpointing +unpoise +unpoised +unpoison +unpoisonable +unpoisoned +unpoisonous +unpoisonously +unpolarised +unpolarizable +unpolarized +unpoled +unpolemic +unpolemical +unpolemically +unpoliced +unpolicied +unpolymerised +unpolymerized +unpolish +unpolishable +unpolished +unpolishedness +unpolite +unpolitely +unpoliteness +unpolitic +unpolitical +unpolitically +unpoliticly +unpollarded +unpolled +unpollened +unpollutable +unpolluted +unpollutedly +unpolluting +unpompous +unpompously +unpompousness +unponderable +unpondered +unponderous +unponderously +unponderousness +unpontifical +unpontifically +unpooled +unpope +unpopular +unpopularised +unpopularity +unpopularize +unpopularized +unpopularly +unpopularness +unpopulate +unpopulated +unpopulous +unpopulously +unpopulousness +unporcelainized +unporness +unpornographic +unporous +unporousness +unportable +unportended +unportentous +unportentously +unportentousness +unporticoed +unportionable +unportioned +unportly +unportmanteaued +unportrayable +unportrayed +unportraited +unportunate +unportuous +unposed +unposing +unpositive +unpositively +unpositiveness +unpositivistic +unpossess +unpossessable +unpossessed +unpossessedness +unpossessing +unpossessive +unpossessively +unpossessiveness +unpossibility +unpossible +unpossibleness +unpossibly +unposted +unpostered +unposthumous +unpostmarked +unpostponable +unpostponed +unpostulated +unpot +unpotable +unpotent +unpotently +unpotted +unpotting +unpouched +unpoulticed +unpounced +unpounded +unpourable +unpoured +unpouting +unpoutingly +unpowdered +unpower +unpowerful +unpowerfulness +unpracticability +unpracticable +unpracticableness +unpracticably +unpractical +unpracticality +unpractically +unpracticalness +unpractice +unpracticed +unpracticedness +unpractised +unpragmatic +unpragmatical +unpragmatically +unpray +unprayable +unprayed +unprayerful +unprayerfully +unprayerfulness +unpraying +unpraisable +unpraise +unpraised +unpraiseful +unpraiseworthy +unpraising +unpranked +unprating +unpreach +unpreached +unpreaching +unprecarious +unprecariously +unprecariousness +unprecautioned +unpreceded +unprecedented +unprecedentedly +unprecedentedness +unprecedential +unprecedently +unpreceptive +unpreceptively +unprecious +unpreciously +unpreciousness +unprecipiced +unprecipitant +unprecipitantly +unprecipitate +unprecipitated +unprecipitately +unprecipitateness +unprecipitative +unprecipitatively +unprecipitous +unprecipitously +unprecipitousness +unprecise +unprecisely +unpreciseness +unprecisive +unprecludable +unprecluded +unprecludible +unpreclusive +unpreclusively +unprecocious +unprecociously +unprecociousness +unpredaceous +unpredaceously +unpredaceousness +unpredacious +unpredaciously +unpredaciousness +unpredatory +unpredestinated +unpredestined +unpredetermined +unpredicable +unpredicableness +unpredicably +unpredicated +unpredicative +unpredicatively +unpredict +unpredictability +unpredictabilness +unpredictable +unpredictableness +unpredictably +unpredicted +unpredictedness +unpredicting +unpredictive +unpredictively +unpredisposed +unpredisposing +unpreempted +unpreened +unprefaced +unpreferable +unpreferableness +unpreferably +unpreferred +unprefigured +unprefined +unprefixal +unprefixally +unprefixed +unpregnable +unpregnant +unprehensive +unpreying +unprejudged +unprejudicated +unprejudice +unprejudiced +unprejudicedly +unprejudicedness +unprejudiciable +unprejudicial +unprejudicially +unprejudicialness +unprelatic +unprelatical +unpreluded +unpremature +unprematurely +unprematureness +unpremeditate +unpremeditated +unpremeditatedly +unpremeditatedness +unpremeditately +unpremeditation +unpremonished +unpremonstrated +unprenominated +unprenticed +unpreoccupied +unpreordained +unpreparation +unprepare +unprepared +unpreparedly +unpreparedness +unpreparing +unpreponderated +unpreponderating +unprepossessed +unprepossessedly +unprepossessing +unprepossessingly +unprepossessingness +unpreposterous +unpreposterously +unpreposterousness +unpresaged +unpresageful +unpresaging +unpresbyterated +unprescient +unpresciently +unprescinded +unprescribed +unpresentability +unpresentable +unpresentableness +unpresentably +unpresentative +unpresented +unpreservable +unpreserved +unpresidential +unpresidentially +unpresiding +unpressed +unpresses +unpressured +unprest +unpresumable +unpresumably +unpresumed +unpresuming +unpresumingness +unpresumptive +unpresumptively +unpresumptuous +unpresumptuously +unpresumptuousness +unpresupposed +unpretended +unpretending +unpretendingly +unpretendingness +unpretentious +unpretentiously +unpretentiousness +unpretermitted +unpreternatural +unpreternaturally +unpretty +unprettified +unprettily +unprettiness +unprevailing +unprevalence +unprevalent +unprevalently +unprevaricating +unpreventability +unpreventable +unpreventableness +unpreventably +unpreventative +unprevented +unpreventible +unpreventive +unpreventively +unpreventiveness +unpreviewed +unpriceably +unpriced +unpricked +unprickled +unprickly +unprideful +unpridefully +unpriest +unpriestly +unpriestlike +unpriggish +unprying +unprim +unprime +unprimed +unprimitive +unprimitively +unprimitiveness +unprimitivistic +unprimly +unprimmed +unprimness +unprince +unprincely +unprincelike +unprinceliness +unprincess +unprincipal +unprinciple +unprincipled +unprincipledly +unprincipledness +unprint +unprintable +unprintableness +unprintably +unprinted +unpriority +unprismatic +unprismatical +unprismatically +unprison +unprisonable +unprisoned +unprivate +unprivately +unprivateness +unprivileged +unprizable +unprized +unprobable +unprobably +unprobated +unprobational +unprobationary +unprobative +unprobed +unprobity +unproblematic +unproblematical +unproblematically +unprocessed +unprocessional +unproclaimed +unprocrastinated +unprocreant +unprocreate +unprocreated +unproctored +unprocurable +unprocurableness +unprocure +unprocured +unprodded +unproded +unprodigious +unprodigiously +unprodigiousness +unproduceable +unproduceableness +unproduceably +unproduced +unproducedness +unproducible +unproducibleness +unproducibly +unproductive +unproductively +unproductiveness +unproductivity +unprofanable +unprofane +unprofaned +unprofanely +unprofaneness +unprofessed +unprofessing +unprofessional +unprofessionalism +unprofessionally +unprofessionalness +unprofessorial +unprofessorially +unproffered +unproficiency +unproficient +unproficiently +unprofit +unprofitability +unprofitable +unprofitableness +unprofitably +unprofited +unprofiteering +unprofiting +unprofound +unprofoundly +unprofoundness +unprofundity +unprofuse +unprofusely +unprofuseness +unprognosticated +unprognosticative +unprogrammatic +unprogressed +unprogressive +unprogressively +unprogressiveness +unprohibited +unprohibitedness +unprohibitive +unprohibitively +unprojected +unprojecting +unprojective +unproliferous +unprolific +unprolifically +unprolificness +unprolifiness +unprolix +unprologued +unprolongable +unprolonged +unpromiscuous +unpromiscuously +unpromiscuousness +unpromise +unpromised +unpromising +unpromisingly +unpromisingness +unpromotable +unpromoted +unpromotional +unpromotive +unprompt +unprompted +unpromptly +unpromptness +unpromulgated +unpronounce +unpronounceable +unpronounced +unpronouncing +unproofread +unprop +unpropagable +unpropagandistic +unpropagated +unpropagative +unpropelled +unpropellent +unpropense +unproper +unproperly +unproperness +unpropertied +unprophesiable +unprophesied +unprophetic +unprophetical +unprophetically +unprophetlike +unpropice +unpropitiable +unpropitiated +unpropitiatedness +unpropitiating +unpropitiative +unpropitiatory +unpropitious +unpropitiously +unpropitiousness +unproportion +unproportionable +unproportionableness +unproportionably +unproportional +unproportionality +unproportionally +unproportionate +unproportionately +unproportionateness +unproportioned +unproportionedly +unproportionedness +unproposable +unproposed +unproposing +unpropounded +unpropped +unpropriety +unprorogued +unprosaic +unprosaical +unprosaically +unprosaicness +unproscribable +unproscribed +unproscriptive +unproscriptively +unprosecutable +unprosecuted +unprosecuting +unproselyte +unproselyted +unprosodic +unprospected +unprospective +unprosperably +unprospered +unprospering +unprosperity +unprosperous +unprosperously +unprosperousness +unprostitute +unprostituted +unprostrated +unprotect +unprotectable +unprotected +unprotectedly +unprotectedness +unprotecting +unprotection +unprotective +unprotectively +unprotestant +unprotestantize +unprotested +unprotesting +unprotestingly +unprotracted +unprotractive +unprotruded +unprotrudent +unprotruding +unprotrusible +unprotrusive +unprotrusively +unprotuberant +unprotuberantly +unproud +unproudly +unprovability +unprovable +unprovableness +unprovably +unproved +unprovedness +unproven +unproverbial +unproverbially +unprovidable +unprovide +unprovided +unprovidedly +unprovidedness +unprovidenced +unprovident +unprovidential +unprovidentially +unprovidently +unproviding +unprovincial +unprovincialism +unprovincially +unproving +unprovised +unprovisedly +unprovision +unprovisional +unprovisioned +unprovocative +unprovocatively +unprovocativeness +unprovokable +unprovoke +unprovoked +unprovokedly +unprovokedness +unprovoking +unprovokingly +unprowling +unproximity +unprudence +unprudent +unprudential +unprudentially +unprudently +unprunable +unpruned +unpsychic +unpsychically +unpsychological +unpsychologically +unpsychopathic +unpsychotic +unpublic +unpublicity +unpublicized +unpublicly +unpublishable +unpublishableness +unpublishably +unpublished +unpucker +unpuckered +unpuckering +unpuckers +unpuddled +unpuff +unpuffed +unpuffing +unpugilistic +unpugnacious +unpugnaciously +unpugnaciousness +unpulled +unpulleyed +unpulped +unpulsating +unpulsative +unpulverable +unpulverised +unpulverize +unpulverized +unpulvinate +unpulvinated +unpumicated +unpummeled +unpummelled +unpumpable +unpumped +unpunched +unpunctate +unpunctated +unpunctilious +unpunctiliously +unpunctiliousness +unpunctual +unpunctuality +unpunctually +unpunctualness +unpunctuated +unpunctuating +unpunctured +unpunishable +unpunishably +unpunished +unpunishedly +unpunishedness +unpunishing +unpunishingly +unpunitive +unpurchasable +unpurchased +unpure +unpured +unpurely +unpureness +unpurgative +unpurgatively +unpurgeable +unpurged +unpurifiable +unpurified +unpurifying +unpuristic +unpuritan +unpuritanic +unpuritanical +unpuritanically +unpurled +unpurloined +unpurpled +unpurported +unpurposed +unpurposely +unpurposelike +unpurposing +unpurposive +unpurse +unpursed +unpursuable +unpursuant +unpursued +unpursuing +unpurveyed +unpushed +unput +unputative +unputatively +unputrefiable +unputrefied +unputrid +unputridity +unputridly +unputridness +unputtied +unpuzzle +unpuzzled +unpuzzles +unpuzzling +unquadded +unquaffed +unquayed +unquailed +unquailing +unquailingly +unquakerly +unquakerlike +unquaking +unqualify +unqualifiable +unqualification +unqualified +unqualifiedly +unqualifiedness +unqualifying +unqualifyingly +unquality +unqualitied +unquantified +unquantitative +unquarantined +unquarreled +unquarreling +unquarrelled +unquarrelling +unquarrelsome +unquarried +unquartered +unquashed +unquavering +unqueen +unqueened +unqueening +unqueenly +unqueenlike +unquellable +unquelled +unqueme +unquemely +unquenchable +unquenchableness +unquenchably +unquenched +unqueried +unquert +unquerulous +unquerulously +unquerulousness +unquested +unquestionability +unquestionable +unquestionableness +unquestionably +unquestionate +unquestioned +unquestionedly +unquestionedness +unquestioning +unquestioningly +unquestioningness +unquibbled +unquibbling +unquick +unquickened +unquickly +unquickness +unquicksilvered +unquiescence +unquiescent +unquiescently +unquiet +unquietable +unquieted +unquieter +unquietest +unquieting +unquietly +unquietness +unquietous +unquiets +unquietude +unquilleted +unquilted +unquit +unquittable +unquitted +unquivered +unquivering +unquixotic +unquixotical +unquixotically +unquizzable +unquizzed +unquizzical +unquizzically +unquod +unquotable +unquote +unquoted +unquotes +unquoting +unrabbeted +unrabbinic +unrabbinical +unraced +unrack +unracked +unracking +unradiant +unradiated +unradiative +unradical +unradicalize +unradically +unradioactive +unraffled +unraftered +unray +unraided +unrayed +unrailed +unrailroaded +unrailwayed +unrainy +unraisable +unraiseable +unraised +unrake +unraked +unraking +unrallied +unrallying +unram +unrambling +unramified +unrammed +unramped +unranched +unrancid +unrancored +unrancorous +unrancoured +unrancourous +unrandom +unranging +unrank +unranked +unrankled +unransacked +unransomable +unransomed +unranting +unrapacious +unrapaciously +unrapaciousness +unraped +unraptured +unrapturous +unrapturously +unrapturousness +unrare +unrarefied +unrash +unrashly +unrashness +unrasped +unraspy +unrasping +unratable +unrated +unratified +unrationable +unrational +unrationalised +unrationalising +unrationalized +unrationalizing +unrationally +unrationed +unrattled +unravaged +unravel +unravelable +unraveled +unraveler +unraveling +unravellable +unravelled +unraveller +unravelling +unravelment +unravels +unraving +unravished +unravishing +unrazed +unrazored +unreachable +unreachableness +unreachably +unreached +unreactionary +unreactive +unread +unreadability +unreadable +unreadableness +unreadably +unready +unreadier +unreadiest +unreadily +unreadiness +unreal +unrealise +unrealised +unrealising +unrealism +unrealist +unrealistic +unrealistically +unreality +unrealities +unrealizability +unrealizable +unrealize +unrealized +unrealizing +unreally +unrealmed +unrealness +unreaped +unreared +unreason +unreasonability +unreasonable +unreasonableness +unreasonably +unreasoned +unreasoning +unreasoningly +unreasoningness +unreasons +unreassuring +unreassuringly +unreave +unreaving +unrebated +unrebel +unrebellious +unrebelliously +unrebelliousness +unrebuffable +unrebuffably +unrebuffed +unrebuilt +unrebukable +unrebukably +unrebukeable +unrebuked +unrebuttable +unrebuttableness +unrebutted +unrecalcitrant +unrecallable +unrecallably +unrecalled +unrecalling +unrecantable +unrecanted +unrecanting +unrecaptured +unreceding +unreceipted +unreceivable +unreceived +unreceiving +unrecent +unreceptant +unreceptive +unreceptively +unreceptiveness +unreceptivity +unrecessive +unrecessively +unrecipient +unreciprocal +unreciprocally +unreciprocated +unreciprocating +unrecitative +unrecited +unrecked +unrecking +unreckingness +unreckless +unreckon +unreckonable +unreckoned +unreclaimable +unreclaimably +unreclaimed +unreclaimedness +unreclaiming +unreclined +unreclining +unrecluse +unreclusive +unrecoded +unrecognisable +unrecognisably +unrecognition +unrecognitory +unrecognizable +unrecognizableness +unrecognizably +unrecognized +unrecognizing +unrecognizingly +unrecoined +unrecollectable +unrecollected +unrecollective +unrecommendable +unrecommended +unrecompensable +unrecompensed +unreconcilable +unreconcilableness +unreconcilably +unreconciled +unreconciling +unrecondite +unreconnoitered +unreconnoitred +unreconsidered +unreconstructed +unreconstructible +unrecordable +unrecorded +unrecordedness +unrecording +unrecountable +unrecounted +unrecoverable +unrecoverableness +unrecoverably +unrecovered +unrecreant +unrecreated +unrecreating +unrecreational +unrecriminative +unrecruitable +unrecruited +unrectangular +unrectangularly +unrectifiable +unrectifiably +unrectified +unrecumbent +unrecumbently +unrecuperated +unrecuperatiness +unrecuperative +unrecuperativeness +unrecuperatory +unrecuring +unrecurrent +unrecurrently +unrecurring +unrecusant +unred +unredacted +unredeemable +unredeemableness +unredeemably +unredeemed +unredeemedly +unredeemedness +unredeeming +unredemptive +unredressable +unredressed +unreduceable +unreduced +unreducible +unreducibleness +unreducibly +unreduct +unreefed +unreel +unreelable +unreeled +unreeler +unreelers +unreeling +unreels +unreeve +unreeved +unreeves +unreeving +unreferenced +unreferred +unrefilled +unrefine +unrefined +unrefinedly +unrefinedness +unrefinement +unrefining +unrefitted +unreflected +unreflecting +unreflectingly +unreflectingness +unreflective +unreflectively +unreformable +unreformative +unreformed +unreformedness +unreforming +unrefracted +unrefracting +unrefractive +unrefractively +unrefractiveness +unrefractory +unrefrainable +unrefrained +unrefraining +unrefrangible +unrefreshed +unrefreshful +unrefreshing +unrefreshingly +unrefrigerated +unrefulgent +unrefulgently +unrefundable +unrefunded +unrefunding +unrefusable +unrefusably +unrefused +unrefusing +unrefusingly +unrefutability +unrefutable +unrefutably +unrefuted +unrefuting +unregainable +unregained +unregal +unregaled +unregality +unregally +unregard +unregardable +unregardant +unregarded +unregardedly +unregardful +unregenerable +unregeneracy +unregenerate +unregenerated +unregenerately +unregenerateness +unregenerating +unregeneration +unregenerative +unregimental +unregimentally +unregimented +unregistered +unregistrable +unregressive +unregressively +unregressiveness +unregretful +unregretfully +unregretfulness +unregrettable +unregrettably +unregretted +unregretting +unregulable +unregular +unregularised +unregularized +unregulated +unregulative +unregulatory +unregurgitated +unrehabilitated +unrehearsable +unrehearsed +unrehearsing +unreigning +unreimbodied +unrein +unreined +unreinforced +unreinstated +unreiterable +unreiterated +unreiterating +unreiterative +unrejectable +unrejected +unrejective +unrejoiced +unrejoicing +unrejuvenated +unrejuvenating +unrelayed +unrelapsing +unrelatable +unrelated +unrelatedness +unrelating +unrelational +unrelative +unrelatively +unrelativistic +unrelaxable +unrelaxed +unrelaxing +unrelaxingly +unreleasable +unreleased +unreleasible +unreleasing +unrelegable +unrelegated +unrelentable +unrelentance +unrelented +unrelenting +unrelentingly +unrelentingness +unrelentless +unrelentor +unrelevant +unrelevantly +unreliability +unreliable +unreliableness +unreliably +unreliance +unreliant +unrelievability +unrelievable +unrelievableness +unrelieved +unrelievedly +unrelievedness +unrelieving +unreligion +unreligioned +unreligious +unreligiously +unreligiousness +unrelinquishable +unrelinquishably +unrelinquished +unrelinquishing +unrelishable +unrelished +unrelishing +unreluctance +unreluctant +unreluctantly +unremaining +unremanded +unremarkable +unremarkableness +unremarked +unremarking +unremarried +unremediable +unremedied +unremember +unrememberable +unremembered +unremembering +unremembrance +unreminded +unreminiscent +unreminiscently +unremissible +unremissive +unremittable +unremitted +unremittedly +unremittence +unremittency +unremittent +unremittently +unremitting +unremittingly +unremittingness +unremonstrant +unremonstrated +unremonstrating +unremonstrative +unremorseful +unremorsefully +unremorsefulness +unremote +unremotely +unremoteness +unremounted +unremovable +unremovableness +unremovably +unremoved +unremunerated +unremunerating +unremunerative +unremuneratively +unremunerativeness +unrenderable +unrendered +unrenewable +unrenewed +unrenounceable +unrenounced +unrenouncing +unrenovated +unrenovative +unrenowned +unrenownedly +unrenownedness +unrent +unrentable +unrented +unrenunciable +unrenunciative +unrenunciatory +unreorganised +unreorganized +unrepayable +unrepaid +unrepair +unrepairable +unrepaired +unrepairs +unrepartable +unreparted +unrepealability +unrepealable +unrepealableness +unrepealably +unrepealed +unrepeatable +unrepeated +unrepellable +unrepelled +unrepellent +unrepellently +unrepent +unrepentable +unrepentance +unrepentant +unrepentantly +unrepentantness +unrepented +unrepenting +unrepentingly +unrepentingness +unrepetitious +unrepetitiously +unrepetitiousness +unrepetitive +unrepetitively +unrepined +unrepining +unrepiningly +unrepiqued +unreplaceable +unreplaced +unrepleness +unreplenished +unreplete +unrepleteness +unrepleviable +unreplevinable +unreplevined +unreplevisable +unrepliable +unrepliably +unreplied +unreplying +unreportable +unreported +unreportedly +unreportedness +unreportorial +unrepose +unreposed +unreposeful +unreposefully +unreposefulness +unreposing +unrepossessed +unreprehended +unreprehensible +unreprehensibleness +unreprehensibly +unrepreseed +unrepresentable +unrepresentation +unrepresentational +unrepresentative +unrepresentatively +unrepresentativeness +unrepresented +unrepresentedness +unrepressed +unrepressible +unrepression +unrepressive +unrepressively +unrepressiveness +unreprievable +unreprievably +unreprieved +unreprimanded +unreprimanding +unreprinted +unreproachable +unreproachableness +unreproachably +unreproached +unreproachful +unreproachfully +unreproachfulness +unreproaching +unreproachingly +unreprobated +unreprobative +unreprobatively +unreproduced +unreproducible +unreproductive +unreproductively +unreproductiveness +unreprovable +unreprovableness +unreprovably +unreproved +unreprovedly +unreprovedness +unreproving +unrepublican +unrepudiable +unrepudiated +unrepudiative +unrepugnable +unrepugnant +unrepugnantly +unrepulsable +unrepulsed +unrepulsing +unrepulsive +unrepulsively +unrepulsiveness +unreputable +unreputed +unrequalified +unrequest +unrequested +unrequickened +unrequired +unrequisite +unrequisitely +unrequisiteness +unrequisitioned +unrequitable +unrequital +unrequited +unrequitedly +unrequitedness +unrequitement +unrequiter +unrequiting +unrescinded +unrescissable +unrescissory +unrescuable +unrescued +unresearched +unresemblance +unresemblant +unresembling +unresented +unresentful +unresentfully +unresentfulness +unresenting +unreserve +unreserved +unreservedly +unreservedness +unresident +unresidential +unresidual +unresifted +unresigned +unresignedly +unresilient +unresiliently +unresinous +unresistable +unresistably +unresistance +unresistant +unresistantly +unresisted +unresistedly +unresistedness +unresistible +unresistibleness +unresistibly +unresisting +unresistingly +unresistingness +unresistive +unresolute +unresolutely +unresoluteness +unresolvable +unresolve +unresolved +unresolvedly +unresolvedness +unresolving +unresonant +unresonantly +unresonating +unresounded +unresounding +unresourceful +unresourcefully +unresourcefulness +unrespect +unrespectability +unrespectable +unrespectably +unrespected +unrespectful +unrespectfully +unrespectfulness +unrespective +unrespectively +unrespectiveness +unrespirable +unrespired +unrespited +unresplendent +unresplendently +unresponding +unresponsal +unresponsible +unresponsibleness +unresponsibly +unresponsive +unresponsively +unresponsiveness +unrest +unrestable +unrested +unrestful +unrestfully +unrestfulness +unresty +unresting +unrestingly +unrestingness +unrestitutive +unrestorable +unrestorableness +unrestorative +unrestored +unrestrainable +unrestrainably +unrestrained +unrestrainedly +unrestrainedness +unrestraint +unrestrictable +unrestricted +unrestrictedly +unrestrictedness +unrestriction +unrestrictive +unrestrictively +unrests +unresultive +unresumed +unresumptive +unresurrected +unresuscitable +unresuscitated +unresuscitating +unresuscitative +unretainable +unretained +unretaining +unretaliated +unretaliating +unretaliative +unretaliatory +unretardable +unretarded +unretentive +unretentively +unretentiveness +unreticence +unreticent +unreticently +unretinued +unretired +unretiring +unretorted +unretouched +unretractable +unretracted +unretractive +unretreated +unretreating +unretrenchable +unretrenched +unretributive +unretributory +unretrievable +unretrieved +unretrievingly +unretroactive +unretroactively +unretrograded +unretrograding +unretrogressive +unretrogressively +unretted +unreturnable +unreturnableness +unreturnably +unreturned +unreturning +unreturningly +unrevealable +unrevealed +unrevealedness +unrevealing +unrevealingly +unrevelational +unrevelationize +unreveling +unrevelling +unrevenged +unrevengeful +unrevengefully +unrevengefulness +unrevenging +unrevengingly +unrevenue +unrevenued +unreverberant +unreverberated +unreverberating +unreverberative +unrevered +unreverence +unreverenced +unreverend +unreverendly +unreverent +unreverential +unreverentially +unreverently +unreverentness +unreversable +unreversed +unreversible +unreversibleness +unreversibly +unreverted +unrevertible +unreverting +unrevested +unrevetted +unreviewable +unreviewed +unreviled +unreviling +unrevised +unrevivable +unrevived +unrevocable +unrevocableness +unrevocably +unrevokable +unrevoked +unrevolted +unrevolting +unrevolutionary +unrevolutionized +unrevolved +unrevolving +unrewardable +unrewarded +unrewardedly +unrewarding +unrewardingly +unreworded +unrhapsodic +unrhapsodical +unrhapsodically +unrhetorical +unrhetorically +unrhetoricalness +unrheumatic +unrhyme +unrhymed +unrhyming +unrhythmic +unrhythmical +unrhythmically +unribbed +unribboned +unrich +unriched +unricht +unricked +unrid +unridable +unridableness +unridably +unridden +unriddle +unriddleable +unriddled +unriddler +unriddles +unriddling +unride +unridely +unridered +unridged +unridiculed +unridiculous +unridiculously +unridiculousness +unrife +unriffled +unrifled +unrifted +unrig +unrigged +unrigging +unright +unrightable +unrighted +unrighteous +unrighteously +unrighteousness +unrightful +unrightfully +unrightfulness +unrightly +unrightwise +unrigid +unrigidly +unrigidness +unrigorous +unrigorously +unrigorousness +unrigs +unrimed +unrimpled +unrind +unring +unringable +unringed +unringing +unrinsed +unrioted +unrioting +unriotous +unriotously +unriotousness +unrip +unripe +unriped +unripely +unripened +unripeness +unripening +unriper +unripest +unrippable +unripped +unripping +unrippled +unrippling +unripplingly +unrips +unrisen +unrisible +unrising +unriskable +unrisked +unrisky +unritual +unritualistic +unritually +unrivalable +unrivaled +unrivaledly +unrivaledness +unrivaling +unrivalled +unrivalledly +unrivalling +unrivalrous +unrived +unriven +unrivet +unriveted +unriveting +unroaded +unroadworthy +unroaming +unroast +unroasted +unrobbed +unrobe +unrobed +unrobes +unrobing +unrobust +unrobustly +unrobustness +unrocked +unrocky +unrococo +unrodded +unroyal +unroyalist +unroyalized +unroyally +unroyalness +unroiled +unroll +unrollable +unrolled +unroller +unrolling +unrollment +unrolls +unromantic +unromantical +unromantically +unromanticalness +unromanticised +unromanticism +unromanticized +unroof +unroofed +unroofing +unroofs +unroomy +unroost +unroosted +unroosting +unroot +unrooted +unrooting +unroots +unrope +unroped +unrosed +unrosined +unrostrated +unrotary +unrotated +unrotating +unrotational +unrotative +unrotatory +unroted +unrotted +unrotten +unrotund +unrouged +unrough +unroughened +unround +unrounded +unrounding +unrounds +unrousable +unroused +unrousing +unrout +unroutable +unrouted +unroutine +unroutinely +unrove +unroved +unroven +unroving +unrow +unrowdy +unrowed +unroweled +unrowelled +unrra +unrrove +unrubbed +unrubbish +unrubified +unrubrical +unrubrically +unrubricated +unruddered +unruddled +unrude +unrudely +unrued +unrueful +unruefully +unruefulness +unrufe +unruffable +unruffed +unruffle +unruffled +unruffledness +unruffling +unrugged +unruinable +unruinated +unruined +unruinous +unruinously +unruinousness +unrulable +unrulableness +unrule +unruled +unruledly +unruledness +unruleful +unruly +unrulier +unruliest +unrulily +unruliment +unruliness +unruminant +unruminated +unruminating +unruminatingly +unruminative +unrummaged +unrumored +unrumoured +unrumple +unrumpled +unrun +unrung +unrupturable +unruptured +unrural +unrurally +unrushed +unrushing +unrussian +unrust +unrusted +unrustic +unrustically +unrusticated +unrustling +unruth +uns +unsabbatical +unsabered +unsabled +unsabotaged +unsabred +unsaccharic +unsaccharine +unsacerdotal +unsacerdotally +unsack +unsacked +unsacrament +unsacramental +unsacramentally +unsacramentarian +unsacred +unsacredly +unsacredness +unsacrificeable +unsacrificeably +unsacrificed +unsacrificial +unsacrificially +unsacrificing +unsacrilegious +unsacrilegiously +unsacrilegiousness +unsad +unsadden +unsaddened +unsaddle +unsaddled +unsaddles +unsaddling +unsadistic +unsadistically +unsadly +unsadness +unsafe +unsafeguarded +unsafely +unsafeness +unsafer +unsafest +unsafety +unsafetied +unsafeties +unsagacious +unsagaciously +unsagaciousness +unsage +unsagely +unsageness +unsagging +unsay +unsayability +unsayable +unsaid +unsaying +unsailable +unsailed +unsailorlike +unsaint +unsainted +unsaintly +unsaintlike +unsaintliness +unsays +unsaked +unsalability +unsalable +unsalableness +unsalably +unsalacious +unsalaciously +unsalaciousness +unsalaried +unsaleable +unsaleably +unsalesmanlike +unsalient +unsaliently +unsaline +unsalivated +unsalivating +unsallying +unsallow +unsallowness +unsalmonlike +unsalness +unsalt +unsaltable +unsaltatory +unsaltatorial +unsalted +unsalty +unsalubrious +unsalubriously +unsalubriousness +unsalutary +unsalutariness +unsalutatory +unsaluted +unsaluting +unsalvability +unsalvable +unsalvableness +unsalvably +unsalvageability +unsalvageable +unsalvageably +unsalvaged +unsalved +unsame +unsameness +unsampled +unsanctify +unsanctification +unsanctified +unsanctifiedly +unsanctifiedness +unsanctifying +unsanctimonious +unsanctimoniously +unsanctimoniousness +unsanction +unsanctionable +unsanctioned +unsanctioning +unsanctity +unsanctitude +unsanctuaried +unsandaled +unsandalled +unsanded +unsane +unsaneness +unsanguinary +unsanguinarily +unsanguinariness +unsanguine +unsanguinely +unsanguineness +unsanguineous +unsanguineously +unsanitary +unsanitariness +unsanitated +unsanitation +unsanity +unsanitized +unsapient +unsapiential +unsapientially +unsapiently +unsaponifiable +unsaponified +unsapped +unsappy +unsarcastic +unsarcastical +unsarcastically +unsardonic +unsardonically +unsartorial +unsartorially +unsash +unsashed +unsatable +unsatanic +unsatanical +unsatanically +unsatcheled +unsated +unsatedly +unsatedness +unsatiability +unsatiable +unsatiableness +unsatiably +unsatiate +unsatiated +unsatiating +unsatin +unsating +unsatire +unsatiric +unsatirical +unsatirically +unsatiricalness +unsatirisable +unsatirised +unsatirizable +unsatirize +unsatirized +unsatyrlike +unsatisfaction +unsatisfactory +unsatisfactorily +unsatisfactoriness +unsatisfy +unsatisfiability +unsatisfiable +unsatisfiableness +unsatisfiably +unsatisfied +unsatisfiedly +unsatisfiedness +unsatisfying +unsatisfyingly +unsatisfyingness +unsaturable +unsaturate +unsaturated +unsaturatedly +unsaturatedness +unsaturates +unsaturation +unsauced +unsaught +unsaurian +unsavable +unsavage +unsavagely +unsavageness +unsaveable +unsaved +unsaving +unsavingly +unsavor +unsavored +unsavoredly +unsavoredness +unsavory +unsavorily +unsavoriness +unsavorly +unsavoured +unsavoury +unsavourily +unsavouriness +unsawed +unsawn +unscabbard +unscabbarded +unscabbed +unscabrous +unscabrously +unscabrousness +unscaffolded +unscalable +unscalableness +unscalably +unscalded +unscalding +unscale +unscaled +unscaledness +unscaly +unscaling +unscalloped +unscamped +unscandalised +unscandalize +unscandalized +unscandalous +unscandalously +unscannable +unscanned +unscanted +unscanty +unscapable +unscarb +unscarce +unscarcely +unscarceness +unscared +unscarfed +unscarified +unscarred +unscarved +unscathed +unscathedly +unscathedness +unscattered +unscavenged +unscavengered +unscenic +unscenically +unscent +unscented +unscepter +unsceptered +unsceptical +unsceptically +unsceptre +unsceptred +unscheduled +unschematic +unschematically +unschematised +unschematized +unschemed +unscheming +unschismatic +unschismatical +unschizoid +unschizophrenic +unscholar +unscholarly +unscholarlike +unscholarliness +unscholastic +unscholastically +unschool +unschooled +unschooledly +unschooledness +unscience +unscienced +unscientific +unscientifical +unscientifically +unscientificness +unscintillant +unscintillating +unscioned +unscissored +unscoffed +unscoffing +unscolded +unscolding +unsconced +unscooped +unscorched +unscorching +unscored +unscorified +unscoring +unscorned +unscornful +unscornfully +unscornfulness +unscotch +unscotched +unscottify +unscoured +unscourged +unscourging +unscouring +unscowling +unscowlingly +unscramble +unscrambled +unscrambler +unscrambles +unscrambling +unscraped +unscraping +unscratchable +unscratched +unscratching +unscratchingly +unscrawled +unscrawling +unscreen +unscreenable +unscreenably +unscreened +unscrew +unscrewable +unscrewed +unscrewing +unscrews +unscribal +unscribbled +unscribed +unscrimped +unscripted +unscriptural +unscripturally +unscripturalness +unscrubbed +unscrupled +unscrupulosity +unscrupulous +unscrupulously +unscrupulousness +unscrutable +unscrutinised +unscrutinising +unscrutinisingly +unscrutinized +unscrutinizing +unscrutinizingly +unsculptural +unsculptured +unscummed +unscutcheoned +unseafaring +unseal +unsealable +unsealed +unsealer +unsealing +unseals +unseam +unseamanlike +unseamanship +unseamed +unseaming +unseams +unsearchable +unsearchableness +unsearchably +unsearched +unsearcherlike +unsearching +unsearchingly +unseared +unseason +unseasonable +unseasonableness +unseasonably +unseasoned +unseat +unseated +unseating +unseats +unseaworthy +unseaworthiness +unseceded +unseceding +unsecluded +unsecludedly +unsecluding +unseclusive +unseclusively +unseclusiveness +unseconded +unsecrecy +unsecret +unsecretarial +unsecretarylike +unsecreted +unsecreting +unsecretive +unsecretively +unsecretiveness +unsecretly +unsecretness +unsectarian +unsectarianism +unsectarianize +unsectarianized +unsectarianizing +unsectional +unsectionalised +unsectionalized +unsectionally +unsectioned +unsecular +unsecularised +unsecularize +unsecularized +unsecularly +unsecurable +unsecurableness +unsecure +unsecured +unsecuredly +unsecuredness +unsecurely +unsecureness +unsecurity +unsedate +unsedately +unsedateness +unsedative +unsedentary +unsedimental +unsedimentally +unseditious +unseditiously +unseditiousness +unseduce +unseduceability +unseduceable +unseduced +unseducible +unseducibleness +unseducibly +unseductive +unseductively +unseductiveness +unsedulous +unsedulously +unsedulousness +unsee +unseeable +unseeableness +unseeded +unseeding +unseeing +unseeingly +unseeingness +unseeking +unseel +unseely +unseeliness +unseeming +unseemingly +unseemly +unseemlier +unseemliest +unseemlily +unseemliness +unseen +unseethed +unseething +unsegmental +unsegmentally +unsegmentary +unsegmented +unsegregable +unsegregated +unsegregatedness +unsegregating +unsegregational +unsegregative +unseignioral +unseignorial +unseismal +unseismic +unseizable +unseize +unseized +unseldom +unselect +unselected +unselecting +unselective +unselectiveness +unself +unselfassured +unselfconfident +unselfconscious +unselfconsciously +unselfconsciousness +unselfish +unselfishly +unselfishness +unselflike +unselfness +unselfreliant +unsely +unseliness +unsell +unselling +unselth +unseminared +unsenatorial +unsenescent +unsenile +unsensate +unsensational +unsensationally +unsense +unsensed +unsensibility +unsensible +unsensibleness +unsensibly +unsensing +unsensitise +unsensitised +unsensitising +unsensitive +unsensitively +unsensitiveness +unsensitize +unsensitized +unsensitizing +unsensory +unsensual +unsensualised +unsensualistic +unsensualize +unsensualized +unsensually +unsensuous +unsensuously +unsensuousness +unsent +unsentenced +unsententious +unsententiously +unsententiousness +unsentient +unsentiently +unsentimental +unsentimentalised +unsentimentalist +unsentimentality +unsentimentalize +unsentimentalized +unsentimentally +unsentineled +unsentinelled +unseparable +unseparableness +unseparably +unseparate +unseparated +unseparately +unseparateness +unseparating +unseparative +unseptate +unseptated +unsepulcher +unsepulchered +unsepulchral +unsepulchrally +unsepulchre +unsepulchred +unsepulchring +unsepultured +unsequenced +unsequent +unsequential +unsequentially +unsequestered +unseraphic +unseraphical +unseraphically +unsere +unserenaded +unserene +unserenely +unsereneness +unserflike +unserialised +unserialized +unserious +unseriously +unseriousness +unserrate +unserrated +unserried +unservable +unserved +unservice +unserviceability +unserviceable +unserviceableness +unserviceably +unserviced +unservicelike +unservile +unservilely +unserving +unsesquipedalian +unset +unsets +unsetting +unsettle +unsettleable +unsettled +unsettledness +unsettlement +unsettles +unsettling +unsettlingly +unseven +unseverable +unseverableness +unsevere +unsevered +unseveredly +unseveredness +unseverely +unsevereness +unsew +unsewed +unsewered +unsewing +unsewn +unsews +unsex +unsexed +unsexes +unsexing +unsexlike +unsexual +unsexually +unshabby +unshabbily +unshackle +unshackled +unshackles +unshackling +unshade +unshaded +unshady +unshadily +unshadiness +unshading +unshadow +unshadowable +unshadowed +unshafted +unshakable +unshakableness +unshakably +unshakeable +unshakeably +unshaked +unshaken +unshakenly +unshakenness +unshaky +unshakiness +unshaking +unshakingness +unshale +unshaled +unshamable +unshamableness +unshamably +unshameable +unshameableness +unshameably +unshamed +unshamefaced +unshamefacedness +unshameful +unshamefully +unshamefulness +unshammed +unshanked +unshapable +unshape +unshapeable +unshaped +unshapedness +unshapely +unshapeliness +unshapen +unshapenly +unshapenness +unshaping +unsharable +unshareable +unshared +unsharedness +unsharing +unsharp +unsharped +unsharpen +unsharpened +unsharpening +unsharping +unsharply +unsharpness +unshatterable +unshattered +unshavable +unshave +unshaveable +unshaved +unshavedly +unshavedness +unshaven +unshavenly +unshavenness +unshawl +unsheaf +unsheared +unsheathe +unsheathed +unsheathes +unsheathing +unshed +unshedding +unsheer +unsheerness +unsheet +unsheeted +unsheeting +unshell +unshelled +unshelling +unshells +unshelterable +unsheltered +unsheltering +unshelve +unshelved +unshent +unshepherded +unshepherding +unsheriff +unshewed +unshy +unshieldable +unshielded +unshielding +unshift +unshiftable +unshifted +unshifty +unshiftiness +unshifting +unshifts +unshyly +unshimmering +unshimmeringly +unshined +unshyness +unshingled +unshiny +unshining +unship +unshiplike +unshipment +unshippable +unshipped +unshipping +unships +unshipshape +unshipwrecked +unshirked +unshirking +unshirred +unshirted +unshivered +unshivering +unshness +unshockability +unshockable +unshocked +unshocking +unshod +unshodden +unshoe +unshoed +unshoeing +unshook +unshop +unshore +unshored +unshorn +unshort +unshorten +unshortened +unshot +unshotted +unshoulder +unshout +unshouted +unshouting +unshoved +unshoveled +unshovelled +unshowable +unshowed +unshowered +unshowering +unshowy +unshowily +unshowiness +unshowmanlike +unshown +unshredded +unshrew +unshrewd +unshrewdly +unshrewdness +unshrewish +unshrill +unshrine +unshrined +unshrinement +unshrink +unshrinkability +unshrinkable +unshrinking +unshrinkingly +unshrinkingness +unshrived +unshriveled +unshrivelled +unshriven +unshroud +unshrouded +unshrubbed +unshrugging +unshrunk +unshrunken +unshuddering +unshuffle +unshuffled +unshunnable +unshunned +unshunning +unshunted +unshut +unshutter +unshuttered +unsibilant +unsiccated +unsiccative +unsick +unsickened +unsicker +unsickered +unsickerly +unsickerness +unsickled +unsickly +unsided +unsidereal +unsiding +unsidling +unsiege +unsieged +unsieved +unsifted +unsighing +unsight +unsightable +unsighted +unsightedly +unsighting +unsightless +unsightly +unsightlier +unsightliest +unsightliness +unsights +unsigmatic +unsignable +unsignaled +unsignalised +unsignalized +unsignalled +unsignatured +unsigned +unsigneted +unsignifiable +unsignificancy +unsignificant +unsignificantly +unsignificative +unsignified +unsignifying +unsilenceable +unsilenceably +unsilenced +unsilent +unsilentious +unsilently +unsilhouetted +unsilicated +unsilicified +unsyllabic +unsyllabicated +unsyllabified +unsyllabled +unsilly +unsyllogistic +unsyllogistical +unsyllogistically +unsilvered +unsymbolic +unsymbolical +unsymbolically +unsymbolicalness +unsymbolised +unsymbolized +unsimilar +unsimilarity +unsimilarly +unsimmered +unsimmering +unsymmetry +unsymmetric +unsymmetrical +unsymmetrically +unsymmetricalness +unsymmetrized +unsympathetic +unsympathetically +unsympatheticness +unsympathy +unsympathised +unsympathising +unsympathisingly +unsympathizability +unsympathizable +unsympathized +unsympathizing +unsympathizingly +unsimpering +unsymphonious +unsymphoniously +unsimple +unsimpleness +unsimply +unsimplicity +unsimplify +unsimplified +unsimplifying +unsymptomatic +unsymptomatical +unsymptomatically +unsimular +unsimulated +unsimulating +unsimulative +unsimultaneous +unsimultaneously +unsimultaneousness +unsin +unsincere +unsincerely +unsincereness +unsincerity +unsynchronised +unsynchronized +unsynchronous +unsynchronously +unsynchronousness +unsyncopated +unsyndicated +unsinew +unsinewed +unsinewy +unsinewing +unsinful +unsinfully +unsinfulness +unsing +unsingability +unsingable +unsingableness +unsinged +unsingle +unsingled +unsingleness +unsingular +unsingularly +unsingularness +unsinister +unsinisterly +unsinisterness +unsinkability +unsinkable +unsinking +unsinnable +unsinning +unsinningness +unsynonymous +unsynonymously +unsyntactic +unsyntactical +unsyntactically +unsynthesised +unsynthesized +unsynthetic +unsynthetically +unsyntheticness +unsinuate +unsinuated +unsinuately +unsinuous +unsinuously +unsinuousness +unsiphon +unsipped +unsyringed +unsystematic +unsystematical +unsystematically +unsystematicness +unsystematised +unsystematising +unsystematized +unsystematizedly +unsystematizing +unsystemizable +unsister +unsistered +unsisterly +unsisterliness +unsisting +unsitting +unsittingly +unsituated +unsizable +unsizableness +unsizeable +unsizeableness +unsized +unskaithd +unskaithed +unskeptical +unskeptically +unskepticalness +unsketchable +unsketched +unskewed +unskewered +unskilful +unskilfully +unskilfulness +unskill +unskilled +unskilledly +unskilledness +unskillful +unskillfully +unskillfulness +unskimmed +unskin +unskinned +unskirmished +unskirted +unslack +unslacked +unslackened +unslackening +unslacking +unslagged +unslayable +unslain +unslakable +unslakeable +unslaked +unslammed +unslandered +unslanderous +unslanderously +unslanderousness +unslanted +unslanting +unslapped +unslashed +unslate +unslated +unslating +unslatted +unslaughtered +unslave +unsleaved +unsleek +unsleepably +unsleepy +unsleeping +unsleepingly +unsleeve +unsleeved +unslender +unslept +unsly +unsliced +unslicked +unsliding +unslighted +unslyly +unslim +unslimly +unslimmed +unslimness +unslyness +unsling +unslinging +unslings +unslinking +unslip +unslipped +unslippered +unslippery +unslipping +unslit +unslockened +unslogh +unsloped +unsloping +unslopped +unslot +unslothful +unslothfully +unslothfulness +unslotted +unslouched +unslouchy +unslouching +unsloughed +unsloughing +unslow +unslowed +unslowly +unslowness +unsluggish +unsluggishly +unsluggishness +unsluice +unsluiced +unslumbery +unslumbering +unslumberous +unslumbrous +unslumped +unslumping +unslung +unslurred +unsmacked +unsmart +unsmarting +unsmartly +unsmartness +unsmashed +unsmeared +unsmelled +unsmelling +unsmelted +unsmiled +unsmiling +unsmilingly +unsmilingness +unsmirched +unsmirking +unsmirkingly +unsmitten +unsmocked +unsmokable +unsmokeable +unsmoked +unsmoky +unsmokified +unsmokily +unsmokiness +unsmoking +unsmoldering +unsmooth +unsmoothed +unsmoothened +unsmoothly +unsmoothness +unsmote +unsmotherable +unsmothered +unsmothering +unsmouldering +unsmoulderingly +unsmudged +unsmug +unsmuggled +unsmugly +unsmugness +unsmutched +unsmutted +unsmutty +unsnaffled +unsnagged +unsnaggled +unsnaky +unsnap +unsnapped +unsnapping +unsnaps +unsnare +unsnared +unsnarl +unsnarled +unsnarling +unsnarls +unsnatch +unsnatched +unsneaky +unsneaking +unsneck +unsneering +unsneeringly +unsnib +unsnipped +unsnobbish +unsnobbishly +unsnobbishness +unsnoring +unsnouted +unsnow +unsnubbable +unsnubbed +unsnuffed +unsnug +unsnugly +unsnugness +unsoaked +unsoaped +unsoarable +unsoaring +unsober +unsobered +unsobering +unsoberly +unsoberness +unsobriety +unsociability +unsociable +unsociableness +unsociably +unsocial +unsocialised +unsocialising +unsocialism +unsocialistic +unsociality +unsocializable +unsocialized +unsocializing +unsocially +unsocialness +unsociological +unsociologically +unsocket +unsocketed +unsodden +unsoft +unsoftened +unsoftening +unsoftly +unsoftness +unsoggy +unsoil +unsoiled +unsoiledness +unsoiling +unsolaced +unsolacing +unsolar +unsold +unsolder +unsoldered +unsoldering +unsolders +unsoldier +unsoldiered +unsoldiery +unsoldierly +unsoldierlike +unsole +unsoled +unsolemn +unsolemness +unsolemnified +unsolemnised +unsolemnize +unsolemnized +unsolemnly +unsolemnness +unsolicitated +unsolicited +unsolicitedly +unsolicitous +unsolicitously +unsolicitousness +unsolicitude +unsolid +unsolidarity +unsolidifiable +unsolidified +unsolidity +unsolidly +unsolidness +unsoling +unsolitary +unsolubility +unsoluble +unsolubleness +unsolubly +unsolvable +unsolvableness +unsolvably +unsolve +unsolved +unsomatic +unsomber +unsomberly +unsomberness +unsombre +unsombrely +unsombreness +unsome +unsomnolent +unsomnolently +unson +unsonable +unsonant +unsonantal +unsoncy +unsonlike +unsonneted +unsonorous +unsonorously +unsonorousness +unsonsy +unsonsie +unsoot +unsoothable +unsoothed +unsoothfast +unsoothing +unsoothingly +unsooty +unsophistic +unsophistical +unsophistically +unsophisticate +unsophisticated +unsophisticatedly +unsophisticatedness +unsophistication +unsophomoric +unsophomorical +unsophomorically +unsoporiferous +unsoporiferously +unsoporiferousness +unsoporific +unsordid +unsordidly +unsordidness +unsore +unsorely +unsoreness +unsorry +unsorriness +unsorrowed +unsorrowful +unsorrowing +unsort +unsortable +unsorted +unsorting +unsotted +unsought +unsoul +unsoulful +unsoulfully +unsoulfulness +unsoulish +unsound +unsoundable +unsoundableness +unsounded +unsounder +unsoundest +unsounding +unsoundly +unsoundness +unsour +unsoured +unsourly +unsourness +unsoused +unsovereign +unsowed +unsown +unspaced +unspacious +unspaciously +unspaciousness +unspaded +unspayed +unspan +unspangled +unspanked +unspanned +unspanning +unspar +unsparable +unspared +unsparing +unsparingly +unsparingness +unsparked +unsparkling +unsparred +unsparse +unsparsely +unsparseness +unspasmed +unspasmodic +unspasmodical +unspasmodically +unspatial +unspatiality +unspatially +unspattered +unspawned +unspeak +unspeakability +unspeakable +unspeakableness +unspeakably +unspeaking +unspeaks +unspeared +unspecialised +unspecialising +unspecialized +unspecializing +unspecifiable +unspecific +unspecifically +unspecified +unspecifiedly +unspecifying +unspecious +unspeciously +unspeciousness +unspecked +unspeckled +unspectacled +unspectacular +unspectacularly +unspecterlike +unspectrelike +unspeculating +unspeculative +unspeculatively +unspeculatory +unsped +unspeed +unspeedful +unspeedy +unspeedily +unspeediness +unspeered +unspell +unspellable +unspelled +unspeller +unspelling +unspelt +unspendable +unspending +unspent +unspewed +unsphere +unsphered +unspheres +unspherical +unsphering +unspiable +unspiced +unspicy +unspicily +unspiciness +unspied +unspying +unspike +unspillable +unspilled +unspilt +unspin +unspinnable +unspinning +unspinsterlike +unspinsterlikeness +unspiral +unspiraled +unspiralled +unspirally +unspired +unspiring +unspirit +unspirited +unspiritedly +unspiriting +unspiritual +unspiritualised +unspiritualising +unspirituality +unspiritualize +unspiritualized +unspiritualizing +unspiritually +unspiritualness +unspirituous +unspissated +unspit +unspited +unspiteful +unspitefully +unspitted +unsplayed +unsplashed +unsplattered +unspleened +unspleenish +unspleenishly +unsplendid +unsplendidly +unsplendidness +unsplendorous +unsplendorously +unsplendourous +unsplendourously +unsplenetic +unsplenetically +unspliced +unsplinted +unsplintered +unsplit +unsplittable +unspoil +unspoilable +unspoilableness +unspoilably +unspoiled +unspoiledness +unspoilt +unspoke +unspoken +unspokenly +unsponged +unspongy +unsponsored +unspontaneous +unspontaneously +unspontaneousness +unspookish +unsported +unsportful +unsporting +unsportive +unsportively +unsportiveness +unsportsmanly +unsportsmanlike +unsportsmanlikeness +unsportsmanliness +unspot +unspotlighted +unspottable +unspotted +unspottedly +unspottedness +unspotten +unspoused +unspouselike +unspouted +unsprayable +unsprayed +unsprained +unspread +unspreadable +unspreading +unsprightly +unsprightliness +unspring +unspringing +unspringlike +unsprinkled +unsprinklered +unsprouted +unsproutful +unsprouting +unspruced +unsprung +unspun +unspurious +unspuriously +unspuriousness +unspurned +unspurred +unsputtering +unsquabbling +unsquandered +unsquarable +unsquare +unsquared +unsquashable +unsquashed +unsqueamish +unsqueamishly +unsqueamishness +unsqueezable +unsqueezed +unsquelched +unsquinting +unsquire +unsquired +unsquirelike +unsquirming +unsquirted +unstabbed +unstabilised +unstabilising +unstability +unstabilized +unstabilizing +unstable +unstabled +unstableness +unstabler +unstablest +unstably +unstablished +unstack +unstacked +unstacker +unstacking +unstacks +unstaffed +unstaged +unstaggered +unstaggering +unstagy +unstagily +unstaginess +unstagnant +unstagnantly +unstagnating +unstayable +unstaid +unstaidly +unstaidness +unstayed +unstayedness +unstaying +unstain +unstainable +unstainableness +unstained +unstainedly +unstainedness +unstaled +unstalemated +unstalked +unstalled +unstammering +unstammeringly +unstamped +unstampeded +unstanch +unstanchable +unstanched +unstandard +unstandardisable +unstandardised +unstandardizable +unstandardized +unstanding +unstanzaic +unstapled +unstar +unstarch +unstarched +unstarlike +unstarred +unstarted +unstarting +unstartled +unstartling +unstarved +unstatable +unstate +unstateable +unstated +unstately +unstates +unstatesmanlike +unstatic +unstatical +unstatically +unstating +unstation +unstationary +unstationed +unstatistic +unstatistical +unstatistically +unstatued +unstatuesque +unstatuesquely +unstatuesqueness +unstatutable +unstatutably +unstatutory +unstaunch +unstaunchable +unstaunched +unstavable +unstaveable +unstaved +unsteadfast +unsteadfastly +unsteadfastness +unsteady +unsteadied +unsteadier +unsteadies +unsteadiest +unsteadying +unsteadily +unsteadiness +unstealthy +unstealthily +unstealthiness +unsteamed +unsteaming +unsteck +unstecked +unsteek +unsteel +unsteeled +unsteeling +unsteels +unsteep +unsteeped +unsteepled +unsteered +unstemmable +unstemmed +unstentorian +unstentoriously +unstep +unstepped +unstepping +unsteps +unstercorated +unstereotyped +unsterile +unsterilized +unstern +unsternly +unsternness +unstethoscoped +unstewardlike +unstewed +unsty +unstick +unsticked +unsticky +unsticking +unstickingness +unsticks +unstiff +unstiffen +unstiffened +unstiffly +unstiffness +unstifled +unstifling +unstigmatic +unstigmatised +unstigmatized +unstyled +unstylish +unstylishly +unstylishness +unstylized +unstill +unstilled +unstillness +unstilted +unstimulable +unstimulated +unstimulating +unstimulatingly +unstimulative +unsting +unstinged +unstinging +unstingingly +unstinted +unstintedly +unstinting +unstintingly +unstippled +unstipulated +unstirrable +unstirred +unstirring +unstitch +unstitched +unstitching +unstock +unstocked +unstocking +unstockinged +unstoic +unstoical +unstoically +unstoicize +unstoked +unstoken +unstolen +unstonable +unstone +unstoneable +unstoned +unstony +unstonily +unstoniness +unstooped +unstooping +unstop +unstoppable +unstoppably +unstopped +unstopper +unstoppered +unstopping +unstopple +unstops +unstorable +unstore +unstored +unstoried +unstormable +unstormed +unstormy +unstormily +unstorminess +unstout +unstoutly +unstoutness +unstoved +unstow +unstowed +unstraddled +unstrafed +unstraight +unstraightened +unstraightforward +unstraightforwardness +unstraightness +unstraying +unstrain +unstrained +unstraitened +unstrand +unstranded +unstrange +unstrangely +unstrangeness +unstrangered +unstrangled +unstrangulable +unstrap +unstrapped +unstrapping +unstraps +unstrategic +unstrategical +unstrategically +unstratified +unstreaked +unstreamed +unstreaming +unstreamlined +unstreng +unstrength +unstrengthen +unstrengthened +unstrengthening +unstrenuous +unstrenuously +unstrenuousness +unstrepitous +unstress +unstressed +unstressedly +unstressedness +unstresses +unstretch +unstretchable +unstretched +unstrewed +unstrewn +unstriated +unstricken +unstrict +unstrictly +unstrictness +unstrictured +unstride +unstrident +unstridently +unstridulating +unstridulous +unstrike +unstriking +unstring +unstringed +unstringent +unstringently +unstringing +unstrings +unstrip +unstriped +unstripped +unstriving +unstroked +unstrong +unstruck +unstructural +unstructurally +unstructured +unstruggling +unstrung +unstubbed +unstubbled +unstubborn +unstubbornly +unstubbornness +unstuccoed +unstuck +unstudded +unstudied +unstudiedness +unstudious +unstudiously +unstudiousness +unstuff +unstuffed +unstuffy +unstuffily +unstuffiness +unstuffing +unstultified +unstultifying +unstumbling +unstung +unstunned +unstunted +unstupefied +unstupid +unstupidly +unstupidness +unsturdy +unsturdily +unsturdiness +unstuttered +unstuttering +unsubdivided +unsubduable +unsubduableness +unsubduably +unsubducted +unsubdued +unsubduedly +unsubduedness +unsubject +unsubjectable +unsubjected +unsubjectedness +unsubjection +unsubjective +unsubjectively +unsubjectlike +unsubjugate +unsubjugated +unsublimable +unsublimated +unsublimed +unsubmerged +unsubmergible +unsubmerging +unsubmersible +unsubmission +unsubmissive +unsubmissively +unsubmissiveness +unsubmitted +unsubmitting +unsubordinate +unsubordinated +unsubordinative +unsuborned +unsubpoenaed +unsubrogated +unsubscribed +unsubscribing +unsubscripted +unsubservient +unsubserviently +unsubsided +unsubsidiary +unsubsiding +unsubsidized +unsubstanced +unsubstantial +unsubstantiality +unsubstantialization +unsubstantialize +unsubstantially +unsubstantialness +unsubstantiatable +unsubstantiate +unsubstantiated +unsubstantiation +unsubstantive +unsubstituted +unsubstitutive +unsubtle +unsubtleness +unsubtlety +unsubtly +unsubtracted +unsubtractive +unsuburban +unsuburbed +unsubventioned +unsubventionized +unsubversive +unsubversively +unsubversiveness +unsubvertable +unsubverted +unsubvertive +unsucceedable +unsucceeded +unsucceeding +unsuccess +unsuccessful +unsuccessfully +unsuccessfulness +unsuccessive +unsuccessively +unsuccessiveness +unsuccinct +unsuccinctly +unsuccorable +unsuccored +unsucculent +unsucculently +unsuccumbing +unsucked +unsuckled +unsued +unsufferable +unsufferableness +unsufferably +unsuffered +unsuffering +unsufficed +unsufficience +unsufficiency +unsufficient +unsufficiently +unsufficing +unsufficingness +unsuffixed +unsufflated +unsuffocate +unsuffocated +unsuffocative +unsuffused +unsuffusive +unsugared +unsugary +unsuggested +unsuggestedness +unsuggestibility +unsuggestible +unsuggesting +unsuggestive +unsuggestively +unsuggestiveness +unsuicidal +unsuicidally +unsuit +unsuitability +unsuitable +unsuitableness +unsuitably +unsuited +unsuitedness +unsuiting +unsulfonated +unsulfureness +unsulfureous +unsulfureousness +unsulfurized +unsulky +unsulkily +unsulkiness +unsullen +unsullenly +unsulliable +unsullied +unsulliedly +unsulliedness +unsulphonated +unsulphureness +unsulphureous +unsulphureousness +unsulphurized +unsultry +unsummable +unsummarisable +unsummarised +unsummarizable +unsummarized +unsummed +unsummered +unsummerly +unsummerlike +unsummonable +unsummoned +unsumptuary +unsumptuous +unsumptuously +unsumptuousness +unsun +unsunburned +unsunburnt +unsundered +unsung +unsunk +unsunken +unsunned +unsunny +unsuperable +unsuperannuated +unsupercilious +unsuperciliously +unsuperciliousness +unsuperficial +unsuperficially +unsuperfluous +unsuperfluously +unsuperfluousness +unsuperior +unsuperiorly +unsuperlative +unsuperlatively +unsuperlativeness +unsupernatural +unsupernaturalize +unsupernaturalized +unsupernaturally +unsupernaturalness +unsuperscribed +unsuperseded +unsuperseding +unsuperstitious +unsuperstitiously +unsuperstitiousness +unsupervised +unsupervisedly +unsupervisory +unsupine +unsupped +unsupplantable +unsupplanted +unsupple +unsuppled +unsupplemental +unsupplementary +unsupplemented +unsuppleness +unsupply +unsuppliable +unsuppliant +unsupplicated +unsupplicating +unsupplicatingly +unsupplied +unsupportable +unsupportableness +unsupportably +unsupported +unsupportedly +unsupportedness +unsupporting +unsupposable +unsupposed +unsuppositional +unsuppositive +unsuppressed +unsuppressible +unsuppressibly +unsuppression +unsuppressive +unsuppurated +unsuppurative +unsupreme +unsurcharge +unsurcharged +unsure +unsurely +unsureness +unsurety +unsurfaced +unsurfeited +unsurfeiting +unsurgical +unsurgically +unsurging +unsurly +unsurlily +unsurliness +unsurmised +unsurmising +unsurmountable +unsurmountableness +unsurmountably +unsurmounted +unsurnamed +unsurpassable +unsurpassableness +unsurpassably +unsurpassed +unsurpassedly +unsurpassedness +unsurplice +unsurpliced +unsurprise +unsurprised +unsurprisedness +unsurprising +unsurprisingly +unsurrealistic +unsurrealistically +unsurrendered +unsurrendering +unsurrounded +unsurveyable +unsurveyed +unsurvived +unsurviving +unsusceptibility +unsusceptible +unsusceptibleness +unsusceptibly +unsusceptive +unsuspect +unsuspectable +unsuspectably +unsuspected +unsuspectedly +unsuspectedness +unsuspectful +unsuspectfully +unsuspectfulness +unsuspectible +unsuspecting +unsuspectingly +unsuspectingness +unsuspective +unsuspended +unsuspendible +unsuspicion +unsuspicious +unsuspiciously +unsuspiciousness +unsustainability +unsustainable +unsustainably +unsustained +unsustaining +unsutured +unswabbed +unswaddle +unswaddled +unswaddling +unswaggering +unswaggeringly +unswayable +unswayableness +unswayed +unswayedness +unswaying +unswallowable +unswallowed +unswampy +unswanlike +unswapped +unswarming +unswathable +unswathe +unswatheable +unswathed +unswathes +unswathing +unswear +unswearing +unswears +unsweat +unsweated +unsweating +unsweepable +unsweet +unsweeten +unsweetened +unsweetenedness +unsweetly +unsweetness +unswell +unswelled +unswelling +unsweltered +unsweltering +unswept +unswervable +unswerved +unswerving +unswervingly +unswervingness +unswilled +unswing +unswingled +unswitched +unswivel +unswiveled +unswiveling +unswollen +unswooning +unswore +unsworn +unswung +unta +untabernacled +untabled +untabulable +untabulated +untaciturn +untaciturnity +untaciturnly +untack +untacked +untacking +untackle +untackled +untackling +untacks +untactful +untactfully +untactfulness +untactical +untactically +untactile +untactual +untactually +untagged +untailed +untailored +untailorly +untailorlike +untaint +untaintable +untainted +untaintedly +untaintedness +untainting +untakable +untakableness +untakeable +untakeableness +untaken +untaking +untalented +untalkative +untalkativeness +untalked +untalking +untall +untallied +untallowed +untaloned +untamable +untamableness +untamably +untame +untameable +untamed +untamedly +untamedness +untamely +untameness +untampered +untangental +untangentally +untangential +untangentially +untangibility +untangible +untangibleness +untangibly +untangle +untangled +untangles +untangling +untanned +untantalised +untantalising +untantalized +untantalizing +untap +untaped +untapered +untapering +untapestried +untappable +untapped +untappice +untar +untarnishable +untarnished +untarnishedness +untarnishing +untarred +untarried +untarrying +untartarized +untasked +untasseled +untasselled +untastable +untaste +untasteable +untasted +untasteful +untastefully +untastefulness +untasty +untastily +untasting +untattered +untattooed +untaught +untaughtness +untaunted +untaunting +untauntingly +untaut +untautly +untautness +untautological +untautologically +untawdry +untawed +untax +untaxable +untaxed +untaxied +untaxing +unteach +unteachability +unteachable +unteachableness +unteachably +unteacherlike +unteaches +unteaching +unteam +unteamed +unteaming +untearable +unteased +unteaseled +unteaselled +unteasled +untechnical +untechnicalize +untechnically +untedded +untedious +untediously +unteem +unteeming +unteethed +untelegraphed +untelevised +untelic +untell +untellable +untellably +untelling +untemper +untemperable +untemperamental +untemperamentally +untemperance +untemperate +untemperately +untemperateness +untempered +untempering +untempested +untempestuous +untempestuously +untempestuousness +untempled +untemporal +untemporally +untemporary +untemporizing +untemptability +untemptable +untemptably +untempted +untemptible +untemptibly +untempting +untemptingly +untemptingness +untenability +untenable +untenableness +untenably +untenacious +untenaciously +untenaciousness +untenacity +untenant +untenantable +untenantableness +untenanted +untended +untender +untendered +untenderized +untenderly +untenderness +untenebrous +untenible +untenibleness +untenibly +untense +untensely +untenseness +untensibility +untensible +untensibly +untensile +untensing +untent +untentacled +untentaculate +untented +untentered +untenty +untenuous +untenuously +untenuousness +untermed +unterminable +unterminableness +unterminably +unterminated +unterminating +unterminational +unterminative +unterraced +unterred +unterrestrial +unterrible +unterribly +unterrifiable +unterrific +unterrifically +unterrified +unterrifying +unterrorized +unterse +untersely +unterseness +untessellated +untestable +untestamental +untestamentary +untestate +untested +untestifying +untether +untethered +untethering +untethers +untewed +untextual +untextually +untextural +unthank +unthanked +unthankful +unthankfully +unthankfulness +unthanking +unthatch +unthatched +unthaw +unthawed +unthawing +untheatric +untheatrical +untheatrically +untheistic +untheistical +untheistically +unthematic +unthematically +unthende +untheologic +untheological +untheologically +untheologize +untheoretic +untheoretical +untheoretically +untheorizable +untherapeutic +untherapeutical +untherapeutically +unthewed +unthick +unthicken +unthickened +unthickly +unthickness +unthievish +unthievishly +unthievishness +unthink +unthinkability +unthinkable +unthinkableness +unthinkables +unthinkably +unthinker +unthinking +unthinkingly +unthinkingness +unthinks +unthinned +unthinning +unthirsty +unthirsting +unthistle +untholeable +untholeably +unthorn +unthorny +unthorough +unthoroughly +unthoroughness +unthoughful +unthought +unthoughted +unthoughtedly +unthoughtful +unthoughtfully +unthoughtfulness +unthoughtlike +unthrall +unthralled +unthrashed +unthread +unthreadable +unthreaded +unthreading +unthreads +unthreatened +unthreatening +unthreateningly +unthreshed +unthrid +unthridden +unthrift +unthrifty +unthriftier +unthriftiest +unthriftihood +unthriftily +unthriftiness +unthriftlike +unthrilled +unthrilling +unthrive +unthriven +unthriving +unthrivingly +unthrivingness +unthroaty +unthroatily +unthrob +unthrobbing +unthrone +unthroned +unthrones +unthronged +unthroning +unthrottled +unthrowable +unthrown +unthrushlike +unthrust +unthumbed +unthumped +unthundered +unthundering +unthwacked +unthwartable +unthwarted +unthwarting +untiaraed +unticketed +untickled +untidal +untidy +untidied +untidier +untidies +untidiest +untidying +untidily +untidiness +untie +untied +untieing +untiered +unties +untight +untighten +untightened +untightening +untightness +untiing +untying +until +untile +untiled +untill +untillable +untilled +untilling +untilt +untilted +untilting +untimbered +untime +untimed +untimedness +untimeless +untimely +untimelier +untimeliest +untimeliness +untimeous +untimeously +untimesome +untimid +untimidly +untimidness +untimorous +untimorously +untimorousness +untimous +untin +untinct +untinctured +untindered +untine +untinged +untinkered +untinned +untinseled +untinselled +untinted +untyped +untypical +untypically +untippable +untipped +untippled +untipsy +untipt +untirability +untirable +untyrannic +untyrannical +untyrannically +untyrannised +untyrannized +untyrantlike +untire +untired +untiredly +untiring +untiringly +untissued +untithability +untithable +untithed +untitillated +untitillating +untitled +untittering +untitular +untitularly +unto +untoadying +untoasted +untogaed +untoggle +untoggler +untoiled +untoileted +untoiling +untold +untolerable +untolerableness +untolerably +untolerated +untolerating +untolerative +untolled +untomb +untombed +untonality +untone +untoned +untongue +untongued +untonsured +untooled +untooth +untoothed +untoothsome +untoothsomeness +untop +untopographical +untopographically +untoppable +untopped +untopping +untoppled +untormented +untormenting +untormentingly +untorn +untorpedoed +untorpid +untorpidly +untorporific +untorrid +untorridity +untorridly +untorridness +untortious +untortiously +untortuous +untortuously +untortuousness +untorture +untortured +untossed +untotaled +untotalled +untotted +untottering +untouch +untouchability +untouchable +untouchableness +untouchables +untouchably +untouched +untouchedness +untouching +untough +untoughly +untoughness +untoured +untouristed +untoward +untowardly +untowardliness +untowardness +untowered +untown +untownlike +untoxic +untoxically +untrace +untraceable +untraceableness +untraceably +untraced +untraceried +untracked +untractability +untractable +untractableness +untractably +untractarian +untracted +untractible +untractibleness +untradable +untradeable +untraded +untradesmanlike +untrading +untraditional +untraduced +untraffickable +untrafficked +untragic +untragical +untragically +untragicalness +untrailed +untrailerable +untrailered +untrailing +untrain +untrainable +untrained +untrainedly +untrainedness +untraitored +untraitorous +untraitorously +untraitorousness +untrammed +untrammeled +untrammeledness +untrammelled +untramped +untrampled +untrance +untranquil +untranquilize +untranquilized +untranquilizing +untranquilly +untranquillise +untranquillised +untranquillising +untranquillize +untranquillized +untranquilness +untransacted +untranscended +untranscendent +untranscendental +untranscendentally +untranscribable +untranscribed +untransferable +untransferred +untransferring +untransfigured +untransfixed +untransformable +untransformative +untransformed +untransforming +untransfused +untransfusible +untransgressed +untransient +untransiently +untransientness +untransitable +untransitional +untransitionally +untransitive +untransitively +untransitiveness +untransitory +untransitorily +untransitoriness +untranslatability +untranslatable +untranslatableness +untranslatably +untranslated +untransmigrated +untransmissible +untransmissive +untransmitted +untransmutability +untransmutable +untransmutableness +untransmutably +untransmuted +untransparent +untransparently +untransparentness +untranspassable +untranspired +untranspiring +untransplanted +untransportable +untransported +untransposed +untransubstantiated +untrappable +untrapped +untrashed +untraumatic +untravelable +untraveled +untraveling +untravellable +untravelled +untravelling +untraversable +untraversed +untravestied +untreacherous +untreacherously +untreacherousness +untread +untreadable +untreading +untreads +untreasonable +untreasurable +untreasure +untreasured +untreatable +untreatableness +untreatably +untreated +untreed +untrekked +untrellised +untrembling +untremblingly +untremendous +untremendously +untremendousness +untremolant +untremulant +untremulent +untremulous +untremulously +untremulousness +untrenched +untrend +untrepanned +untrespassed +untrespassing +untress +untressed +untriable +untriableness +untriabness +untribal +untribally +untributary +untributarily +untriced +untrickable +untricked +untried +untrifling +untriflingly +untrig +untriggered +untrigonometric +untrigonometrical +untrigonometrically +untrying +untrill +untrim +untrimmable +untrimmed +untrimmedness +untrimming +untrims +untrinitarian +untripe +untrippable +untripped +untripping +untrist +untrite +untritely +untriteness +untriturated +untriumphable +untriumphant +untriumphantly +untriumphed +untrivial +untrivially +untrochaic +untrod +untrodden +untroddenness +untrolled +untrophied +untropic +untropical +untropically +untroth +untrotted +untroublable +untrouble +untroubled +untroubledly +untroubledness +untroublesome +untroublesomeness +untrounced +untrowable +untrowed +untruant +untruced +untruck +untruckled +untruckling +untrue +untrueness +untruer +untruest +untruism +untruly +untrumped +untrumpeted +untrumping +untrundled +untrunked +untruss +untrussed +untrusser +untrusses +untrussing +untrust +untrustable +untrustably +untrusted +untrustful +untrustfully +untrusty +untrustiness +untrusting +untrustness +untrustworthy +untrustworthily +untrustworthiness +untruth +untruther +untruthful +untruthfully +untruthfulness +untruths +unttrod +untubbed +untubercular +untuberculous +untuck +untucked +untuckered +untucking +untucks +untufted +untugged +untumbled +untumefied +untumid +untumidity +untumidly +untumidness +untumultuous +untumultuously +untumultuousness +untunable +untunableness +untunably +untune +untuneable +untuneableness +untuneably +untuned +untuneful +untunefully +untunefulness +untunes +untuning +untunneled +untunnelled +untupped +unturbaned +unturbid +unturbidly +unturbulent +unturbulently +unturf +unturfed +unturgid +unturgidly +unturn +unturnable +unturned +unturning +unturpentined +unturreted +untusked +untutelar +untutelary +untutored +untutoredly +untutoredness +untwilled +untwinable +untwind +untwine +untwineable +untwined +untwines +untwining +untwinkled +untwinkling +untwinned +untwirl +untwirled +untwirling +untwist +untwistable +untwisted +untwister +untwisting +untwists +untwitched +untwitching +untwitten +untz +unubiquitous +unubiquitously +unubiquitousness +unugly +unulcerated +unulcerative +unulcerous +unulcerously +unulcerousness +unultra +unum +unumpired +ununanimity +ununanimous +ununanimously +ununderstandability +ununderstandable +ununderstandably +ununderstanding +ununderstood +unundertaken +unundulatory +unungun +ununifiable +ununified +ununiform +ununiformed +ununiformity +ununiformly +ununiformness +ununionized +ununique +ununiquely +ununiqueness +ununitable +ununitableness +ununitably +ununited +ununiting +ununiversity +ununiversitylike +unupbraided +unupbraiding +unupbraidingly +unupdated +unupholstered +unupright +unuprightly +unuprightness +unupset +unupsettable +unurban +unurbane +unurbanely +unurbanized +unured +unurged +unurgent +unurgently +unurging +unurn +unurned +unusability +unusable +unusableness +unusably +unusage +unuse +unuseable +unuseableness +unuseably +unused +unusedness +unuseful +unusefully +unusefulness +unushered +unusual +unusuality +unusually +unusualness +unusurious +unusuriously +unusuriousness +unusurped +unusurping +unutilitarian +unutilizable +unutilized +unutterability +unutterable +unutterableness +unutterably +unuttered +unuxorial +unuxorious +unuxoriously +unuxoriousness +unvacant +unvacantly +unvacated +unvaccinated +unvacillating +unvacuous +unvacuously +unvacuousness +unvagrant +unvagrantly +unvagrantness +unvague +unvaguely +unvagueness +unvailable +unvain +unvainly +unvainness +unvaleted +unvaletudinary +unvaliant +unvaliantly +unvaliantness +unvalid +unvalidated +unvalidating +unvalidity +unvalidly +unvalidness +unvalorous +unvalorously +unvalorousness +unvaluable +unvaluableness +unvaluably +unvalue +unvalued +unvamped +unvanishing +unvanquishable +unvanquished +unvanquishing +unvantaged +unvaporized +unvaporosity +unvaporous +unvaporously +unvaporousness +unvariable +unvariableness +unvariably +unvariant +unvariation +unvaried +unvariedly +unvariegated +unvarying +unvaryingly +unvaryingness +unvarnished +unvarnishedly +unvarnishedness +unvascular +unvascularly +unvasculous +unvassal +unvatted +unvaulted +unvaulting +unvaunted +unvaunting +unvauntingly +unveering +unveeringly +unvehement +unvehemently +unveil +unveiled +unveiledly +unveiledness +unveiler +unveiling +unveilment +unveils +unveined +unvelvety +unvenal +unvendable +unvendableness +unvended +unvendible +unvendibleness +unveneered +unvenerability +unvenerable +unvenerableness +unvenerably +unvenerated +unvenerative +unvenereal +unvenged +unvengeful +unveniable +unvenial +unveniality +unvenially +unvenialness +unvenom +unvenomed +unvenomous +unvenomously +unvenomousness +unventable +unvented +unventilated +unventured +unventuresome +unventurous +unventurously +unventurousness +unvenued +unveracious +unveraciously +unveraciousness +unveracity +unverbal +unverbalized +unverbally +unverbose +unverbosely +unverboseness +unverdant +unverdantly +unverdured +unverdurness +unverdurous +unverdurousness +unveridic +unveridical +unveridically +unverifiability +unverifiable +unverifiableness +unverifiably +unverificative +unverified +unverifiedness +unveritable +unveritableness +unveritably +unverity +unvermiculated +unverminous +unverminously +unverminousness +unvernicular +unversatile +unversatilely +unversatileness +unversatility +unversed +unversedly +unversedness +unversified +unvertebrate +unvertical +unvertically +unvertiginous +unvertiginously +unvertiginousness +unvesiculated +unvessel +unvesseled +unvest +unvested +unvetoed +unvexatious +unvexatiously +unvexatiousness +unvexed +unvext +unviable +unvibrant +unvibrantly +unvibrated +unvibrating +unvibrational +unvicar +unvicarious +unvicariously +unvicariousness +unvicious +unviciously +unviciousness +unvictimized +unvictorious +unvictualed +unvictualled +unviewable +unviewed +unvigilant +unvigilantly +unvigorous +unvigorously +unvigorousness +unvying +unvilified +unvillaged +unvillainous +unvillainously +unvincible +unvindicable +unvindicated +unvindictive +unvindictively +unvindictiveness +unvinous +unvintaged +unviolable +unviolableness +unviolably +unviolate +unviolated +unviolative +unviolenced +unviolent +unviolently +unviolined +unvirgin +unvirginal +unvirginlike +unvirile +unvirility +unvirtue +unvirtuous +unvirtuously +unvirtuousness +unvirulent +unvirulently +unvisceral +unvisible +unvisibleness +unvisibly +unvision +unvisionary +unvisioned +unvisitable +unvisited +unvisiting +unvisor +unvisored +unvistaed +unvisual +unvisualised +unvisualized +unvisually +unvital +unvitalized +unvitalizing +unvitally +unvitalness +unvitiable +unvitiated +unvitiatedly +unvitiatedness +unvitiating +unvitreosity +unvitreous +unvitreously +unvitreousness +unvitrescent +unvitrescibility +unvitrescible +unvitrifiable +unvitrified +unvitriolized +unvituperated +unvituperative +unvituperatively +unvituperativeness +unvivacious +unvivaciously +unvivaciousness +unvivid +unvividly +unvividness +unvivified +unvizard +unvizarded +unvizored +unvocable +unvocal +unvocalised +unvocalized +unvociferous +unvociferously +unvociferousness +unvoyageable +unvoyaging +unvoice +unvoiced +unvoiceful +unvoices +unvoicing +unvoid +unvoidable +unvoided +unvoidness +unvolatile +unvolatilised +unvolatilize +unvolatilized +unvolcanic +unvolcanically +unvolitional +unvolitioned +unvolitive +unvoluble +unvolubleness +unvolubly +unvolumed +unvoluminous +unvoluminously +unvoluminousness +unvoluntary +unvoluntarily +unvoluntariness +unvolunteering +unvoluptuous +unvoluptuously +unvoluptuousness +unvomited +unvoracious +unvoraciously +unvoraciousness +unvote +unvoted +unvoting +unvouched +unvouchedly +unvouchedness +unvouchsafed +unvowed +unvoweled +unvowelled +unvulcanised +unvulcanized +unvulgar +unvulgarise +unvulgarised +unvulgarising +unvulgarize +unvulgarized +unvulgarizing +unvulgarly +unvulgarness +unvulnerable +unvulturine +unvulturous +unwadable +unwadded +unwaddling +unwadeable +unwaded +unwading +unwafted +unwaged +unwagered +unwaggable +unwaggably +unwagged +unwayed +unwailed +unwailing +unwainscoted +unwainscotted +unwaited +unwaiting +unwaivable +unwaived +unwayward +unwaked +unwakeful +unwakefully +unwakefulness +unwakened +unwakening +unwaking +unwalkable +unwalked +unwalking +unwall +unwalled +unwallet +unwallowed +unwan +unwandered +unwandering +unwanderingly +unwaned +unwaning +unwanted +unwanton +unwarbled +unwarded +unware +unwarely +unwareness +unwares +unwary +unwarier +unwariest +unwarily +unwariness +unwarlike +unwarlikeness +unwarm +unwarmable +unwarmed +unwarming +unwarn +unwarned +unwarnedly +unwarnedness +unwarning +unwarnished +unwarp +unwarpable +unwarped +unwarping +unwarrayed +unwarranness +unwarrant +unwarrantability +unwarrantable +unwarrantableness +unwarrantably +unwarrantabness +unwarranted +unwarrantedly +unwarrantedness +unwarred +unwarren +unwashable +unwashed +unwashedness +unwasheds +unwashen +unwassailing +unwastable +unwasted +unwasteful +unwastefully +unwastefulness +unwasting +unwastingly +unwatchable +unwatched +unwatchful +unwatchfully +unwatchfulness +unwatching +unwater +unwatered +unwatery +unwaterlike +unwatermarked +unwattled +unwaved +unwaverable +unwavered +unwavering +unwaveringly +unwaving +unwax +unwaxed +unweaken +unweakened +unweakening +unweal +unwealsomeness +unwealthy +unweaned +unweapon +unweaponed +unwearable +unwearably +unweary +unweariability +unweariable +unweariableness +unweariably +unwearied +unweariedly +unweariedness +unwearying +unwearyingly +unwearily +unweariness +unwearing +unwearisome +unwearisomeness +unweathered +unweatherly +unweatherwise +unweave +unweaves +unweaving +unweb +unwebbed +unwebbing +unwed +unwedded +unweddedly +unweddedness +unwedge +unwedgeable +unwedged +unwedging +unweeded +unweel +unweelness +unweened +unweeping +unweeting +unweetingly +unweft +unweighability +unweighable +unweighableness +unweighed +unweighing +unweight +unweighted +unweighty +unweighting +unweights +unwelcome +unwelcomed +unwelcomely +unwelcomeness +unwelcoming +unweld +unweldable +unwelde +unwelded +unwell +unwellness +unwelted +unwelth +unwemmed +unwept +unwestern +unwesternized +unwet +unwettable +unwetted +unwheedled +unwheel +unwheeled +unwhelmed +unwhelped +unwhetted +unwhig +unwhiglike +unwhimpering +unwhimperingly +unwhimsical +unwhimsically +unwhimsicalness +unwhining +unwhiningly +unwhip +unwhipped +unwhipt +unwhirled +unwhisked +unwhiskered +unwhisperable +unwhispered +unwhispering +unwhistled +unwhite +unwhited +unwhitened +unwhitewashed +unwhole +unwholesome +unwholesomely +unwholesomeness +unwicked +unwickedly +unwickedness +unwidened +unwidowed +unwield +unwieldable +unwieldy +unwieldier +unwieldiest +unwieldily +unwieldiness +unwieldly +unwieldsome +unwifed +unwifely +unwifelike +unwig +unwigged +unwigging +unwild +unwildly +unwildness +unwilful +unwilfully +unwilfulness +unwily +unwilier +unwilily +unwiliness +unwill +unwillable +unwille +unwilled +unwilledness +unwillful +unwillfully +unwillfulness +unwilling +unwillingly +unwillingness +unwilted +unwilting +unwimple +unwincing +unwincingly +unwind +unwindable +unwinded +unwinder +unwinders +unwindy +unwinding +unwindingly +unwindowed +unwinds +unwingable +unwinged +unwink +unwinking +unwinkingly +unwinly +unwinnable +unwinning +unwinnowed +unwinsome +unwinter +unwintry +unwiped +unwirable +unwire +unwired +unwisdom +unwisdoms +unwise +unwisely +unwiseness +unwiser +unwisest +unwish +unwished +unwishes +unwishful +unwishfully +unwishfulness +unwishing +unwist +unwistful +unwistfully +unwistfulness +unwit +unwitch +unwitched +unwithdrawable +unwithdrawing +unwithdrawn +unwitherable +unwithered +unwithering +unwithheld +unwithholden +unwithholding +unwithstanding +unwithstood +unwitless +unwitnessed +unwits +unwitted +unwitty +unwittily +unwitting +unwittingly +unwittingness +unwive +unwived +unwoeful +unwoefully +unwoefulness +unwoful +unwoman +unwomanish +unwomanize +unwomanized +unwomanly +unwomanlike +unwomanliness +unwomb +unwon +unwonder +unwonderful +unwonderfully +unwondering +unwont +unwonted +unwontedly +unwontedness +unwooded +unwooed +unwoof +unwooly +unwordable +unwordably +unworded +unwordy +unwordily +unwork +unworkability +unworkable +unworkableness +unworkably +unworked +unworkedness +unworker +unworking +unworkmanly +unworkmanlike +unworld +unworldly +unworldliness +unwormed +unwormy +unworminess +unworn +unworried +unworriedly +unworriedness +unworship +unworshiped +unworshipful +unworshiping +unworshipped +unworshipping +unworth +unworthy +unworthier +unworthies +unworthiest +unworthily +unworthiness +unwotting +unwound +unwoundable +unwoundableness +unwounded +unwove +unwoven +unwrangling +unwrap +unwrapped +unwrapper +unwrappered +unwrapping +unwraps +unwrathful +unwrathfully +unwrathfulness +unwreaked +unwreaken +unwreathe +unwreathed +unwreathing +unwrecked +unwrench +unwrenched +unwrest +unwrested +unwrestedly +unwresting +unwrestled +unwretched +unwry +unwriggled +unwrinkle +unwrinkleable +unwrinkled +unwrinkles +unwrinkling +unwrit +unwritable +unwrite +unwriteable +unwriting +unwritten +unwroken +unwronged +unwrongful +unwrongfully +unwrongfulness +unwrote +unwrought +unwrung +unwwove +unwwoven +unze +unzealous +unzealously +unzealousness +unzen +unzephyrlike +unzip +unzipped +unzipping +unzips +unzone +unzoned +unzoning +up +upaya +upaisle +upaithric +upalley +upalong +upanaya +upanayana +upanishad +upanishadic +upapurana +uparch +uparching +uparise +uparm +uparna +upas +upases +upattic +upavenue +upbay +upband +upbank +upbar +upbbore +upbborne +upbear +upbearer +upbearers +upbearing +upbears +upbeat +upbeats +upbelch +upbelt +upbend +upby +upbid +upbye +upbind +upbinding +upbinds +upblacken +upblast +upblaze +upblow +upboil +upboiled +upboiling +upboils +upbolster +upbolt +upboost +upbore +upborne +upbotch +upboulevard +upbound +upbrace +upbray +upbraid +upbraided +upbraider +upbraiders +upbraiding +upbraidingly +upbraids +upbrast +upbreak +upbreathe +upbred +upbreed +upbreeze +upbrighten +upbrim +upbring +upbringing +upbristle +upbroken +upbrook +upbrought +upbrow +upbubble +upbuy +upbuild +upbuilder +upbuilding +upbuilds +upbuilt +upbulging +upbuoy +upbuoyance +upbuoying +upburn +upburst +upcall +upcanal +upcanyon +upcard +upcarry +upcast +upcasted +upcasting +upcasts +upcatch +upcaught +upchamber +upchannel +upchariot +upchaunce +upcheer +upchimney +upchoke +upchuck +upchucked +upchucking +upchucks +upcity +upclimb +upclimbed +upclimber +upclimbing +upclimbs +upclose +upcloser +upcoast +upcock +upcoil +upcoiled +upcoiling +upcoils +upcolumn +upcome +upcoming +upconjure +upcountry +upcourse +upcover +upcrane +upcrawl +upcreek +upcreep +upcry +upcrop +upcropping +upcrowd +upcurl +upcurled +upcurling +upcurls +upcurrent +upcurve +upcurved +upcurves +upcurving +upcushion +upcut +upcutting +updart +updarted +updarting +updarts +updatable +update +updated +updater +updaters +updates +updating +updeck +updelve +updive +updived +updives +updiving +updo +updome +updos +updove +updraft +updrafts +updrag +updraught +updraw +updress +updry +updried +updries +updrying +updrink +upeat +upeygan +upend +upended +upending +upends +uperize +upfeed +upfield +upfill +upfingered +upflame +upflare +upflash +upflee +upfly +upflicker +upfling +upflinging +upflings +upfloat +upflood +upflow +upflowed +upflower +upflowing +upflows +upflung +upfold +upfolded +upfolding +upfolds +upfollow +upframe +upfurl +upgale +upgang +upgape +upgather +upgathered +upgathering +upgathers +upgaze +upgazed +upgazes +upgazing +upget +upgird +upgirded +upgirding +upgirds +upgirt +upgive +upglean +upglide +upgo +upgoing +upgorge +upgrade +upgraded +upgrader +upgrades +upgrading +upgrave +upgrew +upgrow +upgrowing +upgrown +upgrows +upgrowth +upgrowths +upgully +upgush +uphale +uphand +uphang +upharbor +upharrow +upharsin +uphasp +upheal +upheap +upheaped +upheaping +upheaps +uphearted +upheaval +upheavalist +upheavals +upheave +upheaved +upheaven +upheaver +upheavers +upheaves +upheaving +upheld +uphelya +uphelm +upher +uphhove +uphill +uphills +uphillward +uphoard +uphoarded +uphoarding +uphoards +uphoist +uphold +upholden +upholder +upholders +upholding +upholds +upholster +upholstered +upholsterer +upholsterers +upholsteress +upholstery +upholsterydom +upholsteries +upholstering +upholsterous +upholsters +upholstress +uphove +uphroe +uphroes +uphung +uphurl +upyard +upyoke +upisland +upjerk +upjet +upkeep +upkeeps +upkindle +upknell +upknit +upla +upladder +uplay +uplaid +uplake +upland +uplander +uplanders +uplandish +uplands +uplane +uplead +uplean +upleap +upleaped +upleaping +upleaps +upleapt +upleg +uplick +uplift +upliftable +uplifted +upliftedly +upliftedness +uplifter +uplifters +uplifting +upliftingly +upliftingness +upliftitis +upliftment +uplifts +uplight +uplighted +uplighting +uplights +uplying +uplimb +uplimber +upline +uplink +uplinked +uplinking +uplinks +uplit +upload +uploadable +uploaded +uploading +uploads +uplock +uplong +uplook +uplooker +uploom +uploop +upmaking +upmanship +upmast +upmix +upmost +upmount +upmountain +upmove +upness +upo +upon +uppard +uppbad +upped +uppent +upper +uppercase +upperch +upperclassman +upperclassmen +uppercut +uppercuts +uppercutted +uppercutting +upperer +upperest +upperhandism +uppermore +uppermost +upperpart +uppers +upperstocks +uppertendom +upperworks +uppile +uppiled +uppiles +uppiling +upping +uppings +uppish +uppishly +uppishness +uppity +uppityness +upplough +upplow +uppluck +uppoint +uppoise +uppop +uppour +uppowoc +upprick +upprop +uppropped +uppropping +upprops +uppuff +uppull +uppush +upquiver +upraisal +upraise +upraised +upraiser +upraisers +upraises +upraising +upraught +upreach +upreached +upreaches +upreaching +uprear +upreared +uprearing +uprears +uprein +uprend +uprender +uprest +uprestore +uprid +upridge +upright +uprighted +uprighteous +uprighteously +uprighteousness +uprighting +uprightish +uprightly +uprightman +uprightness +uprights +uprip +uprisal +uprise +uprisement +uprisen +upriser +uprisers +uprises +uprising +uprisings +uprist +uprive +upriver +uprivers +uproad +uproar +uproarer +uproariness +uproarious +uproariously +uproariousness +uproars +uproom +uproot +uprootal +uprootals +uprooted +uprootedness +uprooter +uprooters +uprooting +uproots +uprose +uprouse +uproused +uprouses +uprousing +uproute +uprun +uprush +uprushed +uprushes +uprushing +ups +upsadaisy +upsaddle +upscale +upscrew +upscuddle +upseal +upsedoun +upseek +upsey +upseize +upsend +upsending +upsends +upsent +upset +upsetment +upsets +upsettable +upsettal +upsetted +upsetter +upsetters +upsetting +upsettingly +upshaft +upshear +upsheath +upshift +upshifted +upshifting +upshifts +upshoot +upshooting +upshoots +upshore +upshot +upshots +upshoulder +upshove +upshut +upsy +upsidaisy +upside +upsides +upsighted +upsiloid +upsilon +upsilonism +upsilons +upsit +upsitten +upsitting +upskip +upslant +upslip +upslope +upsloping +upsmite +upsnatch +upsoak +upsoar +upsoared +upsoaring +upsoars +upsolve +upspeak +upspear +upspeed +upspew +upspin +upspire +upsplash +upspout +upsprang +upspread +upspring +upspringing +upsprings +upsprinkle +upsprout +upsprung +upspurt +upsring +upstaff +upstage +upstaged +upstages +upstaging +upstay +upstair +upstairs +upstamp +upstand +upstander +upstanding +upstandingly +upstandingness +upstands +upstare +upstared +upstares +upstaring +upstart +upstarted +upstarting +upstartism +upstartle +upstartness +upstarts +upstate +upstater +upstaters +upstates +upstaunch +upsteal +upsteam +upstem +upstep +upstepped +upstepping +upsteps +upstick +upstir +upstirred +upstirring +upstirs +upstood +upstraight +upstream +upstreamward +upstreet +upstretch +upstretched +upstrike +upstrive +upstroke +upstrokes +upstruggle +upsuck +upsun +upsup +upsurge +upsurged +upsurgence +upsurges +upsurging +upsway +upswallow +upswarm +upsweep +upsweeping +upsweeps +upswell +upswelled +upswelling +upswells +upswept +upswing +upswinging +upswings +upswollen +upswung +uptable +uptake +uptaker +uptakes +uptear +uptearing +uptears +uptemper +uptend +upthrew +upthrow +upthrowing +upthrown +upthrows +upthrust +upthrusted +upthrusting +upthrusts +upthunder +uptide +uptie +uptight +uptightness +uptill +uptilt +uptilted +uptilting +uptilts +uptime +uptimes +uptore +uptorn +uptoss +uptossed +uptosses +uptossing +uptower +uptown +uptowner +uptowners +uptowns +uptrace +uptrack +uptrail +uptrain +uptree +uptrend +uptrends +uptrill +uptrunk +uptruss +upttore +upttorn +uptube +uptuck +upturn +upturned +upturning +upturns +uptwined +uptwist +upupa +upupidae +upupoid +upvalley +upvomit +upwaft +upwafted +upwafting +upwafts +upway +upways +upwall +upward +upwardly +upwardness +upwards +upwarp +upwax +upwell +upwelled +upwelling +upwells +upwent +upwheel +upwhelm +upwhir +upwhirl +upwind +upwinds +upwith +upwork +upwound +upwrap +upwreathe +upwrench +upwring +upwrought +ur +ura +urachal +urachovesical +urachus +uracil +uracils +uraei +uraemia +uraemias +uraemic +uraeus +uraeuses +uragoga +ural +urali +uralian +uralic +uraline +uralite +uralites +uralitic +uralitization +uralitize +uralitized +uralitizing +uralium +uramido +uramil +uramilic +uramino +uran +uranalyses +uranalysis +uranate +urania +uranian +uranic +uranicentric +uranide +uranides +uranidin +uranidine +uraniferous +uraniid +uraniidae +uranyl +uranylic +uranyls +uranin +uranine +uraninite +uranion +uraniscochasma +uraniscoplasty +uraniscoraphy +uraniscorrhaphy +uraniscus +uranism +uranisms +uranist +uranite +uranites +uranitic +uranium +uraniums +uranocircite +uranographer +uranography +uranographic +uranographical +uranographist +uranolatry +uranolite +uranology +uranological +uranologies +uranologist +uranometry +uranometria +uranometrical +uranometrist +uranophane +uranophobia +uranophotography +uranoplasty +uranoplastic +uranoplegia +uranorrhaphy +uranorrhaphia +uranoschisis +uranoschism +uranoscope +uranoscopy +uranoscopia +uranoscopic +uranoscopidae +uranoscopus +uranospathite +uranosphaerite +uranospinite +uranostaphyloplasty +uranostaphylorrhaphy +uranotantalite +uranothallite +uranothorite +uranotil +uranous +uranus +urao +urare +urares +urari +uraris +urartaean +urartic +urase +urases +urataemia +urate +uratemia +urates +uratic +uratoma +uratosis +uraturia +urazin +urazine +urazole +urb +urbacity +urbainite +urban +urbana +urbane +urbanely +urbaneness +urbaner +urbanest +urbanisation +urbanise +urbanised +urbanises +urbanising +urbanism +urbanisms +urbanist +urbanistic +urbanistically +urbanists +urbanite +urbanites +urbanity +urbanities +urbanization +urbanize +urbanized +urbanizes +urbanizing +urbanolatry +urbanology +urbanologist +urbanologists +urbarial +urbian +urbic +urbicolae +urbicolous +urbiculture +urbify +urbification +urbinate +urbs +urceiform +urceolar +urceolate +urceole +urceoli +urceolina +urceolus +urceus +urchin +urchiness +urchinly +urchinlike +urchins +urd +urde +urdee +urdy +urds +urdu +ure +urea +ureal +ureameter +ureametry +ureas +urease +ureases +urechitin +urechitoxin +uredema +uredia +uredial +uredidia +uredidinia +uredinales +uredine +uredineae +uredineal +uredineous +uredines +uredinia +uredinial +urediniopsis +urediniospore +urediniosporic +uredinium +uredinoid +uredinology +uredinologist +uredinous +urediospore +uredium +uredo +uredos +uredosorus +uredospore +uredosporic +uredosporiferous +uredosporous +uredostage +ureic +ureid +ureide +ureides +ureido +ureylene +uremia +uremias +uremic +urena +urent +ureometer +ureometry +ureosecretory +ureotelic +ureotelism +uresis +uretal +ureter +ureteral +ureteralgia +uretercystoscope +ureterectasia +ureterectasis +ureterectomy +ureterectomies +ureteric +ureteritis +ureterocele +ureterocervical +ureterocystanastomosis +ureterocystoscope +ureterocystostomy +ureterocolostomy +ureterodialysis +ureteroenteric +ureteroenterostomy +ureterogenital +ureterogram +ureterograph +ureterography +ureterointestinal +ureterolysis +ureterolith +ureterolithiasis +ureterolithic +ureterolithotomy +ureterolithotomies +ureteronephrectomy +ureterophlegma +ureteropyelitis +ureteropyelogram +ureteropyelography +ureteropyelonephritis +ureteropyelostomy +ureteropyosis +ureteroplasty +ureteroproctostomy +ureteroradiography +ureterorectostomy +ureterorrhagia +ureterorrhaphy +ureterosalpingostomy +ureterosigmoidostomy +ureterostegnosis +ureterostenoma +ureterostenosis +ureterostoma +ureterostomy +ureterostomies +ureterotomy +ureterouteral +ureterovaginal +ureterovesical +ureters +urethan +urethane +urethanes +urethans +urethylan +urethylane +urethra +urethrae +urethragraph +urethral +urethralgia +urethrameter +urethras +urethrascope +urethratome +urethratresia +urethrectomy +urethrectomies +urethremphraxis +urethreurynter +urethrism +urethritic +urethritis +urethroblennorrhea +urethrobulbar +urethrocele +urethrocystitis +urethrogenital +urethrogram +urethrograph +urethrometer +urethropenile +urethroperineal +urethrophyma +urethroplasty +urethroplastic +urethroprostatic +urethrorectal +urethrorrhagia +urethrorrhaphy +urethrorrhea +urethrorrhoea +urethroscope +urethroscopy +urethroscopic +urethroscopical +urethrosexual +urethrospasm +urethrostaxis +urethrostenosis +urethrostomy +urethrotome +urethrotomy +urethrotomic +urethrovaginal +urethrovesical +uretic +urf +urfirnis +urge +urged +urgeful +urgence +urgency +urgencies +urgent +urgently +urgentness +urger +urgers +urges +urginea +urging +urgingly +urgings +urgonian +urheen +uri +uria +uriah +urial +urian +uric +uricacidemia +uricaciduria +uricaemia +uricaemic +uricemia +uricemic +uricolysis +uricolytic +uriconian +uricosuric +uricotelic +uricotelism +uridine +uridines +uridrosis +uriel +urim +urinaemia +urinaemic +urinal +urinalyses +urinalysis +urinalist +urinals +urinant +urinary +urinaries +urinarium +urinate +urinated +urinates +urinating +urination +urinative +urinator +urine +urinemia +urinemias +urinemic +urines +uriniferous +uriniparous +urinocryoscopy +urinogenital +urinogenitary +urinogenous +urinology +urinologist +urinomancy +urinometer +urinometry +urinometric +urinoscopy +urinoscopic +urinoscopies +urinoscopist +urinose +urinosexual +urinous +urinousness +urite +urlar +urled +urling +urluch +urman +urn +urna +urnae +urnal +urnfield +urnflower +urnful +urnfuls +urning +urningism +urnism +urnlike +urnmaker +urns +uro +uroacidimeter +uroazotometer +urobenzoic +urobilin +urobilinemia +urobilinogen +urobilinogenuria +urobilinuria +urocanic +urocele +urocerata +urocerid +uroceridae +urochloralic +urochord +urochorda +urochordal +urochordate +urochords +urochrome +urochromogen +urochs +urocyanogen +urocyon +urocyst +urocystic +urocystis +urocystitis +urocoptidae +urocoptis +urodaeum +urodela +urodelan +urodele +urodeles +urodelous +urodialysis +urodynia +uroedema +uroerythrin +urofuscohematin +urogaster +urogastric +urogenic +urogenital +urogenitary +urogenous +uroglaucin +uroglena +urogomphi +urogomphus +urogram +urography +urogravimeter +urohaematin +urohematin +urohyal +urokinase +urol +urolagnia +uroleucic +uroleucinic +urolith +urolithiasis +urolithic +urolithology +uroliths +urolytic +urology +urologic +urological +urologies +urologist +urologists +urolutein +uromancy +uromantia +uromantist +uromastix +uromelanin +uromelus +uromere +uromeric +urometer +uromyces +uromycladium +uronephrosis +uronic +uronology +uroo +uroodal +uropatagium +uropeltidae +urophaein +urophanic +urophanous +urophein +urophi +urophlyctis +urophobia +urophthisis +uropygi +uropygial +uropygium +uropyloric +uroplania +uropod +uropodal +uropodous +uropods +uropoetic +uropoiesis +uropoietic +uroporphyrin +uropsile +uropsilus +uroptysis +urorosein +urorrhagia +urorrhea +urorubin +urosaccharometry +urosacral +uroschesis +uroscopy +uroscopic +uroscopies +uroscopist +urosepsis +uroseptic +urosis +urosomatic +urosome +urosomite +urosomitic +urostea +urostealith +urostegal +urostege +urostegite +urosteon +urosternite +urosthene +urosthenic +urostylar +urostyle +urostyles +urotoxy +urotoxia +urotoxic +urotoxicity +urotoxies +urotoxin +uroxanate +uroxanic +uroxanthin +uroxin +urpriser +urradhus +urrhodin +urrhodinic +urs +ursa +ursae +ursal +ursicidal +ursicide +ursid +ursidae +ursiform +ursigram +ursine +ursoid +ursolic +urson +ursone +ursprache +ursuk +ursula +ursuline +ursus +urtext +urtica +urticaceae +urticaceous +urtical +urticales +urticant +urticants +urticaria +urticarial +urticarious +urticastrum +urticate +urticated +urticates +urticating +urtication +urticose +urtite +uru +urubu +urucu +urucum +urucuri +urucury +uruguay +uruguayan +uruguayans +uruisg +urukuena +urunday +urus +uruses +urushi +urushic +urushiye +urushinic +urushiol +urushiols +urutu +urva +us +usa +usability +usable +usableness +usably +usage +usager +usages +usance +usances +usant +usar +usara +usaron +usation +usaunce +usaunces +use +useability +useable +useably +used +usedly +usedness +usednt +usee +useful +usefully +usefullish +usefulness +usehold +useless +uselessly +uselessness +usenet +usent +user +users +uses +ush +ushabti +ushabtis +ushabtiu +ushak +ushas +usheen +usher +usherance +usherdom +ushered +usherer +usheress +usherette +usherettes +usherian +ushering +usherism +usherless +ushers +ushership +usine +using +usings +usipetes +usitate +usitative +uskara +uskok +usnea +usneaceae +usneaceous +usneas +usneoid +usnic +usnin +usninic +uspanteca +uspeaking +uspoke +uspoken +usquabae +usquabaes +usque +usquebae +usquebaes +usquebaugh +usques +usself +ussels +usselven +ussingite +ussr +ust +ustarana +uster +ustilaginaceae +ustilaginaceous +ustilaginales +ustilagineous +ustilaginoidea +ustilago +ustion +ustorious +ustulate +ustulation +ustulina +usu +usual +usualism +usually +usualness +usuals +usuary +usucapient +usucapion +usucapionary +usucapt +usucaptable +usucaptible +usucaption +usucaptor +usufruct +usufructs +usufructuary +usufructuaries +usufruit +usun +usure +usurer +usurerlike +usurers +usuress +usury +usuries +usurious +usuriously +usuriousness +usurp +usurpation +usurpations +usurpative +usurpatively +usurpatory +usurpature +usurped +usurpedly +usurper +usurpers +usurpership +usurping +usurpingly +usurpment +usurpor +usurpress +usurps +usurption +usw +usward +uswards +ut +uta +utah +utahan +utahans +utahite +utai +utas +utch +utchy +ute +utees +utend +utensil +utensile +utensils +uteralgia +uterectomy +uteri +uterine +uteritis +utero +uteroabdominal +uterocele +uterocervical +uterocystotomy +uterofixation +uterogestation +uterogram +uterography +uterointestinal +uterolith +uterology +uteromania +uteromaniac +uteromaniacal +uterometer +uteroovarian +uteroparietal +uteropelvic +uteroperitoneal +uteropexy +uteropexia +uteroplacental +uteroplasty +uterosacral +uterosclerosis +uteroscope +uterotomy +uterotonic +uterotubal +uterovaginal +uteroventral +uterovesical +uterus +uteruses +utfangenethef +utfangethef +utfangthef +utfangthief +uther +uti +utible +utick +util +utile +utilidor +utilidors +utilise +utilised +utiliser +utilisers +utilises +utilising +utilitarian +utilitarianism +utilitarianist +utilitarianize +utilitarianly +utilitarians +utility +utilities +utilizability +utilizable +utilization +utilizations +utilize +utilized +utilizer +utilizers +utilizes +utilizing +utinam +utlagary +utlilized +utmost +utmostness +utmosts +utopia +utopian +utopianism +utopianist +utopianize +utopianizer +utopians +utopias +utopiast +utopism +utopisms +utopist +utopistic +utopists +utopographer +utraquism +utraquist +utraquistic +utrecht +utricle +utricles +utricul +utricular +utricularia +utriculariaceae +utriculate +utriculi +utriculiferous +utriculiform +utriculitis +utriculoid +utriculoplasty +utriculoplastic +utriculosaccular +utriculose +utriculus +utriform +utrubi +utrum +uts +utsuk +utter +utterability +utterable +utterableness +utterance +utterances +utterancy +uttered +utterer +utterers +utterest +uttering +utterless +utterly +uttermost +utterness +utters +utu +utum +uturuncu +uucpnet +uva +uval +uvala +uvalha +uvanite +uvarovite +uvate +uvea +uveal +uveas +uveitic +uveitis +uveitises +uvella +uveous +uvic +uvid +uviol +uvitic +uvitinic +uvito +uvitonic +uvre +uvres +uvrou +uvula +uvulae +uvular +uvularia +uvularly +uvulars +uvulas +uvulatomy +uvulatomies +uvulectomy +uvulectomies +uvulitis +uvulitises +uvuloptosis +uvulotome +uvulotomy +uvulotomies +uvver +ux +uxorial +uxoriality +uxorially +uxoricidal +uxoricide +uxorilocal +uxorious +uxoriously +uxoriousness +uxoris +uzan +uzara +uzarin +uzaron +uzbak +uzbeg +uzbek +v +va +vaad +vaadim +vaagmaer +vaagmar +vaagmer +vaalite +vaalpens +vac +vacabond +vacance +vacancy +vacancies +vacandi +vacant +vacante +vacanthearted +vacantheartedness +vacantia +vacantly +vacantness +vacantry +vacatable +vacate +vacated +vacates +vacating +vacation +vacational +vacationed +vacationer +vacationers +vacationing +vacationist +vacationists +vacationland +vacationless +vacations +vacatur +vaccary +vaccaria +vaccenic +vaccicide +vaccigenous +vaccina +vaccinable +vaccinal +vaccinas +vaccinate +vaccinated +vaccinates +vaccinating +vaccination +vaccinationist +vaccinations +vaccinator +vaccinatory +vaccinators +vaccine +vaccinee +vaccinella +vaccines +vaccinia +vacciniaceae +vacciniaceous +vaccinial +vaccinias +vaccinifer +vacciniform +vacciniola +vaccinist +vaccinium +vaccinization +vaccinogenic +vaccinogenous +vaccinoid +vaccinophobia +vaccinotherapy +vache +vachellia +vacherin +vachette +vacillancy +vacillant +vacillate +vacillated +vacillates +vacillating +vacillatingly +vacillation +vacillations +vacillator +vacillatory +vacillators +vacoa +vacona +vacoua +vacouf +vacua +vacual +vacuate +vacuation +vacuefy +vacuist +vacuit +vacuity +vacuities +vacuo +vacuolar +vacuolary +vacuolate +vacuolated +vacuolation +vacuole +vacuoles +vacuolization +vacuome +vacuometer +vacuous +vacuously +vacuousness +vacuua +vacuum +vacuuma +vacuumed +vacuuming +vacuumize +vacuums +vade +vadelect +vady +vadim +vadimony +vadimonium +vadis +vadium +vadose +vafrous +vag +vagabond +vagabondage +vagabondager +vagabonded +vagabondia +vagabonding +vagabondish +vagabondism +vagabondismus +vagabondize +vagabondized +vagabondizer +vagabondizing +vagabondry +vagabonds +vagal +vagally +vagancy +vagant +vaganti +vagary +vagarian +vagaries +vagarious +vagariously +vagarish +vagarisome +vagarist +vagaristic +vagarity +vagas +vagation +vagbondia +vage +vagi +vagient +vagiform +vagile +vagility +vagilities +vagina +vaginae +vaginal +vaginalectomy +vaginalectomies +vaginaless +vaginalitis +vaginally +vaginant +vaginas +vaginate +vaginated +vaginectomy +vaginectomies +vaginervose +vaginicola +vaginicoline +vaginicolous +vaginiferous +vaginipennate +vaginismus +vaginitis +vaginoabdominal +vaginocele +vaginodynia +vaginofixation +vaginolabial +vaginometer +vaginomycosis +vaginoperineal +vaginoperitoneal +vaginopexy +vaginoplasty +vaginoscope +vaginoscopy +vaginotome +vaginotomy +vaginotomies +vaginovesical +vaginovulvar +vaginula +vaginulate +vaginule +vagitus +vagnera +vagoaccessorius +vagodepressor +vagoglossopharyngeal +vagogram +vagolysis +vagosympathetic +vagotomy +vagotomies +vagotomize +vagotony +vagotonia +vagotonic +vagotropic +vagotropism +vagous +vagrance +vagrancy +vagrancies +vagrant +vagrantism +vagrantize +vagrantly +vagrantlike +vagrantness +vagrants +vagrate +vagrom +vague +vaguely +vagueness +vaguer +vaguest +vaguio +vaguios +vaguish +vaguity +vagulous +vagus +vahana +vahine +vahines +vahini +vai +vaidic +vail +vailable +vailed +vailing +vails +vain +vainer +vainest +vainful +vainglory +vainglorious +vaingloriously +vaingloriousness +vainly +vainness +vainnesses +vair +vairagi +vaire +vairee +vairy +vairs +vaishnava +vaishnavism +vaisya +vayu +vaivode +vajra +vajrasana +vakass +vakeel +vakeels +vakia +vakil +vakils +vakkaliga +val +valance +valanced +valances +valanche +valancing +valbellite +vale +valebant +valediction +valedictions +valedictory +valedictorian +valedictorians +valedictories +valedictorily +valence +valences +valency +valencia +valencian +valencianite +valencias +valenciennes +valencies +valens +valent +valentiam +valentide +valentin +valentine +valentines +valentinian +valentinianism +valentinite +valeral +valeraldehyde +valeramid +valeramide +valerate +valerates +valeria +valerian +valeriana +valerianaceae +valerianaceous +valerianales +valerianate +valerianella +valerianic +valerianoides +valerians +valeric +valerie +valeryl +valerylene +valerin +valerolactone +valerone +vales +valet +valeta +valetage +valetaille +valetdom +valeted +valethood +valeting +valetism +valetry +valets +valetude +valetudinaire +valetudinary +valetudinarian +valetudinarianism +valetudinarians +valetudinaries +valetudinariness +valetudinarist +valetudinarium +valeur +valew +valeward +valewe +valgoid +valgus +valguses +valhall +valhalla +vali +valiance +valiances +valiancy +valiancies +valiant +valiantly +valiantness +valiants +valid +validatable +validate +validated +validates +validating +validation +validations +validatory +validification +validity +validities +validly +validness +validous +valyl +valylene +valinch +valine +valines +valise +valiseful +valises +valiship +valium +valkyr +valkyria +valkyrian +valkyrie +valkyries +valkyrs +vall +vallancy +vallar +vallary +vallate +vallated +vallation +vallecula +valleculae +vallecular +valleculate +valley +valleyful +valleyite +valleylet +valleylike +valleys +valleyward +valleywise +vallevarite +vallicula +valliculae +vallicular +vallidom +vallies +vallis +valliscaulian +vallisneria +vallisneriaceae +vallisneriaceous +vallombrosan +vallota +vallum +vallums +valmy +valois +valonia +valoniaceae +valoniaceous +valonias +valor +valorem +valorisation +valorise +valorised +valorises +valorising +valorization +valorizations +valorize +valorized +valorizes +valorizing +valorous +valorously +valorousness +valors +valour +valours +valouwe +valsa +valsaceae +valsalvan +valse +valses +valsoid +valuable +valuableness +valuables +valuably +valuate +valuated +valuates +valuating +valuation +valuational +valuationally +valuations +valuative +valuator +valuators +value +valued +valueless +valuelessness +valuer +valuers +values +valuing +valure +valuta +valutas +valva +valvae +valval +valvar +valvata +valvate +valvatidae +valve +valved +valveless +valvelet +valvelets +valvelike +valveman +valvemen +valves +valviferous +valviform +valving +valvotomy +valvula +valvulae +valvular +valvulate +valvule +valvules +valvulitis +valvulotome +valvulotomy +vambrace +vambraced +vambraces +vambrash +vamfont +vammazsa +vamoose +vamoosed +vamooses +vamoosing +vamos +vamose +vamosed +vamoses +vamosing +vamp +vamped +vampey +vamper +vampers +vamphorn +vamping +vampire +vampyre +vampyrella +vampyrellidae +vampireproof +vampires +vampiric +vampirish +vampirism +vampirize +vampyrum +vampish +vamplate +vampproof +vamps +vamure +van +vanadate +vanadates +vanadiate +vanadic +vanadiferous +vanadyl +vanadinite +vanadious +vanadium +vanadiums +vanadosilicate +vanadous +vanaheim +vanaprastha +vanaspati +vanbrace +vance +vancomycin +vancourier +vancouver +vancouveria +vanda +vandal +vandalic +vandalish +vandalism +vandalistic +vandalization +vandalize +vandalized +vandalizes +vandalizing +vandalroot +vandals +vandas +vandelas +vandemonian +vandemonianism +vandiemenian +vandyke +vandyked +vandykes +vane +vaned +vaneless +vanelike +vanellus +vanes +vanessa +vanessian +vanfoss +vang +vangee +vangeli +vanglo +vangloe +vangs +vanguard +vanguardist +vanguards +vangueria +vanilla +vanillal +vanillaldehyde +vanillas +vanillate +vanille +vanillery +vanillic +vanillyl +vanillin +vanilline +vanillinic +vanillins +vanillism +vanilloes +vanilloyl +vanillon +vanir +vanish +vanished +vanisher +vanishers +vanishes +vanishing +vanishingly +vanishment +vanist +vanitarianism +vanity +vanitied +vanities +vanitory +vanitous +vanjarrah +vanlay +vanload +vanman +vanmen +vanmost +vannai +vanned +vanner +vannerman +vannermen +vannet +vannic +vanning +vannus +vanquish +vanquishable +vanquished +vanquisher +vanquishers +vanquishes +vanquishing +vanquishment +vans +vansire +vantage +vantageless +vantages +vantbrace +vantbrass +vanterie +vantguard +vanward +vapid +vapidism +vapidity +vapidities +vapidly +vapidness +vapocauterization +vapography +vapographic +vapor +vaporability +vaporable +vaporary +vaporarium +vaporate +vapored +vaporer +vaporers +vaporescence +vaporescent +vaporetti +vaporetto +vaporettos +vapory +vaporiferous +vaporiferousness +vaporific +vaporiform +vaporimeter +vaporiness +vaporing +vaporingly +vaporings +vaporise +vaporised +vaporises +vaporish +vaporishness +vaporising +vaporium +vaporizability +vaporizable +vaporization +vaporize +vaporized +vaporizer +vaporizers +vaporizes +vaporizing +vaporless +vaporlike +vaporograph +vaporographic +vaporose +vaporoseness +vaporosity +vaporous +vaporously +vaporousness +vapors +vaportight +vaporware +vapotherapy +vapour +vapourable +vapoured +vapourer +vapourers +vapourescent +vapoury +vapourific +vapourimeter +vapouring +vapouringly +vapourisable +vapourise +vapourised +vapouriser +vapourish +vapourishness +vapourising +vapourizable +vapourization +vapourize +vapourized +vapourizer +vapourizing +vapourose +vapourous +vapourously +vapours +vappa +vapulary +vapulate +vapulation +vapulatory +vaquero +vaqueros +var +vara +varactor +varahan +varan +varanger +varangi +varangian +varanian +varanid +varanidae +varanoid +varanus +varas +varda +vardapet +vardy +vardingale +vare +varec +varech +vareheaded +varella +vareuse +vargueno +vari +vary +varia +variability +variabilities +variable +variableness +variables +variably +variac +variadic +variag +variagles +variance +variances +variancy +variant +variantly +variants +variate +variated +variates +variating +variation +variational +variationally +variationist +variations +variatious +variative +variatively +variator +varical +varicated +varication +varicella +varicellar +varicellate +varicellation +varicelliform +varicelloid +varicellous +varices +variciform +varicoblepharon +varicocele +varicoid +varicolored +varicolorous +varicoloured +varicose +varicosed +varicoseness +varicosis +varicosity +varicosities +varicotomy +varicotomies +varicula +varidical +varied +variedly +variedness +variegate +variegated +variegates +variegating +variegation +variegations +variegator +varier +variers +varies +varietal +varietally +varietals +varietas +variety +varieties +varietism +varietist +varietur +varify +varificatory +variform +variformed +variformity +variformly +varigradation +varying +varyingly +varyings +varindor +varing +vario +variocoupler +variocuopler +variola +variolar +variolaria +variolas +variolate +variolated +variolating +variolation +variole +varioles +variolic +varioliform +variolite +variolitic +variolitization +variolization +varioloid +variolosser +variolous +variolovaccine +variolovaccinia +variometer +variorum +variorums +varios +variotinted +various +variously +variousness +variscite +varisized +varisse +varistor +varistors +varitype +varityped +varityping +varitypist +varix +varkas +varlet +varletaille +varletess +varletry +varletries +varlets +varletto +varmannie +varment +varments +varmint +varmints +varna +varnas +varnashrama +varnish +varnished +varnisher +varnishes +varnishy +varnishing +varnishlike +varnishment +varnpliktige +varnsingite +varolian +varronia +varronian +varsal +varsha +varsiter +varsity +varsities +varsovian +varsoviana +varsovienne +vartabed +varuna +varus +varuses +varve +varved +varvel +varves +vas +vasa +vasal +vasalled +vascla +vascon +vascons +vascula +vascular +vascularity +vascularities +vascularization +vascularize +vascularized +vascularizing +vascularly +vasculated +vasculature +vasculiferous +vasculiform +vasculitis +vasculogenesis +vasculolymphatic +vasculomotor +vasculose +vasculous +vasculum +vasculums +vase +vasectomy +vasectomies +vasectomise +vasectomised +vasectomising +vasectomize +vasectomized +vasectomizing +vaseful +vaselet +vaselike +vaseline +vasemaker +vasemaking +vases +vasewise +vasework +vashegyite +vasicentric +vasicine +vasifactive +vasiferous +vasiform +vasoactive +vasoactivity +vasoconstricting +vasoconstriction +vasoconstrictive +vasoconstrictor +vasoconstrictors +vasocorona +vasodentinal +vasodentine +vasodepressor +vasodilatation +vasodilatin +vasodilating +vasodilation +vasodilator +vasoepididymostomy +vasofactive +vasoformative +vasoganglion +vasohypertonic +vasohypotonic +vasoinhibitor +vasoinhibitory +vasoligation +vasoligature +vasomotion +vasomotor +vasomotory +vasomotorial +vasomotoric +vasoneurosis +vasoparesis +vasopressin +vasopressor +vasopuncture +vasoreflex +vasorrhaphy +vasosection +vasospasm +vasospastic +vasostimulant +vasostomy +vasotocin +vasotomy +vasotonic +vasotribe +vasotripsy +vasotrophic +vasovagal +vasovesiculectomy +vasquine +vassal +vassalage +vassaldom +vassaled +vassaless +vassalic +vassaling +vassalism +vassality +vassalize +vassalized +vassalizing +vassalless +vassalling +vassalry +vassals +vassalship +vassar +vassos +vast +vastate +vastation +vaster +vastest +vasty +vastidity +vastier +vastiest +vastily +vastiness +vastity +vastities +vastitude +vastly +vastness +vastnesses +vasts +vastus +vasu +vasudeva +vasundhara +vat +vateria +vates +vatful +vatfuls +vatic +vatical +vatically +vatican +vaticanal +vaticanic +vaticanical +vaticanism +vaticanist +vaticanization +vaticanize +vaticide +vaticides +vaticinal +vaticinant +vaticinate +vaticinated +vaticinating +vaticination +vaticinator +vaticinatory +vaticinatress +vaticinatrix +vaticine +vatmaker +vatmaking +vatman +vats +vatted +vatteluttu +vatter +vatting +vau +vaucheria +vaucheriaceae +vaucheriaceous +vaudeville +vaudevillian +vaudevillians +vaudevillist +vaudy +vaudios +vaudism +vaudois +vaudoux +vaughn +vaugnerite +vauguelinite +vault +vaultage +vaulted +vaultedly +vaulter +vaulters +vaulty +vaultier +vaultiest +vaulting +vaultings +vaultlike +vaults +vaumure +vaunce +vaunt +vauntage +vaunted +vaunter +vauntery +vaunters +vauntful +vaunty +vauntie +vauntiness +vaunting +vauntingly +vauntlay +vauntmure +vaunts +vauquelinite +vaurien +vaus +vauxhall +vauxhallian +vauxite +vav +vavasor +vavasory +vavasories +vavasors +vavasour +vavasours +vavassor +vavassors +vavs +vaw +vaward +vawards +vawntie +vaws +vax +vazimba +vb +vc +vd +veadar +veadore +veal +vealed +vealer +vealers +vealy +vealier +vealiest +vealiness +vealing +veallike +veals +vealskin +veau +vectigal +vection +vectis +vectitation +vectograph +vectographic +vector +vectorcardiogram +vectorcardiography +vectorcardiographic +vectored +vectorial +vectorially +vectoring +vectorization +vectorizing +vectors +vecture +veda +vedaic +vedaism +vedalia +vedalias +vedana +vedanga +vedanta +vedantic +vedantism +vedantist +vedda +veddoid +vedet +vedette +vedettes +vedic +vedika +vediovis +vedism +vedist +vedro +veduis +vee +veen +veena +veenas +veep +veepee +veepees +veeps +veer +veerable +veered +veery +veeries +veering +veeringly +veers +vees +vefry +veg +vega +vegan +veganism +veganisms +vegans +vegas +vegasite +vegeculture +vegetability +vegetable +vegetablelike +vegetables +vegetablewise +vegetably +vegetablize +vegetal +vegetalcule +vegetality +vegetant +vegetarian +vegetarianism +vegetarians +vegetate +vegetated +vegetates +vegetating +vegetation +vegetational +vegetationally +vegetationless +vegetative +vegetatively +vegetativeness +vegete +vegeteness +vegeterianism +vegetism +vegetist +vegetists +vegetive +vegetivorous +vegetoalkali +vegetoalkaline +vegetoalkaloid +vegetoanimal +vegetobituminous +vegetocarbonaceous +vegetomineral +vegetous +vehemence +vehemency +vehement +vehemently +vehicle +vehicles +vehicula +vehicular +vehiculary +vehicularly +vehiculate +vehiculation +vehiculatory +vehiculum +vehme +vehmgericht +vehmic +vei +veigle +veil +veiled +veiledly +veiledness +veiler +veilers +veily +veiling +veilings +veilless +veilleuse +veillike +veilmaker +veilmaking +veils +veiltail +vein +veinage +veinal +veinbanding +veined +veiner +veinery +veiners +veiny +veinier +veiniest +veininess +veining +veinings +veinless +veinlet +veinlets +veinlike +veinous +veins +veinstone +veinstuff +veinule +veinules +veinulet +veinulets +veinwise +veinwork +vejoces +vejovis +vejoz +vel +vela +velal +velamen +velamentous +velamentum +velamina +velar +velardenite +velary +velaria +velaric +velarium +velarization +velarize +velarized +velarizes +velarizing +velars +velate +velated +velating +velation +velatura +velchanos +velcro +veld +veldcraft +veldman +velds +veldschoen +veldschoenen +veldschoens +veldskoen +veldt +veldts +veldtschoen +veldtsman +velella +velellidous +veleta +velyarde +velic +velicate +veliferous +veliform +veliger +veligerous +veligers +velika +velitation +velites +vell +vellala +velleda +velleity +velleities +vellicate +vellicated +vellicating +vellication +vellicative +vellinch +vellincher +vellon +vellosin +vellosine +vellozia +velloziaceae +velloziaceous +vellum +vellumy +vellums +vellute +velo +veloce +velociman +velocimeter +velocious +velociously +velocipedal +velocipede +velocipedean +velocipeded +velocipedes +velocipedic +velocipeding +velocity +velocities +velocitous +velodrome +velometer +velour +velours +velout +veloute +veloutes +veloutine +velte +veltfare +velum +velumen +velumina +velunge +velure +velured +velures +veluring +velutina +velutinous +velveret +velverets +velvet +velvetbreast +velveted +velveteen +velveteened +velveteens +velvety +velvetiness +velveting +velvetleaf +velvetlike +velvetmaker +velvetmaking +velvetry +velvets +velvetseed +velvetweed +velvetwork +vena +venacularism +venada +venae +venal +venality +venalities +venalization +venalize +venally +venalness +venantes +venanzite +venatic +venatical +venatically +venation +venational +venations +venator +venatory +venatorial +venatorious +vencola +vend +vendable +vendace +vendaces +vendage +vendaval +vendean +vended +vendee +vendees +vender +venders +vendetta +vendettas +vendettist +vendeuse +vendibility +vendibilities +vendible +vendibleness +vendibles +vendibly +vendicate +vendidad +vending +vendis +venditate +venditation +vendition +venditor +vendor +vendors +vends +vendue +vendues +venectomy +vened +venedotian +veneer +veneered +veneerer +veneerers +veneering +veneers +venefic +venefical +venefice +veneficious +veneficness +veneficous +venemous +venenate +venenated +venenately +venenates +venenating +venenation +venene +veneniferous +venenific +venenosalivary +venenose +venenosi +venenosity +venenosus +venenosusi +venenous +venenousness +venepuncture +venerability +venerable +venerableness +venerably +veneracea +veneracean +veneraceous +veneral +veneralia +venerance +venerant +venerate +venerated +venerates +venerating +veneration +venerational +venerative +veneratively +venerativeness +venerator +venere +venereal +venerealness +venerean +venereology +venereological +venereologist +venereophobia +venereous +venerer +veneres +venery +venerial +venerian +veneridae +veneries +veneriform +veneris +venero +venerology +veneros +venerous +venesect +venesection +venesector +venesia +venetes +veneti +venetian +venetianed +venetians +venetic +veneur +venezolano +venezuela +venezuelan +venezuelans +venge +vengeable +vengeance +vengeancely +vengeant +venged +vengeful +vengefully +vengefulness +vengeously +venger +venges +venging +veny +veniable +venial +veniality +venialities +venially +venialness +veniam +venice +venie +venin +venine +venines +venins +veniplex +venipuncture +venire +venireman +veniremen +venires +venise +venisection +venison +venisonivorous +venisonlike +venisons +venisuture +venite +venizelist +venkata +venkisen +venlin +vennel +venner +venoatrial +venoauricular +venography +venom +venomed +venomer +venomers +venomy +venoming +venomization +venomize +venomless +venomly +venomness +venomosalivary +venomous +venomously +venomousness +venomproof +venoms +venomsome +venosal +venosclerosis +venose +venosinal +venosity +venosities +venostasis +venous +venously +venousness +vent +venta +ventage +ventages +ventail +ventails +ventana +vented +venter +venters +ventersdorp +venthole +ventiduct +ventifact +ventil +ventilable +ventilagin +ventilate +ventilated +ventilates +ventilating +ventilation +ventilative +ventilator +ventilatory +ventilators +ventin +venting +ventless +ventoy +ventometer +ventose +ventoseness +ventosity +ventpiece +ventrad +ventral +ventrally +ventralmost +ventrals +ventralward +ventric +ventricle +ventricles +ventricolumna +ventricolumnar +ventricornu +ventricornual +ventricose +ventricoseness +ventricosity +ventricous +ventricular +ventricularis +ventriculi +ventriculite +ventriculites +ventriculitic +ventriculitidae +ventriculogram +ventriculography +ventriculopuncture +ventriculoscopy +ventriculose +ventriculous +ventriculus +ventricumbent +ventriduct +ventrifixation +ventrilateral +ventrilocution +ventriloqual +ventriloqually +ventriloque +ventriloquy +ventriloquial +ventriloquially +ventriloquise +ventriloquised +ventriloquising +ventriloquism +ventriloquist +ventriloquistic +ventriloquists +ventriloquize +ventriloquizing +ventriloquous +ventriloquously +ventrimesal +ventrimeson +ventrine +ventripyramid +ventripotence +ventripotency +ventripotent +ventripotential +ventroaxial +ventroaxillary +ventrocaudal +ventrocystorrhaphy +ventrodorsad +ventrodorsal +ventrodorsally +ventrofixation +ventrohysteropexy +ventroinguinal +ventrolateral +ventrolaterally +ventromedial +ventromedially +ventromedian +ventromesal +ventromesial +ventromyel +ventroposterior +ventroptosia +ventroptosis +ventroscopy +ventrose +ventrosity +ventrosuspension +ventrotomy +ventrotomies +vents +venture +ventured +venturer +venturers +ventures +venturesome +venturesomely +venturesomeness +venturi +venturia +venturine +venturing +venturings +venturis +venturous +venturously +venturousness +venue +venues +venula +venulae +venular +venule +venules +venulose +venulous +venus +venusberg +venushair +venusian +venusians +venust +venusty +venutian +venville +veps +vepse +vepsish +ver +vera +veracious +veraciously +veraciousness +veracity +veracities +veray +verament +veranda +verandaed +verandah +verandahed +verandahs +verandas +verascope +veratral +veratralbin +veratralbine +veratraldehyde +veratrate +veratria +veratrias +veratric +veratridin +veratridine +veratryl +veratrylidene +veratrin +veratrina +veratrine +veratrinize +veratrinized +veratrinizing +veratrins +veratrize +veratrized +veratrizing +veratroidine +veratroyl +veratrol +veratrole +veratrum +veratrums +verb +verbal +verbalisation +verbalise +verbalised +verbaliser +verbalising +verbalism +verbalist +verbalistic +verbality +verbalities +verbalization +verbalizations +verbalize +verbalized +verbalizer +verbalizes +verbalizing +verbally +verbals +verbarian +verbarium +verbasco +verbascose +verbascum +verbate +verbatim +verbena +verbenaceae +verbenaceous +verbenalike +verbenalin +verbenarius +verbenas +verbenate +verbenated +verbenating +verbene +verbenol +verbenone +verberate +verberation +verberative +verbesina +verbesserte +verby +verbiage +verbiages +verbicide +verbiculture +verbid +verbids +verbify +verbification +verbified +verbifies +verbifying +verbigerate +verbigerated +verbigerating +verbigeration +verbigerative +verbile +verbiles +verbless +verbolatry +verbomania +verbomaniac +verbomotor +verbose +verbosely +verboseness +verbosity +verbosities +verboten +verbous +verbs +verbum +verchok +verd +verdancy +verdancies +verdant +verdantly +verdantness +verde +verdea +verdelho +verderer +verderers +verderership +verderor +verderors +verdet +verdetto +verdi +verdict +verdicts +verdigris +verdigrised +verdigrisy +verdin +verdins +verdite +verditer +verditers +verdoy +verdour +verdugo +verdugoship +verdun +verdure +verdured +verdureless +verdurer +verdures +verdurous +verdurousness +verecund +verecundity +verecundness +veredict +veredicto +veredictum +verey +verek +verenda +veretilliform +veretillum +vergaloo +verge +vergeboard +verged +vergence +vergences +vergency +vergent +vergentness +verger +vergeress +vergery +vergerism +vergerless +vergers +vergership +verges +vergi +vergiform +vergilian +vergilianism +verging +verglas +verglases +vergobret +vergoyne +vergunning +veri +very +veridic +veridical +veridicality +veridicalities +veridically +veridicalness +veridicous +veridity +verier +veriest +verify +verifiability +verifiable +verifiableness +verifiably +verificate +verification +verifications +verificative +verificatory +verified +verifier +verifiers +verifies +verifying +verily +veriment +verine +veriscope +verisimilar +verisimilarly +verisimility +verisimilitude +verisimilitudinous +verism +verismo +verismos +verisms +verist +veristic +verists +veritability +veritable +veritableness +veritably +veritas +veritates +verite +verity +verities +veritism +veritist +veritistic +verjuice +verjuiced +verjuices +verkrampte +verligte +vermeil +vermeils +vermenging +vermeology +vermeologist +vermes +vermetid +vermetidae +vermetio +vermetus +vermian +vermicelli +vermiceous +vermicidal +vermicide +vermicious +vermicle +vermicular +vermicularia +vermicularly +vermiculate +vermiculated +vermiculating +vermiculation +vermicule +vermiculite +vermiculites +vermiculose +vermiculosity +vermiculous +vermiform +vermiformia +vermiformis +vermiformity +vermiformous +vermifugal +vermifuge +vermifuges +vermifugous +vermigerous +vermigrade +vermil +vermily +vermilingues +vermilinguia +vermilinguial +vermilion +vermilionette +vermilionize +vermillion +vermin +verminal +verminate +verminated +verminating +vermination +verminer +verminy +verminicidal +verminicide +verminiferous +verminly +verminlike +verminosis +verminous +verminously +verminousness +verminproof +vermiparous +vermiparousness +vermiphobia +vermis +vermivorous +vermivorousness +vermix +vermont +vermonter +vermonters +vermontese +vermorel +vermoulu +vermoulue +vermouth +vermouths +vermuth +vermuths +vern +vernaccia +vernacle +vernacles +vernacular +vernacularisation +vernacularise +vernacularised +vernacularising +vernacularism +vernacularist +vernacularity +vernacularization +vernacularize +vernacularized +vernacularizing +vernacularly +vernacularness +vernaculars +vernaculate +vernaculous +vernage +vernal +vernalisation +vernalise +vernalised +vernalising +vernality +vernalization +vernalize +vernalized +vernalizes +vernalizing +vernally +vernant +vernation +verneuk +verneuker +verneukery +vernicle +vernicles +vernicose +vernier +verniers +vernile +vernility +vernin +vernine +vernissage +vernition +vernix +vernixes +vernon +vernonia +vernoniaceous +vernonieae +vernonin +verona +veronal +veronalism +veronese +veronica +veronicas +veronicella +veronicellidae +verpa +verquere +verray +verre +verrel +verrell +verry +verriculate +verriculated +verricule +verriere +verruca +verrucae +verrucano +verrucaria +verrucariaceae +verrucariaceous +verrucarioid +verrucated +verruciferous +verruciform +verrucose +verrucoseness +verrucosis +verrucosity +verrucosities +verrucous +verruculose +verruga +verrugas +vers +versa +versability +versable +versableness +versailles +versal +versant +versants +versate +versatec +versatile +versatilely +versatileness +versatility +versatilities +versation +versative +verse +versecraft +versed +verseless +verselet +versemaker +versemaking +verseman +versemanship +versemen +versemonger +versemongery +versemongering +verser +versers +verses +versesmith +verset +versets +versette +verseward +versewright +versicle +versicler +versicles +versicolor +versicolorate +versicolored +versicolorous +versicolour +versicoloured +versicular +versicule +versiculi +versiculus +versiera +versify +versifiable +versifiaster +versification +versifications +versificator +versificatory +versificatrix +versified +versifier +versifiers +versifies +versifying +versiform +versiloquy +versin +versine +versines +versing +version +versional +versioner +versionist +versionize +versions +versipel +verso +versor +versos +verst +versta +verste +verstes +versts +versual +versus +versute +vert +vertebra +vertebrae +vertebral +vertebraless +vertebrally +vertebraria +vertebrarium +vertebrarterial +vertebras +vertebrata +vertebrate +vertebrated +vertebrates +vertebration +vertebre +vertebrectomy +vertebriform +vertebroarterial +vertebrobasilar +vertebrochondral +vertebrocostal +vertebrodymus +vertebrofemoral +vertebroiliac +vertebromammary +vertebrosacral +vertebrosternal +vertep +vertex +vertexes +verty +vertibility +vertible +vertibleness +vertical +verticaled +verticaling +verticalism +verticality +verticalled +vertically +verticalling +verticalness +verticals +vertices +verticil +verticillary +verticillaster +verticillastrate +verticillate +verticillated +verticillately +verticillation +verticilli +verticilliaceous +verticilliose +verticillium +verticillus +verticils +verticity +verticomental +verticordious +vertiginate +vertigines +vertiginous +vertiginously +vertiginousness +vertigo +vertigoes +vertigos +vertilinear +vertimeter +verts +vertu +vertugal +vertumnus +vertus +verulamian +veruled +verumontanum +verus +veruta +verutum +vervain +vervainlike +vervains +verve +vervecean +vervecine +vervel +verveled +vervelle +vervelled +vervenia +verver +verves +vervet +vervets +vervine +verzini +verzino +vesalian +vesania +vesanic +vesbite +vese +vesica +vesicae +vesical +vesicant +vesicants +vesicate +vesicated +vesicates +vesicating +vesication +vesicatory +vesicatories +vesicle +vesicles +vesicoabdominal +vesicocavernous +vesicocele +vesicocervical +vesicoclysis +vesicofixation +vesicointestinal +vesicoprostatic +vesicopubic +vesicorectal +vesicosigmoid +vesicospinal +vesicotomy +vesicovaginal +vesicula +vesiculae +vesicular +vesiculary +vesicularia +vesicularity +vesicularly +vesiculase +vesiculata +vesiculatae +vesiculate +vesiculated +vesiculating +vesiculation +vesicule +vesiculectomy +vesiculiferous +vesiculiform +vesiculigerous +vesiculitis +vesiculobronchial +vesiculocavernous +vesiculopustular +vesiculose +vesiculotympanic +vesiculotympanitic +vesiculotomy +vesiculotubular +vesiculous +vesiculus +vesicupapular +vesigia +veskit +vesp +vespa +vespacide +vespal +vesper +vesperal +vesperals +vespery +vesperian +vespering +vespers +vespertide +vespertilian +vespertilio +vespertiliones +vespertilionid +vespertilionidae +vespertilioninae +vespertilionine +vespertinal +vespertine +vespetro +vespiary +vespiaries +vespid +vespidae +vespids +vespiform +vespina +vespine +vespoid +vespoidea +vespucci +vessel +vesseled +vesselful +vesselled +vessels +vesses +vessets +vessicnon +vessignon +vest +vesta +vestal +vestalia +vestally +vestals +vestalship +vestas +vested +vestee +vestees +vester +vestiary +vestiarian +vestiaries +vestiarium +vestible +vestibula +vestibular +vestibulary +vestibulate +vestibule +vestibuled +vestibules +vestibuling +vestibulospinal +vestibulum +vestigal +vestige +vestiges +vestigia +vestigial +vestigially +vestigian +vestigiary +vestigium +vestiment +vestimental +vestimentary +vesting +vestings +vestini +vestinian +vestiture +vestless +vestlet +vestlike +vestment +vestmental +vestmentary +vestmented +vestments +vestral +vestralization +vestry +vestrical +vestrydom +vestries +vestrify +vestrification +vestryhood +vestryish +vestryism +vestryize +vestryman +vestrymanly +vestrymanship +vestrymen +vests +vestuary +vestural +vesture +vestured +vesturer +vestures +vesturing +vesuvian +vesuvianite +vesuvians +vesuviate +vesuvin +vesuvite +vesuvius +veszelyite +vet +veta +vetanda +vetch +vetches +vetchy +vetchier +vetchiest +vetchlike +vetchling +veter +veteran +veterancy +veteraness +veteranize +veterans +veterinary +veterinarian +veterinarianism +veterinarians +veterinaries +vetitive +vetivene +vetivenol +vetiver +vetiveria +vetivers +vetivert +vetkousie +veto +vetoed +vetoer +vetoers +vetoes +vetoing +vetoism +vetoist +vetoistic +vetoistical +vets +vetted +vetting +vettura +vetture +vetturino +vetus +vetust +vetusty +veuglaire +veuve +vex +vexable +vexation +vexations +vexatious +vexatiously +vexatiousness +vexatory +vexed +vexedly +vexedness +vexer +vexers +vexes +vexful +vexil +vexilla +vexillar +vexillary +vexillaries +vexillarious +vexillate +vexillation +vexillology +vexillologic +vexillological +vexillologist +vexillum +vexils +vexing +vexingly +vexingness +vext +vg +vi +via +viability +viabilities +viable +viableness +viably +viaduct +viaducts +viage +viaggiatory +viagram +viagraph +viajaca +vial +vialed +vialful +vialing +vialled +vialling +vialmaker +vialmaking +vialogue +vials +viameter +viand +viande +vianden +viander +viandry +viands +vias +vyase +viasma +viatic +viatica +viatical +viaticals +viaticum +viaticums +viatometer +viator +viatores +viatorial +viatorially +viators +vibe +vibes +vibetoite +vibex +vibgyor +vibices +vibioid +vibist +vibists +vibix +vibracula +vibracular +vibracularium +vibraculoid +vibraculum +vibraharp +vibraharpist +vibraharps +vibrance +vibrances +vibrancy +vibrancies +vibrant +vibrantly +vibrants +vibraphone +vibraphones +vibraphonist +vibrate +vibrated +vibrates +vibratile +vibratility +vibrating +vibratingly +vibration +vibrational +vibrationless +vibrations +vibratiuncle +vibratiunculation +vibrative +vibrato +vibrator +vibratory +vibrators +vibratos +vibrio +vibrioid +vibrion +vibrionic +vibrions +vibrios +vibriosis +vibrissa +vibrissae +vibrissal +vibrograph +vibromassage +vibrometer +vibromotive +vibronic +vibrophone +vibroscope +vibroscopic +vibrotherapeutics +viburnic +viburnin +viburnum +viburnums +vic +vica +vicaire +vicar +vicara +vicarage +vicarages +vicarate +vicarates +vicarchoral +vicaress +vicargeneral +vicary +vicarial +vicarian +vicarianism +vicariate +vicariates +vicariateship +vicarii +vicariism +vicarious +vicariously +vicariousness +vicarius +vicarly +vicars +vicarship +vice +vicecomes +vicecomital +vicecomites +viced +vicegeral +vicegerency +vicegerencies +vicegerent +vicegerents +vicegerentship +viceless +vicelike +vicenary +vicennial +viceregal +viceregally +viceregency +viceregent +viceregents +vicereine +viceroy +viceroyal +viceroyalty +viceroydom +viceroies +viceroys +viceroyship +vices +vicesimal +vicety +viceversally +vichy +vichies +vichyite +vichyssoise +vicia +vicianin +vicianose +vicilin +vicinage +vicinages +vicinal +vicine +vicing +vicinity +vicinities +viciosity +vicious +viciously +viciousness +vicissitous +vicissitude +vicissitudes +vicissitudinary +vicissitudinous +vicissitudinousness +vick +vicki +vicky +vickie +vicoite +vicomte +vicomtes +vicomtesse +vicomtesses +vicontiel +vicontiels +victal +victim +victimhood +victimisation +victimise +victimised +victimiser +victimising +victimizable +victimization +victimizations +victimize +victimized +victimizer +victimizers +victimizes +victimizing +victimless +victims +victless +victor +victordom +victoress +victorfish +victorfishes +victory +victoria +victorian +victorianism +victorianize +victorianly +victorians +victorias +victoriate +victoriatus +victories +victoryless +victorine +victorious +victoriously +victoriousness +victorium +victors +victress +victresses +victrices +victrix +victrola +victual +victualage +victualed +victualer +victualers +victualing +victualled +victualler +victuallers +victuallership +victualless +victualling +victualry +victuals +victus +vicua +vicualling +vicuda +vicugna +vicugnas +vicuna +vicunas +vicus +vidame +viddhal +viddui +vidduy +vide +videlicet +videnda +videndum +video +videocassette +videocassettes +videocast +videocasting +videodisc +videodiscs +videodisk +videogenic +videophone +videos +videotape +videotaped +videotapes +videotaping +videotex +videotext +videruff +vidette +videttes +videtur +vidhyanath +vidya +vidian +vidicon +vidicons +vidimus +vidkid +vidkids +vidonia +vidry +vidua +viduage +vidual +vidually +viduate +viduated +viduation +viduinae +viduine +viduity +viduities +viduous +vie +vied +vielle +vienna +viennese +vier +vierkleur +vierling +viers +viertel +viertelein +vies +vietcong +vietminh +vietnam +vietnamese +vietnamization +view +viewable +viewably +viewed +viewer +viewers +viewfinder +viewfinders +viewy +viewier +viewiest +viewiness +viewing +viewings +viewless +viewlessly +viewlessness +viewly +viewpoint +viewpoints +viewport +views +viewsome +viewster +viewworthy +vifda +viga +vigas +vigentennial +vigesimal +vigesimation +vigesimo +vigesimoquarto +vigesimos +viggle +vigia +vigias +vigil +vigilance +vigilancy +vigilant +vigilante +vigilantes +vigilantism +vigilantist +vigilantly +vigilantness +vigilate +vigilation +vigils +vigintiangular +vigintillion +vigintillionth +vigneron +vignerons +vignette +vignetted +vignetter +vignettes +vignetting +vignettist +vignettists +vignin +vigogne +vigone +vigonia +vigor +vigorish +vigorishes +vigorist +vigorless +vigoroso +vigorous +vigorously +vigorousness +vigors +vigour +vigours +vihara +vihuela +vii +viii +vying +vyingly +vijay +vijao +viking +vikingism +vikinglike +vikings +vikingship +vil +vila +vilayet +vilayets +vild +vildly +vildness +vile +vilehearted +vileyns +vilela +vilely +vileness +vilenesses +viler +vilest +vilhelm +vili +viliaco +vilicate +vilify +vilification +vilifications +vilified +vilifier +vilifiers +vilifies +vilifying +vilifyingly +vilipend +vilipended +vilipender +vilipending +vilipendious +vilipenditory +vilipends +vility +vilities +vill +villa +villache +villadom +villadoms +villae +villaette +village +villageful +villagehood +villagey +villageless +villagelet +villagelike +villageous +villager +villageress +villagery +villagers +villages +villaget +villageward +villagy +villagism +villayet +villain +villainage +villaindom +villainess +villainesses +villainy +villainies +villainist +villainize +villainous +villainously +villainousness +villainproof +villains +villakin +villaless +villalike +villan +villanage +villancico +villanella +villanelle +villanette +villanous +villanously +villanova +villanovan +villar +villarsite +villas +villate +villatic +ville +villegiatura +villegiature +villein +villeinage +villeiness +villeinhold +villeins +villeity +villenage +villi +villiaumite +villicus +villiferous +villiform +villiplacental +villiplacentalia +villitis +villoid +villose +villosity +villosities +villota +villote +villous +villously +vills +villus +vim +vimana +vimen +vimful +vimina +viminal +vimineous +vimpa +vims +vin +vina +vinaceous +vinaconic +vinage +vinagron +vinaigre +vinaigrette +vinaigretted +vinaigrettes +vinaigrier +vinaigrous +vinal +vinalia +vinals +vinas +vinasse +vinasses +vinata +vinblastine +vinca +vincas +vince +vincent +vincentian +vincenzo +vincetoxicum +vincetoxin +vinchuca +vinci +vincibility +vincible +vincibleness +vincibly +vincristine +vincula +vincular +vinculate +vinculation +vinculo +vinculula +vinculum +vinculums +vindaloo +vindelici +vindemial +vindemiate +vindemiation +vindemiatory +vindemiatrix +vindex +vindhyan +vindicability +vindicable +vindicableness +vindicably +vindicate +vindicated +vindicates +vindicating +vindication +vindications +vindicative +vindicatively +vindicativeness +vindicator +vindicatory +vindicatorily +vindicators +vindicatorship +vindicatress +vindices +vindict +vindicta +vindictive +vindictively +vindictiveness +vindictivolence +vindresser +vine +vinea +vineae +vineal +vineatic +vined +vinedresser +vinegar +vinegarer +vinegarette +vinegary +vinegariness +vinegarish +vinegarishness +vinegarist +vinegarlike +vinegarroon +vinegars +vinegarweed +vinegerone +vinegrower +vineyard +vineyarder +vineyarding +vineyardist +vineyards +vineity +vineland +vineless +vinelet +vinelike +viner +vinery +vineries +vines +vinestalk +vinet +vinetta +vinew +vinewise +vingerhoed +vingolf +vingt +vingtieme +vingtun +vinhatico +viny +vinic +vinicultural +viniculture +viniculturist +vinier +viniest +vinifera +viniferas +viniferous +vinification +vinificator +vinyl +vinylacetylene +vinylate +vinylated +vinylating +vinylation +vinylbenzene +vinylene +vinylethylene +vinylic +vinylidene +vinylite +vinyls +vining +vinyon +vinitor +vinland +vinny +vino +vinoacetous +vinod +vinolence +vinolent +vinology +vinologist +vinometer +vinomethylic +vinos +vinose +vinosity +vinosities +vinosulphureous +vinous +vinously +vinousness +vinquish +vins +vint +vinta +vintage +vintaged +vintager +vintagers +vintages +vintaging +vintem +vintener +vinter +vintlite +vintner +vintneress +vintnery +vintners +vintnership +vintress +vintry +vinum +viol +viola +violability +violable +violableness +violably +violaceae +violacean +violaceous +violaceously +violal +violales +violan +violand +violanin +violaquercitrin +violas +violate +violated +violater +violaters +violates +violating +violation +violational +violations +violative +violator +violatory +violators +violature +violence +violences +violency +violent +violently +violentness +violer +violescent +violet +violety +violetish +violetlike +violets +violette +violetwise +violin +violina +violine +violined +violinette +violining +violinist +violinistic +violinistically +violinists +violinless +violinlike +violinmaker +violinmaking +violino +violins +violist +violists +violmaker +violmaking +violon +violoncellist +violoncellists +violoncello +violoncellos +violone +violones +violotta +violous +viols +violuric +viomycin +viomycins +viosterol +vip +viper +vipera +viperan +viperess +viperfish +viperfishes +vipery +viperian +viperid +viperidae +viperiform +viperina +viperinae +viperine +viperish +viperishly +viperlike +viperling +viperoid +viperoidea +viperous +viperously +viperousness +vipers +vipolitic +vipresident +vips +viqueen +vira +viragin +viraginian +viraginity +viraginous +virago +viragoes +viragoish +viragolike +viragos +viragoship +viral +virales +virally +virason +virbius +vire +virelai +virelay +virelais +virelays +virement +viremia +viremias +viremic +virent +vireo +vireonine +vireos +vires +virescence +virescent +virga +virgal +virgas +virgate +virgated +virgater +virgates +virgation +virge +virger +virgil +virgilia +virgilian +virgilism +virgin +virginal +virginale +virginalist +virginality +virginally +virginals +virgineous +virginhead +virginia +virginian +virginians +virginid +virginity +virginities +virginitis +virginityship +virginium +virginly +virginlike +virgins +virginship +virgo +virgos +virgouleuse +virgula +virgular +virgularia +virgularian +virgulariidae +virgulate +virgule +virgules +virgultum +virial +viricidal +viricide +viricides +virid +viridaria +viridarium +viridene +viridescence +viridescent +viridian +viridians +viridigenous +viridin +viridine +viridite +viridity +viridities +virify +virific +virile +virilely +virileness +virilescence +virilescent +virilia +virilify +viriliously +virilism +virilisms +virilist +virility +virilities +virilization +virilize +virilizing +virilocal +virilocally +virion +virions +viripotent +viritoot +viritrate +virl +virled +virls +vyrnwy +virole +viroled +virology +virologic +virological +virologically +virologies +virologist +virologists +viron +virose +viroses +virosis +virous +virtu +virtual +virtualism +virtualist +virtuality +virtualize +virtually +virtue +virtued +virtuefy +virtueless +virtuelessness +virtueproof +virtues +virtuless +virtuosa +virtuosas +virtuose +virtuosi +virtuosic +virtuosity +virtuosities +virtuoso +virtuosos +virtuosoship +virtuous +virtuously +virtuouslike +virtuousness +virtus +virtuti +virtutis +virucidal +virucide +virucides +viruela +virulence +virulences +virulency +virulencies +virulent +virulented +virulently +virulentness +viruliferous +virus +viruscidal +viruscide +virusemic +viruses +viruslike +virustatic +vis +visa +visaed +visage +visaged +visages +visagraph +visaya +visayan +visaing +visammin +visard +visards +visarga +visas +viscacha +viscachas +viscera +visceral +visceralgia +viscerally +visceralness +viscerate +viscerated +viscerating +visceration +visceripericardial +viscerogenic +visceroinhibitory +visceromotor +visceroparietal +visceroperitioneal +visceropleural +visceroptosis +visceroptotic +viscerosensory +visceroskeletal +viscerosomatic +viscerotomy +viscerotonia +viscerotonic +viscerotrophic +viscerotropic +viscerous +viscid +viscidity +viscidities +viscidize +viscidly +viscidness +viscidulous +viscin +viscoelastic +viscoelasticity +viscoid +viscoidal +viscolize +viscometer +viscometry +viscometric +viscometrical +viscometrically +viscontal +viscontial +viscoscope +viscose +viscoses +viscosimeter +viscosimetry +viscosimetric +viscosity +viscosities +viscount +viscountcy +viscountcies +viscountess +viscountesses +viscounty +viscounts +viscountship +viscous +viscously +viscousness +viscum +viscus +vise +vised +viseed +viseing +viselike +viseman +visement +visenomy +vises +vishal +vishnavite +vishnu +vishnuism +vishnuite +vishnuvite +visibility +visibilities +visibilize +visible +visibleness +visibly +visie +visier +visigoth +visigothic +visile +vising +vision +visional +visionally +visionary +visionaries +visionarily +visionariness +visioned +visioner +visionic +visioning +visionist +visionize +visionless +visionlike +visionmonger +visionproof +visions +visit +visita +visitable +visitador +visitandine +visitant +visitants +visitate +visitation +visitational +visitations +visitative +visitator +visitatorial +visite +visited +visitee +visiter +visiters +visiting +visitment +visitor +visitoress +visitorial +visitors +visitorship +visitress +visitrix +visits +visive +visne +visney +visnomy +vison +visor +visored +visory +visoring +visorless +visorlike +visors +viss +vista +vistaed +vistal +vistaless +vistamente +vistas +vistlik +visto +vistulian +visual +visualisable +visualisation +visualiser +visualist +visuality +visualities +visualizable +visualization +visualizations +visualize +visualized +visualizer +visualizers +visualizes +visualizing +visually +visuals +visuoauditory +visuokinesthetic +visuometer +visuopsychic +visuosensory +vita +vitaceae +vitaceous +vitae +vitaglass +vitagraph +vital +vitalic +vitalisation +vitalise +vitalised +vitaliser +vitalises +vitalising +vitalism +vitalisms +vitalist +vitalistic +vitalistically +vitalists +vitality +vitalities +vitalization +vitalize +vitalized +vitalizer +vitalizers +vitalizes +vitalizing +vitalizingly +vitally +vitallium +vitalness +vitals +vitamer +vitameric +vitamers +vitamin +vitamine +vitamines +vitaminic +vitaminization +vitaminize +vitaminized +vitaminizing +vitaminology +vitaminologist +vitamins +vitapath +vitapathy +vitaphone +vitascope +vitascopic +vitasti +vitativeness +vite +vitellary +vitellarian +vitellarium +vitellicle +vitelliferous +vitelligenous +vitelligerous +vitellin +vitelline +vitellins +vitellogene +vitellogenesis +vitellogenous +vitellose +vitellus +vitelluses +viterbite +vitesse +vitesses +vithayasai +viti +vitiable +vitial +vitiate +vitiated +vitiates +vitiating +vitiation +vitiator +vitiators +viticeta +viticetum +viticetums +viticulose +viticultural +viticulture +viticulturer +viticulturist +viticulturists +vitiferous +vitilago +vitiliginous +vitiligo +vitiligoid +vitiligoidea +vitiligos +vitilitigate +vitiosity +vitiosities +vitis +vitita +vitium +vitochemic +vitochemical +vitra +vitrage +vitrail +vitrailed +vitrailist +vitraillist +vitrain +vitraux +vitreal +vitrean +vitrella +vitremyte +vitreodentinal +vitreodentine +vitreoelectric +vitreosity +vitreous +vitreously +vitreouslike +vitreousness +vitrescence +vitrescency +vitrescent +vitrescibility +vitrescible +vitreum +vitry +vitrial +vitric +vitrics +vitrifaction +vitrifacture +vitrify +vitrifiability +vitrifiable +vitrificate +vitrification +vitrified +vitrifies +vitrifying +vitriform +vitrina +vitrine +vitrines +vitrinoid +vitriol +vitriolate +vitriolated +vitriolating +vitriolation +vitrioled +vitriolic +vitriolically +vitrioline +vitrioling +vitriolizable +vitriolization +vitriolize +vitriolized +vitriolizer +vitriolizing +vitriolled +vitriolling +vitriols +vitrite +vitro +vitrobasalt +vitrophyre +vitrophyric +vitrotype +vitrous +vitrum +vitruvian +vitruvianism +vitta +vittae +vittate +vittle +vittled +vittles +vittling +vitular +vitulary +vituline +vituper +vituperable +vituperance +vituperate +vituperated +vituperates +vituperating +vituperation +vituperations +vituperatiou +vituperative +vituperatively +vituperator +vituperatory +vitupery +vituperious +vituperous +viuva +viva +vivace +vivacious +vivaciously +vivaciousness +vivacissimo +vivacity +vivacities +vivamente +vivandi +vivandier +vivandiere +vivandieres +vivandire +vivant +vivants +vivary +vivaria +vivaries +vivariia +vivariiums +vivarium +vivariums +vivarvaria +vivas +vivat +vivax +vivda +vive +vivek +vively +vivency +vivendi +viver +viverra +viverrid +viverridae +viverrids +viverriform +viverrinae +viverrine +vivers +vives +viveur +vivian +vivianite +vivicremation +vivid +vivider +vividest +vividialysis +vividiffusion +vividissection +vividity +vividly +vividness +vivify +vivific +vivifical +vivificant +vivificate +vivificated +vivificating +vivification +vivificative +vivificator +vivified +vivifier +vivifiers +vivifies +vivifying +vivipara +vivipary +viviparism +viviparity +viviparities +viviparous +viviparously +viviparousness +viviperfuse +vivisect +vivisected +vivisectible +vivisecting +vivisection +vivisectional +vivisectionally +vivisectionist +vivisectionists +vivisective +vivisector +vivisectorium +vivisects +vivisepulture +vivo +vivos +vivre +vivres +vixen +vixenish +vixenishly +vixenishness +vixenly +vixenlike +vixens +viz +vizament +vizard +vizarded +vizarding +vizardless +vizardlike +vizardmonger +vizards +vizcacha +vizcachas +vizier +vizierate +viziercraft +vizierial +viziers +viziership +vizir +vizirate +vizirates +vizircraft +vizirial +vizirs +vizirship +viznomy +vizor +vizored +vizoring +vizorless +vizors +vizsla +vizslas +vizzy +vl +vlach +vladimir +vladislav +vlei +vlsi +vmintegral +vmsize +vo +voar +vobis +voc +vocab +vocability +vocable +vocables +vocably +vocabular +vocabulary +vocabularian +vocabularied +vocabularies +vocabulation +vocabulist +vocal +vocalic +vocalically +vocalics +vocalion +vocalisation +vocalisations +vocalise +vocalised +vocalises +vocalising +vocalism +vocalisms +vocalist +vocalistic +vocalists +vocality +vocalities +vocalizable +vocalization +vocalizations +vocalize +vocalized +vocalizer +vocalizers +vocalizes +vocalizing +vocaller +vocally +vocalness +vocals +vocat +vocate +vocation +vocational +vocationalism +vocationalist +vocationalization +vocationalize +vocationally +vocations +vocative +vocatively +vocatives +voce +voces +vochysiaceae +vochysiaceous +vocicultural +vociferance +vociferanced +vociferancing +vociferant +vociferate +vociferated +vociferates +vociferating +vociferation +vociferations +vociferative +vociferator +vociferize +vociferosity +vociferous +vociferously +vociferousness +vocification +vocimotor +vocoder +vocoders +vocoid +vocular +vocule +vod +voder +vodka +vodkas +vodum +vodums +vodun +voe +voes +voet +voeten +voetganger +voetian +voetsak +voetsek +voetstoots +vog +vogesite +vogie +voglite +vogt +vogue +voguey +vogues +voguish +voguishness +vogul +voyage +voyageable +voyaged +voyager +voyagers +voyages +voyageur +voyageurs +voyaging +voyagings +voyance +voice +voiceband +voiced +voicedness +voiceful +voicefulness +voiceless +voicelessly +voicelessness +voicelet +voicelike +voiceprint +voiceprints +voicer +voicers +voices +voicing +void +voidable +voidableness +voidance +voidances +voided +voidee +voider +voiders +voiding +voidless +voidly +voidness +voidnesses +voids +voyeur +voyeurism +voyeuristic +voyeuristically +voyeurs +voyeuse +voyeuses +voila +voile +voiles +voilier +voisinage +voiture +voitures +voiturette +voiturier +voiturin +voivod +voivode +voivodeship +vol +volable +volacious +volador +volage +volaille +volans +volant +volante +volantly +volapie +volapuk +volapuker +volapukism +volapukist +volar +volary +volata +volatic +volatile +volatilely +volatileness +volatiles +volatilisable +volatilisation +volatilise +volatilised +volatiliser +volatilising +volatility +volatilities +volatilizable +volatilization +volatilize +volatilized +volatilizer +volatilizes +volatilizing +volation +volational +volatize +volborthite +volcae +volcan +volcanalia +volcanian +volcanic +volcanically +volcanicity +volcanics +volcanism +volcanist +volcanite +volcanity +volcanizate +volcanization +volcanize +volcanized +volcanizing +volcano +volcanoes +volcanoism +volcanology +volcanologic +volcanological +volcanologist +volcanologists +volcanologize +volcanos +volcanus +vole +voled +volemite +volemitol +volency +volens +volent +volente +volenti +volently +volery +voleries +voles +volet +volga +volhynite +volyer +voling +volipresence +volipresent +volitant +volitate +volitation +volitational +volitiency +volitient +volition +volitional +volitionalist +volitionality +volitionally +volitionary +volitionate +volitionless +volitions +volitive +volitorial +volkerwanderung +volkslied +volkslieder +volksraad +volkswagen +volkswagens +volley +volleyball +volleyballs +volleyed +volleyer +volleyers +volleying +volleyingly +volleys +vollenge +volost +volosts +volow +volpane +volplane +volplaned +volplanes +volplaning +volplanist +vols +volsci +volscian +volsella +volsellum +volstead +volsteadism +volt +volta +voltaelectric +voltaelectricity +voltaelectrometer +voltaelectrometric +voltage +voltages +voltagraphy +voltaic +voltaire +voltairean +voltairian +voltairianize +voltairish +voltairism +voltaism +voltaisms +voltaite +voltameter +voltametric +voltammeter +voltaplast +voltatype +volte +volteador +volteadores +voltes +volti +voltigeur +voltinism +voltivity +voltize +voltmeter +voltmeters +volto +volts +voltzine +voltzite +volubilate +volubility +voluble +volubleness +volubly +volucrine +volume +volumed +volumen +volumenometer +volumenometry +volumes +volumescope +volumeter +volumetry +volumetric +volumetrical +volumetrically +volumette +volumina +voluminal +voluming +voluminosity +voluminous +voluminously +voluminousness +volumist +volumometer +volumometry +volumometrical +voluntary +voluntariate +voluntaries +voluntaryism +voluntaryist +voluntarily +voluntariness +voluntarious +voluntarism +voluntarist +voluntaristic +voluntarity +voluntative +volunteer +volunteered +volunteering +volunteerism +volunteerly +volunteers +volunteership +volunty +voluper +volupt +voluptary +voluptas +volupte +volupty +voluptuary +voluptuarian +voluptuaries +voluptuate +voluptuosity +voluptuous +voluptuously +voluptuousness +voluspa +voluta +volutae +volutate +volutation +volute +voluted +volutes +volutidae +volutiform +volutin +volutins +volution +volutions +volutoid +volva +volvas +volvate +volvell +volvelle +volvent +volvocaceae +volvocaceous +volvox +volvoxes +volvuli +volvullus +volvulus +volvuluses +vombatid +vomer +vomerine +vomerobasilar +vomeronasal +vomeropalatine +vomers +vomica +vomicae +vomicin +vomicine +vomit +vomitable +vomited +vomiter +vomiters +vomity +vomiting +vomitingly +vomition +vomitive +vomitiveness +vomitives +vomito +vomitory +vomitoria +vomitories +vomitorium +vomitos +vomitous +vomits +vomiture +vomiturition +vomitus +vomituses +vomitwort +vomtoria +von +vondsira +vonsenite +voodoo +voodooed +voodooing +voodooism +voodooist +voodooistic +voodoos +voorhuis +voorlooper +voortrekker +voracious +voraciously +voraciousness +voracity +voracities +vorage +voraginous +vorago +vorant +voraz +vorhand +vorlage +vorlages +vorlooper +vorondreo +vorpal +vorspiel +vortex +vortexes +vortical +vortically +vorticel +vorticella +vorticellae +vorticellas +vorticellid +vorticellidae +vorticellum +vortices +vorticial +vorticiform +vorticism +vorticist +vorticity +vorticities +vorticose +vorticosely +vorticular +vorticularly +vortiginous +vortumnus +vosgian +vota +votable +votal +votally +votaress +votaresses +votary +votaries +votarist +votarists +votation +vote +voteable +voted +voteen +voteless +voter +voters +votes +votyak +voting +votish +votist +votive +votively +votiveness +votograph +votometer +votress +votresses +vouch +vouchable +vouched +vouchee +vouchees +voucher +voucherable +vouchered +voucheress +vouchering +vouchers +vouches +vouching +vouchment +vouchor +vouchsafe +vouchsafed +vouchsafement +vouchsafer +vouchsafes +vouchsafing +vouge +vougeot +voulge +vouli +voussoir +voussoirs +voust +vouster +vousty +vow +vowed +vowel +vowely +vowelisation +vowelish +vowelism +vowelist +vowelization +vowelize +vowelized +vowelizes +vowelizing +vowelled +vowelless +vowellessness +vowelly +vowellike +vowels +vower +vowers +vowess +vowing +vowless +vowmaker +vowmaking +vows +vowson +vox +vp +vr +vraic +vraicker +vraicking +vraisemblance +vrbaite +vriddhi +vril +vrille +vrilled +vrilling +vrocht +vroom +vroomed +vrooming +vrooms +vrother +vrouw +vrouws +vrow +vrows +vs +vss +vt +vu +vucom +vucoms +vug +vugg +vuggy +vuggs +vugh +vughs +vugs +vulcan +vulcanalia +vulcanalial +vulcanalian +vulcanian +vulcanic +vulcanicity +vulcanisable +vulcanisation +vulcanise +vulcanised +vulcaniser +vulcanising +vulcanism +vulcanist +vulcanite +vulcanizable +vulcanizate +vulcanization +vulcanize +vulcanized +vulcanizer +vulcanizers +vulcanizes +vulcanizing +vulcano +vulcanology +vulcanological +vulcanologist +vulg +vulgar +vulgare +vulgarer +vulgarest +vulgarian +vulgarians +vulgarisation +vulgarise +vulgarised +vulgariser +vulgarish +vulgarising +vulgarism +vulgarisms +vulgarist +vulgarity +vulgarities +vulgarization +vulgarizations +vulgarize +vulgarized +vulgarizer +vulgarizers +vulgarizes +vulgarizing +vulgarly +vulgarlike +vulgarness +vulgars +vulgarwise +vulgate +vulgates +vulgo +vulgus +vulguses +vuln +vulned +vulnerability +vulnerabilities +vulnerable +vulnerableness +vulnerably +vulneral +vulnerary +vulneraries +vulnerate +vulneration +vulnerative +vulnerose +vulnific +vulnifical +vulnose +vulpanser +vulpecide +vulpecula +vulpecular +vulpeculid +vulpes +vulpic +vulpicidal +vulpicide +vulpicidism +vulpinae +vulpine +vulpinic +vulpinism +vulpinite +vulsella +vulsellum +vulsinite +vultur +vulture +vulturelike +vultures +vulturewise +vulturidae +vulturinae +vulturine +vulturish +vulturism +vulturn +vulturous +vulva +vulvae +vulval +vulvar +vulvas +vulvate +vulviform +vulvitis +vulvitises +vulvocrural +vulvouterine +vulvovaginal +vulvovaginitis +vum +vv +vvll +w +wa +waac +waag +waapa +waar +waasi +wab +wabayo +wabber +wabby +wabble +wabbled +wabbler +wabblers +wabbles +wabbly +wabblier +wabbliest +wabbliness +wabbling +wabblingly +wabe +wabena +wabeno +wabi +wabron +wabs +wabster +wabuma +wabunga +wac +wacadash +wacago +wacapou +wace +wachaga +wachenheimer +wachna +wachuset +wack +wacke +wacken +wacker +wackes +wacky +wackier +wackiest +wackily +wackiness +wacks +waco +wacs +wad +wadable +wadcutter +wadded +waddent +wadder +wadders +waddy +waddie +waddied +waddies +waddying +wadding +waddings +waddywood +waddle +waddled +waddler +waddlers +waddles +waddlesome +waddly +waddling +waddlingly +wade +wadeable +waded +wader +waders +wades +wadge +wadi +wady +wadies +wading +wadingly +wadis +wadlike +wadmaal +wadmaals +wadmaker +wadmaking +wadmal +wadmals +wadmeal +wadmel +wadmels +wadmol +wadmoll +wadmolls +wadmols +wadna +wads +wadset +wadsets +wadsetted +wadsetter +wadsetting +wae +waefu +waeful +waeg +waeness +waenesses +waer +waes +waesome +waesuck +waesucks +waf +wafd +wafdist +wafer +wafered +waferer +wafery +wafering +waferish +waferlike +wafermaker +wafermaking +wafers +waferwoman +waferwork +waff +waffed +waffie +waffies +waffing +waffle +waffled +waffles +waffly +wafflike +waffling +waffness +waffs +waflib +waft +waftage +waftages +wafted +wafter +wafters +wafty +wafting +wafts +wafture +waftures +wag +waganda +wagang +waganging +wagati +wagaun +wagbeard +wage +waged +wagedom +wageless +wagelessness +wageling +wagenboom +wagener +wager +wagered +wagerer +wagerers +wagering +wagers +wages +wagesman +waget +wagework +wageworker +wageworking +wagga +waggable +waggably +wagged +waggel +wagger +waggery +waggeries +waggers +waggy +waggie +wagging +waggish +waggishly +waggishness +waggle +waggled +waggles +waggly +waggling +wagglingly +waggon +waggonable +waggonage +waggoned +waggoner +waggoners +waggonette +waggoning +waggonload +waggonry +waggons +waggonsmith +waggonway +waggonwayman +waggonwright +waggumbura +wagh +waging +waglike +wagling +wagner +wagneresque +wagnerian +wagneriana +wagnerianism +wagnerians +wagnerism +wagnerist +wagnerite +wagnerize +wagogo +wagoma +wagon +wagonable +wagonage +wagonages +wagoned +wagoneer +wagoner +wagoners +wagoness +wagonette +wagonettes +wagonful +wagoning +wagonless +wagonload +wagonmaker +wagonmaking +wagonman +wagonry +wagons +wagonsmith +wagonway +wagonwayman +wagonwork +wagonwright +wags +wagsome +wagtail +wagtails +waguha +wagwag +wagwants +wagweno +wagwit +wah +wahabi +wahabiism +wahabit +wahabitism +wahahe +wahconda +wahcondas +wahehe +wahhabi +wahima +wahine +wahines +wahlenbergia +wahlund +wahoo +wahoos +wahpekute +wahpeton +wahwah +way +wayaka +wayang +wayao +waiata +wayback +wayberry +waybill +waybills +waybird +waibling +waybook +waybread +waybung +waicuri +waicurian +waif +wayfare +wayfarer +wayfarers +wayfaring +wayfaringly +wayfarings +waifed +wayfellow +waifing +waifs +waygang +waygate +waygoer +waygoing +waygoings +waygone +waygoose +waiguli +wayhouse +waiilatpuan +waying +waik +waikly +waikness +wail +waylay +waylaid +waylaidlessness +waylayer +waylayers +waylaying +waylays +wailaki +wayland +wayleave +wailed +wailer +wailers +wayless +wailful +wailfully +waily +wailing +wailingly +wailment +wails +wailsome +waymaker +wayman +waymark +waymate +waymen +wayment +wain +wainable +wainage +wainbote +wayne +wainer +wainful +wainman +wainmen +wainrope +wains +wainscot +wainscoted +wainscoting +wainscots +wainscotted +wainscotting +wainwright +wainwrights +waipiro +waypost +wair +wairch +waird +waired +wairepo +wairing +wairs +wairsh +ways +waise +wayside +waysider +waysides +waysliding +waist +waistband +waistbands +waistcloth +waistcloths +waistcoat +waistcoated +waistcoateer +waistcoathole +waistcoating +waistcoatless +waistcoats +waisted +waister +waisters +waisting +waistings +waistless +waistline +waistlines +waists +wait +waited +waiter +waiterage +waiterdom +waiterhood +waitering +waiterlike +waiters +waitership +waitewoman +waythorn +waiting +waitingly +waitings +waitlist +waitress +waitresses +waitressless +waits +waitsmen +waivatua +waive +waived +waiver +waiverable +waivery +waivers +waives +waiving +waivod +waiwai +wayward +waywarden +waywardly +waywardness +waywiser +waiwode +waywode +waywodeship +wayworn +waywort +wayzgoose +wajang +waka +wakamba +wakan +wakanda +wakandas +wakari +wakas +wakashan +wake +waked +wakeel +wakeful +wakefully +wakefulness +wakeless +wakeman +wakemen +waken +wakened +wakener +wakeners +wakening +wakenings +wakens +waker +wakerife +wakerifeness +wakerobin +wakers +wakes +waketime +wakeup +wakf +wakhi +waky +wakif +wakiki +wakikis +waking +wakingly +wakiup +wakizashi +wakken +wakon +wakonda +wakore +wakwafi +walach +walachian +walahee +walapai +walcheren +walchia +waldenses +waldensian +waldflute +waldglas +waldgrave +waldgravine +waldheimia +waldhorn +waldmeister +waldorf +waldsteinia +wale +waled +walepiece +waler +walers +wales +walewort +walhalla +wali +waly +walycoat +walies +waling +walk +walkable +walkabout +walkaway +walkaways +walked +walkene +walker +walkerite +walkers +walkie +walking +walkings +walkingstick +walkyrie +walkyries +walkist +walkmill +walkmiller +walkout +walkouts +walkover +walkovers +walkrife +walks +walkside +walksman +walksmen +walkup +walkups +walkway +walkways +wall +walla +wallaba +wallaby +wallabies +wallach +wallago +wallah +wallahs +wallaroo +wallaroos +wallas +wallawalla +wallbird +wallboard +walled +walleye +walleyed +walleyes +waller +wallerian +wallet +walletful +wallets +wallflower +wallflowers +wallful +wallhick +wally +wallydrag +wallydraigle +wallie +wallies +walling +wallise +wallless +wallman +walloch +wallon +wallonian +walloon +wallop +walloped +walloper +wallopers +walloping +wallops +wallow +wallowed +wallower +wallowers +wallowing +wallowish +wallowishly +wallowishness +wallows +wallpaper +wallpapered +wallpapering +wallpapers +wallpiece +walls +wallsend +wallwise +wallwork +wallwort +walnut +walnuts +walpapi +walpolean +walpurgis +walpurgite +walrus +walruses +walsh +walspere +walt +walter +walth +walty +waltonian +waltron +waltrot +waltz +waltzed +waltzer +waltzers +waltzes +waltzing +waltzlike +wamara +wambais +wamble +wambled +wambles +wambly +wamblier +wambliest +wambliness +wambling +wamblingly +wambuba +wambugu +wambutti +wame +wamefou +wamefous +wamefu +wameful +wamefull +wamefuls +wamel +wames +wamfle +wammikin +wammus +wammuses +wamp +wampanoag +wampee +wampish +wampished +wampishes +wampishing +wample +wampum +wampumpeag +wampums +wampus +wampuses +wamus +wamuses +wan +wanapum +wanchancy +wand +wander +wanderable +wandered +wanderer +wanderers +wandery +wanderyear +wandering +wanderingly +wanderingness +wanderings +wanderjahr +wanderlust +wanderluster +wanderlustful +wanderoo +wanderoos +wanders +wandflower +wandy +wandle +wandlike +wandoo +wandorobo +wandought +wandreth +wands +wandsman +wane +waneatta +waned +waney +waneless +wanely +wanes +wang +wanga +wangala +wangan +wangans +wangara +wangateur +wanger +wanghee +wangle +wangled +wangler +wanglers +wangles +wangling +wangoni +wangrace +wangtooth +wangun +wanguns +wanhap +wanhappy +wanhope +wanhorn +wany +wanyakyusa +wanyamwezi +waniand +wanyasa +wanier +waniest +wanigan +wanigans +waning +wanion +wanions +wanyoro +wank +wankapin +wankel +wanker +wanky +wankle +wankly +wankliness +wanlas +wanle +wanly +wanmol +wanna +wanned +wanner +wanness +wannesses +wannest +wanny +wannigan +wannigans +wanning +wannish +wanrest +wanrestful +wanrufe +wanruly +wans +wanshape +wansith +wansome +wansonsy +want +wantage +wantages +wanted +wanter +wanters +wantful +wanthill +wanthrift +wanthriven +wanty +wanting +wantingly +wantingness +wantless +wantlessness +wanton +wantoned +wantoner +wantoners +wantoning +wantonize +wantonly +wantonlike +wantonness +wantons +wantroke +wantrust +wants +wantwit +wanweird +wanwit +wanwordy +wanworth +wanze +wap +wapacut +wapata +wapato +wapatoo +wapatoos +wapentake +wapinschaw +wapisiana +wapiti +wapitis +wapogoro +wapokomo +wapp +wappato +wapped +wappened +wappenschaw +wappenschawing +wappenshaw +wappenshawing +wapper +wapperjaw +wapperjawed +wappet +wapping +wappinger +wappo +waps +war +warabi +waragi +warantee +waratah +warb +warbird +warbite +warble +warbled +warblelike +warbler +warblerlike +warblers +warbles +warblet +warbly +warbling +warblingly +warbonnet +warch +warcraft +warcrafts +ward +wardable +wardage +warday +wardapet +wardatour +wardcors +warded +warden +wardency +wardenry +wardenries +wardens +wardenship +warder +warderer +warders +wardership +wardholding +wardian +warding +wardite +wardless +wardlike +wardmaid +wardman +wardmen +wardmote +wardress +wardresses +wardrobe +wardrober +wardrobes +wardroom +wardrooms +wards +wardship +wardships +wardsmaid +wardsman +wardswoman +wardwite +wardwoman +wardwomen +wardword +ware +wared +wareful +waregga +warehou +warehouse +warehouseage +warehoused +warehouseful +warehouseman +warehousemen +warehouser +warehousers +warehouses +warehousing +wareless +warely +waremaker +waremaking +wareman +warentment +wareroom +warerooms +wares +wareship +warf +warfare +warfared +warfarer +warfares +warfarin +warfaring +warfarins +warful +wargus +warhead +warheads +warhorse +warhorses +wary +wariance +wariangle +waried +warier +wariest +warily +wariment +warine +wariness +warinesses +waring +waringin +warish +warison +warisons +warytree +wark +warkamoowee +warked +warking +warkloom +warklume +warks +warl +warless +warlessly +warlessness +warly +warlike +warlikely +warlikeness +warling +warlock +warlockry +warlocks +warlord +warlordism +warlords +warlow +warluck +warm +warmable +warmaker +warmakers +warmaking +warman +warmblooded +warmed +warmedly +warmen +warmer +warmers +warmest +warmful +warmhearted +warmheartedly +warmheartedness +warmhouse +warming +warmish +warmly +warmmess +warmness +warmnesses +warmonger +warmongering +warmongers +warmouth +warmouths +warms +warmth +warmthless +warmthlessness +warmths +warmup +warmups +warmus +warn +warnage +warned +warnel +warner +warners +warning +warningly +warningproof +warnings +warnish +warnison +warniss +warnoth +warns +warnt +warori +warp +warpable +warpage +warpages +warpath +warpaths +warped +warper +warpers +warping +warplane +warplanes +warple +warplike +warpower +warpowers +warproof +warps +warpwise +warracoori +warragal +warragals +warray +warrambool +warran +warrand +warrandice +warrant +warrantability +warrantable +warrantableness +warrantably +warranted +warrantedly +warrantedness +warrantee +warranteed +warrantees +warranter +warranty +warranties +warranting +warrantise +warrantize +warrantless +warranto +warrantor +warrantors +warrants +warratau +warrau +warred +warree +warren +warrener +warreners +warrenlike +warrens +warrer +warri +warrigal +warrigals +warrin +warryn +warring +warrior +warrioress +warriorhood +warriorism +warriorlike +warriors +warriorship +warriorwise +warrish +warrok +warrty +wars +warsaw +warsaws +warse +warsel +warship +warships +warsle +warsled +warsler +warslers +warsles +warsling +warst +warstle +warstled +warstler +warstlers +warstles +warstling +wart +warted +wartern +wartflower +warth +warthog +warthogs +warty +wartyback +wartier +wartiest +wartime +wartimes +wartiness +wartless +wartlet +wartlike +wartproof +warts +wartweed +wartwort +warua +warundi +warve +warwards +warwick +warwickite +warwolf +warwork +warworker +warworks +warworn +was +wasabi +wasagara +wasandawi +wasango +wasat +wasatch +wasco +wase +wasegua +wasel +wash +washability +washable +washableness +washaki +washaway +washbasin +washbasins +washbasket +washboard +washboards +washbowl +washbowls +washbrew +washcloth +washcloths +washday +washdays +washdish +washdown +washed +washen +washer +washery +washeries +washeryman +washerymen +washerless +washerman +washermen +washers +washerwife +washerwoman +washerwomen +washes +washhand +washhouse +washy +washier +washiest +washin +washiness +washing +washings +washington +washingtonia +washingtonian +washingtoniana +washingtonians +washita +washland +washleather +washmaid +washman +washmen +washo +washoan +washoff +washout +washouts +washpot +washproof +washrag +washrags +washroad +washroom +washrooms +washshed +washstand +washstands +washtail +washtray +washtrough +washtub +washtubs +washup +washway +washwoman +washwomen +washwork +wasir +wasn +wasnt +wasoga +wasp +waspen +wasphood +waspy +waspier +waspiest +waspily +waspiness +waspish +waspishly +waspishness +wasplike +waspling +waspnesting +wasps +wassail +wassailed +wassailer +wassailers +wassailing +wassailous +wassailry +wassails +wassie +wast +wastabl +wastable +wastage +wastages +waste +wastebasket +wastebaskets +wastebin +wasteboard +wasted +wasteful +wastefully +wastefulness +wasteyard +wastel +wasteland +wastelands +wastelbread +wasteless +wastely +wastelot +wastelots +wasteman +wastemen +wastement +wasteness +wastepaper +wastepile +wasteproof +waster +wasterful +wasterfully +wasterfulness +wastery +wasterie +wasteries +wastern +wasters +wastes +wastethrift +wasteway +wasteways +wastewater +wasteweir +wasteword +wasty +wastier +wastiest +wastine +wasting +wastingly +wastingness +wastland +wastme +wastrel +wastrels +wastry +wastrie +wastries +wastrife +wasts +wasukuma +waswahili +wat +watala +watap +watape +watapeh +watapes +wataps +watch +watchable +watchband +watchbands +watchbill +watchboat +watchcase +watchcry +watchcries +watchdog +watchdogged +watchdogging +watchdogs +watched +watcheye +watcheyes +watcher +watchers +watches +watchet +watchfire +watchfree +watchful +watchfully +watchfulness +watchglass +watchglassful +watchhouse +watching +watchingly +watchings +watchkeeper +watchless +watchlessness +watchmake +watchmaker +watchmakers +watchmaking +watchman +watchmanly +watchmanship +watchmate +watchmen +watchment +watchout +watchouts +watchstrap +watchtower +watchtowers +watchwise +watchwoman +watchwomen +watchword +watchwords +watchwork +watchworks +water +waterage +waterages +waterbailage +waterbank +waterbear +waterbed +waterbeds +waterbelly +waterberg +waterblink +waterbloom +waterboard +waterbok +waterborne +waterbosh +waterbottle +waterbound +waterbrain +waterbroo +waterbrose +waterbuck +waterbucks +waterbury +waterbush +watercart +watercaster +waterchat +watercycle +watercolor +watercoloring +watercolorist +watercolors +watercolour +watercolourist +watercourse +watercourses +watercraft +watercress +watercresses +watercup +waterdoe +waterdog +waterdogs +waterdrop +watered +waterer +waterers +waterfall +waterfalls +waterfinder +waterflood +waterfowl +waterfowler +waterfowls +waterfree +waterfront +waterfronts +watergate +waterglass +waterhead +waterheap +waterhorse +watery +waterie +waterier +wateriest +waterily +wateriness +watering +wateringly +wateringman +waterings +waterish +waterishly +waterishness +waterlander +waterlandian +waterleaf +waterleafs +waterleave +waterleaves +waterless +waterlessly +waterlessness +waterlike +waterlily +waterlilies +waterlilly +waterline +waterlocked +waterlog +waterlogged +waterloggedness +waterlogger +waterlogging +waterlogs +waterloo +waterloos +watermain +waterman +watermanship +watermark +watermarked +watermarking +watermarks +watermaster +watermelon +watermelons +watermen +watermonger +waterphone +waterpit +waterplane +waterpot +waterpower +waterproof +waterproofed +waterproofer +waterproofing +waterproofness +waterproofs +waterquake +waterrug +waters +waterscape +watershake +watershed +watersheds +watershoot +watershut +waterside +watersider +waterskier +waterskiing +waterskin +watersmeet +watersoaked +waterspout +waterspouts +waterstead +waterstoup +watertight +watertightal +watertightness +waterway +waterways +waterwall +waterward +waterwards +waterweed +waterwheel +waterwise +waterwoman +waterwood +waterwork +waterworker +waterworks +waterworm +waterworn +waterwort +waterworthy +watfiv +wath +wather +wathstead +wats +watson +watsonia +watt +wattage +wattages +wattape +wattapes +watteau +watter +wattest +watthour +watthours +wattis +wattle +wattlebird +wattleboy +wattled +wattles +wattless +wattlework +wattling +wattman +wattmen +wattmeter +watts +wattsecond +watusi +waubeen +wauble +wauch +wauchle +waucht +wauchted +wauchting +wauchts +wauf +waufie +waugh +waughy +waught +waughted +waughting +waughts +wauk +wauked +wauken +wauking +waukit +waukrife +wauks +waul +wauled +wauling +wauls +waumle +wauner +wauns +waup +waur +waura +wauregan +wauve +wavable +wavably +wave +waveband +wavebands +waved +waveform +waveforms +wavefront +wavefronts +waveguide +waveguides +wavey +waveys +wavelength +wavelengths +waveless +wavelessly +wavelessness +wavelet +wavelets +wavelike +wavellite +wavemark +wavement +wavemeter +wavenumber +waveoff +waveoffs +waveproof +waver +waverable +wavered +waverer +waverers +wavery +wavering +waveringly +waveringness +waverous +wavers +waves +waveshape +waveson +waveward +wavewise +wavy +waviata +wavicle +wavier +wavies +waviest +wavily +waviness +wavinesses +waving +wavingly +wavira +waw +wawa +wawah +wawaskeesh +wawl +wawled +wawling +wawls +waws +wax +waxand +waxberry +waxberries +waxbill +waxbills +waxbird +waxbush +waxchandler +waxchandlery +waxcomb +waxed +waxen +waxer +waxers +waxes +waxflower +waxhaw +waxhearted +waxy +waxier +waxiest +waxily +waxiness +waxinesses +waxing +waxingly +waxings +waxlike +waxmaker +waxmaking +waxman +waxplant +waxplants +waxweed +waxweeds +waxwing +waxwings +waxwork +waxworker +waxworking +waxworks +waxworm +waxworms +wazir +wazirate +wazirship +wb +wc +wd +we +wea +weak +weakbrained +weaken +weakened +weakener +weakeners +weakening +weakens +weaker +weakest +weakfish +weakfishes +weakhanded +weakhearted +weakheartedly +weakheartedness +weaky +weakish +weakishly +weakishness +weakly +weaklier +weakliest +weakliness +weakling +weaklings +weakmouthed +weakness +weaknesses +weal +weald +wealden +wealdish +wealds +wealdsman +wealdsmen +wealful +weals +wealsman +wealsome +wealth +wealthful +wealthfully +wealthy +wealthier +wealthiest +wealthily +wealthiness +wealthless +wealthmaker +wealthmaking +wealthmonger +wealths +weam +wean +weanable +weaned +weanedness +weanel +weaner +weaners +weanie +weanyer +weaning +weanly +weanling +weanlings +weanoc +weans +weapemeoc +weapon +weaponed +weaponeer +weaponing +weaponless +weaponmaker +weaponmaking +weaponproof +weaponry +weaponries +weapons +weaponshaw +weaponshow +weaponshowing +weaponsmith +weaponsmithy +weapschawing +wear +wearability +wearable +wearables +weared +wearer +wearers +weary +weariable +weariableness +wearied +weariedly +weariedness +wearier +wearies +weariest +weariful +wearifully +wearifulness +wearying +wearyingly +weariless +wearilessly +wearily +weariness +wearing +wearingly +wearish +wearishly +wearishness +wearisome +wearisomely +wearisomeness +wearproof +wears +weasand +weasands +weasel +weaseled +weaselfish +weaseling +weaselly +weasellike +weasels +weaselship +weaselskin +weaselsnout +weaselwise +weaser +weason +weasons +weather +weatherability +weatherbeaten +weatherboard +weatherboarding +weatherbound +weatherbreak +weathercast +weathercock +weathercocky +weathercockish +weathercockism +weathercocks +weathered +weatherer +weatherfish +weatherfishes +weatherglass +weatherglasses +weathergleam +weatherhead +weatherheaded +weathery +weathering +weatherize +weatherly +weatherliness +weathermaker +weathermaking +weatherman +weathermen +weathermost +weatherology +weatherologist +weatherproof +weatherproofed +weatherproofing +weatherproofness +weatherproofs +weathers +weathersick +weatherstrip +weatherstripped +weatherstrippers +weatherstripping +weatherstrips +weathertight +weathertightness +weatherward +weatherwise +weatherworn +weatings +weavable +weave +weaveable +weaved +weavement +weaver +weaverbird +weaveress +weavers +weaves +weaving +weazand +weazands +weazen +weazened +weazeny +web +webbed +webber +webby +webbier +webbiest +webbing +webbings +webeye +webelos +weber +weberian +webers +webfed +webfeet +webfoot +webfooted +webfooter +webless +weblike +webmaker +webmaking +webs +webster +websterian +websterite +websters +webwheel +webwork +webworm +webworms +webworn +wecche +wecht +wechts +wed +wedana +wedbed +wedbedrip +wedded +weddedly +weddedness +weddeed +wedder +wedders +wedding +weddinger +weddings +wede +wedel +wedeled +wedeling +wedeln +wedelns +wedels +wedfee +wedge +wedgeable +wedgebill +wedged +wedgelike +wedger +wedges +wedgewise +wedgy +wedgie +wedgier +wedgies +wedgiest +wedging +wedgwood +wedlock +wedlocks +wednesday +wednesdays +weds +wedset +wee +weeble +weed +weeda +weedable +weedage +weeded +weeder +weedery +weeders +weedful +weedhook +weedy +weedicide +weedier +weediest +weedily +weediness +weeding +weedingtime +weedish +weedkiller +weedless +weedlike +weedling +weedow +weedproof +weeds +week +weekday +weekdays +weekend +weekended +weekender +weekending +weekends +weekly +weeklies +weekling +weeklong +weeknight +weeknights +weeks +weekwam +weel +weelfard +weelfaured +weem +weemen +ween +weendigo +weened +weeness +weeny +weenie +weenier +weenies +weeniest +weening +weenong +weens +weensy +weensier +weensiest +weent +weenty +weep +weepable +weeped +weeper +weepered +weepers +weepful +weepy +weepier +weepiest +weepiness +weeping +weepingly +weeply +weeps +weer +weerish +wees +weesh +weeshee +weeshy +weest +weet +weetbird +weeted +weety +weeting +weetless +weets +weever +weevers +weevil +weeviled +weevily +weevilled +weevilly +weevillike +weevilproof +weevils +weewaw +weewee +weeweed +weeweeing +weewees +weewow +weeze +weezle +wef +weft +weftage +wefted +wefty +wefts +weftwise +weftwize +wega +wegenerian +wegotism +wehee +wehner +wehrlite +wei +wey +weibyeite +weichselwood +weierstrassian +weigela +weigelas +weigelia +weigelias +weigelite +weigh +weighable +weighage +weighbar +weighbauk +weighbeam +weighbridge +weighbridgeman +weighed +weigher +weighers +weighership +weighhouse +weighin +weighing +weighings +weighlock +weighman +weighmaster +weighmen +weighment +weighs +weighshaft +weight +weightchaser +weighted +weightedly +weightedness +weighter +weighters +weighty +weightier +weightiest +weightily +weightiness +weighting +weightings +weightless +weightlessly +weightlessness +weightlifter +weightlifting +weightometer +weights +weightwith +weilang +weimaraner +weymouth +weinbergerite +weiner +weiners +weinmannia +weinschenkite +weir +weirangle +weird +weirder +weirdest +weirdful +weirdy +weirdie +weirdies +weirdish +weirdless +weirdlessness +weirdly +weirdlike +weirdliness +weirdness +weirdo +weirdoes +weirdos +weirds +weirdsome +weirdward +weirdwoman +weirdwomen +weiring +weirless +weirs +weys +weisbachite +weiselbergite +weisenheimer +weism +weismannian +weismannism +weissite +weissnichtwo +weitspekan +wejack +weka +wekas +wekau +wekeen +weki +welch +welched +welcher +welchers +welches +welching +welcome +welcomed +welcomeless +welcomely +welcomeness +welcomer +welcomers +welcomes +welcoming +welcomingly +weld +weldability +weldable +welded +welder +welders +welding +weldless +weldment +weldments +weldor +weldors +welds +welf +welfare +welfares +welfaring +welfarism +welfarist +welfaristic +welfic +weli +welk +welkin +welkinlike +welkins +well +wellacquainted +welladay +welladays +welladvised +wellaffected +wellat +wellaway +wellaways +wellbeing +wellborn +wellbred +wellchosen +wellconnected +wellcontent +wellcurb +wellcurbs +welldecked +welldoer +welldoers +welldoing +welldone +welled +weller +welleresque +wellerism +wellfound +wellfounded +wellhead +wellheads +wellhole +wellholes +wellhouse +wellhouses +welly +wellyard +wellies +welling +wellington +wellingtonia +wellingtonian +wellish +wellknown +wellmaker +wellmaking +wellman +wellmen +wellmost +wellnear +wellness +wellnesses +wellnigh +wellpoint +wellqueme +wellread +wellring +wells +wellseen +wellset +wellsian +wellside +wellsite +wellsites +wellspoken +wellspring +wellsprings +wellstead +wellstrand +wels +welsbach +welsh +welshed +welsher +welshery +welshers +welshes +welshy +welshing +welshism +welshland +welshlike +welshman +welshmen +welshness +welshry +welshwoman +welshwomen +welsium +welsom +welt +weltanschauung +weltanschauungen +welted +welter +weltered +weltering +welters +welterweight +welterweights +welting +weltings +welts +weltschmerz +welwitschia +wem +wemless +wemmy +wemodness +wen +wench +wenched +wenchel +wencher +wenchers +wenches +wenching +wenchless +wenchlike +wenchman +wenchmen +wenchow +wenchowese +wend +wende +wended +wendell +wendi +wendy +wendic +wendigo +wendigos +wending +wendish +wends +wene +weneth +wenliche +wenlock +wenlockian +wennebergite +wenny +wennier +wenniest +wennish +wenonah +wenrohronon +wens +wensleydale +went +wentle +wentletrap +wenzel +wepman +wepmankin +wept +wer +werchowinci +were +wereass +werebear +wereboar +werecalf +werecat +werecrocodile +werefolk +werefox +weregild +weregilds +werehare +werehyena +werejaguar +wereleopard +werelion +weren +werent +weretiger +werewall +werewolf +werewolfish +werewolfism +werewolves +werf +wergeld +wergelds +wergelt +wergelts +wergil +wergild +wergilds +weri +wering +wermethe +wernard +werner +wernerian +wernerism +wernerite +weroole +werowance +wersh +werslete +werste +wert +werther +wertherian +wertherism +wervel +werwolf +werwolves +wes +wese +weskit +weskits +wesley +wesleyan +wesleyanism +wesleyans +wesleyism +wessand +wessands +wessel +wesselton +wessexman +west +westabout +westaway +westbound +weste +wester +westered +westering +westerly +westerlies +westerliness +westerling +westermost +western +westerner +westerners +westernisation +westernise +westernised +westernising +westernism +westernization +westernize +westernized +westernizes +westernizing +westernly +westernmost +westerns +westers +westerwards +westfalite +westham +westy +westing +westinghouse +westings +westlan +westland +westlander +westlandways +westlaw +westlin +westling +westlings +westlins +westme +westmeless +westminster +westmost +westness +westnorthwestwardly +westphalia +westphalian +westralian +westralianism +wests +westward +westwardly +westwardmost +westwards +westwork +wet +weta +wetback +wetbacks +wetbird +wetched +wetchet +wether +wetherhog +wethers +wetherteg +wetland +wetlands +wetly +wetness +wetnesses +wetproof +wets +wetsuit +wettability +wettable +wetted +wetter +wetters +wettest +wetting +wettings +wettish +wettishness +wetumpka +weve +wevet +wewenoc +wezen +wezn +wf +wg +wh +wha +whabby +whack +whacked +whacker +whackers +whacky +whackier +whackiest +whacking +whacks +whaddie +whafabout +whale +whaleback +whalebacker +whalebird +whaleboat +whaleboats +whalebone +whaleboned +whalebones +whaled +whaledom +whalehead +whalelike +whaleman +whalemen +whaler +whalery +whaleries +whaleroad +whalers +whales +whaleship +whalesucker +whaly +whaling +whalings +whalish +whally +whallock +whalm +whalp +wham +whamble +whame +whammed +whammy +whammies +whamming +whammle +whammo +whamp +whampee +whample +whams +whan +whand +whang +whangable +whangam +whangdoodle +whanged +whangee +whangees +whangers +whanghee +whanging +whangs +whank +whap +whapped +whapper +whappers +whappet +whapping +whaps +whapuka +whapukee +whapuku +whar +whare +whareer +wharf +wharfage +wharfages +wharfe +wharfed +wharfhead +wharfholder +wharfie +wharfing +wharfinger +wharfingers +wharfland +wharfless +wharfman +wharfmaster +wharfmen +wharfrae +wharfs +wharfside +wharl +wharp +wharry +wharrow +whart +whartonian +wharve +wharves +whase +whasle +what +whata +whatabouts +whatchy +whatd +whatever +whatkin +whatlike +whatman +whatna +whatness +whatnot +whatnots +whatre +whatreck +whats +whatsis +whatso +whatsoeer +whatsoever +whatsomever +whatten +whatzit +whau +whauk +whaup +whaups +whaur +whauve +wheal +whealed +whealy +whealing +wheals +whealworm +wheam +wheat +wheatbird +wheatear +wheateared +wheatears +wheaten +wheatflakes +wheatgrass +wheatgrower +wheaty +wheaties +wheatland +wheatless +wheatlike +wheatmeal +wheats +wheatstalk +wheatstone +wheatworm +whedder +whee +wheedle +wheedled +wheedler +wheedlers +wheedles +wheedlesome +wheedling +wheedlingly +wheel +wheelabrate +wheelabrated +wheelabrating +wheelage +wheelband +wheelbarrow +wheelbarrower +wheelbarrowful +wheelbarrows +wheelbase +wheelbases +wheelbird +wheelbox +wheelchair +wheelchairs +wheeldom +wheeled +wheeler +wheelery +wheelerite +wheelers +wheelhorse +wheelhouse +wheelhouses +wheely +wheelie +wheelies +wheeling +wheelingly +wheelings +wheelless +wheellike +wheelmaker +wheelmaking +wheelman +wheelmen +wheelrace +wheelroad +wheels +wheelsman +wheelsmen +wheelsmith +wheelspin +wheelswarf +wheelway +wheelwise +wheelwork +wheelworks +wheelwright +wheelwrighting +wheelwrights +wheem +wheen +wheencat +wheenge +wheens +wheep +wheeped +wheeping +wheeple +wheepled +wheeples +wheepling +wheeps +wheer +wheerikins +wheesht +wheetle +wheeze +wheezed +wheezer +wheezers +wheezes +wheezy +wheezier +wheeziest +wheezily +wheeziness +wheezing +wheezingly +wheezle +wheft +whey +wheybeard +wheybird +wheyey +wheyeyness +wheyface +wheyfaced +wheyfaces +wheyish +wheyishness +wheyisness +wheylike +whein +wheyness +wheys +wheyworm +wheywormed +whekau +wheki +whelk +whelked +whelker +whelky +whelkier +whelkiest +whelklike +whelks +whelm +whelmed +whelming +whelms +whelp +whelped +whelphood +whelping +whelpish +whelpless +whelpling +whelps +whelve +whemmel +whemmle +when +whenabouts +whenas +whence +whenceeer +whenceforth +whenceforward +whencesoeer +whencesoever +whencever +wheneer +whenever +whenness +whens +whenso +whensoever +whensomever +where +whereabout +whereabouts +whereafter +whereanent +whereas +whereases +whereat +whereaway +whereby +whered +whereer +wherefor +wherefore +wherefores +whereforth +wherefrom +wherehence +wherein +whereinsoever +whereinto +whereis +whereness +whereof +whereon +whereout +whereover +wherere +wheres +whereso +wheresoeer +wheresoever +wheresomever +wherethrough +wheretill +whereto +wheretoever +wheretosoever +whereunder +whereuntil +whereunto +whereup +whereupon +wherever +wherewith +wherewithal +wherret +wherry +wherried +wherries +wherrying +wherryman +wherrit +wherve +wherves +whesten +whet +whether +whetile +whetrock +whets +whetstone +whetstones +whetted +whetter +whetters +whetting +whew +whewellite +whewer +whewl +whews +whewt +whf +why +whiba +which +whichever +whichsoever +whichway +whichways +whick +whicken +whicker +whickered +whickering +whickers +whid +whidah +whydah +whidahs +whydahs +whidded +whidder +whidding +whids +whyever +whiff +whiffable +whiffed +whiffenpoof +whiffer +whiffers +whiffet +whiffets +whiffy +whiffing +whiffle +whiffled +whiffler +whifflery +whiffleries +whifflers +whiffles +whiffletree +whiffletrees +whiffling +whifflingly +whiffs +whyfor +whift +whig +whiggamore +whiggarchy +whigged +whiggery +whiggess +whiggify +whiggification +whigging +whiggish +whiggishly +whiggishness +whiggism +whiglet +whigling +whigmaleery +whigmaleerie +whigmaleeries +whigmeleerie +whigs +whigship +whikerby +while +whileas +whiled +whileen +whiley +whilend +whilere +whiles +whilie +whiling +whilk +whilkut +whill +whillaballoo +whillaloo +whilly +whillikers +whillikins +whillilew +whillywha +whilock +whilom +whils +whilst +whilter +whim +whimberry +whimble +whimbrel +whimbrels +whimling +whimmed +whimmy +whimmier +whimmiest +whimming +whimper +whimpered +whimperer +whimpering +whimperingly +whimpers +whims +whimsey +whimseys +whimsy +whimsic +whimsical +whimsicality +whimsicalities +whimsically +whimsicalness +whimsied +whimsies +whimstone +whimwham +whimwhams +whin +whinberry +whinberries +whinchacker +whinchat +whinchats +whincheck +whincow +whindle +whine +whined +whiney +whiner +whiners +whines +whyness +whinestone +whing +whinge +whinger +whiny +whinyard +whinier +whiniest +whininess +whining +whiningly +whinnel +whinner +whinny +whinnied +whinnier +whinnies +whinniest +whinnying +whinnock +whins +whinstone +whyo +whip +whipbelly +whipbird +whipcat +whipcord +whipcordy +whipcords +whipcrack +whipcracker +whipcraft +whipgraft +whipjack +whipking +whiplash +whiplashes +whiplike +whipmaker +whipmaking +whipman +whipmanship +whipmaster +whipoorwill +whippa +whippable +whipparee +whipped +whipper +whipperginny +whippers +whippersnapper +whippersnappers +whippertail +whippet +whippeter +whippets +whippy +whippier +whippiest +whippiness +whipping +whippingly +whippings +whippletree +whippoorwill +whippoorwills +whippost +whippowill +whipray +whiprays +whips +whipsaw +whipsawed +whipsawyer +whipsawing +whipsawn +whipsaws +whipship +whipsocket +whipstaff +whipstaffs +whipstalk +whipstall +whipstaves +whipster +whipstick +whipstitch +whipstitching +whipstock +whipt +whiptail +whiptails +whiptree +whipwise +whipworm +whipworms +whir +whirken +whirl +whirlabout +whirlbat +whirlblast +whirlbone +whirlbrain +whirled +whirley +whirler +whirlers +whirlgig +whirly +whirlybird +whirlybirds +whirlicane +whirlicote +whirlier +whirlies +whirliest +whirligig +whirligigs +whirlygigum +whirlimagig +whirling +whirlingly +whirlmagee +whirlpit +whirlpool +whirlpools +whirlpuff +whirls +whirlwig +whirlwind +whirlwindy +whirlwindish +whirlwinds +whirr +whirred +whirrey +whirret +whirry +whirrick +whirried +whirries +whirrying +whirring +whirroo +whirrs +whirs +whirtle +whys +whish +whished +whishes +whishing +whisht +whishted +whishting +whishts +whisk +whiskbroom +whisked +whiskey +whiskeys +whisker +whiskerage +whiskerando +whiskerandoed +whiskerandos +whiskered +whiskerer +whiskerette +whiskery +whiskerless +whiskerlike +whiskers +whisket +whiskful +whisky +whiskied +whiskies +whiskified +whiskyfied +whiskylike +whiskin +whisking +whiskingly +whisks +whisp +whisper +whisperable +whisperation +whispered +whisperer +whisperhood +whispery +whispering +whisperingly +whisperingness +whisperings +whisperless +whisperous +whisperously +whisperproof +whispers +whiss +whissle +whisson +whist +whisted +whister +whisterpoop +whisting +whistle +whistleable +whistlebelly +whistled +whistlefish +whistlefishes +whistlelike +whistler +whistlerian +whistlerism +whistlers +whistles +whistlewing +whistlewood +whistly +whistlike +whistling +whistlingly +whistness +whistonian +whists +whit +whitblow +white +whiteacre +whiteback +whitebait +whitebark +whitebeam +whitebeard +whitebelly +whitebelt +whiteberry +whitebill +whitebird +whiteblaze +whiteblow +whiteboy +whiteboyism +whitebottle +whitecap +whitecapper +whitecapping +whitecaps +whitechapel +whitecoat +whitecomb +whitecorn +whitecup +whited +whitedamp +whiteface +whitefeet +whitefieldian +whitefieldism +whitefieldite +whitefish +whitefisher +whitefishery +whitefishes +whitefly +whiteflies +whitefoot +whitefootism +whitehall +whitehanded +whitehass +whitehawse +whitehead +whiteheads +whiteheart +whitehearted +whitey +whiteys +whitely +whitelike +whiteline +whiten +whitened +whitener +whiteners +whiteness +whitening +whitenose +whitens +whiteout +whiteouts +whitepot +whiter +whiteroot +whiterump +whites +whitesark +whiteseam +whiteshank +whiteside +whiteslave +whitesmith +whitespace +whitest +whitestone +whitestraits +whitetail +whitethorn +whitethroat +whitetip +whitetop +whitevein +whiteveins +whitewall +whitewalls +whitewards +whiteware +whitewash +whitewashed +whitewasher +whitewashes +whitewashing +whiteweed +whitewing +whitewood +whiteworm +whitewort +whitfield +whitfinch +whither +whitherso +whithersoever +whitherto +whitherward +whitherwards +whity +whitier +whities +whitiest +whitin +whiting +whitings +whitish +whitishness +whitleather +whitleyism +whitling +whitlow +whitlows +whitlowwort +whitman +whitmanese +whitmanesque +whitmanism +whitmanize +whitmonday +whitney +whitneyite +whitrack +whitracks +whitret +whits +whitster +whitsun +whitsunday +whitsuntide +whittaw +whittawer +whitten +whittener +whitter +whitterick +whitters +whittle +whittled +whittler +whittlers +whittles +whittling +whittlings +whittret +whittrets +whittrick +whitworth +whiz +whizbang +whizbangs +whizgig +whizz +whizzbang +whizzed +whizzer +whizzerman +whizzers +whizzes +whizziness +whizzing +whizzingly +whizzle +who +whoa +whod +whodunit +whodunits +whodunnit +whoever +whole +wholefood +wholehearted +wholeheartedly +wholeheartedness +wholely +wholemeal +wholeness +wholes +wholesale +wholesaled +wholesalely +wholesaleness +wholesaler +wholesalers +wholesales +wholesaling +wholesome +wholesomely +wholesomeness +wholesomer +wholesomest +wholetone +wholewheat +wholewise +wholism +wholisms +wholistic +wholl +wholly +whom +whomble +whomever +whomp +whomped +whomping +whomps +whomso +whomsoever +whone +whoo +whoof +whoop +whoope +whooped +whoopee +whoopees +whooper +whoopers +whooping +whoopingly +whoopla +whooplas +whooplike +whoops +whooses +whoosh +whooshed +whooshes +whooshing +whoosy +whoosies +whoosis +whoosises +whoot +whop +whopped +whopper +whoppers +whopping +whops +whorage +whore +whored +whoredom +whoredoms +whorehouse +whorehouses +whoreishly +whoreishness +whorelike +whoremaster +whoremastery +whoremasterly +whoremonger +whoremongering +whoremonging +whores +whoreship +whoreson +whoresons +whory +whoring +whorish +whorishly +whorishness +whorl +whorle +whorled +whorlflower +whorly +whorlywort +whorls +whorry +whort +whortle +whortleberry +whortleberries +whortles +whorts +whose +whosen +whosesoever +whosever +whosis +whosises +whoso +whosoever +whosome +whosomever +whosumdever +whr +whs +whse +whsle +whud +whuff +whuffle +whulk +whulter +whummle +whump +whumped +whumping +whumps +whun +whunstane +whup +whush +whuskie +whussle +whute +whuther +whutter +whuttering +whuz +wi +wy +wyandot +wyandotte +wibble +wicca +wice +wich +wych +wiches +wyches +wichita +wicht +wichtisite +wichtje +wick +wickape +wickapes +wickawee +wicked +wickeder +wickedest +wickedish +wickedly +wickedlike +wickedness +wicken +wicker +wickerby +wickers +wickerware +wickerwork +wickerworked +wickerworker +wicket +wicketkeep +wicketkeeper +wicketkeeping +wickets +wicketwork +wicky +wicking +wickings +wickiup +wickyup +wickiups +wickyups +wickless +wicks +wickthing +wickup +wycliffian +wycliffism +wycliffist +wycliffite +wyclifian +wyclifism +wyclifite +wicopy +wicopies +wid +widbin +widdendream +widder +widders +widdershins +widdy +widdie +widdies +widdifow +widdle +widdled +widdles +widdling +widdrim +wide +wyde +wideawake +wideband +widegab +widegap +widehearted +widely +widemouthed +widen +widened +widener +wideners +wideness +widenesses +widening +widens +wider +widershins +wides +widespread +widespreadedly +widespreading +widespreadly +widespreadness +widest +widewhere +widework +widgeon +widgeons +widget +widgets +widgie +widish +widorror +widow +widowed +widower +widowered +widowerhood +widowery +widowers +widowership +widowhood +widowy +widowing +widowish +widowly +widowlike +widowman +widowmen +widows +width +widthless +widths +widthway +widthways +widthwise +widu +wye +wied +wiedersehen +wielare +wield +wieldable +wieldableness +wielded +wielder +wielders +wieldy +wieldier +wieldiest +wieldiness +wielding +wields +wiener +wieners +wienerwurst +wienie +wienies +wierangle +wierd +wyes +wiesenboden +wyethia +wife +wifecarl +wifed +wifedom +wifedoms +wifehood +wifehoods +wifeism +wifekin +wifeless +wifelessness +wifelet +wifely +wifelier +wifeliest +wifelike +wifeliness +wifeling +wifelkin +wifes +wifeship +wifething +wifeward +wifie +wifiekie +wifing +wifish +wifock +wig +wigan +wigans +wigdom +wigeling +wigeon +wigeons +wigful +wigged +wiggen +wigger +wiggery +wiggeries +wiggy +wigging +wiggings +wiggish +wiggishness +wiggism +wiggle +wiggled +wiggler +wigglers +wiggles +wiggly +wigglier +wiggliest +wiggling +wigher +wight +wightly +wightness +wights +wigless +wiglet +wiglets +wiglike +wigmake +wigmaker +wigmakers +wigmaking +wigs +wigtail +wigwag +wigwagged +wigwagger +wigwagging +wigwags +wigwam +wigwams +wiyat +wiikite +wiyot +wyke +wykehamical +wykehamist +wikeno +wiking +wikiup +wikiups +wikiwiki +wikstroemia +wilbur +wilburite +wilco +wilcoxon +wilcweme +wild +wildbore +wildcard +wildcat +wildcats +wildcatted +wildcatter +wildcatting +wildebeest +wildebeeste +wildebeests +wilded +wilder +wildered +wilderedly +wildering +wilderment +wildern +wilderness +wildernesses +wilders +wildest +wildfire +wildfires +wildflower +wildflowers +wildfowl +wildfowler +wildfowling +wildfowls +wildgrave +wilding +wildings +wildish +wildishly +wildishness +wildly +wildlife +wildlike +wildling +wildlings +wildness +wildnesses +wilds +wildsome +wildtype +wildwind +wildwood +wildwoods +wile +wyle +wiled +wyled +wileful +wileless +wileproof +wiles +wyles +wilfred +wilful +wilfully +wilfulness +wilga +wilgers +wilhelm +wilhelmina +wilhelmine +wily +wilycoat +wyliecoat +wilier +wiliest +wilily +wiliness +wilinesses +wiling +wyling +wiliwili +wilk +wilkeite +wilkin +wilkinson +will +willable +willawa +willble +willed +willedness +willey +willeyer +willemite +willer +willers +willes +willet +willets +willful +willfully +willfulness +willi +willy +william +williamite +williams +williamsite +williamsonia +williamsoniaceae +willyard +willyart +williche +willie +willied +willier +willyer +willies +williewaucht +willying +willing +willinger +willingest +willinghearted +willinghood +willingly +willingness +williwau +williwaus +williwaw +willywaw +williwaws +willywaws +willmaker +willmaking +willness +willock +willow +willowbiter +willowed +willower +willowers +willowherb +willowy +willowier +willowiest +willowiness +willowing +willowish +willowlike +willows +willowware +willowweed +willowworm +willowwort +willpower +wills +willugbaeya +wilmer +wilning +wilrone +wilroun +wilsome +wilsomely +wilsomeness +wilson +wilsonian +wilt +wilted +wilter +wilting +wilton +wiltproof +wilts +wiltshire +wim +wimberry +wimble +wimbled +wimblelike +wimbles +wimbling +wimbrel +wime +wimick +wimlunge +wymote +wimple +wimpled +wimpleless +wimplelike +wimpler +wimples +wimpling +win +wyn +winare +winberry +winbrow +wince +winced +wincey +winceyette +winceys +wincer +wincers +winces +winch +winched +wincher +winchers +winches +winchester +winching +winchman +winchmen +wincing +wincingly +wincopipe +wind +wynd +windable +windage +windages +windas +windbag +windbagged +windbaggery +windbags +windball +windberry +windbibber +windblast +windblown +windboat +windbore +windbound +windbracing +windbreak +windbreaker +windbreaks +windbroach +windburn +windburned +windburning +windburns +windburnt +windcatcher +windcheater +windchest +windchill +windclothes +windcuffer +winddog +winded +windedly +windedness +windel +winder +windermost +winders +windesheimer +windfall +windfallen +windfalls +windfanner +windfirm +windfish +windfishes +windflaw +windflaws +windflower +windflowers +windgall +windgalled +windgalls +windhole +windhover +windy +windier +windiest +windigo +windigos +windily +windill +windiness +winding +windingly +windingness +windings +windjam +windjammer +windjammers +windjamming +windlass +windlassed +windlasser +windlasses +windlassing +windle +windled +windles +windless +windlessly +windlessness +windlestrae +windlestraw +windlike +windlin +windling +windlings +windmill +windmilled +windmilly +windmilling +windmills +windock +windore +window +windowed +windowful +windowy +windowing +windowless +windowlessness +windowlet +windowlight +windowlike +windowmaker +windowmaking +windowman +windowpane +windowpanes +windowpeeper +windows +windowshade +windowshopped +windowshopping +windowshut +windowsill +windowward +windowwards +windowwise +windpipe +windpipes +windplayer +windproof +windring +windroad +windrode +windroot +windrow +windrowed +windrower +windrowing +windrows +winds +wynds +windsail +windsailor +windscoop +windscreen +windshake +windshield +windshields +windship +windshock +windslab +windsock +windsocks +windsor +windsorite +windstorm +windstorms +windstream +windsucker +windsurf +windswept +windtight +windup +windups +windway +windways +windwayward +windwaywardly +windward +windwardly +windwardmost +windwardness +windwards +windz +wine +wyne +wineball +wineberry +wineberries +winebibber +winebibbery +winebibbing +winebrennerian +wineconner +wined +winedraf +wineglass +wineglasses +wineglassful +wineglassfuls +winegrower +winegrowing +winehouse +winey +wineyard +wineier +wineiest +wineless +winelike +winemay +winemake +winemaker +winemaking +winemaster +winepot +winepress +winepresser +winer +winery +wineries +winers +wines +winesap +wineshop +wineshops +wineskin +wineskins +winesop +winesops +winetaster +winetasting +winetree +winevat +winfred +winfree +winful +wing +wingable +wingate +wingback +wingbacks +wingbeat +wingbow +wingbows +wingcut +wingding +wingdings +winged +wingedly +wingedness +winger +wingers +wingfish +wingfishes +winghanded +wingy +wingier +wingiest +winging +wingle +wingless +winglessness +winglet +winglets +winglike +wingman +wingmanship +wingmen +wingover +wingovers +wingpiece +wingpost +wings +wingseed +wingspan +wingspans +wingspread +wingspreads +wingstem +wingtip +winy +winier +winiest +winifred +wining +winish +wink +winked +winkel +winkelman +winker +winkered +wynkernel +winkers +winking +winkingly +winkle +winkled +winklehawk +winklehole +winkles +winklet +winkling +winklot +winks +winless +winlestrae +winly +wynn +winna +winnable +winnard +wynne +winnebago +winnecowet +winned +winnel +winnelstrae +winner +winners +winnie +winning +winningly +winningness +winnings +winninish +winnipeg +winnipesaukee +winnle +winnock +winnocks +winnonish +winnow +winnowed +winnower +winnowers +winnowing +winnowingly +winnows +wynns +wino +winoes +winona +winos +winrace +wynris +winrow +wins +winslow +winsome +winsomely +winsomeness +winsomer +winsomest +winster +winston +wint +winter +winteraceae +winterage +winteranaceae +winterberry +winterbloom +winterbound +winterbourne +wintercreeper +winterdykes +wintered +winterer +winterers +winterfed +winterfeed +winterfeeding +winterffed +wintergreen +wintergreens +winterhain +wintery +winterier +winteriest +wintering +winterish +winterishly +winterishness +winterization +winterize +winterized +winterizes +winterizing +winterkill +winterkilled +winterkilling +winterkills +winterless +winterly +winterlike +winterliness +winterling +winterproof +winters +wintersome +wintertide +wintertime +winterward +winterwards +winterweed +winterweight +wintle +wintled +wintles +wintling +wintry +wintrier +wintriest +wintrify +wintrily +wintriness +wintrish +wintrous +wintun +winze +winzeman +winzemen +winzes +wyoming +wyomingite +wipe +wype +wiped +wipeout +wipeouts +wiper +wipers +wipes +wiping +wippen +wips +wipstock +wir +wirable +wirble +wird +wire +wirebar +wirebird +wirecutters +wired +wiredancer +wiredancing +wiredraw +wiredrawer +wiredrawing +wiredrawn +wiredraws +wiredrew +wiregrass +wirehair +wirehaired +wirehairs +wireless +wirelessed +wirelesses +wirelessing +wirelessly +wirelessness +wirelike +wiremaker +wiremaking +wireman +wiremen +wiremonger +wirephoto +wirephotos +wirepull +wirepuller +wirepullers +wirepulling +wirer +wirers +wires +wiresmith +wiresonde +wirespun +wirestitched +wiretail +wiretap +wiretapped +wiretapper +wiretappers +wiretapping +wiretaps +wireway +wireways +wirewalker +wireweed +wirework +wireworker +wireworking +wireworks +wireworm +wireworms +wiry +wirier +wiriest +wirily +wiriness +wirinesses +wiring +wirings +wirl +wirling +wyrock +wiros +wirr +wirra +wirrah +wirrasthru +wis +wisconsin +wisconsinite +wisconsinites +wisdom +wisdomful +wisdomless +wisdomproof +wisdoms +wisdomship +wise +wiseacre +wiseacred +wiseacredness +wiseacredom +wiseacreish +wiseacreishness +wiseacreism +wiseacres +wisecrack +wisecracked +wisecracker +wisecrackery +wisecrackers +wisecracking +wisecracks +wised +wiseguy +wisehead +wisehearted +wiseheartedly +wiseheimer +wisely +wiselier +wiseliest +wiselike +wiseling +wiseman +wisen +wiseness +wisenesses +wisenheimer +wisent +wisents +wiser +wises +wisest +wiseweed +wisewoman +wisewomen +wish +wisha +wishable +wishbone +wishbones +wished +wishedly +wisher +wishers +wishes +wishful +wishfully +wishfulness +wishy +wishing +wishingly +wishless +wishly +wishmay +wishness +wishoskan +wishram +wisht +wishtonwish +wisigothic +wising +wisket +wisking +wiskinky +wiskinkie +wismuth +wyson +wisp +wisped +wispy +wispier +wispiest +wispily +wispiness +wisping +wispish +wisplike +wisps +wiss +wyss +wisse +wissed +wissel +wisses +wisshe +wissing +wissle +wist +wistaria +wistarias +wiste +wisted +wistened +wister +wisteria +wisterias +wistful +wistfully +wistfulness +wysty +wisting +wistit +wistiti +wistless +wistlessness +wistly +wistonwish +wists +wisure +wit +witan +witbooi +witch +witchbells +witchbroom +witchcraft +witched +witchedly +witchen +witcher +witchercully +witchery +witcheries +witchering +witches +witchet +witchetty +witchgrass +witchhood +witchy +witchier +witchiest +witching +witchingly +witchings +witchleaf +witchlike +witchman +witchmonger +witchuck +witchweed +witchwife +witchwoman +witchwood +witchwork +witcraft +wite +wyte +wited +wyted +witeless +witen +witenagemot +witenagemote +witepenny +witereden +wites +wytes +witess +witful +with +withal +witham +withamite +withania +withbeg +withcall +withdaw +withdraught +withdraw +withdrawable +withdrawal +withdrawals +withdrawer +withdrawing +withdrawingness +withdrawment +withdrawn +withdrawnness +withdraws +withdrew +withe +withed +withen +wither +witherband +witherblench +withercraft +witherdeed +withered +witheredly +witheredness +witherer +witherers +withergloom +withery +withering +witheringly +witherite +witherly +witherling +withernam +withers +withershins +withertip +witherwards +witherweight +withes +withewood +withgang +withgate +withheld +withhele +withhie +withhold +withholdable +withholdal +withholden +withholder +withholders +withholding +withholdings +withholdment +withholds +withy +withier +withies +withiest +within +withindoors +withinforth +withing +withins +withinside +withinsides +withinward +withinwards +withypot +withywind +withnay +withness +withnim +witholden +without +withoutdoors +withouten +withoutforth +withouts +withoutside +withoutwards +withsay +withsayer +withsave +withsaw +withset +withslip +withspar +withstay +withstand +withstander +withstanding +withstandingness +withstands +withstood +withstrain +withtake +withtee +withturn +withvine +withwind +witing +wyting +witjar +witless +witlessly +witlessness +witlet +witling +witlings +witloof +witloofs +witlosen +witmonger +witney +witneyer +witneys +witness +witnessable +witnessdom +witnessed +witnesser +witnessers +witnesses +witnesseth +witnessing +witoto +wits +witsafe +witship +wittal +wittall +wittawer +witteboom +witted +wittedness +witten +witter +wittering +witterly +witterness +witty +witticaster +wittichenite +witticism +witticisms +witticize +wittier +wittiest +wittified +wittily +wittiness +witting +wittingite +wittingly +wittings +wittol +wittolly +wittols +wittome +witumki +witwall +witwanton +witword +witworm +witzchoura +wive +wyve +wived +wiver +wyver +wivern +wyvern +wiverns +wyverns +wivers +wives +wiving +wiwi +wiz +wizard +wizardess +wizardism +wizardly +wizardlike +wizardry +wizardries +wizards +wizardship +wizen +wizened +wizenedness +wizening +wizens +wizes +wizier +wizzen +wizzens +wjc +wk +wkly +wl +wlatful +wlatsome +wlecche +wlench +wlity +wloka +wlonkhede +wm +wmk +wo +woa +woad +woaded +woader +woady +woadman +woads +woadwax +woadwaxen +woadwaxes +woak +woald +woalds +woan +wob +wobbegong +wobble +wobbled +wobbler +wobblers +wobbles +wobbly +wobblier +wobblies +wobbliest +wobbliness +wobbling +wobblingly +wobegone +wobegoneness +wobegonish +wobster +wocas +wocheinite +wochua +wod +woddie +wode +wodeleie +woden +wodenism +wodge +wodgy +woe +woebegone +woebegoneness +woebegonish +woefare +woeful +woefuller +woefullest +woefully +woefulness +woehlerite +woeness +woenesses +woes +woesome +woevine +woeworn +woffler +woft +woful +wofully +wofulness +wog +woggle +woghness +wogiet +wogul +wogulian +wohlac +wohlerite +woy +woyaway +woibe +woidre +woilie +wok +wokas +woke +woken +wokowi +woks +wold +woldes +woldy +woldlike +wolds +woldsman +woleai +wolf +wolfachite +wolfbane +wolfberry +wolfberries +wolfdom +wolfed +wolfen +wolfer +wolfers +wolffia +wolffian +wolffianism +wolffish +wolffishes +wolfgang +wolfhood +wolfhound +wolfhounds +wolfian +wolfing +wolfish +wolfishly +wolfishness +wolfkin +wolfless +wolflike +wolfling +wolfman +wolfmen +wolfram +wolframate +wolframic +wolframine +wolframinium +wolframite +wolframium +wolframs +wolfs +wolfsbane +wolfsbanes +wolfsbergite +wolfskin +wolfward +wolfwards +wollastonite +wolly +wollock +wollomai +wollop +wolof +wolter +wolve +wolveboon +wolver +wolverene +wolverine +wolverines +wolvers +wolves +wolvish +woman +womanbody +womanbodies +womandom +womaned +womanfolk +womanfully +womanhead +womanhearted +womanhood +womanhouse +womaning +womanise +womanised +womanises +womanish +womanishly +womanishness +womanising +womanism +womanist +womanity +womanization +womanize +womanized +womanizer +womanizers +womanizes +womanizing +womankind +womanless +womanly +womanlier +womanliest +womanlihood +womanlike +womanlikeness +womanliness +womanmuckle +womanness +womanpost +womanpower +womanproof +womans +womanship +womanways +womanwise +womb +wombat +wombats +wombed +womby +wombier +wombiest +womble +wombs +wombside +wombstone +women +womenfolk +womenfolks +womenkind +womenswear +womera +womerah +womeras +wommala +wommera +wommerah +wommerala +wommeras +womp +womplit +won +wonder +wonderberry +wonderberries +wonderbright +wondercraft +wonderdeed +wondered +wonderer +wonderers +wonderful +wonderfuller +wonderfully +wonderfulness +wondering +wonderingly +wonderland +wonderlandish +wonderlands +wonderless +wonderlessness +wonderment +wondermonger +wondermongering +wonders +wondersmith +wondersome +wonderstrong +wonderstruck +wonderwell +wonderwork +wonderworthy +wondie +wondrous +wondrously +wondrousness +wone +wonegan +wong +wonga +wongah +wongara +wongen +wongshy +wongsky +woning +wonk +wonky +wonkier +wonkiest +wonna +wonned +wonner +wonners +wonning +wonnot +wons +wont +wonted +wontedly +wontedness +wonting +wontless +wonton +wontons +wonts +woo +wooable +wood +woodagate +woodbark +woodbin +woodbind +woodbinds +woodbine +woodbined +woodbines +woodbins +woodblock +woodblocks +woodborer +woodbound +woodbox +woodboxes +woodbury +woodburytype +woodburning +woodbush +woodcarver +woodcarvers +woodcarving +woodcarvings +woodchat +woodchats +woodchopper +woodchopping +woodchuck +woodchucks +woodcoc +woodcock +woodcockize +woodcocks +woodcracker +woodcraf +woodcraft +woodcrafter +woodcrafty +woodcraftiness +woodcraftsman +woodcreeper +woodcut +woodcuts +woodcutter +woodcutters +woodcutting +wooded +wooden +woodendite +woodener +woodenest +woodenhead +woodenheaded +woodenheadedness +woodeny +woodenly +woodenness +woodenware +woodenweary +woodfall +woodfish +woodgeld +woodgrain +woodgraining +woodgrouse +woodgrub +woodhack +woodhacker +woodhen +woodhens +woodhewer +woodhole +woodhorse +woodhouse +woodhouses +woodhung +woody +woodyard +woodie +woodier +woodies +woodiest +woodine +woodiness +wooding +woodish +woodjobber +woodkern +woodknacker +woodland +woodlander +woodlands +woodlark +woodlarks +woodless +woodlessness +woodlet +woodly +woodlike +woodlind +woodlocked +woodlore +woodlores +woodlot +woodlots +woodlouse +woodmaid +woodman +woodmancraft +woodmanship +woodmen +woodmonger +woodmote +woodness +woodnote +woodnotes +woodoo +woodpeck +woodpecker +woodpeckers +woodpenny +woodpile +woodpiles +woodprint +woodranger +woodreed +woodreeve +woodrick +woodrime +woodris +woodrock +woodroof +woodrow +woodrowel +woodruff +woodruffs +woodrush +woods +woodscrew +woodsere +woodshed +woodshedde +woodshedded +woodsheddi +woodshedding +woodsheds +woodship +woodshock +woodshop +woodsy +woodsia +woodsias +woodside +woodsier +woodsiest +woodsilver +woodskin +woodsman +woodsmen +woodsorrel +woodspite +woodstone +woodturner +woodturning +woodwale +woodwall +woodward +woodwardia +woodwardship +woodware +woodwax +woodwaxen +woodwaxes +woodwind +woodwinds +woodwise +woodwork +woodworker +woodworking +woodworks +woodworm +woodworms +woodwose +woodwright +wooed +wooer +wooers +woof +woofed +woofell +woofer +woofers +woofy +woofing +woofs +woohoo +wooing +wooingly +wool +woold +woolded +woolder +woolding +wooled +woolen +woolenet +woolenette +woolenization +woolenize +woolens +wooler +woolers +woolert +woolf +woolfell +woolfells +woolgather +woolgatherer +woolgathering +woolgrower +woolgrowing +woolhead +wooly +woolie +woolier +woolies +wooliest +wooliness +woolled +woollen +woollenize +woollens +woolly +woollybutt +woollier +woollies +woolliest +woollyhead +woollyish +woollike +woolliness +woolman +woolmen +woolpack +woolpacks +woolpress +wools +woolsack +woolsacks +woolsaw +woolsey +woolshearer +woolshearing +woolshears +woolshed +woolsheds +woolskin +woolskins +woolsorter +woolsorting +woolsower +woolstapling +woolstock +woolulose +woolwa +woolward +woolwasher +woolweed +woolwheel +woolwich +woolwinder +woolwork +woolworker +woolworking +woolworth +woom +woomer +woomera +woomerah +woomerang +woomeras +woomp +woomping +woon +woons +woops +woorali +wooralis +woorari +wooraris +woordbook +woos +woosh +wooshed +wooshes +wooshing +wooster +wootz +woozy +woozier +wooziest +woozily +wooziness +woozle +wop +woppish +wops +wopsy +worble +worcester +worcestershire +word +wordable +wordably +wordage +wordages +wordbook +wordbooks +wordbreak +wordbuilding +wordcraft +wordcraftsman +worded +worden +worder +wordhoard +wordy +wordier +wordiers +wordiest +wordily +wordiness +wording +wordings +wordish +wordishly +wordishness +wordle +wordlength +wordless +wordlessly +wordlessness +wordlier +wordlike +wordlore +wordlorist +wordmaker +wordmaking +wordman +wordmanship +wordmen +wordmonger +wordmongery +wordmongering +wordness +wordperfect +wordplay +wordplays +wordprocessors +words +wordsman +wordsmanship +wordsmen +wordsmith +wordspinner +wordspite +wordstar +wordster +wordsworthian +wordsworthianism +wore +work +workability +workable +workableness +workably +workaday +workaholic +workaholics +workaholism +workaway +workbag +workbags +workbank +workbasket +workbench +workbenches +workboat +workboats +workbook +workbooks +workbox +workboxes +workbrittle +workday +workdays +worked +worker +workers +workfellow +workfile +workfolk +workfolks +workforce +workful +workgirl +workhand +workhorse +workhorses +workhouse +workhoused +workhouses +worky +workyard +working +workingly +workingman +workingmen +workings +workingwoman +workingwomen +workingwonan +workless +worklessness +workload +workloads +workloom +workman +workmanly +workmanlike +workmanlikeness +workmanliness +workmanship +workmaster +workmen +workmistress +workout +workouts +workpan +workpeople +workpiece +workplace +workroom +workrooms +works +worksheet +worksheets +workshy +workship +workshop +workshops +worksome +workspace +workstand +workstation +workstations +worktable +worktables +worktime +workup +workups +workways +workweek +workweeks +workwise +workwoman +workwomanly +workwomanlike +workwomen +world +worldaught +worldbeater +worldbeaters +worlded +worldful +worldy +worldish +worldless +worldlet +worldly +worldlier +worldliest +worldlike +worldlily +worldliness +worldling +worldlings +worldmaker +worldmaking +worldman +worldproof +worldquake +worlds +worldway +worldward +worldwards +worldwide +worldwideness +worm +wormcast +wormed +wormer +wormers +wormfish +wormfishes +wormgear +wormhole +wormholed +wormholes +wormhood +wormy +wormian +wormier +wormiest +wormil +wormils +worminess +worming +wormish +wormless +wormlike +wormling +wormproof +wormroot +wormroots +worms +wormseed +wormseeds +wormship +wormweed +wormwood +wormwoods +worn +wornil +wornness +wornnesses +wornout +worral +worrel +worry +worriable +worricow +worriecow +worried +worriedly +worriedness +worrier +worriers +worries +worrying +worryingly +worriless +worriment +worriments +worryproof +worrisome +worrisomely +worrisomeness +worrit +worrited +worriter +worriting +worrits +worrywart +worrywarts +worrywort +worse +worsement +worsen +worsened +worseness +worsening +worsens +worser +worserment +worses +worset +worsets +worship +worshipability +worshipable +worshiped +worshiper +worshipers +worshipful +worshipfully +worshipfulness +worshiping +worshipingly +worshipless +worshipped +worshipper +worshippers +worshipping +worshippingly +worships +worshipworth +worshipworthy +worsle +worssett +worst +worsted +worsteds +worsting +worsts +worsum +wort +worth +worthed +worthful +worthfulness +worthy +worthier +worthies +worthiest +worthily +worthiness +worthing +worthless +worthlessly +worthlessness +worths +worthship +worthward +worthwhile +worthwhileness +wortle +worts +wortworm +wos +wosbird +wosith +wosome +wost +wostteth +wot +wote +wotlink +wots +wotted +wottest +wotteth +wotting +woubit +wouch +wouf +wough +wouhleche +would +wouldest +woulding +wouldn +wouldnt +wouldst +woulfe +wound +woundability +woundable +woundableness +wounded +woundedly +wounder +woundy +woundily +wounding +woundingly +woundless +woundly +wounds +woundwort +woundworth +wourali +wourari +wournil +woustour +wove +woven +wovoka +wow +wowed +wowening +wowing +wows +wowser +wowserdom +wowsery +wowserian +wowserish +wowserism +wowsers +wowt +wowwows +wpm +wr +wrabbe +wrabill +wrack +wracked +wracker +wrackful +wracking +wracks +wraf +wrager +wraggle +wray +wrayful +wrainbolt +wrainstaff +wrainstave +wraist +wraith +wraithe +wraithy +wraithlike +wraiths +wraitly +wraker +wramp +wran +wrang +wrangle +wrangled +wrangler +wranglers +wranglership +wrangles +wranglesome +wrangling +wranglingly +wrangs +wranny +wrannock +wrap +wraparound +wraparounds +wraple +wrappage +wrapped +wrapper +wrapperer +wrappering +wrappers +wrapping +wrappings +wraprascal +wrapround +wraps +wrapt +wrapup +wrasse +wrasses +wrast +wrastle +wrastled +wrastler +wrastles +wrastling +wratack +wrath +wrathed +wrathful +wrathfully +wrathfulness +wrathy +wrathier +wrathiest +wrathily +wrathiness +wrathing +wrathless +wrathlike +wraths +wraw +wrawl +wrawler +wraxle +wraxled +wraxling +wreak +wreaked +wreaker +wreakers +wreakful +wreaking +wreakless +wreaks +wreat +wreath +wreathage +wreathe +wreathed +wreathen +wreather +wreathes +wreathy +wreathing +wreathingly +wreathless +wreathlet +wreathlike +wreathmaker +wreathmaking +wreathpiece +wreaths +wreathwise +wreathwork +wreathwort +wreck +wreckage +wreckages +wrecked +wrecker +wreckers +wreckfish +wreckfishes +wreckful +wrecky +wrecking +wreckings +wrecks +wren +wrench +wrenched +wrencher +wrenches +wrenching +wrenchingly +wrenlet +wrenlike +wrens +wrentail +wrest +wrestable +wrested +wrester +wresters +wresting +wrestingly +wrestle +wrestled +wrestler +wrestlerlike +wrestlers +wrestles +wrestling +wrestlings +wrests +wretch +wretched +wretcheder +wretchedest +wretchedly +wretchedness +wretches +wretchless +wretchlessly +wretchlessness +wretchock +wry +wrybill +wrible +wricht +wrick +wride +wried +wrier +wryer +wries +wriest +wryest +wrig +wriggle +wriggled +wriggler +wrigglers +wriggles +wrigglesome +wrigglework +wriggly +wrigglier +wriggliest +wriggling +wrigglingly +wright +wrightine +wrightry +wrights +wrigley +wrihte +wrying +wryly +wrymouth +wrymouths +wrimple +wryneck +wrynecked +wrynecks +wryness +wrynesses +wring +wringbolt +wringed +wringer +wringers +wringing +wringle +wringman +wrings +wringstaff +wringstaves +wrinkle +wrinkleable +wrinkled +wrinkledy +wrinkledness +wrinkleful +wrinkleless +wrinkleproof +wrinkles +wrinklet +wrinkly +wrinklier +wrinkliest +wrinkling +wrist +wristband +wristbands +wristbone +wristdrop +wristed +wrister +wristfall +wristy +wristier +wristiest +wristikin +wristlet +wristlets +wristlock +wrists +wristwatch +wristwatches +wristwork +writ +writability +writable +wrytail +writation +writative +write +writeable +writee +writeoff +writeoffs +writer +writeress +writerling +writers +writership +writes +writeup +writeups +writh +writhe +writhed +writhedly +writhedness +writhen +writheneck +writher +writhers +writhes +writhy +writhing +writhingly +writhled +writing +writinger +writings +writmaker +writmaking +writproof +writs +written +writter +wrive +wrixle +wrizzled +wrnt +wro +wrocht +wroke +wroken +wrong +wrongdo +wrongdoer +wrongdoers +wrongdoing +wronged +wronger +wrongers +wrongest +wrongfile +wrongful +wrongfuly +wrongfully +wrongfulness +wronghead +wrongheaded +wrongheadedly +wrongheadedness +wronghearted +wrongheartedly +wrongheartedness +wronging +wrongish +wrongless +wronglessly +wrongly +wrongness +wrongous +wrongously +wrongousness +wrongrel +wrongs +wrongwise +wronskian +wroot +wrossle +wrote +wroth +wrothe +wrothful +wrothfully +wrothy +wrothily +wrothiness +wrothly +wrothsome +wrought +wrox +wrung +wrungness +ws +wt +wu +wuchereria +wud +wuddie +wudge +wudu +wuff +wugg +wuggishness +wulder +wulfenite +wulk +wull +wullawins +wullcat +wullie +wulliwa +wumble +wumman +wummel +wun +wunderbar +wunderkind +wunderkinder +wundtian +wungee +wunna +wunner +wunsome +wuntee +wup +wur +wurley +wurleys +wurly +wurlies +wurmal +wurmian +wurraluh +wurrung +wurrup +wurrus +wurset +wurst +wursts +wurtzilite +wurtzite +wurtzitic +wurzburger +wurzel +wurzels +wus +wush +wusp +wuss +wusser +wust +wut +wuther +wuthering +wuzu +wuzzer +wuzzy +wuzzle +wuzzled +wuzzling +x +xalostockite +xanthaline +xanthamic +xanthamid +xanthamide +xanthan +xanthane +xanthans +xanthate +xanthates +xanthation +xanthein +xantheins +xanthelasma +xanthelasmic +xanthelasmoidea +xanthene +xanthenes +xanthian +xanthic +xanthid +xanthide +xanthidium +xanthydrol +xanthyl +xanthin +xanthindaba +xanthine +xanthines +xanthins +xanthinuria +xanthione +xanthippe +xanthism +xanthisma +xanthite +xanthium +xanthiuria +xanthocarpous +xanthocephalus +xanthoceras +xanthochroi +xanthochroia +xanthochroic +xanthochroid +xanthochroism +xanthochromia +xanthochromic +xanthochroous +xanthocyanopy +xanthocyanopia +xanthocyanopsy +xanthocyanopsia +xanthocobaltic +xanthocone +xanthoconite +xanthocreatinine +xanthoderm +xanthoderma +xanthodermatous +xanthodont +xanthodontous +xanthogen +xanthogenamic +xanthogenamide +xanthogenate +xanthogenic +xantholeucophore +xanthoma +xanthomas +xanthomata +xanthomatosis +xanthomatous +xanthomelanoi +xanthomelanous +xanthometer +xanthomyeloma +xanthomonas +xanthone +xanthones +xanthophane +xanthophyceae +xanthophyl +xanthophyll +xanthophyllic +xanthophyllite +xanthophyllous +xanthophore +xanthophose +xanthopia +xanthopicrin +xanthopicrite +xanthoproteic +xanthoprotein +xanthoproteinic +xanthopsia +xanthopsydracia +xanthopsin +xanthopterin +xanthopurpurin +xanthorhamnin +xanthorrhiza +xanthorrhoea +xanthosiderite +xanthosis +xanthosoma +xanthospermous +xanthotic +xanthoura +xanthous +xanthoxalis +xanthoxenite +xanthoxylin +xanthrochroid +xanthuria +xantippe +xarque +xat +xaverian +xc +xcl +xctl +xd +xdiv +xebec +xebecs +xed +xema +xeme +xenacanthine +xenacanthini +xenagogy +xenagogue +xenarchi +xenarthra +xenarthral +xenarthrous +xenelasy +xenelasia +xenia +xenial +xenian +xenias +xenic +xenically +xenicidae +xenicus +xenyl +xenylamine +xenium +xenobiology +xenobiologies +xenobiosis +xenoblast +xenochia +xenocyst +xenocratean +xenocratic +xenocryst +xenocrystic +xenoderm +xenodiagnosis +xenodiagnostic +xenodocheion +xenodochy +xenodochia +xenodochium +xenogamy +xenogamies +xenogamous +xenogeneic +xenogenesis +xenogenetic +xenogeny +xenogenic +xenogenies +xenogenous +xenoglossia +xenograft +xenolite +xenolith +xenolithic +xenoliths +xenomania +xenomaniac +xenomi +xenomorpha +xenomorphic +xenomorphically +xenomorphosis +xenon +xenons +xenoparasite +xenoparasitism +xenopeltid +xenopeltidae +xenophanean +xenophya +xenophile +xenophilism +xenophilous +xenophobe +xenophobes +xenophoby +xenophobia +xenophobian +xenophobic +xenophobism +xenophonic +xenophontean +xenophontian +xenophontic +xenophontine +xenophora +xenophoran +xenophoridae +xenophthalmia +xenoplastic +xenopodid +xenopodidae +xenopodoid +xenopsylla +xenopteran +xenopteri +xenopterygian +xenopterygii +xenopus +xenorhynchus +xenos +xenosaurid +xenosauridae +xenosauroid +xenosaurus +xenotime +xenotropic +xenurus +xerafin +xeransis +xeranthemum +xerantic +xeraphin +xerarch +xerasia +xeres +xeric +xerically +xeriff +xerocline +xeroderma +xerodermatic +xerodermatous +xerodermia +xerodermic +xerogel +xerographer +xerography +xerographic +xerographically +xeroma +xeromata +xeromenia +xeromyron +xeromyrum +xeromorph +xeromorphy +xeromorphic +xeromorphous +xeronate +xeronic +xerophagy +xerophagia +xerophagies +xerophil +xerophile +xerophily +xerophyllum +xerophilous +xerophyte +xerophytic +xerophytically +xerophytism +xerophobous +xerophthalmy +xerophthalmia +xerophthalmic +xerophthalmos +xeroprinting +xerosere +xeroseres +xeroses +xerosis +xerostoma +xerostomia +xerotes +xerotherm +xerothermic +xerotic +xerotocia +xerotripsis +xerox +xeroxed +xeroxes +xeroxing +xerus +xeruses +xi +xicak +xicaque +xii +xiii +xyla +xylan +xylans +xylanthrax +xylaria +xylariaceae +xylate +xyleborus +xylem +xylems +xylene +xylenes +xylenyl +xylenol +xyletic +xylia +xylic +xylidic +xylidin +xylidine +xylidines +xylidins +xylyl +xylylene +xylylic +xylyls +xylina +xylindein +xylinid +xylite +xylitol +xylitols +xylitone +xylo +xylobalsamum +xylocarp +xylocarpous +xylocarps +xylocopa +xylocopid +xylocopidae +xylogen +xyloglyphy +xylograph +xylographer +xylography +xylographic +xylographical +xylographically +xyloid +xyloidin +xyloidine +xyloyl +xylol +xylology +xylols +xyloma +xylomancy +xylomas +xylomata +xylometer +xylon +xylonic +xylonite +xylonitrile +xylophaga +xylophagan +xylophage +xylophagid +xylophagidae +xylophagous +xylophagus +xylophilous +xylophone +xylophones +xylophonic +xylophonist +xylophonists +xylopia +xylopyrographer +xylopyrography +xyloplastic +xylopolist +xyloquinone +xylorcin +xylorcinol +xylose +xyloses +xylosid +xyloside +xylosma +xylostroma +xylostromata +xylostromatoid +xylotile +xylotypography +xylotypographic +xylotomy +xylotomic +xylotomical +xylotomies +xylotomist +xylotomous +xylotrya +ximenia +xina +xinca +xint +xipe +xiphias +xiphydria +xiphydriid +xiphydriidae +xiphihumeralis +xiphiid +xiphiidae +xiphiiform +xiphioid +xiphiplastra +xiphiplastral +xiphiplastron +xiphisterna +xiphisternal +xiphisternum +xiphistna +xiphisura +xiphisuran +xiphiura +xiphius +xiphocostal +xiphodynia +xiphodon +xiphodontidae +xiphoid +xyphoid +xiphoidal +xiphoidian +xiphoids +xiphopagic +xiphopagous +xiphopagus +xiphophyllous +xiphosterna +xiphosternum +xiphosura +xiphosuran +xiphosure +xiphosuridae +xiphosurous +xiphosurus +xiphuous +xiphura +xiraxara +xyrichthys +xyrid +xyridaceae +xyridaceous +xyridales +xyris +xis +xyst +xyster +xysters +xysti +xystoi +xystos +xysts +xystum +xystus +xiv +xix +xyz +xmas +xmases +xoana +xoanon +xoanona +xonotlite +xosa +xr +xray +xref +xs +xu +xurel +xvi +xvii +xviii +xw +xx +xxi +xxii +xxiii +xxiv +xxv +xxx +z +za +zabaean +zabaglione +zabaione +zabaiones +zabaism +zabajone +zabajones +zaberma +zabeta +zabian +zabism +zaboglione +zabra +zabti +zabtie +zaburro +zac +zacate +zacatec +zacateco +zacaton +zacatons +zach +zachariah +zachun +zack +zad +zaddick +zaddickim +zaddik +zaddikim +zadokite +zadruga +zaffar +zaffars +zaffer +zaffers +zaffir +zaffirs +zaffre +zaffree +zaffres +zafree +zaftig +zag +zagaie +zagged +zagging +zaglossus +zags +zaguan +zayat +zaibatsu +zayin +zayins +zain +zaire +zaires +zairian +zairians +zaitha +zak +zakah +zakat +zakkeu +zaklohpakap +zakuska +zakuski +zalambdodont +zalambdodonta +zalamboodont +zalophus +zaman +zamang +zamarra +zamarras +zamarro +zamarros +zambac +zambal +zambezi +zambezian +zambia +zambian +zambians +zambo +zambomba +zamboorak +zambra +zamenis +zamia +zamiaceae +zamias +zamicrus +zamindar +zamindari +zamindary +zamindars +zaminder +zamorin +zamorine +zamouse +zampogna +zan +zanana +zananas +zanclidae +zanclodon +zanclodontidae +zande +zander +zanders +zandmole +zanella +zany +zaniah +zanier +zanies +zaniest +zanyish +zanyism +zanily +zaniness +zaninesses +zanyship +zanjero +zanjon +zanjona +zannichellia +zannichelliaceae +zanonia +zant +zante +zantedeschia +zantewood +zanthorrhiza +zanthoxylaceae +zanthoxylum +zantiot +zantiote +zanza +zanzalian +zanzas +zanze +zanzibar +zanzibari +zap +zapara +zaparan +zaparo +zaparoan +zapas +zapateado +zapateados +zapateo +zapateos +zapatero +zaphara +zaphetic +zaphrentid +zaphrentidae +zaphrentis +zaphrentoid +zapodidae +zapodinae +zaporogian +zaporogue +zapota +zapote +zapotec +zapotecan +zapoteco +zapped +zapping +zaps +zaptiah +zaptiahs +zaptieh +zaptiehs +zaptoeca +zapupe +zapus +zaqqum +zaque +zar +zarabanda +zaramo +zarathustrian +zarathustrianism +zarathustrism +zaratite +zaratites +zardushti +zareba +zarebas +zareeba +zareebas +zarema +zarf +zarfs +zariba +zaribas +zarnec +zarnich +zarp +zarzuela +zarzuelas +zastruga +zastrugi +zat +zati +zattare +zaurak +zauschneria +zavijava +zax +zaxes +zazen +zazens +zea +zeal +zealand +zealander +zealanders +zealed +zealful +zealless +zeallessness +zealot +zealotic +zealotical +zealotism +zealotist +zealotry +zealotries +zealots +zealous +zealousy +zealously +zealousness +zealproof +zeals +zeatin +zeatins +zeaxanthin +zebec +zebeck +zebecks +zebecs +zebedee +zebra +zebrafish +zebrafishes +zebraic +zebralike +zebras +zebrass +zebrasses +zebrawood +zebrina +zebrine +zebrinny +zebrinnies +zebroid +zebrula +zebrule +zebu +zebub +zebulun +zebulunite +zeburro +zebus +zecchin +zecchini +zecchino +zecchinos +zecchins +zechariah +zechin +zechins +zechstein +zed +zedoary +zedoaries +zeds +zee +zeed +zeekoe +zeelander +zees +zeguha +zehner +zeidae +zeilanite +zein +zeins +zeism +zeiss +zeist +zeitgeist +zek +zeke +zeks +zel +zelanian +zelant +zelator +zelatrice +zelatrix +zelkova +zelkovas +zelophobia +zelotic +zelotypia +zelotypie +zeltinger +zeme +zemeism +zemi +zemiism +zemimdari +zemindar +zemindari +zemindary +zemindars +zemmi +zemni +zemstroist +zemstva +zemstvo +zemstvos +zen +zenaga +zenaida +zenaidas +zenaidinae +zenaidura +zenana +zenanas +zend +zendic +zendician +zendik +zendikite +zendo +zendos +zenelophon +zenick +zenith +zenithal +zeniths +zenithward +zenithwards +zenobia +zenocentric +zenography +zenographic +zenographical +zenonian +zenonic +zentner +zenu +zenzuic +zeoidei +zeolite +zeolites +zeolitic +zeolitization +zeolitize +zeolitized +zeolitizing +zeoscope +zep +zephaniah +zepharovichite +zephyr +zephiran +zephyranth +zephyranthes +zephyrean +zephyry +zephyrian +zephyrless +zephyrlike +zephyrous +zephyrs +zephyrus +zeppelin +zeppelins +zequin +zer +zerda +zereba +zerma +zermahbub +zero +zeroaxial +zeroed +zeroes +zeroeth +zeroing +zeroize +zeros +zeroth +zerumbet +zest +zested +zestful +zestfully +zestfulness +zesty +zestier +zestiest +zestiness +zesting +zestless +zests +zeta +zetacism +zetas +zetetic +zeuctocoelomata +zeuctocoelomatic +zeuctocoelomic +zeugite +zeuglodon +zeuglodont +zeuglodonta +zeuglodontia +zeuglodontidae +zeuglodontoid +zeugma +zeugmas +zeugmatic +zeugmatically +zeugobranchia +zeugobranchiata +zeunerite +zeus +zeuxian +zeuxite +zeuzera +zeuzerian +zeuzeridae +zhmud +zho +ziamet +ziara +ziarat +zibeline +zibelines +zibelline +zibet +zibeth +zibethone +zibeths +zibetone +zibets +zibetum +ziczac +zydeco +zydecos +ziega +zieger +zietrisikite +ziff +ziffs +zig +zyga +zygadenin +zygadenine +zygadenus +zygadite +zygaena +zygaenid +zygaenidae +zygal +zigamorph +zigan +ziganka +zygantra +zygantrum +zygapophyseal +zygapophyses +zygapophysial +zygapophysis +zygenid +zigged +zigger +zigging +ziggurat +ziggurats +zygion +zygite +zygnema +zygnemaceae +zygnemaceous +zygnemales +zygnemataceae +zygnemataceous +zygnematales +zygobranch +zygobranchia +zygobranchiata +zygobranchiate +zygocactus +zygodactyl +zygodactylae +zygodactyle +zygodactyli +zygodactylic +zygodactylism +zygodactylous +zygodont +zygogenesis +zygogenetic +zygoid +zygolabialis +zygoma +zygomas +zygomata +zygomatic +zygomaticoauricular +zygomaticoauricularis +zygomaticofacial +zygomaticofrontal +zygomaticomaxillary +zygomaticoorbital +zygomaticosphenoid +zygomaticotemporal +zygomaticum +zygomaticus +zygomaxillare +zygomaxillary +zygomycete +zygomycetes +zygomycetous +zygomorphy +zygomorphic +zygomorphism +zygomorphous +zygon +zygoneure +zygophyceae +zygophyceous +zygophyllaceae +zygophyllaceous +zygophyllum +zygophyte +zygophore +zygophoric +zygopleural +zygoptera +zygopteraceae +zygopteran +zygopterid +zygopterides +zygopteris +zygopteron +zygopterous +zygosaccharomyces +zygose +zygoses +zygosis +zygosity +zygosities +zygosperm +zygosphenal +zygosphene +zygosphere +zygosporange +zygosporangium +zygospore +zygosporic +zygosporophore +zygostyle +zygotactic +zygotaxis +zygote +zygotene +zygotenes +zygotes +zygotic +zygotically +zygotoblast +zygotoid +zygotomere +zygous +zygozoospore +zigs +zigzag +zigzagged +zigzaggedly +zigzaggedness +zigzagger +zigzaggery +zigzaggy +zigzagging +zigzags +zigzagways +zigzagwise +zihar +zikkurat +zikkurats +zikurat +zikurats +zila +zilch +zilches +zilchviticetum +zill +zilla +zillah +zillahs +zillion +zillions +zillionth +zillionths +zills +zilpah +zimarra +zymase +zymases +zimb +zimbabwe +zimbalon +zimbaloon +zimbi +zyme +zimentwater +zymes +zymic +zymin +zymite +zimme +zimmerwaldian +zimmerwaldist +zimmi +zimmy +zimmis +zimocca +zymochemistry +zymogen +zymogene +zymogenes +zymogenesis +zymogenic +zymogenous +zymogens +zymogram +zymograms +zymoid +zymolyis +zymolysis +zymolytic +zymology +zymologic +zymological +zymologies +zymologist +zymome +zymometer +zymomin +zymophyte +zymophore +zymophoric +zymophosphate +zymoplastic +zymosan +zymosans +zymoscope +zymoses +zymosimeter +zymosis +zymosterol +zymosthenic +zymotechny +zymotechnic +zymotechnical +zymotechnics +zymotic +zymotically +zymotize +zymotoxic +zymurgy +zymurgies +zinc +zincalo +zincate +zincates +zinced +zincenite +zincy +zincic +zincid +zincide +zinciferous +zincify +zincification +zincified +zincifies +zincifying +zincing +zincite +zincites +zincize +zincke +zincked +zinckenite +zincky +zincking +zinco +zincode +zincograph +zincographer +zincography +zincographic +zincographical +zincoid +zincolysis +zincotype +zincous +zincs +zincum +zincuret +zindabad +zindiq +zineb +zinebs +zinfandel +zing +zingana +zingani +zingano +zingara +zingare +zingaresca +zingari +zingaro +zinged +zingel +zinger +zingerone +zingers +zingy +zingiber +zingiberaceae +zingiberaceous +zingiberene +zingiberol +zingiberone +zingier +zingiest +zinging +zings +zinyamunga +zinjanthropi +zinjanthropus +zink +zinke +zinked +zinkenite +zinky +zinkiferous +zinkify +zinkified +zinkifies +zinkifying +zinnia +zinnias +zinnwaldite +zinober +zinsang +zinzar +zinziberaceae +zinziberaceous +zion +zionism +zionist +zionistic +zionists +zionite +zionless +zionward +zip +zipa +ziphian +ziphiidae +ziphiinae +ziphioid +ziphius +zipless +zipped +zippeite +zipper +zippered +zippering +zippers +zippy +zippier +zippiest +zipping +zippingly +zipppier +zipppiest +zips +zira +zirai +zirak +ziram +zirams +zirbanit +zircalloy +zircaloy +zircite +zircofluoride +zircon +zirconate +zirconia +zirconian +zirconias +zirconic +zirconiferous +zirconifluoride +zirconyl +zirconium +zirconofluoride +zirconoid +zircons +zyrenian +zirian +zyrian +zyryan +zirianian +zirkelite +zirkite +zit +zythem +zither +zitherist +zitherists +zithern +zitherns +zithers +zythia +zythum +ziti +zitis +zits +zitter +zittern +zitzit +zitzith +zizany +zizania +zizel +zizia +zizyphus +zizit +zizith +zyzomys +zizz +zyzzyva +zyzzyvas +zizzle +zizzled +zizzles +zizzling +zyzzogeton +zlote +zloty +zlotych +zloties +zlotys +zmudz +zn +zo +zoa +zoacum +zoaea +zoanthacea +zoanthacean +zoantharia +zoantharian +zoanthid +zoanthidae +zoanthidea +zoanthodeme +zoanthodemic +zoanthoid +zoanthropy +zoanthus +zoarces +zoarcidae +zoaria +zoarial +zoarite +zoarium +zobo +zobtenite +zocalo +zocco +zoccolo +zod +zodiac +zodiacal +zodiacs +zodiophilous +zoea +zoeae +zoeaform +zoeal +zoeas +zoeform +zoehemera +zoehemerae +zoetic +zoetrope +zoetropic +zoftig +zogan +zogo +zohak +zoharist +zoharite +zoiatria +zoiatrics +zoic +zoid +zoidiophilous +zoidogamous +zoilean +zoilism +zoilist +zoilus +zoysia +zoysias +zoisite +zoisites +zoisitization +zoism +zoist +zoistic +zokor +zolaesque +zolaism +zolaist +zolaistic +zolaize +zoll +zolle +zollernia +zollpfund +zollverein +zolotink +zolotnik +zombi +zombie +zombielike +zombies +zombiism +zombiisms +zombis +zomotherapeutic +zomotherapy +zona +zonaesthesia +zonal +zonality +zonally +zonar +zonary +zonaria +zonate +zonated +zonation +zonations +zonda +zone +zoned +zoneless +zonelet +zonelike +zoner +zoners +zones +zonesthesia +zonetime +zonetimes +zongora +zonic +zoniferous +zoning +zonite +zonites +zonitid +zonitidae +zonitoides +zonked +zonnar +zonochlorite +zonociliate +zonoid +zonolimnetic +zonoplacental +zonoplacentalia +zonoskeleton +zonotrichia +zonta +zontian +zonula +zonulae +zonular +zonulas +zonule +zonules +zonulet +zonure +zonurid +zonuridae +zonuroid +zonurus +zoo +zoobenthoic +zoobenthos +zooblast +zoocarp +zoocecidium +zoochem +zoochemy +zoochemical +zoochemistry +zoochlorella +zoochore +zoochores +zoocyst +zoocystic +zoocytial +zoocytium +zoocoenocyte +zoocultural +zooculture +zoocurrent +zoodendria +zoodendrium +zoodynamic +zoodynamics +zooecia +zooecial +zooecium +zooerastia +zooerythrin +zooflagellate +zoofulvin +zoogamete +zoogamy +zoogamous +zoogene +zoogenesis +zoogeny +zoogenic +zoogenous +zoogeog +zoogeographer +zoogeography +zoogeographic +zoogeographical +zoogeographically +zoogeographies +zoogeology +zoogeological +zoogeologist +zooglea +zoogleae +zoogleal +zoogleas +zoogler +zoogloea +zoogloeae +zoogloeal +zoogloeas +zoogloeic +zoogony +zoogonic +zoogonidium +zoogonous +zoograft +zoografting +zoographer +zoography +zoographic +zoographical +zoographically +zoographist +zooid +zooidal +zooidiophilous +zooids +zookers +zooks +zool +zoolater +zoolaters +zoolatry +zoolatria +zoolatries +zoolatrous +zoolite +zoolith +zoolithic +zoolitic +zoologer +zoology +zoologic +zoological +zoologically +zoologicoarchaeologist +zoologicobotanical +zoologies +zoologist +zoologists +zoologize +zoologized +zoologizing +zoom +zoomagnetic +zoomagnetism +zoomancy +zoomania +zoomanias +zoomantic +zoomantist +zoomastigina +zoomastigoda +zoomechanical +zoomechanics +zoomed +zoomelanin +zoometry +zoometric +zoometrical +zoometries +zoomimetic +zoomimic +zooming +zoomorph +zoomorphy +zoomorphic +zoomorphism +zoomorphize +zoomorphs +zooms +zoon +zoona +zoonal +zoonerythrin +zoonic +zoonist +zoonite +zoonitic +zoonomy +zoonomia +zoonomic +zoonomical +zoonomist +zoonoses +zoonosis +zoonosology +zoonosologist +zoonotic +zoons +zoonule +zoopaleontology +zoopantheon +zooparasite +zooparasitic +zoopathy +zoopathology +zoopathological +zoopathologies +zoopathologist +zooperal +zoopery +zooperist +zoophaga +zoophagan +zoophagineae +zoophagous +zoophagus +zoopharmacy +zoopharmacological +zoophile +zoophiles +zoophily +zoophilia +zoophiliac +zoophilic +zoophilies +zoophilism +zoophilist +zoophilite +zoophilitic +zoophilous +zoophysical +zoophysicist +zoophysics +zoophysiology +zoophism +zoophyta +zoophytal +zoophyte +zoophytes +zoophytic +zoophytical +zoophytish +zoophytography +zoophytoid +zoophytology +zoophytological +zoophytologist +zoophobe +zoophobes +zoophobia +zoophobous +zoophori +zoophoric +zoophorous +zoophorus +zooplankton +zooplanktonic +zooplasty +zooplastic +zoopraxiscope +zoopsia +zoopsychology +zoopsychological +zoopsychologist +zoos +zooscopy +zooscopic +zoosis +zoosmosis +zoosperm +zoospermatic +zoospermia +zoospermium +zoosperms +zoospgia +zoosphere +zoosporange +zoosporangia +zoosporangial +zoosporangiophore +zoosporangium +zoospore +zoospores +zoosporic +zoosporiferous +zoosporocyst +zoosporous +zoosterol +zootaxy +zootaxonomist +zootechny +zootechnic +zootechnical +zootechnician +zootechnics +zooter +zoothecia +zoothecial +zoothecium +zootheism +zootheist +zootheistic +zootherapy +zoothome +zooty +zootic +zootype +zootypic +zootoca +zootomy +zootomic +zootomical +zootomically +zootomies +zootomist +zoototemism +zootoxin +zootrophy +zootrophic +zooxanthella +zooxanthellae +zooxanthin +zoozoo +zophophori +zophori +zophorus +zopilote +zoque +zoquean +zoraptera +zorgite +zori +zoril +zorilla +zorillas +zorille +zorilles +zorillinae +zorillo +zorillos +zorils +zoris +zoroaster +zoroastra +zoroastrian +zoroastrianism +zoroastrians +zoroastrism +zorotypus +zorrillo +zorro +zortzico +zosma +zoster +zostera +zosteraceae +zosteriform +zosteropinae +zosterops +zosters +zouave +zouaves +zounds +zowie +zs +zubeneschamali +zubr +zuccarino +zucchetti +zucchetto +zucchettos +zucchini +zucchinis +zucco +zuchetto +zudda +zuffolo +zufolo +zugtierlast +zugtierlaster +zugzwang +zuisin +zuleika +zulhijjah +zulinde +zulkadah +zulu +zuludom +zuluize +zulus +zumatic +zumbooruk +zuni +zunian +zunyite +zunis +zupanate +zurich +zurlite +zutugil +zuurveldt +zuza +zwanziger +zwieback +zwiebacks +zwieselite +zwinglian +zwinglianism +zwinglianist +zwitter +zwitterion +zwitterionic \ No newline at end of file From 58f9d8baf2c419c4c08c1e2cdeecf70491e067f9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 22:02:11 +0100 Subject: [PATCH 237/495] Reformat to use a words file rather than babble --- docker-compose.yml | 1 + pkg/game/world.go | 36 ++++++++++++++++++++++++++++++------ snap/snapcraft.yaml | 16 ++++++++++++---- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3c45612..91c69c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,6 +40,7 @@ services: - PORT=9090 - DATA_PATH=/mnt/rove-server - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 + - WORDS_FILE=data/words_alpha.txt volumes: - persistent-data:/mnt/rove-server:rw command: [ "./script/wait-for-it.sh", "rove-accountant:9091", "--", "./rove-server"] diff --git a/pkg/game/world.go b/pkg/game/world.go index 626a4da..192e86a 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -1,11 +1,12 @@ package game import ( + "bufio" "fmt" "log" "math" "math/rand" - "strings" + "os" "sync" "github.com/google/uuid" @@ -13,7 +14,6 @@ import ( "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/vector" - "github.com/tjarratt/babble" ) // World describes a self contained universe and everything in it @@ -35,15 +35,37 @@ type World struct { // Mutex to lock around command operations cmdMutex sync.RWMutex + + // Set of possible words to use for names + words []string } +var wordsFile = os.Getenv("WORDS_FILE") + // NewWorld creates a new world object func NewWorld(size, chunkSize int) *World { + + // Try and load the words file + var lines []string + if file, err := os.Open(wordsFile); err != nil { + log.Printf("Couldn't read words file [%s], running without words: %s\n", wordsFile, err) + } else { + defer file.Close() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + if scanner.Err() != nil { + log.Printf("Failure during word file scan: %s\n", scanner.Err()) + } + } + return &World{ Rovers: make(map[uuid.UUID]Rover), CommandQueue: make(map[uuid.UUID]CommandStream), Incoming: make(map[uuid.UUID]CommandStream), Atlas: atlas.NewAtlas(size, chunkSize), + words: lines, } } @@ -66,15 +88,17 @@ func (w *World) SpawnRover() (uuid.UUID, error) { rover := Rover{ Id: uuid.New(), Attributes: RoverAttributes{ - Speed: 1.0, Range: 5.0, - - // Set the name randomly - Name: strings.ReplaceAll(babble.NewBabbler().Babble(), "'s", ""), + Name: "rover", }, } + // Assign a random name if we have words + if len(w.words) > 0 { + rover.Attributes.Name = fmt.Sprintf("%s-%s", w.words[rand.Intn(len(w.words))], w.words[rand.Intn(len(w.words))]) + } + // Spawn in a random place near the origin rover.Attributes.Pos = vector.Vector{ X: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 55815cb..41692a3 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -21,6 +21,8 @@ apps: plugs: - network - network-bind + environment: + WORDS_FILE : "$SNAP/data/words_alpha.txt" rove-accountant: command: bin/rove-accountant plugs: @@ -41,8 +43,14 @@ parts: - gcc-multilib override-pull: | snapcraftctl pull - snapcraftctl set-version $(git describe --always --long --dirty --tags) + version=$(git describe --always --long --dirty --tags) + sed -i "s/undefined/$version/" pkg/version/version.go + snapcraftctl set-version $version git describe --exact-match --tags HEAD 2> /dev/null && snapcraftctl set-grade "stable" || snapcraftctl set-grade "devel" - sed -i "s/undefined/$(git describe --always --long --dirty --tags)/" pkg/version/version.go - - # TODO: Server needs /usr/share/dict/words + + copy-data: + plugin: dump + source-type: local + source: data + organize: + '*.txt' : data/ From 8aeb23e40b0fb18fc63cafefe609f7f74bbf3dd2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 22:25:42 +0100 Subject: [PATCH 238/495] Set up data paths within the snaps --- cmd/rove/main.go | 28 ++++++++++++++++++---------- snap/snapcraft.yaml | 7 +++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 37fef86..d396e6b 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -33,13 +33,13 @@ func printUsage() { } var home = os.Getenv("HOME") -var defaultData = path.Join(home, ".local/share/rove.json") +var defaultDataPath = path.Join(home, ".local/share/") const gRPCport = 9090 // General usage var host = flag.String("host", "", "path to game host server") -var data = flag.String("data", defaultData, "data file for storage") +var data = flag.String("data", defaultDataPath, "data location for storage (or $USER_DATA if set)") // For register command var name = flag.String("name", "", "used with status command for the account name") @@ -70,23 +70,31 @@ func InnerMain(command string) error { Accounts: make(map[string]string), } + // Allow overriding the data path + var datapath = *data + var override = os.Getenv("USER_DATA") + if len(override) > 0 { + datapath = override + } + datapath = path.Join(datapath, "rove.json") + // Create the path if needed - path := filepath.Dir(*data) + path := filepath.Dir(datapath) _, err := os.Stat(path) if os.IsNotExist(err) { os.MkdirAll(path, os.ModePerm) } else { // Read the file - _, err = os.Stat(*data) + _, err = os.Stat(datapath) if !os.IsNotExist(err) { - if b, err := ioutil.ReadFile(*data); err != nil { - return fmt.Errorf("failed to read file %s error: %s", *data, err) + if b, err := ioutil.ReadFile(datapath); err != nil { + return fmt.Errorf("failed to read file %s error: %s", datapath, err) } else if len(b) == 0 { - return fmt.Errorf("file %s was empty, assumin fresh data", *data) + return fmt.Errorf("file %s was empty, assumin fresh data", datapath) } else if err := json.Unmarshal(b, &config); err != nil { - return fmt.Errorf("failed to unmarshal file %s error: %s", *data, err) + return fmt.Errorf("failed to unmarshal file %s error: %s", datapath, err) } } @@ -219,8 +227,8 @@ func InnerMain(command string) error { // Save out the persistent file if b, err := json.MarshalIndent(config, "", "\t"); err != nil { return fmt.Errorf("failed to marshal data error: %s", err) - } else if err := ioutil.WriteFile(*data, b, os.ModePerm); err != nil { - return fmt.Errorf("failed to save file %s error: %s", *data, err) + } else if err := ioutil.WriteFile(datapath, b, os.ModePerm); err != nil { + return fmt.Errorf("failed to save file %s error: %s", datapath, err) } return nil diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 41692a3..a73434e 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -16,6 +16,8 @@ apps: command: bin/rove plugs: - network + environment: + USER_DATA: $SNAP_USER_DATA rove-server: command: bin/rove-server plugs: @@ -23,16 +25,21 @@ apps: - network-bind environment: WORDS_FILE : "$SNAP/data/words_alpha.txt" + DATA_PATH : $SNAP_USER_DATA rove-accountant: command: bin/rove-accountant plugs: - network - network-bind + environment: + DATA_PATH : $SNAP_USER_DATA rove-rest-server: command: bin/rove-reverse-proxy plugs: - network - network-bind + environment: + DATA_PATH : $SNAP_USER_DATA parts: go-rove: From ccd9e13c51ee77db6e687026b13b50e810e162a4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 22:57:57 +0100 Subject: [PATCH 239/495] Add an icon --- data/icon.svg | 3 +++ snap/snapcraft.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 data/icon.svg diff --git a/data/icon.svg b/data/icon.svg new file mode 100644 index 0000000..0fa99ec --- /dev/null +++ b/data/icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index a73434e..005f65c 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -3,7 +3,7 @@ title: Rove base: core20 license: MIT architectures: [ amd64 ] -# TODO icon: +icon: data/icon.svg summary: An asynchronous nomadic game about exploring as part of a loose community. # TODO: Add more to the description description: | From 5c12fabb63e07cf4959bfb8bfd0eded9abed03d8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 23:27:07 +0100 Subject: [PATCH 240/495] Refactor so Rover's aren't in the atlas --- pkg/atlas/atlas.go | 10 +++++----- pkg/atlas/atlas_test.go | 8 ++++---- pkg/atlas/tile.go | 24 +++++++++++++++++++----- pkg/game/world.go | 38 ++++++++++++++++---------------------- pkg/game/world_test.go | 14 +++++++------- 5 files changed, 51 insertions(+), 43 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index f6c63f6..3181442 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -58,7 +58,7 @@ func (a *Atlas) SpawnRocks() error { for i := -extent; i < extent; i++ { for j := -extent; j < extent; j++ { if rand.Intn(16) == 0 { - if err := a.SetTile(vector.Vector{X: i, Y: j}, TileRock); err != nil { + if err := a.SetTile(vector.Vector{X: i, Y: j}, TileSmallRock); err != nil { return err } } @@ -75,13 +75,13 @@ func (a *Atlas) SpawnWalls() error { // Surround the atlas in walls for i := -extent; i < extent; i++ { - if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileWall); err != nil { // N + if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileLargeRock); err != nil { // N return err - } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileWall); err != nil { // E + } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileLargeRock); err != nil { // E return err - } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileWall); err != nil { // S + } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileLargeRock); err != nil { // S return err - } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileWall); err != nil { // W + } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileLargeRock); err != nil { // W return err } } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 9d74138..8bda108 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -146,24 +146,24 @@ func TestAtlas_SpawnWorld(t *testing.T) { for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: -4}) assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + assert.Equal(t, TileLargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: -4, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + assert.Equal(t, TileLargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: 3, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + assert.Equal(t, TileLargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: 3}) assert.NoError(t, err) - assert.Equal(t, TileWall, tile) + assert.Equal(t, TileLargeRock, tile) } } diff --git a/pkg/atlas/tile.go b/pkg/atlas/tile.go index 2897647..3de13cb 100644 --- a/pkg/atlas/tile.go +++ b/pkg/atlas/tile.go @@ -1,9 +1,23 @@ package atlas const ( - TileEmpty = byte(0) - TileRover = byte(1) - - TileWall = byte(2) - TileRock = byte(3) + TileEmpty = byte(' ') + TileRover = byte('R') + TileSmallRock = byte('o') + TileLargeRock = byte('O') ) + +// BlockingTiles describes any tiles that block +var BlockingTiles = [...]byte{ + TileLargeRock, +} + +// Check if a tile is a blocking tile +func IsBlocking(tile byte) bool { + for _, t := range BlockingTiles { + if tile == t { + return true + } + } + return false +} diff --git a/pkg/game/world.go b/pkg/game/world.go index 192e86a..488a7bd 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -119,12 +119,6 @@ func (w *World) SpawnRover() (uuid.UUID, error) { } } - // Set the world tile to a rover - // TODO: Don't do this, the atlas shouldn't know about rovers - if err := w.Atlas.SetTile(rover.Attributes.Pos, atlas.TileRover); err != nil { - return uuid.Nil, err - } - log.Printf("Spawned rover at %+v\n", rover.Attributes.Pos) // Append the rover to the list @@ -187,16 +181,11 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { return nil } - // Update the world tile - // TODO: Don't do this, the atlas shouldn't know about rovers + // Check the tile is not blocked if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) - } else if tile == atlas.TileRover { + } else if atlas.IsBlocking(tile) { return fmt.Errorf("can't warp rover to occupied tile, check before warping") - } else if err := w.Atlas.SetTile(pos, atlas.TileRover); err != nil { - return fmt.Errorf("coudln't set rover tile: %s", err) - } else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { - return fmt.Errorf("coudln't clear old rover tile: %s", err) } i.Attributes.Pos = pos @@ -225,15 +214,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) - } else if tile == atlas.TileEmpty { - // Set the world tiles - // TODO: Don't do this, the atlas shouldn't know about rovers - if err := w.Atlas.SetTile(newPos, atlas.TileRover); err != nil { - return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err) - } else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { - return i.Attributes, fmt.Errorf("coudln't clear old rover tile: %s", err) - } - + } else if !atlas.IsBlocking(tile) { // Perform the move i.Attributes.Pos = newPos w.Rovers[id] = i @@ -294,6 +275,19 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { } } + // Add all rovers to the radar + for _, r := range w.Rovers { + // If the rover is in range + if r.Attributes.Pos.Distance(roverPos) < float64(radarSpan) { + relative := r.Attributes.Pos.Added(radarMin.Negated()) + index := relative.X + relative.Y*radarSpan + radar[index] = atlas.TileRover + } + } + + // Add this rover + radar[len(radar)/2] = atlas.TileRover + return radar, nil } else { return nil, fmt.Errorf("no rover matching id") diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index c002442..6267894 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -88,7 +88,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileWall)) + assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileLargeRock)) newAttribs, err = world.MoveRover(a, b) assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") } @@ -135,12 +135,12 @@ func TestWorld_RadarFromRover(t *testing.T) { PrintTiles(radar) // Test all expected values - assert.Equal(t, atlas.TileRover, radar[1+fullRange]) - assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) + //assert.Equal(t, atlas.TileRover, radar[1+fullRange]) + //assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) for i := 0; i < 8; i++ { - assert.Equal(t, atlas.TileWall, radar[i]) - assert.Equal(t, atlas.TileWall, radar[i+(7*9)]) - assert.Equal(t, atlas.TileWall, radar[i*9]) - assert.Equal(t, atlas.TileWall, radar[(i*9)+7]) + assert.Equal(t, atlas.TileLargeRock, radar[i]) + assert.Equal(t, atlas.TileLargeRock, radar[i+(7*9)]) + assert.Equal(t, atlas.TileLargeRock, radar[i*9]) + assert.Equal(t, atlas.TileLargeRock, radar[(i*9)+7]) } } From f0f5a6b2e0c6da6ee17e6f296de545f6d3128e29 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 23:51:12 +0100 Subject: [PATCH 241/495] Remove installing wamerican --- .github/workflows/docker-image.yml | 3 --- Dockerfile | 3 --- 2 files changed, 6 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 87a6e1e..20dc273 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -19,9 +19,6 @@ jobs: go-version: ^1.13 id: go - - name: Install dict - run: sudo apt-get update && sudo apt-get install wamerican - - name: Install swagger run: | sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 diff --git a/Dockerfile b/Dockerfile index 8c8b3c1..7c3e6c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,9 +5,6 @@ WORKDIR /app COPY . . RUN go mod download -# For /usr/share/dict/words -RUN apt-get -q update && apt-get -qy install wamerican - # Build the executables RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go RUN go build -o rove-accountant cmd/rove-accountant/main.go From 93b99b7989d006a82a399364c7f904470e0014bd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 25 Jun 2020 23:51:31 +0100 Subject: [PATCH 242/495] Fix tests after rover change --- pkg/atlas/atlas.go | 6 +++++- pkg/game/world.go | 9 ++++++--- pkg/game/world_test.go | 4 ++-- pkg/vector/vector.go | 11 ++++++++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 3181442..1446cad 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -42,8 +42,12 @@ func NewAtlas(size, chunkSize int) Atlas { // Initialise all the chunks for i := range a.Chunks { + tiles := make([]byte, chunkSize*chunkSize) + for i := 0; i < len(tiles); i++ { + tiles[i] = TileEmpty + } a.Chunks[i] = Chunk{ - Tiles: make([]byte, chunkSize*chunkSize), + Tiles: tiles, } } diff --git a/pkg/game/world.go b/pkg/game/world.go index 488a7bd..aad9a26 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -110,7 +110,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { if tile, err := w.Atlas.GetTile(rover.Attributes.Pos); err != nil { return uuid.Nil, err } else { - if tile == atlas.TileEmpty { + if !atlas.IsBlocking(tile) { break } else { // Try and spawn to the east of the blockage @@ -278,7 +278,10 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { // Add all rovers to the radar for _, r := range w.Rovers { // If the rover is in range - if r.Attributes.Pos.Distance(roverPos) < float64(radarSpan) { + dist := r.Attributes.Pos.Added(roverPos.Negated()) + dist = dist.Abs() + + if dist.X <= r.Attributes.Range && dist.Y <= r.Attributes.Range { relative := r.Attributes.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan radar[index] = atlas.TileRover @@ -400,7 +403,7 @@ func PrintTiles(tiles []byte) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { - fmt.Printf("%d", tiles[i+num*j]) + fmt.Printf("%c", tiles[i+num*j]) } fmt.Print("\n") } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 6267894..cc6ccac 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -135,8 +135,8 @@ func TestWorld_RadarFromRover(t *testing.T) { PrintTiles(radar) // Test all expected values - //assert.Equal(t, atlas.TileRover, radar[1+fullRange]) - //assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) + assert.Equal(t, atlas.TileRover, radar[1+fullRange]) + assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) for i := 0; i < 8; i++ { assert.Equal(t, atlas.TileLargeRock, radar[i]) assert.Equal(t, atlas.TileLargeRock, radar[i+(7*9)]) diff --git a/pkg/vector/vector.go b/pkg/vector/vector.go index f6c8215..1b82c5a 100644 --- a/pkg/vector/vector.go +++ b/pkg/vector/vector.go @@ -1,6 +1,10 @@ package vector -import "math" +import ( + "math" + + "github.com/mdiluz/rove/pkg/maths" +) // Vector desribes a 3D vector type Vector struct { @@ -45,3 +49,8 @@ func (v Vector) Multiplied(val int) Vector { func (v Vector) Divided(val int) Vector { return Vector{v.X / val, v.Y / val} } + +// Abs returns an absolute version of the vector +func (v Vector) Abs() Vector { + return Vector{maths.Abs(v.X), maths.Abs(v.Y)} +} From 15b8f0a427023a5aedf2da5e9a5d58392a5af1f7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:06:41 +0100 Subject: [PATCH 243/495] Update the PoC doc to a status doc --- docs/poc.md | 29 ----------------------------- docs/status.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 29 deletions(-) delete mode 100644 docs/poc.md create mode 100644 docs/status.md diff --git a/docs/poc.md b/docs/poc.md deleted file mode 100644 index ac8f6c8..0000000 --- a/docs/poc.md +++ /dev/null @@ -1,29 +0,0 @@ -Proof Of Concept -================ - -For a proof of concept we'll implement a very small subset of the final features - -### Core Features (done) - -* Create an account -* Control an rover in a 2D map -* Query for what the rover can see -* Persistent accounts and world -* Multiple users -* Populate map with locations/objects -* Commands happen in "real time" - -### Stretch goals - -* Rover inventory -* Rover internals -* Basic survival mechanics - -### Key missing features - -* No token security (very hackable) -* No time dilation effects -* No global coordinates -* No render of rover camera view -* No rover replacement mechanic -* No advanced app/interface diff --git a/docs/status.md b/docs/status.md new file mode 100644 index 0000000..ddada46 --- /dev/null +++ b/docs/status.md @@ -0,0 +1,28 @@ +Development status +================ + +This page tracks the current feature set and the features to implement next + +### Complete features + +* Users can register account and spawn rover +* Users can command the rover to move +* Server can return rover's current radar +* Server supports multiple users and rovers +* Map is populated with rocks +* Commands are queued and then are executed in sequence + +### Incoming features + +* Rover inventory +* Collectable materials +* Basic rover actions (e.g. dig, repair) +* Rover integrity and damage +* Rover replacement and advancement mechanic +* HTTPS + +### Stretch goals + +* Render rover camera view +* Account token security + From 8019ea4e25cd575c4df066854802826d12c5a06f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:13:23 +0100 Subject: [PATCH 244/495] Add an inventory to the rover --- pkg/game/items.go | 14 ++++++++++++++ pkg/game/rover.go | 6 ++++++ pkg/game/world.go | 7 ++++--- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 pkg/game/items.go diff --git a/pkg/game/items.go b/pkg/game/items.go new file mode 100644 index 0000000..4307454 --- /dev/null +++ b/pkg/game/items.go @@ -0,0 +1,14 @@ +package game + +// Each item is a specific type +const ( + ItemNone = byte(0) + + // Describes a single rock + ItemRock = byte(1) +) + +// Item describes an item that can be held +type Item struct { + Type byte `json:"type"` +} diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 53ba7ff..da58ca8 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -18,6 +18,9 @@ type RoverAttributes struct { // Pos represents where this rover is in the world Pos vector.Vector `json:"pos"` + + // Capacity represents the maximum number of items the rover can carry + Capacity int `json:"capacity"` } // Rover describes a single rover in the world @@ -27,4 +30,7 @@ type Rover struct { // Attributes represents the physical attributes of the rover Attributes RoverAttributes `json:"attributes"` + + // Inventory represents any items the rover is carrying + Inventory []Item `json:"inventory"` } diff --git a/pkg/game/world.go b/pkg/game/world.go index aad9a26..b248ef6 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -88,9 +88,10 @@ func (w *World) SpawnRover() (uuid.UUID, error) { rover := Rover{ Id: uuid.New(), Attributes: RoverAttributes{ - Speed: 1.0, - Range: 5.0, - Name: "rover", + Speed: 1.0, + Range: 5.0, + Capacity: 5, + Name: "rover", }, } From 7ee340e97666a8a7151e6ab164e51f710b7a7e93 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:22:37 +0100 Subject: [PATCH 245/495] Move Rover position into main class --- cmd/rove-reverse-proxy/http_test.go | 1 + cmd/rove-server/internal/routes.go | 12 ++-- pkg/game/command_test.go | 4 +- pkg/game/rover.go | 6 +- pkg/game/world.go | 58 +++++++++++----- pkg/game/world_test.go | 12 ++-- pkg/rove/rove.pb.go | 102 +++++++++++++++------------- pkg/rove/rove.swagger.json | 5 ++ proto/rove/rove.proto | 3 + 9 files changed, 126 insertions(+), 77 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 7fe55a2..943890c 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -125,4 +125,5 @@ func TestServer_Rover(t *testing.T) { assert.NotZero(t, len(resp.Name), "Rover should return valid name") assert.NotZero(t, resp.Speed, "Rover should return valid speed") assert.NotZero(t, resp.Position, "Rover should return valid position") + assert.NotZero(t, resp.Capacity, "Rover should return valid position") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 14eddf9..d1dfe20 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -62,15 +62,19 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover } else if attrib, err := s.world.RoverAttributes(id); err != nil { return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else if pos, err := s.world.RoverPosition(id); err != nil { + return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else { response = &rove.RoverResponse{ Name: attrib.Name, Position: &rove.Vector{ - X: int32(attrib.Pos.X), - Y: int32(attrib.Pos.Y), + X: int32(pos.X), + Y: int32(pos.Y), }, - Speed: int32(attrib.Speed), - Range: int32(attrib.Range), + Speed: int32(attrib.Speed), + Range: int32(attrib.Range), + Capacity: int32(attrib.Capacity), } } return response, nil diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 439d2f3..b7f7c6b 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -31,8 +31,8 @@ func TestCommand_Move(t *testing.T) { world.EnqueueAllIncoming() world.ExecuteCommandQueues() - newatributes, err := world.RoverAttributes(a) + newPos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") pos.Add(vector.Vector{X: 0.0, Y: int(duration) * int(attribs.Speed)}) // We should have moved duration*speed north - assert.Equal(t, pos, newatributes.Pos, "Failed to correctly set position for rover") + assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } diff --git a/pkg/game/rover.go b/pkg/game/rover.go index da58ca8..34d1c44 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -16,9 +16,6 @@ type RoverAttributes struct { // Name of this rover Name string `json:"name"` - // Pos represents where this rover is in the world - Pos vector.Vector `json:"pos"` - // Capacity represents the maximum number of items the rover can carry Capacity int `json:"capacity"` } @@ -28,6 +25,9 @@ type Rover struct { // Id is a unique ID for this rover Id uuid.UUID `json:"id"` + // Pos represents where this rover is in the world + Pos vector.Vector `json:"pos"` + // Attributes represents the physical attributes of the rover Attributes RoverAttributes `json:"attributes"` diff --git a/pkg/game/world.go b/pkg/game/world.go index b248ef6..e6de688 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -101,26 +101,26 @@ func (w *World) SpawnRover() (uuid.UUID, error) { } // Spawn in a random place near the origin - rover.Attributes.Pos = vector.Vector{ + rover.Pos = vector.Vector{ X: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), Y: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), } // Seach until we error (run out of world) for { - if tile, err := w.Atlas.GetTile(rover.Attributes.Pos); err != nil { + if tile, err := w.Atlas.GetTile(rover.Pos); err != nil { return uuid.Nil, err } else { if !atlas.IsBlocking(tile) { break } else { // Try and spawn to the east of the blockage - rover.Attributes.Pos.Add(vector.Vector{X: 1, Y: 0}) + rover.Pos.Add(vector.Vector{X: 1, Y: 0}) } } } - log.Printf("Spawned rover at %+v\n", rover.Attributes.Pos) + log.Printf("Spawned rover at %+v\n", rover.Pos) // Append the rover to the list w.Rovers[rover.Id] = rover @@ -135,7 +135,7 @@ func (w *World) DestroyRover(id uuid.UUID) error { if i, ok := w.Rovers[id]; ok { // Clear the tile - if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil { + if err := w.Atlas.SetTile(i.Pos, atlas.TileEmpty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } delete(w.Rovers, id) @@ -145,6 +145,32 @@ func (w *World) DestroyRover(id uuid.UUID) error { return nil } +// RoverPosition returns the position of the rover +func (w *World) RoverPosition(id uuid.UUID) (vector.Vector, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + + if i, ok := w.Rovers[id]; ok { + return i.Pos, nil + } else { + return vector.Vector{}, fmt.Errorf("no rover matching id") + } +} + +// SetRoverPosition sets the position of the rover +func (w *World) SetRoverPosition(id uuid.UUID, pos vector.Vector) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + if i, ok := w.Rovers[id]; ok { + i.Pos = pos + w.Rovers[id] = i + return nil + } else { + return fmt.Errorf("no rover matching id") + } +} + // RoverAttributes returns the attributes of a requested rover func (w *World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { w.worldMutex.RLock() @@ -178,7 +204,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { if i, ok := w.Rovers[id]; ok { // Nothing to do if these positions match - if i.Attributes.Pos == pos { + if i.Pos == pos { return nil } @@ -189,7 +215,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } - i.Attributes.Pos = pos + i.Pos = pos w.Rovers[id] = i return nil } else { @@ -198,7 +224,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, error) { +func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -210,20 +236,20 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err move := b.Vector().Multiplied(distance) // Try the new move position - newPos := i.Attributes.Pos.Added(move) + newPos := i.Pos.Added(move) // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { - return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err) + return vector.Vector{}, fmt.Errorf("couldn't get tile for new position: %s", err) } else if !atlas.IsBlocking(tile) { // Perform the move - i.Attributes.Pos = newPos + i.Pos = newPos w.Rovers[id] = i } - return i.Attributes, nil + return i.Pos, nil } else { - return RoverAttributes{}, fmt.Errorf("no rover matching id") + return vector.Vector{}, fmt.Errorf("no rover matching id") } } @@ -235,7 +261,7 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { if r, ok := w.Rovers[id]; ok { // The radar should span in range direction on each axis, plus the row/column the rover is currently on radarSpan := (r.Attributes.Range * 2) + 1 - roverPos := r.Attributes.Pos + roverPos := r.Pos // Get the radar min and max values radarMin := vector.Vector{ @@ -279,11 +305,11 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { // Add all rovers to the radar for _, r := range w.Rovers { // If the rover is in range - dist := r.Attributes.Pos.Added(roverPos.Negated()) + dist := r.Pos.Added(roverPos.Negated()) dist = dist.Abs() if dist.X <= r.Attributes.Range && dist.Y <= r.Attributes.Range { - relative := r.Attributes.Pos.Added(radarMin.Negated()) + relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan radar[index] = atlas.TileRover } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index cc6ccac..3e02aec 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -76,21 +76,21 @@ func TestWorld_GetSetMovePosition(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - newAttribs, err := world.RoverAttributes(a) + newPos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") - assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly set position for rover") + assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") b := bearing.North duration := 1 - newAttribs, err = world.MoveRover(a, b) + newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") pos.Add(vector.Vector{X: 0, Y: attribs.Speed * duration}) // We should have move one unit of the speed north - assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover") + assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileLargeRock)) - newAttribs, err = world.MoveRover(a, b) - assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall") + newPos, err = world.MoveRover(a, b) + assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") } func TestWorld_RadarFromRover(t *testing.T) { diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 46cd3c8..fe34511 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -497,6 +497,8 @@ type RoverResponse struct { Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` // The speed the rover can move per tick Speed int32 `protobuf:"varint,4,opt,name=speed,proto3" json:"speed,omitempty"` + // The inventory capacity of the rover + Capacity int32 `protobuf:"varint,5,opt,name=Capacity,proto3" json:"Capacity,omitempty"` } func (x *RoverResponse) Reset() { @@ -559,6 +561,13 @@ func (x *RoverResponse) GetSpeed() int32 { return 0 } +func (x *RoverResponse) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -761,52 +770,53 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, - 0x65, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, - 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, - 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, - 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, - 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, - 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, - 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, + 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, + 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, + 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index dcf48ee..04773ee 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -311,6 +311,11 @@ "type": "integer", "format": "int32", "title": "The speed the rover can move per tick" + }, + "Capacity": { + "type": "integer", + "format": "int32", + "title": "The inventory capacity of the rover" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 12d50eb..58fc115 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -125,6 +125,9 @@ message RoverResponse { // The speed the rover can move per tick int32 speed = 4; + + // The inventory capacity of the rover + int32 Capacity = 5; } // Empty placeholder From a84709564c0c0af4ce08f7464d5c66b8ae9d5af5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:24:03 +0100 Subject: [PATCH 246/495] Minor refactor to move name to top of attributes class --- pkg/game/rover.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 34d1c44..02faa44 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -7,15 +7,15 @@ import ( // RoverAttributes contains attributes of a rover type RoverAttributes struct { + // Name of this rover + Name string `json:"name"` + // Speed represents the Speed that the rover will move per second Speed int `json:"speed"` // Range represents the distance the unit's radar can see Range int `json:"range"` - // Name of this rover - Name string `json:"name"` - // Capacity represents the maximum number of items the rover can carry Capacity int `json:"capacity"` } From db3c2c2c2e6dd06112f06ec7372db29b3c350906 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:48:07 +0100 Subject: [PATCH 247/495] De-scope, remove rover speed --- cmd/rove-reverse-proxy/http_test.go | 1 - cmd/rove-server/internal/routes.go | 1 - pkg/game/command_test.go | 5 +- pkg/game/rover.go | 3 - pkg/game/world.go | 12 +--- pkg/game/world_test.go | 5 +- pkg/rove/rove.pb.go | 102 +++++++++++++--------------- pkg/rove/rove.swagger.json | 5 -- proto/rove/rove.proto | 3 - 9 files changed, 51 insertions(+), 86 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 943890c..484336a 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -123,7 +123,6 @@ func TestServer_Rover(t *testing.T) { assert.NoError(t, err, "Rover sould pass should pass") assert.NotZero(t, resp.Range, "Rover should return valid range") assert.NotZero(t, len(resp.Name), "Rover should return valid name") - assert.NotZero(t, resp.Speed, "Rover should return valid speed") assert.NotZero(t, resp.Position, "Rover should return valid position") assert.NotZero(t, resp.Capacity, "Rover should return valid position") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index d1dfe20..ca1604d 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -72,7 +72,6 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover X: int32(pos.X), Y: int32(pos.Y), }, - Speed: int32(attrib.Speed), Range: int32(attrib.Range), Capacity: int32(attrib.Capacity), } diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index b7f7c6b..7ba3c86 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -16,9 +16,6 @@ func TestCommand_Move(t *testing.T) { Y: 2.0, } - attribs, err := world.RoverAttributes(a) - assert.NoError(t, err, "Failed to get rover attribs") - err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -33,6 +30,6 @@ func TestCommand_Move(t *testing.T) { newPos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0.0, Y: int(duration) * int(attribs.Speed)}) // We should have moved duration*speed north + pos.Add(vector.Vector{X: 0.0, Y: int(duration)}) assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 02faa44..b989b5d 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -10,9 +10,6 @@ type RoverAttributes struct { // Name of this rover Name string `json:"name"` - // Speed represents the Speed that the rover will move per second - Speed int `json:"speed"` - // Range represents the distance the unit's radar can see Range int `json:"range"` diff --git a/pkg/game/world.go b/pkg/game/world.go index e6de688..2550c1e 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -88,7 +88,6 @@ func (w *World) SpawnRover() (uuid.UUID, error) { rover := Rover{ Id: uuid.New(), Attributes: RoverAttributes{ - Speed: 1.0, Range: 5.0, Capacity: 5, Name: "rover", @@ -229,14 +228,8 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error defer w.worldMutex.Unlock() if i, ok := w.Rovers[id]; ok { - // Calculate the distance - distance := i.Attributes.Speed - - // Calculate the full movement based on the bearing - move := b.Vector().Multiplied(distance) - // Try the new move position - newPos := i.Pos.Added(move) + newPos := i.Pos.Added(b.Vector()) // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { @@ -402,7 +395,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err log.Printf("Executing command: %+v\n", *c) switch c.Command { - case "move": + case CommandMove: if dir, err := bearing.FromString(c.Bearing); err != nil { return true, fmt.Errorf("unknown bearing in command %+v, skipping: %s\n", c, err) @@ -418,6 +411,7 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err finished = true } } + default: return true, fmt.Errorf("unknown command: %s", c.Command) } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 3e02aec..d3ae680 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -40,7 +40,6 @@ func TestWorld_RoverAttributes(t *testing.T) { attribs, err := world.RoverAttributes(a) assert.NoError(t, err, "Failed to get rover attribs") assert.NotZero(t, attribs.Range, "Rover should not be spawned blind") - assert.NotZero(t, attribs.Speed, "Rover should not be spawned unable to move") } func TestWorld_DestroyRover(t *testing.T) { @@ -65,8 +64,6 @@ func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld(4, 4) a, err := world.SpawnRover() assert.NoError(t, err) - attribs, err := world.RoverAttributes(a) - assert.NoError(t, err, "Failed to get rover attribs") pos := vector.Vector{ X: 0.0, @@ -84,7 +81,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { duration := 1 newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0, Y: attribs.Speed * duration}) // We should have move one unit of the speed north + pos.Add(vector.Vector{X: 0, Y: duration}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index fe34511..63fdeec 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -495,8 +495,6 @@ type RoverResponse struct { Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` // The range of this rover's radar Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` - // The speed the rover can move per tick - Speed int32 `protobuf:"varint,4,opt,name=speed,proto3" json:"speed,omitempty"` // The inventory capacity of the rover Capacity int32 `protobuf:"varint,5,opt,name=Capacity,proto3" json:"Capacity,omitempty"` } @@ -554,13 +552,6 @@ func (x *RoverResponse) GetRange() int32 { return 0 } -func (x *RoverResponse) GetSpeed() int32 { - if x != nil { - return x.Speed - } - return 0 -} - func (x *RoverResponse) GetCapacity() int32 { if x != nil { return x.Capacity @@ -770,53 +761,52 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, - 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, - 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, - 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7f, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, + 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, + 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, + 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, + 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, + 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 04773ee..e166d1a 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -307,11 +307,6 @@ "format": "int32", "title": "The range of this rover's radar" }, - "speed": { - "type": "integer", - "format": "int32", - "title": "The speed the rover can move per tick" - }, "Capacity": { "type": "integer", "format": "int32", diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 58fc115..f17c539 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -123,9 +123,6 @@ message RoverResponse { // The range of this rover's radar int32 range = 3; - // The speed the rover can move per tick - int32 speed = 4; - // The inventory capacity of the rover int32 Capacity = 5; } From 8b1eca0aee2726acc871a26db574cb383c35f15b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 18:59:12 +0100 Subject: [PATCH 248/495] Implement basic stash command --- pkg/game/command.go | 2 ++ pkg/game/items.go | 8 -------- pkg/game/world.go | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index cc303bc..7e43dbc 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -2,6 +2,8 @@ package game const ( CommandMove = "move" + + CommandStash = "stash" ) // Command represends a single command to execute diff --git a/pkg/game/items.go b/pkg/game/items.go index 4307454..4d3c918 100644 --- a/pkg/game/items.go +++ b/pkg/game/items.go @@ -1,13 +1,5 @@ package game -// Each item is a specific type -const ( - ItemNone = byte(0) - - // Describes a single rock - ItemRock = byte(1) -) - // Item describes an item that can be held type Item struct { Type byte `json:"type"` diff --git a/pkg/game/world.go b/pkg/game/world.go index 2550c1e..2bb7d6a 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -71,6 +71,8 @@ func NewWorld(size, chunkSize int) *World { // SpawnWorld spawns a border at the edge of the world atlas func (w *World) SpawnWorld(fillWorld bool) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() if fillWorld { if err := w.Atlas.SpawnRocks(); err != nil { return err @@ -246,6 +248,27 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error } } +// RoverStash will stash an item at the current rovers position +func (w *World) RoverStash(id uuid.UUID) (byte, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + if r, ok := w.Rovers[id]; ok { + if tile, err := w.Atlas.GetTile(r.Pos); err != nil { + return atlas.TileEmpty, err + } else { + if tile != atlas.TileEmpty { + r.Inventory = append(r.Inventory, Item{Type: tile}) + } + } + + } else { + return atlas.TileEmpty, fmt.Errorf("no rover matching id") + } + + return atlas.TileEmpty, nil +} + // RadarFromRover can be used to query what a rover can currently see func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { w.worldMutex.RLock() @@ -397,10 +420,10 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err switch c.Command { case CommandMove: if dir, err := bearing.FromString(c.Bearing); err != nil { - return true, fmt.Errorf("unknown bearing in command %+v, skipping: %s\n", c, err) + return true, err } else if _, err := w.MoveRover(rover, dir); err != nil { - return true, fmt.Errorf("error moving rover in command %+v, skipping: %s\n", c, err) + return true, err } else { // If we've successfully moved, reduce the duration by 1 @@ -412,6 +435,13 @@ func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err } } + case CommandStash: + if _, err := w.RoverStash(rover); err != nil { + return true, err + } else { + return true, nil + } + default: return true, fmt.Errorf("unknown command: %s", c.Command) } From 2846ed796eff254faa7558bea76f4dcabcc583a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 19:45:24 +0100 Subject: [PATCH 249/495] Refactor tiles to objects to be re-used --- pkg/atlas/atlas.go | 13 +++++++------ pkg/atlas/atlas_test.go | 9 +++++---- pkg/atlas/tile.go | 23 ----------------------- pkg/game/world.go | 22 ++++++++++++---------- pkg/game/world_test.go | 16 ++++++++-------- pkg/objects/objects.go | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 69 insertions(+), 51 deletions(-) delete mode 100644 pkg/atlas/tile.go create mode 100644 pkg/objects/objects.go diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 1446cad..429efcb 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -6,6 +6,7 @@ import ( "math/rand" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -44,7 +45,7 @@ func NewAtlas(size, chunkSize int) Atlas { for i := range a.Chunks { tiles := make([]byte, chunkSize*chunkSize) for i := 0; i < len(tiles); i++ { - tiles[i] = TileEmpty + tiles[i] = objects.Empty } a.Chunks[i] = Chunk{ Tiles: tiles, @@ -62,7 +63,7 @@ func (a *Atlas) SpawnRocks() error { for i := -extent; i < extent; i++ { for j := -extent; j < extent; j++ { if rand.Intn(16) == 0 { - if err := a.SetTile(vector.Vector{X: i, Y: j}, TileSmallRock); err != nil { + if err := a.SetTile(vector.Vector{X: i, Y: j}, objects.SmallRock); err != nil { return err } } @@ -79,13 +80,13 @@ func (a *Atlas) SpawnWalls() error { // Surround the atlas in walls for i := -extent; i < extent; i++ { - if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileLargeRock); err != nil { // N + if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, objects.LargeRock); err != nil { // N return err - } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileLargeRock); err != nil { // E + } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, objects.LargeRock); err != nil { // E return err - } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileLargeRock); err != nil { // S + } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, objects.LargeRock); err != nil { // S return err - } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileLargeRock); err != nil { // W + } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, objects.LargeRock); err != nil { // W return err } } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 8bda108..f8cc63a 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -3,6 +3,7 @@ package atlas import ( "testing" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -146,24 +147,24 @@ func TestAtlas_SpawnWorld(t *testing.T) { for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: -4}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: -4, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: 3, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: 3}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } } diff --git a/pkg/atlas/tile.go b/pkg/atlas/tile.go deleted file mode 100644 index 3de13cb..0000000 --- a/pkg/atlas/tile.go +++ /dev/null @@ -1,23 +0,0 @@ -package atlas - -const ( - TileEmpty = byte(' ') - TileRover = byte('R') - TileSmallRock = byte('o') - TileLargeRock = byte('O') -) - -// BlockingTiles describes any tiles that block -var BlockingTiles = [...]byte{ - TileLargeRock, -} - -// Check if a tile is a blocking tile -func IsBlocking(tile byte) bool { - for _, t := range BlockingTiles { - if tile == t { - return true - } - } - return false -} diff --git a/pkg/game/world.go b/pkg/game/world.go index 2bb7d6a..31859a2 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -13,6 +13,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -112,7 +113,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { if tile, err := w.Atlas.GetTile(rover.Pos); err != nil { return uuid.Nil, err } else { - if !atlas.IsBlocking(tile) { + if !objects.IsBlocking(tile) { break } else { // Try and spawn to the east of the blockage @@ -136,7 +137,7 @@ func (w *World) DestroyRover(id uuid.UUID) error { if i, ok := w.Rovers[id]; ok { // Clear the tile - if err := w.Atlas.SetTile(i.Pos, atlas.TileEmpty); err != nil { + if err := w.Atlas.SetTile(i.Pos, objects.Empty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } delete(w.Rovers, id) @@ -212,7 +213,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { // Check the tile is not blocked if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) - } else if atlas.IsBlocking(tile) { + } else if objects.IsBlocking(tile) { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } @@ -236,7 +237,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { return vector.Vector{}, fmt.Errorf("couldn't get tile for new position: %s", err) - } else if !atlas.IsBlocking(tile) { + } else if !objects.IsBlocking(tile) { // Perform the move i.Pos = newPos w.Rovers[id] = i @@ -255,18 +256,19 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { if r, ok := w.Rovers[id]; ok { if tile, err := w.Atlas.GetTile(r.Pos); err != nil { - return atlas.TileEmpty, err + return objects.Empty, err } else { - if tile != atlas.TileEmpty { + // TODO: Get if item grabbable and clear tile + if tile != objects.Empty { r.Inventory = append(r.Inventory, Item{Type: tile}) } } } else { - return atlas.TileEmpty, fmt.Errorf("no rover matching id") + return objects.Empty, fmt.Errorf("no rover matching id") } - return atlas.TileEmpty, nil + return objects.Empty, nil } // RadarFromRover can be used to query what a rover can currently see @@ -327,12 +329,12 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { if dist.X <= r.Attributes.Range && dist.Y <= r.Attributes.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - radar[index] = atlas.TileRover + radar[index] = objects.Rover } } // Add this rover - radar[len(radar)/2] = atlas.TileRover + radar[len(radar)/2] = objects.Rover return radar, nil } else { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index d3ae680..ca4d859 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,8 +3,8 @@ package game import ( "testing" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -85,7 +85,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileLargeRock)) + assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, objects.LargeRock)) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") } @@ -132,12 +132,12 @@ func TestWorld_RadarFromRover(t *testing.T) { PrintTiles(radar) // Test all expected values - assert.Equal(t, atlas.TileRover, radar[1+fullRange]) - assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) + assert.Equal(t, objects.Rover, radar[1+fullRange]) + assert.Equal(t, objects.Rover, radar[4+4*fullRange]) for i := 0; i < 8; i++ { - assert.Equal(t, atlas.TileLargeRock, radar[i]) - assert.Equal(t, atlas.TileLargeRock, radar[i+(7*9)]) - assert.Equal(t, atlas.TileLargeRock, radar[i*9]) - assert.Equal(t, atlas.TileLargeRock, radar[(i*9)+7]) + assert.Equal(t, objects.LargeRock, radar[i]) + assert.Equal(t, objects.LargeRock, radar[i+(7*9)]) + assert.Equal(t, objects.LargeRock, radar[i*9]) + assert.Equal(t, objects.LargeRock, radar[(i*9)+7]) } } diff --git a/pkg/objects/objects.go b/pkg/objects/objects.go new file mode 100644 index 0000000..2f509c6 --- /dev/null +++ b/pkg/objects/objects.go @@ -0,0 +1,37 @@ +package objects + +const ( + Empty = byte(' ') + Rover = byte('R') + SmallRock = byte('o') + LargeRock = byte('O') +) + +// Check if an object is a blocking object +func IsBlocking(object byte) bool { + var blocking = [...]byte{ + Rover, + LargeRock, + } + + for _, t := range blocking { + if object == t { + return true + } + } + return false +} + +// Check if an object is stashable +func IsStashable(object byte) bool { + var stashable = [...]byte{ + SmallRock, + } + + for _, t := range stashable { + if object == t { + return true + } + } + return false +} From 00bdad6b40f2ba98a08c841cbb1213248922b2b5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 19:47:01 +0100 Subject: [PATCH 250/495] Fix stashing Now checks if object is stashable and clears the tile --- pkg/game/world.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 31859a2..a1e57f4 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -258,9 +258,13 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { if tile, err := w.Atlas.GetTile(r.Pos); err != nil { return objects.Empty, err } else { - // TODO: Get if item grabbable and clear tile - if tile != objects.Empty { + if objects.IsStashable(tile) { r.Inventory = append(r.Inventory, Item{Type: tile}) + if err := w.Atlas.SetTile(r.Pos, objects.Empty); err != nil { + return objects.Empty, err + } else { + return tile, nil + } } } From 383e834cefe08c4a9eb11cfa328f518feb6a5ac7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 20:14:00 +0100 Subject: [PATCH 251/495] Add RoverStash test --- pkg/game/world_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index ca4d859..4e69e77 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -141,3 +141,28 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, objects.LargeRock, radar[(i*9)+7]) } } + +func TestWorld_RoverStash(t *testing.T) { + world := NewWorld(2, 2) + a, err := world.SpawnRover() + assert.NoError(t, err) + + pos := vector.Vector{ + X: 0.0, + Y: 0.0, + } + + err = world.WarpRover(a, pos) + assert.NoError(t, err, "Failed to set position for rover") + + err = world.Atlas.SetTile(pos, objects.SmallRock) + assert.NoError(t, err, "Failed to set tile to rock") + + o, err := world.RoverStash(a) + assert.NoError(t, err, "Failed to stash") + assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + + tile, err := world.Atlas.GetTile(pos) + assert.NoError(t, err, "Failed to get tile") + assert.Equal(t, objects.Empty, tile, "Stash failed to remove object from atlas") +} From 2f6465987dc17c6db21d9932bdea7b7eb1824c57 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 22:26:27 +0100 Subject: [PATCH 252/495] More de-scope - remove duration on move command This isn't even needed, as commands can just be queued up --- cmd/rove-reverse-proxy/http_test.go | 5 +- cmd/rove-server/internal/routes.go | 5 +- cmd/rove/main.go | 8 +- cmd/rove/main_test.go | 1 - pkg/game/command.go | 3 +- pkg/game/command_test.go | 5 +- pkg/game/world.go | 33 ++---- pkg/rove/rove.pb.go | 153 +++++++++++++--------------- pkg/rove/rove.swagger.json | 9 +- proto/rove/rove.proto | 9 +- 10 files changed, 97 insertions(+), 134 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 484336a..9ad2007 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -87,9 +87,8 @@ func TestServer_Command(t *testing.T) { Account: acc, Commands: []*rove.Command{ { - Command: "move", - Bearing: "NE", - Duration: 1, + Command: "move", + Bearing: "NE", }, }, }, &rove.CommandsResponse{}) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index ca1604d..1fd452b 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -126,9 +126,8 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove var cmds []game.Command for _, c := range req.Commands { cmds = append(cmds, game.Command{ - Bearing: c.Bearing, - Command: c.Command, - Duration: int(c.Duration)}) + Bearing: c.Bearing, + Command: c.Command}) } if err := s.world.Enqueue(id, cmds...); err != nil { diff --git a/cmd/rove/main.go b/cmd/rove/main.go index d396e6b..5db99d3 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -44,8 +44,7 @@ var data = flag.String("data", defaultDataPath, "data location for storage (or $ // For register command var name = flag.String("name", "", "used with status command for the account name") -// For the duration command -var duration = flag.Int("duration", 1, "used for the move command duration") +// For the move command var bearing = flag.String("bearing", "", "used for the move command bearing (compass direction)") // Config is used to store internal data @@ -166,9 +165,8 @@ func InnerMain(command string) error { Account: config.Accounts[config.Host], Commands: []*rove.Command{ { - Command: game.CommandMove, - Duration: int32(*duration), - Bearing: *bearing, + Command: game.CommandMove, + Bearing: *bearing, }, }, } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index aea0b0e..4613e45 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -52,6 +52,5 @@ func Test_InnerMain(t *testing.T) { // Move should work with arguments flag.Set("bearing", "N") - flag.Set("duration", "1") assert.NoError(t, InnerMain("move")) } diff --git a/pkg/game/command.go b/pkg/game/command.go index 7e43dbc..0bc9c5b 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -11,8 +11,7 @@ type Command struct { Command string `json:"command"` // Used in the move command - Bearing string `json:"bearing,omitempty"` - Duration int `json:"duration,omitempty"` + Bearing string `json:"bearing,omitempty"` } // CommandStream is a list of commands to execute in order diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 7ba3c86..11da854 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -19,9 +19,8 @@ func TestCommand_Move(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - var duration = 1 // Try the move command - moveCommand := Command{Command: CommandMove, Bearing: "N", Duration: duration} + moveCommand := Command{Command: CommandMove, Bearing: "N"} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world @@ -30,6 +29,6 @@ func TestCommand_Move(t *testing.T) { newPos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0.0, Y: int(duration)}) + pos.Add(vector.Vector{X: 0.0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } diff --git a/pkg/game/world.go b/pkg/game/world.go index a1e57f4..522c042 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -396,19 +396,14 @@ func (w *World) ExecuteCommandQueues() { if len(cmds) != 0 { // Extract the first command in the queue c := cmds[0] + w.CommandQueue[rover] = cmds[1:] - // Execute the command and clear up if requested - if done, err := w.ExecuteCommand(&c, rover); err != nil { - w.CommandQueue[rover] = cmds[1:] + // Execute the command + if err := w.ExecuteCommand(&c, rover); err != nil { log.Println(err) - } else if done { - w.CommandQueue[rover] = cmds[1:] - } else { - w.CommandQueue[rover][0] = c + // TODO: Report this error somehow } - // If there was an error - } else { // Clean out the empty entry delete(w.CommandQueue, rover) @@ -420,36 +415,26 @@ func (w *World) ExecuteCommandQueues() { } // ExecuteCommand will execute a single command -func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (finished bool, err error) { +func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (err error) { log.Printf("Executing command: %+v\n", *c) switch c.Command { case CommandMove: if dir, err := bearing.FromString(c.Bearing); err != nil { - return true, err + return err } else if _, err := w.MoveRover(rover, dir); err != nil { - return true, err + return err - } else { - // If we've successfully moved, reduce the duration by 1 - c.Duration -= 1 - - // If we've used up the full duration, remove it, otherwise update - if c.Duration == 0 { - finished = true - } } case CommandStash: if _, err := w.RoverStash(rover); err != nil { - return true, err - } else { - return true, nil + return err } default: - return true, fmt.Errorf("unknown command: %s", c.Command) + return fmt.Errorf("unknown command: %s", c.Command) } return diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 63fdeec..35558cf 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -39,12 +39,12 @@ type Command struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The command to execute, currently only accepts move, which requires a bearing and a duration. + // The command to execute + // "move" - Move the rover in a direction, requires bearing + // "stash" - Stashes item at current location in rover inventory Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` // The bearing, example: NE Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` - // The duration in ticks, example: 5 - Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` } func (x *Command) Reset() { @@ -93,19 +93,12 @@ func (x *Command) GetBearing() string { return "" } -func (x *Command) GetDuration() int32 { - if x != nil { - return x.Duration - } - return 0 -} - type CommandsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The account to execture these commands + // The account to execute these commands Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The set of desired commands Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` @@ -734,79 +727,77 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, 0x0c, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7f, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, - 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, - 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, - 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, - 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, - 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, - 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x12, 0x0a, 0x10, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x28, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x0d, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7f, 0x0a, 0x0d, 0x52, + 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, + 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, + 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, + 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index e166d1a..4ec6053 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -212,16 +212,11 @@ "properties": { "command": { "type": "string", - "description": "The command to execute, currently only accepts move, which requires a bearing and a duration." + "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory" }, "bearing": { "type": "string", "title": "The bearing, example: NE" - }, - "duration": { - "type": "integer", - "format": "int32", - "title": "The duration in ticks, example: 5" } } }, @@ -230,7 +225,7 @@ "properties": { "account": { "type": "string", - "title": "The account to execture these commands" + "title": "The account to execute these commands" }, "commands": { "type": "array", diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index f17c539..40b1050 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -61,18 +61,17 @@ service Rove { } message Command { - // The command to execute, currently only accepts move, which requires a bearing and a duration. + // The command to execute + // "move" - Move the rover in a direction, requires bearing + // "stash" - Stashes item at current location in rover inventory string command = 1; // The bearing, example: NE string bearing = 2; - - // The duration in ticks, example: 5 - int32 duration = 3; } message CommandsRequest { - // The account to execture these commands + // The account to execute these commands string account = 1; // The set of desired commands From d624a3ca2124b65ab317e638aa7aa9a144a6afe4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:30:42 +0100 Subject: [PATCH 253/495] Add verification for "stash" command --- pkg/game/world.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index 522c042..d3956dd 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -356,6 +356,8 @@ func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } + case "stash": + // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) } From 6c09ee38269269979b2b58c06f30782cc1e01d29 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:31:06 +0100 Subject: [PATCH 254/495] Refactor main to accept commands and arguments --- cmd/rove/main.go | 232 ++++++++++++++++++++++++----------------- cmd/rove/main_test.go | 39 ++++--- pkg/game/world_test.go | 3 +- 3 files changed, 163 insertions(+), 111 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 5db99d3..172494d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "flag" "fmt" "io/ioutil" "os" @@ -10,6 +9,7 @@ import ( "path/filepath" "time" + "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" @@ -17,42 +17,90 @@ import ( "google.golang.org/grpc" ) -// Command usage -func printUsage() { - fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [OPTIONS]...\n", os.Args[0]) - fmt.Fprintln(os.Stderr, "\nCommands:") - fmt.Fprintln(os.Stderr, "\tstatus \tprints the server status") - fmt.Fprintln(os.Stderr, "\tregister\tregisters an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tmove \tissues move command to rover") - fmt.Fprintln(os.Stderr, "\tradar \tgathers radar data for the current rover") - fmt.Fprintln(os.Stderr, "\trover \tgets data for current rover") - fmt.Fprintln(os.Stderr, "\tconfig \toutputs the local config info") - fmt.Fprintln(os.Stderr, "\tversion \toutputs version info") - fmt.Fprintln(os.Stderr, "\nOptions:") - flag.PrintDefaults() -} - var home = os.Getenv("HOME") var defaultDataPath = path.Join(home, ".local/share/") +// Command usage +func printUsage() { + fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [ARGS]...\n", os.Args[0]) + fmt.Fprintln(os.Stderr, "\nCommands") + fmt.Fprintln(os.Stderr, "\tstatus prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") + fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issues move command to rover") + fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") + fmt.Fprintln(os.Stderr, "\trover gets data for current rover") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") + fmt.Fprintln(os.Stderr, "\tversion outputs version info") + fmt.Fprintln(os.Stderr, "\nEnvironment") + fmt.Fprintln(os.Stderr, "\tUSER_DATA path to user data, defaults to "+defaultDataPath) + fmt.Fprintln(os.Stderr, "\tROVE_HOST path to rove host server") +} + const gRPCport = 9090 -// General usage -var host = flag.String("host", "", "path to game host server") -var data = flag.String("data", defaultDataPath, "data location for storage (or $USER_DATA if set)") - -// For register command -var name = flag.String("name", "", "used with status command for the account name") - -// For the move command -var bearing = flag.String("bearing", "", "used for the move command bearing (compass direction)") - // Config is used to store internal data type Config struct { Host string `json:"host,omitempty"` Accounts map[string]string `json:"accounts,omitempty"` } +// ConfigPath returns the configuration path +func ConfigPath() string { + // Allow overriding the data path + var datapath = defaultDataPath + var override = os.Getenv("USER_DATA") + if len(override) > 0 { + datapath = override + } + datapath = path.Join(datapath, "rove.json") + + return datapath +} + +// LoadConfig loads the config from a chosen path +func LoadConfig() (config Config, err error) { + + datapath := ConfigPath() + config.Accounts = make(map[string]string) + + // Create the path if needed + path := filepath.Dir(datapath) + if _, err := os.Stat(path); os.IsNotExist(err) { + os.MkdirAll(path, os.ModePerm) + } else { + // Read the file + _, err = os.Stat(datapath) + if !os.IsNotExist(err) { + if b, err := ioutil.ReadFile(datapath); err != nil { + return Config{}, fmt.Errorf("failed to read file %s error: %s", datapath, err) + + } else if len(b) == 0 { + return Config{}, fmt.Errorf("file %s was empty, assumin fresh data", datapath) + + } else if err := json.Unmarshal(b, &config); err != nil { + return Config{}, fmt.Errorf("failed to unmarshal file %s error: %s", datapath, err) + + } + } + } + + return +} + +// SaveConfig saves the config out +func SaveConfig(config Config) error { + // Save out the persistent file + datapath := ConfigPath() + if b, err := json.MarshalIndent(config, "", "\t"); err != nil { + return fmt.Errorf("failed to marshal data error: %s", err) + } else if err := ioutil.WriteFile(datapath, b, os.ModePerm); err != nil { + return fmt.Errorf("failed to save file %s error: %s", datapath, err) + } + + return nil +} + // verifyID will verify an account ID func verifyID(id string) error { if len(id) == 0 { @@ -62,61 +110,43 @@ func verifyID(id string) error { } // InnerMain wraps the main function so we can test it -func InnerMain(command string) error { +func InnerMain(command string, args ...string) error { - // Load in the persistent file - var config = Config{ - Accounts: make(map[string]string), - } - - // Allow overriding the data path - var datapath = *data - var override = os.Getenv("USER_DATA") - if len(override) > 0 { - datapath = override - } - datapath = path.Join(datapath, "rove.json") - - // Create the path if needed - path := filepath.Dir(datapath) - _, err := os.Stat(path) - if os.IsNotExist(err) { - os.MkdirAll(path, os.ModePerm) - } else { - // Read the file - _, err = os.Stat(datapath) - if !os.IsNotExist(err) { - if b, err := ioutil.ReadFile(datapath); err != nil { - return fmt.Errorf("failed to read file %s error: %s", datapath, err) - - } else if len(b) == 0 { - return fmt.Errorf("file %s was empty, assumin fresh data", datapath) - - } else if err := json.Unmarshal(b, &config); err != nil { - return fmt.Errorf("failed to unmarshal file %s error: %s", datapath, err) - - } - } - } - - // Early bails + // Early simple bails switch command { + case "help": + printUsage() + return nil case "version": fmt.Println(version.Version) return nil - case "config": + } + + // Load in the persistent file + config, err := LoadConfig() + if err != nil { + return err + } + + // Run config command before server needed + if command == "config" { + if len(args) > 1 { + config.Host = args[1] + SaveConfig(config) + } fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Accounts[config.Host]) return nil } - // If there's a host set on the command line, override the one in the config - if len(*host) != 0 { - config.Host = *host + // Allow overriding the host + hostOverride := os.Getenv("ROVE_HOST") + if len(hostOverride) > 0 { + config.Host = hostOverride } // If there's still no host, bail if len(config.Host) == 0 { - return fmt.Errorf("no host set, please set one with -host") + return fmt.Errorf("no host set, set one with '%s config {HOST}'", os.Args[0]) } // Set up the server @@ -144,11 +174,12 @@ func InnerMain(command string) error { } case "register": - if len(*name) == 0 { - return fmt.Errorf("must set name with -name") + if len(args) == 0 { + return fmt.Errorf("must pass name to 'register'") } + name := args[0] d := rove.RegisterRequest{ - Name: *name, + Name: name, } _, err := client.Register(ctx, &d) switch { @@ -156,19 +187,44 @@ func InnerMain(command string) error { return err default: - fmt.Printf("Registered account with id: %s\n", *name) - config.Accounts[config.Host] = *name + fmt.Printf("Registered account with id: %s\n", name) + config.Accounts[config.Host] = name + } + + case "commands": + if len(args) == 0 { + return fmt.Errorf("must pass commands to 'commands'") + } + + // Iterate through each command + var commands []*rove.Command + for i := 0; i < len(args); i++ { + switch args[i] { + case "move": + i++ + if len(args) == i { + return fmt.Errorf("move command must be passed bearing") + } else if _, err := bearing.FromString(args[i]); err != nil { + return err + } + commands = append(commands, + &rove.Command{ + Command: game.CommandMove, + Bearing: args[i], + }, + ) + case "stash": + commands = append(commands, + &rove.Command{ + Command: game.CommandStash, + }, + ) + } } - case "move": d := rove.CommandsRequest{ - Account: config.Accounts[config.Host], - Commands: []*rove.Command{ - { - Command: game.CommandMove, - Bearing: *bearing, - }, - }, + Account: config.Accounts[config.Host], + Commands: commands, } if err := verifyID(d.Account); err != nil { @@ -222,30 +278,20 @@ func InnerMain(command string) error { os.Exit(1) } - // Save out the persistent file - if b, err := json.MarshalIndent(config, "", "\t"); err != nil { - return fmt.Errorf("failed to marshal data error: %s", err) - } else if err := ioutil.WriteFile(datapath, b, os.ModePerm); err != nil { - return fmt.Errorf("failed to save file %s error: %s", datapath, err) - } - + SaveConfig(config) return nil } // Simple main func main() { - flag.Usage = printUsage - // Bail without any args if len(os.Args) == 1 { printUsage() os.Exit(1) } - flag.CommandLine.Parse(os.Args[2:]) - // Run the inner main - if err := InnerMain(os.Args[1]); err != nil { + if err := InnerMain(os.Args[1], os.Args[1:]...); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) os.Exit(1) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 4613e45..1a689f1 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -3,10 +3,9 @@ package main import ( - "flag" + "io/ioutil" "log" "os" - "path" "testing" "github.com/google/uuid" @@ -15,42 +14,50 @@ import ( func Test_InnerMain(t *testing.T) { + // Use temporary local user data + tmp, err := ioutil.TempDir(os.TempDir(), "rove-*") + assert.NoError(t, err) + os.Setenv("USER_DATA", tmp) + + // Used for configuring this test var address = os.Getenv("ROVE_GRPC") if len(address) == 0 { log.Fatal("Must set $ROVE_GRPC") } - // Set up the flags to act locally and use a temporary file - flag.Set("data", path.Join(os.TempDir(), uuid.New().String())) - // First attempt should error assert.Error(t, InnerMain("status")) - // Now set the host - flag.Set("host", address) - + // Then set the host // No error now as we have a host + os.Setenv("ROVE_HOST", address) + assert.NoError(t, InnerMain("status")) + + // Set the host in the config + assert.NoError(t, InnerMain("config", address)) assert.NoError(t, InnerMain("status")) // Register should fail without a name assert.Error(t, InnerMain("register")) // These methods should fail without an account - assert.Error(t, InnerMain("move")) assert.Error(t, InnerMain("radar")) assert.Error(t, InnerMain("rover")) // Now set the name - flag.Set("name", uuid.New().String()) - - // Perform the register - assert.NoError(t, InnerMain("register")) + assert.NoError(t, InnerMain("register", uuid.New().String())) // These should now work assert.NoError(t, InnerMain("radar")) assert.NoError(t, InnerMain("rover")) - // Move should work with arguments - flag.Set("bearing", "N") - assert.NoError(t, InnerMain("move")) + // Commands should fail with no commands + assert.Error(t, InnerMain("commands")) + + // Give it commands + assert.NoError(t, InnerMain("commands", "move", "N")) + assert.NoError(t, InnerMain("commands", "stash")) + + // Give it malformed commands + assert.Error(t, InnerMain("commands", "move", "stash")) } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 4e69e77..45b017a 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -78,10 +78,9 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") b := bearing.North - duration := 1 newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0, Y: duration}) + pos.Add(vector.Vector{X: 0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover From f0d40cc46c85141f96da29e2a27647ce2ae49fcb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:31:57 +0100 Subject: [PATCH 255/495] Change help print to standard format --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 172494d..a789c4b 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -22,7 +22,7 @@ var defaultDataPath = path.Join(home, ".local/share/") // Command usage func printUsage() { - fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [ARGS]...\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [ARGS...]\n", os.Args[0]) fmt.Fprintln(os.Stderr, "\nCommands") fmt.Fprintln(os.Stderr, "\tstatus prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") From 71c2c092702498a85e5ed3286f204cd9801695f3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:37:10 +0100 Subject: [PATCH 256/495] Write test to check rover has item in inventory --- pkg/game/world.go | 13 +++++++++++++ pkg/game/world_test.go | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index d3956dd..7ba8281 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -199,6 +199,18 @@ func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) err } } +// RoverInventory returns the inventory of a requested rover +func (w *World) RoverInventory(id uuid.UUID) ([]Item, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + + if i, ok := w.Rovers[id]; ok { + return i.Inventory, nil + } else { + return nil, fmt.Errorf("no rover matching id") + } +} + // WarpRover sets an rovers position func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { w.worldMutex.Lock() @@ -260,6 +272,7 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { } else { if objects.IsStashable(tile) { r.Inventory = append(r.Inventory, Item{Type: tile}) + w.Rovers[id] = r if err := w.Atlas.SetTile(r.Pos, objects.Empty); err != nil { return objects.Empty, err } else { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 45b017a..2fefeca 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -164,4 +164,9 @@ func TestWorld_RoverStash(t *testing.T) { tile, err := world.Atlas.GetTile(pos) assert.NoError(t, err, "Failed to get tile") assert.Equal(t, objects.Empty, tile, "Stash failed to remove object from atlas") + + inv, err := world.RoverInventory(a) + assert.NoError(t, err, "Failed to get inventory") + assert.Equal(t, Item{Type: objects.SmallRock}, inv[0]) + } From d08a15e20195e1bd4d4107991afdc0d62bcf7c2e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:39:07 +0100 Subject: [PATCH 257/495] De-scope - Remove unused rover capacity --- cmd/rove-reverse-proxy/http_test.go | 1 - cmd/rove-server/internal/routes.go | 3 +- pkg/game/rover.go | 3 - pkg/game/world.go | 5 +- pkg/rove/rove.pb.go | 87 +++++++++++++---------------- pkg/rove/rove.swagger.json | 5 -- proto/rove/rove.proto | 3 - 7 files changed, 41 insertions(+), 66 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 9ad2007..806ddd2 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -123,5 +123,4 @@ func TestServer_Rover(t *testing.T) { assert.NotZero(t, resp.Range, "Rover should return valid range") assert.NotZero(t, len(resp.Name), "Rover should return valid name") assert.NotZero(t, resp.Position, "Rover should return valid position") - assert.NotZero(t, resp.Capacity, "Rover should return valid position") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 1fd452b..4895fd7 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -72,8 +72,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover X: int32(pos.X), Y: int32(pos.Y), }, - Range: int32(attrib.Range), - Capacity: int32(attrib.Capacity), + Range: int32(attrib.Range), } } return response, nil diff --git a/pkg/game/rover.go b/pkg/game/rover.go index b989b5d..0b21647 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -12,9 +12,6 @@ type RoverAttributes struct { // Range represents the distance the unit's radar can see Range int `json:"range"` - - // Capacity represents the maximum number of items the rover can carry - Capacity int `json:"capacity"` } // Rover describes a single rover in the world diff --git a/pkg/game/world.go b/pkg/game/world.go index 7ba8281..b75515c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -91,9 +91,8 @@ func (w *World) SpawnRover() (uuid.UUID, error) { rover := Rover{ Id: uuid.New(), Attributes: RoverAttributes{ - Range: 5.0, - Capacity: 5, - Name: "rover", + Range: 5.0, + Name: "rover", }, } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 35558cf..8368cc5 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -488,8 +488,6 @@ type RoverResponse struct { Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` // The range of this rover's radar Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` - // The inventory capacity of the rover - Capacity int32 `protobuf:"varint,5,opt,name=Capacity,proto3" json:"Capacity,omitempty"` } func (x *RoverResponse) Reset() { @@ -545,13 +543,6 @@ func (x *RoverResponse) GetRange() int32 { return 0 } -func (x *RoverResponse) GetCapacity() int32 { - if x != nil { - return x.Capacity - } - return 0 -} - // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -752,52 +743,50 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7f, 0x0a, 0x0d, 0x52, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, - 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, - 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, - 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, + 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, + 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, + 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, + 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 4ec6053..e48014c 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -301,11 +301,6 @@ "type": "integer", "format": "int32", "title": "The range of this rover's radar" - }, - "Capacity": { - "type": "integer", - "format": "int32", - "title": "The inventory capacity of the rover" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 40b1050..4a67a27 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -121,9 +121,6 @@ message RoverResponse { // The range of this rover's radar int32 range = 3; - - // The inventory capacity of the rover - int32 Capacity = 5; } // Empty placeholder From e1bff92a566b3b7ee225831f15a5ab515232ae5b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:41:36 +0100 Subject: [PATCH 258/495] Remove Item type in favor of just byte --- pkg/game/items.go | 6 ------ pkg/game/rover.go | 2 +- pkg/game/world.go | 4 ++-- pkg/game/world_test.go | 2 +- 4 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 pkg/game/items.go diff --git a/pkg/game/items.go b/pkg/game/items.go deleted file mode 100644 index 4d3c918..0000000 --- a/pkg/game/items.go +++ /dev/null @@ -1,6 +0,0 @@ -package game - -// Item describes an item that can be held -type Item struct { - Type byte `json:"type"` -} diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 0b21647..9c50ab8 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -26,5 +26,5 @@ type Rover struct { Attributes RoverAttributes `json:"attributes"` // Inventory represents any items the rover is carrying - Inventory []Item `json:"inventory"` + Inventory []byte `json:"inventory"` } diff --git a/pkg/game/world.go b/pkg/game/world.go index b75515c..406c66f 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -199,7 +199,7 @@ func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) err } // RoverInventory returns the inventory of a requested rover -func (w *World) RoverInventory(id uuid.UUID) ([]Item, error) { +func (w *World) RoverInventory(id uuid.UUID) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -270,7 +270,7 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { return objects.Empty, err } else { if objects.IsStashable(tile) { - r.Inventory = append(r.Inventory, Item{Type: tile}) + r.Inventory = append(r.Inventory, tile) w.Rovers[id] = r if err := w.Atlas.SetTile(r.Pos, objects.Empty); err != nil { return objects.Empty, err diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 2fefeca..27d2943 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -167,6 +167,6 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, Item{Type: objects.SmallRock}, inv[0]) + assert.Equal(t, objects.SmallRock, inv[0]) } From e6a25a5310e0d2198f7d8cb84bde9bf1815a71d2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:44:52 +0100 Subject: [PATCH 259/495] Add the rover inventory to the "rover" response --- cmd/rove-server/internal/routes.go | 6 +- cmd/rove/main.go | 2 +- pkg/rove/rove.pb.go | 99 +++++++++++++++++------------- pkg/rove/rove.swagger.json | 5 ++ proto/rove/rove.proto | 3 + 5 files changed, 69 insertions(+), 46 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 4895fd7..3515506 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -65,6 +65,9 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover } else if pos, err := s.world.RoverPosition(id); err != nil { return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else if inv, err := s.world.RoverInventory(id); err != nil { + return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else { response = &rove.RoverResponse{ Name: attrib.Name, @@ -72,7 +75,8 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover X: int32(pos.X), Y: int32(pos.Y), }, - Range: int32(attrib.Range), + Range: int32(attrib.Range), + Inventory: inv, } } return response, nil diff --git a/cmd/rove/main.go b/cmd/rove/main.go index a789c4b..0c034cb 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -268,7 +268,7 @@ func InnerMain(command string, args ...string) error { return err default: - fmt.Printf("attributes: %+v\n", response) + fmt.Printf("rover info: %+v\n", response) } default: diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 8368cc5..7932a3c 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -488,6 +488,8 @@ type RoverResponse struct { Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` // The range of this rover's radar Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` + // The items in the rover inventory + Inventory []byte `protobuf:"bytes,4,opt,name=inventory,proto3" json:"inventory,omitempty"` } func (x *RoverResponse) Reset() { @@ -543,6 +545,13 @@ func (x *RoverResponse) GetRange() int32 { return 0 } +func (x *RoverResponse) GetInventory() []byte { + if x != nil { + return x.Inventory + } + return nil +} + // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -743,50 +752,52 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x0d, 0x52, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, - 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, - 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, - 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x0d, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x22, + 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, + 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, + 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index e48014c..ccca4be 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -301,6 +301,11 @@ "type": "integer", "format": "int32", "title": "The range of this rover's radar" + }, + "inventory": { + "type": "string", + "format": "byte", + "title": "The items in the rover inventory" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 4a67a27..badf9fd 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -121,6 +121,9 @@ message RoverResponse { // The range of this rover's radar int32 range = 3; + + // The items in the rover inventory + bytes inventory = 4; } // Empty placeholder From b2f6c1a0b11236d3f439116afdbd0322ed1906af Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:45:31 +0100 Subject: [PATCH 260/495] Update status doc --- docs/status.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/status.md b/docs/status.md index ddada46..27c4293 100644 --- a/docs/status.md +++ b/docs/status.md @@ -11,11 +11,11 @@ This page tracks the current feature set and the features to implement next * Server supports multiple users and rovers * Map is populated with rocks * Commands are queued and then are executed in sequence +* Rover inventory +* Collectable materials ### Incoming features -* Rover inventory -* Collectable materials * Basic rover actions (e.g. dig, repair) * Rover integrity and damage * Rover replacement and advancement mechanic From 4a343f36a81fb681dc68fc9cc1f7ed4a302759ca Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 23:58:58 +0100 Subject: [PATCH 261/495] Remove ROVE_HOST No need for two ways to set this --- cmd/rove/main.go | 21 ++++++--------------- cmd/rove/main_test.go | 9 ++------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 0c034cb..404c77f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -34,7 +34,6 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tversion outputs version info") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tUSER_DATA path to user data, defaults to "+defaultDataPath) - fmt.Fprintln(os.Stderr, "\tROVE_HOST path to rove host server") } const gRPCport = 9090 @@ -130,23 +129,16 @@ func InnerMain(command string, args ...string) error { // Run config command before server needed if command == "config" { - if len(args) > 1 { - config.Host = args[1] - SaveConfig(config) + if len(args) > 0 { + config.Host = args[0] } fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Accounts[config.Host]) - return nil - } - - // Allow overriding the host - hostOverride := os.Getenv("ROVE_HOST") - if len(hostOverride) > 0 { - config.Host = hostOverride + return SaveConfig(config) } // If there's still no host, bail if len(config.Host) == 0 { - return fmt.Errorf("no host set, set one with '%s config {HOST}'", os.Args[0]) + return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } // Set up the server @@ -278,8 +270,7 @@ func InnerMain(command string, args ...string) error { os.Exit(1) } - SaveConfig(config) - return nil + return SaveConfig(config) } // Simple main @@ -291,7 +282,7 @@ func main() { } // Run the inner main - if err := InnerMain(os.Args[1], os.Args[1:]...); err != nil { + if err := InnerMain(os.Args[1], os.Args[2:]...); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) os.Exit(1) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 1a689f1..7459777 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -15,7 +15,7 @@ import ( func Test_InnerMain(t *testing.T) { // Use temporary local user data - tmp, err := ioutil.TempDir(os.TempDir(), "rove-*") + tmp, err := ioutil.TempDir(os.TempDir(), "rove-") assert.NoError(t, err) os.Setenv("USER_DATA", tmp) @@ -25,14 +25,9 @@ func Test_InnerMain(t *testing.T) { log.Fatal("Must set $ROVE_GRPC") } - // First attempt should error + // First attempt should error without a host assert.Error(t, InnerMain("status")) - // Then set the host - // No error now as we have a host - os.Setenv("ROVE_HOST", address) - assert.NoError(t, InnerMain("status")) - // Set the host in the config assert.NoError(t, InnerMain("config", address)) assert.NoError(t, InnerMain("status")) From f9c30f541c699fb6f4f06b3c7942bce7b1d7481c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 00:02:07 +0100 Subject: [PATCH 262/495] Rename USER_DATA to ROVE_USER_DATA --- cmd/rove/main.go | 4 ++-- cmd/rove/main_test.go | 2 +- snap/snapcraft.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 404c77f..e402234 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -33,7 +33,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") fmt.Fprintln(os.Stderr, "\tversion outputs version info") fmt.Fprintln(os.Stderr, "\nEnvironment") - fmt.Fprintln(os.Stderr, "\tUSER_DATA path to user data, defaults to "+defaultDataPath) + fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } const gRPCport = 9090 @@ -48,7 +48,7 @@ type Config struct { func ConfigPath() string { // Allow overriding the data path var datapath = defaultDataPath - var override = os.Getenv("USER_DATA") + var override = os.Getenv("ROVE_USER_DATA") if len(override) > 0 { datapath = override } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 7459777..d958d35 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -17,7 +17,7 @@ func Test_InnerMain(t *testing.T) { // Use temporary local user data tmp, err := ioutil.TempDir(os.TempDir(), "rove-") assert.NoError(t, err) - os.Setenv("USER_DATA", tmp) + os.Setenv("ROVE_USER_DATA", tmp) // Used for configuring this test var address = os.Getenv("ROVE_GRPC") diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 005f65c..27bbb85 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -17,7 +17,7 @@ apps: plugs: - network environment: - USER_DATA: $SNAP_USER_DATA + ROVE_USER_DATA: $SNAP_USER_DATA rove-server: command: bin/rove-server plugs: From 1ed1c60de09a267b97940fb4cf417e555a868397 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 00:32:27 +0100 Subject: [PATCH 263/495] Simplify - remove RoverAttributes and rover UUIDs --- .vscode/launch.json | 4 +- cmd/rove-server/internal/routes.go | 44 +++------- cmd/rove-server/internal/server.go | 14 ++- pkg/game/rover.go | 18 +--- pkg/game/world.go | 134 +++++++++++++---------------- pkg/game/world_test.go | 13 +-- 6 files changed, 89 insertions(+), 138 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index d2109b5..539f842 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,9 @@ "mode": "auto", "program": "${workspaceFolder}/cmd/rove-server/main.go", "cwd": "${workspaceFolder}", - "env": {}, + "env": { + "WORDS_FILE": "${workspaceFolder}/data/words_alpha.txt", + }, "args": [], }, { diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 3515506..2b18a7e 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" @@ -37,12 +36,11 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove if _, err := s.accountant.Register(ctx, &accounts.RegisterInfo{Name: req.Name}, grpc.WaitForReady(true)); err != nil { return nil, err - } else if _, _, err := s.SpawnRoverForAccount(req.Name); err != nil { + } else if _, err := s.SpawnRoverForAccount(req.Name); err != nil { return nil, fmt.Errorf("failed to spawn rover for account: %s", err) } else if err := s.SaveWorld(); err != nil { return nil, fmt.Errorf("internal server error when saving world: %s", err) - } return &rove.RegisterResponse{}, nil @@ -56,27 +54,18 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover } else if resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}); err != nil { return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) - } else if id, err := uuid.Parse(resp.Value); err != nil { - return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - - } else if attrib, err := s.world.RoverAttributes(id); err != nil { - return nil, fmt.Errorf("error getting rover attributes: %s", err) - - } else if pos, err := s.world.RoverPosition(id); err != nil { - return nil, fmt.Errorf("error getting rover attributes: %s", err) - - } else if inv, err := s.world.RoverInventory(id); err != nil { - return nil, fmt.Errorf("error getting rover attributes: %s", err) + } else if rover, err := s.world.GetRover(resp.Value); err != nil { + return nil, fmt.Errorf("error getting rover: %s", err) } else { response = &rove.RoverResponse{ - Name: attrib.Name, + Name: rover.Name, Position: &rove.Vector{ - X: int32(pos.X), - Y: int32(pos.Y), + X: int32(rover.Pos.X), + Y: int32(rover.Pos.Y), }, - Range: int32(attrib.Range), - Inventory: inv, + Range: int32(rover.Range), + Inventory: rover.Inventory, } } return response, nil @@ -92,20 +81,16 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}) if err != nil { return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) - } - if id, err := uuid.Parse(resp.Value); err != nil { - return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - - } else if attrib, err := s.world.RoverAttributes(id); err != nil { + } else if rover, err := s.world.GetRover(resp.Value); err != nil { return nil, fmt.Errorf("error getting rover attributes: %s", err) - } else if radar, err := s.world.RadarFromRover(id); err != nil { + } else if radar, err := s.world.RadarFromRover(resp.Value); err != nil { return nil, fmt.Errorf("error getting radar from rover: %s", err) } else { response.Tiles = radar - response.Range = int32(attrib.Range) + response.Range = int32(rover.Range) } return response, nil @@ -121,11 +106,6 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove return nil, err } - id, err := uuid.Parse(resp.Value) - if err != nil { - return nil, fmt.Errorf("account had invalid rover ID: %s", resp.Value) - } - var cmds []game.Command for _, c := range req.Commands { cmds = append(cmds, game.Command{ @@ -133,7 +113,7 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove Command: c.Command}) } - if err := s.world.Enqueue(id, cmds...); err != nil { + if err := s.world.Enqueue(resp.Value, cmds...); err != nil { return nil, err } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 449d9e2..0345936 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -8,7 +8,6 @@ import ( "os" "sync" - "github.com/google/uuid" "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" @@ -239,15 +238,12 @@ type BadRequestError struct { } // SpawnRoverForAccount spawns the rover rover for an account -func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uuid.UUID, error) { +func (s *Server) SpawnRoverForAccount(account string) (string, error) { if inst, err := s.world.SpawnRover(); err != nil { - return game.RoverAttributes{}, uuid.UUID{}, err - - } else if attribs, err := s.world.RoverAttributes(inst); err != nil { - return game.RoverAttributes{}, uuid.UUID{}, fmt.Errorf("no attributes found for created rover: %s", err) + return "", err } else { - keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst.String()} + keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst} _, err := s.accountant.AssignValue(context.Background(), &keyval) if err != nil { log.Printf("Failed to assign rover to account, %s", err) @@ -257,9 +253,9 @@ func (s *Server) SpawnRoverForAccount(account string) (game.RoverAttributes, uui log.Printf("Failed to destroy rover after failed rover assign: %s", err) } - return game.RoverAttributes{}, uuid.UUID{}, err + return "", err } else { - return attribs, inst, nil + return inst, nil } } } diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 9c50ab8..3bec8c8 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -1,29 +1,19 @@ package game import ( - "github.com/google/uuid" "github.com/mdiluz/rove/pkg/vector" ) -// RoverAttributes contains attributes of a rover -type RoverAttributes struct { - // Name of this rover - Name string `json:"name"` - - // Range represents the distance the unit's radar can see - Range int `json:"range"` -} - // Rover describes a single rover in the world type Rover struct { - // Id is a unique ID for this rover - Id uuid.UUID `json:"id"` + // Unique name of this rover + Name string `json:"name"` // Pos represents where this rover is in the world Pos vector.Vector `json:"pos"` - // Attributes represents the physical attributes of the rover - Attributes RoverAttributes `json:"attributes"` + // Range represents the distance the unit's radar can see + Range int `json:"range"` // Inventory represents any items the rover is carrying Inventory []byte `json:"inventory"` diff --git a/pkg/game/world.go b/pkg/game/world.go index 406c66f..b123962 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -20,7 +20,7 @@ import ( // World describes a self contained universe and everything in it type World struct { // Rovers is a id->data map of all the rovers in the game - Rovers map[uuid.UUID]Rover `json:"rovers"` + Rovers map[string]Rover `json:"rovers"` // Atlas represends the world map of chunks and tiles Atlas atlas.Atlas `json:"atlas"` @@ -29,10 +29,10 @@ type World struct { worldMutex sync.RWMutex // Commands is the set of currently executing command streams per rover - CommandQueue map[uuid.UUID]CommandStream `json:"commands"` + CommandQueue map[string]CommandStream `json:"commands"` // Incoming represents the set of commands to add to the queue at the end of the current tick - Incoming map[uuid.UUID]CommandStream `json:"incoming"` + Incoming map[string]CommandStream `json:"incoming"` // Mutex to lock around command operations cmdMutex sync.RWMutex @@ -62,9 +62,9 @@ func NewWorld(size, chunkSize int) *World { } return &World{ - Rovers: make(map[uuid.UUID]Rover), - CommandQueue: make(map[uuid.UUID]CommandStream), - Incoming: make(map[uuid.UUID]CommandStream), + Rovers: make(map[string]Rover), + CommandQueue: make(map[string]CommandStream), + Incoming: make(map[string]CommandStream), Atlas: atlas.NewAtlas(size, chunkSize), words: lines, } @@ -83,22 +83,26 @@ func (w *World) SpawnWorld(fillWorld bool) error { } // SpawnRover adds an rover to the game -func (w *World) SpawnRover() (uuid.UUID, error) { +func (w *World) SpawnRover() (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() // Initialise the rover rover := Rover{ - Id: uuid.New(), - Attributes: RoverAttributes{ - Range: 5.0, - Name: "rover", - }, + Range: 4.0, + Name: uuid.New().String(), } // Assign a random name if we have words if len(w.words) > 0 { - rover.Attributes.Name = fmt.Sprintf("%s-%s", w.words[rand.Intn(len(w.words))], w.words[rand.Intn(len(w.words))]) + for { + // Loop until we find a unique name + name := fmt.Sprintf("%s-%s", w.words[rand.Intn(len(w.words))], w.words[rand.Intn(len(w.words))]) + if _, ok := w.Rovers[name]; !ok { + rover.Name = name + break + } + } } // Spawn in a random place near the origin @@ -110,7 +114,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { // Seach until we error (run out of world) for { if tile, err := w.Atlas.GetTile(rover.Pos); err != nil { - return uuid.Nil, err + return "", err } else { if !objects.IsBlocking(tile) { break @@ -124,22 +128,34 @@ func (w *World) SpawnRover() (uuid.UUID, error) { log.Printf("Spawned rover at %+v\n", rover.Pos) // Append the rover to the list - w.Rovers[rover.Id] = rover + w.Rovers[rover.Name] = rover - return rover.Id, nil + return rover.Name, nil +} + +// GetRover gets a specific rover by name +func (w *World) GetRover(rover string) (Rover, error) { + w.worldMutex.RLock() + defer w.worldMutex.RUnlock() + + if i, ok := w.Rovers[rover]; ok { + return i, nil + } else { + return Rover{}, fmt.Errorf("Failed to find rover with name: %s", rover) + } } // Removes an rover from the game -func (w *World) DestroyRover(id uuid.UUID) error { +func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { // Clear the tile if err := w.Atlas.SetTile(i.Pos, objects.Empty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } - delete(w.Rovers, id) + delete(w.Rovers, rover) } else { return fmt.Errorf("no rover matching id") } @@ -147,11 +163,11 @@ func (w *World) DestroyRover(id uuid.UUID) error { } // RoverPosition returns the position of the rover -func (w *World) RoverPosition(id uuid.UUID) (vector.Vector, error) { +func (w *World) RoverPosition(rover string) (vector.Vector, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { return i.Pos, nil } else { return vector.Vector{}, fmt.Errorf("no rover matching id") @@ -159,39 +175,13 @@ func (w *World) RoverPosition(id uuid.UUID) (vector.Vector, error) { } // SetRoverPosition sets the position of the rover -func (w *World) SetRoverPosition(id uuid.UUID, pos vector.Vector) error { +func (w *World) SetRoverPosition(rover string, pos vector.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { i.Pos = pos - w.Rovers[id] = i - return nil - } else { - return fmt.Errorf("no rover matching id") - } -} - -// RoverAttributes returns the attributes of a requested rover -func (w *World) RoverAttributes(id uuid.UUID) (RoverAttributes, error) { - w.worldMutex.RLock() - defer w.worldMutex.RUnlock() - - if i, ok := w.Rovers[id]; ok { - return i.Attributes, nil - } else { - return RoverAttributes{}, fmt.Errorf("no rover matching id") - } -} - -// SetRoverAttributes sets the attributes of a requested rover -func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) error { - w.worldMutex.Lock() - defer w.worldMutex.Unlock() - - if i, ok := w.Rovers[id]; ok { - i.Attributes = attributes - w.Rovers[id] = i + w.Rovers[rover] = i return nil } else { return fmt.Errorf("no rover matching id") @@ -199,11 +189,11 @@ func (w *World) SetRoverAttributes(id uuid.UUID, attributes RoverAttributes) err } // RoverInventory returns the inventory of a requested rover -func (w *World) RoverInventory(id uuid.UUID) ([]byte, error) { +func (w *World) RoverInventory(rover string) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { return i.Inventory, nil } else { return nil, fmt.Errorf("no rover matching id") @@ -211,11 +201,11 @@ func (w *World) RoverInventory(id uuid.UUID) ([]byte, error) { } // WarpRover sets an rovers position -func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { +func (w *World) WarpRover(rover string, pos vector.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { // Nothing to do if these positions match if i.Pos == pos { return nil @@ -229,7 +219,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } i.Pos = pos - w.Rovers[id] = i + w.Rovers[rover] = i return nil } else { return fmt.Errorf("no rover matching id") @@ -237,11 +227,11 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { } // SetPosition sets an rovers position -func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error) { +func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[id]; ok { + if i, ok := w.Rovers[rover]; ok { // Try the new move position newPos := i.Pos.Added(b.Vector()) @@ -251,7 +241,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error } else if !objects.IsBlocking(tile) { // Perform the move i.Pos = newPos - w.Rovers[id] = i + w.Rovers[rover] = i } return i.Pos, nil @@ -261,17 +251,17 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error } // RoverStash will stash an item at the current rovers position -func (w *World) RoverStash(id uuid.UUID) (byte, error) { +func (w *World) RoverStash(rover string) (byte, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if r, ok := w.Rovers[id]; ok { + if r, ok := w.Rovers[rover]; ok { if tile, err := w.Atlas.GetTile(r.Pos); err != nil { return objects.Empty, err } else { if objects.IsStashable(tile) { r.Inventory = append(r.Inventory, tile) - w.Rovers[id] = r + w.Rovers[rover] = r if err := w.Atlas.SetTile(r.Pos, objects.Empty); err != nil { return objects.Empty, err } else { @@ -288,23 +278,23 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { +func (w *World) RadarFromRover(rover string) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if r, ok := w.Rovers[id]; ok { + if r, ok := w.Rovers[rover]; ok { // The radar should span in range direction on each axis, plus the row/column the rover is currently on - radarSpan := (r.Attributes.Range * 2) + 1 + radarSpan := (r.Range * 2) + 1 roverPos := r.Pos // Get the radar min and max values radarMin := vector.Vector{ - X: roverPos.X - r.Attributes.Range, - Y: roverPos.Y - r.Attributes.Range, + X: roverPos.X - r.Range, + Y: roverPos.Y - r.Range, } radarMax := vector.Vector{ - X: roverPos.X + r.Attributes.Range, - Y: roverPos.Y + r.Attributes.Range, + X: roverPos.X + r.Range, + Y: roverPos.Y + r.Range, } // Make sure we only query within the actual world @@ -342,7 +332,7 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { dist := r.Pos.Added(roverPos.Negated()) dist = dist.Abs() - if dist.X <= r.Attributes.Range && dist.Y <= r.Attributes.Range { + if dist.X <= r.Range && dist.Y <= r.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan radar[index] = objects.Rover @@ -359,7 +349,7 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { } // Enqueue will queue the commands given -func (w *World) Enqueue(rover uuid.UUID, commands ...Command) error { +func (w *World) Enqueue(rover string, commands ...Command) error { // First validate the commands for _, c := range commands { @@ -397,7 +387,7 @@ func (w *World) EnqueueAllIncoming() { commands = append(commands, incoming...) w.CommandQueue[id] = commands } - w.Incoming = make(map[uuid.UUID]CommandStream) + w.Incoming = make(map[string]CommandStream) } // Execute will execute any commands in the current command queue @@ -429,7 +419,7 @@ func (w *World) ExecuteCommandQueues() { } // ExecuteCommand will execute a single command -func (w *World) ExecuteCommand(c *Command, rover uuid.UUID) (err error) { +func (w *World) ExecuteCommand(c *Command, rover string) (err error) { log.Printf("Executing command: %+v\n", *c) switch c.Command { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 27d2943..49cfdac 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -32,14 +32,14 @@ func TestWorld_CreateRover(t *testing.T) { } } -func TestWorld_RoverAttributes(t *testing.T) { +func TestWorld_GetRover(t *testing.T) { world := NewWorld(2, 4) a, err := world.SpawnRover() assert.NoError(t, err) - attribs, err := world.RoverAttributes(a) + rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover attribs") - assert.NotZero(t, attribs.Range, "Rover should not be spawned blind") + assert.NotZero(t, rover.Range, "Rover should not be spawned blind") } func TestWorld_DestroyRover(t *testing.T) { @@ -97,13 +97,6 @@ func TestWorld_RadarFromRover(t *testing.T) { b, err := world.SpawnRover() assert.NoError(t, err) - // Set the rover range to a predictable value - attrib, err := world.RoverAttributes(a) - assert.NoError(t, err, "Failed to get rover attribs") - attrib.Range = 4 // Set the range to 4 so we can predict the radar fully - err = world.SetRoverAttributes(a, attrib) - assert.NoError(t, err, "Failed to set rover attribs") - // Warp the rovers into position bpos := vector.Vector{X: -3, Y: -3} assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") From adf3def488d46f94ba801917ad50d64937da4614 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 00:51:51 +0100 Subject: [PATCH 264/495] Small Status update --- docs/status.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/status.md b/docs/status.md index 27c4293..30794f0 100644 --- a/docs/status.md +++ b/docs/status.md @@ -16,8 +16,8 @@ This page tracks the current feature set and the features to implement next ### Incoming features -* Basic rover actions (e.g. dig, repair) * Rover integrity and damage +* Basic rover actions (e.g. repair) * Rover replacement and advancement mechanic * HTTPS From 12dc9e478dfc5d00a3b007869813153d737c5ac3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 00:56:28 +0100 Subject: [PATCH 265/495] Remove usage of os arg in help, it's confusing for snaps --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index e402234..3a10de3 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -22,7 +22,7 @@ var defaultDataPath = path.Join(home, ".local/share/") // Command usage func printUsage() { - fmt.Fprintf(os.Stderr, "Usage: %s COMMAND [ARGS...]\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage: rove COMMAND [ARGS...]\n") fmt.Fprintln(os.Stderr, "\nCommands") fmt.Fprintln(os.Stderr, "\tstatus prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") From 7957454ec15befd2161a1c25a5281c54ab97f026 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 01:14:17 +0100 Subject: [PATCH 266/495] Add rover integrity Rovers are damaged by bumping into solid objects --- cmd/rove-reverse-proxy/http_test.go | 1 + cmd/rove-server/internal/routes.go | 1 + docs/status.md | 2 +- pkg/game/rover.go | 3 + pkg/game/world.go | 13 ++++- pkg/rove/rove.pb.go | 89 ++++++++++++++++------------- pkg/rove/rove.swagger.json | 5 ++ proto/rove/rove.proto | 3 + 8 files changed, 75 insertions(+), 42 deletions(-) diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-reverse-proxy/http_test.go index 806ddd2..995c380 100644 --- a/cmd/rove-reverse-proxy/http_test.go +++ b/cmd/rove-reverse-proxy/http_test.go @@ -123,4 +123,5 @@ func TestServer_Rover(t *testing.T) { assert.NotZero(t, resp.Range, "Rover should return valid range") assert.NotZero(t, len(resp.Name), "Rover should return valid name") assert.NotZero(t, resp.Position, "Rover should return valid position") + assert.NotZero(t, resp.Integrity, "Rover should have positive integrity") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 2b18a7e..f558f00 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -66,6 +66,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover }, Range: int32(rover.Range), Inventory: rover.Inventory, + Integrity: int32(rover.Integrity), } } return response, nil diff --git a/docs/status.md b/docs/status.md index 30794f0..3386a60 100644 --- a/docs/status.md +++ b/docs/status.md @@ -13,10 +13,10 @@ This page tracks the current feature set and the features to implement next * Commands are queued and then are executed in sequence * Rover inventory * Collectable materials +* Rover integrity and damage ### Incoming features -* Rover integrity and damage * Basic rover actions (e.g. repair) * Rover replacement and advancement mechanic * HTTPS diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 3bec8c8..e315363 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -17,4 +17,7 @@ type Rover struct { // Inventory represents any items the rover is carrying Inventory []byte `json:"inventory"` + + // Integrity represents current rover health + Integrity int `json:"integrity"` } diff --git a/pkg/game/world.go b/pkg/game/world.go index b123962..ad8dc15 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -89,8 +89,9 @@ func (w *World) SpawnRover() (string, error) { // Initialise the rover rover := Rover{ - Range: 4.0, - Name: uuid.New().String(), + Range: 4.0, + Integrity: 10, + Name: uuid.New().String(), } // Assign a random name if we have words @@ -242,6 +243,14 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error // Perform the move i.Pos = newPos w.Rovers[rover] = i + } else { + // If it is a blocking tile, reduce the rover integrity + i.Integrity = i.Integrity - 1 + if i.Integrity == 0 { + // TODO: The rover needs to be left dormant with the player + } else { + w.Rovers[rover] = i + } } return i.Pos, nil diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 7932a3c..faf1b9f 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -490,6 +490,8 @@ type RoverResponse struct { Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` // The items in the rover inventory Inventory []byte `protobuf:"bytes,4,opt,name=inventory,proto3" json:"inventory,omitempty"` + // The current health of the rover + Integrity int32 `protobuf:"varint,5,opt,name=Integrity,proto3" json:"Integrity,omitempty"` } func (x *RoverResponse) Reset() { @@ -552,6 +554,13 @@ func (x *RoverResponse) GetInventory() []byte { return nil } +func (x *RoverResponse) GetIntegrity() int32 { + if x != nil { + return x.Integrity + } + return 0 +} + // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -752,7 +761,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x0d, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, @@ -760,44 +769,46 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x22, - 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, - 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, - 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, + 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, + 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, + 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, + 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index ccca4be..3325d41 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -306,6 +306,11 @@ "type": "string", "format": "byte", "title": "The items in the rover inventory" + }, + "Integrity": { + "type": "integer", + "format": "int32", + "title": "The current health of the rover" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index badf9fd..943f254 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -124,6 +124,9 @@ message RoverResponse { // The items in the rover inventory bytes inventory = 4; + + // The current health of the rover + int32 Integrity = 5; } // Empty placeholder From 693b8a54f17bf8cba6f16251235e113ce8a6d876 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 01:35:09 +0100 Subject: [PATCH 267/495] Add repair command to repair using inventory item --- cmd/rove/main.go | 6 +++- cmd/rove/main_test.go | 1 + docs/status.md | 2 +- pkg/game/command.go | 5 +++ pkg/game/world.go | 16 ++++++++-- pkg/game/world_test.go | 71 +++++++++++++++++++++++++++++++++++++++++- proto/rove/rove.proto | 1 + 7 files changed, 97 insertions(+), 5 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 3a10de3..15014a1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -26,12 +26,16 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\nCommands") fmt.Fprintln(os.Stderr, "\tstatus prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issues move command to rover") + fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issues move command to rover, see below") fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\trover gets data for current rover") fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") fmt.Fprintln(os.Stderr, "\tversion outputs version info") + fmt.Fprintln(os.Stderr, "\nRover commands:") + fmt.Fprintln(os.Stderr, "\tmove BEARING moves the rover in the chosen direction") + fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") + fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index d958d35..1c06374 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -52,6 +52,7 @@ func Test_InnerMain(t *testing.T) { // Give it commands assert.NoError(t, InnerMain("commands", "move", "N")) assert.NoError(t, InnerMain("commands", "stash")) + assert.NoError(t, InnerMain("commands", "repair")) // Give it malformed commands assert.Error(t, InnerMain("commands", "move", "stash")) diff --git a/docs/status.md b/docs/status.md index 3386a60..5045f0a 100644 --- a/docs/status.md +++ b/docs/status.md @@ -14,10 +14,10 @@ This page tracks the current feature set and the features to implement next * Rover inventory * Collectable materials * Rover integrity and damage +* Rover can repair ### Incoming features -* Basic rover actions (e.g. repair) * Rover replacement and advancement mechanic * HTTPS diff --git a/pkg/game/command.go b/pkg/game/command.go index 0bc9c5b..2a5f875 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -1,9 +1,14 @@ package game const ( + // Moves the rover in the chosen bearing CommandMove = "move" + // Will attempt to stash the object at the current location CommandStash = "stash" + + // Will attempt to repair the rover with an inventory object + CommandRepair = "repair" ) // Command represends a single command to execute diff --git a/pkg/game/world.go b/pkg/game/world.go index ad8dc15..8491a7d 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -363,11 +363,12 @@ func (w *World) Enqueue(rover string, commands ...Command) error { // First validate the commands for _, c := range commands { switch c.Command { - case "move": + case CommandMove: if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } - case "stash": + case CommandStash: + case CommandRepair: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -446,6 +447,17 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { return err } + case CommandRepair: + if r, err := w.GetRover(rover); err != nil { + return err + } else { + // Consume an inventory item to repair + if len(r.Inventory) > 0 { + r.Inventory = r.Inventory[:len(r.Inventory)-1] + r.Integrity = r.Integrity + 1 + w.Rovers[rover] = r + } + } default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 49cfdac..5a48231 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -161,5 +161,74 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, objects.SmallRock, inv[0]) - +} + +func TestWorld_RoverDamage(t *testing.T) { + world := NewWorld(2, 2) + a, err := world.SpawnRover() + assert.NoError(t, err) + + pos := vector.Vector{ + X: 0.0, + Y: 0.0, + } + + err = world.WarpRover(a, pos) + assert.NoError(t, err, "Failed to set position for rover") + + info, err := world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + + err = world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) + assert.NoError(t, err, "Failed to set tile to rock") + + vec, err := world.MoveRover(a, bearing.North) + assert.NoError(t, err, "Failed to move rover") + assert.Equal(t, pos, vec, "Rover managed to move into large rock") + + newinfo, err := world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity") +} + +func TestWorld_RoverRepair(t *testing.T) { + world := NewWorld(2, 2) + a, err := world.SpawnRover() + assert.NoError(t, err) + + pos := vector.Vector{ + X: 0.0, + Y: 0.0, + } + + err = world.WarpRover(a, pos) + assert.NoError(t, err, "Failed to set position for rover") + + originalInfo, err := world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + + err = world.Atlas.SetTile(pos, objects.SmallRock) + assert.NoError(t, err, "Failed to set tile to rock") + + o, err := world.RoverStash(a) + assert.NoError(t, err, "Failed to stash") + assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + + err = world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) + assert.NoError(t, err, "Failed to set tile to rock") + + vec, err := world.MoveRover(a, bearing.North) + assert.NoError(t, err, "Failed to move rover") + assert.Equal(t, pos, vec, "Rover managed to move into large rock") + + newinfo, err := world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") + + err = world.ExecuteCommand(&Command{Command: CommandRepair}, a) + assert.NoError(t, err, "Failed to repair rover") + + newinfo, err = world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") } diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 943f254..f1c6c3d 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -64,6 +64,7 @@ message Command { // The command to execute // "move" - Move the rover in a direction, requires bearing // "stash" - Stashes item at current location in rover inventory + // "repair" - Repairs the rover using an inventory object string command = 1; // The bearing, example: NE From 5bbb2ff37f50dda3a42bffcf8c08fb37fc14cb61 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 01:41:19 +0100 Subject: [PATCH 268/495] Fix help text for commands --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 15014a1..2fc3eab 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -26,7 +26,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\nCommands") fmt.Fprintln(os.Stderr, "\tstatus prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issues move command to rover, see below") + fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issue commands to rover, accepts multiple, see below") fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\trover gets data for current rover") fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") From 5b5f80be7d6f631d3b282cc883609b6f306f7871 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 02:02:18 +0100 Subject: [PATCH 269/495] Clean up logging a little --- cmd/rove-accountant/main.go | 3 +-- pkg/game/world.go | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go index 31f2914..e774797 100644 --- a/cmd/rove-accountant/main.go +++ b/cmd/rove-accountant/main.go @@ -68,8 +68,7 @@ func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*a a.sync.RLock() defer a.sync.RUnlock() - // Try and fetch the rover - log.Printf("Getting value for account %s: %s\n", in.Account, in.Key) + // Try and fetch the value data, err := a.accountant.GetValue(in.Account, in.Key) if err != nil { log.Printf("Error: %s\n", err) diff --git a/pkg/game/world.go b/pkg/game/world.go index 8491a7d..9048900 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -430,16 +430,14 @@ func (w *World) ExecuteCommandQueues() { // ExecuteCommand will execute a single command func (w *World) ExecuteCommand(c *Command, rover string) (err error) { - log.Printf("Executing command: %+v\n", *c) + log.Printf("Executing command: %+v for %s\n", *c, rover) switch c.Command { case CommandMove: if dir, err := bearing.FromString(c.Bearing); err != nil { return err - } else if _, err := w.MoveRover(rover, dir); err != nil { return err - } case CommandStash: From 6ba6584ae144497d7621912254d9847ab1623443 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 02:03:12 +0100 Subject: [PATCH 270/495] Default to a much faster tick rate for now --- cmd/rove-server/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index d2848b2..286782f 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -49,7 +49,7 @@ func InnerMain() { persistence.SetPath(data) // Convert the tick rate - tickRate := 5 + tickRate := 1 if len(tick) > 0 { var err error tickRate, err = strconv.Atoi(tick) From 2556c0d049bade6e4f47d796f6255c2b61b1208d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 02:08:52 +0100 Subject: [PATCH 271/495] Call rand.Seed to end current determinism --- cmd/rove-server/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index 286782f..abd0a53 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -4,10 +4,12 @@ import ( "flag" "fmt" "log" + "math/rand" "os" "os/signal" "strconv" "syscall" + "time" "github.com/mdiluz/rove/cmd/rove-server/internal" "github.com/mdiluz/rove/pkg/persistence" @@ -23,6 +25,9 @@ var data = os.Getenv("DATA_PATH") var tick = os.Getenv("TICK_RATE") func InnerMain() { + // Ensure we've seeded rand + rand.Seed(time.Now().UTC().UnixNano()) + flag.Parse() // Print the version if requested From b116cdf29106f5b7f8d532a71e41cc45b2f28d25 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 14:48:21 +0100 Subject: [PATCH 272/495] Convert Atlas to infinite lazy growth The atlas will now expand as needed for any query, but only initialise the chunk tile memory when requested While this may still be a pre-mature optimisation, it does simplify some code and ensures that our memory footprint stays small, for the most part --- cmd/rove-server/internal/server.go | 9 +- pkg/atlas/atlas.go | 189 ++++++++++++----------------- pkg/atlas/atlas_test.go | 172 ++++++++++---------------- pkg/game/command_test.go | 2 +- pkg/game/world.go | 92 +++++--------- pkg/game/world_test.go | 59 +++------ 6 files changed, 186 insertions(+), 337 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 0345936..de9d933 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -83,6 +83,7 @@ func NewServer(opts ...ServerOption) *Server { address: "", persistence: EphemeralData, schedule: cron.New(), + world: game.NewWorld(16), } // Apply all options @@ -90,9 +91,6 @@ func NewServer(opts ...ServerOption) *Server { o(s) } - // Start small, we can grow the world later - s.world = game.NewWorld(4, 8) - return s } @@ -114,11 +112,6 @@ func (s *Server) Initialise(fillWorld bool) (err error) { } s.accountant = accounts.NewAccountantClient(s.clientConn) - // Spawn a border on the default world - if err := s.world.SpawnWorld(fillWorld); err != nil { - return err - } - // Load the world file if err := s.LoadWorld(); err != nil { return err diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 429efcb..969712f 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,7 +1,6 @@ package atlas import ( - "fmt" "log" "math/rand" @@ -16,114 +15,98 @@ type Chunk struct { Tiles []byte `json:"tiles"` } +// SpawnContent will create a chunk and fill it with spawned tiles +func (c *Chunk) SpawnContent(size int) { + c.Tiles = make([]byte, size*size) + for i := 0; i < len(c.Tiles); i++ { + c.Tiles[i] = objects.Empty + } + + // For now, fill it randomly with objects + for i := range c.Tiles { + if rand.Intn(16) == 0 { + c.Tiles[i] = objects.LargeRock + } else if rand.Intn(32) == 0 { + c.Tiles[i] = objects.SmallRock + } + } +} + // Atlas represents a grid of Chunks type Atlas struct { // Chunks represents all chunks in the world // This is intentionally not a 2D array so it can be expanded in all directions Chunks []Chunk `json:"chunks"` - // size is the current width/height of the given atlas - Size int `json:"size"` + // CurrentSize is the current width/height of the given atlas + CurrentSize int `json:"currentSize"` // ChunkSize is the dimensions of each chunk ChunkSize int `json:"chunksize"` } // NewAtlas creates a new empty atlas -func NewAtlas(size, chunkSize int) Atlas { - if size%2 != 0 { - log.Fatal("atlas size must always be even") +func NewAtlas(chunkSize int) Atlas { + return Atlas{ + CurrentSize: 0, + Chunks: nil, + ChunkSize: chunkSize, } - - a := Atlas{ - Size: size, - Chunks: make([]Chunk, size*size), - ChunkSize: chunkSize, - } - - // Initialise all the chunks - for i := range a.Chunks { - tiles := make([]byte, chunkSize*chunkSize) - for i := 0; i < len(tiles); i++ { - tiles[i] = objects.Empty - } - a.Chunks[i] = Chunk{ - Tiles: tiles, - } - } - - return a -} - -// SpawnRocks peppers the world with rocks -func (a *Atlas) SpawnRocks() error { - extent := a.ChunkSize * (a.Size / 2) - - // Pepper the current world with rocks - for i := -extent; i < extent; i++ { - for j := -extent; j < extent; j++ { - if rand.Intn(16) == 0 { - if err := a.SetTile(vector.Vector{X: i, Y: j}, objects.SmallRock); err != nil { - return err - } - } - } - } - - return nil -} - -// SpawnWalls spawns the around the world -func (a *Atlas) SpawnWalls() error { - extent := a.ChunkSize * (a.Size / 2) - - // Surround the atlas in walls - for i := -extent; i < extent; i++ { - - if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, objects.LargeRock); err != nil { // N - return err - } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, objects.LargeRock); err != nil { // E - return err - } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, objects.LargeRock); err != nil { // S - return err - } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, objects.LargeRock); err != nil { // W - return err - } - } - - return nil } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v vector.Vector, tile byte) error { - chunk := a.toChunk(v) - if chunk >= len(a.Chunks) { - return fmt.Errorf("location outside of allocated atlas") +func (a *Atlas) SetTile(v vector.Vector, tile byte) { + // Get the chunk, expand, and spawn it if needed + c := a.toChunkWithGrow(v) + chunk := a.Chunks[c] + if chunk.Tiles == nil { + chunk.SpawnContent(a.ChunkSize) } local := a.toChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize - if tileId >= len(a.Chunks[chunk].Tiles) { - return fmt.Errorf("location outside of allocated chunk") + + // Sanity check + if tileId >= len(chunk.Tiles) || tileId < 0 { + log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") } - a.Chunks[chunk].Tiles[tileId] = tile - return nil + + // Set the chunk back + chunk.Tiles[tileId] = tile + a.Chunks[c] = chunk } // GetTile will return an individual tile -func (a *Atlas) GetTile(v vector.Vector) (byte, error) { - chunk := a.toChunk(v) - if chunk >= len(a.Chunks) { - return 0, fmt.Errorf("location outside of allocated atlas") +func (a *Atlas) GetTile(v vector.Vector) byte { + // Get the chunk, expand, and spawn it if needed + c := a.toChunkWithGrow(v) + chunk := a.Chunks[c] + if chunk.Tiles == nil { + chunk.SpawnContent(a.ChunkSize) } local := a.toChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize - if tileId >= len(a.Chunks[chunk].Tiles) { - return 0, fmt.Errorf("location outside of allocated chunk") + + // Sanity check + if tileId >= len(chunk.Tiles) || tileId < 0 { + log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") } - return a.Chunks[chunk].Tiles[tileId], nil + return chunk.Tiles[tileId] +} + +// toChunkWithGrow will expand the atlas for a given tile, returns the new chunk +func (a *Atlas) toChunkWithGrow(v vector.Vector) int { + for { + // Get the chunk, and grow looping until we have a valid chunk + chunk := a.toChunk(v) + if chunk >= len(a.Chunks) || chunk < 0 { + a.grow() + } else { + return chunk + } + } } // toChunkLocal gets a chunk local coordinate for a tile @@ -131,7 +114,7 @@ func (a *Atlas) toChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } -// GetChunkID gets the chunk ID for a position in the world +// GetChunkID gets the current chunk ID for a position in the world func (a *Atlas) toChunk(v vector.Vector) int { local := a.toChunkLocal(v) // Get the chunk origin itself @@ -139,50 +122,34 @@ func (a *Atlas) toChunk(v vector.Vector) int { // Divided it by the number of chunks origin = origin.Divided(a.ChunkSize) // Shift it by our size (our origin is in the middle) - origin = origin.Added(vector.Vector{X: a.Size / 2, Y: a.Size / 2}) + origin = origin.Added(vector.Vector{X: a.CurrentSize / 2, Y: a.CurrentSize / 2}) // Get the ID based on the final values - return (a.Size * origin.Y) + origin.X + return (a.CurrentSize * origin.Y) + origin.X } // chunkOrigin gets the chunk origin for a given chunk index func (a *Atlas) chunkOrigin(chunk int) vector.Vector { v := vector.Vector{ - X: maths.Pmod(chunk, a.Size) - (a.Size / 2), - Y: (chunk / a.Size) - (a.Size / 2), + X: maths.Pmod(chunk, a.CurrentSize) - (a.CurrentSize / 2), + Y: (chunk / a.CurrentSize) - (a.CurrentSize / 2), } return v.Multiplied(a.ChunkSize) } -// GetWorldExtent gets the min and max valid coordinates of world -func (a *Atlas) GetWorldExtents() (min, max vector.Vector) { - min = vector.Vector{ - X: -(a.Size / 2) * a.ChunkSize, - Y: -(a.Size / 2) * a.ChunkSize, - } - max = vector.Vector{ - X: -min.X - 1, - Y: -min.Y - 1, - } - return -} - -// Grow will return a grown copy of the current atlas -func (a *Atlas) Grow(size int) error { - if size%2 != 0 { - return fmt.Errorf("atlas size must always be even") - } - delta := size - a.Size - if delta < 0 { - return fmt.Errorf("cannot shrink an atlas") - } else if delta == 0 { - return nil - } - +// grow will expand the current atlas in all directions by one chunk +func (a *Atlas) grow() error { // Create a new atlas - newAtlas := NewAtlas(size, a.ChunkSize) + newAtlas := NewAtlas(a.ChunkSize) - // Copy old chunks into new chunks + // Expand by one on each axis + newAtlas.CurrentSize = a.CurrentSize + 2 + + // Allocate the new atlas chunks + // These chunks will have nil tile slices + newAtlas.Chunks = make([]Chunk, newAtlas.CurrentSize*newAtlas.CurrentSize) + + // Copy all old chunks into the new atlas for index, chunk := range a.Chunks { // Calculate the new chunk location and copy over the data newAtlas.Chunks[newAtlas.toChunk(a.chunkOrigin(index))] = chunk diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index f8cc63a..3aeb328 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -3,60 +3,63 @@ package atlas import ( "testing" - "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) func TestAtlas_NewAtlas(t *testing.T) { - a := NewAtlas(2, 1) + a := NewAtlas(1) assert.NotNil(t, a) - // Tiles should look like: 2 | 3 - // ----- - // 0 | 1 - assert.Equal(t, 4, len(a.Chunks)) - - a = NewAtlas(4, 1) - assert.NotNil(t, a) - // Tiles should look like: 2 | 3 - // ----- - // 0 | 1 - assert.Equal(t, 16, len(a.Chunks)) + assert.Equal(t, 1, a.ChunkSize) + assert.Equal(t, 0, len(a.Chunks)) // Should start empty } func TestAtlas_toChunk(t *testing.T) { - a := NewAtlas(2, 1) + a := NewAtlas(1) assert.NotNil(t, a) - // Tiles should look like: 2 | 3 + + // We start empty so we'll look like this + chunkID := a.toChunk(vector.Vector{X: 0, Y: 0}) + assert.Equal(t, 0, chunkID) + + // Get a tile to spawn the chunks + a.GetTile(vector.Vector{}) + + // Chunks should look like: + // 2 | 3 // ----- // 0 | 1 - tile := a.toChunk(vector.Vector{X: 0, Y: 0}) - assert.Equal(t, 3, tile) - tile = a.toChunk(vector.Vector{X: 0, Y: -1}) - assert.Equal(t, 1, tile) - tile = a.toChunk(vector.Vector{X: -1, Y: -1}) - assert.Equal(t, 0, tile) - tile = a.toChunk(vector.Vector{X: -1, Y: 0}) - assert.Equal(t, 2, tile) + chunkID = a.toChunk(vector.Vector{X: 0, Y: 0}) + assert.Equal(t, 3, chunkID) + chunkID = a.toChunk(vector.Vector{X: 0, Y: -1}) + assert.Equal(t, 1, chunkID) + chunkID = a.toChunk(vector.Vector{X: -1, Y: -1}) + assert.Equal(t, 0, chunkID) + chunkID = a.toChunk(vector.Vector{X: -1, Y: 0}) + assert.Equal(t, 2, chunkID) - a = NewAtlas(2, 2) + a = NewAtlas(2) assert.NotNil(t, a) - // Tiles should look like: + // Get a tile to spawn the chunks + a.GetTile(vector.Vector{}) + // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - tile = a.toChunk(vector.Vector{X: 1, Y: 1}) - assert.Equal(t, 3, tile) - tile = a.toChunk(vector.Vector{X: 1, Y: -2}) - assert.Equal(t, 1, tile) - tile = a.toChunk(vector.Vector{X: -2, Y: -2}) - assert.Equal(t, 0, tile) - tile = a.toChunk(vector.Vector{X: -2, Y: 1}) - assert.Equal(t, 2, tile) + chunkID = a.toChunk(vector.Vector{X: 1, Y: 1}) + assert.Equal(t, 3, chunkID) + chunkID = a.toChunk(vector.Vector{X: 1, Y: -2}) + assert.Equal(t, 1, chunkID) + chunkID = a.toChunk(vector.Vector{X: -2, Y: -2}) + assert.Equal(t, 0, chunkID) + chunkID = a.toChunk(vector.Vector{X: -2, Y: 1}) + assert.Equal(t, 2, chunkID) - a = NewAtlas(4, 2) + a = NewAtlas(2) assert.NotNil(t, a) - // Tiles should look like: + // Get a tile to spawn the chunks + a.GetTile(vector.Vector{X: 0, Y: 3}) + // Chunks should look like: // 12| 13|| 14| 15 // ---------------- // 8 | 9 || 10| 11 @@ -64,107 +67,58 @@ func TestAtlas_toChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - tile = a.toChunk(vector.Vector{X: 1, Y: 3}) - assert.Equal(t, 14, tile) - tile = a.toChunk(vector.Vector{X: 1, Y: -3}) - assert.Equal(t, 2, tile) - tile = a.toChunk(vector.Vector{X: -1, Y: -1}) - assert.Equal(t, 5, tile) - tile = a.toChunk(vector.Vector{X: -2, Y: 2}) - assert.Equal(t, 13, tile) + chunkID = a.toChunk(vector.Vector{X: 1, Y: 3}) + assert.Equal(t, 14, chunkID) + chunkID = a.toChunk(vector.Vector{X: 1, Y: -3}) + assert.Equal(t, 2, chunkID) + chunkID = a.toChunk(vector.Vector{X: -1, Y: -1}) + assert.Equal(t, 5, chunkID) + chunkID = a.toChunk(vector.Vector{X: -2, Y: 2}) + assert.Equal(t, 13, chunkID) } func TestAtlas_GetSetTile(t *testing.T) { - a := NewAtlas(4, 10) + a := NewAtlas(10) assert.NotNil(t, a) // Set the origin tile to 1 and test it - assert.NoError(t, a.SetTile(vector.Vector{X: 0, Y: 0}, 1)) - tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) - assert.NoError(t, err) + a.SetTile(vector.Vector{X: 0, Y: 0}, 1) + tile := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) // Set another tile to 1 and test it - assert.NoError(t, a.SetTile(vector.Vector{X: 5, Y: -2}, 2)) - tile, err = a.GetTile(vector.Vector{X: 5, Y: -2}) - assert.NoError(t, err) + a.SetTile(vector.Vector{X: 5, Y: -2}, 2) + tile = a.GetTile(vector.Vector{X: 5, Y: -2}) assert.Equal(t, byte(2), tile) } func TestAtlas_Grown(t *testing.T) { // Start with a small example - a := NewAtlas(2, 2) + a := NewAtlas(2) assert.NotNil(t, a) - assert.Equal(t, 4, len(a.Chunks)) + assert.Equal(t, 0, len(a.Chunks)) // Set a few tiles to values - assert.NoError(t, a.SetTile(vector.Vector{X: 0, Y: 0}, 1)) - assert.NoError(t, a.SetTile(vector.Vector{X: -1, Y: -1}, 2)) - assert.NoError(t, a.SetTile(vector.Vector{X: 1, Y: -2}, 3)) + a.SetTile(vector.Vector{X: 0, Y: 0}, 1) + a.SetTile(vector.Vector{X: -1, Y: -1}, 2) + a.SetTile(vector.Vector{X: 1, Y: -2}, 3) - // Grow once to just double it - err := a.Grow(4) - assert.NoError(t, err) - assert.Equal(t, 16, len(a.Chunks)) - - tile, err := a.GetTile(vector.Vector{X: 0, Y: 0}) - assert.NoError(t, err) + // Check tile values + tile := a.GetTile(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) - assert.NoError(t, err) + tile = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) - assert.NoError(t, err) + tile = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) - // Grow it again even bigger - err = a.Grow(10) - assert.NoError(t, err) - assert.Equal(t, 100, len(a.Chunks)) - - tile, err = a.GetTile(vector.Vector{X: 0, Y: 0}) - assert.NoError(t, err) + tile = a.GetTile(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile, err = a.GetTile(vector.Vector{X: -1, Y: -1}) - assert.NoError(t, err) + tile = a.GetTile(vector.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile, err = a.GetTile(vector.Vector{X: 1, Y: -2}) - assert.NoError(t, err) + tile = a.GetTile(vector.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) } - -func TestAtlas_SpawnWorld(t *testing.T) { - // Start with a small example - a := NewAtlas(2, 4) - assert.NotNil(t, a) - assert.Equal(t, 4, len(a.Chunks)) - assert.NoError(t, a.SpawnWalls()) - - for i := -4; i < 4; i++ { - tile, err := a.GetTile(vector.Vector{X: i, Y: -4}) - assert.NoError(t, err) - assert.Equal(t, objects.LargeRock, tile) - } - - for i := -4; i < 4; i++ { - tile, err := a.GetTile(vector.Vector{X: -4, Y: i}) - assert.NoError(t, err) - assert.Equal(t, objects.LargeRock, tile) - } - - for i := -4; i < 4; i++ { - tile, err := a.GetTile(vector.Vector{X: 3, Y: i}) - assert.NoError(t, err) - assert.Equal(t, objects.LargeRock, tile) - } - - for i := -4; i < 4; i++ { - tile, err := a.GetTile(vector.Vector{X: i, Y: 3}) - assert.NoError(t, err) - assert.Equal(t, objects.LargeRock, tile) - } -} diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 11da854..3356f2a 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -8,7 +8,7 @@ import ( ) func TestCommand_Move(t *testing.T) { - world := NewWorld(2, 8) + world := NewWorld(8) a, err := world.SpawnRover() assert.NoError(t, err) pos := vector.Vector{ diff --git a/pkg/game/world.go b/pkg/game/world.go index 9048900..6b04594 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -12,7 +12,6 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -44,7 +43,7 @@ type World struct { var wordsFile = os.Getenv("WORDS_FILE") // NewWorld creates a new world object -func NewWorld(size, chunkSize int) *World { +func NewWorld(chunkSize int) *World { // Try and load the words file var lines []string @@ -65,23 +64,11 @@ func NewWorld(size, chunkSize int) *World { Rovers: make(map[string]Rover), CommandQueue: make(map[string]CommandStream), Incoming: make(map[string]CommandStream), - Atlas: atlas.NewAtlas(size, chunkSize), + Atlas: atlas.NewAtlas(chunkSize), words: lines, } } -// SpawnWorld spawns a border at the edge of the world atlas -func (w *World) SpawnWorld(fillWorld bool) error { - w.worldMutex.Lock() - defer w.worldMutex.Unlock() - if fillWorld { - if err := w.Atlas.SpawnRocks(); err != nil { - return err - } - } - return w.Atlas.SpawnWalls() -} - // SpawnRover adds an rover to the game func (w *World) SpawnRover() (string, error) { w.worldMutex.Lock() @@ -114,16 +101,14 @@ func (w *World) SpawnRover() (string, error) { // Seach until we error (run out of world) for { - if tile, err := w.Atlas.GetTile(rover.Pos); err != nil { - return "", err + tile := w.Atlas.GetTile(rover.Pos) + if !objects.IsBlocking(tile) { + break } else { - if !objects.IsBlocking(tile) { - break - } else { - // Try and spawn to the east of the blockage - rover.Pos.Add(vector.Vector{X: 1, Y: 0}) - } + // Try and spawn to the east of the blockage + rover.Pos.Add(vector.Vector{X: 1, Y: 0}) } + } log.Printf("Spawned rover at %+v\n", rover.Pos) @@ -153,9 +138,7 @@ func (w *World) DestroyRover(rover string) error { if i, ok := w.Rovers[rover]; ok { // Clear the tile - if err := w.Atlas.SetTile(i.Pos, objects.Empty); err != nil { - return fmt.Errorf("coudln't clear old rover tile: %s", err) - } + w.Atlas.SetTile(i.Pos, objects.Empty) delete(w.Rovers, rover) } else { return fmt.Errorf("no rover matching id") @@ -213,9 +196,8 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { } // Check the tile is not blocked - if tile, err := w.Atlas.GetTile(pos); err != nil { - return fmt.Errorf("coudln't get state of destination rover tile: %s", err) - } else if objects.IsBlocking(tile) { + tile := w.Atlas.GetTile(pos) + if objects.IsBlocking(tile) { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } @@ -237,9 +219,8 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error newPos := i.Pos.Added(b.Vector()) // Get the tile and verify it's empty - if tile, err := w.Atlas.GetTile(newPos); err != nil { - return vector.Vector{}, fmt.Errorf("couldn't get tile for new position: %s", err) - } else if !objects.IsBlocking(tile) { + tile := w.Atlas.GetTile(newPos) + if !objects.IsBlocking(tile) { // Perform the move i.Pos = newPos w.Rovers[rover] = i @@ -265,18 +246,12 @@ func (w *World) RoverStash(rover string) (byte, error) { defer w.worldMutex.Unlock() if r, ok := w.Rovers[rover]; ok { - if tile, err := w.Atlas.GetTile(r.Pos); err != nil { - return objects.Empty, err - } else { - if objects.IsStashable(tile) { - r.Inventory = append(r.Inventory, tile) - w.Rovers[rover] = r - if err := w.Atlas.SetTile(r.Pos, objects.Empty); err != nil { - return objects.Empty, err - } else { - return tile, nil - } - } + tile := w.Atlas.GetTile(r.Pos) + if objects.IsStashable(tile) { + r.Inventory = append(r.Inventory, tile) + w.Rovers[rover] = r + w.Atlas.SetTile(r.Pos, objects.Empty) + return tile, nil } } else { @@ -306,32 +281,19 @@ func (w *World) RadarFromRover(rover string) ([]byte, error) { Y: roverPos.Y + r.Range, } - // Make sure we only query within the actual world - worldMin, worldMax := w.Atlas.GetWorldExtents() - scanMin := vector.Vector{ - X: maths.Max(radarMin.X, worldMin.X), - Y: maths.Max(radarMin.Y, worldMin.Y), - } - scanMax := vector.Vector{ - X: maths.Min(radarMax.X, worldMax.X), - Y: maths.Min(radarMax.Y, worldMax.Y), - } - // Gather up all tiles within the range var radar = make([]byte, radarSpan*radarSpan) - for j := scanMin.Y; j <= scanMax.Y; j++ { - for i := scanMin.X; i <= scanMax.X; i++ { + for j := radarMin.Y; j <= radarMax.Y; j++ { + for i := radarMin.X; i <= radarMax.X; i++ { q := vector.Vector{X: i, Y: j} - if tile, err := w.Atlas.GetTile(q); err != nil { - return nil, fmt.Errorf("failed to query tile: %s", err) + tile := w.Atlas.GetTile(q) + + // Get the position relative to the bottom left of the radar + relative := q.Added(radarMin.Negated()) + index := relative.X + relative.Y*radarSpan + radar[index] = tile - } else { - // Get the position relative to the bottom left of the radar - relative := q.Added(radarMin.Negated()) - index := relative.X + relative.Y*radarSpan - radar[index] = tile - } } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 5a48231..ceda417 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -11,14 +11,14 @@ import ( func TestNewWorld(t *testing.T) { // Very basic for now, nothing to verify - world := NewWorld(4, 4) + world := NewWorld(4) if world == nil { t.Error("Failed to create world") } } func TestWorld_CreateRover(t *testing.T) { - world := NewWorld(2, 8) + world := NewWorld(8) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() @@ -33,7 +33,7 @@ func TestWorld_CreateRover(t *testing.T) { } func TestWorld_GetRover(t *testing.T) { - world := NewWorld(2, 4) + world := NewWorld(4) a, err := world.SpawnRover() assert.NoError(t, err) @@ -43,7 +43,7 @@ func TestWorld_GetRover(t *testing.T) { } func TestWorld_DestroyRover(t *testing.T) { - world := NewWorld(4, 1) + world := NewWorld(1) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() @@ -61,7 +61,7 @@ func TestWorld_DestroyRover(t *testing.T) { } func TestWorld_GetSetMovePosition(t *testing.T) { - world := NewWorld(4, 4) + world := NewWorld(4) a, err := world.SpawnRover() assert.NoError(t, err) @@ -84,14 +84,14 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, objects.LargeRock)) + world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, objects.LargeRock) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") } func TestWorld_RadarFromRover(t *testing.T) { // Create world that should have visible walls on the radar - world := NewWorld(4, 2) + world := NewWorld(2) a, err := world.SpawnRover() assert.NoError(t, err) b, err := world.SpawnRover() @@ -102,40 +102,18 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0}), "Failed to warp rover") - // Spawn the world wall - err = world.Atlas.SpawnWalls() - assert.NoError(t, err) - radar, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") fullRange := 4 + 4 + 1 assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong length") - // It should look like: - // --------- - // OOOOOOOO- - // O------O- - // O------O- - // O---R--O- - // O------O- - // O------O- - // OR-----O- - // OOOOOOOO- - PrintTiles(radar) - - // Test all expected values + // Test the expected values assert.Equal(t, objects.Rover, radar[1+fullRange]) assert.Equal(t, objects.Rover, radar[4+4*fullRange]) - for i := 0; i < 8; i++ { - assert.Equal(t, objects.LargeRock, radar[i]) - assert.Equal(t, objects.LargeRock, radar[i+(7*9)]) - assert.Equal(t, objects.LargeRock, radar[i*9]) - assert.Equal(t, objects.LargeRock, radar[(i*9)+7]) - } } func TestWorld_RoverStash(t *testing.T) { - world := NewWorld(2, 2) + world := NewWorld(2) a, err := world.SpawnRover() assert.NoError(t, err) @@ -147,15 +125,13 @@ func TestWorld_RoverStash(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - err = world.Atlas.SetTile(pos, objects.SmallRock) - assert.NoError(t, err, "Failed to set tile to rock") + world.Atlas.SetTile(pos, objects.SmallRock) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - tile, err := world.Atlas.GetTile(pos) - assert.NoError(t, err, "Failed to get tile") + tile := world.Atlas.GetTile(pos) assert.Equal(t, objects.Empty, tile, "Stash failed to remove object from atlas") inv, err := world.RoverInventory(a) @@ -164,7 +140,7 @@ func TestWorld_RoverStash(t *testing.T) { } func TestWorld_RoverDamage(t *testing.T) { - world := NewWorld(2, 2) + world := NewWorld(2) a, err := world.SpawnRover() assert.NoError(t, err) @@ -179,8 +155,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - err = world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) - assert.NoError(t, err, "Failed to set tile to rock") + world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") @@ -192,7 +167,7 @@ func TestWorld_RoverDamage(t *testing.T) { } func TestWorld_RoverRepair(t *testing.T) { - world := NewWorld(2, 2) + world := NewWorld(2) a, err := world.SpawnRover() assert.NoError(t, err) @@ -207,15 +182,13 @@ func TestWorld_RoverRepair(t *testing.T) { originalInfo, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - err = world.Atlas.SetTile(pos, objects.SmallRock) - assert.NoError(t, err, "Failed to set tile to rock") + world.Atlas.SetTile(pos, objects.SmallRock) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - err = world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) - assert.NoError(t, err, "Failed to set tile to rock") + world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") From 9bb91920c95ba8225cdf342a3879c49747aa44fd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 27 Jun 2020 16:03:53 +0100 Subject: [PATCH 273/495] Make Atlas grow in X and Y dimensions independently Fixes exponential growth --- pkg/atlas/atlas.go | 192 ++++++++++++++++++++++++++++------------ pkg/atlas/atlas_test.go | 41 +++++---- pkg/vector/vector.go | 10 +++ 3 files changed, 163 insertions(+), 80 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 969712f..00402ab 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -38,32 +38,40 @@ type Atlas struct { // This is intentionally not a 2D array so it can be expanded in all directions Chunks []Chunk `json:"chunks"` - // CurrentSize is the current width/height of the given atlas - CurrentSize int `json:"currentSize"` + // CurrentSizeInChunks is the current width/height of the atlas in chunks + CurrentSizeInChunks vector.Vector `json:"currentSizeInChunks"` - // ChunkSize is the dimensions of each chunk + // WorldOriginInChunkSpace represents the location of [0,0] in chunk space + WorldOriginInChunkSpace vector.Vector `json:"worldOriginInChunkSpace"` + + // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` } // NewAtlas creates a new empty atlas func NewAtlas(chunkSize int) Atlas { - return Atlas{ - CurrentSize: 0, - Chunks: nil, - ChunkSize: chunkSize, + // Start up with one chunk + a := Atlas{ + ChunkSize: chunkSize, + Chunks: make([]Chunk, 1), + CurrentSizeInChunks: vector.Vector{X: 1, Y: 1}, + WorldOriginInChunkSpace: vector.Vector{X: 0, Y: 0}, } + // Initialise the first chunk + a.Chunks[0].SpawnContent(chunkSize) + return a } // SetTile sets an individual tile's kind func (a *Atlas) SetTile(v vector.Vector, tile byte) { - // Get the chunk, expand, and spawn it if needed - c := a.toChunkWithGrow(v) + // Get the chunk + c := a.worldSpaceToChunkWithGrow(v) chunk := a.Chunks[c] if chunk.Tiles == nil { chunk.SpawnContent(a.ChunkSize) } - local := a.toChunkLocal(v) + local := a.worldSpaceToChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize // Sanity check @@ -78,14 +86,14 @@ func (a *Atlas) SetTile(v vector.Vector, tile byte) { // GetTile will return an individual tile func (a *Atlas) GetTile(v vector.Vector) byte { - // Get the chunk, expand, and spawn it if needed - c := a.toChunkWithGrow(v) + // Get the chunk + c := a.worldSpaceToChunkWithGrow(v) chunk := a.Chunks[c] if chunk.Tiles == nil { chunk.SpawnContent(a.ChunkSize) } - local := a.toChunkLocal(v) + local := a.worldSpaceToChunkLocal(v) tileId := local.X + local.Y*a.ChunkSize // Sanity check @@ -96,68 +104,134 @@ func (a *Atlas) GetTile(v vector.Vector) byte { return chunk.Tiles[tileId] } -// toChunkWithGrow will expand the atlas for a given tile, returns the new chunk -func (a *Atlas) toChunkWithGrow(v vector.Vector) int { - for { - // Get the chunk, and grow looping until we have a valid chunk - chunk := a.toChunk(v) - if chunk >= len(a.Chunks) || chunk < 0 { - a.grow() - } else { - return chunk - } - } -} - -// toChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) toChunkLocal(v vector.Vector) vector.Vector { +// worldSpaceToChunkLocal gets a chunk local coordinate for a tile +func (a *Atlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } -// GetChunkID gets the current chunk ID for a position in the world -func (a *Atlas) toChunk(v vector.Vector) int { - local := a.toChunkLocal(v) - // Get the chunk origin itself - origin := v.Added(local.Negated()) - // Divided it by the number of chunks - origin = origin.Divided(a.ChunkSize) - // Shift it by our size (our origin is in the middle) - origin = origin.Added(vector.Vector{X: a.CurrentSize / 2, Y: a.CurrentSize / 2}) - // Get the ID based on the final values - return (a.CurrentSize * origin.Y) + origin.X +// worldSpaceToChunk gets the current chunk ID for a position in the world +func (a *Atlas) worldSpaceToChunk(v vector.Vector) int { + // First convert to chunk space + chunkSpace := a.worldSpaceToChunkSpace(v) + + // Then return the ID + return a.chunkSpaceToChunk(chunkSpace) } -// chunkOrigin gets the chunk origin for a given chunk index -func (a *Atlas) chunkOrigin(chunk int) vector.Vector { - v := vector.Vector{ - X: maths.Pmod(chunk, a.CurrentSize) - (a.CurrentSize / 2), - Y: (chunk / a.CurrentSize) - (a.CurrentSize / 2), +// worldSpaceToChunkSpace converts from world space to chunk space +func (a *Atlas) worldSpaceToChunkSpace(v vector.Vector) vector.Vector { + // Remove the chunk local part + chunkOrigin := v.Added(a.worldSpaceToChunkLocal(v).Negated()) + // Convert to chunk space coordinate + chunkSpaceOrigin := chunkOrigin.Divided(a.ChunkSize) + // Shift it by our current chunk origin + chunkIndexOrigin := chunkSpaceOrigin.Added(a.WorldOriginInChunkSpace) + + return chunkIndexOrigin +} + +// chunkSpaceToWorldSpace vonverts from chunk space to world space +func (a *Atlas) chunkSpaceToWorldSpace(v vector.Vector) vector.Vector { + + // Shift it by the current chunk origin + shifted := v.Added(a.WorldOriginInChunkSpace.Negated()) + + // Multiply out by chunk size + return shifted.Multiplied(a.ChunkSize) +} + +// chunkOriginInChunkSpace Gets the chunk origin in chunk space +func (a *Atlas) chunkOriginInChunkSpace(chunk int) vector.Vector { + // convert the chunk to chunk space + chunkOrigin := a.chunkToChunkSpace(chunk) + + // Shift it by the current chunk origin + return chunkOrigin.Added(a.WorldOriginInChunkSpace.Negated()) +} + +// chunkOriginInWorldSpace gets the chunk origin for a given chunk index +func (a *Atlas) chunkOriginInWorldSpace(chunk int) vector.Vector { + // convert the chunk to chunk space + chunkSpace := a.chunkToChunkSpace(chunk) + + // Convert to world space + return a.chunkSpaceToWorldSpace(chunkSpace) +} + +// chunkSpaceToChunk converts from chunk space to the chunk +func (a *Atlas) chunkSpaceToChunk(v vector.Vector) int { + // Along the coridor and up the stair + return (v.Y * a.CurrentSizeInChunks.X) + v.X +} + +// chunkToChunkSpace returns the chunk space coord for the chunk +func (a *Atlas) chunkToChunkSpace(chunk int) vector.Vector { + return vector.Vector{ + X: maths.Pmod(chunk, a.CurrentSizeInChunks.Y), + Y: (chunk / a.CurrentSizeInChunks.X), + } +} + +func (a *Atlas) getExtents() (min vector.Vector, max vector.Vector) { + min = a.WorldOriginInChunkSpace.Negated() + max = min.Added(a.CurrentSizeInChunks) + return +} + +// worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed +func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { + min, max := a.getExtents() + + // Divide by the chunk size to bring into chunk space + v = v.Divided(a.ChunkSize) + + // Check we're within the current extents and bail early + if v.X >= min.X && v.Y >= min.Y && v.X < max.X && v.Y < max.Y { + return a.worldSpaceToChunk(v) } - return v.Multiplied(a.ChunkSize) -} + // Calculate the new origin and the new size + origin := min + size := a.CurrentSizeInChunks -// grow will expand the current atlas in all directions by one chunk -func (a *Atlas) grow() error { - // Create a new atlas - newAtlas := NewAtlas(a.ChunkSize) + // If we need to shift the origin back + originDiff := origin.Added(v.Negated()) + if originDiff.X > 0 { + origin.X -= originDiff.X + size.X += originDiff.X + } + if originDiff.Y > 0 { + origin.Y -= originDiff.Y + size.Y += originDiff.Y + } - // Expand by one on each axis - newAtlas.CurrentSize = a.CurrentSize + 2 + // If we need to expand the size + maxDiff := v.Added(max.Negated()) + if maxDiff.X > 0 { + size.X += maxDiff.X + } + if maxDiff.Y > 0 { + size.Y += maxDiff.Y + } - // Allocate the new atlas chunks - // These chunks will have nil tile slices - newAtlas.Chunks = make([]Chunk, newAtlas.CurrentSize*newAtlas.CurrentSize) + // Set up the new size and origin + newAtlas := Atlas{ + ChunkSize: a.ChunkSize, + WorldOriginInChunkSpace: origin.Negated(), + CurrentSizeInChunks: size, + Chunks: make([]Chunk, size.X*size.Y), + } // Copy all old chunks into the new atlas - for index, chunk := range a.Chunks { + for chunk, chunkData := range a.Chunks { // Calculate the new chunk location and copy over the data - newAtlas.Chunks[newAtlas.toChunk(a.chunkOrigin(index))] = chunk + newChunk := newAtlas.worldSpaceToChunk(a.chunkOriginInWorldSpace(chunk)) + // Copy over the old chunk to the new atlas + newAtlas.Chunks[newChunk] = chunkData } // Copy the new atlas data into this one *a = newAtlas - // Return the new atlas - return nil + return a.worldSpaceToChunk(v) } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 3aeb328..ae5c705 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -11,54 +11,53 @@ func TestAtlas_NewAtlas(t *testing.T) { a := NewAtlas(1) assert.NotNil(t, a) assert.Equal(t, 1, a.ChunkSize) - assert.Equal(t, 0, len(a.Chunks)) // Should start empty + assert.Equal(t, 1, len(a.Chunks)) // Should start empty } func TestAtlas_toChunk(t *testing.T) { a := NewAtlas(1) assert.NotNil(t, a) - // We start empty so we'll look like this - chunkID := a.toChunk(vector.Vector{X: 0, Y: 0}) - assert.Equal(t, 0, chunkID) - // Get a tile to spawn the chunks - a.GetTile(vector.Vector{}) + a.GetTile(vector.Vector{X: -1, Y: -1}) + a.GetTile(vector.Vector{X: 0, Y: 0}) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID = a.toChunk(vector.Vector{X: 0, Y: 0}) + chunkID := a.worldSpaceToChunk(vector.Vector{X: 0, Y: 0}) assert.Equal(t, 3, chunkID) - chunkID = a.toChunk(vector.Vector{X: 0, Y: -1}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: 0, Y: -1}) assert.Equal(t, 1, chunkID) - chunkID = a.toChunk(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 0, chunkID) - chunkID = a.toChunk(vector.Vector{X: -1, Y: 0}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) a = NewAtlas(2) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.GetTile(vector.Vector{}) + a.GetTile(vector.Vector{X: -2, Y: -2}) + a.GetTile(vector.Vector{X: 1, Y: 1}) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID = a.toChunk(vector.Vector{X: 1, Y: 1}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: 1}) assert.Equal(t, 3, chunkID) - chunkID = a.toChunk(vector.Vector{X: 1, Y: -2}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: -2}) assert.Equal(t, 1, chunkID) - chunkID = a.toChunk(vector.Vector{X: -2, Y: -2}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: -2}) assert.Equal(t, 0, chunkID) - chunkID = a.toChunk(vector.Vector{X: -2, Y: 1}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) a = NewAtlas(2) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.GetTile(vector.Vector{X: 0, Y: 3}) + a.GetTile(vector.Vector{X: 5, Y: 5}) + a.GetTile(vector.Vector{X: -5, Y: -5}) // Chunks should look like: // 12| 13|| 14| 15 // ---------------- @@ -67,13 +66,13 @@ func TestAtlas_toChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - chunkID = a.toChunk(vector.Vector{X: 1, Y: 3}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: 3}) assert.Equal(t, 14, chunkID) - chunkID = a.toChunk(vector.Vector{X: 1, Y: -3}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: -3}) assert.Equal(t, 2, chunkID) - chunkID = a.toChunk(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 5, chunkID) - chunkID = a.toChunk(vector.Vector{X: -2, Y: 2}) + chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) } @@ -96,7 +95,7 @@ func TestAtlas_Grown(t *testing.T) { // Start with a small example a := NewAtlas(2) assert.NotNil(t, a) - assert.Equal(t, 0, len(a.Chunks)) + assert.Equal(t, 1, len(a.Chunks)) // Set a few tiles to values a.SetTile(vector.Vector{X: 0, Y: 0}, 1) diff --git a/pkg/vector/vector.go b/pkg/vector/vector.go index 1b82c5a..61efc97 100644 --- a/pkg/vector/vector.go +++ b/pkg/vector/vector.go @@ -54,3 +54,13 @@ func (v Vector) Divided(val int) Vector { func (v Vector) Abs() Vector { return Vector{maths.Abs(v.X), maths.Abs(v.Y)} } + +// Min returns the minimum values in both vectors +func Min(v1 Vector, v2 Vector) Vector { + return Vector{maths.Min(v1.X, v2.X), maths.Min(v1.Y, v2.Y)} +} + +// Min returns the max values in both vectors +func Max(v1 Vector, v2 Vector) Vector { + return Vector{maths.Max(v1.X, v2.X), maths.Max(v1.Y, v2.Y)} +} From e5ee0eaece8c6bb64d32e2d42b03f90e2091d694 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 28 Jun 2020 11:01:01 +0100 Subject: [PATCH 274/495] Rename a couple of Atlas variables Sometimes names can be too long --- pkg/atlas/atlas.go | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 00402ab..0c692d3 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -38,11 +38,11 @@ type Atlas struct { // This is intentionally not a 2D array so it can be expanded in all directions Chunks []Chunk `json:"chunks"` - // CurrentSizeInChunks is the current width/height of the atlas in chunks - CurrentSizeInChunks vector.Vector `json:"currentSizeInChunks"` + // CurrentSize is the current width/height of the atlas in chunks + CurrentSize vector.Vector `json:"currentSize"` - // WorldOriginInChunkSpace represents the location of [0,0] in chunk space - WorldOriginInChunkSpace vector.Vector `json:"worldOriginInChunkSpace"` + // WorldOrigin represents the location of the [0,0] world space point in terms of the allotted current chunks + WorldOrigin vector.Vector `json:"worldOrigin"` // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` @@ -52,10 +52,10 @@ type Atlas struct { func NewAtlas(chunkSize int) Atlas { // Start up with one chunk a := Atlas{ - ChunkSize: chunkSize, - Chunks: make([]Chunk, 1), - CurrentSizeInChunks: vector.Vector{X: 1, Y: 1}, - WorldOriginInChunkSpace: vector.Vector{X: 0, Y: 0}, + ChunkSize: chunkSize, + Chunks: make([]Chunk, 1), + CurrentSize: vector.Vector{X: 1, Y: 1}, + WorldOrigin: vector.Vector{X: 0, Y: 0}, } // Initialise the first chunk a.Chunks[0].SpawnContent(chunkSize) @@ -125,7 +125,7 @@ func (a *Atlas) worldSpaceToChunkSpace(v vector.Vector) vector.Vector { // Convert to chunk space coordinate chunkSpaceOrigin := chunkOrigin.Divided(a.ChunkSize) // Shift it by our current chunk origin - chunkIndexOrigin := chunkSpaceOrigin.Added(a.WorldOriginInChunkSpace) + chunkIndexOrigin := chunkSpaceOrigin.Added(a.WorldOrigin) return chunkIndexOrigin } @@ -134,7 +134,7 @@ func (a *Atlas) worldSpaceToChunkSpace(v vector.Vector) vector.Vector { func (a *Atlas) chunkSpaceToWorldSpace(v vector.Vector) vector.Vector { // Shift it by the current chunk origin - shifted := v.Added(a.WorldOriginInChunkSpace.Negated()) + shifted := v.Added(a.WorldOrigin.Negated()) // Multiply out by chunk size return shifted.Multiplied(a.ChunkSize) @@ -146,7 +146,7 @@ func (a *Atlas) chunkOriginInChunkSpace(chunk int) vector.Vector { chunkOrigin := a.chunkToChunkSpace(chunk) // Shift it by the current chunk origin - return chunkOrigin.Added(a.WorldOriginInChunkSpace.Negated()) + return chunkOrigin.Added(a.WorldOrigin.Negated()) } // chunkOriginInWorldSpace gets the chunk origin for a given chunk index @@ -161,20 +161,20 @@ func (a *Atlas) chunkOriginInWorldSpace(chunk int) vector.Vector { // chunkSpaceToChunk converts from chunk space to the chunk func (a *Atlas) chunkSpaceToChunk(v vector.Vector) int { // Along the coridor and up the stair - return (v.Y * a.CurrentSizeInChunks.X) + v.X + return (v.Y * a.CurrentSize.X) + v.X } // chunkToChunkSpace returns the chunk space coord for the chunk func (a *Atlas) chunkToChunkSpace(chunk int) vector.Vector { return vector.Vector{ - X: maths.Pmod(chunk, a.CurrentSizeInChunks.Y), - Y: (chunk / a.CurrentSizeInChunks.X), + X: maths.Pmod(chunk, a.CurrentSize.Y), + Y: (chunk / a.CurrentSize.X), } } func (a *Atlas) getExtents() (min vector.Vector, max vector.Vector) { - min = a.WorldOriginInChunkSpace.Negated() - max = min.Added(a.CurrentSizeInChunks) + min = a.WorldOrigin.Negated() + max = min.Added(a.CurrentSize) return } @@ -192,7 +192,7 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { // Calculate the new origin and the new size origin := min - size := a.CurrentSizeInChunks + size := a.CurrentSize // If we need to shift the origin back originDiff := origin.Added(v.Negated()) @@ -216,10 +216,10 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { // Set up the new size and origin newAtlas := Atlas{ - ChunkSize: a.ChunkSize, - WorldOriginInChunkSpace: origin.Negated(), - CurrentSizeInChunks: size, - Chunks: make([]Chunk, size.X*size.Y), + ChunkSize: a.ChunkSize, + WorldOrigin: origin.Negated(), + CurrentSize: size, + Chunks: make([]Chunk, size.X*size.Y), } // Copy all old chunks into the new atlas From 06cf44f12908c55cbdeb1d76b871e0fcad8fa693 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 28 Jun 2020 11:02:56 +0100 Subject: [PATCH 275/495] Increase the chunk size to 1kb per chunk --- cmd/rove-server/internal/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index de9d933..5aa7936 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -83,7 +83,7 @@ func NewServer(opts ...ServerOption) *Server { address: "", persistence: EphemeralData, schedule: cron.New(), - world: game.NewWorld(16), + world: game.NewWorld(32), } // Apply all options From 0d3aac49b10a16406b920db3ac0c9c1f40ada3a4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 28 Jun 2020 12:26:51 +0100 Subject: [PATCH 276/495] Don't expose the rove-accountant --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 91c69c1..8ecce3d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,8 +9,6 @@ services: context: . dockerfile: Dockerfile image: rove:latest - ports: - - "9091:9091" environment: - PORT=9091 - DATA_PATH=/mnt/rove-server From b9198c546c390e7c6f65603f80869a92f6485a5b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 28 Jun 2020 12:30:32 +0100 Subject: [PATCH 277/495] Update the status HTTPS makes sense for the docs, but is not essential, the real goal is to have token security --- docs/status.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/status.md b/docs/status.md index 5045f0a..58eabfc 100644 --- a/docs/status.md +++ b/docs/status.md @@ -19,10 +19,9 @@ This page tracks the current feature set and the features to implement next ### Incoming features * Rover replacement and advancement mechanic -* HTTPS +* Account token security ### Stretch goals * Render rover camera view -* Account token security From e09cea328bca6595d49150a7b64a0dbbb89771c2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 28 Jun 2020 15:52:46 +0100 Subject: [PATCH 278/495] Refactor into singular account in the config --- cmd/rove/main.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2fc3eab..398feb9 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -42,10 +42,15 @@ func printUsage() { const gRPCport = 9090 +// Account stores data for an account +type Account struct { + Name string `json:"name"` +} + // Config is used to store internal data type Config struct { - Host string `json:"host,omitempty"` - Accounts map[string]string `json:"accounts,omitempty"` + Host string `json:"host,omitempty"` + Account Account `json:"account,omitempty"` } // ConfigPath returns the configuration path @@ -65,7 +70,6 @@ func ConfigPath() string { func LoadConfig() (config Config, err error) { datapath := ConfigPath() - config.Accounts = make(map[string]string) // Create the path if needed path := filepath.Dir(datapath) @@ -136,7 +140,7 @@ func InnerMain(command string, args ...string) error { if len(args) > 0 { config.Host = args[0] } - fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Accounts[config.Host]) + fmt.Printf("host: %s\taccount: %s\n", config.Host, config.Account) return SaveConfig(config) } @@ -173,6 +177,7 @@ func InnerMain(command string, args ...string) error { if len(args) == 0 { return fmt.Errorf("must pass name to 'register'") } + name := args[0] d := rove.RegisterRequest{ Name: name, @@ -184,7 +189,7 @@ func InnerMain(command string, args ...string) error { default: fmt.Printf("Registered account with id: %s\n", name) - config.Accounts[config.Host] = name + config.Account.Name = name } case "commands": @@ -219,7 +224,7 @@ func InnerMain(command string, args ...string) error { } d := rove.CommandsRequest{ - Account: config.Accounts[config.Host], + Account: config.Account.Name, Commands: commands, } @@ -237,7 +242,7 @@ func InnerMain(command string, args ...string) error { } case "radar": - dat := rove.RadarRequest{Account: config.Accounts[config.Host]} + dat := rove.RadarRequest{Account: config.Account.Name} if err := verifyID(dat.Account); err != nil { return err } @@ -253,7 +258,7 @@ func InnerMain(command string, args ...string) error { } case "rover": - req := rove.RoverRequest{Account: config.Accounts[config.Host]} + req := rove.RoverRequest{Account: config.Account.Name} if err := verifyID(req.Account); err != nil { return err } From e3169cdbddeef5761555cc0ea2204df1ae2a0073 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 16:50:16 +0100 Subject: [PATCH 279/495] Update the docs and status pages --- docs/design.md | 51 ++++++++++++++++---------------------------------- docs/status.md | 12 ++++++++---- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/docs/design.md b/docs/design.md index 578c5e6..21a14d0 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,8 +1,7 @@ Rove ===== -An asynchronous nomadic game about exploring a planet as part of a loose -community. +An asynchronous nomadic game about exploring a planet as part of a loose community. ------------------------------------------- @@ -14,61 +13,45 @@ Control a rover on the surface of the planet using a remote control interface. Commands are sent and happen asynchronously, and the rover feeds back information about position and surroundings, as well as photos. -### Goal - -To reach the pole. - ### General -Movement is slow and sometimes dangerous. Hazards damage the rover. +Movement is slow and sometimes dangerous. -Resources can be collected to fix and upgrade the rover. +Resources can be collected, and rovers recharge power during the day. -Rovers recharge power during the day. +Hazards damage the rover. Resources can be spent to repair. -Enough collected resources allow you to create and fire a new rover a significant distance in any direction, losing control of the current one and leaving it dormant. +Spend resources to create and spawn a new improved rover a significant distance away, leaving the current one dormant. -Finding a dormant rover gives you a choice - scrap it to gain minor resources, or fire it a distance just like a new rover, taking control of it. +"Dying" leaves the current rover dormant and assigns the users a new rover. -“Dying” triggers a self destruct and fires a new basic rover in a random direction towards the equator +Players can repair dormant rovers to gain control of them, taking on their improvements and inventory. -## Multiplayer +### Multiplayer -The planet itself and things that happen on it are persistent. Players can view each other, and use very rudimentary signals. +Players can see each other and use very rudimentary signals. -Dormant rovers store full history of travel, owners, and keep damage, improvements and resources. - -Players have no other forms of direct communication. - -Players can view progress of all rovers attached to their name. - -Limit too many players in one location with a simple interference mechanic - only a certain density can exist at once to operate properly, additional players can’t move within range. +Dormant rovers store full history of travel and owners, as well as their improvements and resources. ------------------------------------------- ### Implementation -Two functional parts +* A server that receives the commands, sends out data, and handles interactions between players. -A server that receives the commands, sends out data, and handles interactions between players. - -An app, or apps, that interface with the server to let you control and view rover information +* An app, or apps, that interface with the server to let you control and view rover information ------------------------------------------- ### To Solve -#### What kinds of progression/upgrades exist? -Needs a very simple set of rover internals defined, each of which can be upgraded. +* What kinds of progression/upgrades exist? -#### How does the game encourage lateral movement? -Could simply be the terrain is constructed in very lateral ways, blocking progress frequently +* How does the game encourage cooperation? -#### How does the game encourage cooperation? -How exactly would a time delay mechanic enhance the experience? -Currently it’s just to make the multiplayer easier to use, and to make interactions a little more complicated. The game could limit the number of bytes (commands) you can send over time. +* How would the gameplay prevent griefing? -#### How would the gameplay prevent griefing? +* What drives the exploration? ------------------------------------------- @@ -76,8 +59,6 @@ Currently it’s just to make the multiplayer easier to use, and to make interac Feeling “known for” something - the person who did X thing. Limit number of X things that can be done, possibly over time. -Build up a certain level of knowledge and ownership of a place, but then destroy it or give it up. Or build up a character and then leave it behind. - A significant aspect of failure - failing must be a focus of the game. Winning the game might actually be failing in some specific way. A clear and well defined investment vs. payoff curve. diff --git a/docs/status.md b/docs/status.md index 58eabfc..bf3fea2 100644 --- a/docs/status.md +++ b/docs/status.md @@ -3,7 +3,7 @@ Development status This page tracks the current feature set and the features to implement next -### Complete features +### Current features * Users can register account and spawn rover * Users can command the rover to move @@ -13,15 +13,19 @@ This page tracks the current feature set and the features to implement next * Commands are queued and then are executed in sequence * Rover inventory * Collectable materials -* Rover integrity and damage +* Rover has integrity and takes damage on collisions * Rover can repair ### Incoming features * Rover replacement and advancement mechanic -* Account token security +* Dormant rovers +* Rover energy with solar charging +* Day/night cycle +* More hazards +* Simple rover to rover communication ### Stretch goals * Render rover camera view - +* Account token security \ No newline at end of file From 1f2669b64354065f648937e263b03d6a7032837a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 17:40:23 +0100 Subject: [PATCH 280/495] Set theme jekyll-theme-merlot --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..c50ff38 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-merlot \ No newline at end of file From 77bde53a5272095526d5156ec8716e86593eca38 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 17:41:08 +0100 Subject: [PATCH 281/495] Rename the main design doc --- docs/{design.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{design.md => README.md} (100%) diff --git a/docs/design.md b/docs/README.md similarity index 100% rename from docs/design.md rename to docs/README.md From 984ff566644e4b033bd6da7babfbd4b68d96e2cf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 22:43:53 +0100 Subject: [PATCH 282/495] Add flatpak file, unused but functional --- flatpak/io.github.mdiluz.Rove.json | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 flatpak/io.github.mdiluz.Rove.json diff --git a/flatpak/io.github.mdiluz.Rove.json b/flatpak/io.github.mdiluz.Rove.json new file mode 100644 index 0000000..d206be5 --- /dev/null +++ b/flatpak/io.github.mdiluz.Rove.json @@ -0,0 +1,36 @@ +{ + "app-id": "io.github.mdiluz.Rove", + "runtime": "org.freedesktop.Platform", + "runtime-version": "19.08", + "sdk": "org.freedesktop.Sdk", + "sdk-extensions" : [ + "org.freedesktop.Sdk.Extension.golang" + ], + "finish-args" : [ + "--share=network" + ], + "command": "rove", + "modules": [ + { + "name": "rove", + "buildsystem": "simple", + "build-options": { + "env": { + "GOBIN": "/app/bin/" + }, + "build-args": [ + "--share=network" + ] + }, + "build-commands" : [ + ". /usr/lib/sdk/golang/enable.sh; make install" + ], + "sources": [ + { + "type": "dir", + "path": ".." + } + ] + } + ] +} \ No newline at end of file From abcebcebb6906bd24449b144812fc8aa97ac3763 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 23:34:49 +0100 Subject: [PATCH 283/495] Simplify - remove rove-accountant This was a fun little gRPC experiment but it's simply not needed --- Dockerfile | 1 - Makefile | 2 - cmd/rove-accountant/main.go | 134 ---- cmd/rove-server/internal/routes.go | 23 +- cmd/rove-server/internal/server.go | 36 +- cmd/rove-server/internal/server_test.go | 3 - docker-compose.yml | 17 +- .../internal => pkg/accounts}/accounts.go | 6 +- pkg/accounts/accounts.pb.go | 663 ------------------ .../accounts}/accounts_test.go | 2 +- proto/accounts/accounts.proto | 54 -- snap/snapcraft.yaml | 9 +- 12 files changed, 20 insertions(+), 930 deletions(-) delete mode 100644 cmd/rove-accountant/main.go rename {cmd/rove-accountant/internal => pkg/accounts}/accounts.go (95%) delete mode 100644 pkg/accounts/accounts.pb.go rename {cmd/rove-accountant/internal => pkg/accounts}/accounts_test.go (98%) delete mode 100644 proto/accounts/accounts.proto diff --git a/Dockerfile b/Dockerfile index 7c3e6c1..930ed91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,6 @@ RUN go mod download # Build the executables RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go -RUN go build -o rove-accountant cmd/rove-accountant/main.go RUN go build -o rove-reverse-proxy cmd/rove-reverse-proxy/main.go CMD [ "./rove-server" ] diff --git a/Makefile b/Makefile index 31d0ab3..ac45c79 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,6 @@ install: go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... gen: - @echo Generating accountant gRPC - protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/accounts/accounts.proto @echo Generating rove server gRPC protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/rove/rove.proto protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto diff --git a/cmd/rove-accountant/main.go b/cmd/rove-accountant/main.go deleted file mode 100644 index e774797..0000000 --- a/cmd/rove-accountant/main.go +++ /dev/null @@ -1,134 +0,0 @@ -package main - -import ( - "context" - "fmt" - "log" - "net" - "os" - "os/signal" - "strconv" - "sync" - "syscall" - - "github.com/mdiluz/rove/cmd/rove-accountant/internal" - "github.com/mdiluz/rove/pkg/accounts" - "github.com/mdiluz/rove/pkg/persistence" - "google.golang.org/grpc" -) - -var data = os.Getenv("DATA_PATH") - -// accountantServer is the internal object to manage the requests -type accountantServer struct { - accountant *internal.Accountant - sync sync.RWMutex -} - -// Register will register an account -func (a *accountantServer) Register(ctx context.Context, in *accounts.RegisterInfo) (*accounts.RegisterResponse, error) { - a.sync.Lock() - defer a.sync.Unlock() - - // Try and register the account itself - log.Printf("Registering account: %s\n", in.Name) - if _, err := a.accountant.RegisterAccount(in.Name); err != nil { - log.Printf("Error: %s\n", err) - return nil, err - } - - // Save out the accounts - if err := persistence.Save("accounts", a.accountant); err != nil { - log.Printf("Error: %s\n", err) - return nil, err - } - - return &accounts.RegisterResponse{}, nil -} - -// AssignData assigns a key value pair to an account -func (a *accountantServer) AssignValue(_ context.Context, in *accounts.DataKeyValue) (*accounts.DataKeyResponse, error) { - a.sync.RLock() - defer a.sync.RUnlock() - - // Try and assign the data - log.Printf("Assigning value for account %s: %s->%s\n", in.Account, in.Key, in.Value) - err := a.accountant.AssignData(in.Account, in.Key, in.Value) - if err != nil { - log.Printf("Error: %s\n", err) - return nil, err - } - - return &accounts.DataKeyResponse{}, nil - -} - -// GetData gets the value for a key -func (a *accountantServer) GetValue(_ context.Context, in *accounts.DataKey) (*accounts.DataResponse, error) { - a.sync.RLock() - defer a.sync.RUnlock() - - // Try and fetch the value - data, err := a.accountant.GetValue(in.Account, in.Key) - if err != nil { - log.Printf("Error: %s\n", err) - return nil, err - } - - return &accounts.DataResponse{Value: data}, nil - -} - -// main -func main() { - // Get the port - var iport int - var port = os.Getenv("PORT") - if len(port) == 0 { - iport = 9091 - } else { - var err error - iport, err = strconv.Atoi(port) - if err != nil { - log.Fatal("$PORT not valid int") - } - } - - persistence.SetPath(data) - - // Initialise and load the accountant - accountant := internal.NewAccountant() - if err := persistence.Load("accounts", accountant); err != nil { - log.Fatalf("failed to load account data: %s", err) - } - - // Set up the RPC server and register - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", iport)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - grpcServer := grpc.NewServer() - accounts.RegisterAccountantServer(grpcServer, &accountantServer{ - accountant: accountant, - }) - - // Set up the close handler - c := make(chan os.Signal) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - go func() { - <-c - log.Println("Quit requested, exiting...") - grpcServer.Stop() - }() - - // Serve the RPC server - log.Printf("Serving accountant on %s\n", port) - if err := grpcServer.Serve(lis); err != nil { - log.Fatalf("failed to serve gRPC: %s", err) - } - - // Save out the accountant data - if err := persistence.Save("accounts", accountant); err != nil { - log.Fatalf("failed to save accounts: %s", err) - } -} diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index f558f00..06cf054 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -4,11 +4,9 @@ import ( "context" "fmt" - "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" - "google.golang.org/grpc" ) func (s *Server) Status(context.Context, *rove.StatusRequest) (*rove.StatusResponse, error) { @@ -33,7 +31,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove return nil, fmt.Errorf("empty account name") } - if _, err := s.accountant.Register(ctx, &accounts.RegisterInfo{Name: req.Name}, grpc.WaitForReady(true)); err != nil { + if _, err := s.accountant.RegisterAccount(req.Name); err != nil { return nil, err } else if _, err := s.SpawnRoverForAccount(req.Name); err != nil { @@ -51,10 +49,10 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover if len(req.Account) == 0 { return nil, fmt.Errorf("empty account name") - } else if resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}); err != nil { - return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) + } else if resp, err := s.accountant.GetValue(req.Account, "rover"); err != nil { + return nil, err - } else if rover, err := s.world.GetRover(resp.Value); err != nil { + } else if rover, err := s.world.GetRover(resp); err != nil { return nil, fmt.Errorf("error getting rover: %s", err) } else { @@ -79,14 +77,14 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar response := &rove.RadarResponse{} - resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}) + resp, err := s.accountant.GetValue(req.Account, "rover") if err != nil { - return nil, fmt.Errorf("gRPC failed to contact accountant: %s", err) + return nil, err - } else if rover, err := s.world.GetRover(resp.Value); err != nil { + } else if rover, err := s.world.GetRover(resp); err != nil { return nil, fmt.Errorf("error getting rover attributes: %s", err) - } else if radar, err := s.world.RadarFromRover(resp.Value); err != nil { + } else if radar, err := s.world.RadarFromRover(resp); err != nil { return nil, fmt.Errorf("error getting radar from rover: %s", err) } else { @@ -101,8 +99,7 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove if len(req.Account) == 0 { return nil, fmt.Errorf("empty account") } - resp, err := s.accountant.GetValue(ctx, &accounts.DataKey{Account: req.Account, Key: "rover"}) - + resp, err := s.accountant.GetValue(req.Account, "rover") if err != nil { return nil, err } @@ -114,7 +111,7 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove Command: c.Command}) } - if err := s.world.Enqueue(resp.Value, cmds...); err != nil { + if err := s.world.Enqueue(resp, cmds...); err != nil { return nil, err } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 5aa7936..39f13d4 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -1,11 +1,9 @@ package internal import ( - "context" "fmt" "log" "net" - "os" "sync" "github.com/mdiluz/rove/pkg/accounts" @@ -30,9 +28,8 @@ type Server struct { // Internal state world *game.World - // Accountant server - accountant accounts.AccountantClient - clientConn *grpc.ClientConn + // Accountant + accountant *accounts.Accountant // gRPC server netListener net.Listener @@ -84,6 +81,7 @@ func NewServer(opts ...ServerOption) *Server { persistence: EphemeralData, schedule: cron.New(), world: game.NewWorld(32), + accountant: accounts.NewAccountant(), } // Apply all options @@ -100,18 +98,6 @@ func (s *Server) Initialise(fillWorld bool) (err error) { // Add to our sync s.sync.Add(1) - // Connect to the accountant - accountantAddress := os.Getenv("ROVE_ACCOUNTANT_GRPC") - if len(accountantAddress) == 0 { - accountantAddress = "localhost:9091" - } - log.Printf("Dialing accountant on %s\n", accountantAddress) - s.clientConn, err = grpc.Dial(accountantAddress, grpc.WithInsecure()) - if err != nil { - return err - } - s.accountant = accounts.NewAccountantClient(s.clientConn) - // Load the world file if err := s.LoadWorld(); err != nil { return err @@ -173,11 +159,6 @@ func (s *Server) Stop() error { // Stop the gRPC s.grpcServ.Stop() - // Close the accountant connection - if err := s.clientConn.Close(); err != nil { - return err - } - return nil } @@ -190,7 +171,7 @@ func (s *Server) Close() error { return s.SaveWorld() } -// Close waits until the server is finished and closes up shop +// StopAndClose waits until the server is finished and closes up shop func (s *Server) StopAndClose() error { // Stop the server if err := s.Stop(); err != nil { @@ -225,19 +206,12 @@ func (s *Server) LoadWorld() error { return nil } -// used as the type for the return struct -type BadRequestError struct { - Error string `json:"error"` -} - // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(account string) (string, error) { if inst, err := s.world.SpawnRover(); err != nil { return "", err - } else { - keyval := accounts.DataKeyValue{Account: account, Key: "rover", Value: inst} - _, err := s.accountant.AssignValue(context.Background(), &keyval) + err := s.accountant.AssignData(account, "rover", inst) if err != nil { log.Printf("Failed to assign rover to account, %s", err) diff --git a/cmd/rove-server/internal/server_test.go b/cmd/rove-server/internal/server_test.go index 1297ec2..36db679 100644 --- a/cmd/rove-server/internal/server_test.go +++ b/cmd/rove-server/internal/server_test.go @@ -1,7 +1,6 @@ package internal import ( - "os" "testing" ) @@ -31,7 +30,6 @@ func TestNewServer_OptionPersistentData(t *testing.T) { } func TestServer_Run(t *testing.T) { - os.Setenv("ROVE_ACCOUNTANT_GRPC", "n/a") server := NewServer() if server == nil { t.Error("Failed to create server") @@ -47,7 +45,6 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { - os.Setenv("ROVE_ACCOUNTANT_GRPC", "n/a") server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") diff --git a/docker-compose.yml b/docker-compose.yml index 8ecce3d..2a8466d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,18 +4,6 @@ volumes: persistent-data: services: - rove-accountant: - build: - context: . - dockerfile: Dockerfile - image: rove:latest - environment: - - PORT=9091 - - DATA_PATH=/mnt/rove-server - volumes: - - persistent-data:/mnt/rove-server:rw - command: [ ./rove-accountant ] - rove-docs: build: context: . @@ -27,7 +15,6 @@ services: - PORT=80 rove-server: - depends_on: [ rove-accountant ] build: context: . dockerfile: Dockerfile @@ -37,11 +24,10 @@ services: environment: - PORT=9090 - DATA_PATH=/mnt/rove-server - - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 - WORDS_FILE=data/words_alpha.txt volumes: - persistent-data:/mnt/rove-server:rw - command: [ "./script/wait-for-it.sh", "rove-accountant:9091", "--", "./rove-server"] + command: [ "./rove-server"] rove: depends_on: [ rove-server, rove-docs ] @@ -63,7 +49,6 @@ services: dockerfile: Dockerfile image: rove:latest environment: - - ROVE_ACCOUNTANT_GRPC=rove-accountant:9091 - ROVE_HTTP=rove - ROVE_GRPC=rove-server command: [ "./script/wait-for-it.sh", "rove:8080", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] diff --git a/cmd/rove-accountant/internal/accounts.go b/pkg/accounts/accounts.go similarity index 95% rename from cmd/rove-accountant/internal/accounts.go rename to pkg/accounts/accounts.go index 01e29dc..322b145 100644 --- a/cmd/rove-accountant/internal/accounts.go +++ b/pkg/accounts/accounts.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "fmt" @@ -16,10 +16,6 @@ type Account struct { Data map[string]string `json:"data"` } -// Represents the accountant data to store -type accountantData struct { -} - // Accountant manages a set of accounts type Accountant struct { Accounts map[string]Account `json:"accounts"` diff --git a/pkg/accounts/accounts.pb.go b/pkg/accounts/accounts.pb.go deleted file mode 100644 index ad19fae..0000000 --- a/pkg/accounts/accounts.pb.go +++ /dev/null @@ -1,663 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.23.0 -// protoc v3.6.1 -// source: accounts/accounts.proto - -package accounts - -import ( - context "context" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -// RegisterInfo contains the information needed to register an account -type RegisterInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The name for the account, must be unique - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *RegisterInfo) Reset() { - *x = RegisterInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterInfo) ProtoMessage() {} - -func (x *RegisterInfo) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterInfo.ProtoReflect.Descriptor instead. -func (*RegisterInfo) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{0} -} - -func (x *RegisterInfo) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// RegisterResponse is the response information from registering an account -type RegisterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RegisterResponse) Reset() { - *x = RegisterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterResponse) ProtoMessage() {} - -func (x *RegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. -func (*RegisterResponse) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{1} -} - -// DataKeyValue represents a simple key value pair to assign to an account -type DataKeyValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The account to assign the new key value pair to - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - // The key value pair to assign - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *DataKeyValue) Reset() { - *x = DataKeyValue{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DataKeyValue) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DataKeyValue) ProtoMessage() {} - -func (x *DataKeyValue) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DataKeyValue.ProtoReflect.Descriptor instead. -func (*DataKeyValue) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{2} -} - -func (x *DataKeyValue) GetAccount() string { - if x != nil { - return x.Account - } - return "" -} - -func (x *DataKeyValue) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *DataKeyValue) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -// DataKeyResponse is a simple response -type DataKeyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DataKeyResponse) Reset() { - *x = DataKeyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DataKeyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DataKeyResponse) ProtoMessage() {} - -func (x *DataKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DataKeyResponse.ProtoReflect.Descriptor instead. -func (*DataKeyResponse) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{3} -} - -// DataKey describes a simple key value with an account, for fetching -type DataKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The account to fetch data for - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - // The key to fetch - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` -} - -func (x *DataKey) Reset() { - *x = DataKey{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DataKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DataKey) ProtoMessage() {} - -func (x *DataKey) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DataKey.ProtoReflect.Descriptor instead. -func (*DataKey) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{4} -} - -func (x *DataKey) GetAccount() string { - if x != nil { - return x.Account - } - return "" -} - -func (x *DataKey) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -// DataResponse describes a data fetch response -type DataResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The value of the key - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *DataResponse) Reset() { - *x = DataResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_accounts_accounts_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DataResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DataResponse) ProtoMessage() {} - -func (x *DataResponse) ProtoReflect() protoreflect.Message { - mi := &file_accounts_accounts_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DataResponse.ProtoReflect.Descriptor instead. -func (*DataResponse) Descriptor() ([]byte, []int) { - return file_accounts_accounts_proto_rawDescGZIP(), []int{5} -} - -func (x *DataResponse) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -var File_accounts_accounts_proto protoreflect.FileDescriptor - -var file_accounts_accounts_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x0a, 0x0c, 0x44, - 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x11, 0x0a, - 0x0f, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x35, 0x0a, 0x07, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x24, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xcb, 0x01, - 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x1a, 0x1a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x2e, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x37, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x11, - 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4b, 0x65, - 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x25, 0x5a, 0x23, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, - 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_accounts_accounts_proto_rawDescOnce sync.Once - file_accounts_accounts_proto_rawDescData = file_accounts_accounts_proto_rawDesc -) - -func file_accounts_accounts_proto_rawDescGZIP() []byte { - file_accounts_accounts_proto_rawDescOnce.Do(func() { - file_accounts_accounts_proto_rawDescData = protoimpl.X.CompressGZIP(file_accounts_accounts_proto_rawDescData) - }) - return file_accounts_accounts_proto_rawDescData -} - -var file_accounts_accounts_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_accounts_accounts_proto_goTypes = []interface{}{ - (*RegisterInfo)(nil), // 0: accounts.RegisterInfo - (*RegisterResponse)(nil), // 1: accounts.RegisterResponse - (*DataKeyValue)(nil), // 2: accounts.DataKeyValue - (*DataKeyResponse)(nil), // 3: accounts.DataKeyResponse - (*DataKey)(nil), // 4: accounts.DataKey - (*DataResponse)(nil), // 5: accounts.DataResponse -} -var file_accounts_accounts_proto_depIdxs = []int32{ - 0, // 0: accounts.Accountant.Register:input_type -> accounts.RegisterInfo - 2, // 1: accounts.Accountant.AssignValue:input_type -> accounts.DataKeyValue - 4, // 2: accounts.Accountant.GetValue:input_type -> accounts.DataKey - 1, // 3: accounts.Accountant.Register:output_type -> accounts.RegisterResponse - 3, // 4: accounts.Accountant.AssignValue:output_type -> accounts.DataKeyResponse - 5, // 5: accounts.Accountant.GetValue:output_type -> accounts.DataResponse - 3, // [3:6] is the sub-list for method output_type - 0, // [0:3] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_accounts_accounts_proto_init() } -func file_accounts_accounts_proto_init() { - if File_accounts_accounts_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_accounts_accounts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_accounts_accounts_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_accounts_accounts_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataKeyValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_accounts_accounts_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataKeyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_accounts_accounts_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_accounts_accounts_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_accounts_accounts_proto_rawDesc, - NumEnums: 0, - NumMessages: 6, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_accounts_accounts_proto_goTypes, - DependencyIndexes: file_accounts_accounts_proto_depIdxs, - MessageInfos: file_accounts_accounts_proto_msgTypes, - }.Build() - File_accounts_accounts_proto = out.File - file_accounts_accounts_proto_rawDesc = nil - file_accounts_accounts_proto_goTypes = nil - file_accounts_accounts_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// AccountantClient is the client API for Accountant service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type AccountantClient interface { - // Register should create a new account in the database - // It will return an error if the account already exists - Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) - // AssignValue assigns a key-value pair to an account, or overwrites an existing key - AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*DataKeyResponse, error) - // GetValue will get the value for a key for an account - GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) -} - -type accountantClient struct { - cc grpc.ClientConnInterface -} - -func NewAccountantClient(cc grpc.ClientConnInterface) AccountantClient { - return &accountantClient{cc} -} - -func (c *accountantClient) Register(ctx context.Context, in *RegisterInfo, opts ...grpc.CallOption) (*RegisterResponse, error) { - out := new(RegisterResponse) - err := c.cc.Invoke(ctx, "/accounts.Accountant/Register", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *accountantClient) AssignValue(ctx context.Context, in *DataKeyValue, opts ...grpc.CallOption) (*DataKeyResponse, error) { - out := new(DataKeyResponse) - err := c.cc.Invoke(ctx, "/accounts.Accountant/AssignValue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *accountantClient) GetValue(ctx context.Context, in *DataKey, opts ...grpc.CallOption) (*DataResponse, error) { - out := new(DataResponse) - err := c.cc.Invoke(ctx, "/accounts.Accountant/GetValue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// AccountantServer is the server API for Accountant service. -type AccountantServer interface { - // Register should create a new account in the database - // It will return an error if the account already exists - Register(context.Context, *RegisterInfo) (*RegisterResponse, error) - // AssignValue assigns a key-value pair to an account, or overwrites an existing key - AssignValue(context.Context, *DataKeyValue) (*DataKeyResponse, error) - // GetValue will get the value for a key for an account - GetValue(context.Context, *DataKey) (*DataResponse, error) -} - -// UnimplementedAccountantServer can be embedded to have forward compatible implementations. -type UnimplementedAccountantServer struct { -} - -func (*UnimplementedAccountantServer) Register(context.Context, *RegisterInfo) (*RegisterResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") -} -func (*UnimplementedAccountantServer) AssignValue(context.Context, *DataKeyValue) (*DataKeyResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AssignValue not implemented") -} -func (*UnimplementedAccountantServer) GetValue(context.Context, *DataKey) (*DataResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetValue not implemented") -} - -func RegisterAccountantServer(s *grpc.Server, srv AccountantServer) { - s.RegisterService(&_Accountant_serviceDesc, srv) -} - -func _Accountant_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RegisterInfo) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AccountantServer).Register(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/accounts.Accountant/Register", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AccountantServer).Register(ctx, req.(*RegisterInfo)) - } - return interceptor(ctx, in, info, handler) -} - -func _Accountant_AssignValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DataKeyValue) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AccountantServer).AssignValue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/accounts.Accountant/AssignValue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AccountantServer).AssignValue(ctx, req.(*DataKeyValue)) - } - return interceptor(ctx, in, info, handler) -} - -func _Accountant_GetValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DataKey) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AccountantServer).GetValue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/accounts.Accountant/GetValue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AccountantServer).GetValue(ctx, req.(*DataKey)) - } - return interceptor(ctx, in, info, handler) -} - -var _Accountant_serviceDesc = grpc.ServiceDesc{ - ServiceName: "accounts.Accountant", - HandlerType: (*AccountantServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Register", - Handler: _Accountant_Register_Handler, - }, - { - MethodName: "AssignValue", - Handler: _Accountant_AssignValue_Handler, - }, - { - MethodName: "GetValue", - Handler: _Accountant_GetValue_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "accounts/accounts.proto", -} diff --git a/cmd/rove-accountant/internal/accounts_test.go b/pkg/accounts/accounts_test.go similarity index 98% rename from cmd/rove-accountant/internal/accounts_test.go rename to pkg/accounts/accounts_test.go index 8ac3315..893c57d 100644 --- a/cmd/rove-accountant/internal/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "testing" diff --git a/proto/accounts/accounts.proto b/proto/accounts/accounts.proto deleted file mode 100644 index 50f0dd6..0000000 --- a/proto/accounts/accounts.proto +++ /dev/null @@ -1,54 +0,0 @@ -syntax = "proto3"; - -option go_package = "github.com/mdiluz/rove/pkg/accounts"; - -package accounts; - -service Accountant { - // Register should create a new account in the database - // It will return an error if the account already exists - rpc Register(RegisterInfo) returns (RegisterResponse) {} - - // AssignValue assigns a key-value pair to an account, or overwrites an existing key - rpc AssignValue(DataKeyValue) returns (DataKeyResponse) {} - - // GetValue will get the value for a key for an account - rpc GetValue(DataKey) returns (DataResponse) {} -} - -// RegisterInfo contains the information needed to register an account -message RegisterInfo { - // The name for the account, must be unique - string name = 1; -} - -// RegisterResponse is the response information from registering an account -message RegisterResponse {} - -// DataKeyValue represents a simple key value pair to assign to an account -message DataKeyValue { - // The account to assign the new key value pair to - string account = 1; - - // The key value pair to assign - string key = 2; - string value = 3; -} - -// DataKeyResponse is a simple response -message DataKeyResponse {} - -// DataKey describes a simple key value with an account, for fetching -message DataKey { - // The account to fetch data for - string account = 1; - - // The key to fetch - string key = 2; -} - -// DataResponse describes a data fetch response -message DataResponse { - // The value of the key - string value = 3; -} diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 27bbb85..c9384d2 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -18,6 +18,7 @@ apps: - network environment: ROVE_USER_DATA: $SNAP_USER_DATA + rove-server: command: bin/rove-server plugs: @@ -26,13 +27,7 @@ apps: environment: WORDS_FILE : "$SNAP/data/words_alpha.txt" DATA_PATH : $SNAP_USER_DATA - rove-accountant: - command: bin/rove-accountant - plugs: - - network - - network-bind - environment: - DATA_PATH : $SNAP_USER_DATA + rove-rest-server: command: bin/rove-reverse-proxy plugs: From 204c78610305eda1e7b18628867a88b25fad30bf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 23:37:38 +0100 Subject: [PATCH 284/495] Rename rove-reverse-proxy to rove-server-rest-proxy --- Dockerfile | 2 +- cmd/{rove-reverse-proxy => rove-server-rest-proxy}/http_test.go | 0 cmd/{rove-reverse-proxy => rove-server-rest-proxy}/main.go | 0 docker-compose.yml | 2 +- snap/snapcraft.yaml | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename cmd/{rove-reverse-proxy => rove-server-rest-proxy}/http_test.go (100%) rename cmd/{rove-reverse-proxy => rove-server-rest-proxy}/main.go (100%) diff --git a/Dockerfile b/Dockerfile index 930ed91..727efa4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ RUN go mod download # Build the executables RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go -RUN go build -o rove-reverse-proxy cmd/rove-reverse-proxy/main.go +RUN go build -o rove-server-rest-proxy cmd/rove-server-rest-proxy/main.go CMD [ "./rove-server" ] diff --git a/cmd/rove-reverse-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go similarity index 100% rename from cmd/rove-reverse-proxy/http_test.go rename to cmd/rove-server-rest-proxy/http_test.go diff --git a/cmd/rove-reverse-proxy/main.go b/cmd/rove-server-rest-proxy/main.go similarity index 100% rename from cmd/rove-reverse-proxy/main.go rename to cmd/rove-server-rest-proxy/main.go diff --git a/docker-compose.yml b/docker-compose.yml index 2a8466d..96b1ecd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,7 +40,7 @@ services: environment: - PORT=8080 - ROVE_GRPC=rove-server:9090 - command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "./rove-reverse-proxy" ] + command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "./rove-server-rest-proxy" ] rove-tests: depends_on: [ rove ] diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index c9384d2..fb83f33 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -29,7 +29,7 @@ apps: DATA_PATH : $SNAP_USER_DATA rove-rest-server: - command: bin/rove-reverse-proxy + command: bin/rove-server-rest-proxy plugs: - network - network-bind From b5707ab71c6ce148f6f302f4f35ccbe43cedb441 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 30 Jun 2020 23:59:58 +0100 Subject: [PATCH 285/495] Fix all go vet issues --- cmd/rove-server/internal/routes.go | 5 + cmd/rove-server/internal/server.go | 31 ++-- cmd/rove-server/main.go | 1 + pkg/accounts/accounts.go | 12 +- pkg/atlas/atlas.go | 12 +- pkg/bearing/bearing.go | 8 + pkg/game/command.go | 6 +- pkg/game/world.go | 259 +++++++++++++++-------------- pkg/maths/maths.go | 2 +- pkg/objects/objects.go | 15 +- pkg/persistence/persistence.go | 11 +- pkg/vector/vector.go | 2 +- pkg/version/version.go | 1 + 13 files changed, 195 insertions(+), 170 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 06cf054..4fdf92c 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -9,6 +9,7 @@ import ( "github.com/mdiluz/rove/pkg/version" ) +// Status returns the status of the current server to a gRPC request func (s *Server) Status(context.Context, *rove.StatusRequest) (*rove.StatusResponse, error) { response := &rove.StatusResponse{ Ready: true, @@ -26,6 +27,7 @@ func (s *Server) Status(context.Context, *rove.StatusRequest) (*rove.StatusRespo return response, nil } +// Register registers a new account for a gRPC request func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove.RegisterResponse, error) { if len(req.Name) == 0 { return nil, fmt.Errorf("empty account name") @@ -44,6 +46,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove return &rove.RegisterResponse{}, nil } +// Rover returns rover information for a gRPC request func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.RoverResponse, error) { response := &rove.RoverResponse{} if len(req.Account) == 0 { @@ -70,6 +73,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover return response, nil } +// Radar returns the radar information for a rover func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.RadarResponse, error) { if len(req.Account) == 0 { return nil, fmt.Errorf("empty account name") @@ -95,6 +99,7 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar return response, nil } +// Commands issues commands to the world based on a gRPC request func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove.CommandsResponse, error) { if len(req.Account) == 0 { return nil, fmt.Errorf("empty account") diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 39f13d4..5f918d4 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -208,21 +208,22 @@ func (s *Server) LoadWorld() error { // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(account string) (string, error) { - if inst, err := s.world.SpawnRover(); err != nil { + inst, err := s.world.SpawnRover() + if err != nil { return "", err - } else { - err := s.accountant.AssignData(account, "rover", inst) - if err != nil { - log.Printf("Failed to assign rover to account, %s", err) - - // Try and clear up the rover - if err := s.world.DestroyRover(inst); err != nil { - log.Printf("Failed to destroy rover after failed rover assign: %s", err) - } - - return "", err - } else { - return inst, nil - } } + + err = s.accountant.AssignData(account, "rover", inst) + if err != nil { + log.Printf("Failed to assign rover to account, %s", err) + + // Try and clear up the rover + if err := s.world.DestroyRover(inst); err != nil { + log.Printf("Failed to destroy rover after failed rover assign: %s", err) + } + + return "", err + } + + return inst, nil } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index abd0a53..ef1d675 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -24,6 +24,7 @@ var data = os.Getenv("DATA_PATH") // The tick rate of the server in seconds var tick = os.Getenv("TICK_RATE") +// InnerMain is our main function so tests can run it func InnerMain() { // Ensure we've seeded rand rand.Seed(time.Now().UTC().UnixNano()) diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 322b145..3e810fa 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -5,8 +5,6 @@ import ( "time" ) -const kAccountsFileName = "rove-accounts.json" - // Account represents a registered user type Account struct { // Name simply describes the account and must be unique @@ -51,7 +49,7 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { return } -// AssignRover assigns data to an account +// AssignData assigns data to an account func (a *Accountant) AssignData(account string, key string, value string) error { // Find the account matching the ID @@ -65,12 +63,12 @@ func (a *Accountant) AssignData(account string, key string, value string) error return nil } -// GetRover gets the rover rover for the account +// GetValue gets the rover rover for the account func (a *Accountant) GetValue(account string, key string) (string, error) { // Find the account matching the ID - if this, ok := a.Accounts[account]; !ok { + this, ok := a.Accounts[account] + if !ok { return "", fmt.Errorf("no account found for id: %s", account) - } else { - return this.Data[key], nil } + return this.Data[key], nil } diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 0c692d3..f7d1fe1 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -72,15 +72,15 @@ func (a *Atlas) SetTile(v vector.Vector, tile byte) { } local := a.worldSpaceToChunkLocal(v) - tileId := local.X + local.Y*a.ChunkSize + tileID := local.X + local.Y*a.ChunkSize // Sanity check - if tileId >= len(chunk.Tiles) || tileId < 0 { + if tileID >= len(chunk.Tiles) || tileID < 0 { log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") } // Set the chunk back - chunk.Tiles[tileId] = tile + chunk.Tiles[tileID] = tile a.Chunks[c] = chunk } @@ -94,14 +94,14 @@ func (a *Atlas) GetTile(v vector.Vector) byte { } local := a.worldSpaceToChunkLocal(v) - tileId := local.X + local.Y*a.ChunkSize + tileID := local.X + local.Y*a.ChunkSize // Sanity check - if tileId >= len(chunk.Tiles) || tileId < 0 { + if tileID >= len(chunk.Tiles) || tileID < 0 { log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") } - return chunk.Tiles[tileId] + return chunk.Tiles[tileID] } // worldSpaceToChunkLocal gets a chunk local coordinate for a tile diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 6eec327..62053f2 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -11,13 +11,21 @@ import ( type Bearing int const ( + // North describes a 0,1 vector North Bearing = iota + // NorthEast describes a 1,1 vector NorthEast + // East describes a 1,0 vector East + // SouthEast describes a 1,-1 vector SouthEast + // South describes a 0,-1 vector South + // SouthWest describes a -1,-1 vector SouthWest + // West describes a -1,0 vector West + // NorthWest describes a -1,1 vector NorthWest ) diff --git a/pkg/game/command.go b/pkg/game/command.go index 2a5f875..cde071e 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -1,13 +1,13 @@ package game const ( - // Moves the rover in the chosen bearing + // CommandMove Moves the rover in the chosen bearing CommandMove = "move" - // Will attempt to stash the object at the current location + // CommandStash Will attempt to stash the object at the current location CommandStash = "stash" - // Will attempt to repair the rover with an inventory object + // CommandRepair Will attempt to repair the rover with an inventory object CommandRepair = "repair" ) diff --git a/pkg/game/world.go b/pkg/game/world.go index 6b04594..3e9128b 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -124,25 +124,26 @@ func (w *World) GetRover(rover string) (Rover, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if i, ok := w.Rovers[rover]; ok { - return i, nil - } else { + i, ok := w.Rovers[rover] + if !ok { return Rover{}, fmt.Errorf("Failed to find rover with name: %s", rover) } + return i, nil } -// Removes an rover from the game +// DestroyRover Removes an rover from the game func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[rover]; ok { - // Clear the tile - w.Atlas.SetTile(i.Pos, objects.Empty) - delete(w.Rovers, rover) - } else { + i, ok := w.Rovers[rover] + if !ok { return fmt.Errorf("no rover matching id") } + + // Clear the tile + w.Atlas.SetTile(i.Pos, objects.Empty) + delete(w.Rovers, rover) return nil } @@ -151,11 +152,11 @@ func (w *World) RoverPosition(rover string) (vector.Vector, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if i, ok := w.Rovers[rover]; ok { - return i.Pos, nil - } else { + i, ok := w.Rovers[rover] + if !ok { return vector.Vector{}, fmt.Errorf("no rover matching id") } + return i.Pos, nil } // SetRoverPosition sets the position of the rover @@ -163,13 +164,14 @@ func (w *World) SetRoverPosition(rover string, pos vector.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[rover]; ok { - i.Pos = pos - w.Rovers[rover] = i - return nil - } else { + i, ok := w.Rovers[rover] + if !ok { return fmt.Errorf("no rover matching id") } + + i.Pos = pos + w.Rovers[rover] = i + return nil } // RoverInventory returns the inventory of a requested rover @@ -177,11 +179,11 @@ func (w *World) RoverInventory(rover string) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if i, ok := w.Rovers[rover]; ok { - return i.Inventory, nil - } else { + i, ok := w.Rovers[rover] + if !ok { return nil, fmt.Errorf("no rover matching id") } + return i.Inventory, nil } // WarpRover sets an rovers position @@ -189,55 +191,55 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[rover]; ok { - // Nothing to do if these positions match - if i.Pos == pos { - return nil - } - - // Check the tile is not blocked - tile := w.Atlas.GetTile(pos) - if objects.IsBlocking(tile) { - return fmt.Errorf("can't warp rover to occupied tile, check before warping") - } - - i.Pos = pos - w.Rovers[rover] = i - return nil - } else { + i, ok := w.Rovers[rover] + if !ok { return fmt.Errorf("no rover matching id") } + // Nothing to do if these positions match + if i.Pos == pos { + return nil + } + + // Check the tile is not blocked + tile := w.Atlas.GetTile(pos) + if objects.IsBlocking(tile) { + return fmt.Errorf("can't warp rover to occupied tile, check before warping") + } + + i.Pos = pos + w.Rovers[rover] = i + return nil } -// SetPosition sets an rovers position +// MoveRover attempts to move a rover in a specific direction func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if i, ok := w.Rovers[rover]; ok { - // Try the new move position - newPos := i.Pos.Added(b.Vector()) - - // Get the tile and verify it's empty - tile := w.Atlas.GetTile(newPos) - if !objects.IsBlocking(tile) { - // Perform the move - i.Pos = newPos - w.Rovers[rover] = i - } else { - // If it is a blocking tile, reduce the rover integrity - i.Integrity = i.Integrity - 1 - if i.Integrity == 0 { - // TODO: The rover needs to be left dormant with the player - } else { - w.Rovers[rover] = i - } - } - - return i.Pos, nil - } else { + i, ok := w.Rovers[rover] + if !ok { return vector.Vector{}, fmt.Errorf("no rover matching id") } + // Try the new move position + newPos := i.Pos.Added(b.Vector()) + + // Get the tile and verify it's empty + tile := w.Atlas.GetTile(newPos) + if !objects.IsBlocking(tile) { + // Perform the move + i.Pos = newPos + w.Rovers[rover] = i + } else { + // If it is a blocking tile, reduce the rover integrity + i.Integrity = i.Integrity - 1 + if i.Integrity == 0 { + // TODO: The rover needs to be left dormant with the player + } else { + w.Rovers[rover] = i + } + } + + return i.Pos, nil } // RoverStash will stash an item at the current rovers position @@ -245,20 +247,20 @@ func (w *World) RoverStash(rover string) (byte, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - if r, ok := w.Rovers[rover]; ok { - tile := w.Atlas.GetTile(r.Pos) - if objects.IsStashable(tile) { - r.Inventory = append(r.Inventory, tile) - w.Rovers[rover] = r - w.Atlas.SetTile(r.Pos, objects.Empty) - return tile, nil - } - - } else { + r, ok := w.Rovers[rover] + if !ok { return objects.Empty, fmt.Errorf("no rover matching id") } - return objects.Empty, nil + tile := w.Atlas.GetTile(r.Pos) + if !objects.IsStashable(tile) { + return objects.Empty, nil + } + + r.Inventory = append(r.Inventory, tile) + w.Rovers[rover] = r + w.Atlas.SetTile(r.Pos, objects.Empty) + return tile, nil } // RadarFromRover can be used to query what a rover can currently see @@ -266,57 +268,58 @@ func (w *World) RadarFromRover(rover string) ([]byte, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() - if r, ok := w.Rovers[rover]; ok { - // The radar should span in range direction on each axis, plus the row/column the rover is currently on - radarSpan := (r.Range * 2) + 1 - roverPos := r.Pos - - // Get the radar min and max values - radarMin := vector.Vector{ - X: roverPos.X - r.Range, - Y: roverPos.Y - r.Range, - } - radarMax := vector.Vector{ - X: roverPos.X + r.Range, - Y: roverPos.Y + r.Range, - } - - // Gather up all tiles within the range - var radar = make([]byte, radarSpan*radarSpan) - for j := radarMin.Y; j <= radarMax.Y; j++ { - for i := radarMin.X; i <= radarMax.X; i++ { - q := vector.Vector{X: i, Y: j} - - tile := w.Atlas.GetTile(q) - - // Get the position relative to the bottom left of the radar - relative := q.Added(radarMin.Negated()) - index := relative.X + relative.Y*radarSpan - radar[index] = tile - - } - } - - // Add all rovers to the radar - for _, r := range w.Rovers { - // If the rover is in range - dist := r.Pos.Added(roverPos.Negated()) - dist = dist.Abs() - - if dist.X <= r.Range && dist.Y <= r.Range { - relative := r.Pos.Added(radarMin.Negated()) - index := relative.X + relative.Y*radarSpan - radar[index] = objects.Rover - } - } - - // Add this rover - radar[len(radar)/2] = objects.Rover - - return radar, nil - } else { + r, ok := w.Rovers[rover] + if !ok { return nil, fmt.Errorf("no rover matching id") } + + // The radar should span in range direction on each axis, plus the row/column the rover is currently on + radarSpan := (r.Range * 2) + 1 + roverPos := r.Pos + + // Get the radar min and max values + radarMin := vector.Vector{ + X: roverPos.X - r.Range, + Y: roverPos.Y - r.Range, + } + radarMax := vector.Vector{ + X: roverPos.X + r.Range, + Y: roverPos.Y + r.Range, + } + + // Gather up all tiles within the range + var radar = make([]byte, radarSpan*radarSpan) + for j := radarMin.Y; j <= radarMax.Y; j++ { + for i := radarMin.X; i <= radarMax.X; i++ { + q := vector.Vector{X: i, Y: j} + + tile := w.Atlas.GetTile(q) + + // Get the position relative to the bottom left of the radar + relative := q.Added(radarMin.Negated()) + index := relative.X + relative.Y*radarSpan + radar[index] = tile + + } + } + + // Add all rovers to the radar + for _, r := range w.Rovers { + // If the rover is in range + dist := r.Pos.Added(roverPos.Negated()) + dist = dist.Abs() + + if dist.X <= r.Range && dist.Y <= r.Range { + relative := r.Pos.Added(radarMin.Negated()) + index := relative.X + relative.Y*radarSpan + radar[index] = objects.Rover + } + } + + // Add this rover + radar[len(radar)/2] = objects.Rover + + return radar, nil } // Enqueue will queue the commands given @@ -362,7 +365,7 @@ func (w *World) EnqueueAllIncoming() { w.Incoming = make(map[string]CommandStream) } -// Execute will execute any commands in the current command queue +// ExecuteCommandQueues will execute any commands in the current command queue func (w *World) ExecuteCommandQueues() { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() @@ -408,15 +411,15 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { } case CommandRepair: - if r, err := w.GetRover(rover); err != nil { + r, err := w.GetRover(rover) + if err != nil { return err - } else { - // Consume an inventory item to repair - if len(r.Inventory) > 0 { - r.Inventory = r.Inventory[:len(r.Inventory)-1] - r.Integrity = r.Integrity + 1 - w.Rovers[rover] = r - } + } + // Consume an inventory item to repair + if len(r.Inventory) > 0 { + r.Inventory = r.Inventory[:len(r.Inventory)-1] + r.Integrity = r.Integrity + 1 + w.Rovers[rover] = r } default: return fmt.Errorf("unknown command: %s", c.Command) diff --git a/pkg/maths/maths.go b/pkg/maths/maths.go index 7e1d0fc..76c00a5 100644 --- a/pkg/maths/maths.go +++ b/pkg/maths/maths.go @@ -8,7 +8,7 @@ func Abs(x int) int { return x } -// pmod is a mositive modulo +// Pmod is a mositive modulo // golang's % is a "remainder" function si misbehaves for negative modulus inputs func Pmod(x, d int) int { if x == 0 || d == 0 { diff --git a/pkg/objects/objects.go b/pkg/objects/objects.go index 2f509c6..e553a1c 100644 --- a/pkg/objects/objects.go +++ b/pkg/objects/objects.go @@ -1,13 +1,20 @@ package objects const ( - Empty = byte(' ') - Rover = byte('R') + // Empty represents an non-existant object + Empty = byte(' ') + + // Rover represents a live rover + Rover = byte('R') + + // SmallRock is a small stashable rock SmallRock = byte('o') + + // LargeRock is a large blocking rock LargeRock = byte('O') ) -// Check if an object is a blocking object +// IsBlocking checks if an object is a blocking object func IsBlocking(object byte) bool { var blocking = [...]byte{ Rover, @@ -22,7 +29,7 @@ func IsBlocking(object byte) bool { return false } -// Check if an object is stashable +// IsStashable checks if an object is stashable func IsStashable(object byte) bool { var stashable = [...]byte{ SmallRock, diff --git a/pkg/persistence/persistence.go b/pkg/persistence/persistence.go index 8bb2e9d..fbe57b0 100644 --- a/pkg/persistence/persistence.go +++ b/pkg/persistence/persistence.go @@ -31,12 +31,13 @@ func jsonPath(name string) string { // Save will serialise the interface into a json file func Save(name string, data interface{}) error { p := jsonPath(name) - if b, err := json.MarshalIndent(data, "", " "); err != nil { + b, err := json.MarshalIndent(data, "", " ") + if err != nil { + return err + } + + if err := ioutil.WriteFile(p, b, os.ModePerm); err != nil { return err - } else { - if err := ioutil.WriteFile(p, b, os.ModePerm); err != nil { - return err - } } log.Printf("Saved %s\n", p) diff --git a/pkg/vector/vector.go b/pkg/vector/vector.go index 61efc97..b661d17 100644 --- a/pkg/vector/vector.go +++ b/pkg/vector/vector.go @@ -60,7 +60,7 @@ func Min(v1 Vector, v2 Vector) Vector { return Vector{maths.Min(v1.X, v2.X), maths.Min(v1.Y, v2.Y)} } -// Min returns the max values in both vectors +// Max returns the max values in both vectors func Max(v1 Vector, v2 Vector) Vector { return Vector{maths.Max(v1.X, v2.X), maths.Max(v1.Y, v2.Y)} } diff --git a/pkg/version/version.go b/pkg/version/version.go index b8b26bb..0daefb3 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,3 +1,4 @@ package version +// Version represents a version to be overrided with -ldflags var Version = "undefined" From 13482c189309efec5f414ab1debb778f2f562754 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 1 Jul 2020 13:19:01 +0100 Subject: [PATCH 286/495] Add a docker build action Created from workflow template --- .github/workflows/docker.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..855a4d6 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,18 @@ +name: Build and Push Docker + +on: + push: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build the Docker image + run: | + VERSION=$(git describe --always --long --dirty --tags) + docker login docker.pkg.github.com -p ${{ secrets.GITHUB_TOKEN }} + docker build . --tag rove:$VERSION --tag rove:latest + docker push docker.pkg.github.com/mdiluz/rove/rove:$VERSION + docker push docker.pkg.github.com/mdiluz/rove/rove:latest From c0726a2345d64ec878982a2d70fdcdd14be5990f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 1 Jul 2020 13:19:50 +0100 Subject: [PATCH 287/495] Rename the tests file --- .github/workflows/{docker-image.yml => tests.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{docker-image.yml => tests.yml} (97%) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/tests.yml similarity index 97% rename from .github/workflows/docker-image.yml rename to .github/workflows/tests.yml index 20dc273..04b2ba8 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: Build and Test +name: Tests on: push: From 821c83549b277c05b01e9842a286ac450e214acc Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 1 Jul 2020 13:20:11 +0100 Subject: [PATCH 288/495] Rename the docker action --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 855a4d6..f8cf0e0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,4 +1,4 @@ -name: Build and Push Docker +name: Docker on: push: From e6bfc7a8fc9b42535caddf4ed71432354738a99b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 1 Jul 2020 13:23:05 +0100 Subject: [PATCH 289/495] Set up Github docker auth --- .github/workflows/docker.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f8cf0e0..2126419 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -9,10 +9,17 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + + - name: Docker Login + uses: azure/docker-login@v1 + with: + login-server: docker.pkg.github.com + username: $GITHUB_ACTOR + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build the Docker image run: | VERSION=$(git describe --always --long --dirty --tags) - docker login docker.pkg.github.com -p ${{ secrets.GITHUB_TOKEN }} - docker build . --tag rove:$VERSION --tag rove:latest + docker build . --tag docker.pkg.github.com/mdiluz/rove/rove:$VERSION --tag docker.pkg.github.com/mdiluz/rove/rove:latest docker push docker.pkg.github.com/mdiluz/rove/rove:$VERSION docker push docker.pkg.github.com/mdiluz/rove/rove:latest From 74dcae654236b4e2e46bbe403651b941e2ab351e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 1 Jul 2020 13:46:39 +0100 Subject: [PATCH 290/495] Fix badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa4b149..562a4bf 100644 --- a/README.md +++ b/README.md @@ -9,5 +9,5 @@ See [api.go](https://github.com/mdiluz/rove/blob/master/pkg/rove/api.go) for the Build Status ------------ -![Build and Test](https://github.com/mdiluz/rove/workflows/Build%20and%20Test/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) +![Tests](https://github.com/mdiluz/rove/workflows/Tests/badge.svg) ![Docker](https://github.com/mdiluz/rove/workflows/Docker/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) From 062f9cfec8bc7cca4a60dca2bbac1e13de8da8d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 3 Jul 2020 17:00:04 +0100 Subject: [PATCH 291/495] Split Atlas chunks into tiles and objects --- cmd/rove-server-rest-proxy/http_test.go | 1 + cmd/rove-server/internal/routes.go | 10 +- pkg/atlas/atlas.go | 141 ++++++++++++++++-------- pkg/atlas/atlas_test.go | 44 +++++--- pkg/game/rover.go | 3 +- pkg/game/world.go | 62 ++++++----- pkg/game/world_test.go | 29 +++-- pkg/objects/objects.go | 31 ++++-- pkg/rove/rove.pb.go | 122 +++++++++++--------- pkg/rove/rove.swagger.json | 7 +- proto/rove/rove.proto | 3 + 11 files changed, 284 insertions(+), 169 deletions(-) diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go index 995c380..ba55fb9 100644 --- a/cmd/rove-server-rest-proxy/http_test.go +++ b/cmd/rove-server-rest-proxy/http_test.go @@ -108,6 +108,7 @@ func TestServer_Radar(t *testing.T) { assert.NotZero(t, resp.Range, "Radar should return valid range") w := int(resp.Range*2 + 1) assert.Equal(t, w*w, len(resp.Tiles), "radar should return correct number of tiles") + assert.Equal(t, w*w, len(resp.Objects), "radar should return correct number of objects") } func TestServer_Rover(t *testing.T) { diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 4fdf92c..04641bc 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -59,6 +59,11 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover return nil, fmt.Errorf("error getting rover: %s", err) } else { + var inv []byte + for _, i := range rover.Inventory { + inv = append(inv, byte(i.Type)) + } + response = &rove.RoverResponse{ Name: rover.Name, Position: &rove.Vector{ @@ -66,7 +71,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover Y: int32(rover.Pos.Y), }, Range: int32(rover.Range), - Inventory: rover.Inventory, + Inventory: inv, Integrity: int32(rover.Integrity), } } @@ -88,10 +93,11 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar } else if rover, err := s.world.GetRover(resp); err != nil { return nil, fmt.Errorf("error getting rover attributes: %s", err) - } else if radar, err := s.world.RadarFromRover(resp); err != nil { + } else if radar, objs, err := s.world.RadarFromRover(resp); err != nil { return nil, fmt.Errorf("error getting radar from rover: %s", err) } else { + response.Objects = objs response.Tiles = radar response.Range = int32(rover.Range) } diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index f7d1fe1..40969e1 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,7 +1,6 @@ package atlas import ( - "log" "math/rand" "github.com/mdiluz/rove/pkg/maths" @@ -9,27 +8,28 @@ import ( "github.com/mdiluz/rove/pkg/vector" ) +// Tile describes the type of terrain +type Tile byte + +const ( + // TileNone is a keyword for nothing + TileNone = Tile(0) + + // TileRock is solid rock ground + TileRock = Tile('.') + + // TileSand is sand + TileSand = Tile(',') +) + // Chunk represents a fixed square grid of tiles type Chunk struct { // Tiles represents the tiles within the chunk Tiles []byte `json:"tiles"` -} -// SpawnContent will create a chunk and fill it with spawned tiles -func (c *Chunk) SpawnContent(size int) { - c.Tiles = make([]byte, size*size) - for i := 0; i < len(c.Tiles); i++ { - c.Tiles[i] = objects.Empty - } - - // For now, fill it randomly with objects - for i := range c.Tiles { - if rand.Intn(16) == 0 { - c.Tiles[i] = objects.LargeRock - } else if rand.Intn(32) == 0 { - c.Tiles[i] = objects.SmallRock - } - } + // Objects represents the objects within the chunk + // only one possible object per tile for now + Objects map[int]objects.Object `json:"objects"` } // Atlas represents a grid of Chunks @@ -58,50 +58,101 @@ func NewAtlas(chunkSize int) Atlas { WorldOrigin: vector.Vector{X: 0, Y: 0}, } // Initialise the first chunk - a.Chunks[0].SpawnContent(chunkSize) + a.Chunks[0].populate(chunkSize) return a } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v vector.Vector, tile byte) { - // Get the chunk +func (a *Atlas) SetTile(v vector.Vector, tile Tile) { c := a.worldSpaceToChunkWithGrow(v) - chunk := a.Chunks[c] - if chunk.Tiles == nil { - chunk.SpawnContent(a.ChunkSize) - } - local := a.worldSpaceToChunkLocal(v) - tileID := local.X + local.Y*a.ChunkSize - - // Sanity check - if tileID >= len(chunk.Tiles) || tileID < 0 { - log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") - } - - // Set the chunk back - chunk.Tiles[tileID] = tile - a.Chunks[c] = chunk + a.setTile(c, local, byte(tile)) } -// GetTile will return an individual tile -func (a *Atlas) GetTile(v vector.Vector) byte { - // Get the chunk +// SetObject sets the object on a tile +func (a *Atlas) SetObject(v vector.Vector, obj objects.Object) { c := a.worldSpaceToChunkWithGrow(v) + local := a.worldSpaceToChunkLocal(v) + a.setObject(c, local, obj) +} + +// QueryPosition will return information for a specific position +func (a *Atlas) QueryPosition(v vector.Vector) (byte, objects.Object) { + c := a.worldSpaceToChunkWithGrow(v) + local := a.worldSpaceToChunkLocal(v) chunk := a.Chunks[c] if chunk.Tiles == nil { - chunk.SpawnContent(a.ChunkSize) + chunk.populate(a.ChunkSize) + } + i := a.chunkTileIndex(local) + return chunk.Tiles[i], chunk.Objects[i] +} + +// chunkTileID returns the tile index within a chunk +func (a *Atlas) chunkTileIndex(local vector.Vector) int { + return local.X + local.Y*a.ChunkSize +} + +// populate will fill a chunk with data +func (c *Chunk) populate(size int) { + c.Tiles = make([]byte, size*size) + c.Objects = make(map[int]objects.Object) + + // Set up the tiles + for i := 0; i < len(c.Tiles); i++ { + if rand.Intn(3) == 0 { + c.Tiles[i] = byte(TileRock) + } else { + c.Tiles[i] = byte(TileSand) + } } - local := a.worldSpaceToChunkLocal(v) - tileID := local.X + local.Y*a.ChunkSize + // Set up any objects + for i := 0; i < len(c.Tiles); i++ { + if rand.Intn(16) == 0 { + c.Objects[i] = objects.Object{Type: objects.LargeRock} + } + } +} - // Sanity check - if tileID >= len(chunk.Tiles) || tileID < 0 { - log.Fatalf("Local tileID is not in valid chunk, somehow, this means something is very wrong") +// setTile sets a tile in a specific chunk +func (a *Atlas) setTile(chunk int, local vector.Vector, tile byte) { + c := a.Chunks[chunk] + if c.Tiles == nil { + c.populate(a.ChunkSize) } - return chunk.Tiles[tileID] + c.Tiles[a.chunkTileIndex(local)] = tile + a.Chunks[chunk] = c +} + +// setObject sets an object in a specific chunk +func (a *Atlas) setObject(chunk int, local vector.Vector, object objects.Object) { + c := a.Chunks[chunk] + if c.Tiles == nil { + c.populate(a.ChunkSize) + } + + i := a.chunkTileIndex(local) + if object.Type != objects.None { + c.Objects[i] = object + } else { + delete(c.Objects, i) + } + a.Chunks[chunk] = c +} + +// setTileAndObject sets both tile and object information for location in chunk +func (a *Atlas) setTileAndObject(chunk int, local vector.Vector, tile byte, object objects.Object) { + c := a.Chunks[chunk] + if c.Tiles == nil { + c.populate(a.ChunkSize) + } + + i := a.chunkTileIndex(local) + c.Tiles[i] = tile + c.Objects[i] = object + a.Chunks[chunk] = c } // worldSpaceToChunkLocal gets a chunk local coordinate for a tile diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index ae5c705..9778150 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -3,6 +3,7 @@ package atlas import ( "testing" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -19,8 +20,8 @@ func TestAtlas_toChunk(t *testing.T) { assert.NotNil(t, a) // Get a tile to spawn the chunks - a.GetTile(vector.Vector{X: -1, Y: -1}) - a.GetTile(vector.Vector{X: 0, Y: 0}) + a.QueryPosition(vector.Vector{X: -1, Y: -1}) + a.QueryPosition(vector.Vector{X: 0, Y: 0}) // Chunks should look like: // 2 | 3 @@ -38,8 +39,8 @@ func TestAtlas_toChunk(t *testing.T) { a = NewAtlas(2) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.GetTile(vector.Vector{X: -2, Y: -2}) - a.GetTile(vector.Vector{X: 1, Y: 1}) + a.QueryPosition(vector.Vector{X: -2, Y: -2}) + a.QueryPosition(vector.Vector{X: 1, Y: 1}) // Chunks should look like: // 2 | 3 // ----- @@ -56,8 +57,8 @@ func TestAtlas_toChunk(t *testing.T) { a = NewAtlas(2) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.GetTile(vector.Vector{X: 5, Y: 5}) - a.GetTile(vector.Vector{X: -5, Y: -5}) + a.QueryPosition(vector.Vector{X: 5, Y: 5}) + a.QueryPosition(vector.Vector{X: -5, Y: -5}) // Chunks should look like: // 12| 13|| 14| 15 // ---------------- @@ -82,15 +83,30 @@ func TestAtlas_GetSetTile(t *testing.T) { // Set the origin tile to 1 and test it a.SetTile(vector.Vector{X: 0, Y: 0}, 1) - tile := a.GetTile(vector.Vector{X: 0, Y: 0}) + tile, _ := a.QueryPosition(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) // Set another tile to 1 and test it a.SetTile(vector.Vector{X: 5, Y: -2}, 2) - tile = a.GetTile(vector.Vector{X: 5, Y: -2}) + tile, _ = a.QueryPosition(vector.Vector{X: 5, Y: -2}) assert.Equal(t, byte(2), tile) } +func TestAtlas_GetSetObject(t *testing.T) { + a := NewAtlas(10) + assert.NotNil(t, a) + + // Set the origin tile to 1 and test it + a.SetObject(vector.Vector{X: 0, Y: 0}, objects.Object{Type: objects.LargeRock}) + _, obj := a.QueryPosition(vector.Vector{X: 0, Y: 0}) + assert.Equal(t, objects.Object{Type: objects.LargeRock}, obj) + + // Set another tile to 1 and test it + a.SetObject(vector.Vector{X: 5, Y: -2}, objects.Object{Type: objects.SmallRock}) + _, obj = a.QueryPosition(vector.Vector{X: 5, Y: -2}) + assert.Equal(t, objects.Object{Type: objects.SmallRock}, obj) +} + func TestAtlas_Grown(t *testing.T) { // Start with a small example a := NewAtlas(2) @@ -103,21 +119,21 @@ func TestAtlas_Grown(t *testing.T) { a.SetTile(vector.Vector{X: 1, Y: -2}, 3) // Check tile values - tile := a.GetTile(vector.Vector{X: 0, Y: 0}) + tile, _ := a.QueryPosition(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile = a.GetTile(vector.Vector{X: -1, Y: -1}) + tile, _ = a.QueryPosition(vector.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile = a.GetTile(vector.Vector{X: 1, Y: -2}) + tile, _ = a.QueryPosition(vector.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) - tile = a.GetTile(vector.Vector{X: 0, Y: 0}) + tile, _ = a.QueryPosition(vector.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile = a.GetTile(vector.Vector{X: -1, Y: -1}) + tile, _ = a.QueryPosition(vector.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile = a.GetTile(vector.Vector{X: 1, Y: -2}) + tile, _ = a.QueryPosition(vector.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) } diff --git a/pkg/game/rover.go b/pkg/game/rover.go index e315363..1779e63 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -1,6 +1,7 @@ package game import ( + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -16,7 +17,7 @@ type Rover struct { Range int `json:"range"` // Inventory represents any items the rover is carrying - Inventory []byte `json:"inventory"` + Inventory []objects.Object `json:"inventory"` // Integrity represents current rover health Integrity int `json:"integrity"` diff --git a/pkg/game/world.go b/pkg/game/world.go index 3e9128b..59d004d 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -101,8 +101,8 @@ func (w *World) SpawnRover() (string, error) { // Seach until we error (run out of world) for { - tile := w.Atlas.GetTile(rover.Pos) - if !objects.IsBlocking(tile) { + _, obj := w.Atlas.QueryPosition(rover.Pos) + if !obj.IsBlocking() { break } else { // Try and spawn to the east of the blockage @@ -136,13 +136,11 @@ func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() - i, ok := w.Rovers[rover] + _, ok := w.Rovers[rover] if !ok { return fmt.Errorf("no rover matching id") } - // Clear the tile - w.Atlas.SetTile(i.Pos, objects.Empty) delete(w.Rovers, rover) return nil } @@ -175,7 +173,7 @@ func (w *World) SetRoverPosition(rover string, pos vector.Vector) error { } // RoverInventory returns the inventory of a requested rover -func (w *World) RoverInventory(rover string) ([]byte, error) { +func (w *World) RoverInventory(rover string) ([]objects.Object, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -201,8 +199,8 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { } // Check the tile is not blocked - tile := w.Atlas.GetTile(pos) - if objects.IsBlocking(tile) { + _, obj := w.Atlas.QueryPosition(pos) + if obj.IsBlocking() { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } @@ -224,8 +222,8 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error newPos := i.Pos.Added(b.Vector()) // Get the tile and verify it's empty - tile := w.Atlas.GetTile(newPos) - if !objects.IsBlocking(tile) { + _, obj := w.Atlas.QueryPosition(newPos) + if !obj.IsBlocking() { // Perform the move i.Pos = newPos w.Rovers[rover] = i @@ -243,34 +241,35 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error } // RoverStash will stash an item at the current rovers position -func (w *World) RoverStash(rover string) (byte, error) { +func (w *World) RoverStash(rover string) (objects.Type, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() r, ok := w.Rovers[rover] if !ok { - return objects.Empty, fmt.Errorf("no rover matching id") + return objects.None, fmt.Errorf("no rover matching id") } - tile := w.Atlas.GetTile(r.Pos) - if !objects.IsStashable(tile) { - return objects.Empty, nil + _, obj := w.Atlas.QueryPosition(r.Pos) + if !obj.IsStashable() { + return objects.None, nil } - r.Inventory = append(r.Inventory, tile) + r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r - w.Atlas.SetTile(r.Pos, objects.Empty) - return tile, nil + w.Atlas.SetObject(r.Pos, objects.Object{Type: objects.None}) + return obj.Type, nil } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(rover string) ([]byte, error) { +func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() r, ok := w.Rovers[rover] if !ok { - return nil, fmt.Errorf("no rover matching id") + err = fmt.Errorf("no rover matching id") + return } // The radar should span in range direction on each axis, plus the row/column the rover is currently on @@ -288,18 +287,19 @@ func (w *World) RadarFromRover(rover string) ([]byte, error) { } // Gather up all tiles within the range - var radar = make([]byte, radarSpan*radarSpan) + radar = make([]byte, radarSpan*radarSpan) + objs = make([]byte, radarSpan*radarSpan) for j := radarMin.Y; j <= radarMax.Y; j++ { for i := radarMin.X; i <= radarMax.X; i++ { q := vector.Vector{X: i, Y: j} - tile := w.Atlas.GetTile(q) + tile, obj := w.Atlas.QueryPosition(q) // Get the position relative to the bottom left of the radar relative := q.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan radar[index] = tile - + objs[index] = byte(obj.Type) } } @@ -312,14 +312,11 @@ func (w *World) RadarFromRover(rover string) ([]byte, error) { if dist.X <= r.Range && dist.Y <= r.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - radar[index] = objects.Rover + objs[index] = byte(objects.Rover) } } - // Add this rover - radar[len(radar)/2] = objects.Rover - - return radar, nil + return radar, objs, nil } // Enqueue will queue the commands given @@ -433,7 +430,14 @@ func PrintTiles(tiles []byte) { num := int(math.Sqrt(float64(len(tiles)))) for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { - fmt.Printf("%c", tiles[i+num*j]) + + t := tiles[i+num*j] + if t != 0 { + fmt.Printf("%c", t) + } else { + fmt.Printf(" ") + } + } fmt.Print("\n") } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index ceda417..80ca5f9 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,6 +3,7 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" @@ -84,7 +85,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover - world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, objects.LargeRock) + world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") } @@ -102,14 +103,15 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0}), "Failed to warp rover") - radar, err := world.RadarFromRover(a) + radar, objs, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") fullRange := 4 + 4 + 1 assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong length") + assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") // Test the expected values - assert.Equal(t, objects.Rover, radar[1+fullRange]) - assert.Equal(t, objects.Rover, radar[4+4*fullRange]) + assert.Equal(t, byte(objects.Rover), objs[1+fullRange]) + assert.Equal(t, byte(objects.Rover), objs[4+4*fullRange]) } func TestWorld_RoverStash(t *testing.T) { @@ -125,18 +127,20 @@ func TestWorld_RoverStash(t *testing.T) { err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - world.Atlas.SetTile(pos, objects.SmallRock) + // Set to a traversible tile + world.Atlas.SetTile(pos, atlas.TileRock) + world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - tile := world.Atlas.GetTile(pos) - assert.Equal(t, objects.Empty, tile, "Stash failed to remove object from atlas") + _, obj := world.Atlas.QueryPosition(pos) + assert.Equal(t, objects.None, obj.Type, "Stash failed to remove object from atlas") inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, objects.SmallRock, inv[0]) + assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[0]) } func TestWorld_RoverDamage(t *testing.T) { @@ -155,7 +159,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) + world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") @@ -176,19 +180,22 @@ func TestWorld_RoverRepair(t *testing.T) { Y: 0.0, } + world.Atlas.SetTile(pos, atlas.TileNone) + world.Atlas.SetObject(pos, objects.Object{Type: objects.None}) + err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") originalInfo, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetTile(pos, objects.SmallRock) + world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - world.Atlas.SetTile(vector.Vector{X: 0.0, Y: 1.0}, objects.LargeRock) + world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") diff --git a/pkg/objects/objects.go b/pkg/objects/objects.go index e553a1c..126d0d1 100644 --- a/pkg/objects/objects.go +++ b/pkg/objects/objects.go @@ -1,28 +1,37 @@ package objects +// Type represents an object type +type Type byte + +// Types of objects const ( - // Empty represents an non-existant object - Empty = byte(' ') + // None represents no object at all + None = Type(0) // Rover represents a live rover - Rover = byte('R') + Rover = Type('R') // SmallRock is a small stashable rock - SmallRock = byte('o') + SmallRock = Type('o') // LargeRock is a large blocking rock - LargeRock = byte('O') + LargeRock = Type('o') ) +// Object represents an object in the world +type Object struct { + Type Type `json:"type"` +} + // IsBlocking checks if an object is a blocking object -func IsBlocking(object byte) bool { - var blocking = [...]byte{ +func (o *Object) IsBlocking() bool { + var blocking = [...]Type{ Rover, LargeRock, } for _, t := range blocking { - if object == t { + if o.Type == t { return true } } @@ -30,13 +39,13 @@ func IsBlocking(object byte) bool { } // IsStashable checks if an object is stashable -func IsStashable(object byte) bool { - var stashable = [...]byte{ +func (o *Object) IsStashable() bool { + var stashable = [...]Type{ SmallRock, } for _, t := range stashable { - if object == t { + if o.Type == t { return true } } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index faf1b9f..6db8b38 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -42,6 +42,7 @@ type Command struct { // The command to execute // "move" - Move the rover in a direction, requires bearing // "stash" - Stashes item at current location in rover inventory + // "repair" - Repairs the rover using an inventory object Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` // The bearing, example: NE Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` @@ -294,6 +295,8 @@ type RadarResponse struct { Range int32 `protobuf:"varint,1,opt,name=range,proto3" json:"range,omitempty"` // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` + // A similar array to the tile array, but containing objects + Objects []byte `protobuf:"bytes,3,opt,name=objects,proto3" json:"objects,omitempty"` } func (x *RadarResponse) Reset() { @@ -342,6 +345,13 @@ func (x *RadarResponse) GetTiles() []byte { return nil } +func (x *RadarResponse) GetObjects() []byte { + if x != nil { + return x.Objects + } + return nil +} + // Empty placeholder type RegisterResponse struct { state protoimpl.MessageState @@ -751,64 +761,66 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x0d, 0x52, 0x61, 0x64, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x0d, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, - 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, - 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, - 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, + 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, + 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, + 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, + 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, + 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, + 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, + 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 3325d41..4362794 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -212,7 +212,7 @@ "properties": { "command": { "type": "string", - "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory" + "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object" }, "bearing": { "type": "string", @@ -261,6 +261,11 @@ "type": "string", "format": "byte", "title": "A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row-\u003ecolumn order" + }, + "objects": { + "type": "string", + "format": "byte", + "title": "A similar array to the tile array, but containing objects" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index f1c6c3d..41a4475 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -98,6 +98,9 @@ message RadarResponse { // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order bytes tiles = 2; + + // A similar array to the tile array, but containing objects + bytes objects = 3; } // Empty placeholder From c4b0762ebec8ac8a08e1769749c0a0c334ddb9d6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 3 Jul 2020 17:05:31 +0100 Subject: [PATCH 292/495] Fix up the tile print now that the radar returns objects --- cmd/rove/main.go | 21 ++++++++++++++++++++- pkg/game/world.go | 19 ------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 398feb9..17e35aa 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -4,13 +4,16 @@ import ( "encoding/json" "fmt" "io/ioutil" + "math" "os" "path" "path/filepath" "time" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/game" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" "golang.org/x/net/context" @@ -253,8 +256,24 @@ func InnerMain(command string, args ...string) error { return err default: + // Print out the radar - game.PrintTiles(response.Tiles) + num := int(math.Sqrt(float64(len(response.Tiles)))) + for j := num - 1; j >= 0; j-- { + for i := 0; i < num; i++ { + t := response.Tiles[i+num*j] + o := response.Objects[i+num*j] + if o != byte(objects.None) { + fmt.Printf("%c", o) + } else if t != byte(atlas.TileNone) { + fmt.Printf("%c", t) + } else { + fmt.Printf(" ") + } + + } + fmt.Print("\n") + } } case "rover": diff --git a/pkg/game/world.go b/pkg/game/world.go index 59d004d..a0809ed 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -4,7 +4,6 @@ import ( "bufio" "fmt" "log" - "math" "math/rand" "os" "sync" @@ -425,24 +424,6 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { return } -// PrintTiles simply prints the input tiles directly for debug -func PrintTiles(tiles []byte) { - num := int(math.Sqrt(float64(len(tiles)))) - for j := num - 1; j >= 0; j-- { - for i := 0; i < num; i++ { - - t := tiles[i+num*j] - if t != 0 { - fmt.Printf("%c", t) - } else { - fmt.Printf(" ") - } - - } - fmt.Print("\n") - } -} - // RLock read locks the world func (w *World) RLock() { w.worldMutex.RLock() From 1a1ef9a3764bfa1463a805282289954cbcc1b3f0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 3 Jul 2020 17:06:28 +0100 Subject: [PATCH 293/495] go mod tidy and update --- go.mod | 17 +++++++++------- go.sum | 64 +++++++++++++++++++++++++++++++--------------------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index e21de42..2165ade 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,19 @@ module github.com/mdiluz/rove go 1.14 require ( - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/grpc-ecosystem/grpc-gateway v1.14.6 - github.com/onsi/ginkgo v1.12.3 // indirect + github.com/kr/pretty v0.1.0 // indirect github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 - github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d - golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 - google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884 - google.golang.org/grpc v1.29.1 - google.golang.org/protobuf v1.23.0 + golang.org/x/net v0.0.0-20200602114024-627f9648deb9 + golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 // indirect + golang.org/x/text v0.3.3 // indirect + google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 + google.golang.org/grpc v1.30.0 + google.golang.org/protobuf v1.25.0 + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/yaml.v2 v2.3.0 // indirect ) diff --git a/go.sum b/go.sum index 57044e0..029b75f 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,23 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -27,6 +31,7 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -34,20 +39,17 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.12.3 h1:+RYp9QczoWz9zfUyLP/5SLXQVhfr6gZOoKGfQqHuLZQ= -github.com/onsi/ginkgo v1.12.3/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -57,8 +59,6 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d h1:b7oHBI6TgTdCDuqTijsVldzlh+6cfQpdYLz1EKtCAoY= -github.com/tjarratt/babble v0.0.0-20191209142150-eecdf8c2339d/go.mod h1:O5hBrCGqzfb+8WyY8ico2AyQau7XQwAfEQeEQ5/5V9E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -66,34 +66,31 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -109,29 +106,36 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2El google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884 h1:fiNLklpBwWK1mth30Hlwk+fcdBmIALlgF5iy77O37Ig= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 9cd5324465ce591325d7507a539d68acb30bd8e8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 3 Jul 2020 17:13:52 +0100 Subject: [PATCH 294/495] Fix small and large rock spawning --- pkg/atlas/atlas.go | 2 ++ pkg/objects/objects.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 40969e1..6ec11e2 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -111,6 +111,8 @@ func (c *Chunk) populate(size int) { for i := 0; i < len(c.Tiles); i++ { if rand.Intn(16) == 0 { c.Objects[i] = objects.Object{Type: objects.LargeRock} + } else if rand.Intn(32) == 0 { + c.Objects[i] = objects.Object{Type: objects.SmallRock} } } } diff --git a/pkg/objects/objects.go b/pkg/objects/objects.go index 126d0d1..9338b68 100644 --- a/pkg/objects/objects.go +++ b/pkg/objects/objects.go @@ -15,7 +15,7 @@ const ( SmallRock = Type('o') // LargeRock is a large blocking rock - LargeRock = Type('o') + LargeRock = Type('O') ) // Object represents an object in the world From e6ff453ff1ee39a735982b45d54f0e1388b9cd00 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 12:25:57 +0100 Subject: [PATCH 295/495] Add note for intelligent world-gen --- docs/status.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/status.md b/docs/status.md index bf3fea2..951abc1 100644 --- a/docs/status.md +++ b/docs/status.md @@ -24,6 +24,7 @@ This page tracks the current feature set and the features to implement next * Day/night cycle * More hazards * Simple rover to rover communication +* Deterministic and intelligent world-gen ### Stretch goals From 2eaed1447d19b9ace55d7cc4102d82d7f3ae8ad1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 12:01:35 +0100 Subject: [PATCH 296/495] Add rover inventory capacity and test --- cmd/rove-server/internal/routes.go | 1 + pkg/game/rover.go | 3 + pkg/game/world.go | 6 ++ pkg/game/world_test.go | 34 ++++++++++- pkg/rove/rove.pb.go | 95 +++++++++++++++++------------- pkg/rove/rove.swagger.json | 7 ++- proto/rove/rove.proto | 5 +- 7 files changed, 104 insertions(+), 47 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 04641bc..ae98dfd 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -72,6 +72,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover }, Range: int32(rover.Range), Inventory: inv, + Capacity: int32(rover.Capacity), Integrity: int32(rover.Integrity), } } diff --git a/pkg/game/rover.go b/pkg/game/rover.go index 1779e63..f6e4f25 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -19,6 +19,9 @@ type Rover struct { // Inventory represents any items the rover is carrying Inventory []objects.Object `json:"inventory"` + // Capacity is the maximum number of inventory items + Capacity int `json:"capacity"` + // Integrity represents current rover health Integrity int `json:"integrity"` } diff --git a/pkg/game/world.go b/pkg/game/world.go index a0809ed..2e268e9 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -77,6 +77,7 @@ func (w *World) SpawnRover() (string, error) { rover := Rover{ Range: 4.0, Integrity: 10, + Capacity: 10, Name: uuid.New().String(), } @@ -249,6 +250,11 @@ func (w *World) RoverStash(rover string) (objects.Type, error) { return objects.None, fmt.Errorf("no rover matching id") } + // Can't pick up when full + if len(r.Inventory) >= r.Capacity { + return objects.None, nil + } + _, obj := w.Atlas.QueryPosition(r.Pos) if !obj.IsStashable() { return objects.None, nil diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 80ca5f9..4803769 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -129,18 +129,46 @@ func TestWorld_RoverStash(t *testing.T) { // Set to a traversible tile world.Atlas.SetTile(pos, atlas.TileRock) + + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover") + + for i := 0; i < rover.Capacity; i++ { + // Place an object + world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + + // Pick it up + o, err := world.RoverStash(a) + assert.NoError(t, err, "Failed to stash") + assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + + // Check it's gone + _, obj := world.Atlas.QueryPosition(pos) + assert.Equal(t, objects.None, obj.Type, "Stash failed to remove object from atlas") + + // Check we have it + inv, err := world.RoverInventory(a) + assert.NoError(t, err, "Failed to get inventory") + assert.Equal(t, i+1, len(inv)) + assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) + } + + // Place an object world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + // Try to pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + assert.Equal(t, objects.None, o, "Failed to get correct object") + // Check it's still there _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, objects.None, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, objects.SmallRock, obj.Type, "Stash failed to remove object from atlas") + // Check we don't have it inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[0]) + assert.Equal(t, rover.Capacity, len(inv)) } func TestWorld_RoverDamage(t *testing.T) { diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 6db8b38..6b3f7dc 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -500,8 +500,10 @@ type RoverResponse struct { Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` // The items in the rover inventory Inventory []byte `protobuf:"bytes,4,opt,name=inventory,proto3" json:"inventory,omitempty"` + // The capacity of the inventory + Capacity int32 `protobuf:"varint,5,opt,name=capacity,proto3" json:"capacity,omitempty"` // The current health of the rover - Integrity int32 `protobuf:"varint,5,opt,name=Integrity,proto3" json:"Integrity,omitempty"` + Integrity int32 `protobuf:"varint,6,opt,name=integrity,proto3" json:"integrity,omitempty"` } func (x *RoverResponse) Reset() { @@ -564,6 +566,13 @@ func (x *RoverResponse) GetInventory() []byte { return nil } +func (x *RoverResponse) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + func (x *RoverResponse) GetIntegrity() int32 { if x != nil { return x.Integrity @@ -773,7 +782,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, @@ -781,46 +790,48 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, - 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, - 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, - 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, - 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, - 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, - 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, - 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, + 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, + 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, + 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, + 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, + 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, + 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 4362794..531769f 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -312,7 +312,12 @@ "format": "byte", "title": "The items in the rover inventory" }, - "Integrity": { + "capacity": { + "type": "integer", + "format": "int32", + "title": "The capacity of the inventory" + }, + "integrity": { "type": "integer", "format": "int32", "title": "The current health of the rover" diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 41a4475..63d8157 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -129,8 +129,11 @@ message RoverResponse { // The items in the rover inventory bytes inventory = 4; + // The capacity of the inventory + int32 capacity = 5; + // The current health of the rover - int32 Integrity = 5; + int32 integrity = 6; } // Empty placeholder From b066277ddf0d91d3a9bce1f833d6036b9d77e17a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 12:19:51 +0100 Subject: [PATCH 297/495] Add MaximumIntegrity to the rover --- cmd/rove-server/internal/routes.go | 9 +-- pkg/game/rover.go | 3 + pkg/game/world.go | 13 +++-- pkg/game/world_test.go | 16 +++++- pkg/rove/rove.pb.go | 89 +++++++++++++++++------------- pkg/rove/rove.swagger.json | 5 ++ proto/rove/rove.proto | 3 + 7 files changed, 88 insertions(+), 50 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index ae98dfd..4a40290 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -70,10 +70,11 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover X: int32(rover.Pos.X), Y: int32(rover.Pos.Y), }, - Range: int32(rover.Range), - Inventory: inv, - Capacity: int32(rover.Capacity), - Integrity: int32(rover.Integrity), + Range: int32(rover.Range), + Inventory: inv, + Capacity: int32(rover.Capacity), + Integrity: int32(rover.Integrity), + MaximumIntegrity: int32(rover.MaximumIntegrity), } } return response, nil diff --git a/pkg/game/rover.go b/pkg/game/rover.go index f6e4f25..b0f5dca 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -24,4 +24,7 @@ type Rover struct { // Integrity represents current rover health Integrity int `json:"integrity"` + + // MaximumIntegrity is the full integrity of the rover + MaximumIntegrity int `json:"maximum-integrity"` } diff --git a/pkg/game/world.go b/pkg/game/world.go index 2e268e9..c0ff212 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -75,10 +75,11 @@ func (w *World) SpawnRover() (string, error) { // Initialise the rover rover := Rover{ - Range: 4.0, - Integrity: 10, - Capacity: 10, - Name: uuid.New().String(), + Range: 4.0, + Integrity: 10, + MaximumIntegrity: 10, + Capacity: 10, + Name: uuid.New().String(), } // Assign a random name if we have words @@ -417,8 +418,8 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { if err != nil { return err } - // Consume an inventory item to repair - if len(r.Inventory) > 0 { + // Consume an inventory item to repair if possible + if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { r.Inventory = r.Inventory[:len(r.Inventory)-1] r.Integrity = r.Integrity + 1 w.Rovers[rover] = r diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 4803769..4ee0676 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -217,14 +217,15 @@ func TestWorld_RoverRepair(t *testing.T) { originalInfo, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") + // Pick up something to repair with world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) - o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) + // Try and bump into the rock vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -239,4 +240,17 @@ func TestWorld_RoverRepair(t *testing.T) { newinfo, err = world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") + + // Check again that it can't repair past the max + world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + o, err = world.RoverStash(a) + assert.NoError(t, err, "Failed to stash") + assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + + err = world.ExecuteCommand(&Command{Command: CommandRepair}, a) + assert.NoError(t, err, "Failed to repair rover") + + newinfo, err = world.GetRover(a) + assert.NoError(t, err, "couldn't get rover info") + assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 6b3f7dc..733854c 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -504,6 +504,8 @@ type RoverResponse struct { Capacity int32 `protobuf:"varint,5,opt,name=capacity,proto3" json:"capacity,omitempty"` // The current health of the rover Integrity int32 `protobuf:"varint,6,opt,name=integrity,proto3" json:"integrity,omitempty"` + // The maximum health of the rover + MaximumIntegrity int32 `protobuf:"varint,7,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` } func (x *RoverResponse) Reset() { @@ -580,6 +582,13 @@ func (x *RoverResponse) GetIntegrity() int32 { return 0 } +func (x *RoverResponse) GetMaximumIntegrity() int32 { + if x != nil { + return x.MaximumIntegrity + } + return 0 +} + // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -782,7 +791,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe7, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, @@ -794,44 +803,46 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, - 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, - 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, - 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, - 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, - 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, - 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, + 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, + 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, + 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 531769f..04a29d7 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -321,6 +321,11 @@ "type": "integer", "format": "int32", "title": "The current health of the rover" + }, + "maximumIntegrity": { + "type": "integer", + "format": "int32", + "title": "The maximum health of the rover" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 63d8157..38cd995 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -134,6 +134,9 @@ message RoverResponse { // The current health of the rover int32 integrity = 6; + + // The maximum health of the rover + int32 maximumIntegrity = 7; } // Empty placeholder From 143fba505e57543bced10155a4cc2d0417f12a4f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 12:25:15 +0100 Subject: [PATCH 298/495] Add Charge and Max Charge attributes to the rover --- cmd/rove-server/internal/routes.go | 2 + pkg/game/rover.go | 6 ++ pkg/rove/rove.pb.go | 100 ++++++++++++++++++----------- pkg/rove/rove.swagger.json | 10 +++ proto/rove/rove.proto | 6 ++ 5 files changed, 85 insertions(+), 39 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 4a40290..2ee852a 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -75,6 +75,8 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover Capacity: int32(rover.Capacity), Integrity: int32(rover.Integrity), MaximumIntegrity: int32(rover.MaximumIntegrity), + Charge: int32(rover.Charge), + MaximumCharge: int32(rover.MaximumCharge), } } return response, nil diff --git a/pkg/game/rover.go b/pkg/game/rover.go index b0f5dca..a7e3fb3 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -27,4 +27,10 @@ type Rover struct { // MaximumIntegrity is the full integrity of the rover MaximumIntegrity int `json:"maximum-integrity"` + + // Charge is the amount of energy the rover has + Charge int `json:"charge"` + + // ChargeCharge is the maximum charge able to be stored + MaximumCharge int `json:"maximum-Charge"` } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 733854c..38c507c 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -506,6 +506,10 @@ type RoverResponse struct { Integrity int32 `protobuf:"varint,6,opt,name=integrity,proto3" json:"integrity,omitempty"` // The maximum health of the rover MaximumIntegrity int32 `protobuf:"varint,7,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` + // The energy stored in the rover + Charge int32 `protobuf:"varint,8,opt,name=charge,proto3" json:"charge,omitempty"` + // The max energy the rover can store + MaximumCharge int32 `protobuf:"varint,9,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` } func (x *RoverResponse) Reset() { @@ -589,6 +593,20 @@ func (x *RoverResponse) GetMaximumIntegrity() int32 { return 0 } +func (x *RoverResponse) GetCharge() int32 { + if x != nil { + return x.Charge + } + return 0 +} + +func (x *RoverResponse) GetMaximumCharge() int32 { + if x != nil { + return x.MaximumCharge + } + return 0 +} + // Empty placeholder type StatusRequest struct { state protoimpl.MessageState @@ -791,7 +809,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe7, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, @@ -805,44 +823,48 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x22, - 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, - 0x76, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, - 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x0f, 0x0a, + 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, + 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, + 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, + 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 04a29d7..90b97fb 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -326,6 +326,16 @@ "type": "integer", "format": "int32", "title": "The maximum health of the rover" + }, + "charge": { + "type": "integer", + "format": "int32", + "title": "The energy stored in the rover" + }, + "maximumCharge": { + "type": "integer", + "format": "int32", + "title": "The max energy the rover can store" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 38cd995..6c40234 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -137,6 +137,12 @@ message RoverResponse { // The maximum health of the rover int32 maximumIntegrity = 7; + + // The energy stored in the rover + int32 charge = 8; + + // The max energy the rover can store + int32 maximumCharge = 9; } // Empty placeholder From dbe944bb4e75db193e6d9a65c7c30aaa8b878f3e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 12:30:40 +0100 Subject: [PATCH 299/495] Add charge and apply it to rover actions --- pkg/game/world.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index c0ff212..a0a299f 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -75,10 +75,12 @@ func (w *World) SpawnRover() (string, error) { // Initialise the rover rover := Rover{ - Range: 4.0, + Range: 4, Integrity: 10, MaximumIntegrity: 10, Capacity: 10, + Charge: 10, + MaximumCharge: 10, Name: uuid.New().String(), } @@ -219,6 +221,13 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error if !ok { return vector.Vector{}, fmt.Errorf("no rover matching id") } + + // Ensure the rover has energy + if i.Charge <= 0 { + return i.Pos, nil + } + i.Charge-- + // Try the new move position newPos := i.Pos.Added(b.Vector()) @@ -256,6 +265,12 @@ func (w *World) RoverStash(rover string) (objects.Type, error) { return objects.None, nil } + // Ensure the rover has energy + if r.Charge <= 0 { + return objects.None, nil + } + r.Charge-- + _, obj := w.Atlas.QueryPosition(r.Pos) if !obj.IsStashable() { return objects.None, nil From 8b83672dcc21869ee03802cd04cdf9c411779cad Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:34:28 +0100 Subject: [PATCH 300/495] Fix Atlas gen with simplification Only track lower and upper bounds in world space, and speak in terms of world space and chunks --- pkg/atlas/atlas.go | 171 +++++++++++++++------------------------- pkg/atlas/atlas_test.go | 141 +++++++++++++++++++++++++++++---- pkg/maths/maths.go | 16 ++++ pkg/maths/maths_test.go | 14 ++++ pkg/vector/vector.go | 19 +++++ 5 files changed, 240 insertions(+), 121 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 6ec11e2..ef25d9c 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -38,11 +38,11 @@ type Atlas struct { // This is intentionally not a 2D array so it can be expanded in all directions Chunks []Chunk `json:"chunks"` - // CurrentSize is the current width/height of the atlas in chunks - CurrentSize vector.Vector `json:"currentSize"` + // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) + LowerBound vector.Vector `json:"lowerBound"` - // WorldOrigin represents the location of the [0,0] world space point in terms of the allotted current chunks - WorldOrigin vector.Vector `json:"worldOrigin"` + // UpperBound is the top left corner of the current chunks (curent chunks cover < this value) + UpperBound vector.Vector `json:"upperBound"` // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` @@ -52,10 +52,10 @@ type Atlas struct { func NewAtlas(chunkSize int) Atlas { // Start up with one chunk a := Atlas{ - ChunkSize: chunkSize, - Chunks: make([]Chunk, 1), - CurrentSize: vector.Vector{X: 1, Y: 1}, - WorldOrigin: vector.Vector{X: 0, Y: 0}, + ChunkSize: chunkSize, + Chunks: make([]Chunk, 1), + LowerBound: vector.Vector{X: 0, Y: 0}, + UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, } // Initialise the first chunk a.Chunks[0].populate(chunkSize) @@ -162,129 +162,88 @@ func (a *Atlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } -// worldSpaceToChunk gets the current chunk ID for a position in the world -func (a *Atlas) worldSpaceToChunk(v vector.Vector) int { - // First convert to chunk space - chunkSpace := a.worldSpaceToChunkSpace(v) +// worldSpaceToChunkID gets the current chunk ID for a position in the world +func (a *Atlas) worldSpaceToChunkIndex(v vector.Vector) int { + // Shift the vector by our current min + v = v.Added(a.LowerBound.Negated()) - // Then return the ID - return a.chunkSpaceToChunk(chunkSpace) + // Divide by the current size and floor, to get chunk-scaled vector from the lower bound + v = v.DividedFloor(a.ChunkSize) + + // Calculate the width + width := a.UpperBound.X - a.LowerBound.X + widthInChunks := width / a.ChunkSize + + // Along the corridor and up the stairs + return (v.Y * widthInChunks) + v.X } -// worldSpaceToChunkSpace converts from world space to chunk space -func (a *Atlas) worldSpaceToChunkSpace(v vector.Vector) vector.Vector { - // Remove the chunk local part - chunkOrigin := v.Added(a.worldSpaceToChunkLocal(v).Negated()) - // Convert to chunk space coordinate - chunkSpaceOrigin := chunkOrigin.Divided(a.ChunkSize) - // Shift it by our current chunk origin - chunkIndexOrigin := chunkSpaceOrigin.Added(a.WorldOrigin) - - return chunkIndexOrigin -} - -// chunkSpaceToWorldSpace vonverts from chunk space to world space -func (a *Atlas) chunkSpaceToWorldSpace(v vector.Vector) vector.Vector { - - // Shift it by the current chunk origin - shifted := v.Added(a.WorldOrigin.Negated()) - - // Multiply out by chunk size - return shifted.Multiplied(a.ChunkSize) -} - -// chunkOriginInChunkSpace Gets the chunk origin in chunk space -func (a *Atlas) chunkOriginInChunkSpace(chunk int) vector.Vector { - // convert the chunk to chunk space - chunkOrigin := a.chunkToChunkSpace(chunk) - - // Shift it by the current chunk origin - return chunkOrigin.Added(a.WorldOrigin.Negated()) -} - -// chunkOriginInWorldSpace gets the chunk origin for a given chunk index +// chunkOriginInWorldSpace returns the origin of the chunk in world space func (a *Atlas) chunkOriginInWorldSpace(chunk int) vector.Vector { - // convert the chunk to chunk space - chunkSpace := a.chunkToChunkSpace(chunk) + // Calculate the width + width := a.UpperBound.X - a.LowerBound.X + widthInChunks := width / a.ChunkSize - // Convert to world space - return a.chunkSpaceToWorldSpace(chunkSpace) -} - -// chunkSpaceToChunk converts from chunk space to the chunk -func (a *Atlas) chunkSpaceToChunk(v vector.Vector) int { - // Along the coridor and up the stair - return (v.Y * a.CurrentSize.X) + v.X -} - -// chunkToChunkSpace returns the chunk space coord for the chunk -func (a *Atlas) chunkToChunkSpace(chunk int) vector.Vector { - return vector.Vector{ - X: maths.Pmod(chunk, a.CurrentSize.Y), - Y: (chunk / a.CurrentSize.X), + // Reverse the along the corridor and up the stairs + v := vector.Vector{ + X: chunk % widthInChunks, + Y: chunk / widthInChunks, } + // Multiply up to world scale + v = v.Multiplied(a.ChunkSize) + // Shift by the lower bound + return v.Added(a.LowerBound) } -func (a *Atlas) getExtents() (min vector.Vector, max vector.Vector) { - min = a.WorldOrigin.Negated() - max = min.Added(a.CurrentSize) +// getNewBounds gets new lower and upper bounds for the world space given a vector +func (a *Atlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { + lower = vector.Min(v, a.LowerBound) + upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) + + lower = vector.Vector{ + X: maths.RoundDown(lower.X, a.ChunkSize), + Y: maths.RoundDown(lower.Y, a.ChunkSize), + } + upper = vector.Vector{ + X: maths.RoundUp(upper.X, a.ChunkSize), + Y: maths.RoundUp(upper.Y, a.ChunkSize), + } return } // worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { - min, max := a.getExtents() - - // Divide by the chunk size to bring into chunk space - v = v.Divided(a.ChunkSize) - - // Check we're within the current extents and bail early - if v.X >= min.X && v.Y >= min.Y && v.X < max.X && v.Y < max.Y { - return a.worldSpaceToChunk(v) + // If we're within bounds, just return the current chunk + if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { + return a.worldSpaceToChunkIndex(v) } - // Calculate the new origin and the new size - origin := min - size := a.CurrentSize + // Calculate the new bounds + lower, upper := a.getNewBounds(v) + size := upper.Added(lower.Negated()) + size = size.Divided(a.ChunkSize) - // If we need to shift the origin back - originDiff := origin.Added(v.Negated()) - if originDiff.X > 0 { - origin.X -= originDiff.X - size.X += originDiff.X - } - if originDiff.Y > 0 { - origin.Y -= originDiff.Y - size.Y += originDiff.Y - } - - // If we need to expand the size - maxDiff := v.Added(max.Negated()) - if maxDiff.X > 0 { - size.X += maxDiff.X - } - if maxDiff.Y > 0 { - size.Y += maxDiff.Y - } - - // Set up the new size and origin + // Create the new empty atlas newAtlas := Atlas{ - ChunkSize: a.ChunkSize, - WorldOrigin: origin.Negated(), - CurrentSize: size, - Chunks: make([]Chunk, size.X*size.Y), + ChunkSize: a.ChunkSize, + LowerBound: lower, + UpperBound: upper, + Chunks: make([]Chunk, size.X*size.Y), } // Copy all old chunks into the new atlas for chunk, chunkData := range a.Chunks { - // Calculate the new chunk location and copy over the data - newChunk := newAtlas.worldSpaceToChunk(a.chunkOriginInWorldSpace(chunk)) + + // Calculate the chunk ID in the new atlas + origin := a.chunkOriginInWorldSpace(chunk) + newChunk := newAtlas.worldSpaceToChunkIndex(origin) + // Copy over the old chunk to the new atlas newAtlas.Chunks[newChunk] = chunkData } - // Copy the new atlas data into this one + // Overwrite the old atlas with this one *a = newAtlas - return a.worldSpaceToChunk(v) + return a.worldSpaceToChunkIndex(v) } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 9778150..60c3922 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -22,43 +22,49 @@ func TestAtlas_toChunk(t *testing.T) { // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -1, Y: -1}) a.QueryPosition(vector.Vector{X: 0, Y: 0}) + assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID := a.worldSpaceToChunk(vector.Vector{X: 0, Y: 0}) + chunkID := a.worldSpaceToChunkIndex(vector.Vector{X: 0, Y: 0}) assert.Equal(t, 3, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: 0, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 0, Y: -1}) assert.Equal(t, 1, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 0, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: 0}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) a = NewAtlas(2) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) + assert.Equal(t, 2*2, len(a.Chunks)) a.QueryPosition(vector.Vector{X: 1, Y: 1}) + assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 1}) assert.Equal(t, 3, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: -2}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: -2}) assert.Equal(t, 1, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: -2}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: -2}) assert.Equal(t, 0, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) a = NewAtlas(2) assert.NotNil(t, a) - // Get a tile to spawn the chunks - a.QueryPosition(vector.Vector{X: 5, Y: 5}) - a.QueryPosition(vector.Vector{X: -5, Y: -5}) + // Get a tile to spawn a 4x4 grid of chunks + a.QueryPosition(vector.Vector{X: 3, Y: 3}) + assert.Equal(t, 2*2, len(a.Chunks)) + a.QueryPosition(vector.Vector{X: -3, Y: -3}) + assert.Equal(t, 4*4, len(a.Chunks)) + // Chunks should look like: // 12| 13|| 14| 15 // ---------------- @@ -67,14 +73,96 @@ func TestAtlas_toChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: 3}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 3}) assert.Equal(t, 14, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: 1, Y: -3}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: -3}) assert.Equal(t, 2, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: -1}) assert.Equal(t, 5, chunkID) - chunkID = a.worldSpaceToChunk(vector.Vector{X: -2, Y: 2}) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) + + a = NewAtlas(3) + assert.NotNil(t, a) + // Get a tile to spawn a 4x4 grid of chunks + a.QueryPosition(vector.Vector{X: 3, Y: 3}) + assert.Equal(t, 2*2, len(a.Chunks)) + + // Chunks should look like: + // || 2| 3 + // ------- + // || 0| 1 + // ======= + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 1}) + assert.Equal(t, 0, chunkID) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 3, Y: 1}) + assert.Equal(t, 1, chunkID) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 4}) + assert.Equal(t, 2, chunkID) + chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 5, Y: 5}) + assert.Equal(t, 3, chunkID) +} + +func TestAtlas_toWorld(t *testing.T) { + a := NewAtlas(1) + assert.NotNil(t, a) + + // Get a tile to spawn some chunks + a.QueryPosition(vector.Vector{X: -1, Y: -1}) + assert.Equal(t, 2*2, len(a.Chunks)) + + // Chunks should look like: + // 2 | 3 + // ----- + // 0 | 1 + assert.Equal(t, vector.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, vector.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) + + a = NewAtlas(2) + assert.NotNil(t, a) + // Get a tile to spawn the chunks + a.QueryPosition(vector.Vector{X: -2, Y: -2}) + assert.Equal(t, 2*2, len(a.Chunks)) + a.QueryPosition(vector.Vector{X: 1, Y: 1}) + assert.Equal(t, 2*2, len(a.Chunks)) + // Chunks should look like: + // 2 | 3 + // ----- + // 0 | 1 + assert.Equal(t, vector.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, vector.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) + + a = NewAtlas(2) + assert.NotNil(t, a) + // Get a tile to spawn a 4x4 grid of chunks + a.QueryPosition(vector.Vector{X: 3, Y: 3}) + assert.Equal(t, 2*2, len(a.Chunks)) + a.QueryPosition(vector.Vector{X: -3, Y: -3}) + assert.Equal(t, 4*4, len(a.Chunks)) + + // Chunks should look like: + // 12| 13|| 14| 15 + // ---------------- + // 8 | 9 || 10| 11 + // ================ + // 4 | 5 || 6 | 7 + // ---------------- + // 0 | 1 || 2 | 3 + assert.Equal(t, vector.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, vector.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) + + a = NewAtlas(3) + assert.NotNil(t, a) + // Get a tile to spawn a 4x4 grid of chunks + a.QueryPosition(vector.Vector{X: 3, Y: 3}) + assert.Equal(t, 2*2, len(a.Chunks)) + + // Chunks should look like: + // || 2| 3 + // ------- + // || 0| 1 + // ======= + assert.Equal(t, vector.Vector{X: 0, Y: 0}, a.chunkOriginInWorldSpace(0)) } func TestAtlas_GetSetTile(t *testing.T) { @@ -137,3 +225,26 @@ func TestAtlas_Grown(t *testing.T) { tile, _ = a.QueryPosition(vector.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) } + +func TestAtlas_GetSetCorrect(t *testing.T) { + // Big stress test to ensure we do actually properly expand for all reasonable values + for i := 1; i <= 4; i++ { + + for x := -i * 2; x < i*2; x++ { + for y := -i * 2; y < i*2; y++ { + a := NewAtlas(i) + assert.NotNil(t, a) + assert.Equal(t, 1, len(a.Chunks)) + + pos := vector.Vector{X: x, Y: y} + a.SetTile(pos, TileRock) + a.SetObject(pos, objects.Object{Type: objects.LargeRock}) + tile, obj := a.QueryPosition(pos) + + assert.Equal(t, TileRock, Tile(tile)) + assert.Equal(t, objects.Object{Type: objects.LargeRock}, obj) + + } + } + } +} diff --git a/pkg/maths/maths.go b/pkg/maths/maths.go index 76c00a5..cd40516 100644 --- a/pkg/maths/maths.go +++ b/pkg/maths/maths.go @@ -39,3 +39,19 @@ func Min(x, y int) int { } return x } + +// RoundUp rounds a value up to the nearest multiple +func RoundUp(toRound int, multiple int) int { + remainder := Pmod(toRound, multiple) + if remainder == 0 { + return toRound + } + + return (multiple - remainder) + toRound +} + +// RoundDown rounds a value down to the nearest multiple +func RoundDown(toRound int, multiple int) int { + remainder := Pmod(toRound, multiple) + return toRound - remainder +} diff --git a/pkg/maths/maths_test.go b/pkg/maths/maths_test.go index cf2c180..730da77 100644 --- a/pkg/maths/maths_test.go +++ b/pkg/maths/maths_test.go @@ -29,5 +29,19 @@ func TestMin(t *testing.T) { assert.Equal(t, 100, Min(100, 500)) assert.Equal(t, -4, Min(-4, 1)) assert.Equal(t, -4, Min(-4, -2)) +} + +func TestRoundUp(t *testing.T) { + assert.Equal(t, 10, RoundUp(10, 5)) + assert.Equal(t, 12, RoundUp(10, 4)) + assert.Equal(t, -8, RoundUp(-8, 4)) + assert.Equal(t, -4, RoundUp(-7, 4)) +} + +func TestRoundDown(t *testing.T) { + assert.Equal(t, 10, RoundDown(10, 5)) + assert.Equal(t, 8, RoundDown(10, 4)) + assert.Equal(t, -8, RoundDown(-8, 4)) + assert.Equal(t, -8, RoundDown(-7, 4)) } diff --git a/pkg/vector/vector.go b/pkg/vector/vector.go index b661d17..a8955be 100644 --- a/pkg/vector/vector.go +++ b/pkg/vector/vector.go @@ -50,6 +50,25 @@ func (v Vector) Divided(val int) Vector { return Vector{v.X / val, v.Y / val} } +// DividedFloor returns the vector divided but floors the value regardless +func (v Vector) DividedFloor(val int) Vector { + x := float64(v.X) / float64(val) + + if x < 0 { + x = math.Floor(x) + } else { + x = math.Floor(x) + } + y := float64(v.Y) / float64(val) + if y < 0 { + y = math.Floor(y) + } else { + y = math.Floor(y) + } + + return Vector{X: int(x), Y: int(y)} +} + // Abs returns an absolute version of the vector func (v Vector) Abs() Vector { return Vector{maths.Abs(v.X), maths.Abs(v.Y)} From 15c337c0675829ba54e965ca76e91cb7eba70586 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:35:25 +0100 Subject: [PATCH 301/495] Make moving and stashing cost rover charge --- pkg/game/world.go | 19 ++++++++++++++ pkg/game/world_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index a0a299f..c5e9769 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -134,6 +134,25 @@ func (w *World) GetRover(rover string) (Rover, error) { return i, nil } +// ChargeRover charges up a rover +func (w *World) ChargeRover(rover string) (int, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + i, ok := w.Rovers[rover] + if !ok { + return 0, fmt.Errorf("Failed to find rover with name: %s", rover) + } + + // Add one charge + if i.Charge < i.MaximumCharge { + i.Charge++ + } + w.Rovers[rover] = i + + return i.Charge, nil +} + // DestroyRover Removes an rover from the game func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 4ee0676..b19ce97 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -84,10 +84,18 @@ func TestWorld_GetSetMovePosition(t *testing.T) { pos.Add(vector.Vector{X: 0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving") + // Place a tile in front of the rover world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") + + rover, err = world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-2, rover.Charge, "Rover should have lost charge for move attempt") } func TestWorld_RadarFromRover(t *testing.T) { @@ -151,6 +159,16 @@ func TestWorld_RoverStash(t *testing.T) { assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) + + // Check that this didn't reduce the charge + info, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover") + assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") + } + + // Recharge the rover + for i := 0; i < rover.MaximumCharge; i++ { + world.ChargeRover(a) } // Place an object @@ -169,6 +187,11 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, rover.Capacity, len(inv)) + + // Check that this didn't reduce the charge + info, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover") + assert.Equal(t, info.MaximumCharge, info.Charge, "Rover lost charge for non-stash") } func TestWorld_RoverDamage(t *testing.T) { @@ -254,3 +277,36 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") } + +func TestWorld_Charge(t *testing.T) { + world := NewWorld(4) + a, err := world.SpawnRover() + assert.NoError(t, err) + + // Get the rover information + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge, rover.Charge, "Rover should start with maximum charge") + + // Use up all the charge + for i := 0; i < rover.MaximumCharge; i++ { + // Get the initial position + initialPos, err := world.RoverPosition(a) + assert.NoError(t, err, "Failed to get position for rover") + + // Ensure the path ahead is empty + world.Atlas.SetTile(initialPos.Added(bearing.North.Vector()), atlas.TileRock) + world.Atlas.SetObject(initialPos.Added(bearing.North.Vector()), objects.Object{Type: objects.None}) + + // Try and move north (along unblocked path) + newPos, err := world.MoveRover(a, bearing.North) + assert.NoError(t, err, "Failed to set position for rover") + assert.Equal(t, initialPos.Added(bearing.North.Vector()), newPos, "Failed to correctly move position for rover") + + // Ensure rover lost charge + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-(i+1), rover.Charge, "Rover should have lost charge") + } + +} From e875f82b137dcee995e082623f2c63346948083d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:42:20 +0100 Subject: [PATCH 302/495] Add command "charge" to charge up the rover's energy store --- pkg/game/command.go | 3 +++ pkg/game/command_test.go | 35 +++++++++++++++++++++++++++++++++++ pkg/game/world.go | 6 ++++++ proto/rove/rove.proto | 1 + 4 files changed, 45 insertions(+) diff --git a/pkg/game/command.go b/pkg/game/command.go index cde071e..caecaec 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -9,6 +9,9 @@ const ( // CommandRepair Will attempt to repair the rover with an inventory object CommandRepair = "repair" + + // CommandCharge Will use one tick to charge the rover + CommandCharge = "charge" ) // Command represends a single command to execute diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 3356f2a..a809753 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -32,3 +32,38 @@ func TestCommand_Move(t *testing.T) { pos.Add(vector.Vector{X: 0.0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } + +func TestCommand_Charge(t *testing.T) { + world := NewWorld(8) + a, err := world.SpawnRover() + assert.NoError(t, err) + pos := vector.Vector{ + X: 1.0, + Y: 2.0, + } + + err = world.WarpRover(a, pos) + assert.NoError(t, err, "Failed to set position for rover") + + // Move to use up some charge + moveCommand := Command{Command: CommandMove, Bearing: "N"} + assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to queue move command") + + // Tick the world + world.EnqueueAllIncoming() + world.ExecuteCommandQueues() + + rover, _ := world.GetRover(a) + assert.Equal(t, rover.MaximumCharge-1, rover.Charge) + + chargeCommand := Command{Command: CommandCharge} + assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue charge command") + + // Tick the world + world.EnqueueAllIncoming() + world.ExecuteCommandQueues() + + rover, _ = world.GetRover(a) + assert.Equal(t, rover.MaximumCharge, rover.Charge) + +} diff --git a/pkg/game/world.go b/pkg/game/world.go index c5e9769..7e9147c 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -371,6 +371,7 @@ func (w *World) Enqueue(rover string, commands ...Command) error { } case CommandStash: case CommandRepair: + case CommandCharge: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -458,6 +459,11 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { r.Integrity = r.Integrity + 1 w.Rovers[rover] = r } + case CommandCharge: + _, err := w.ChargeRover(rover) + if err != nil { + return err + } default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 6c40234..35b658f 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -65,6 +65,7 @@ message Command { // "move" - Move the rover in a direction, requires bearing // "stash" - Stashes item at current location in rover inventory // "repair" - Repairs the rover using an inventory object + // "charge" - Waits a tick to add more charge to the rover string command = 1; // The bearing, example: NE From 72727496148afe8bdf9260d98cc79903f64f4ebd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:42:37 +0100 Subject: [PATCH 303/495] Enable command line client to accept new commands --- cmd/rove/main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 17e35aa..cf47692 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -217,10 +217,11 @@ func InnerMain(command string, args ...string) error { Bearing: args[i], }, ) - case "stash": + default: + // By default just use the command literally commands = append(commands, &rove.Command{ - Command: game.CommandStash, + Command: args[i], }, ) } From 87af905bc8b85b214a33cdf7a1b803e7cce25613 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:56:58 +0100 Subject: [PATCH 304/495] Rename charge command to recharge --- pkg/game/command.go | 4 ++-- pkg/game/command_test.go | 6 +++--- pkg/game/world.go | 10 +++++----- pkg/game/world_test.go | 2 +- pkg/rove/rove.pb.go | 1 + pkg/rove/rove.swagger.json | 2 +- proto/rove/rove.proto | 2 +- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index caecaec..11428c3 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -10,8 +10,8 @@ const ( // CommandRepair Will attempt to repair the rover with an inventory object CommandRepair = "repair" - // CommandCharge Will use one tick to charge the rover - CommandCharge = "charge" + // CommandRecharge Will use one tick to charge the rover + CommandRecharge = "recharge" ) // Command represends a single command to execute diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index a809753..45cb182 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -33,7 +33,7 @@ func TestCommand_Move(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } -func TestCommand_Charge(t *testing.T) { +func TestCommand_Recharge(t *testing.T) { world := NewWorld(8) a, err := world.SpawnRover() assert.NoError(t, err) @@ -56,8 +56,8 @@ func TestCommand_Charge(t *testing.T) { rover, _ := world.GetRover(a) assert.Equal(t, rover.MaximumCharge-1, rover.Charge) - chargeCommand := Command{Command: CommandCharge} - assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue charge command") + chargeCommand := Command{Command: CommandRecharge} + assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue recharge command") // Tick the world world.EnqueueAllIncoming() diff --git a/pkg/game/world.go b/pkg/game/world.go index 7e9147c..a3f1e10 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -134,8 +134,8 @@ func (w *World) GetRover(rover string) (Rover, error) { return i, nil } -// ChargeRover charges up a rover -func (w *World) ChargeRover(rover string) (int, error) { +// RoverRecharge charges up a rover +func (w *World) RoverRecharge(rover string) (int, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -371,7 +371,7 @@ func (w *World) Enqueue(rover string, commands ...Command) error { } case CommandStash: case CommandRepair: - case CommandCharge: + case CommandRecharge: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -459,8 +459,8 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { r.Integrity = r.Integrity + 1 w.Rovers[rover] = r } - case CommandCharge: - _, err := w.ChargeRover(rover) + case CommandRecharge: + _, err := w.RoverRecharge(rover) if err != nil { return err } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index b19ce97..9b4e696 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -168,7 +168,7 @@ func TestWorld_RoverStash(t *testing.T) { // Recharge the rover for i := 0; i < rover.MaximumCharge; i++ { - world.ChargeRover(a) + world.RoverRecharge(a) } // Place an object diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 38c507c..2bee993 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -43,6 +43,7 @@ type Command struct { // "move" - Move the rover in a direction, requires bearing // "stash" - Stashes item at current location in rover inventory // "repair" - Repairs the rover using an inventory object + // "recharge" - Waits a tick to add more charge to the rover Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` // The bearing, example: NE Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 90b97fb..4e55cab 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -212,7 +212,7 @@ "properties": { "command": { "type": "string", - "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object" + "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object\n\"recharge\" - Waits a tick to add more charge to the rover" }, "bearing": { "type": "string", diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 35b658f..73659f2 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -65,7 +65,7 @@ message Command { // "move" - Move the rover in a direction, requires bearing // "stash" - Stashes item at current location in rover inventory // "repair" - Repairs the rover using an inventory object - // "charge" - Waits a tick to add more charge to the rover + // "recharge" - Waits a tick to add more charge to the rover string command = 1; // The bearing, example: NE From 31308db6b533f1f95b86667653217c59e92d0d14 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:57:19 +0100 Subject: [PATCH 305/495] Tick off energy in upcoming features and simplify current features --- docs/status.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/status.md b/docs/status.md index 951abc1..6a54ecf 100644 --- a/docs/status.md +++ b/docs/status.md @@ -5,22 +5,18 @@ This page tracks the current feature set and the features to implement next ### Current features -* Users can register account and spawn rover -* Users can command the rover to move -* Server can return rover's current radar -* Server supports multiple users and rovers -* Map is populated with rocks -* Commands are queued and then are executed in sequence -* Rover inventory -* Collectable materials -* Rover has integrity and takes damage on collisions -* Rover can repair +* Users can register and spawn a rover +* The rover can be commanded to move, stash, repair and recharge +* Rover commands use energy +* The rover has a radar function to view nearby terrain and objects +* The server supports multiple users +* The map is populated with terrain and objects +* Rovers take damage and can use collected materials to repair ### Incoming features * Rover replacement and advancement mechanic * Dormant rovers -* Rover energy with solar charging * Day/night cycle * More hazards * Simple rover to rover communication From 98eea894847a6604396d60b74c356b4256b64e13 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:59:27 +0100 Subject: [PATCH 306/495] Adjust goals to focus on core rover gameplay --- docs/status.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/status.md b/docs/status.md index 6a54ecf..c9d5f1b 100644 --- a/docs/status.md +++ b/docs/status.md @@ -15,14 +15,14 @@ This page tracks the current feature set and the features to implement next ### Incoming features -* Rover replacement and advancement mechanic -* Dormant rovers * Day/night cycle -* More hazards -* Simple rover to rover communication +* Weather cycle * Deterministic and intelligent world-gen ### Stretch goals +* Simple rover to rover communication +* Rover replacement and advancement mechanic +* Dormant rovers * Render rover camera view * Account token security \ No newline at end of file From f8e594cb3926b47541d90be0e37234f51b8af3a4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 23:05:08 +0100 Subject: [PATCH 307/495] Rename "status" command to "server-status" --- cmd/rove-server-rest-proxy/http_test.go | 8 +- cmd/rove-server/internal/routes.go | 4 +- cmd/rove/main.go | 6 +- cmd/rove/main_test.go | 4 +- pkg/rove/rove.pb.go | 181 ++++++++++++------------ pkg/rove/rove.pb.gw.go | 28 ++-- pkg/rove/rove.swagger.json | 8 +- proto/rove/rove.proto | 8 +- 8 files changed, 125 insertions(+), 122 deletions(-) diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go index ba55fb9..586b5e1 100644 --- a/cmd/rove-server-rest-proxy/http_test.go +++ b/cmd/rove-server-rest-proxy/http_test.go @@ -61,10 +61,10 @@ func (s Server) Request(method, path string, in, out interface{}) error { var serv = Server(os.Getenv("ROVE_HTTP")) -func TestServer_Status(t *testing.T) { - req := &rove.StatusRequest{} - resp := &rove.StatusResponse{} - if err := serv.Request("GET", "status", req, resp); err != nil { +func TestServer_ServerStatus(t *testing.T) { + req := &rove.ServerStatusRequest{} + resp := &rove.ServerStatusResponse{} + if err := serv.Request("GET", "server-status", req, resp); err != nil { log.Fatal(err) } } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 2ee852a..c7e8f5c 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -10,8 +10,8 @@ import ( ) // Status returns the status of the current server to a gRPC request -func (s *Server) Status(context.Context, *rove.StatusRequest) (*rove.StatusResponse, error) { - response := &rove.StatusResponse{ +func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove.ServerStatusResponse, error) { + response := &rove.ServerStatusResponse{ Ready: true, Version: version.Version, Tick: int32(s.tick), diff --git a/cmd/rove/main.go b/cmd/rove/main.go index cf47692..e9f4db7 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -27,7 +27,7 @@ var defaultDataPath = path.Join(home, ".local/share/") func printUsage() { fmt.Fprintf(os.Stderr, "Usage: rove COMMAND [ARGS...]\n") fmt.Fprintln(os.Stderr, "\nCommands") - fmt.Fprintln(os.Stderr, "\tstatus prints the server status") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issue commands to rover, accepts multiple, see below") fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") @@ -163,8 +163,8 @@ func InnerMain(command string, args ...string) error { // Handle all the commands switch command { - case "status": - response, err := client.Status(ctx, &rove.StatusRequest{}) + case "server-status": + response, err := client.ServerStatus(ctx, &rove.ServerStatusRequest{}) switch { case err != nil: return err diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 1c06374..9600733 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -26,11 +26,11 @@ func Test_InnerMain(t *testing.T) { } // First attempt should error without a host - assert.Error(t, InnerMain("status")) + assert.Error(t, InnerMain("server-status")) // Set the host in the config assert.NoError(t, InnerMain("config", address)) - assert.NoError(t, InnerMain("status")) + assert.NoError(t, InnerMain("server-status")) // Register should fail without a name assert.Error(t, InnerMain("register")) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 2bee993..f2c318b 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -609,14 +609,14 @@ func (x *RoverResponse) GetMaximumCharge() int32 { } // Empty placeholder -type StatusRequest struct { +type ServerStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *StatusRequest) Reset() { - *x = StatusRequest{} +func (x *ServerStatusRequest) Reset() { + *x = ServerStatusRequest{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -624,13 +624,13 @@ func (x *StatusRequest) Reset() { } } -func (x *StatusRequest) String() string { +func (x *ServerStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StatusRequest) ProtoMessage() {} +func (*ServerStatusRequest) ProtoMessage() {} -func (x *StatusRequest) ProtoReflect() protoreflect.Message { +func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -642,12 +642,12 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. -func (*StatusRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. +func (*ServerStatusRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{10} } -type StatusResponse struct { +type ServerStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -662,8 +662,8 @@ type StatusResponse struct { Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` } -func (x *StatusResponse) Reset() { - *x = StatusResponse{} +func (x *ServerStatusResponse) Reset() { + *x = ServerStatusResponse{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -671,13 +671,13 @@ func (x *StatusResponse) Reset() { } } -func (x *StatusResponse) String() string { +func (x *ServerStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StatusResponse) ProtoMessage() {} +func (*ServerStatusResponse) ProtoMessage() {} -func (x *StatusResponse) ProtoReflect() protoreflect.Message { +func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -689,33 +689,33 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. -func (*StatusResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. +func (*ServerStatusResponse) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{11} } -func (x *StatusResponse) GetNextTick() string { +func (x *ServerStatusResponse) GetNextTick() string { if x != nil { return x.NextTick } return "" } -func (x *StatusResponse) GetReady() bool { +func (x *ServerStatusResponse) GetReady() bool { if x != nil { return x.Ready } return false } -func (x *StatusResponse) GetTick() int32 { +func (x *ServerStatusResponse) GetTick() int32 { if x != nil { return x.Tick } return 0 } -func (x *StatusResponse) GetVersion() string { +func (x *ServerStatusResponse) GetVersion() string { if x != nil { return x.Version } @@ -828,44 +828,47 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x0f, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0xf8, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, - 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, - 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x3a, - 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, + 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, + 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, + 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, + 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, + 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, + 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -882,29 +885,29 @@ func file_rove_rove_proto_rawDescGZIP() []byte { var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_rove_rove_proto_goTypes = []interface{}{ - (*Command)(nil), // 0: rove.Command - (*CommandsRequest)(nil), // 1: rove.CommandsRequest - (*CommandsResponse)(nil), // 2: rove.CommandsResponse - (*Error)(nil), // 3: rove.Error - (*RadarRequest)(nil), // 4: rove.RadarRequest - (*RadarResponse)(nil), // 5: rove.RadarResponse - (*RegisterResponse)(nil), // 6: rove.RegisterResponse - (*RegisterRequest)(nil), // 7: rove.RegisterRequest - (*RoverRequest)(nil), // 8: rove.RoverRequest - (*RoverResponse)(nil), // 9: rove.RoverResponse - (*StatusRequest)(nil), // 10: rove.StatusRequest - (*StatusResponse)(nil), // 11: rove.StatusResponse - (*Vector)(nil), // 12: rove.Vector + (*Command)(nil), // 0: rove.Command + (*CommandsRequest)(nil), // 1: rove.CommandsRequest + (*CommandsResponse)(nil), // 2: rove.CommandsResponse + (*Error)(nil), // 3: rove.Error + (*RadarRequest)(nil), // 4: rove.RadarRequest + (*RadarResponse)(nil), // 5: rove.RadarResponse + (*RegisterResponse)(nil), // 6: rove.RegisterResponse + (*RegisterRequest)(nil), // 7: rove.RegisterRequest + (*RoverRequest)(nil), // 8: rove.RoverRequest + (*RoverResponse)(nil), // 9: rove.RoverResponse + (*ServerStatusRequest)(nil), // 10: rove.ServerStatusRequest + (*ServerStatusResponse)(nil), // 11: rove.ServerStatusResponse + (*Vector)(nil), // 12: rove.Vector } var file_rove_rove_proto_depIdxs = []int32{ 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command 12, // 1: rove.RoverResponse.position:type_name -> rove.Vector - 10, // 2: rove.Rove.Status:input_type -> rove.StatusRequest + 10, // 2: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest 7, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest 1, // 4: rove.Rove.Commands:input_type -> rove.CommandsRequest 4, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest 8, // 6: rove.Rove.Rover:input_type -> rove.RoverRequest - 11, // 7: rove.Rove.Status:output_type -> rove.StatusResponse + 11, // 7: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse 6, // 8: rove.Rove.Register:output_type -> rove.RegisterResponse 2, // 9: rove.Rove.Commands:output_type -> rove.CommandsResponse 5, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse @@ -1043,7 +1046,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { + switch v := v.(*ServerStatusRequest); i { case 0: return &v.state case 1: @@ -1055,7 +1058,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse); i { + switch v := v.(*ServerStatusResponse); i { case 0: return &v.state case 1: @@ -1114,7 +1117,7 @@ type RoveClient interface { // Server status // // Responds with various details about the current server status - Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) + ServerStatus(ctx context.Context, in *ServerStatusRequest, opts ...grpc.CallOption) (*ServerStatusResponse, error) // Register an account // // Tries to register an account with the given name @@ -1141,9 +1144,9 @@ func NewRoveClient(cc grpc.ClientConnInterface) RoveClient { return &roveClient{cc} } -func (c *roveClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { - out := new(StatusResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Status", in, out, opts...) +func (c *roveClient) ServerStatus(ctx context.Context, in *ServerStatusRequest, opts ...grpc.CallOption) (*ServerStatusResponse, error) { + out := new(ServerStatusResponse) + err := c.cc.Invoke(ctx, "/rove.Rove/ServerStatus", in, out, opts...) if err != nil { return nil, err } @@ -1191,7 +1194,7 @@ type RoveServer interface { // Server status // // Responds with various details about the current server status - Status(context.Context, *StatusRequest) (*StatusResponse, error) + ServerStatus(context.Context, *ServerStatusRequest) (*ServerStatusResponse, error) // Register an account // // Tries to register an account with the given name @@ -1214,8 +1217,8 @@ type RoveServer interface { type UnimplementedRoveServer struct { } -func (*UnimplementedRoveServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") +func (*UnimplementedRoveServer) ServerStatus(context.Context, *ServerStatusRequest) (*ServerStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ServerStatus not implemented") } func (*UnimplementedRoveServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") @@ -1234,20 +1237,20 @@ func RegisterRoveServer(s *grpc.Server, srv RoveServer) { s.RegisterService(&_Rove_serviceDesc, srv) } -func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StatusRequest) +func _Rove_ServerStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ServerStatusRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServer).Status(ctx, in) + return srv.(RoveServer).ServerStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Status", + FullMethod: "/rove.Rove/ServerStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServer).Status(ctx, req.(*StatusRequest)) + return srv.(RoveServer).ServerStatus(ctx, req.(*ServerStatusRequest)) } return interceptor(ctx, in, info, handler) } @@ -1329,8 +1332,8 @@ var _Rove_serviceDesc = grpc.ServiceDesc{ HandlerType: (*RoveServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "Status", - Handler: _Rove_Status_Handler, + MethodName: "ServerStatus", + Handler: _Rove_ServerStatus_Handler, }, { MethodName: "Register", diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index 0d19891..f253655 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -31,20 +31,20 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage -func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StatusRequest +func request_Rove_ServerStatus_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ServerStatusRequest var metadata runtime.ServerMetadata - msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ServerStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StatusRequest +func local_request_Rove_ServerStatus_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ServerStatusRequest var metadata runtime.ServerMetadata - msg, err := server.Status(ctx, &protoReq) + msg, err := server.ServerStatus(ctx, &protoReq) return msg, metadata, err } @@ -190,7 +190,7 @@ func local_request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoveServer) error { - mux.Handle("GET", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_ServerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -199,14 +199,14 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Rove_Status_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_ServerStatus_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_ServerStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -331,7 +331,7 @@ func RegisterRoveHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc. // "RoveClient" to call the correct interceptors. func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoveClient) error { - mux.Handle("GET", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Rove_ServerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -340,14 +340,14 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Rove_Status_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_ServerStatus_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_ServerStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -435,7 +435,7 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien } var ( - pattern_Rove_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_ServerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"server-status"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Rove_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) @@ -447,7 +447,7 @@ var ( ) var ( - forward_Rove_Status_0 = runtime.ForwardResponseMessage + forward_Rove_ServerStatus_0 = runtime.ForwardResponseMessage forward_Rove_Register_0 = runtime.ForwardResponseMessage diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 4e55cab..c0a318a 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -148,16 +148,16 @@ ] } }, - "/status": { + "/server-status": { "get": { "summary": "Server status", "description": "Responds with various details about the current server status", - "operationId": "Rove_Status", + "operationId": "Rove_ServerStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/roveStatusResponse" + "$ref": "#/definitions/roveServerStatusResponse" } }, "default": { @@ -339,7 +339,7 @@ } } }, - "roveStatusResponse": { + "roveServerStatusResponse": { "type": "object", "properties": { "next_tick": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 73659f2..ada631a 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -13,9 +13,9 @@ service Rove { // Server status // // Responds with various details about the current server status - rpc Status(StatusRequest) returns (StatusResponse) { + rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse) { option (google.api.http) = { - get: "/status" + get: "/server-status" }; } @@ -147,9 +147,9 @@ message RoverResponse { } // Empty placeholder -message StatusRequest {} +message ServerStatusRequest {} -message StatusResponse { +message ServerStatusResponse { // The time the next tick will occur string next_tick = 1; From 894359142b4f4c3c1fb703b443b4dfb3f0f9e4a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 23:11:12 +0100 Subject: [PATCH 308/495] Rename "rover" to "status" --- cmd/rove-server-rest-proxy/http_test.go | 4 +- cmd/rove-server/internal/routes.go | 8 +- cmd/rove/main.go | 8 +- pkg/rove/rove.pb.go | 218 ++++++++++++------------ pkg/rove/rove.pb.gw.go | 28 +-- pkg/rove/rove.swagger.json | 118 ++++++------- proto/rove/rove.proto | 8 +- 7 files changed, 196 insertions(+), 196 deletions(-) diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go index 586b5e1..e797a3b 100644 --- a/cmd/rove-server-rest-proxy/http_test.go +++ b/cmd/rove-server-rest-proxy/http_test.go @@ -116,8 +116,8 @@ func TestServer_Rover(t *testing.T) { err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) assert.NoError(t, err, "First register attempt should pass") - resp := &rove.RoverResponse{} - err = serv.Request("POST", "rover", &rove.RoverRequest{ + resp := &rove.StatusResponse{} + err = serv.Request("POST", "status", &rove.StatusRequest{ Account: acc, }, resp) assert.NoError(t, err, "Rover sould pass should pass") diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index c7e8f5c..76485c4 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -46,9 +46,9 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove return &rove.RegisterResponse{}, nil } -// Rover returns rover information for a gRPC request -func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.RoverResponse, error) { - response := &rove.RoverResponse{} +// Status returns rover information for a gRPC request +func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (*rove.StatusResponse, error) { + response := &rove.StatusResponse{} if len(req.Account) == 0 { return nil, fmt.Errorf("empty account name") @@ -64,7 +64,7 @@ func (s *Server) Rover(ctx context.Context, req *rove.RoverRequest) (*rove.Rover inv = append(inv, byte(i.Type)) } - response = &rove.RoverResponse{ + response = &rove.StatusResponse{ Name: rover.Name, Position: &rove.Vector{ X: int32(rover.Pos.X), diff --git a/cmd/rove/main.go b/cmd/rove/main.go index e9f4db7..4cb9075 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -31,7 +31,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issue commands to rover, accepts multiple, see below") fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") - fmt.Fprintln(os.Stderr, "\trover gets data for current rover") + fmt.Fprintln(os.Stderr, "\tstatus gets status info for current rover") fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") fmt.Fprintln(os.Stderr, "\tversion outputs version info") @@ -277,12 +277,12 @@ func InnerMain(command string, args ...string) error { } } - case "rover": - req := rove.RoverRequest{Account: config.Account.Name} + case "status": + req := rove.StatusRequest{Account: config.Account.Name} if err := verifyID(req.Account); err != nil { return err } - response, err := client.Rover(ctx, &req) + response, err := client.Status(ctx, &req) switch { case err != nil: diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index f2c318b..a1ef12a 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -440,7 +440,7 @@ func (x *RegisterRequest) GetName() string { return "" } -type RoverRequest struct { +type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -449,8 +449,8 @@ type RoverRequest struct { Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } -func (x *RoverRequest) Reset() { - *x = RoverRequest{} +func (x *StatusRequest) Reset() { + *x = StatusRequest{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -458,13 +458,13 @@ func (x *RoverRequest) Reset() { } } -func (x *RoverRequest) String() string { +func (x *StatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoverRequest) ProtoMessage() {} +func (*StatusRequest) ProtoMessage() {} -func (x *RoverRequest) ProtoReflect() protoreflect.Message { +func (x *StatusRequest) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -476,19 +476,19 @@ func (x *RoverRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoverRequest.ProtoReflect.Descriptor instead. -func (*RoverRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{8} } -func (x *RoverRequest) GetAccount() string { +func (x *StatusRequest) GetAccount() string { if x != nil { return x.Account } return "" } -type RoverResponse struct { +type StatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -513,8 +513,8 @@ type RoverResponse struct { MaximumCharge int32 `protobuf:"varint,9,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` } -func (x *RoverResponse) Reset() { - *x = RoverResponse{} +func (x *StatusResponse) Reset() { + *x = StatusResponse{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -522,13 +522,13 @@ func (x *RoverResponse) Reset() { } } -func (x *RoverResponse) String() string { +func (x *StatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoverResponse) ProtoMessage() {} +func (*StatusResponse) ProtoMessage() {} -func (x *RoverResponse) ProtoReflect() protoreflect.Message { +func (x *StatusResponse) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -540,68 +540,68 @@ func (x *RoverResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoverResponse.ProtoReflect.Descriptor instead. -func (*RoverResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. +func (*StatusResponse) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{9} } -func (x *RoverResponse) GetName() string { +func (x *StatusResponse) GetName() string { if x != nil { return x.Name } return "" } -func (x *RoverResponse) GetPosition() *Vector { +func (x *StatusResponse) GetPosition() *Vector { if x != nil { return x.Position } return nil } -func (x *RoverResponse) GetRange() int32 { +func (x *StatusResponse) GetRange() int32 { if x != nil { return x.Range } return 0 } -func (x *RoverResponse) GetInventory() []byte { +func (x *StatusResponse) GetInventory() []byte { if x != nil { return x.Inventory } return nil } -func (x *RoverResponse) GetCapacity() int32 { +func (x *StatusResponse) GetCapacity() int32 { if x != nil { return x.Capacity } return 0 } -func (x *RoverResponse) GetIntegrity() int32 { +func (x *StatusResponse) GetIntegrity() int32 { if x != nil { return x.Integrity } return 0 } -func (x *RoverResponse) GetMaximumIntegrity() int32 { +func (x *StatusResponse) GetMaximumIntegrity() int32 { if x != nil { return x.MaximumIntegrity } return 0 } -func (x *RoverResponse) GetCharge() int32 { +func (x *StatusResponse) GetCharge() int32 { if x != nil { return x.Charge } return 0 } -func (x *RoverResponse) GetMaximumCharge() int32 { +func (x *StatusResponse) GetMaximumCharge() int32 { if x != nil { return x.MaximumCharge } @@ -807,68 +807,68 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x52, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x15, 0x0a, - 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, - 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, - 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, - 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x08, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, - 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, - 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa6, 0x02, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, + 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0x95, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, + 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, + 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, + 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, + 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, + 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -893,25 +893,25 @@ var file_rove_rove_proto_goTypes = []interface{}{ (*RadarResponse)(nil), // 5: rove.RadarResponse (*RegisterResponse)(nil), // 6: rove.RegisterResponse (*RegisterRequest)(nil), // 7: rove.RegisterRequest - (*RoverRequest)(nil), // 8: rove.RoverRequest - (*RoverResponse)(nil), // 9: rove.RoverResponse + (*StatusRequest)(nil), // 8: rove.StatusRequest + (*StatusResponse)(nil), // 9: rove.StatusResponse (*ServerStatusRequest)(nil), // 10: rove.ServerStatusRequest (*ServerStatusResponse)(nil), // 11: rove.ServerStatusResponse (*Vector)(nil), // 12: rove.Vector } var file_rove_rove_proto_depIdxs = []int32{ 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command - 12, // 1: rove.RoverResponse.position:type_name -> rove.Vector + 12, // 1: rove.StatusResponse.position:type_name -> rove.Vector 10, // 2: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest 7, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest 1, // 4: rove.Rove.Commands:input_type -> rove.CommandsRequest 4, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 6: rove.Rove.Rover:input_type -> rove.RoverRequest + 8, // 6: rove.Rove.Status:input_type -> rove.StatusRequest 11, // 7: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse 6, // 8: rove.Rove.Register:output_type -> rove.RegisterResponse 2, // 9: rove.Rove.Commands:output_type -> rove.CommandsResponse 5, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse - 9, // 11: rove.Rove.Rover:output_type -> rove.RoverResponse + 9, // 11: rove.Rove.Status:output_type -> rove.StatusResponse 7, // [7:12] is the sub-list for method output_type 2, // [2:7] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -1022,7 +1022,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoverRequest); i { + switch v := v.(*StatusRequest); i { case 0: return &v.state case 1: @@ -1034,7 +1034,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoverResponse); i { + switch v := v.(*StatusResponse); i { case 0: return &v.state case 1: @@ -1133,7 +1133,7 @@ type RoveClient interface { // Get rover information // // Gets information for the account's rover - Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) + Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) } type roveClient struct { @@ -1180,9 +1180,9 @@ func (c *roveClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.C return out, nil } -func (c *roveClient) Rover(ctx context.Context, in *RoverRequest, opts ...grpc.CallOption) (*RoverResponse, error) { - out := new(RoverResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Rover", in, out, opts...) +func (c *roveClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { + out := new(StatusResponse) + err := c.cc.Invoke(ctx, "/rove.Rove/Status", in, out, opts...) if err != nil { return nil, err } @@ -1210,7 +1210,7 @@ type RoveServer interface { // Get rover information // // Gets information for the account's rover - Rover(context.Context, *RoverRequest) (*RoverResponse, error) + Status(context.Context, *StatusRequest) (*StatusResponse, error) } // UnimplementedRoveServer can be embedded to have forward compatible implementations. @@ -1229,8 +1229,8 @@ func (*UnimplementedRoveServer) Commands(context.Context, *CommandsRequest) (*Co func (*UnimplementedRoveServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") } -func (*UnimplementedRoveServer) Rover(context.Context, *RoverRequest) (*RoverResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Rover not implemented") +func (*UnimplementedRoveServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") } func RegisterRoveServer(s *grpc.Server, srv RoveServer) { @@ -1309,20 +1309,20 @@ func _Rove_Radar_Handler(srv interface{}, ctx context.Context, dec func(interfac return interceptor(ctx, in, info, handler) } -func _Rove_Rover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RoverRequest) +func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServer).Rover(ctx, in) + return srv.(RoveServer).Status(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Rover", + FullMethod: "/rove.Rove/Status", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServer).Rover(ctx, req.(*RoverRequest)) + return srv.(RoveServer).Status(ctx, req.(*StatusRequest)) } return interceptor(ctx, in, info, handler) } @@ -1348,8 +1348,8 @@ var _Rove_serviceDesc = grpc.ServiceDesc{ Handler: _Rove_Radar_Handler, }, { - MethodName: "Rover", - Handler: _Rove_Rover_Handler, + MethodName: "Status", + Handler: _Rove_Status_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index f253655..cfb9d54 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -151,8 +151,8 @@ func local_request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler } -func request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RoverRequest +func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatusRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -163,13 +163,13 @@ func request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, clie return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Rover(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RoverRequest +func local_request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatusRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -180,7 +180,7 @@ func local_request_Rove_Rover_0(ctx context.Context, marshaler runtime.Marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Rover(ctx, &protoReq) + msg, err := server.Status(ctx, &protoReq) return msg, metadata, err } @@ -270,7 +270,7 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve }) - mux.Handle("POST", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -279,14 +279,14 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Rove_Rover_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Status_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -411,7 +411,7 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien }) - mux.Handle("POST", pattern_Rove_Rover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -420,14 +420,14 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Rove_Rover_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Status_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Rover_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -443,7 +443,7 @@ var ( pattern_Rove_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Rove_Rover_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"rover"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -455,5 +455,5 @@ var ( forward_Rove_Radar_0 = runtime.ForwardResponseMessage - forward_Rove_Rover_0 = runtime.ForwardResponseMessage + forward_Rove_Status_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index c0a318a..cc4e6d6 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -114,40 +114,6 @@ ] } }, - "/rover": { - "post": { - "summary": "Get rover information", - "description": "Gets information for the account's rover", - "operationId": "Rove_Rover", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveRoverResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/roveRoverRequest" - } - } - ], - "tags": [ - "Rove" - ] - } - }, "/server-status": { "get": { "summary": "Server status", @@ -171,6 +137,40 @@ "Rove" ] } + }, + "/status": { + "post": { + "summary": "Get rover information", + "description": "Gets information for the account's rover", + "operationId": "Rove_Status", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/roveStatusResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/roveStatusRequest" + } + } + ], + "tags": [ + "Rove" + ] + } } }, "definitions": { @@ -282,7 +282,30 @@ "type": "object", "title": "Empty placeholder" }, - "roveRoverRequest": { + "roveServerStatusResponse": { + "type": "object", + "properties": { + "next_tick": { + "type": "string", + "title": "The time the next tick will occur" + }, + "ready": { + "type": "boolean", + "format": "boolean", + "title": "Whether the server is ready to accept requests" + }, + "tick": { + "type": "integer", + "format": "int32", + "title": "The tick rate of the server in minutes (how many minutes per tick)" + }, + "version": { + "type": "string", + "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" + } + } + }, + "roveStatusRequest": { "type": "object", "properties": { "account": { @@ -291,7 +314,7 @@ } } }, - "roveRoverResponse": { + "roveStatusResponse": { "type": "object", "properties": { "name": { @@ -339,29 +362,6 @@ } } }, - "roveServerStatusResponse": { - "type": "object", - "properties": { - "next_tick": { - "type": "string", - "title": "The time the next tick will occur" - }, - "ready": { - "type": "boolean", - "format": "boolean", - "title": "Whether the server is ready to accept requests" - }, - "tick": { - "type": "integer", - "format": "int32", - "title": "The tick rate of the server in minutes (how many minutes per tick)" - }, - "version": { - "type": "string", - "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" - } - } - }, "roveVector": { "type": "object", "properties": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index ada631a..54609b0 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -52,9 +52,9 @@ service Rove { // Get rover information // // Gets information for the account's rover - rpc Rover(RoverRequest) returns (RoverResponse) { + rpc Status(StatusRequest) returns (StatusResponse) { option (google.api.http) = { - post: "/rover" + post: "/status" body: "*" }; } @@ -112,12 +112,12 @@ message RegisterRequest { string name = 1; } -message RoverRequest { +message StatusRequest { // The account for this request string account = 1; } -message RoverResponse { +message StatusResponse { // The name of the rover string name = 1; From 28639b4cac79ae4a5c2a7159932b2038b8b7200e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 23:11:22 +0100 Subject: [PATCH 309/495] Fix up a comment and the help text --- cmd/rove-server/internal/routes.go | 2 +- cmd/rove/main.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 76485c4..264ede3 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -9,7 +9,7 @@ import ( "github.com/mdiluz/rove/pkg/version" ) -// Status returns the status of the current server to a gRPC request +// ServerStatus returns the status of the current server to a gRPC request func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove.ServerStatusResponse, error) { response := &rove.ServerStatusResponse{ Ready: true, diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 4cb9075..1498c74 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -39,6 +39,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tmove BEARING moves the rover in the chosen direction") fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") + fmt.Fprintln(os.Stderr, "\trecharge wait a tick to recharge the rover") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } From 31c07533419a6dc1b1f8b785a2bd7de2d09096f8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 23:15:12 +0100 Subject: [PATCH 310/495] Fix InnerMain test --- cmd/rove/main_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 9600733..2118d1c 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -37,14 +37,14 @@ func Test_InnerMain(t *testing.T) { // These methods should fail without an account assert.Error(t, InnerMain("radar")) - assert.Error(t, InnerMain("rover")) + assert.Error(t, InnerMain("status")) // Now set the name assert.NoError(t, InnerMain("register", uuid.New().String())) // These should now work assert.NoError(t, InnerMain("radar")) - assert.NoError(t, InnerMain("rover")) + assert.NoError(t, InnerMain("status")) // Commands should fail with no commands assert.Error(t, InnerMain("commands")) From 1554b7c21b2a745673f1ff4712ee5c4d0cbb74c8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 23:31:47 +0100 Subject: [PATCH 311/495] Update README.md Fix the link to the proto Add the logo --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 562a4bf..8846cc3 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ Rove ==== +![Tests](https://github.com/mdiluz/rove/workflows/Tests/badge.svg) ![Docker](https://github.com/mdiluz/rove/workflows/Docker/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) + +![Rove](https://github.com/mdiluz/rove/blob/master/data/icon.svg) Rove is an asynchronous nomadic game about exploring as part of a loose community. This repository is a [living document](https://github.com/mdiluz/rove/tree/master/docs) of current game design, as well as source code for the `rove-server` deployment and the `rove` command line client. -See [api.go](https://github.com/mdiluz/rove/blob/master/pkg/rove/api.go) for the current server-client API. - -Build Status ------------- -![Tests](https://github.com/mdiluz/rove/workflows/Tests/badge.svg) ![Docker](https://github.com/mdiluz/rove/workflows/Docker/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) - +See [rove.proto](https://github.com/mdiluz/rove/blob/master/proto/rove/rove.proto) for the current server-client API. From ea4b7de4ac3265b954afc04527ffb3f695a9bac4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 5 Jul 2020 12:55:01 +0100 Subject: [PATCH 312/495] Rename "commands" to "command" --- cmd/rove-server-rest-proxy/http_test.go | 4 +- cmd/rove-server/internal/routes.go | 6 +- cmd/rove/main.go | 8 +- cmd/rove/main_test.go | 10 +- pkg/rove/rove.pb.go | 242 ++++++++++++------------ pkg/rove/rove.pb.gw.go | 28 +-- pkg/rove/rove.swagger.json | 12 +- proto/rove/rove.proto | 8 +- 8 files changed, 159 insertions(+), 159 deletions(-) diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go index e797a3b..c17081b 100644 --- a/cmd/rove-server-rest-proxy/http_test.go +++ b/cmd/rove-server-rest-proxy/http_test.go @@ -83,7 +83,7 @@ func TestServer_Command(t *testing.T) { err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) assert.NoError(t, err, "First register attempt should pass") - err = serv.Request("POST", "commands", &rove.CommandsRequest{ + err = serv.Request("POST", "command", &rove.CommandRequest{ Account: acc, Commands: []*rove.Command{ { @@ -91,7 +91,7 @@ func TestServer_Command(t *testing.T) { Bearing: "NE", }, }, - }, &rove.CommandsResponse{}) + }, &rove.CommandResponse{}) assert.NoError(t, err, "Commands should should pass") } diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 264ede3..519856b 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -109,8 +109,8 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar return response, nil } -// Commands issues commands to the world based on a gRPC request -func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove.CommandsResponse, error) { +// Command issues commands to the world based on a gRPC request +func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.CommandResponse, error) { if len(req.Account) == 0 { return nil, fmt.Errorf("empty account") } @@ -130,5 +130,5 @@ func (s *Server) Commands(ctx context.Context, req *rove.CommandsRequest) (*rove return nil, err } - return &rove.CommandsResponse{}, nil + return &rove.CommandResponse{}, nil } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 1498c74..af1fd6d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -29,7 +29,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\nCommands") fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tcommands COMMAND [VAL...] issue commands to rover, accepts multiple, see below") + fmt.Fprintln(os.Stderr, "\tcommand COMMAND [VAL...] issue commands to rover, accepts multiple, see below") fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") fmt.Fprintln(os.Stderr, "\tstatus gets status info for current rover") fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") @@ -196,7 +196,7 @@ func InnerMain(command string, args ...string) error { config.Account.Name = name } - case "commands": + case "command": if len(args) == 0 { return fmt.Errorf("must pass commands to 'commands'") } @@ -228,7 +228,7 @@ func InnerMain(command string, args ...string) error { } } - d := rove.CommandsRequest{ + d := rove.CommandRequest{ Account: config.Account.Name, Commands: commands, } @@ -237,7 +237,7 @@ func InnerMain(command string, args ...string) error { return err } - _, err := client.Commands(ctx, &d) + _, err := client.Command(ctx, &d) switch { case err != nil: return err diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 2118d1c..6f90fcd 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -47,13 +47,13 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("status")) // Commands should fail with no commands - assert.Error(t, InnerMain("commands")) + assert.Error(t, InnerMain("command")) // Give it commands - assert.NoError(t, InnerMain("commands", "move", "N")) - assert.NoError(t, InnerMain("commands", "stash")) - assert.NoError(t, InnerMain("commands", "repair")) + assert.NoError(t, InnerMain("command", "move", "N")) + assert.NoError(t, InnerMain("command", "stash")) + assert.NoError(t, InnerMain("command", "repair")) // Give it malformed commands - assert.Error(t, InnerMain("commands", "move", "stash")) + assert.Error(t, InnerMain("command", "move", "stash")) } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index a1ef12a..d5ca946 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -95,7 +95,7 @@ func (x *Command) GetBearing() string { return "" } -type CommandsRequest struct { +type CommandRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -106,8 +106,8 @@ type CommandsRequest struct { Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` } -func (x *CommandsRequest) Reset() { - *x = CommandsRequest{} +func (x *CommandRequest) Reset() { + *x = CommandRequest{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -115,13 +115,13 @@ func (x *CommandsRequest) Reset() { } } -func (x *CommandsRequest) String() string { +func (x *CommandRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CommandsRequest) ProtoMessage() {} +func (*CommandRequest) ProtoMessage() {} -func (x *CommandsRequest) ProtoReflect() protoreflect.Message { +func (x *CommandRequest) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -133,19 +133,19 @@ func (x *CommandsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CommandsRequest.ProtoReflect.Descriptor instead. -func (*CommandsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CommandRequest.ProtoReflect.Descriptor instead. +func (*CommandRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{1} } -func (x *CommandsRequest) GetAccount() string { +func (x *CommandRequest) GetAccount() string { if x != nil { return x.Account } return "" } -func (x *CommandsRequest) GetCommands() []*Command { +func (x *CommandRequest) GetCommands() []*Command { if x != nil { return x.Commands } @@ -153,14 +153,14 @@ func (x *CommandsRequest) GetCommands() []*Command { } // Empty placeholder -type CommandsResponse struct { +type CommandResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CommandsResponse) Reset() { - *x = CommandsResponse{} +func (x *CommandResponse) Reset() { + *x = CommandResponse{} if protoimpl.UnsafeEnabled { mi := &file_rove_rove_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -168,13 +168,13 @@ func (x *CommandsResponse) Reset() { } } -func (x *CommandsResponse) String() string { +func (x *CommandResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CommandsResponse) ProtoMessage() {} +func (*CommandResponse) ProtoMessage() {} -func (x *CommandsResponse) ProtoReflect() protoreflect.Message { +func (x *CommandResponse) ProtoReflect() protoreflect.Message { mi := &file_rove_rove_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -186,8 +186,8 @@ func (x *CommandsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CommandsResponse.ProtoReflect.Descriptor instead. -func (*CommandsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CommandResponse.ProtoReflect.Descriptor instead. +func (*CommandResponse) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{2} } @@ -787,88 +787,88 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x12, 0x0a, 0x10, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x28, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa6, 0x02, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, - 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, - 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0x95, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, - 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4f, - 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0e, 0x22, 0x09, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, - 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, - 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, - 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, + 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, + 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x12, + 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa6, 0x02, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, + 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, + 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, + 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -886,8 +886,8 @@ func file_rove_rove_proto_rawDescGZIP() []byte { var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_rove_rove_proto_goTypes = []interface{}{ (*Command)(nil), // 0: rove.Command - (*CommandsRequest)(nil), // 1: rove.CommandsRequest - (*CommandsResponse)(nil), // 2: rove.CommandsResponse + (*CommandRequest)(nil), // 1: rove.CommandRequest + (*CommandResponse)(nil), // 2: rove.CommandResponse (*Error)(nil), // 3: rove.Error (*RadarRequest)(nil), // 4: rove.RadarRequest (*RadarResponse)(nil), // 5: rove.RadarResponse @@ -900,16 +900,16 @@ var file_rove_rove_proto_goTypes = []interface{}{ (*Vector)(nil), // 12: rove.Vector } var file_rove_rove_proto_depIdxs = []int32{ - 0, // 0: rove.CommandsRequest.commands:type_name -> rove.Command + 0, // 0: rove.CommandRequest.commands:type_name -> rove.Command 12, // 1: rove.StatusResponse.position:type_name -> rove.Vector 10, // 2: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest 7, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 4: rove.Rove.Commands:input_type -> rove.CommandsRequest + 1, // 4: rove.Rove.Command:input_type -> rove.CommandRequest 4, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest 8, // 6: rove.Rove.Status:input_type -> rove.StatusRequest 11, // 7: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse 6, // 8: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 9: rove.Rove.Commands:output_type -> rove.CommandsResponse + 2, // 9: rove.Rove.Command:output_type -> rove.CommandResponse 5, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse 9, // 11: rove.Rove.Status:output_type -> rove.StatusResponse 7, // [7:12] is the sub-list for method output_type @@ -938,7 +938,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandsRequest); i { + switch v := v.(*CommandRequest); i { case 0: return &v.state case 1: @@ -950,7 +950,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandsResponse); i { + switch v := v.(*CommandResponse); i { case 0: return &v.state case 1: @@ -1125,7 +1125,7 @@ type RoveClient interface { // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*CommandsResponse, error) + Command(ctx context.Context, in *CommandRequest, opts ...grpc.CallOption) (*CommandResponse, error) // Get radar information // // Gets the radar output for the given rover @@ -1162,9 +1162,9 @@ func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ... return out, nil } -func (c *roveClient) Commands(ctx context.Context, in *CommandsRequest, opts ...grpc.CallOption) (*CommandsResponse, error) { - out := new(CommandsResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Commands", in, out, opts...) +func (c *roveClient) Command(ctx context.Context, in *CommandRequest, opts ...grpc.CallOption) (*CommandResponse, error) { + out := new(CommandResponse) + err := c.cc.Invoke(ctx, "/rove.Rove/Command", in, out, opts...) if err != nil { return nil, err } @@ -1202,7 +1202,7 @@ type RoveServer interface { // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - Commands(context.Context, *CommandsRequest) (*CommandsResponse, error) + Command(context.Context, *CommandRequest) (*CommandResponse, error) // Get radar information // // Gets the radar output for the given rover @@ -1223,8 +1223,8 @@ func (*UnimplementedRoveServer) ServerStatus(context.Context, *ServerStatusReque func (*UnimplementedRoveServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (*UnimplementedRoveServer) Commands(context.Context, *CommandsRequest) (*CommandsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Commands not implemented") +func (*UnimplementedRoveServer) Command(context.Context, *CommandRequest) (*CommandResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Command not implemented") } func (*UnimplementedRoveServer) Radar(context.Context, *RadarRequest) (*RadarResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Radar not implemented") @@ -1273,20 +1273,20 @@ func _Rove_Register_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } -func _Rove_Commands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CommandsRequest) +func _Rove_Command_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CommandRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RoveServer).Commands(ctx, in) + return srv.(RoveServer).Command(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Commands", + FullMethod: "/rove.Rove/Command", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RoveServer).Commands(ctx, req.(*CommandsRequest)) + return srv.(RoveServer).Command(ctx, req.(*CommandRequest)) } return interceptor(ctx, in, info, handler) } @@ -1340,8 +1340,8 @@ var _Rove_serviceDesc = grpc.ServiceDesc{ Handler: _Rove_Register_Handler, }, { - MethodName: "Commands", - Handler: _Rove_Commands_Handler, + MethodName: "Command", + Handler: _Rove_Command_Handler, }, { MethodName: "Radar", diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go index cfb9d54..db3d25e 100644 --- a/pkg/rove/rove.pb.gw.go +++ b/pkg/rove/rove.pb.gw.go @@ -83,8 +83,8 @@ func local_request_Rove_Register_0(ctx context.Context, marshaler runtime.Marsha } -func request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CommandsRequest +func request_Rove_Command_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommandRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -95,13 +95,13 @@ func request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marshaler, c return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Commands(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.Command(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CommandsRequest +func local_request_Rove_Command_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommandRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -112,7 +112,7 @@ func local_request_Rove_Commands_0(ctx context.Context, marshaler runtime.Marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Commands(ctx, &protoReq) + msg, err := server.Command(ctx, &protoReq) return msg, metadata, err } @@ -230,7 +230,7 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve }) - mux.Handle("POST", pattern_Rove_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Command_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -239,14 +239,14 @@ func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Rove_Commands_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Rove_Command_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Command_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -371,7 +371,7 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien }) - mux.Handle("POST", pattern_Rove_Commands_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Rove_Command_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -380,14 +380,14 @@ func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Rove_Commands_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Rove_Command_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Rove_Commands_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Rove_Command_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -439,7 +439,7 @@ var ( pattern_Rove_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Rove_Commands_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"commands"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Rove_Command_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"command"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Rove_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) @@ -451,7 +451,7 @@ var ( forward_Rove_Register_0 = runtime.ForwardResponseMessage - forward_Rove_Commands_0 = runtime.ForwardResponseMessage + forward_Rove_Command_0 = runtime.ForwardResponseMessage forward_Rove_Radar_0 = runtime.ForwardResponseMessage diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index cc4e6d6..d9f0932 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -12,16 +12,16 @@ "application/json" ], "paths": { - "/commands": { + "/command": { "post": { "summary": "Send commands to rover", "description": "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent", - "operationId": "Rove_Commands", + "operationId": "Rove_Command", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/roveCommandsResponse" + "$ref": "#/definitions/roveCommandResponse" } }, "default": { @@ -37,7 +37,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/roveCommandsRequest" + "$ref": "#/definitions/roveCommandRequest" } } ], @@ -220,7 +220,7 @@ } } }, - "roveCommandsRequest": { + "roveCommandRequest": { "type": "object", "properties": { "account": { @@ -236,7 +236,7 @@ } } }, - "roveCommandsResponse": { + "roveCommandResponse": { "type": "object", "title": "Empty placeholder" }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 54609b0..0c0c7bc 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -32,9 +32,9 @@ service Rove { // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - rpc Commands(CommandsRequest) returns (CommandsResponse) { + rpc Command(CommandRequest) returns (CommandResponse) { option (google.api.http) = { - post: "/commands" + post: "/command" body: "*" }; } @@ -72,7 +72,7 @@ message Command { string bearing = 2; } -message CommandsRequest { +message CommandRequest { // The account to execute these commands string account = 1; @@ -81,7 +81,7 @@ message CommandsRequest { } // Empty placeholder -message CommandsResponse {} +message CommandResponse {} message Error { // An explanation for the HTTP error returned From 233a6b328145a2b4407486737361f0a77938e489 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 5 Jul 2020 13:16:08 +0100 Subject: [PATCH 313/495] Add incoming and queued commands to status output --- cmd/rove-server/internal/routes.go | 17 ++++ pkg/game/world.go | 27 ++++-- pkg/rove/rove.pb.go | 141 +++++++++++++++++------------ pkg/rove/rove.swagger.json | 14 +++ proto/rove/rove.proto | 6 ++ 5 files changed, 140 insertions(+), 65 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 519856b..afbc568 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -64,6 +64,21 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (*rove.Sta inv = append(inv, byte(i.Type)) } + i, q := s.world.RoverCommands(resp) + var incoming, queued []*rove.Command + for _, i := range i { + incoming = append(incoming, &rove.Command{ + Command: i.Command, + Bearing: i.Bearing, + }) + } + for _, q := range q { + queued = append(queued, &rove.Command{ + Command: q.Command, + Bearing: q.Bearing, + }) + } + response = &rove.StatusResponse{ Name: rover.Name, Position: &rove.Vector{ @@ -77,6 +92,8 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (*rove.Sta MaximumIntegrity: int32(rover.MaximumIntegrity), Charge: int32(rover.Charge), MaximumCharge: int32(rover.MaximumCharge), + IncomingCommands: incoming, + QueuedCommands: queued, } } return response, nil diff --git a/pkg/game/world.go b/pkg/game/world.go index a3f1e10..737219d 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -30,7 +30,7 @@ type World struct { CommandQueue map[string]CommandStream `json:"commands"` // Incoming represents the set of commands to add to the queue at the end of the current tick - Incoming map[string]CommandStream `json:"incoming"` + CommandIncoming map[string]CommandStream `json:"incoming"` // Mutex to lock around command operations cmdMutex sync.RWMutex @@ -60,11 +60,11 @@ func NewWorld(chunkSize int) *World { } return &World{ - Rovers: make(map[string]Rover), - CommandQueue: make(map[string]CommandStream), - Incoming: make(map[string]CommandStream), - Atlas: atlas.NewAtlas(chunkSize), - words: lines, + Rovers: make(map[string]Rover), + CommandQueue: make(map[string]CommandStream), + CommandIncoming: make(map[string]CommandStream), + Atlas: atlas.NewAtlas(chunkSize), + words: lines, } } @@ -359,6 +359,17 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err return radar, objs, nil } +// RoverCommands returns current commands for the given rover +func (w *World) RoverCommands(rover string) (incoming []Command, queued []Command) { + if c, ok := w.CommandIncoming[rover]; ok { + incoming = c + } + if c, ok := w.CommandQueue[rover]; ok { + queued = c + } + return +} + // Enqueue will queue the commands given func (w *World) Enqueue(rover string, commands ...Command) error { @@ -395,12 +406,12 @@ func (w *World) Enqueue(rover string, commands ...Command) error { // EnqueueAllIncoming will enqueue the incoming commands func (w *World) EnqueueAllIncoming() { // Add any incoming commands from this tick and clear that queue - for id, incoming := range w.Incoming { + for id, incoming := range w.CommandIncoming { commands := w.CommandQueue[id] commands = append(commands, incoming...) w.CommandQueue[id] = commands } - w.Incoming = make(map[string]CommandStream) + w.CommandIncoming = make(map[string]CommandStream) } // ExecuteCommandQueues will execute any commands in the current command queue diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index d5ca946..70f0191 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -511,6 +511,10 @@ type StatusResponse struct { Charge int32 `protobuf:"varint,8,opt,name=charge,proto3" json:"charge,omitempty"` // The max energy the rover can store MaximumCharge int32 `protobuf:"varint,9,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` + // The set of currently incoming commands for this tick + IncomingCommands []*Command `protobuf:"bytes,10,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` + // The set of currently queued commands + QueuedCommands []*Command `protobuf:"bytes,11,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` } func (x *StatusResponse) Reset() { @@ -608,6 +612,20 @@ func (x *StatusResponse) GetMaximumCharge() int32 { return 0 } +func (x *StatusResponse) GetIncomingCommands() []*Command { + if x != nil { + return x.IncomingCommands + } + return nil +} + +func (x *StatusResponse) GetQueuedCommands() []*Command { + if x != nil { + return x.QueuedCommands + } + return nil +} + // Empty placeholder type ServerStatusRequest struct { state protoimpl.MessageState @@ -810,7 +828,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa6, 0x02, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, @@ -828,47 +846,54 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x15, 0x0a, - 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, - 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x24, 0x0a, - 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, - 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, + 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, + 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, + 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, + 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, + 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -902,21 +927,23 @@ var file_rove_rove_proto_goTypes = []interface{}{ var file_rove_rove_proto_depIdxs = []int32{ 0, // 0: rove.CommandRequest.commands:type_name -> rove.Command 12, // 1: rove.StatusResponse.position:type_name -> rove.Vector - 10, // 2: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 7, // 3: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 4: rove.Rove.Command:input_type -> rove.CommandRequest - 4, // 5: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 6: rove.Rove.Status:input_type -> rove.StatusRequest - 11, // 7: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 6, // 8: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 9: rove.Rove.Command:output_type -> rove.CommandResponse - 5, // 10: rove.Rove.Radar:output_type -> rove.RadarResponse - 9, // 11: rove.Rove.Status:output_type -> rove.StatusResponse - 7, // [7:12] is the sub-list for method output_type - 2, // [2:7] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 0, // 2: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 0, // 3: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 10, // 4: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 7, // 5: rove.Rove.Register:input_type -> rove.RegisterRequest + 1, // 6: rove.Rove.Command:input_type -> rove.CommandRequest + 4, // 7: rove.Rove.Radar:input_type -> rove.RadarRequest + 8, // 8: rove.Rove.Status:input_type -> rove.StatusRequest + 11, // 9: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 6, // 10: rove.Rove.Register:output_type -> rove.RegisterResponse + 2, // 11: rove.Rove.Command:output_type -> rove.CommandResponse + 5, // 12: rove.Rove.Radar:output_type -> rove.RadarResponse + 9, // 13: rove.Rove.Status:output_type -> rove.StatusResponse + 9, // [9:14] is the sub-list for method output_type + 4, // [4:9] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_rove_rove_proto_init() } diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index d9f0932..1749dc7 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -359,6 +359,20 @@ "type": "integer", "format": "int32", "title": "The max energy the rover can store" + }, + "incomingCommands": { + "type": "array", + "items": { + "$ref": "#/definitions/roveCommand" + }, + "title": "The set of currently incoming commands for this tick" + }, + "queuedCommands": { + "type": "array", + "items": { + "$ref": "#/definitions/roveCommand" + }, + "title": "The set of currently queued commands" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 0c0c7bc..59df2c5 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -144,6 +144,12 @@ message StatusResponse { // The max energy the rover can store int32 maximumCharge = 9; + + // The set of currently incoming commands for this tick + repeated Command incomingCommands = 10; + + // The set of currently queued commands + repeated Command queuedCommands = 11; } // Empty placeholder From a112c3ed470f2c6c77213d976d0fb3dc943689f3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 5 Jul 2020 13:16:19 +0100 Subject: [PATCH 314/495] Override incoming commands rather than appending --- pkg/game/world.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 737219d..cdd8fa1 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -393,12 +393,8 @@ func (w *World) Enqueue(rover string, commands ...Command) error { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() - // Append the commands to the incoming set - if cmds, ok := w.Incoming[rover]; ok { - w.Incoming[rover] = append(cmds, commands...) - } else { - w.Incoming[rover] = commands - } + // Override the incoming command set + w.CommandIncoming[rover] = commands return nil } From 35d7400a83db2fa62f687dc16f2d79bbc08fcf81 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 5 Jul 2020 13:36:51 +0100 Subject: [PATCH 315/495] Also build the rove command line client into the docker --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 727efa4..f5a1f4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ COPY . . RUN go mod download # Build the executables +RUN go build -o rove -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove/main.go RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go RUN go build -o rove-server-rest-proxy cmd/rove-server-rest-proxy/main.go From 9eb2e0866702d463196893fa9002c772296c8db5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:09:49 +0100 Subject: [PATCH 316/495] Add check to github action that we've run make gen --- .github/workflows/tests.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 04b2ba8..11d1ab0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,6 +23,13 @@ jobs: run: | sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 sudo chmod +x /usr/local/bin/swagger + + - name: Install protoc and check no difference + run: | + sudo apt install protobuf-compiler + make gen + git update-index --refresh + git diff-index --quiet HEAD -- - name: Check out repo uses: actions/checkout@v2 From 2c6aba6897fd6139afca3e9219e4f06d7e9673a4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:10:04 +0100 Subject: [PATCH 317/495] Remove Gopkg usage in github action --- .github/workflows/tests.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 11d1ab0..15742d5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,10 +37,6 @@ jobs: - name: Get go dependencies run: | go get -v -t -d ./... - if [ -f Gopkg.toml ]; then - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh - dep ensure - fi - name: Build and Test run: make test From 771c95da14496900a731203a5403e4315175afcd Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:10:14 +0100 Subject: [PATCH 318/495] Update makefile with more echos --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ac45c79..4e08041 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,20 @@ VERSION := $(shell git describe --always --long --dirty --tags) build: + @echo Running no-output build go mod download go build -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... install: + @echo Installing to GOPATH go mod download go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... gen: - @echo Generating rove server gRPC + @echo Generating rove server gRPC and gateway protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/rove/rove.proto protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto + @echo Generating rove server swagger protoc --proto_path proto --swagger_out=logtostderr=true:pkg/ proto/rove/rove.proto test: From 62741caf5e12d175e1a6741040ece021f666f580 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:12:32 +0100 Subject: [PATCH 319/495] Add check for golang lint --- .github/workflows/tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 15742d5..8f2fcfd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,6 +34,9 @@ jobs: - name: Check out repo uses: actions/checkout@v2 + - name: Check golangci-lint + uses: matoous/golangci-lint-action@v1.1.0 + - name: Get go dependencies run: | go get -v -t -d ./... From 408fffb0c63d11ec42d52f2885b70b0b815dc18d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:16:09 +0100 Subject: [PATCH 320/495] Fix to use the new golangci-lint action --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8f2fcfd..f5a2275 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,8 +34,8 @@ jobs: - name: Check out repo uses: actions/checkout@v2 - - name: Check golangci-lint - uses: matoous/golangci-lint-action@v1.1.0 + - name: Run golangci-lint + uses: actions-contrib/golangci-lint@v1 - name: Get go dependencies run: | From 2fbe2dc1a8ee27ba9a0dc5923f19645b33ca7d3b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:18:40 +0100 Subject: [PATCH 321/495] Re-order code checkout --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f5a2275..1d99059 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,15 +24,15 @@ jobs: sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 sudo chmod +x /usr/local/bin/swagger + - name: Check out repo + uses: actions/checkout@v2 + - name: Install protoc and check no difference run: | sudo apt install protobuf-compiler make gen git update-index --refresh git diff-index --quiet HEAD -- - - - name: Check out repo - uses: actions/checkout@v2 - name: Run golangci-lint uses: actions-contrib/golangci-lint@v1 From 718252731b82f43ef5d35e4b37cedbd918278ca3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:46:39 +0100 Subject: [PATCH 322/495] Give up on getting protoc and lint to work in the action --- .github/workflows/tests.yml | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1d99059..86c9b12 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,6 +13,8 @@ jobs: runs-on: ubuntu-latest steps: + - uses: actions/checkout@v2 + - name: Set up Go 1.x uses: actions/setup-go@v2 with: @@ -24,19 +26,6 @@ jobs: sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 sudo chmod +x /usr/local/bin/swagger - - name: Check out repo - uses: actions/checkout@v2 - - - name: Install protoc and check no difference - run: | - sudo apt install protobuf-compiler - make gen - git update-index --refresh - git diff-index --quiet HEAD -- - - - name: Run golangci-lint - uses: actions-contrib/golangci-lint@v1 - - name: Get go dependencies run: | go get -v -t -d ./... From ed6de9eac49aba7e35a8bb4acbddbfecd79a5a6c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:49:01 +0100 Subject: [PATCH 323/495] Remove swagger install from tests --- .github/workflows/tests.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 86c9b12..71d2c3e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,11 +21,6 @@ jobs: go-version: ^1.13 id: go - - name: Install swagger - run: | - sudo curl -o /usr/local/bin/swagger -L'#' https://github.com/go-swagger/go-swagger/releases/download/v0.23.0/swagger_linux_amd64 - sudo chmod +x /usr/local/bin/swagger - - name: Get go dependencies run: | go get -v -t -d ./... From 945b3299acaa6757176eb506b672b6ae72a1879a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 17:53:35 +0100 Subject: [PATCH 324/495] Add golangci-lint from https://github.com/actions-contrib/golangci-lint --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 71d2c3e..9d3bc5c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,6 +14,8 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Run golangci-lint + uses: actions-contrib/golangci-lint@v1 - name: Set up Go 1.x uses: actions/setup-go@v2 From 75910efbe5668bb3809c37674eed993d957895ac Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 18:04:10 +0100 Subject: [PATCH 325/495] Apply all golangci-lint fixes --- cmd/rove-server/internal/routes.go | 3 +-- cmd/rove-server/internal/server.go | 4 +++- cmd/rove-server/main.go | 4 +++- cmd/rove-server/main_test.go | 6 ++++-- cmd/rove/main.go | 4 +++- pkg/atlas/atlas.go | 13 ------------- pkg/bearing/bearing.go | 2 +- pkg/game/world_test.go | 5 ++++- 8 files changed, 19 insertions(+), 22 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index afbc568..341c9ee 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -47,8 +47,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove } // Status returns rover information for a gRPC request -func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (*rove.StatusResponse, error) { - response := &rove.StatusResponse{} +func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response *rove.StatusResponse, err error) { if len(req.Account) == 0 { return nil, fmt.Errorf("empty account name") diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 5f918d4..a80005e 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -136,7 +136,9 @@ func (s *Server) Run() { s.world.ExecuteCommandQueues() // Save out the new world state - s.SaveWorld() + if err := s.SaveWorld(); err != nil { + log.Fatalf("Failed to save the world: %s", err) + } }); err != nil { log.Fatal(err) } diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index ef1d675..db09130 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -52,7 +52,9 @@ func InnerMain() { log.Printf("Initialising version %s...\n", version.Version) // Set the persistence path - persistence.SetPath(data) + if err := persistence.SetPath(data); err != nil { + log.Fatal(err) + } // Convert the tick rate tickRate := 1 diff --git a/cmd/rove-server/main_test.go b/cmd/rove-server/main_test.go index fcf9a55..e689ead 100644 --- a/cmd/rove-server/main_test.go +++ b/cmd/rove-server/main_test.go @@ -3,10 +3,12 @@ package main import ( "flag" "testing" + + "github.com/stretchr/testify/assert" ) func Test_InnerMain_Version(t *testing.T) { - flag.Set("version", "1") + assert.NoError(t, flag.Set("version", "1")) InnerMain() - flag.Set("version", "0") + assert.NoError(t, flag.Set("version", "0")) } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index af1fd6d..7ef4b91 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -78,7 +78,9 @@ func LoadConfig() (config Config, err error) { // Create the path if needed path := filepath.Dir(datapath) if _, err := os.Stat(path); os.IsNotExist(err) { - os.MkdirAll(path, os.ModePerm) + if err := os.MkdirAll(path, os.ModePerm); err != nil { + return Config{}, fmt.Errorf("Failed to create data path %s: %s", path, err) + } } else { // Read the file _, err = os.Stat(datapath) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index ef25d9c..0840873 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -144,19 +144,6 @@ func (a *Atlas) setObject(chunk int, local vector.Vector, object objects.Object) a.Chunks[chunk] = c } -// setTileAndObject sets both tile and object information for location in chunk -func (a *Atlas) setTileAndObject(chunk int, local vector.Vector, tile byte, object objects.Object) { - c := a.Chunks[chunk] - if c.Tiles == nil { - c.populate(a.ChunkSize) - } - - i := a.chunkTileIndex(local) - c.Tiles[i] = tile - c.Objects[i] = object - a.Chunks[chunk] = c -} - // worldSpaceToChunkLocal gets a chunk local coordinate for a tile func (a *Atlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 62053f2..303c195 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -60,7 +60,7 @@ func (d Bearing) ShortString() string { // FromString gets the Direction from a string func FromString(s string) (Bearing, error) { for i, d := range bearingStrings { - if strings.ToLower(d.Long) == strings.ToLower(s) || strings.ToLower(d.Short) == strings.ToLower(s) { + if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { return Bearing(i), nil } } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 9b4e696..6e5f7d7 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -91,6 +91,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { // Place a tile in front of the rover world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) newPos, err = world.MoveRover(a, b) + assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") rover, err = world.GetRover(a) @@ -168,7 +169,9 @@ func TestWorld_RoverStash(t *testing.T) { // Recharge the rover for i := 0; i < rover.MaximumCharge; i++ { - world.RoverRecharge(a) + _, err = world.RoverRecharge(a) + assert.NoError(t, err) + } // Place an object From fc4fa3decfcfd83ab85284760d6169d4d597e861 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Mon, 6 Jul 2020 18:10:02 +0100 Subject: [PATCH 326/495] Remove go dependencies fetch to test need for it --- .github/workflows/tests.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9d3bc5c..5246994 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,10 +23,6 @@ jobs: go-version: ^1.13 id: go - - name: Get go dependencies - run: | - go get -v -t -d ./... - - name: Build and Test run: make test From c66e61921fbbf390a4185a4effd1ab7aae652c94 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 12:59:10 +0100 Subject: [PATCH 327/495] Add generated files check to github actions --- .github/workflows/tests.yml | 12 ++++++++++++ Makefile | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5246994..8388cce 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,6 +23,18 @@ jobs: go-version: ^1.13 id: go + - name: Check generated files + run: | + PROTOC_ZIP=protoc-3.6.1-linux-x86_64.zip + curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/$PROTOC_ZIP + sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc + sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*' + sudo chmod -R o+r /usr/local/include/google/ + rm -f $PROTOC_ZIP + make gen + git update-index --refresh + git diff-index --quiet HEAD + - name: Build and Test run: make test diff --git a/Makefile b/Makefile index 4e08041..cf7f33b 100644 --- a/Makefile +++ b/Makefile @@ -11,8 +11,14 @@ install: go install -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... gen: + @echo Installing go dependencies + go install \ + github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \ + github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger \ + github.com/golang/protobuf/protoc-gen-go + go mod download @echo Generating rove server gRPC and gateway - protoc --proto_path proto --go_out=plugins=grpc:pkg/ --go_opt=paths=source_relative proto/rove/rove.proto + protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:pkg/ proto/rove/rove.proto protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto @echo Generating rove server swagger protoc --proto_path proto --swagger_out=logtostderr=true:pkg/ proto/rove/rove.proto From a1b79a8df5d406379d0733481359a64933c33643 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 13:08:33 +0100 Subject: [PATCH 328/495] Display diff change --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8388cce..3abb139 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,7 +33,7 @@ jobs: rm -f $PROTOC_ZIP make gen git update-index --refresh - git diff-index --quiet HEAD + git diff-index --quiet HEAD || (git diff; exit 1) - name: Build and Test run: make test From 5b4b9c30eb8cf05fcb4c0173b2f36e6786bd1fc2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 13:13:02 +0100 Subject: [PATCH 329/495] Update rove.pb.go --- pkg/rove/rove.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 70f0191..1c01b4f 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.23.0 +// protoc-gen-go v1.25.0 // protoc v3.6.1 // source: rove/rove.proto From ad13ed8ee2817e145bce5ca6288c49cf9294303b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 13:13:17 +0100 Subject: [PATCH 330/495] Fix git diff check --- .github/workflows/tests.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3abb139..82092a8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,8 +32,7 @@ jobs: sudo chmod -R o+r /usr/local/include/google/ rm -f $PROTOC_ZIP make gen - git update-index --refresh - git diff-index --quiet HEAD || (git diff; exit 1) + git update-index --refresh || (git diff; exit 1) - name: Build and Test run: make test From 3493d51d36d27585e5f492579eba99aecd219557 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 17:45:36 +0100 Subject: [PATCH 331/495] Set the server tick rate to 5 --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 96b1ecd..7109118 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,7 @@ services: - PORT=9090 - DATA_PATH=/mnt/rove-server - WORDS_FILE=data/words_alpha.txt + - TICK_RATE=5 volumes: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] From 3faf709f102fca7db1d0a817309967e5489576a5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 17:58:41 +0100 Subject: [PATCH 332/495] Remove status doc, now tracked on GitHub --- docs/status.md | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 docs/status.md diff --git a/docs/status.md b/docs/status.md deleted file mode 100644 index c9d5f1b..0000000 --- a/docs/status.md +++ /dev/null @@ -1,28 +0,0 @@ -Development status -================ - -This page tracks the current feature set and the features to implement next - -### Current features - -* Users can register and spawn a rover -* The rover can be commanded to move, stash, repair and recharge -* Rover commands use energy -* The rover has a radar function to view nearby terrain and objects -* The server supports multiple users -* The map is populated with terrain and objects -* Rovers take damage and can use collected materials to repair - -### Incoming features - -* Day/night cycle -* Weather cycle -* Deterministic and intelligent world-gen - -### Stretch goals - -* Simple rover to rover communication -* Rover replacement and advancement mechanic -* Dormant rovers -* Render rover camera view -* Account token security \ No newline at end of file From 5928dfdb2083eede2690a43dd0475bbb0ff8dd1f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 18:24:16 +0100 Subject: [PATCH 333/495] Rename the tick variable --- cmd/rove-server/internal/server.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index a80005e..ff98f76 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -36,9 +36,9 @@ type Server struct { grpcServ *grpc.Server // Config settings - address string - persistence int - tick int + address string + persistence int + minutesPerTick int // sync point for sub-threads sync sync.WaitGroup @@ -68,7 +68,7 @@ func OptionPersistentData() ServerOption { // 0 means no automatic server tick func OptionTick(minutes int) ServerOption { return func(s *Server) { - s.tick = minutes + s.minutesPerTick = minutes } } @@ -124,8 +124,8 @@ func (s *Server) Run() { defer s.sync.Done() // Set up the schedule if requested - if s.tick != 0 { - if err := s.schedule.AddFunc(fmt.Sprintf("0 */%d * * *", s.tick), func() { + if s.minutesPerTick != 0 { + if err := s.schedule.AddFunc(fmt.Sprintf("0 */%d * * *", s.minutesPerTick), func() { // Ensure we don't quit during this function s.sync.Add(1) defer s.sync.Done() From 20385c5ae77567a9ebe77a4bdb3798e7b5a582e5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 18:36:20 +0100 Subject: [PATCH 334/495] Add tick tracking to the world --- pkg/game/world.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index cdd8fa1..4358ef3 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -37,6 +37,12 @@ type World struct { // Set of possible words to use for names words []string + + // TicksPerDay is the amount of ticks in a single day + TicksPerDay int + + // Current number of ticks from the start + CurrentTicks int } var wordsFile = os.Getenv("WORDS_FILE") @@ -65,6 +71,8 @@ func NewWorld(chunkSize int) *World { CommandIncoming: make(map[string]CommandStream), Atlas: atlas.NewAtlas(chunkSize), words: lines, + TicksPerDay: 24, + CurrentTicks: 0, } } @@ -436,6 +444,9 @@ func (w *World) ExecuteCommandQueues() { // Add any incoming commands from this tick and clear that queue w.EnqueueAllIncoming() + + // Increment the current tick count + w.CurrentTicks++ } // ExecuteCommand will execute a single command From 526e9c69eb94d7be2328f5874041a4af0137cd30 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 18:37:45 +0100 Subject: [PATCH 335/495] Ensure world tick properties are properly named in json --- pkg/game/world.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index 4358ef3..2792511 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -39,10 +39,10 @@ type World struct { words []string // TicksPerDay is the amount of ticks in a single day - TicksPerDay int + TicksPerDay int `json:"ticks-per-day"` // Current number of ticks from the start - CurrentTicks int + CurrentTicks int `json:"current-ticks"` } var wordsFile = os.Getenv("WORDS_FILE") From 1412579c6c72c457c16e170cb685c50bcb608565 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 18:37:59 +0100 Subject: [PATCH 336/495] Only charge during the day --- pkg/game/world.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index 2792511..a4a70af 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -152,6 +152,11 @@ func (w *World) RoverRecharge(rover string) (int, error) { return 0, fmt.Errorf("Failed to find rover with name: %s", rover) } + // We can only recharge during the day + if !w.Daytime() { + return i.Charge, nil + } + // Add one charge if i.Charge < i.MaximumCharge { i.Charge++ @@ -489,6 +494,13 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { return } +// Daytime returns if it's currently daytime +// for simplicity this uses the 1st half of the day as daytime, the 2nd half as nighttime +func (w *World) Daytime() bool { + tickInDay := w.CurrentTicks % w.TicksPerDay + return tickInDay < w.TicksPerDay/2 +} + // RLock read locks the world func (w *World) RLock() { w.worldMutex.RLock() From 3ba7652c749e21e79283cc769f9504d5b4e3181a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 18:40:38 +0100 Subject: [PATCH 337/495] Add current tick information to the server-status --- cmd/rove-server/internal/routes.go | 7 +- cmd/rove/main.go | 3 +- pkg/rove/rove.pb.go | 111 ++++++++++++++++------------- pkg/rove/rove.swagger.json | 15 ++-- proto/rove/rove.proto | 13 ++-- 5 files changed, 85 insertions(+), 64 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 341c9ee..63b3108 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -12,9 +12,10 @@ import ( // ServerStatus returns the status of the current server to a gRPC request func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove.ServerStatusResponse, error) { response := &rove.ServerStatusResponse{ - Ready: true, - Version: version.Version, - Tick: int32(s.tick), + Ready: true, + Version: version.Version, + TickRate: int32(s.minutesPerTick), + CurrentTick: int32(s.world.CurrentTicks), } // TODO: Verify the accountant is up and ready too diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 7ef4b91..0f1b014 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -175,7 +175,8 @@ func InnerMain(command string, args ...string) error { default: fmt.Printf("Ready: %t\n", response.Ready) fmt.Printf("Version: %s\n", response.Version) - fmt.Printf("Tick: %d\n", response.Tick) + fmt.Printf("Tick Rate: %d\n", response.TickRate) + fmt.Printf("Current Tick: %d\n", response.CurrentTick) fmt.Printf("Next Tick: %s\n", response.NextTick) } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 1c01b4f..a628535 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -670,14 +670,16 @@ type ServerStatusResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The time the next tick will occur - NextTick string `protobuf:"bytes,1,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` + // The version of the server in v{major}.{minor}-{delta}-{sha} form + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` // Whether the server is ready to accept requests Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` // The tick rate of the server in minutes (how many minutes per tick) - Tick int32 `protobuf:"varint,3,opt,name=tick,proto3" json:"tick,omitempty"` - // The version of the server in v{major}.{minor}-{delta}-{sha} form - Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + TickRate int32 `protobuf:"varint,3,opt,name=tickRate,proto3" json:"tickRate,omitempty"` + // The current tick of the server + CurrentTick int32 `protobuf:"varint,4,opt,name=currentTick,proto3" json:"currentTick,omitempty"` + // The time the next tick will occur + NextTick string `protobuf:"bytes,5,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` } func (x *ServerStatusResponse) Reset() { @@ -712,9 +714,9 @@ func (*ServerStatusResponse) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{11} } -func (x *ServerStatusResponse) GetNextTick() string { +func (x *ServerStatusResponse) GetVersion() string { if x != nil { - return x.NextTick + return x.Version } return "" } @@ -726,16 +728,23 @@ func (x *ServerStatusResponse) GetReady() bool { return false } -func (x *ServerStatusResponse) GetTick() int32 { +func (x *ServerStatusResponse) GetTickRate() int32 { if x != nil { - return x.Tick + return x.TickRate } return 0 } -func (x *ServerStatusResponse) GetVersion() string { +func (x *ServerStatusResponse) GetCurrentTick() int32 { if x != nil { - return x.Version + return x.CurrentTick + } + return 0 +} + +func (x *ServerStatusResponse) GetNextTick() string { + if x != nil { + return x.NextTick } return "" } @@ -855,45 +864,47 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x01, 0x79, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, - 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, - 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, + 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, + 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, + 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, + 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 1749dc7..e629dab 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -285,23 +285,28 @@ "roveServerStatusResponse": { "type": "object", "properties": { - "next_tick": { + "version": { "type": "string", - "title": "The time the next tick will occur" + "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" }, "ready": { "type": "boolean", "format": "boolean", "title": "Whether the server is ready to accept requests" }, - "tick": { + "tickRate": { "type": "integer", "format": "int32", "title": "The tick rate of the server in minutes (how many minutes per tick)" }, - "version": { + "currentTick": { + "type": "integer", + "format": "int32", + "title": "The current tick of the server" + }, + "next_tick": { "type": "string", - "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" + "title": "The time the next tick will occur" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 59df2c5..586af22 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -156,17 +156,20 @@ message StatusResponse { message ServerStatusRequest {} message ServerStatusResponse { - // The time the next tick will occur - string next_tick = 1; + // The version of the server in v{major}.{minor}-{delta}-{sha} form + string version = 1; // Whether the server is ready to accept requests bool ready = 2; // The tick rate of the server in minutes (how many minutes per tick) - int32 tick = 3; + int32 tickRate = 3; - // The version of the server in v{major}.{minor}-{delta}-{sha} form - string version = 4; + // The current tick of the server + int32 currentTick = 4; + + // The time the next tick will occur + string next_tick = 5; } message Vector { From 254957cde5e8818305993ea38facd142deac20e7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 21:30:51 +0100 Subject: [PATCH 338/495] Add a test to check daytime and rover recharge --- pkg/game/world_test.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 6e5f7d7..06f659d 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -313,3 +313,40 @@ func TestWorld_Charge(t *testing.T) { } } + +func TestWorld_Daytime(t *testing.T) { + world := NewWorld(1) + + a, err := world.SpawnRover() + assert.NoError(t, err) + + // Remove rover charge + rover := world.Rovers[a] + rover.Charge = 0 + world.Rovers[a] = rover + + // Try and recharge, should work + world.RoverRecharge(a) + assert.Equal(t, 1, world.Rovers[a].Charge) + + // Loop for half the day + for i := 0; i < world.TicksPerDay/2; i++ { + assert.True(t, world.Daytime()) + world.ExecuteCommandQueues() + } + + // Remove rover charge again + rover = world.Rovers[a] + rover.Charge = 0 + world.Rovers[a] = rover + + // Try and recharge, should fail + world.RoverRecharge(a) + assert.Equal(t, 0, world.Rovers[a].Charge) + + // Loop for half the day + for i := 0; i < world.TicksPerDay/2; i++ { + assert.False(t, world.Daytime()) + world.ExecuteCommandQueues() + } +} From 5980de5ba77ce3d10db7bb9352f1cb0ee49ef64f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 21:33:32 +0100 Subject: [PATCH 339/495] Fix lint check --- pkg/game/world_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 06f659d..3e5939e 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -326,7 +326,8 @@ func TestWorld_Daytime(t *testing.T) { world.Rovers[a] = rover // Try and recharge, should work - world.RoverRecharge(a) + _, err = world.RoverRecharge(a) + assert.NoError(t, err) assert.Equal(t, 1, world.Rovers[a].Charge) // Loop for half the day @@ -341,7 +342,8 @@ func TestWorld_Daytime(t *testing.T) { world.Rovers[a] = rover // Try and recharge, should fail - world.RoverRecharge(a) + _, err = world.RoverRecharge(a) + assert.NoError(t, err) assert.Equal(t, 0, world.Rovers[a].Charge) // Loop for half the day From 92222127a61e85e44dcc72f4ce5b947db7ffa139 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 22:20:23 +0100 Subject: [PATCH 340/495] Add basic account security This adds a secret token associated with each account The token must then be sent with follow-up requests to ensure they get accepted This is _very_ basic security, and without TLS is completely vulnerable to MITM attacks, as well as brute force guessing (though it'd take a while to guess the a correct UUID) --- cmd/rove-server-rest-proxy/http_test.go | 54 ++- cmd/rove-server/internal/routes.go | 40 ++- cmd/rove/main.go | 66 ++-- pkg/accounts/accounts.go | 17 +- pkg/rove/rove.pb.go | 425 ++++++++++++++---------- pkg/rove/rove.swagger.json | 23 +- proto/rove/rove.proto | 20 +- 7 files changed, 413 insertions(+), 232 deletions(-) diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go index c17081b..f590f74 100644 --- a/cmd/rove-server-rest-proxy/http_test.go +++ b/cmd/rove-server-rest-proxy/http_test.go @@ -80,47 +80,69 @@ func TestServer_Register(t *testing.T) { func TestServer_Command(t *testing.T) { acc := uuid.New().String() - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + var resp rove.RegisterResponse + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &resp) assert.NoError(t, err, "First register attempt should pass") - err = serv.Request("POST", "command", &rove.CommandRequest{ - Account: acc, + req := &rove.CommandRequest{ + Account: &rove.Account{ + Name: resp.Account.Name, + }, Commands: []*rove.Command{ { Command: "move", Bearing: "NE", }, }, - }, &rove.CommandResponse{}) - assert.NoError(t, err, "Commands should should pass") + } + + assert.Error(t, serv.Request("POST", "command", req, &rove.CommandResponse{}), "Commands should fail with no secret") + + req.Account.Secret = resp.Account.Secret + assert.NoError(t, serv.Request("POST", "command", req, &rove.CommandResponse{}), "Commands should pass") } func TestServer_Radar(t *testing.T) { acc := uuid.New().String() - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + var reg rove.RegisterResponse + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, ®) assert.NoError(t, err, "First register attempt should pass") resp := &rove.RadarResponse{} - err = serv.Request("POST", "radar", &rove.RadarRequest{ - Account: acc, - }, resp) - assert.NoError(t, err, "Radar sould pass should pass") + req := &rove.RadarRequest{ + Account: &rove.Account{ + Name: reg.Account.Name, + }, + } + + assert.Error(t, serv.Request("POST", "radar", req, resp), "Radar should fail without secret") + req.Account.Secret = reg.Account.Secret + + assert.NoError(t, serv.Request("POST", "radar", req, resp), "Radar should pass") assert.NotZero(t, resp.Range, "Radar should return valid range") + w := int(resp.Range*2 + 1) assert.Equal(t, w*w, len(resp.Tiles), "radar should return correct number of tiles") assert.Equal(t, w*w, len(resp.Objects), "radar should return correct number of objects") } -func TestServer_Rover(t *testing.T) { +func TestServer_Status(t *testing.T) { acc := uuid.New().String() - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &rove.RegisterResponse{}) + var reg rove.RegisterResponse + err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, ®) assert.NoError(t, err, "First register attempt should pass") resp := &rove.StatusResponse{} - err = serv.Request("POST", "status", &rove.StatusRequest{ - Account: acc, - }, resp) - assert.NoError(t, err, "Rover sould pass should pass") + req := &rove.StatusRequest{ + Account: &rove.Account{ + Name: reg.Account.Name, + }, + } + + assert.Error(t, serv.Request("POST", "status", req, resp), "Status should fail without secret") + req.Account.Secret = reg.Account.Secret + + assert.NoError(t, serv.Request("POST", "status", req, resp), "Status should pass") assert.NotZero(t, resp.Range, "Rover should return valid range") assert.NotZero(t, len(resp.Name), "Rover should return valid name") assert.NotZero(t, resp.Position, "Rover should return valid position") diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 63b3108..c8d04ef 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -34,7 +34,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove return nil, fmt.Errorf("empty account name") } - if _, err := s.accountant.RegisterAccount(req.Name); err != nil { + if acc, err := s.accountant.RegisterAccount(req.Name); err != nil { return nil, err } else if _, err := s.SpawnRoverForAccount(req.Name); err != nil { @@ -42,17 +42,26 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove } else if err := s.SaveWorld(); err != nil { return nil, fmt.Errorf("internal server error when saving world: %s", err) - } - return &rove.RegisterResponse{}, nil + } else { + return &rove.RegisterResponse{ + Account: &rove.Account{ + Name: acc.Name, + Secret: acc.Data["secret"], + }, + }, nil + } } // Status returns rover information for a gRPC request func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response *rove.StatusResponse, err error) { - if len(req.Account) == 0 { - return nil, fmt.Errorf("empty account name") + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + return nil, err - } else if resp, err := s.accountant.GetValue(req.Account, "rover"); err != nil { + } else if !valid { + return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) + + } else if resp, err := s.accountant.GetValue(req.Account.Name, "rover"); err != nil { return nil, err } else if rover, err := s.world.GetRover(resp); err != nil { @@ -101,13 +110,16 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response // Radar returns the radar information for a rover func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.RadarResponse, error) { - if len(req.Account) == 0 { - return nil, fmt.Errorf("empty account name") + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + return nil, err + + } else if !valid { + return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) } response := &rove.RadarResponse{} - resp, err := s.accountant.GetValue(req.Account, "rover") + resp, err := s.accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err @@ -128,10 +140,14 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar // Command issues commands to the world based on a gRPC request func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.CommandResponse, error) { - if len(req.Account) == 0 { - return nil, fmt.Errorf("empty account") + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + return nil, err + + } else if !valid { + return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) } - resp, err := s.accountant.GetValue(req.Account, "rover") + + resp, err := s.accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 0f1b014..80fe702 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -48,7 +48,8 @@ const gRPCport = 9090 // Account stores data for an account type Account struct { - Name string `json:"name"` + Name string `json:"name"` + Secret string `json:"secret"` } // Config is used to store internal data @@ -114,10 +115,12 @@ func SaveConfig(config Config) error { return nil } -// verifyID will verify an account ID -func verifyID(id string) error { - if len(id) == 0 { +// checkAccount will verify an account ID +func checkAccount(a Account) error { + if len(a.Name) == 0 { return fmt.Errorf("no account ID set, must register first") + } else if len(a.Secret) == 0 { + return fmt.Errorf("empty account secret, must register first") } return nil } @@ -181,26 +184,27 @@ func InnerMain(command string, args ...string) error { } case "register": - if len(args) == 0 { + if len(args) == 0 || len(args[0]) == 0 { return fmt.Errorf("must pass name to 'register'") } - name := args[0] - d := rove.RegisterRequest{ - Name: name, - } - _, err := client.Register(ctx, &d) + resp, err := client.Register(ctx, &rove.RegisterRequest{ + Name: args[0], + }) switch { case err != nil: return err default: - fmt.Printf("Registered account with id: %s\n", name) - config.Account.Name = name + fmt.Printf("Registered account with id: %s\n", resp.Account.Name) + config.Account.Name = resp.Account.Name + config.Account.Secret = resp.Account.Secret } case "command": - if len(args) == 0 { + if err := checkAccount(config.Account); err != nil { + return err + } else if len(args) == 0 { return fmt.Errorf("must pass commands to 'commands'") } @@ -231,16 +235,14 @@ func InnerMain(command string, args ...string) error { } } - d := rove.CommandRequest{ - Account: config.Account.Name, + _, err := client.Command(ctx, &rove.CommandRequest{ + Account: &rove.Account{ + Name: config.Account.Name, + Secret: config.Account.Secret, + }, Commands: commands, - } + }) - if err := verifyID(d.Account); err != nil { - return err - } - - _, err := client.Command(ctx, &d) switch { case err != nil: return err @@ -250,12 +252,17 @@ func InnerMain(command string, args ...string) error { } case "radar": - dat := rove.RadarRequest{Account: config.Account.Name} - if err := verifyID(dat.Account); err != nil { + if err := checkAccount(config.Account); err != nil { return err } - response, err := client.Radar(ctx, &dat) + response, err := client.Radar(ctx, &rove.RadarRequest{ + Account: &rove.Account{ + Name: config.Account.Name, + Secret: config.Account.Secret, + }, + }) + switch { case err != nil: return err @@ -282,11 +289,16 @@ func InnerMain(command string, args ...string) error { } case "status": - req := rove.StatusRequest{Account: config.Account.Name} - if err := verifyID(req.Account); err != nil { + if err := checkAccount(config.Account); err != nil { return err } - response, err := client.Status(ctx, &req) + + response, err := client.Status(ctx, &rove.StatusRequest{ + Account: &rove.Account{ + Name: config.Account.Name, + Secret: config.Account.Secret, + }, + }) switch { case err != nil: diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 3e810fa..08f3ee3 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -3,6 +3,8 @@ package accounts import ( "fmt" "time" + + "github.com/google/uuid" ) // Account represents a registered user @@ -29,7 +31,7 @@ func NewAccountant() *Accountant { // RegisterAccount adds an account to the set of internal accounts func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { - // Set the account name + // Set up the account info acc.Name = name acc.Data = make(map[string]string) @@ -43,12 +45,25 @@ func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { // Set the creation time acc.Data["created"] = time.Now().String() + // Create a secret + acc.Data["secret"] = uuid.New().String() + // Simply add the account to the map a.Accounts[acc.Name] = acc return } +// VerifySecret verifies if an account secret is correct +func (a *Accountant) VerifySecret(account string, secret string) (bool, error) { + // Find the account matching the ID + if this, ok := a.Accounts[account]; ok { + return this.Data["secret"] == secret, nil + } + + return false, fmt.Errorf("no account found for id: %s", account) +} + // AssignData assigns data to an account func (a *Accountant) AssignData(account string, key string, value string) error { diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index a628535..2ef8d33 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -101,7 +101,7 @@ type CommandRequest struct { unknownFields protoimpl.UnknownFields // The account to execute these commands - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The set of desired commands Commands []*Command `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` } @@ -138,11 +138,11 @@ func (*CommandRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{1} } -func (x *CommandRequest) GetAccount() string { +func (x *CommandRequest) GetAccount() *Account { if x != nil { return x.Account } - return "" + return nil } func (x *CommandRequest) GetCommands() []*Command { @@ -245,7 +245,7 @@ type RadarRequest struct { unknownFields protoimpl.UnknownFields // The account for this request - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } func (x *RadarRequest) Reset() { @@ -280,11 +280,11 @@ func (*RadarRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{4} } -func (x *RadarRequest) GetAccount() string { +func (x *RadarRequest) GetAccount() *Account { if x != nil { return x.Account } - return "" + return nil } type RadarResponse struct { @@ -353,45 +353,6 @@ func (x *RadarResponse) GetObjects() []byte { return nil } -// Empty placeholder -type RegisterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RegisterResponse) Reset() { - *x = RegisterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterResponse) ProtoMessage() {} - -func (x *RegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. -func (*RegisterResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{6} -} - type RegisterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -404,7 +365,7 @@ type RegisterRequest struct { func (x *RegisterRequest) Reset() { *x = RegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_rove_rove_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -417,7 +378,7 @@ func (x *RegisterRequest) String() string { func (*RegisterRequest) ProtoMessage() {} func (x *RegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_rove_rove_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -430,7 +391,7 @@ func (x *RegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. func (*RegisterRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{7} + return file_rove_rove_proto_rawDescGZIP(), []int{6} } func (x *RegisterRequest) GetName() string { @@ -440,13 +401,62 @@ func (x *RegisterRequest) GetName() string { return "" } +// Empty placeholder +type RegisterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The registered account information + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` +} + +func (x *RegisterResponse) Reset() { + *x = RegisterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterResponse) ProtoMessage() {} + +func (x *RegisterResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. +func (*RegisterResponse) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{7} +} + +func (x *RegisterResponse) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The account for this request - Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } func (x *StatusRequest) Reset() { @@ -481,11 +491,11 @@ func (*StatusRequest) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{8} } -func (x *StatusRequest) GetAccount() string { +func (x *StatusRequest) GetAccount() *Account { if x != nil { return x.Account } - return "" + return nil } type StatusResponse struct { @@ -804,6 +814,61 @@ func (x *Vector) GetY() int32 { return 0 } +type Account struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` +} + +func (x *Account) Reset() { + *x = Account{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Account) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Account) ProtoMessage() {} + +func (x *Account) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Account.ProtoReflect.Descriptor instead. +func (*Account) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{13} +} + +func (x *Account) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Account) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + var File_rove_rove_proto protoreflect.FileDescriptor var file_rove_rove_proto_rawDesc = []byte{ @@ -814,97 +879,106 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, - 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x28, 0x0a, - 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x12, - 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, - 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, - 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, - 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, - 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, - 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, - 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, + 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, + 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, + 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, + 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, + 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, + 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, + 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -919,7 +993,7 @@ func file_rove_rove_proto_rawDescGZIP() []byte { return file_rove_rove_proto_rawDescData } -var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_rove_rove_proto_goTypes = []interface{}{ (*Command)(nil), // 0: rove.Command (*CommandRequest)(nil), // 1: rove.CommandRequest @@ -927,34 +1001,39 @@ var file_rove_rove_proto_goTypes = []interface{}{ (*Error)(nil), // 3: rove.Error (*RadarRequest)(nil), // 4: rove.RadarRequest (*RadarResponse)(nil), // 5: rove.RadarResponse - (*RegisterResponse)(nil), // 6: rove.RegisterResponse - (*RegisterRequest)(nil), // 7: rove.RegisterRequest + (*RegisterRequest)(nil), // 6: rove.RegisterRequest + (*RegisterResponse)(nil), // 7: rove.RegisterResponse (*StatusRequest)(nil), // 8: rove.StatusRequest (*StatusResponse)(nil), // 9: rove.StatusResponse (*ServerStatusRequest)(nil), // 10: rove.ServerStatusRequest (*ServerStatusResponse)(nil), // 11: rove.ServerStatusResponse (*Vector)(nil), // 12: rove.Vector + (*Account)(nil), // 13: rove.Account } var file_rove_rove_proto_depIdxs = []int32{ - 0, // 0: rove.CommandRequest.commands:type_name -> rove.Command - 12, // 1: rove.StatusResponse.position:type_name -> rove.Vector - 0, // 2: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 0, // 3: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 10, // 4: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 7, // 5: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 6: rove.Rove.Command:input_type -> rove.CommandRequest - 4, // 7: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 8: rove.Rove.Status:input_type -> rove.StatusRequest - 11, // 9: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 6, // 10: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 11: rove.Rove.Command:output_type -> rove.CommandResponse - 5, // 12: rove.Rove.Radar:output_type -> rove.RadarResponse - 9, // 13: rove.Rove.Status:output_type -> rove.StatusResponse - 9, // [9:14] is the sub-list for method output_type - 4, // [4:9] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 13, // 0: rove.CommandRequest.account:type_name -> rove.Account + 0, // 1: rove.CommandRequest.commands:type_name -> rove.Command + 13, // 2: rove.RadarRequest.account:type_name -> rove.Account + 13, // 3: rove.RegisterResponse.account:type_name -> rove.Account + 13, // 4: rove.StatusRequest.account:type_name -> rove.Account + 12, // 5: rove.StatusResponse.position:type_name -> rove.Vector + 0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 10, // 8: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 6, // 9: rove.Rove.Register:input_type -> rove.RegisterRequest + 1, // 10: rove.Rove.Command:input_type -> rove.CommandRequest + 4, // 11: rove.Rove.Radar:input_type -> rove.RadarRequest + 8, // 12: rove.Rove.Status:input_type -> rove.StatusRequest + 11, // 13: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 7, // 14: rove.Rove.Register:output_type -> rove.RegisterResponse + 2, // 15: rove.Rove.Command:output_type -> rove.CommandResponse + 5, // 16: rove.Rove.Radar:output_type -> rove.RadarResponse + 9, // 17: rove.Rove.Status:output_type -> rove.StatusResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_rove_rove_proto_init() } @@ -1036,7 +1115,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterResponse); i { + switch v := v.(*RegisterRequest); i { case 0: return &v.state case 1: @@ -1048,7 +1127,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterRequest); i { + switch v := v.(*RegisterResponse); i { case 0: return &v.state case 1: @@ -1119,6 +1198,18 @@ func file_rove_rove_proto_init() { return nil } } + file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Account); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1126,7 +1217,7 @@ func file_rove_rove_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rove_rove_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index e629dab..392817a 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -207,6 +207,17 @@ } } }, + "roveAccount": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, "roveCommand": { "type": "object", "properties": { @@ -224,7 +235,7 @@ "type": "object", "properties": { "account": { - "type": "string", + "$ref": "#/definitions/roveAccount", "title": "The account to execute these commands" }, "commands": { @@ -244,7 +255,7 @@ "type": "object", "properties": { "account": { - "type": "string", + "$ref": "#/definitions/roveAccount", "title": "The account for this request" } } @@ -280,6 +291,12 @@ }, "roveRegisterResponse": { "type": "object", + "properties": { + "account": { + "$ref": "#/definitions/roveAccount", + "title": "The registered account information" + } + }, "title": "Empty placeholder" }, "roveServerStatusResponse": { @@ -314,7 +331,7 @@ "type": "object", "properties": { "account": { - "type": "string", + "$ref": "#/definitions/roveAccount", "title": "The account for this request" } } diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 586af22..6882d40 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -74,7 +74,7 @@ message Command { message CommandRequest { // The account to execute these commands - string account = 1; + Account account = 1; // The set of desired commands repeated Command commands = 2; @@ -90,7 +90,7 @@ message Error { message RadarRequest { // The account for this request - string account = 1; + Account account = 1; } message RadarResponse { @@ -104,17 +104,20 @@ message RadarResponse { bytes objects = 3; } -// Empty placeholder -message RegisterResponse{} - message RegisterRequest { // The desired account name string name = 1; } +// Empty placeholder +message RegisterResponse{ + // The registered account information + Account account = 1; +} + message StatusRequest { // The account for this request - string account = 1; + Account account = 1; } message StatusResponse { @@ -175,4 +178,9 @@ message ServerStatusResponse { message Vector { int32 x = 1; int32 y = 2; +} + +message Account { + string name = 1; + string secret = 2; } \ No newline at end of file From d9e97ea468a6a45d7455ee5d87eaa7aaf3dbec14 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 22:46:34 +0100 Subject: [PATCH 341/495] Add some additional logging to requests and world resizes --- cmd/rove-server/internal/routes.go | 11 +++++++++-- pkg/atlas/atlas.go | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index c8d04ef..8ec49bc 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -3,6 +3,7 @@ package internal import ( "context" "fmt" + "log" "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" @@ -18,8 +19,6 @@ func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove CurrentTick: int32(s.world.CurrentTicks), } - // TODO: Verify the accountant is up and ready too - // If there's a schedule, respond with it if len(s.schedule.Entries()) > 0 { response.NextTick = s.schedule.Entries()[0].Next.Format("15:04:05") @@ -30,6 +29,8 @@ func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove // Register registers a new account for a gRPC request func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove.RegisterResponse, error) { + log.Printf("Handling register request: %s\n", req.Name) + if len(req.Name) == 0 { return nil, fmt.Errorf("empty account name") } @@ -55,6 +56,8 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove // Status returns rover information for a gRPC request func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response *rove.StatusResponse, err error) { + log.Printf("Handling status request: %s\n", req.Account.Name) + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err @@ -110,6 +113,8 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response // Radar returns the radar information for a rover func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.RadarResponse, error) { + log.Printf("Handling radar request: %s\n", req.Account.Name) + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err @@ -140,6 +145,8 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar // Command issues commands to the world based on a gRPC request func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.CommandResponse, error) { + log.Printf("Handling command request: %s and %+v\n", req.Account.Name, req.Commands) + if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 0840873..2e157b7 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,6 +1,7 @@ package atlas import ( + "log" "math/rand" "github.com/mdiluz/rove/pkg/maths" @@ -218,6 +219,9 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { Chunks: make([]Chunk, size.X*size.Y), } + // Log that we're resizing + log.Printf("Re-allocating world, old: %+v,%+v new: %+v,%+v\n", a.LowerBound, a.UpperBound, newAtlas.LowerBound, newAtlas.UpperBound) + // Copy all old chunks into the new atlas for chunk, chunkData := range a.Chunks { From 3e1e3a5456d5a3c676aa87130e8bc797474bd40e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 22:49:34 +0100 Subject: [PATCH 342/495] Amend to TestWorld_RadarFromRover to show the issue --- pkg/game/world_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 3e5939e..719312a 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -121,6 +121,12 @@ func TestWorld_RadarFromRover(t *testing.T) { // Test the expected values assert.Equal(t, byte(objects.Rover), objs[1+fullRange]) assert.Equal(t, byte(objects.Rover), objs[4+4*fullRange]) + + // Check the radar results are stable + radar1, objs1, err := world.RadarFromRover(a) + radar2, objs2, err := world.RadarFromRover(a) + assert.Equal(t, radar1, radar2) + assert.Equal(t, objs1, objs2) } func TestWorld_RoverStash(t *testing.T) { From 089f5e53374bc25b78d776310da63b7cf79b65d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 22:57:55 +0100 Subject: [PATCH 343/495] Fix chunk empty chunk population in QueryPosition --- pkg/atlas/atlas.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 2e157b7..1c194af 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -84,6 +84,7 @@ func (a *Atlas) QueryPosition(v vector.Vector) (byte, objects.Object) { chunk := a.Chunks[c] if chunk.Tiles == nil { chunk.populate(a.ChunkSize) + a.Chunks[c] = chunk } i := a.chunkTileIndex(local) return chunk.Tiles[i], chunk.Objects[i] From 0386617c519441f82fc55c1de9eafd5515999901 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 7 Jul 2020 23:01:28 +0100 Subject: [PATCH 344/495] Add error checks in TestWorld_RadarFromRover --- pkg/game/world_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 719312a..0246785 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -124,7 +124,9 @@ func TestWorld_RadarFromRover(t *testing.T) { // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) + assert.NoError(t, err) radar2, objs2, err := world.RadarFromRover(a) + assert.NoError(t, err) assert.Equal(t, radar1, radar2) assert.Equal(t, objs1, objs2) } From 10959ef7266018ff3bee284c97f82318fc4e9be1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 8 Jul 2020 19:40:15 +0100 Subject: [PATCH 345/495] Refactor populate to be an Atlas function This simplifies usage greatly --- pkg/atlas/atlas.go | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 1c194af..209d4b7 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -59,7 +59,7 @@ func NewAtlas(chunkSize int) Atlas { UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, } // Initialise the first chunk - a.Chunks[0].populate(chunkSize) + a.populate(0) return a } @@ -81,11 +81,8 @@ func (a *Atlas) SetObject(v vector.Vector, obj objects.Object) { func (a *Atlas) QueryPosition(v vector.Vector) (byte, objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) + a.populate(c) chunk := a.Chunks[c] - if chunk.Tiles == nil { - chunk.populate(a.ChunkSize) - a.Chunks[c] = chunk - } i := a.chunkTileIndex(local) return chunk.Tiles[i], chunk.Objects[i] } @@ -96,8 +93,13 @@ func (a *Atlas) chunkTileIndex(local vector.Vector) int { } // populate will fill a chunk with data -func (c *Chunk) populate(size int) { - c.Tiles = make([]byte, size*size) +func (a *Atlas) populate(chunk int) { + c := a.Chunks[chunk] + if c.Tiles != nil { + return + } + + c.Tiles = make([]byte, a.ChunkSize*a.ChunkSize) c.Objects = make(map[int]objects.Object) // Set up the tiles @@ -117,26 +119,23 @@ func (c *Chunk) populate(size int) { c.Objects[i] = objects.Object{Type: objects.SmallRock} } } + + a.Chunks[chunk] = c } // setTile sets a tile in a specific chunk func (a *Atlas) setTile(chunk int, local vector.Vector, tile byte) { + a.populate(chunk) c := a.Chunks[chunk] - if c.Tiles == nil { - c.populate(a.ChunkSize) - } - c.Tiles[a.chunkTileIndex(local)] = tile a.Chunks[chunk] = c } // setObject sets an object in a specific chunk func (a *Atlas) setObject(chunk int, local vector.Vector, object objects.Object) { - c := a.Chunks[chunk] - if c.Tiles == nil { - c.populate(a.ChunkSize) - } + a.populate(chunk) + c := a.Chunks[chunk] i := a.chunkTileIndex(local) if object.Type != objects.None { c.Objects[i] = object From ed9ecef80a8c6d834d9bf779fc6d53f2298bc2c5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 8 Jul 2020 20:10:28 +0100 Subject: [PATCH 346/495] Add perlin based generation for the terrain tiles --- go.mod | 1 + go.sum | 2 ++ pkg/atlas/atlas.go | 29 +++++++++++++++++++++++------ pkg/atlas/atlas_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2165ade..6c4320a 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/mdiluz/rove go 1.14 require ( + github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28 github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 diff --git a/go.sum b/go.sum index 029b75f..e579bf8 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28 h1:iQUvYFmTKLXaDf3N0YfsJG5vgVtA1La82fHFDkpX5y4= +github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28/go.mod h1:z9Rl7EM4BZY0Ikp2fEN1I5mKSOJ26HQpk0O2TBdN2HE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 209d4b7..c6bcc37 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -4,6 +4,7 @@ import ( "log" "math/rand" + "github.com/aquilax/go-perlin" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" @@ -47,6 +48,9 @@ type Atlas struct { // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` + + // perlin is the current perlin noise generator + perlin *perlin.Perlin } // NewAtlas creates a new empty atlas @@ -57,6 +61,7 @@ func NewAtlas(chunkSize int) Atlas { Chunks: make([]Chunk, 1), LowerBound: vector.Vector{X: 0, Y: 0}, UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, + perlin: perlin.NewPerlin(2, 2, 3, 100), } // Initialise the first chunk a.populate(0) @@ -102,12 +107,23 @@ func (a *Atlas) populate(chunk int) { c.Tiles = make([]byte, a.ChunkSize*a.ChunkSize) c.Objects = make(map[int]objects.Object) - // Set up the tiles - for i := 0; i < len(c.Tiles); i++ { - if rand.Intn(3) == 0 { - c.Tiles[i] = byte(TileRock) - } else { - c.Tiles[i] = byte(TileSand) + origin := a.chunkOriginInWorldSpace(chunk) + for i := 0; i < a.ChunkSize; i++ { + for j := 0; j < a.ChunkSize; j++ { + + // Get the perlin noise value for this location + pl := a.perlin.Noise2D(float64(origin.X+i)/10, float64(origin.Y+j)/10) + + // Choose a tile based on the perlin noise value + var tile Tile + switch { + case pl > 0.1: + tile = TileSand + default: + tile = TileRock + } + + c.Tiles[j*a.ChunkSize+i] = byte(tile) } } @@ -217,6 +233,7 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { LowerBound: lower, UpperBound: upper, Chunks: make([]Chunk, size.X*size.Y), + perlin: a.perlin, } // Log that we're resizing diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 60c3922..dedf4b1 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -1,6 +1,7 @@ package atlas import ( + "fmt" "testing" "github.com/mdiluz/rove/pkg/objects" @@ -248,3 +249,26 @@ func TestAtlas_GetSetCorrect(t *testing.T) { } } } + +func TestAtlas_WorldGen(t *testing.T) { + a := NewAtlas(8) + // Spawn a large world + _, _ = a.QueryPosition(vector.Vector{X: 20, Y: 20}) + + // Print out the world for manual evaluation + num := 20 + for j := num - 1; j >= 0; j-- { + for i := 0; i < num; i++ { + t, o := a.QueryPosition(vector.Vector{X: i, Y: j}) + if o.Type != objects.None { + fmt.Printf("%c", o.Type) + } else if t != byte(TileNone) { + fmt.Printf("%c", t) + } else { + fmt.Printf(" ") + } + + } + fmt.Print("\n") + } +} From 7b4541716abaf4db3eb2365a631a32ddcd91121d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 8 Jul 2020 23:45:52 +0100 Subject: [PATCH 347/495] Add gravel tiles --- pkg/atlas/atlas.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index c6bcc37..144ce93 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -18,10 +18,13 @@ const ( TileNone = Tile(0) // TileRock is solid rock ground - TileRock = Tile('.') + TileRock = Tile('-') + + // TileGravel is loose rocks + TileGravel = Tile(':') // TileSand is sand - TileSand = Tile(',') + TileSand = Tile('~') ) // Chunk represents a fixed square grid of tiles @@ -112,12 +115,14 @@ func (a *Atlas) populate(chunk int) { for j := 0; j < a.ChunkSize; j++ { // Get the perlin noise value for this location - pl := a.perlin.Noise2D(float64(origin.X+i)/10, float64(origin.Y+j)/10) + pl := a.perlin.Noise2D(float64(origin.X+i)/15, float64(origin.Y+j)/15) // Choose a tile based on the perlin noise value var tile Tile switch { - case pl > 0.1: + case pl > 0.2: + tile = TileGravel + case pl > 0.05: tile = TileSand default: tile = TileRock From 4b715bdff3684eab0426932b6a48aa3110ed0634 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 8 Jul 2020 23:58:11 +0100 Subject: [PATCH 348/495] Move to OpenSimplex noise Apart from other benefits, this produces much nicer direction agnostic noise --- go.mod | 2 +- go.sum | 4 ++-- pkg/atlas/atlas.go | 18 +++++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 6c4320a..db01c84 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/mdiluz/rove go 1.14 require ( - github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28 github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/grpc-ecosystem/grpc-gateway v1.14.6 github.com/kr/pretty v0.1.0 // indirect + github.com/ojrac/opensimplex-go v1.0.1 github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.6.0 golang.org/x/net v0.0.0-20200602114024-627f9648deb9 diff --git a/go.sum b/go.sum index e579bf8..a2bd9a2 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28 h1:iQUvYFmTKLXaDf3N0YfsJG5vgVtA1La82fHFDkpX5y4= -github.com/aquilax/go-perlin v0.0.0-20191229124216-0af9ce917c28/go.mod h1:z9Rl7EM4BZY0Ikp2fEN1I5mKSOJ26HQpk0O2TBdN2HE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= @@ -52,6 +50,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/ojrac/opensimplex-go v1.0.1 h1:XslvpLP6XqQSATUtsOnGBYtFPw7FQ6h6y0ihjVeOLHo= +github.com/ojrac/opensimplex-go v1.0.1/go.mod h1:MoSgj04tZpH8U0RefZabnHV2AbLgv/2mo3hLJtWqSEs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 144ce93..0526488 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -4,10 +4,10 @@ import ( "log" "math/rand" - "github.com/aquilax/go-perlin" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" + "github.com/ojrac/opensimplex-go" ) // Tile describes the type of terrain @@ -52,10 +52,14 @@ type Atlas struct { // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` - // perlin is the current perlin noise generator - perlin *perlin.Perlin + // noise is an OpenSimplex noise generator + noise opensimplex.Noise } +const ( + noiseSeed = 1024 +) + // NewAtlas creates a new empty atlas func NewAtlas(chunkSize int) Atlas { // Start up with one chunk @@ -64,7 +68,7 @@ func NewAtlas(chunkSize int) Atlas { Chunks: make([]Chunk, 1), LowerBound: vector.Vector{X: 0, Y: 0}, UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, - perlin: perlin.NewPerlin(2, 2, 3, 100), + noise: opensimplex.New(noiseSeed), } // Initialise the first chunk a.populate(0) @@ -115,12 +119,12 @@ func (a *Atlas) populate(chunk int) { for j := 0; j < a.ChunkSize; j++ { // Get the perlin noise value for this location - pl := a.perlin.Noise2D(float64(origin.X+i)/15, float64(origin.Y+j)/15) + pl := a.noise.Eval2(float64(origin.X+i)/6, float64(origin.Y+j)/6) // Choose a tile based on the perlin noise value var tile Tile switch { - case pl > 0.2: + case pl > 0.5: tile = TileGravel case pl > 0.05: tile = TileSand @@ -238,7 +242,7 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { LowerBound: lower, UpperBound: upper, Chunks: make([]Chunk, size.X*size.Y), - perlin: a.perlin, + noise: a.noise, } // Log that we're resizing From 9682cfa7ea331c265b45c516b32a5ea207bbbf20 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 00:04:46 +0100 Subject: [PATCH 349/495] Spawn objects using OpenSimplex noise as well --- pkg/atlas/atlas.go | 57 ++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 0526488..dd618e7 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -52,23 +52,29 @@ type Atlas struct { // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` - // noise is an OpenSimplex noise generator - noise opensimplex.Noise + // terrainNoise describes the noise function for the terrain + terrainNoise opensimplex.Noise + + // terrainNoise describes the noise function for the terrain + objectNoise opensimplex.Noise } const ( - noiseSeed = 1024 + noiseSeed = 1024 + terrainNoiseScale = 6 + objectNoiseScale = 3 ) // NewAtlas creates a new empty atlas func NewAtlas(chunkSize int) Atlas { // Start up with one chunk a := Atlas{ - ChunkSize: chunkSize, - Chunks: make([]Chunk, 1), - LowerBound: vector.Vector{X: 0, Y: 0}, - UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, - noise: opensimplex.New(noiseSeed), + ChunkSize: chunkSize, + Chunks: make([]Chunk, 1), + LowerBound: vector.Vector{X: 0, Y: 0}, + UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, + terrainNoise: opensimplex.New(noiseSeed), + objectNoise: opensimplex.New(noiseSeed), } // Initialise the first chunk a.populate(0) @@ -118,21 +124,31 @@ func (a *Atlas) populate(chunk int) { for i := 0; i < a.ChunkSize; i++ { for j := 0; j < a.ChunkSize; j++ { - // Get the perlin noise value for this location - pl := a.noise.Eval2(float64(origin.X+i)/6, float64(origin.Y+j)/6) - - // Choose a tile based on the perlin noise value + // Get the terrain noise value for this location + t := a.terrainNoise.Eval2(float64(origin.X+i)/terrainNoiseScale, float64(origin.Y+j)/terrainNoiseScale) var tile Tile switch { - case pl > 0.5: + case t > 0.5: tile = TileGravel - case pl > 0.05: + case t > 0.05: tile = TileSand default: tile = TileRock } - c.Tiles[j*a.ChunkSize+i] = byte(tile) + + // Get the object noise value for this location + o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) + var obj = objects.None + switch { + case o > 0.6: + obj = objects.LargeRock + case o > 0.5: + obj = objects.SmallRock + } + if obj != objects.None { + c.Objects[j*a.ChunkSize+i] = objects.Object{Type: obj} + } } } @@ -238,11 +254,12 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { // Create the new empty atlas newAtlas := Atlas{ - ChunkSize: a.ChunkSize, - LowerBound: lower, - UpperBound: upper, - Chunks: make([]Chunk, size.X*size.Y), - noise: a.noise, + ChunkSize: a.ChunkSize, + LowerBound: lower, + UpperBound: upper, + Chunks: make([]Chunk, size.X*size.Y), + terrainNoise: a.terrainNoise, + objectNoise: a.objectNoise, } // Log that we're resizing From 0dc3cab9c0daa803d1f8822c7abc3aef7bfbc97c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 18:19:49 +0100 Subject: [PATCH 350/495] Store log entries for actions in the rover --- pkg/game/rover.go | 30 +++++++++++++++++++++++++++++- pkg/game/world.go | 10 +++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/pkg/game/rover.go b/pkg/game/rover.go index a7e3fb3..693ba9a 100644 --- a/pkg/game/rover.go +++ b/pkg/game/rover.go @@ -1,10 +1,23 @@ package game import ( + "fmt" + "log" + "time" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) +// RoverLogEntry describes a single log entry for the rover +type RoverLogEntry struct { + // Time is the timestamp of the entry + Time time.Time `json:"time"` + + // Text contains the information in this log entry + Text string `json:"text"` +} + // Rover describes a single rover in the world type Rover struct { // Unique name of this rover @@ -31,6 +44,21 @@ type Rover struct { // Charge is the amount of energy the rover has Charge int `json:"charge"` - // ChargeCharge is the maximum charge able to be stored + // MaximumCharge is the maximum charge able to be stored MaximumCharge int `json:"maximum-Charge"` + + // Logs Stores log of information + Logs []RoverLogEntry `json:"logs"` +} + +// AddLogEntryf adds an entry to the rovers log +func (r *Rover) AddLogEntryf(format string, args ...interface{}) { + text := fmt.Sprintf(format, args...) + log.Printf("%s log entry: %s", r.Name, text) + r.Logs = append(r.Logs, + RoverLogEntry{ + Time: time.Now(), + Text: text, + }, + ) } diff --git a/pkg/game/world.go b/pkg/game/world.go index a4a70af..b53dc7e 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -122,7 +122,8 @@ func (w *World) SpawnRover() (string, error) { } - log.Printf("Spawned rover at %+v\n", rover.Pos) + // Add a log entry for robot creation + rover.AddLogEntryf("created at %+v", rover.Pos) // Append the rover to the list w.Rovers[rover.Name] = rover @@ -160,6 +161,7 @@ func (w *World) RoverRecharge(rover string) (int, error) { // Add one charge if i.Charge < i.MaximumCharge { i.Charge++ + i.AddLogEntryf("recharged to %d", i.Charge) } w.Rovers[rover] = i @@ -239,6 +241,7 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } + i.AddLogEntryf("warped to %+v", pos) i.Pos = pos w.Rovers[rover] = i return nil @@ -266,12 +269,15 @@ func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error // Get the tile and verify it's empty _, obj := w.Atlas.QueryPosition(newPos) if !obj.IsBlocking() { + i.AddLogEntryf("moved %s to %+v", b.String(), newPos) // Perform the move i.Pos = newPos w.Rovers[rover] = i } else { // If it is a blocking tile, reduce the rover integrity + i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 + i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) if i.Integrity == 0 { // TODO: The rover needs to be left dormant with the player } else { @@ -308,6 +314,7 @@ func (w *World) RoverStash(rover string) (objects.Type, error) { return objects.None, nil } + r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r w.Atlas.SetObject(r.Pos, objects.Object{Type: objects.None}) @@ -480,6 +487,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { r.Inventory = r.Inventory[:len(r.Inventory)-1] r.Integrity = r.Integrity + 1 + r.AddLogEntryf("repaired self to %d", r.Integrity) w.Rovers[rover] = r } case CommandRecharge: From 8866f28bf57f5877f3ddce17fcca56038e32ada0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 18:26:24 +0100 Subject: [PATCH 351/495] Add test coverage checks for logging additions --- pkg/game/world_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 0246785..ab9b290 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -41,6 +41,7 @@ func TestWorld_GetRover(t *testing.T) { rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover attribs") assert.NotZero(t, rover.Range, "Rover should not be spawned blind") + assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "created", "Rover logs should contain the creation") } func TestWorld_DestroyRover(t *testing.T) { @@ -87,6 +88,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover information") assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving") + assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) @@ -169,10 +171,11 @@ func TestWorld_RoverStash(t *testing.T) { assert.Equal(t, i+1, len(inv)) assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) - // Check that this didn't reduce the charge + // Check that this did reduce the charge info, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover") assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") + assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "stashed", "Rover logs should contain the move") } // Recharge the rover @@ -220,6 +223,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") + assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "warped", "Rover logs should contain the warp") world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) @@ -230,6 +234,7 @@ func TestWorld_RoverDamage(t *testing.T) { newinfo, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity") + assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision") } func TestWorld_RoverRepair(t *testing.T) { @@ -274,6 +279,7 @@ func TestWorld_RoverRepair(t *testing.T) { newinfo, err = world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") + assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) From b2f169d99f341bbca3f0b4d3bc74d46859d25f37 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 18:31:51 +0100 Subject: [PATCH 352/495] Remove Warped log, unneeded --- pkg/game/world.go | 1 - pkg/game/world_test.go | 1 - 2 files changed, 2 deletions(-) diff --git a/pkg/game/world.go b/pkg/game/world.go index b53dc7e..bd6d806 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -241,7 +241,6 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } - i.AddLogEntryf("warped to %+v", pos) i.Pos = pos w.Rovers[rover] = i return nil diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index ab9b290..c67588a 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -223,7 +223,6 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "warped", "Rover logs should contain the warp") world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) From 55c85d2a2268fb53b932c20b4b41613c5ef7a51c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 19:01:09 +0100 Subject: [PATCH 353/495] Add logs to the rover status output --- cmd/rove-server/internal/routes.go | 9 + pkg/rove/rove.pb.go | 392 ++++++++++++++++++----------- pkg/rove/rove.swagger.json | 21 ++ proto/rove/rove.proto | 12 + 4 files changed, 284 insertions(+), 150 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 8ec49bc..e3f280d 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -8,6 +8,7 @@ import ( "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" + "google.golang.org/protobuf/types/known/timestamppb" ) // ServerStatus returns the status of the current server to a gRPC request @@ -90,6 +91,13 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response Bearing: q.Bearing, }) } + var logs []*rove.Log + for _, log := range rover.Logs { + logs = append(logs, &rove.Log{ + Text: log.Text, + Time: timestamppb.New(log.Time), + }) + } response = &rove.StatusResponse{ Name: rover.Name, @@ -106,6 +114,7 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response MaximumCharge: int32(rover.MaximumCharge), IncomingCommands: incoming, QueuedCommands: queued, + Logs: logs, } } return response, nil diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 2ef8d33..b73e07b 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -13,6 +13,7 @@ package rove import ( context "context" proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -498,6 +499,63 @@ func (x *StatusRequest) GetAccount() *Account { return nil } +type Log struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The timestamp of the log + Time *timestamp.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + // The text of the log + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` +} + +func (x *Log) Reset() { + *x = Log{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Log) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Log) ProtoMessage() {} + +func (x *Log) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Log.ProtoReflect.Descriptor instead. +func (*Log) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{9} +} + +func (x *Log) GetTime() *timestamp.Timestamp { + if x != nil { + return x.Time + } + return nil +} + +func (x *Log) GetText() string { + if x != nil { + return x.Text + } + return "" +} + type StatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -525,12 +583,14 @@ type StatusResponse struct { IncomingCommands []*Command `protobuf:"bytes,10,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` // The set of currently queued commands QueuedCommands []*Command `protobuf:"bytes,11,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` + // The most recent logs + Logs []*Log `protobuf:"bytes,12,rep,name=logs,proto3" json:"logs,omitempty"` } func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -543,7 +603,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -556,7 +616,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{9} + return file_rove_rove_proto_rawDescGZIP(), []int{10} } func (x *StatusResponse) GetName() string { @@ -636,6 +696,13 @@ func (x *StatusResponse) GetQueuedCommands() []*Command { return nil } +func (x *StatusResponse) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + // Empty placeholder type ServerStatusRequest struct { state protoimpl.MessageState @@ -646,7 +713,7 @@ type ServerStatusRequest struct { func (x *ServerStatusRequest) Reset() { *x = ServerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_rove_rove_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -659,7 +726,7 @@ func (x *ServerStatusRequest) String() string { func (*ServerStatusRequest) ProtoMessage() {} func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_rove_rove_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -672,7 +739,7 @@ func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. func (*ServerStatusRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{10} + return file_rove_rove_proto_rawDescGZIP(), []int{11} } type ServerStatusResponse struct { @@ -695,7 +762,7 @@ type ServerStatusResponse struct { func (x *ServerStatusResponse) Reset() { *x = ServerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[11] + mi := &file_rove_rove_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -708,7 +775,7 @@ func (x *ServerStatusResponse) String() string { func (*ServerStatusResponse) ProtoMessage() {} func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[11] + mi := &file_rove_rove_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +788,7 @@ func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. func (*ServerStatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{11} + return file_rove_rove_proto_rawDescGZIP(), []int{12} } func (x *ServerStatusResponse) GetVersion() string { @@ -771,7 +838,7 @@ type Vector struct { func (x *Vector) Reset() { *x = Vector{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[12] + mi := &file_rove_rove_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -784,7 +851,7 @@ func (x *Vector) String() string { func (*Vector) ProtoMessage() {} func (x *Vector) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[12] + mi := &file_rove_rove_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -797,7 +864,7 @@ func (x *Vector) ProtoReflect() protoreflect.Message { // Deprecated: Use Vector.ProtoReflect.Descriptor instead. func (*Vector) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{12} + return file_rove_rove_proto_rawDescGZIP(), []int{13} } func (x *Vector) GetX() int32 { @@ -826,7 +893,7 @@ type Account struct { func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[13] + mi := &file_rove_rove_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -839,7 +906,7 @@ func (x *Account) String() string { func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[13] + mi := &file_rove_rove_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -852,7 +919,7 @@ func (x *Account) ProtoReflect() protoreflect.Message { // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{13} + return file_rove_rove_proto_rawDescGZIP(), []int{14} } func (x *Account) GetName() string { @@ -875,110 +942,119 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, - 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, + 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, - 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, - 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, - 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, - 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, - 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, - 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, - 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, + 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, + 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, + 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x49, 0x0a, 0x03, 0x4c, + 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, + 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, + 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, + 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, + 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, + 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, + 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -993,7 +1069,7 @@ func file_rove_rove_proto_rawDescGZIP() []byte { return file_rove_rove_proto_rawDescData } -var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_rove_rove_proto_goTypes = []interface{}{ (*Command)(nil), // 0: rove.Command (*CommandRequest)(nil), // 1: rove.CommandRequest @@ -1004,36 +1080,40 @@ var file_rove_rove_proto_goTypes = []interface{}{ (*RegisterRequest)(nil), // 6: rove.RegisterRequest (*RegisterResponse)(nil), // 7: rove.RegisterResponse (*StatusRequest)(nil), // 8: rove.StatusRequest - (*StatusResponse)(nil), // 9: rove.StatusResponse - (*ServerStatusRequest)(nil), // 10: rove.ServerStatusRequest - (*ServerStatusResponse)(nil), // 11: rove.ServerStatusResponse - (*Vector)(nil), // 12: rove.Vector - (*Account)(nil), // 13: rove.Account + (*Log)(nil), // 9: rove.Log + (*StatusResponse)(nil), // 10: rove.StatusResponse + (*ServerStatusRequest)(nil), // 11: rove.ServerStatusRequest + (*ServerStatusResponse)(nil), // 12: rove.ServerStatusResponse + (*Vector)(nil), // 13: rove.Vector + (*Account)(nil), // 14: rove.Account + (*timestamp.Timestamp)(nil), // 15: google.protobuf.Timestamp } var file_rove_rove_proto_depIdxs = []int32{ - 13, // 0: rove.CommandRequest.account:type_name -> rove.Account + 14, // 0: rove.CommandRequest.account:type_name -> rove.Account 0, // 1: rove.CommandRequest.commands:type_name -> rove.Command - 13, // 2: rove.RadarRequest.account:type_name -> rove.Account - 13, // 3: rove.RegisterResponse.account:type_name -> rove.Account - 13, // 4: rove.StatusRequest.account:type_name -> rove.Account - 12, // 5: rove.StatusResponse.position:type_name -> rove.Vector - 0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 10, // 8: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 6, // 9: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 10: rove.Rove.Command:input_type -> rove.CommandRequest - 4, // 11: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 12: rove.Rove.Status:input_type -> rove.StatusRequest - 11, // 13: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 7, // 14: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 15: rove.Rove.Command:output_type -> rove.CommandResponse - 5, // 16: rove.Rove.Radar:output_type -> rove.RadarResponse - 9, // 17: rove.Rove.Status:output_type -> rove.StatusResponse - 13, // [13:18] is the sub-list for method output_type - 8, // [8:13] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 14, // 2: rove.RadarRequest.account:type_name -> rove.Account + 14, // 3: rove.RegisterResponse.account:type_name -> rove.Account + 14, // 4: rove.StatusRequest.account:type_name -> rove.Account + 15, // 5: rove.Log.time:type_name -> google.protobuf.Timestamp + 13, // 6: rove.StatusResponse.position:type_name -> rove.Vector + 0, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 0, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 9, // 9: rove.StatusResponse.logs:type_name -> rove.Log + 11, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 6, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest + 1, // 12: rove.Rove.Command:input_type -> rove.CommandRequest + 4, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest + 8, // 14: rove.Rove.Status:input_type -> rove.StatusRequest + 12, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 7, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse + 2, // 17: rove.Rove.Command:output_type -> rove.CommandResponse + 5, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse + 10, // 19: rove.Rove.Status:output_type -> rove.StatusResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_rove_rove_proto_init() } @@ -1151,7 +1231,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse); i { + switch v := v.(*Log); i { case 0: return &v.state case 1: @@ -1163,7 +1243,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerStatusRequest); i { + switch v := v.(*StatusResponse); i { case 0: return &v.state case 1: @@ -1175,7 +1255,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerStatusResponse); i { + switch v := v.(*ServerStatusRequest); i { case 0: return &v.state case 1: @@ -1187,7 +1267,7 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Vector); i { + switch v := v.(*ServerStatusResponse); i { case 0: return &v.state case 1: @@ -1199,6 +1279,18 @@ func file_rove_rove_proto_init() { } } file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state @@ -1217,7 +1309,7 @@ func file_rove_rove_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rove_rove_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 392817a..5cb3734 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -251,6 +251,20 @@ "type": "object", "title": "Empty placeholder" }, + "roveLog": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time", + "title": "The timestamp of the log" + }, + "text": { + "type": "string", + "title": "The text of the log" + } + } + }, "roveRadarRequest": { "type": "object", "properties": { @@ -395,6 +409,13 @@ "$ref": "#/definitions/roveCommand" }, "title": "The set of currently queued commands" + }, + "logs": { + "type": "array", + "items": { + "$ref": "#/definitions/roveLog" + }, + "title": "The most recent logs" } } }, diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 6882d40..74eb69e 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -8,6 +8,7 @@ package rove; option go_package = "github.com/mdiluz/rove/pkg/rove"; import "google/api/annotations.proto"; +import "google/protobuf/timestamp.proto"; service Rove { // Server status @@ -120,6 +121,14 @@ message StatusRequest { Account account = 1; } +message Log { + // The timestamp of the log + google.protobuf.Timestamp time = 1; + + // The text of the log + string text = 2; +} + message StatusResponse { // The name of the rover string name = 1; @@ -153,6 +162,9 @@ message StatusResponse { // The set of currently queued commands repeated Command queuedCommands = 11; + + // The most recent logs + repeated Log logs = 12; } // Empty placeholder From b748846c55c8383cfa3d29e34cea69ea0c33ba95 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 19:29:04 +0100 Subject: [PATCH 354/495] Use a unix timestamp rather than a timestamppb --- cmd/rove-server/internal/routes.go | 3 +- pkg/rove/rove.pb.go | 265 ++++++++++++++--------------- pkg/rove/rove.swagger.json | 4 +- proto/rove/rove.proto | 5 +- 4 files changed, 134 insertions(+), 143 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index e3f280d..1079a9d 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -8,7 +8,6 @@ import ( "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" - "google.golang.org/protobuf/types/known/timestamppb" ) // ServerStatus returns the status of the current server to a gRPC request @@ -95,7 +94,7 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response for _, log := range rover.Logs { logs = append(logs, &rove.Log{ Text: log.Text, - Time: timestamppb.New(log.Time), + Time: log.Time.Unix(), }) } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index b73e07b..eeaeba6 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -13,7 +13,6 @@ package rove import ( context "context" proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -504,8 +503,8 @@ type Log struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The timestamp of the log - Time *timestamp.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + // The unix timestamp of the log + Time int64 `protobuf:"varint,1,opt,name=time,proto3" json:"time,omitempty"` // The text of the log Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` } @@ -542,11 +541,11 @@ func (*Log) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{9} } -func (x *Log) GetTime() *timestamp.Timestamp { +func (x *Log) GetTime() int64 { if x != nil { return x.Time } - return nil + return 0 } func (x *Log) GetText() string { @@ -942,119 +941,115 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, - 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, + 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, - 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, - 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, - 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x49, 0x0a, 0x03, 0x4c, - 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, - 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, - 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, - 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, - 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, - 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, - 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, - 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, - 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, + 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, + 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, + 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, + 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, + 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, + 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, + 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, + 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1086,7 +1081,6 @@ var file_rove_rove_proto_goTypes = []interface{}{ (*ServerStatusResponse)(nil), // 12: rove.ServerStatusResponse (*Vector)(nil), // 13: rove.Vector (*Account)(nil), // 14: rove.Account - (*timestamp.Timestamp)(nil), // 15: google.protobuf.Timestamp } var file_rove_rove_proto_depIdxs = []int32{ 14, // 0: rove.CommandRequest.account:type_name -> rove.Account @@ -1094,26 +1088,25 @@ var file_rove_rove_proto_depIdxs = []int32{ 14, // 2: rove.RadarRequest.account:type_name -> rove.Account 14, // 3: rove.RegisterResponse.account:type_name -> rove.Account 14, // 4: rove.StatusRequest.account:type_name -> rove.Account - 15, // 5: rove.Log.time:type_name -> google.protobuf.Timestamp - 13, // 6: rove.StatusResponse.position:type_name -> rove.Vector - 0, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 0, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 9, // 9: rove.StatusResponse.logs:type_name -> rove.Log - 11, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 6, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 12: rove.Rove.Command:input_type -> rove.CommandRequest - 4, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 14: rove.Rove.Status:input_type -> rove.StatusRequest - 12, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 7, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 17: rove.Rove.Command:output_type -> rove.CommandResponse - 5, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse - 10, // 19: rove.Rove.Status:output_type -> rove.StatusResponse - 15, // [15:20] is the sub-list for method output_type - 10, // [10:15] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 13, // 5: rove.StatusResponse.position:type_name -> rove.Vector + 0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 9, // 8: rove.StatusResponse.logs:type_name -> rove.Log + 11, // 9: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 6, // 10: rove.Rove.Register:input_type -> rove.RegisterRequest + 1, // 11: rove.Rove.Command:input_type -> rove.CommandRequest + 4, // 12: rove.Rove.Radar:input_type -> rove.RadarRequest + 8, // 13: rove.Rove.Status:input_type -> rove.StatusRequest + 12, // 14: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 7, // 15: rove.Rove.Register:output_type -> rove.RegisterResponse + 2, // 16: rove.Rove.Command:output_type -> rove.CommandResponse + 5, // 17: rove.Rove.Radar:output_type -> rove.RadarResponse + 10, // 18: rove.Rove.Status:output_type -> rove.StatusResponse + 14, // [14:19] is the sub-list for method output_type + 9, // [9:14] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_rove_rove_proto_init() } diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 5cb3734..a28fee0 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -256,8 +256,8 @@ "properties": { "time": { "type": "string", - "format": "date-time", - "title": "The timestamp of the log" + "format": "int64", + "title": "The unix timestamp of the log" }, "text": { "type": "string", diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 74eb69e..c49e2d8 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -8,7 +8,6 @@ package rove; option go_package = "github.com/mdiluz/rove/pkg/rove"; import "google/api/annotations.proto"; -import "google/protobuf/timestamp.proto"; service Rove { // Server status @@ -122,8 +121,8 @@ message StatusRequest { } message Log { - // The timestamp of the log - google.protobuf.Timestamp time = 1; + // The unix timestamp of the log + int64 time = 1; // The text of the log string text = 2; From 30ca488890d75802e10336f61b7a811e38473b16 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 19:38:23 +0100 Subject: [PATCH 355/495] Use string for the timestamp, proto uses this under the hood anyway https://github.com/grpc-ecosystem/grpc-gateway/issues/438 --- cmd/rove-server/internal/routes.go | 2 +- pkg/rove/rove.pb.go | 8 ++++---- pkg/rove/rove.swagger.json | 1 - proto/rove/rove.proto | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 1079a9d..5236a52 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -94,7 +94,7 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response for _, log := range rover.Logs { logs = append(logs, &rove.Log{ Text: log.Text, - Time: log.Time.Unix(), + Time: fmt.Sprintf("%d", log.Time.Unix()), // proto uses strings under the hood for 64bit ints anyway }) } diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index eeaeba6..e38875d 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -504,7 +504,7 @@ type Log struct { unknownFields protoimpl.UnknownFields // The unix timestamp of the log - Time int64 `protobuf:"varint,1,opt,name=time,proto3" json:"time,omitempty"` + Time string `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` // The text of the log Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` } @@ -541,11 +541,11 @@ func (*Log) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{9} } -func (x *Log) GetTime() int64 { +func (x *Log) GetTime() string { if x != nil { return x.Time } - return 0 + return "" } func (x *Log) GetText() string { @@ -974,7 +974,7 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, - 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index a28fee0..5575c89 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -256,7 +256,6 @@ "properties": { "time": { "type": "string", - "format": "int64", "title": "The unix timestamp of the log" }, "text": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index c49e2d8..70b766c 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -122,7 +122,7 @@ message StatusRequest { message Log { // The unix timestamp of the log - int64 time = 1; + string time = 1; // The text of the log string text = 2; From d4d82c38e08057f6e43b409392b4451100248a71 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 22:05:12 +0100 Subject: [PATCH 356/495] Add "broadcast" command This will send a readable ascii triplet to all rovers in range --- pkg/game/command.go | 6 +++++ pkg/game/world.go | 47 +++++++++++++++++++++++++++++++++ pkg/game/world_test.go | 60 ++++++++++++++++++++++++++++++++++++++++++ proto/rove/rove.proto | 9 +++++-- 4 files changed, 120 insertions(+), 2 deletions(-) diff --git a/pkg/game/command.go b/pkg/game/command.go index 11428c3..96f95d8 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -12,6 +12,9 @@ const ( // CommandRecharge Will use one tick to charge the rover CommandRecharge = "recharge" + + // CommandBroadcast will broadcast a message to nearby rovers within range + CommandBroadcast = "broadcast" ) // Command represends a single command to execute @@ -20,6 +23,9 @@ type Command struct { // Used in the move command Bearing string `json:"bearing,omitempty"` + + // Used in the broadcast command + Message []byte `json:"message,omitempty"` } // CommandStream is a list of commands to execute in order diff --git a/pkg/game/world.go b/pkg/game/world.go index bd6d806..a48bea0 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -168,6 +168,40 @@ func (w *World) RoverRecharge(rover string) (int, error) { return i.Charge, nil } +// RoverBroadcast broadcasts a message to nearby rovers +func (w *World) RoverBroadcast(rover string, message []byte) (err error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + i, ok := w.Rovers[rover] + if !ok { + return fmt.Errorf("Failed to find rover with name: %s", rover) + } + + // Use up a charge as needed, if available + if i.Charge == 0 { + return + } + i.Charge-- + + // Check all rovers + for r, rover := range w.Rovers { + if rover.Name == i.Name { + continue + } + + // Check if this rover is within range + if i.Pos.Distance(rover.Pos) < float64(i.Range) { + rover.AddLogEntryf("recieved %s from %s", string(message), i.Name) + w.Rovers[r] = rover + } + } + + i.AddLogEntryf("broadcasted %s", string(message)) + w.Rovers[rover] = i + return +} + // DestroyRover Removes an rover from the game func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() @@ -399,6 +433,15 @@ func (w *World) Enqueue(rover string, commands ...Command) error { if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } + case CommandBroadcast: + if len(c.Message) > 3 { + return fmt.Errorf("too many characters in message (limit 3): %d", len(c.Message)) + } + for _, b := range c.Message { + if b < 37 || b > 126 { + return fmt.Errorf("invalid message character: %c", b) + } + } case CommandStash: case CommandRepair: case CommandRecharge: @@ -494,6 +537,10 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { if err != nil { return err } + case CommandBroadcast: + if err := w.RoverBroadcast(rover, c.Message); err != nil { + return err + } default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index c67588a..c9654c5 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -365,3 +365,63 @@ func TestWorld_Daytime(t *testing.T) { world.ExecuteCommandQueues() } } + +func TestWorld_Broadcast(t *testing.T) { + world := NewWorld(8) + + a, err := world.SpawnRover() + assert.NoError(t, err) + + b, err := world.SpawnRover() + assert.NoError(t, err) + + // Warp rovers near to eachother + assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0})) + assert.NoError(t, world.WarpRover(b, vector.Vector{X: 1, Y: 0})) + + // Broadcast from a + assert.NoError(t, world.RoverBroadcast(a, []byte{'A', 'B', 'C'})) + + // Check if b heard it + ra, err := world.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, ra.MaximumCharge-1, ra.Charge, "A should have used a charge to broadcast") + assert.Contains(t, ra.Logs[len(ra.Logs)-1].Text, "ABC", "Rover B should have heard the broadcast") + + // Check if a logged it + rb, err := world.GetRover(b) + assert.NoError(t, err) + assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") + + // Warp B outside of the range of A + assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range, Y: 0})) + + // Broadcast from a again + assert.NoError(t, world.RoverBroadcast(a, []byte{'X', 'Y', 'Z'})) + + // Check if b heard it + ra, err = world.GetRover(b) + assert.NoError(t, err) + assert.NotContains(t, ra.Logs[len(ra.Logs)-1].Text, "XYZ", "Rover B should not have heard the broadcast") + + // Check if a logged it + rb, err = world.GetRover(a) + assert.NoError(t, err) + assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") + + // Warp B outside of the range of A + assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range + 1, Y: 0})) + + // Broadcast from a again + assert.NoError(t, world.RoverBroadcast(a, []byte{'H', 'J', 'K'})) + + // Check if b heard it + ra, err = world.GetRover(b) + assert.NoError(t, err) + assert.NotContains(t, ra.Logs[len(ra.Logs)-1].Text, "HJK", "Rover B should have heard the broadcast") + + // Check if a logged it + rb, err = world.GetRover(a) + assert.NoError(t, err) + assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "HJK", "Rover A should have logged it's broadcast") +} diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index 70b766c..d643e9c 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -66,10 +66,15 @@ message Command { // "stash" - Stashes item at current location in rover inventory // "repair" - Repairs the rover using an inventory object // "recharge" - Waits a tick to add more charge to the rover + // "broadcast" - Broadcasts a message to nearby rovers string command = 1; - // The bearing, example: NE + // A bearing, example: NE string bearing = 2; + + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + bytes message = 3; } message CommandRequest { @@ -135,7 +140,7 @@ message StatusResponse { // Position of the rover in world coordinates Vector position = 2; - // The range of this rover's radar + // The range of this rover's radar and broadcasting int32 range = 3; // The items in the rover inventory From e21023ec250b82e569c69dd0fe704c4e1828389d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 22:12:13 +0100 Subject: [PATCH 357/495] Update generated files --- pkg/rove/rove.pb.go | 223 ++++++++++++++++++++----------------- pkg/rove/rove.swagger.json | 11 +- 2 files changed, 126 insertions(+), 108 deletions(-) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index e38875d..19fa01d 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -44,9 +44,13 @@ type Command struct { // "stash" - Stashes item at current location in rover inventory // "repair" - Repairs the rover using an inventory object // "recharge" - Waits a tick to add more charge to the rover + // "broadcast" - Broadcasts a message to nearby rovers Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` - // The bearing, example: NE + // A bearing, example: NE Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + Message []byte `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` } func (x *Command) Reset() { @@ -95,6 +99,13 @@ func (x *Command) GetBearing() string { return "" } +func (x *Command) GetMessage() []byte { + if x != nil { + return x.Message + } + return nil +} + type CommandRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -564,7 +575,7 @@ type StatusResponse struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Position of the rover in world coordinates Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` - // The range of this rover's radar + // The range of this rover's radar and broadcasting Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` // The items in the rover inventory Inventory []byte `protobuf:"bytes,4,opt,name=inventory,proto3" json:"inventory,omitempty"` @@ -941,115 +952,117 @@ var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x57, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x64, + 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, - 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, + 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, - 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, - 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, - 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, - 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, - 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, - 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, - 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, - 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, - 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, - 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, + 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, + 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, + 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, + 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, + 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, + 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, + 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, + 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index 5575c89..e4dcbee 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -223,11 +223,16 @@ "properties": { "command": { "type": "string", - "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object\n\"recharge\" - Waits a tick to add more charge to the rover" + "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object\n\"recharge\" - Waits a tick to add more charge to the rover\n\"broadcast\" - Broadcasts a message to nearby rovers" }, "bearing": { "type": "string", - "title": "The bearing, example: NE" + "title": "A bearing, example: NE" + }, + "message": { + "type": "string", + "format": "byte", + "title": "A simple message, must be composed of printable ASCII glyphs (32-126)\nmaximum of three characters" } } }, @@ -363,7 +368,7 @@ "range": { "type": "integer", "format": "int32", - "title": "The range of this rover's radar" + "title": "The range of this rover's radar and broadcasting" }, "inventory": { "type": "string", From 091469dd91d263483f2c3c12d5fd4693c72b40a8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 22:37:55 +0100 Subject: [PATCH 358/495] Add broadcast command to the cmdline client --- cmd/rove/main.go | 14 ++++++++++++++ cmd/rove/main_test.go | 2 ++ 2 files changed, 16 insertions(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 80fe702..059052d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -40,6 +40,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\trecharge wait a tick to recharge the rover") + fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } @@ -225,6 +226,19 @@ func InnerMain(command string, args ...string) error { Bearing: args[i], }, ) + case "broadcast": + i++ + if len(args) == i { + return fmt.Errorf("broadcast command must be passed an ASCII triplet") + } else if len(args[i]) > 3 { + return fmt.Errorf("broadcast command must be given ASCII triplet of 3 or less: %s", args[i]) + } + commands = append(commands, + &rove.Command{ + Command: game.CommandBroadcast, + Message: []byte(args[i]), + }, + ) default: // By default just use the command literally commands = append(commands, diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 6f90fcd..dd588e1 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -53,7 +53,9 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "move", "N")) assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) + assert.NoError(t, InnerMain("command", "broadcast", "abc")) // Give it malformed commands assert.Error(t, InnerMain("command", "move", "stash")) + assert.Error(t, InnerMain("command", "broadcast")) } From b032fdbfe2938d5b2d59c3d307ec8bc0e31ccaff Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 22:52:58 +0100 Subject: [PATCH 359/495] Fix missing broadcast message in status reply --- cmd/rove-server/internal/routes.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 5236a52..702d227 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -82,12 +82,14 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response incoming = append(incoming, &rove.Command{ Command: i.Command, Bearing: i.Bearing, + Message: i.Message, }) } for _, q := range q { queued = append(queued, &rove.Command{ Command: q.Command, Bearing: q.Bearing, + Message: q.Message, }) } var logs []*rove.Log From 59a1bdc14bd31b249c24db54a4fba08ed3415ba4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 9 Jul 2020 23:15:33 +0100 Subject: [PATCH 360/495] Update launch.json Remove old comments --- .vscode/launch.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 539f842..57d654f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,7 +1,4 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { @@ -27,4 +24,4 @@ "args": ["radar"], } ] -} \ No newline at end of file +} From 7d780d05bd75f48b41bc0d0f69c6181eed34ee09 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 00:12:35 +0100 Subject: [PATCH 361/495] De-scope - remove swagger docs and http proxy HTTP proxy was becoming annoying to maintain, and gRPC is easier to use anyway swagger docs are just part of the fallout --- Dockerfile | 1 - Makefile | 2 -- docker-compose.yml | 28 ++-------------------------- snap/snapcraft.yaml | 10 +--------- 4 files changed, 3 insertions(+), 38 deletions(-) diff --git a/Dockerfile b/Dockerfile index f5a1f4b..74b87c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,6 @@ RUN go mod download # Build the executables RUN go build -o rove -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove/main.go RUN go build -o rove-server -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=$(git describe --always --long --dirty --tags)'" cmd/rove-server/main.go -RUN go build -o rove-server-rest-proxy cmd/rove-server-rest-proxy/main.go CMD [ "./rove-server" ] diff --git a/Makefile b/Makefile index cf7f33b..0ef8cd7 100644 --- a/Makefile +++ b/Makefile @@ -20,8 +20,6 @@ gen: @echo Generating rove server gRPC and gateway protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:pkg/ proto/rove/rove.proto protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto - @echo Generating rove server swagger - protoc --proto_path proto --swagger_out=logtostderr=true:pkg/ proto/rove/rove.proto test: @echo Unit tests diff --git a/docker-compose.yml b/docker-compose.yml index 7109118..71013b5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,16 +4,6 @@ volumes: persistent-data: services: - rove-docs: - build: - context: . - dockerfile: Dockerfile.docs - image: rove-docs:latest - ports: - - "80:80" - environment: - - PORT=80 - rove-server: build: context: . @@ -30,29 +20,15 @@ services: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] - rove: - depends_on: [ rove-server, rove-docs ] - build: - context: . - dockerfile: Dockerfile - image: rove:latest - ports: - - "8080:8080" - environment: - - PORT=8080 - - ROVE_GRPC=rove-server:9090 - command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "./rove-server-rest-proxy" ] - rove-tests: - depends_on: [ rove ] + depends_on: [ rove-server ] build: context: . dockerfile: Dockerfile image: rove:latest environment: - - ROVE_HTTP=rove - ROVE_GRPC=rove-server - command: [ "./script/wait-for-it.sh", "rove:8080", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] + command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] volumes: - /tmp/coverage-data:/mnt/coverage-data:rw diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index fb83f33..86a2118 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -27,15 +27,7 @@ apps: environment: WORDS_FILE : "$SNAP/data/words_alpha.txt" DATA_PATH : $SNAP_USER_DATA - - rove-rest-server: - command: bin/rove-server-rest-proxy - plugs: - - network - - network-bind - environment: - DATA_PATH : $SNAP_USER_DATA - + parts: go-rove: plugin: go From 96a137ad2f39a255d93eba1541515fa4134eb207 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 00:12:54 +0100 Subject: [PATCH 362/495] Simplify - remove duplicate command types in favor of a better defined Command type in proto --- cmd/rove-server/internal/routes.go | 47 +++- cmd/rove/main.go | 11 +- pkg/game/command.go | 19 +- pkg/game/command_test.go | 7 +- pkg/game/world.go | 21 +- pkg/game/world_test.go | 5 +- pkg/rove/rove.pb.go | 429 +++++++++++++++++------------ pkg/rove/rove.swagger.json | 227 ++------------- proto/rove/rove.proto | 75 +++-- 9 files changed, 370 insertions(+), 471 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 702d227..e533cbf 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -79,18 +79,36 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response i, q := s.world.RoverCommands(resp) var incoming, queued []*rove.Command for _, i := range i { - incoming = append(incoming, &rove.Command{ + c := &rove.Command{ Command: i.Command, - Bearing: i.Bearing, - Message: i.Message, - }) + } + switch i.Command { + case rove.CommandType_move: + c.Data = &rove.Command_Bearing{ + Bearing: i.Bearing, + } + case rove.CommandType_broadcast: + c.Data = &rove.Command_Message{ + Message: i.Message, + } + } + incoming = append(incoming, c) } for _, q := range q { - queued = append(queued, &rove.Command{ + c := &rove.Command{ Command: q.Command, - Bearing: q.Bearing, - Message: q.Message, - }) + } + switch q.Command { + case rove.CommandType_move: + c.Data = &rove.Command_Bearing{ + Bearing: q.Bearing, + } + case rove.CommandType_broadcast: + c.Data = &rove.Command_Message{ + Message: q.Message, + } + } + queued = append(queued, c) } var logs []*rove.Log for _, log := range rover.Logs { @@ -171,9 +189,16 @@ func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.C var cmds []game.Command for _, c := range req.Commands { - cmds = append(cmds, game.Command{ - Bearing: c.Bearing, - Command: c.Command}) + n := game.Command{ + Command: c.Command, + } + switch c.Command { + case rove.CommandType_move: + n.Bearing = c.GetBearing() + case rove.CommandType_broadcast: + n.Message = c.GetMessage() + } + cmds = append(cmds, n) } if err := s.world.Enqueue(resp, cmds...); err != nil { diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 059052d..5f51e32 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -12,7 +12,6 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" - "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" @@ -222,8 +221,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &rove.Command{ - Command: game.CommandMove, - Bearing: args[i], + Command: rove.CommandType_move, + Data: &rove.Command_Bearing{Bearing: args[i]}, }, ) case "broadcast": @@ -235,15 +234,15 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &rove.Command{ - Command: game.CommandBroadcast, - Message: []byte(args[i]), + Command: rove.CommandType_broadcast, + Data: &rove.Command_Message{Message: []byte(args[i])}, }, ) default: // By default just use the command literally commands = append(commands, &rove.Command{ - Command: args[i], + Command: rove.CommandType(rove.CommandType_value[args[i]]), }, ) } diff --git a/pkg/game/command.go b/pkg/game/command.go index 96f95d8..b57f678 100644 --- a/pkg/game/command.go +++ b/pkg/game/command.go @@ -1,25 +1,10 @@ package game -const ( - // CommandMove Moves the rover in the chosen bearing - CommandMove = "move" - - // CommandStash Will attempt to stash the object at the current location - CommandStash = "stash" - - // CommandRepair Will attempt to repair the rover with an inventory object - CommandRepair = "repair" - - // CommandRecharge Will use one tick to charge the rover - CommandRecharge = "recharge" - - // CommandBroadcast will broadcast a message to nearby rovers within range - CommandBroadcast = "broadcast" -) +import "github.com/mdiluz/rove/pkg/rove" // Command represends a single command to execute type Command struct { - Command string `json:"command"` + Command rove.CommandType `json:"command"` // Used in the move command Bearing string `json:"bearing,omitempty"` diff --git a/pkg/game/command_test.go b/pkg/game/command_test.go index 45cb182..10ccbe5 100644 --- a/pkg/game/command_test.go +++ b/pkg/game/command_test.go @@ -3,6 +3,7 @@ package game import ( "testing" + "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -20,7 +21,7 @@ func TestCommand_Move(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Try the move command - moveCommand := Command{Command: CommandMove, Bearing: "N"} + moveCommand := Command{Command: rove.CommandType_move, Bearing: "N"} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world @@ -46,7 +47,7 @@ func TestCommand_Recharge(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Move to use up some charge - moveCommand := Command{Command: CommandMove, Bearing: "N"} + moveCommand := Command{Command: rove.CommandType_move, Bearing: "N"} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to queue move command") // Tick the world @@ -56,7 +57,7 @@ func TestCommand_Recharge(t *testing.T) { rover, _ := world.GetRover(a) assert.Equal(t, rover.MaximumCharge-1, rover.Charge) - chargeCommand := Command{Command: CommandRecharge} + chargeCommand := Command{Command: rove.CommandType_recharge} assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue recharge command") // Tick the world diff --git a/pkg/game/world.go b/pkg/game/world.go index a48bea0..19183f5 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -12,6 +12,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" + "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/vector" ) @@ -429,11 +430,11 @@ func (w *World) Enqueue(rover string, commands ...Command) error { // First validate the commands for _, c := range commands { switch c.Command { - case CommandMove: + case rove.CommandType_move: if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } - case CommandBroadcast: + case rove.CommandType_broadcast: if len(c.Message) > 3 { return fmt.Errorf("too many characters in message (limit 3): %d", len(c.Message)) } @@ -442,9 +443,9 @@ func (w *World) Enqueue(rover string, commands ...Command) error { return fmt.Errorf("invalid message character: %c", b) } } - case CommandStash: - case CommandRepair: - case CommandRecharge: + case rove.CommandType_stash: + case rove.CommandType_repair: + case rove.CommandType_recharge: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -508,19 +509,19 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { log.Printf("Executing command: %+v for %s\n", *c, rover) switch c.Command { - case CommandMove: + case rove.CommandType_move: if dir, err := bearing.FromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err } - case CommandStash: + case rove.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { return err } - case CommandRepair: + case rove.CommandType_repair: r, err := w.GetRover(rover) if err != nil { return err @@ -532,12 +533,12 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { r.AddLogEntryf("repaired self to %d", r.Integrity) w.Rovers[rover] = r } - case CommandRecharge: + case rove.CommandType_recharge: _, err := w.RoverRecharge(rover) if err != nil { return err } - case CommandBroadcast: + case rove.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.Message); err != nil { return err } diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index c9654c5..35c0a22 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -6,6 +6,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" + "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -272,7 +273,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") - err = world.ExecuteCommand(&Command{Command: CommandRepair}, a) + err = world.ExecuteCommand(&Command{Command: rove.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) @@ -286,7 +287,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - err = world.ExecuteCommand(&Command{Command: CommandRepair}, a) + err = world.ExecuteCommand(&Command{Command: rove.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 19fa01d..12bfce1 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -13,7 +13,6 @@ package rove import ( context "context" proto "github.com/golang/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -34,23 +33,80 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +type CommandType int32 + +const ( + CommandType_none CommandType = 0 + // Move the rover in a direction, requires bearing + CommandType_move CommandType = 1 + // Stashes item at current location in rover inventory + CommandType_stash CommandType = 2 + // Repairs the rover using an inventory object + CommandType_repair CommandType = 3 + // Waits a tick to add more charge to the rover + CommandType_recharge CommandType = 4 + // Broadcasts a message to nearby rovers + CommandType_broadcast CommandType = 5 +) + +// Enum value maps for CommandType. +var ( + CommandType_name = map[int32]string{ + 0: "none", + 1: "move", + 2: "stash", + 3: "repair", + 4: "recharge", + 5: "broadcast", + } + CommandType_value = map[string]int32{ + "none": 0, + "move": 1, + "stash": 2, + "repair": 3, + "recharge": 4, + "broadcast": 5, + } +) + +func (x CommandType) Enum() *CommandType { + p := new(CommandType) + *p = x + return p +} + +func (x CommandType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CommandType) Descriptor() protoreflect.EnumDescriptor { + return file_rove_rove_proto_enumTypes[0].Descriptor() +} + +func (CommandType) Type() protoreflect.EnumType { + return &file_rove_rove_proto_enumTypes[0] +} + +func (x CommandType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CommandType.Descriptor instead. +func (CommandType) EnumDescriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{0} +} + type Command struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The command to execute - // "move" - Move the rover in a direction, requires bearing - // "stash" - Stashes item at current location in rover inventory - // "repair" - Repairs the rover using an inventory object - // "recharge" - Waits a tick to add more charge to the rover - // "broadcast" - Broadcasts a message to nearby rovers - Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` - // A bearing, example: NE - Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3" json:"bearing,omitempty"` - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - Message []byte `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + // The command type + Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=rove.CommandType" json:"command,omitempty"` + // Types that are assignable to Data: + // *Command_Bearing + // *Command_Message + Data isCommand_Data `protobuf_oneof:"data"` } func (x *Command) Reset() { @@ -85,27 +141,55 @@ func (*Command) Descriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{0} } -func (x *Command) GetCommand() string { +func (x *Command) GetCommand() CommandType { if x != nil { return x.Command } - return "" + return CommandType_none +} + +func (m *Command) GetData() isCommand_Data { + if m != nil { + return m.Data + } + return nil } func (x *Command) GetBearing() string { - if x != nil { + if x, ok := x.GetData().(*Command_Bearing); ok { return x.Bearing } return "" } func (x *Command) GetMessage() []byte { - if x != nil { + if x, ok := x.GetData().(*Command_Message); ok { return x.Message } return nil } +type isCommand_Data interface { + isCommand_Data() +} + +type Command_Bearing struct { + // A bearing, example: NE + // Used with MOVE + Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3,oneof"` +} + +type Command_Message struct { + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + // Used with BROADCAST + Message []byte `protobuf:"bytes,3,opt,name=message,proto3,oneof"` +} + +func (*Command_Bearing) isCommand_Data() {} + +func (*Command_Message) isCommand_Data() {} + type CommandRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -950,119 +1034,118 @@ var File_rove_rove_proto protoreflect.FileDescriptor var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x57, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x64, - 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, - 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x22, 0x76, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, - 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, - 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x15, 0x0a, - 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, - 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x35, - 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x32, 0x91, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x5d, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4f, 0x0a, - 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x22, 0x09, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4b, - 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x43, 0x0a, 0x05, 0x52, - 0x61, 0x64, 0x61, 0x72, 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x72, 0x61, 0x64, 0x61, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, + 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, + 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, + 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, + 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x15, + 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, + 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, + 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, + 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xb1, 0x02, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, + 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1077,49 +1160,52 @@ func file_rove_rove_proto_rawDescGZIP() []byte { return file_rove_rove_proto_rawDescData } +var file_rove_rove_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_rove_rove_proto_goTypes = []interface{}{ - (*Command)(nil), // 0: rove.Command - (*CommandRequest)(nil), // 1: rove.CommandRequest - (*CommandResponse)(nil), // 2: rove.CommandResponse - (*Error)(nil), // 3: rove.Error - (*RadarRequest)(nil), // 4: rove.RadarRequest - (*RadarResponse)(nil), // 5: rove.RadarResponse - (*RegisterRequest)(nil), // 6: rove.RegisterRequest - (*RegisterResponse)(nil), // 7: rove.RegisterResponse - (*StatusRequest)(nil), // 8: rove.StatusRequest - (*Log)(nil), // 9: rove.Log - (*StatusResponse)(nil), // 10: rove.StatusResponse - (*ServerStatusRequest)(nil), // 11: rove.ServerStatusRequest - (*ServerStatusResponse)(nil), // 12: rove.ServerStatusResponse - (*Vector)(nil), // 13: rove.Vector - (*Account)(nil), // 14: rove.Account + (CommandType)(0), // 0: rove.CommandType + (*Command)(nil), // 1: rove.Command + (*CommandRequest)(nil), // 2: rove.CommandRequest + (*CommandResponse)(nil), // 3: rove.CommandResponse + (*Error)(nil), // 4: rove.Error + (*RadarRequest)(nil), // 5: rove.RadarRequest + (*RadarResponse)(nil), // 6: rove.RadarResponse + (*RegisterRequest)(nil), // 7: rove.RegisterRequest + (*RegisterResponse)(nil), // 8: rove.RegisterResponse + (*StatusRequest)(nil), // 9: rove.StatusRequest + (*Log)(nil), // 10: rove.Log + (*StatusResponse)(nil), // 11: rove.StatusResponse + (*ServerStatusRequest)(nil), // 12: rove.ServerStatusRequest + (*ServerStatusResponse)(nil), // 13: rove.ServerStatusResponse + (*Vector)(nil), // 14: rove.Vector + (*Account)(nil), // 15: rove.Account } var file_rove_rove_proto_depIdxs = []int32{ - 14, // 0: rove.CommandRequest.account:type_name -> rove.Account - 0, // 1: rove.CommandRequest.commands:type_name -> rove.Command - 14, // 2: rove.RadarRequest.account:type_name -> rove.Account - 14, // 3: rove.RegisterResponse.account:type_name -> rove.Account - 14, // 4: rove.StatusRequest.account:type_name -> rove.Account - 13, // 5: rove.StatusResponse.position:type_name -> rove.Vector - 0, // 6: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 0, // 7: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 9, // 8: rove.StatusResponse.logs:type_name -> rove.Log - 11, // 9: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 6, // 10: rove.Rove.Register:input_type -> rove.RegisterRequest - 1, // 11: rove.Rove.Command:input_type -> rove.CommandRequest - 4, // 12: rove.Rove.Radar:input_type -> rove.RadarRequest - 8, // 13: rove.Rove.Status:input_type -> rove.StatusRequest - 12, // 14: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 7, // 15: rove.Rove.Register:output_type -> rove.RegisterResponse - 2, // 16: rove.Rove.Command:output_type -> rove.CommandResponse - 5, // 17: rove.Rove.Radar:output_type -> rove.RadarResponse - 10, // 18: rove.Rove.Status:output_type -> rove.StatusResponse - 14, // [14:19] is the sub-list for method output_type - 9, // [9:14] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 0, // 0: rove.Command.command:type_name -> rove.CommandType + 15, // 1: rove.CommandRequest.account:type_name -> rove.Account + 1, // 2: rove.CommandRequest.commands:type_name -> rove.Command + 15, // 3: rove.RadarRequest.account:type_name -> rove.Account + 15, // 4: rove.RegisterResponse.account:type_name -> rove.Account + 15, // 5: rove.StatusRequest.account:type_name -> rove.Account + 14, // 6: rove.StatusResponse.position:type_name -> rove.Vector + 1, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 1, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 10, // 9: rove.StatusResponse.logs:type_name -> rove.Log + 12, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 7, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest + 2, // 12: rove.Rove.Command:input_type -> rove.CommandRequest + 5, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest + 9, // 14: rove.Rove.Status:input_type -> rove.StatusRequest + 13, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 8, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse + 3, // 17: rove.Rove.Command:output_type -> rove.CommandResponse + 6, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse + 11, // 19: rove.Rove.Status:output_type -> rove.StatusResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_rove_rove_proto_init() } @@ -1309,18 +1395,23 @@ func file_rove_rove_proto_init() { } } } + file_rove_rove_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*Command_Bearing)(nil), + (*Command_Message)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rove_rove_proto_rawDesc, - NumEnums: 0, + NumEnums: 1, NumMessages: 15, NumExtensions: 0, NumServices: 1, }, GoTypes: file_rove_rove_proto_goTypes, DependencyIndexes: file_rove_rove_proto_depIdxs, + EnumInfos: file_rove_rove_proto_enumTypes, MessageInfos: file_rove_rove_proto_msgTypes, }.Build() File_rove_rove_proto = out.File diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json index e4dcbee..b1ad0aa 100644 --- a/pkg/rove/rove.swagger.json +++ b/pkg/rove/rove.swagger.json @@ -11,168 +11,7 @@ "produces": [ "application/json" ], - "paths": { - "/command": { - "post": { - "summary": "Send commands to rover", - "description": "Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent", - "operationId": "Rove_Command", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveCommandResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/roveCommandRequest" - } - } - ], - "tags": [ - "Rove" - ] - } - }, - "/radar": { - "post": { - "summary": "Get radar information", - "description": "Gets the radar output for the given rover", - "operationId": "Rove_Radar", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveRadarResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/roveRadarRequest" - } - } - ], - "tags": [ - "Rove" - ] - } - }, - "/register": { - "post": { - "summary": "Register an account", - "description": "Tries to register an account with the given name", - "operationId": "Rove_Register", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveRegisterResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/roveRegisterRequest" - } - } - ], - "tags": [ - "Rove" - ] - } - }, - "/server-status": { - "get": { - "summary": "Server status", - "description": "Responds with various details about the current server status", - "operationId": "Rove_ServerStatus", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveServerStatusResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "tags": [ - "Rove" - ] - } - }, - "/status": { - "post": { - "summary": "Get rover information", - "description": "Gets information for the account's rover", - "operationId": "Rove_Status", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/roveStatusResponse" - } - }, - "default": { - "description": "An unexpected error response", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/roveStatusRequest" - } - } - ], - "tags": [ - "Rove" - ] - } - } - }, + "paths": {}, "definitions": { "gatewayruntimeError": { "type": "object", @@ -222,33 +61,17 @@ "type": "object", "properties": { "command": { - "type": "string", - "title": "The command to execute\n\"move\" - Move the rover in a direction, requires bearing\n\"stash\" - Stashes item at current location in rover inventory\n\"repair\" - Repairs the rover using an inventory object\n\"recharge\" - Waits a tick to add more charge to the rover\n\"broadcast\" - Broadcasts a message to nearby rovers" + "$ref": "#/definitions/roveCommandType", + "title": "The command type" }, "bearing": { "type": "string", - "title": "A bearing, example: NE" + "title": "A bearing, example: NE\nUsed with MOVE" }, "message": { "type": "string", "format": "byte", - "title": "A simple message, must be composed of printable ASCII glyphs (32-126)\nmaximum of three characters" - } - } - }, - "roveCommandRequest": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/roveAccount", - "title": "The account to execute these commands" - }, - "commands": { - "type": "array", - "items": { - "$ref": "#/definitions/roveCommand" - }, - "title": "The set of desired commands" + "title": "A simple message, must be composed of printable ASCII glyphs (32-126)\nmaximum of three characters\nUsed with BROADCAST" } } }, @@ -256,6 +79,19 @@ "type": "object", "title": "Empty placeholder" }, + "roveCommandType": { + "type": "string", + "enum": [ + "none", + "move", + "stash", + "repair", + "recharge", + "broadcast" + ], + "default": "none", + "title": "- move: Move the rover in a direction, requires bearing\n - stash: Stashes item at current location in rover inventory\n - repair: Repairs the rover using an inventory object\n - recharge: Waits a tick to add more charge to the rover\n - broadcast: Broadcasts a message to nearby rovers" + }, "roveLog": { "type": "object", "properties": { @@ -269,15 +105,6 @@ } } }, - "roveRadarRequest": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/roveAccount", - "title": "The account for this request" - } - } - }, "roveRadarResponse": { "type": "object", "properties": { @@ -298,15 +125,6 @@ } } }, - "roveRegisterRequest": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "The desired account name" - } - } - }, "roveRegisterResponse": { "type": "object", "properties": { @@ -345,15 +163,6 @@ } } }, - "roveStatusRequest": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/roveAccount", - "title": "The account for this request" - } - } - }, "roveStatusResponse": { "type": "object", "properties": { diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index d643e9c..de2ad2b 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -7,74 +7,61 @@ package rove; option go_package = "github.com/mdiluz/rove/pkg/rove"; -import "google/api/annotations.proto"; - service Rove { // Server status // // Responds with various details about the current server status - rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse) { - option (google.api.http) = { - get: "/server-status" - }; - } + rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse) {} // Register an account // // Tries to register an account with the given name - rpc Register(RegisterRequest) returns (RegisterResponse) { - option (google.api.http) = { - post: "/register" - body: "*" - }; - } + rpc Register(RegisterRequest) returns (RegisterResponse) {} // Send commands to rover // // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - rpc Command(CommandRequest) returns (CommandResponse) { - option (google.api.http) = { - post: "/command" - body: "*" - }; - } + rpc Command(CommandRequest) returns (CommandResponse) {} // Get radar information // // Gets the radar output for the given rover - rpc Radar(RadarRequest) returns (RadarResponse) { - option (google.api.http) = { - post: "/radar" - body: "*" - }; - } + rpc Radar(RadarRequest) returns (RadarResponse) {} // Get rover information // // Gets information for the account's rover - rpc Status(StatusRequest) returns (StatusResponse) { - option (google.api.http) = { - post: "/status" - body: "*" - }; - } + rpc Status(StatusRequest) returns (StatusResponse) {} +} + +enum CommandType { + none = 0; + // Move the rover in a direction, requires bearing + move = 1; + // Stashes item at current location in rover inventory + stash = 2; + // Repairs the rover using an inventory object + repair = 3; + // Waits a tick to add more charge to the rover + recharge = 4; + // Broadcasts a message to nearby rovers + broadcast = 5; } message Command { - // The command to execute - // "move" - Move the rover in a direction, requires bearing - // "stash" - Stashes item at current location in rover inventory - // "repair" - Repairs the rover using an inventory object - // "recharge" - Waits a tick to add more charge to the rover - // "broadcast" - Broadcasts a message to nearby rovers - string command = 1; + // The command type + CommandType command = 1; - // A bearing, example: NE - string bearing = 2; - - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - bytes message = 3; + oneof data { + // A bearing, example: NE + // Used with MOVE + string bearing = 2; + + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + // Used with BROADCAST + bytes message = 3; + } } message CommandRequest { From 0be6aa7c1282af4f9b8552eb6e3c09372fc44aa4 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 00:26:49 +0100 Subject: [PATCH 363/495] Clean, format and comment the rove.proto file --- proto/rove/rove.proto | 351 +++++++++++++++++++++++------------------- 1 file changed, 190 insertions(+), 161 deletions(-) diff --git a/proto/rove/rove.proto b/proto/rove/rove.proto index de2ad2b..ab0160e 100644 --- a/proto/rove/rove.proto +++ b/proto/rove/rove.proto @@ -2,188 +2,217 @@ syntax = "proto3"; // Rove // -// Rove is an asychronous nomadic game about exploring a planet as part of a loose community +// Rove is an asychronous nomadic game about exploring a planet as part of a +// loose community package rove; - option go_package = "github.com/mdiluz/rove/pkg/rove"; +// The Rove server hosts a single game session and world with multiple players service Rove { - // Server status - // - // Responds with various details about the current server status - rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse) {} + // Server status + // Responds with various details about the current server status + rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse) {} - // Register an account - // - // Tries to register an account with the given name - rpc Register(RegisterRequest) returns (RegisterResponse) {} + // Register an account + // Tries to register an account with the given name + rpc Register(RegisterRequest) returns (RegisterResponse) {} - // Send commands to rover - // - // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent - rpc Command(CommandRequest) returns (CommandResponse) {} + // Send commands to rover + // Sending commands to this endpoint will queue them to be executed during the + // following ticks, in the order sent. Commands sent within the same tick will + // overwrite until the tick has finished and the commands are queued + rpc Command(CommandRequest) returns (CommandResponse) {} - // Get radar information - // - // Gets the radar output for the given rover - rpc Radar(RadarRequest) returns (RadarResponse) {} + // Get radar information + // Gets the radar output for the given rover + rpc Radar(RadarRequest) returns (RadarResponse) {} - // Get rover information - // - // Gets information for the account's rover - rpc Status(StatusRequest) returns (StatusResponse) {} + // Get rover information + // Gets information for the account's rover + rpc Status(StatusRequest) returns (StatusResponse) {} } -enum CommandType { - none = 0; - // Move the rover in a direction, requires bearing - move = 1; - // Stashes item at current location in rover inventory - stash = 2; - // Repairs the rover using an inventory object - repair = 3; - // Waits a tick to add more charge to the rover - recharge = 4; - // Broadcasts a message to nearby rovers - broadcast = 5; -} +// +// ServerStatus +// -message Command { - // The command type - CommandType command = 1; - - oneof data { - // A bearing, example: NE - // Used with MOVE - string bearing = 2; - - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - // Used with BROADCAST - bytes message = 3; - } -} - -message CommandRequest { - // The account to execute these commands - Account account = 1; - - // The set of desired commands - repeated Command commands = 2; -} - -// Empty placeholder -message CommandResponse {} - -message Error { - // An explanation for the HTTP error returned - string error = 1; -} - -message RadarRequest { - // The account for this request - Account account = 1; -} - -message RadarResponse { - // The range in tiles from the rover of the radar data - int32 range = 1; - - // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order - bytes tiles = 2; - - // A similar array to the tile array, but containing objects - bytes objects = 3; -} - -message RegisterRequest { - // The desired account name - string name = 1; -} - -// Empty placeholder -message RegisterResponse{ - // The registered account information - Account account = 1; -} - -message StatusRequest { - // The account for this request - Account account = 1; -} - -message Log { - // The unix timestamp of the log - string time = 1; - - // The text of the log - string text = 2; -} - -message StatusResponse { - // The name of the rover - string name = 1; - - // Position of the rover in world coordinates - Vector position = 2; - - // The range of this rover's radar and broadcasting - int32 range = 3; - - // The items in the rover inventory - bytes inventory = 4; - - // The capacity of the inventory - int32 capacity = 5; - - // The current health of the rover - int32 integrity = 6; - - // The maximum health of the rover - int32 maximumIntegrity = 7; - - // The energy stored in the rover - int32 charge = 8; - - // The max energy the rover can store - int32 maximumCharge = 9; - - // The set of currently incoming commands for this tick - repeated Command incomingCommands = 10; - - // The set of currently queued commands - repeated Command queuedCommands = 11; - - // The most recent logs - repeated Log logs = 12; -} - -// Empty placeholder +// ServerStatusRequest is an empty placeholder message ServerStatusRequest {} +// ServerStatusResponse is a response with useful server information message ServerStatusResponse { - // The version of the server in v{major}.{minor}-{delta}-{sha} form - string version = 1; + // The version of the server in v{major}.{minor}-{delta}-{sha} form + string version = 1; - // Whether the server is ready to accept requests - bool ready = 2; + // Whether the server is ready to accept requests + bool ready = 2; - // The tick rate of the server in minutes (how many minutes per tick) - int32 tickRate = 3; + // The tick rate of the server in minutes (how many minutes per tick) + int32 tickRate = 3; - // The current tick of the server - int32 currentTick = 4; + // The current tick of the server + int32 currentTick = 4; - // The time the next tick will occur - string next_tick = 5; + // The time the next tick will occur + string next_tick = 5; } -message Vector { - int32 x = 1; - int32 y = 2; +// +// Register +// + +// RegisterRequest contains data to register an account +message RegisterRequest { + // The desired account name + string name = 1; } +// Account describes a registered account message Account { - string name = 1; - string secret = 2; + // The account name + string name = 1; + + // The account secret value, given when creating the account + string secret = 2; +} + +// RegisterResponse is the response given to registering an account +message RegisterResponse { + // The registered account information + Account account = 1; +} + +// +// Command +// + +// CommandType defines the type of a command to give to the rover +enum CommandType { + none = 0; + // Move the rover in a direction, requires bearing + move = 1; + // Stashes item at current location in rover inventory + stash = 2; + // Repairs the rover using an inventory object + repair = 3; + // Waits a tick to add more charge to the rover + recharge = 4; + // Broadcasts a message to nearby rovers + broadcast = 5; +} + +// Command is a single command for a rover +message Command { + // The command type + CommandType command = 1; + + oneof data { + // A bearing, example: NE + // Used with MOVE + string bearing = 2; + + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + // Used with BROADCAST + bytes message = 3; + } +} + +// CommandRequest describes a set of commands to be requested for the rover +message CommandRequest { + // The account to execute these commands + Account account = 1; + + // The set of desired commands + repeated Command commands = 2; +} + +// CommandResponse is an empty placeholder +message CommandResponse {} + +// +// Radar +// + +// RadarRequest is the data needed to request the radar for a rover +message RadarRequest { + // The account for this request + Account account = 1; +} + +// RadarResponse describes radar information +message RadarResponse { + // The range in tiles from the rover of the radar data + int32 range = 1; + + // A 1D array representing range*2 + 1 squared set of tiles, origin bottom + // left and in row->column order + bytes tiles = 2; + + // A similar array to the tile array, but containing objects + bytes objects = 3; +} + +// +// Status +// + +// StatusRequest is information needed to request rover status +message StatusRequest { + // The account for this request + Account account = 1; +} + +// Log is a single log item +message Log { + // The unix timestamp of the log + string time = 1; + + // The text of the log + string text = 2; +} + +// Vector describes a point or vector in 2D space +message Vector { + int32 x = 1; + int32 y = 2; +} + +// StatusResponse is the response given to a status request +message StatusResponse { + // The name of the rover + string name = 1; + + // Position of the rover in world coordinates + Vector position = 2; + + // The range of this rover's radar and broadcasting + int32 range = 3; + + // The items in the rover inventory + bytes inventory = 4; + + // The capacity of the inventory + int32 capacity = 5; + + // The current health of the rover + int32 integrity = 6; + + // The maximum health of the rover + int32 maximumIntegrity = 7; + + // The energy stored in the rover + int32 charge = 8; + + // The max energy the rover can store + int32 maximumCharge = 9; + + // The set of currently incoming commands for this tick + repeated Command incomingCommands = 10; + + // The set of currently queued commands + repeated Command queuedCommands = 11; + + // The most recent logs + repeated Log logs = 12; } \ No newline at end of file From fe6dae4c527055e8a350a15e3abd2955c15316b1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 00:27:14 +0100 Subject: [PATCH 364/495] Update the generated file for rove.pb.go --- pkg/rove/rove.pb.go | 1345 +++++++++++++++++++++---------------------- 1 file changed, 646 insertions(+), 699 deletions(-) diff --git a/pkg/rove/rove.pb.go b/pkg/rove/rove.pb.go index 12bfce1..2186fd9 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/rove/rove.pb.go @@ -6,7 +6,8 @@ // Rove // -// Rove is an asychronous nomadic game about exploring a planet as part of a loose community +// Rove is an asychronous nomadic game about exploring a planet as part of a +// loose community package rove @@ -33,6 +34,7 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +// CommandType defines the type of a command to give to the rover type CommandType int32 const ( @@ -96,6 +98,287 @@ func (CommandType) EnumDescriptor() ([]byte, []int) { return file_rove_rove_proto_rawDescGZIP(), []int{0} } +// ServerStatusRequest is an empty placeholder +type ServerStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ServerStatusRequest) Reset() { + *x = ServerStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerStatusRequest) ProtoMessage() {} + +func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. +func (*ServerStatusRequest) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{0} +} + +// ServerStatusResponse is a response with useful server information +type ServerStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The version of the server in v{major}.{minor}-{delta}-{sha} form + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // Whether the server is ready to accept requests + Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` + // The tick rate of the server in minutes (how many minutes per tick) + TickRate int32 `protobuf:"varint,3,opt,name=tickRate,proto3" json:"tickRate,omitempty"` + // The current tick of the server + CurrentTick int32 `protobuf:"varint,4,opt,name=currentTick,proto3" json:"currentTick,omitempty"` + // The time the next tick will occur + NextTick string `protobuf:"bytes,5,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` +} + +func (x *ServerStatusResponse) Reset() { + *x = ServerStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerStatusResponse) ProtoMessage() {} + +func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. +func (*ServerStatusResponse) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{1} +} + +func (x *ServerStatusResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *ServerStatusResponse) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *ServerStatusResponse) GetTickRate() int32 { + if x != nil { + return x.TickRate + } + return 0 +} + +func (x *ServerStatusResponse) GetCurrentTick() int32 { + if x != nil { + return x.CurrentTick + } + return 0 +} + +func (x *ServerStatusResponse) GetNextTick() string { + if x != nil { + return x.NextTick + } + return "" +} + +// RegisterRequest contains data to register an account +type RegisterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The desired account name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *RegisterRequest) Reset() { + *x = RegisterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterRequest) ProtoMessage() {} + +func (x *RegisterRequest) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. +func (*RegisterRequest) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{2} +} + +func (x *RegisterRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Account describes a registered account +type Account struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The account name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The account secret value, given when creating the account + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` +} + +func (x *Account) Reset() { + *x = Account{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Account) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Account) ProtoMessage() {} + +func (x *Account) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Account.ProtoReflect.Descriptor instead. +func (*Account) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{3} +} + +func (x *Account) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Account) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +// RegisterResponse is the response given to registering an account +type RegisterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The registered account information + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` +} + +func (x *RegisterResponse) Reset() { + *x = RegisterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterResponse) ProtoMessage() {} + +func (x *RegisterResponse) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. +func (*RegisterResponse) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{4} +} + +func (x *RegisterResponse) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +// Command is a single command for a rover type Command struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -112,7 +395,7 @@ type Command struct { func (x *Command) Reset() { *x = Command{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[0] + mi := &file_rove_rove_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -125,7 +408,7 @@ func (x *Command) String() string { func (*Command) ProtoMessage() {} func (x *Command) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[0] + mi := &file_rove_rove_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -138,7 +421,7 @@ func (x *Command) ProtoReflect() protoreflect.Message { // Deprecated: Use Command.ProtoReflect.Descriptor instead. func (*Command) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{0} + return file_rove_rove_proto_rawDescGZIP(), []int{5} } func (x *Command) GetCommand() CommandType { @@ -190,6 +473,7 @@ func (*Command_Bearing) isCommand_Data() {} func (*Command_Message) isCommand_Data() {} +// CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -204,7 +488,7 @@ type CommandRequest struct { func (x *CommandRequest) Reset() { *x = CommandRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[1] + mi := &file_rove_rove_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -217,7 +501,7 @@ func (x *CommandRequest) String() string { func (*CommandRequest) ProtoMessage() {} func (x *CommandRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[1] + mi := &file_rove_rove_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -230,7 +514,7 @@ func (x *CommandRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandRequest.ProtoReflect.Descriptor instead. func (*CommandRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{1} + return file_rove_rove_proto_rawDescGZIP(), []int{6} } func (x *CommandRequest) GetAccount() *Account { @@ -247,7 +531,7 @@ func (x *CommandRequest) GetCommands() []*Command { return nil } -// Empty placeholder +// CommandResponse is an empty placeholder type CommandResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -257,7 +541,7 @@ type CommandResponse struct { func (x *CommandResponse) Reset() { *x = CommandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_rove_rove_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -270,7 +554,7 @@ func (x *CommandResponse) String() string { func (*CommandResponse) ProtoMessage() {} func (x *CommandResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_rove_rove_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -283,57 +567,10 @@ func (x *CommandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandResponse.ProtoReflect.Descriptor instead. func (*CommandResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{2} -} - -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // An explanation for the HTTP error returned - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{3} -} - -func (x *Error) GetError() string { - if x != nil { - return x.Error - } - return "" + return file_rove_rove_proto_rawDescGZIP(), []int{7} } +// RadarRequest is the data needed to request the radar for a rover type RadarRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -346,7 +583,7 @@ type RadarRequest struct { func (x *RadarRequest) Reset() { *x = RadarRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_rove_rove_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -359,7 +596,7 @@ func (x *RadarRequest) String() string { func (*RadarRequest) ProtoMessage() {} func (x *RadarRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_rove_rove_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -372,7 +609,7 @@ func (x *RadarRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarRequest.ProtoReflect.Descriptor instead. func (*RadarRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{4} + return file_rove_rove_proto_rawDescGZIP(), []int{8} } func (x *RadarRequest) GetAccount() *Account { @@ -382,6 +619,7 @@ func (x *RadarRequest) GetAccount() *Account { return nil } +// RadarResponse describes radar information type RadarResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -389,7 +627,8 @@ type RadarResponse struct { // The range in tiles from the rover of the radar data Range int32 `protobuf:"varint,1,opt,name=range,proto3" json:"range,omitempty"` - // A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row->column order + // A 1D array representing range*2 + 1 squared set of tiles, origin bottom + // left and in row->column order Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` // A similar array to the tile array, but containing objects Objects []byte `protobuf:"bytes,3,opt,name=objects,proto3" json:"objects,omitempty"` @@ -398,7 +637,7 @@ type RadarResponse struct { func (x *RadarResponse) Reset() { *x = RadarResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_rove_rove_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -411,7 +650,7 @@ func (x *RadarResponse) String() string { func (*RadarResponse) ProtoMessage() {} func (x *RadarResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_rove_rove_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -424,7 +663,7 @@ func (x *RadarResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarResponse.ProtoReflect.Descriptor instead. func (*RadarResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{5} + return file_rove_rove_proto_rawDescGZIP(), []int{9} } func (x *RadarResponse) GetRange() int32 { @@ -448,103 +687,7 @@ func (x *RadarResponse) GetObjects() []byte { return nil } -type RegisterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The desired account name - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *RegisterRequest) Reset() { - *x = RegisterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterRequest) ProtoMessage() {} - -func (x *RegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. -func (*RegisterRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{6} -} - -func (x *RegisterRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// Empty placeholder -type RegisterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The registered account information - Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` -} - -func (x *RegisterResponse) Reset() { - *x = RegisterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterResponse) ProtoMessage() {} - -func (x *RegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. -func (*RegisterResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{7} -} - -func (x *RegisterResponse) GetAccount() *Account { - if x != nil { - return x.Account - } - return nil -} - +// StatusRequest is information needed to request rover status type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -557,7 +700,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_rove_rove_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -570,7 +713,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_rove_rove_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -583,7 +726,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{8} + return file_rove_rove_proto_rawDescGZIP(), []int{10} } func (x *StatusRequest) GetAccount() *Account { @@ -593,6 +736,7 @@ func (x *StatusRequest) GetAccount() *Account { return nil } +// Log is a single log item type Log struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -607,7 +751,7 @@ type Log struct { func (x *Log) Reset() { *x = Log{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -620,7 +764,7 @@ func (x *Log) String() string { func (*Log) ProtoMessage() {} func (x *Log) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_rove_rove_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -633,7 +777,7 @@ func (x *Log) ProtoReflect() protoreflect.Message { // Deprecated: Use Log.ProtoReflect.Descriptor instead. func (*Log) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{9} + return file_rove_rove_proto_rawDescGZIP(), []int{11} } func (x *Log) GetTime() string { @@ -650,6 +794,63 @@ func (x *Log) GetText() string { return "" } +// Vector describes a point or vector in 2D space +type Vector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X int32 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` + Y int32 `protobuf:"varint,2,opt,name=y,proto3" json:"y,omitempty"` +} + +func (x *Vector) Reset() { + *x = Vector{} + if protoimpl.UnsafeEnabled { + mi := &file_rove_rove_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Vector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector) ProtoMessage() {} + +func (x *Vector) ProtoReflect() protoreflect.Message { + mi := &file_rove_rove_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector.ProtoReflect.Descriptor instead. +func (*Vector) Descriptor() ([]byte, []int) { + return file_rove_rove_proto_rawDescGZIP(), []int{12} +} + +func (x *Vector) GetX() int32 { + if x != nil { + return x.X + } + return 0 +} + +func (x *Vector) GetY() int32 { + if x != nil { + return x.Y + } + return 0 +} + +// StatusResponse is the response given to a status request type StatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -684,7 +885,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_rove_rove_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -697,7 +898,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_rove_rove_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -710,7 +911,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{10} + return file_rove_rove_proto_rawDescGZIP(), []int{13} } func (x *StatusResponse) GetName() string { @@ -797,355 +998,120 @@ func (x *StatusResponse) GetLogs() []*Log { return nil } -// Empty placeholder -type ServerStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ServerStatusRequest) Reset() { - *x = ServerStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServerStatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServerStatusRequest) ProtoMessage() {} - -func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. -func (*ServerStatusRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{11} -} - -type ServerStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The version of the server in v{major}.{minor}-{delta}-{sha} form - Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` - // Whether the server is ready to accept requests - Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` - // The tick rate of the server in minutes (how many minutes per tick) - TickRate int32 `protobuf:"varint,3,opt,name=tickRate,proto3" json:"tickRate,omitempty"` - // The current tick of the server - CurrentTick int32 `protobuf:"varint,4,opt,name=currentTick,proto3" json:"currentTick,omitempty"` - // The time the next tick will occur - NextTick string `protobuf:"bytes,5,opt,name=next_tick,json=nextTick,proto3" json:"next_tick,omitempty"` -} - -func (x *ServerStatusResponse) Reset() { - *x = ServerStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServerStatusResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServerStatusResponse) ProtoMessage() {} - -func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. -func (*ServerStatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{12} -} - -func (x *ServerStatusResponse) GetVersion() string { - if x != nil { - return x.Version - } - return "" -} - -func (x *ServerStatusResponse) GetReady() bool { - if x != nil { - return x.Ready - } - return false -} - -func (x *ServerStatusResponse) GetTickRate() int32 { - if x != nil { - return x.TickRate - } - return 0 -} - -func (x *ServerStatusResponse) GetCurrentTick() int32 { - if x != nil { - return x.CurrentTick - } - return 0 -} - -func (x *ServerStatusResponse) GetNextTick() string { - if x != nil { - return x.NextTick - } - return "" -} - -type Vector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - X int32 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` - Y int32 `protobuf:"varint,2,opt,name=y,proto3" json:"y,omitempty"` -} - -func (x *Vector) Reset() { - *x = Vector{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Vector) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Vector) ProtoMessage() {} - -func (x *Vector) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Vector.ProtoReflect.Descriptor instead. -func (*Vector) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{13} -} - -func (x *Vector) GetX() int32 { - if x != nil { - return x.X - } - return 0 -} - -func (x *Vector) GetY() int32 { - if x != nil { - return x.Y - } - return 0 -} - -type Account struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` -} - -func (x *Account) Reset() { - *x = Account{} - if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Account) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Account) ProtoMessage() {} - -func (x *Account) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Account.ProtoReflect.Descriptor instead. -func (*Account) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{14} -} - -func (x *Account) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Account) GetSecret() string { - if x != nil { - return x.Secret - } - return "" -} - var File_rove_rove_proto protoreflect.FileDescriptor var file_rove_rove_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x22, 0x76, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x37, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, + 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, + 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, + 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, + 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, + 0x63, 0x6b, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x76, 0x0a, + 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, - 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x65, 0x78, 0x74, 0x22, 0xb7, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, - 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, + 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x38, + 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, + 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xb7, 0x03, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, - 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x15, - 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, - 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, - 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, - 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xb1, 0x02, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x07, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, - 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, + 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, + 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xb1, + 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x3b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, + 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1161,46 +1127,45 @@ func file_rove_rove_proto_rawDescGZIP() []byte { } var file_rove_rove_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_rove_rove_proto_goTypes = []interface{}{ (CommandType)(0), // 0: rove.CommandType - (*Command)(nil), // 1: rove.Command - (*CommandRequest)(nil), // 2: rove.CommandRequest - (*CommandResponse)(nil), // 3: rove.CommandResponse - (*Error)(nil), // 4: rove.Error - (*RadarRequest)(nil), // 5: rove.RadarRequest - (*RadarResponse)(nil), // 6: rove.RadarResponse - (*RegisterRequest)(nil), // 7: rove.RegisterRequest - (*RegisterResponse)(nil), // 8: rove.RegisterResponse - (*StatusRequest)(nil), // 9: rove.StatusRequest - (*Log)(nil), // 10: rove.Log - (*StatusResponse)(nil), // 11: rove.StatusResponse - (*ServerStatusRequest)(nil), // 12: rove.ServerStatusRequest - (*ServerStatusResponse)(nil), // 13: rove.ServerStatusResponse - (*Vector)(nil), // 14: rove.Vector - (*Account)(nil), // 15: rove.Account + (*ServerStatusRequest)(nil), // 1: rove.ServerStatusRequest + (*ServerStatusResponse)(nil), // 2: rove.ServerStatusResponse + (*RegisterRequest)(nil), // 3: rove.RegisterRequest + (*Account)(nil), // 4: rove.Account + (*RegisterResponse)(nil), // 5: rove.RegisterResponse + (*Command)(nil), // 6: rove.Command + (*CommandRequest)(nil), // 7: rove.CommandRequest + (*CommandResponse)(nil), // 8: rove.CommandResponse + (*RadarRequest)(nil), // 9: rove.RadarRequest + (*RadarResponse)(nil), // 10: rove.RadarResponse + (*StatusRequest)(nil), // 11: rove.StatusRequest + (*Log)(nil), // 12: rove.Log + (*Vector)(nil), // 13: rove.Vector + (*StatusResponse)(nil), // 14: rove.StatusResponse } var file_rove_rove_proto_depIdxs = []int32{ - 0, // 0: rove.Command.command:type_name -> rove.CommandType - 15, // 1: rove.CommandRequest.account:type_name -> rove.Account - 1, // 2: rove.CommandRequest.commands:type_name -> rove.Command - 15, // 3: rove.RadarRequest.account:type_name -> rove.Account - 15, // 4: rove.RegisterResponse.account:type_name -> rove.Account - 15, // 5: rove.StatusRequest.account:type_name -> rove.Account - 14, // 6: rove.StatusResponse.position:type_name -> rove.Vector - 1, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 1, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 10, // 9: rove.StatusResponse.logs:type_name -> rove.Log - 12, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 7, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest - 2, // 12: rove.Rove.Command:input_type -> rove.CommandRequest - 5, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest - 9, // 14: rove.Rove.Status:input_type -> rove.StatusRequest - 13, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 8, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse - 3, // 17: rove.Rove.Command:output_type -> rove.CommandResponse - 6, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse - 11, // 19: rove.Rove.Status:output_type -> rove.StatusResponse + 4, // 0: rove.RegisterResponse.account:type_name -> rove.Account + 0, // 1: rove.Command.command:type_name -> rove.CommandType + 4, // 2: rove.CommandRequest.account:type_name -> rove.Account + 6, // 3: rove.CommandRequest.commands:type_name -> rove.Command + 4, // 4: rove.RadarRequest.account:type_name -> rove.Account + 4, // 5: rove.StatusRequest.account:type_name -> rove.Account + 13, // 6: rove.StatusResponse.position:type_name -> rove.Vector + 6, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command + 6, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command + 12, // 9: rove.StatusResponse.logs:type_name -> rove.Log + 1, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest + 3, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest + 7, // 12: rove.Rove.Command:input_type -> rove.CommandRequest + 9, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest + 11, // 14: rove.Rove.Status:input_type -> rove.StatusRequest + 2, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse + 5, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse + 8, // 17: rove.Rove.Command:output_type -> rove.CommandResponse + 10, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse + 14, // 19: rove.Rove.Status:output_type -> rove.StatusResponse 15, // [15:20] is the sub-list for method output_type 10, // [10:15] is the sub-list for method input_type 10, // [10:10] is the sub-list for extension type_name @@ -1215,138 +1180,6 @@ func file_rove_rove_proto_init() { } if !protoimpl.UnsafeEnabled { file_rove_rove_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Command); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RadarRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RadarResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Log); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerStatusRequest); i { case 0: return &v.state @@ -1358,7 +1191,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_rove_rove_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerStatusResponse); i { case 0: return &v.state @@ -1370,8 +1203,8 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Vector); i { + file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterRequest); i { case 0: return &v.state case 1: @@ -1382,7 +1215,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_rove_rove_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state @@ -1394,8 +1227,128 @@ func file_rove_rove_proto_init() { return nil } } + file_rove_rove_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Command); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RadarRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RadarResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Log); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } - file_rove_rove_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_rove_rove_proto_msgTypes[5].OneofWrappers = []interface{}{ (*Command_Bearing)(nil), (*Command_Message)(nil), } @@ -1405,7 +1358,7 @@ func file_rove_rove_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rove_rove_proto_rawDesc, NumEnums: 1, - NumMessages: 15, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, @@ -1433,23 +1386,20 @@ const _ = grpc.SupportPackageIsVersion6 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type RoveClient interface { // Server status - // // Responds with various details about the current server status ServerStatus(ctx context.Context, in *ServerStatusRequest, opts ...grpc.CallOption) (*ServerStatusResponse, error) // Register an account - // // Tries to register an account with the given name Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) // Send commands to rover - // - // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + // Sending commands to this endpoint will queue them to be executed during the + // following ticks, in the order sent. Commands sent within the same tick will + // overwrite until the tick has finished and the commands are queued Command(ctx context.Context, in *CommandRequest, opts ...grpc.CallOption) (*CommandResponse, error) // Get radar information - // // Gets the radar output for the given rover Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) // Get rover information - // // Gets information for the account's rover Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) } @@ -1510,23 +1460,20 @@ func (c *roveClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc // RoveServer is the server API for Rove service. type RoveServer interface { // Server status - // // Responds with various details about the current server status ServerStatus(context.Context, *ServerStatusRequest) (*ServerStatusResponse, error) // Register an account - // // Tries to register an account with the given name Register(context.Context, *RegisterRequest) (*RegisterResponse, error) // Send commands to rover - // - // Sending commands to this endpoint will queue them to be executed during the following ticks, in the order sent + // Sending commands to this endpoint will queue them to be executed during the + // following ticks, in the order sent. Commands sent within the same tick will + // overwrite until the tick has finished and the commands are queued Command(context.Context, *CommandRequest) (*CommandResponse, error) // Get radar information - // // Gets the radar output for the given rover Radar(context.Context, *RadarRequest) (*RadarResponse, error) // Get rover information - // // Gets information for the account's rover Status(context.Context, *StatusRequest) (*StatusResponse, error) } From 6c1ee311cd6b04495ff5cef9bd31756cfc157d25 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 00:29:06 +0100 Subject: [PATCH 365/495] Delete unused files --- Dockerfile.docs | 8 - cmd/rove-server-rest-proxy/http_test.go | 150 -------- cmd/rove-server-rest-proxy/main.go | 51 --- pkg/rove/rove.pb.gw.go | 459 ------------------------ pkg/rove/rove.swagger.json | 249 ------------- 5 files changed, 917 deletions(-) delete mode 100644 Dockerfile.docs delete mode 100644 cmd/rove-server-rest-proxy/http_test.go delete mode 100644 cmd/rove-server-rest-proxy/main.go delete mode 100644 pkg/rove/rove.pb.gw.go delete mode 100644 pkg/rove/rove.swagger.json diff --git a/Dockerfile.docs b/Dockerfile.docs deleted file mode 100644 index c74f94b..0000000 --- a/Dockerfile.docs +++ /dev/null @@ -1,8 +0,0 @@ -FROM quay.io/goswagger/swagger:latest -LABEL maintainer="Marc Di Luzio " - -WORKDIR /app -COPY . . - -CMD [ "serve", "pkg/rove/rove.swagger.json", "--no-open" ] - diff --git a/cmd/rove-server-rest-proxy/http_test.go b/cmd/rove-server-rest-proxy/http_test.go deleted file mode 100644 index f590f74..0000000 --- a/cmd/rove-server-rest-proxy/http_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// +build integration - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" - "net/url" - "os" - "testing" - - "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/rove" - "github.com/stretchr/testify/assert" -) - -// Server is a simple wrapper to a server path -type Server string - -// Request performs a HTTP -func (s Server) Request(method, path string, in, out interface{}) error { - u := url.URL{ - Scheme: "http", - Host: fmt.Sprintf("%s:8080", string(s)), - Path: path, - } - client := &http.Client{} - - // Marshal the input - marshalled, err := json.Marshal(in) - if err != nil { - return err - } - - // Set up the request - req, err := http.NewRequest(method, u.String(), bytes.NewReader(marshalled)) - if err != nil { - return err - } - - // Do the POST - req.Header.Set("Content-Type", "application/json") - if resp, err := client.Do(req); err != nil { - return err - - } else if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("failed to read response body to code %d", resp.StatusCode) - } - return fmt.Errorf("http returned status %d: %s", resp.StatusCode, string(body)) - - } else { - return json.NewDecoder(resp.Body).Decode(out) - } -} - -var serv = Server(os.Getenv("ROVE_HTTP")) - -func TestServer_ServerStatus(t *testing.T) { - req := &rove.ServerStatusRequest{} - resp := &rove.ServerStatusResponse{} - if err := serv.Request("GET", "server-status", req, resp); err != nil { - log.Fatal(err) - } -} - -func TestServer_Register(t *testing.T) { - req := &rove.RegisterRequest{Name: uuid.New().String()} - resp := &rove.RegisterResponse{} - err := serv.Request("POST", "register", req, resp) - assert.NoError(t, err, "First register attempt should pass") - err = serv.Request("POST", "register", req, resp) - assert.Error(t, err, "Second identical register attempt should fail") -} - -func TestServer_Command(t *testing.T) { - acc := uuid.New().String() - var resp rove.RegisterResponse - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, &resp) - assert.NoError(t, err, "First register attempt should pass") - - req := &rove.CommandRequest{ - Account: &rove.Account{ - Name: resp.Account.Name, - }, - Commands: []*rove.Command{ - { - Command: "move", - Bearing: "NE", - }, - }, - } - - assert.Error(t, serv.Request("POST", "command", req, &rove.CommandResponse{}), "Commands should fail with no secret") - - req.Account.Secret = resp.Account.Secret - assert.NoError(t, serv.Request("POST", "command", req, &rove.CommandResponse{}), "Commands should pass") -} - -func TestServer_Radar(t *testing.T) { - acc := uuid.New().String() - var reg rove.RegisterResponse - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, ®) - assert.NoError(t, err, "First register attempt should pass") - - resp := &rove.RadarResponse{} - req := &rove.RadarRequest{ - Account: &rove.Account{ - Name: reg.Account.Name, - }, - } - - assert.Error(t, serv.Request("POST", "radar", req, resp), "Radar should fail without secret") - req.Account.Secret = reg.Account.Secret - - assert.NoError(t, serv.Request("POST", "radar", req, resp), "Radar should pass") - assert.NotZero(t, resp.Range, "Radar should return valid range") - - w := int(resp.Range*2 + 1) - assert.Equal(t, w*w, len(resp.Tiles), "radar should return correct number of tiles") - assert.Equal(t, w*w, len(resp.Objects), "radar should return correct number of objects") -} - -func TestServer_Status(t *testing.T) { - acc := uuid.New().String() - var reg rove.RegisterResponse - err := serv.Request("POST", "register", &rove.RegisterRequest{Name: acc}, ®) - assert.NoError(t, err, "First register attempt should pass") - - resp := &rove.StatusResponse{} - req := &rove.StatusRequest{ - Account: &rove.Account{ - Name: reg.Account.Name, - }, - } - - assert.Error(t, serv.Request("POST", "status", req, resp), "Status should fail without secret") - req.Account.Secret = reg.Account.Secret - - assert.NoError(t, serv.Request("POST", "status", req, resp), "Status should pass") - assert.NotZero(t, resp.Range, "Rover should return valid range") - assert.NotZero(t, len(resp.Name), "Rover should return valid name") - assert.NotZero(t, resp.Position, "Rover should return valid position") - assert.NotZero(t, resp.Integrity, "Rover should have positive integrity") -} diff --git a/cmd/rove-server-rest-proxy/main.go b/cmd/rove-server-rest-proxy/main.go deleted file mode 100644 index 06653b6..0000000 --- a/cmd/rove-server-rest-proxy/main.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "context" - "fmt" - "log" - "net/http" - "os" - "strconv" - - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "google.golang.org/grpc" - - "github.com/mdiluz/rove/pkg/rove" -) - -func main() { - ctx := context.Background() - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - var endpoint = os.Getenv("ROVE_GRPC") - if len(endpoint) == 0 { - endpoint = "localhost:9090" - } - - var iport int - var port = os.Getenv("PORT") - if len(port) == 0 { - iport = 8080 - } else { - var err error - iport, err = strconv.Atoi(port) - if err != nil { - log.Fatal("$PORT not valid int") - } - } - - // Create a new mux and register it with the gRPC endpoint - fmt.Printf("Hosting reverse-proxy on %d for %s\n", iport, endpoint) - mux := runtime.NewServeMux() - opts := []grpc.DialOption{grpc.WithInsecure()} - if err := rove.RegisterRoveHandlerFromEndpoint(ctx, mux, endpoint, opts); err != nil { - log.Fatal(err) - } - - // Start the HTTP server and proxy calls to gRPC endpoint when needed - if err := http.ListenAndServe(fmt.Sprintf(":%d", iport), mux); err != nil { - log.Fatal(err) - } -} diff --git a/pkg/rove/rove.pb.gw.go b/pkg/rove/rove.pb.gw.go deleted file mode 100644 index db3d25e..0000000 --- a/pkg/rove/rove.pb.gw.go +++ /dev/null @@ -1,459 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: rove/rove.proto - -/* -Package rove is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package rove - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage - -func request_Rove_ServerStatus_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ServerStatusRequest - var metadata runtime.ServerMetadata - - msg, err := client.ServerStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Rove_ServerStatus_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ServerStatusRequest - var metadata runtime.ServerMetadata - - msg, err := server.ServerStatus(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Rove_Register_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Register(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Rove_Register_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Register(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Rove_Command_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CommandRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Command(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Rove_Command_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CommandRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Command(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RadarRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Radar(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Rove_Radar_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RadarRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Radar(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, client RoveClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StatusRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Rove_Status_0(ctx context.Context, marshaler runtime.Marshaler, server RoveServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StatusRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Status(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterRoveHandlerServer registers the http handlers for service Rove to "mux". -// UnaryRPC :call RoveServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -func RegisterRoveHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoveServer) error { - - mux.Handle("GET", pattern_Rove_ServerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Rove_ServerStatus_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_ServerStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Rove_Register_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Command_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Rove_Command_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Command_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Rove_Radar_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Rove_Status_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterRoveHandlerFromEndpoint is same as RegisterRoveHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterRoveHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterRoveHandler(ctx, mux, conn) -} - -// RegisterRoveHandler registers the http handlers for service Rove to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterRoveHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterRoveHandlerClient(ctx, mux, NewRoveClient(conn)) -} - -// RegisterRoveHandlerClient registers the http handlers for service Rove -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoveClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoveClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "RoveClient" to call the correct interceptors. -func RegisterRoveHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoveClient) error { - - mux.Handle("GET", pattern_Rove_ServerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Rove_ServerStatus_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_ServerStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Rove_Register_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Register_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Command_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Rove_Command_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Command_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Radar_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Rove_Radar_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Radar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Rove_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Rove_Status_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Rove_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Rove_ServerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"server-status"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Rove_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Rove_Command_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"command"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Rove_Radar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"radar"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Rove_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_Rove_ServerStatus_0 = runtime.ForwardResponseMessage - - forward_Rove_Register_0 = runtime.ForwardResponseMessage - - forward_Rove_Command_0 = runtime.ForwardResponseMessage - - forward_Rove_Radar_0 = runtime.ForwardResponseMessage - - forward_Rove_Status_0 = runtime.ForwardResponseMessage -) diff --git a/pkg/rove/rove.swagger.json b/pkg/rove/rove.swagger.json deleted file mode 100644 index b1ad0aa..0000000 --- a/pkg/rove/rove.swagger.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "Rove", - "description": "Rove is an asychronous nomadic game about exploring a planet as part of a loose community", - "version": "version not set" - }, - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": {}, - "definitions": { - "gatewayruntimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - }, - "roveAccount": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "secret": { - "type": "string" - } - } - }, - "roveCommand": { - "type": "object", - "properties": { - "command": { - "$ref": "#/definitions/roveCommandType", - "title": "The command type" - }, - "bearing": { - "type": "string", - "title": "A bearing, example: NE\nUsed with MOVE" - }, - "message": { - "type": "string", - "format": "byte", - "title": "A simple message, must be composed of printable ASCII glyphs (32-126)\nmaximum of three characters\nUsed with BROADCAST" - } - } - }, - "roveCommandResponse": { - "type": "object", - "title": "Empty placeholder" - }, - "roveCommandType": { - "type": "string", - "enum": [ - "none", - "move", - "stash", - "repair", - "recharge", - "broadcast" - ], - "default": "none", - "title": "- move: Move the rover in a direction, requires bearing\n - stash: Stashes item at current location in rover inventory\n - repair: Repairs the rover using an inventory object\n - recharge: Waits a tick to add more charge to the rover\n - broadcast: Broadcasts a message to nearby rovers" - }, - "roveLog": { - "type": "object", - "properties": { - "time": { - "type": "string", - "title": "The unix timestamp of the log" - }, - "text": { - "type": "string", - "title": "The text of the log" - } - } - }, - "roveRadarResponse": { - "type": "object", - "properties": { - "range": { - "type": "integer", - "format": "int32", - "title": "The range in tiles from the rover of the radar data" - }, - "tiles": { - "type": "string", - "format": "byte", - "title": "A 1D array representing range*2 + 1 squared set of tiles, origin bottom left and in row-\u003ecolumn order" - }, - "objects": { - "type": "string", - "format": "byte", - "title": "A similar array to the tile array, but containing objects" - } - } - }, - "roveRegisterResponse": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/roveAccount", - "title": "The registered account information" - } - }, - "title": "Empty placeholder" - }, - "roveServerStatusResponse": { - "type": "object", - "properties": { - "version": { - "type": "string", - "title": "The version of the server in v{major}.{minor}-{delta}-{sha} form" - }, - "ready": { - "type": "boolean", - "format": "boolean", - "title": "Whether the server is ready to accept requests" - }, - "tickRate": { - "type": "integer", - "format": "int32", - "title": "The tick rate of the server in minutes (how many minutes per tick)" - }, - "currentTick": { - "type": "integer", - "format": "int32", - "title": "The current tick of the server" - }, - "next_tick": { - "type": "string", - "title": "The time the next tick will occur" - } - } - }, - "roveStatusResponse": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "The name of the rover" - }, - "position": { - "$ref": "#/definitions/roveVector", - "title": "Position of the rover in world coordinates" - }, - "range": { - "type": "integer", - "format": "int32", - "title": "The range of this rover's radar and broadcasting" - }, - "inventory": { - "type": "string", - "format": "byte", - "title": "The items in the rover inventory" - }, - "capacity": { - "type": "integer", - "format": "int32", - "title": "The capacity of the inventory" - }, - "integrity": { - "type": "integer", - "format": "int32", - "title": "The current health of the rover" - }, - "maximumIntegrity": { - "type": "integer", - "format": "int32", - "title": "The maximum health of the rover" - }, - "charge": { - "type": "integer", - "format": "int32", - "title": "The energy stored in the rover" - }, - "maximumCharge": { - "type": "integer", - "format": "int32", - "title": "The max energy the rover can store" - }, - "incomingCommands": { - "type": "array", - "items": { - "$ref": "#/definitions/roveCommand" - }, - "title": "The set of currently incoming commands for this tick" - }, - "queuedCommands": { - "type": "array", - "items": { - "$ref": "#/definitions/roveCommand" - }, - "title": "The set of currently queued commands" - }, - "logs": { - "type": "array", - "items": { - "$ref": "#/definitions/roveLog" - }, - "title": "The most recent logs" - } - } - }, - "roveVector": { - "type": "object", - "properties": { - "x": { - "type": "integer", - "format": "int32" - }, - "y": { - "type": "integer", - "format": "int32" - } - } - } - } -} From 5ac44d85cbd1f71351ee9fa254da06ea56b43b2c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:38:49 +0100 Subject: [PATCH 366/495] Add a warning to missing DATA_PATH env --- cmd/rove-server/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/rove-server/main.go b/cmd/rove-server/main.go index db09130..66621cf 100644 --- a/cmd/rove-server/main.go +++ b/cmd/rove-server/main.go @@ -52,7 +52,9 @@ func InnerMain() { log.Printf("Initialising version %s...\n", version.Version) // Set the persistence path - if err := persistence.SetPath(data); err != nil { + if len(data) == 0 { + log.Fatal("DATA_PATH not set") + } else if err := persistence.SetPath(data); err != nil { log.Fatal(err) } From fb2ffc52523faf8659790ecf6b80392948bbaa1a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:52:00 +0100 Subject: [PATCH 367/495] Convert Atlas to an interface --- pkg/atlas/atlas.go | 46 ++++++++++++++++++++++++++--------------- pkg/atlas/atlas_test.go | 22 ++++++++++---------- pkg/game/world.go | 4 ++-- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index dd618e7..b94d923 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -27,6 +27,18 @@ const ( TileSand = Tile('~') ) +// Atlas represents a 2D world atlas of tiles and objects +type Atlas interface { + // SetTile sets a location on the Atlas to a type of tile + SetTile(v vector.Vector, tile Tile) + + // SetObject will set a location on the Atlas to contain an object + SetObject(v vector.Vector, obj objects.Object) + + // QueryPosition queries a position on the atlas + QueryPosition(v vector.Vector) (byte, objects.Object) +} + // Chunk represents a fixed square grid of tiles type Chunk struct { // Tiles represents the tiles within the chunk @@ -37,8 +49,8 @@ type Chunk struct { Objects map[int]objects.Object `json:"objects"` } -// Atlas represents a grid of Chunks -type Atlas struct { +// ChunkBasedAtlas represents a grid of Chunks +type ChunkBasedAtlas struct { // Chunks represents all chunks in the world // This is intentionally not a 2D array so it can be expanded in all directions Chunks []Chunk `json:"chunks"` @@ -68,7 +80,7 @@ const ( // NewAtlas creates a new empty atlas func NewAtlas(chunkSize int) Atlas { // Start up with one chunk - a := Atlas{ + a := ChunkBasedAtlas{ ChunkSize: chunkSize, Chunks: make([]Chunk, 1), LowerBound: vector.Vector{X: 0, Y: 0}, @@ -78,25 +90,25 @@ func NewAtlas(chunkSize int) Atlas { } // Initialise the first chunk a.populate(0) - return a + return &a } // SetTile sets an individual tile's kind -func (a *Atlas) SetTile(v vector.Vector, tile Tile) { +func (a *ChunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setTile(c, local, byte(tile)) } // SetObject sets the object on a tile -func (a *Atlas) SetObject(v vector.Vector, obj objects.Object) { +func (a *ChunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setObject(c, local, obj) } // QueryPosition will return information for a specific position -func (a *Atlas) QueryPosition(v vector.Vector) (byte, objects.Object) { +func (a *ChunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.populate(c) @@ -106,12 +118,12 @@ func (a *Atlas) QueryPosition(v vector.Vector) (byte, objects.Object) { } // chunkTileID returns the tile index within a chunk -func (a *Atlas) chunkTileIndex(local vector.Vector) int { +func (a *ChunkBasedAtlas) chunkTileIndex(local vector.Vector) int { return local.X + local.Y*a.ChunkSize } // populate will fill a chunk with data -func (a *Atlas) populate(chunk int) { +func (a *ChunkBasedAtlas) populate(chunk int) { c := a.Chunks[chunk] if c.Tiles != nil { return @@ -165,7 +177,7 @@ func (a *Atlas) populate(chunk int) { } // setTile sets a tile in a specific chunk -func (a *Atlas) setTile(chunk int, local vector.Vector, tile byte) { +func (a *ChunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { a.populate(chunk) c := a.Chunks[chunk] c.Tiles[a.chunkTileIndex(local)] = tile @@ -173,7 +185,7 @@ func (a *Atlas) setTile(chunk int, local vector.Vector, tile byte) { } // setObject sets an object in a specific chunk -func (a *Atlas) setObject(chunk int, local vector.Vector, object objects.Object) { +func (a *ChunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { a.populate(chunk) c := a.Chunks[chunk] @@ -187,12 +199,12 @@ func (a *Atlas) setObject(chunk int, local vector.Vector, object objects.Object) } // worldSpaceToChunkLocal gets a chunk local coordinate for a tile -func (a *Atlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { +func (a *ChunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } // worldSpaceToChunkID gets the current chunk ID for a position in the world -func (a *Atlas) worldSpaceToChunkIndex(v vector.Vector) int { +func (a *ChunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { // Shift the vector by our current min v = v.Added(a.LowerBound.Negated()) @@ -208,7 +220,7 @@ func (a *Atlas) worldSpaceToChunkIndex(v vector.Vector) int { } // chunkOriginInWorldSpace returns the origin of the chunk in world space -func (a *Atlas) chunkOriginInWorldSpace(chunk int) vector.Vector { +func (a *ChunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { // Calculate the width width := a.UpperBound.X - a.LowerBound.X widthInChunks := width / a.ChunkSize @@ -225,7 +237,7 @@ func (a *Atlas) chunkOriginInWorldSpace(chunk int) vector.Vector { } // getNewBounds gets new lower and upper bounds for the world space given a vector -func (a *Atlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { +func (a *ChunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { lower = vector.Min(v, a.LowerBound) upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) @@ -241,7 +253,7 @@ func (a *Atlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector } // worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed -func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { +func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { // If we're within bounds, just return the current chunk if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { return a.worldSpaceToChunkIndex(v) @@ -253,7 +265,7 @@ func (a *Atlas) worldSpaceToChunkWithGrow(v vector.Vector) int { size = size.Divided(a.ChunkSize) // Create the new empty atlas - newAtlas := Atlas{ + newAtlas := ChunkBasedAtlas{ ChunkSize: a.ChunkSize, LowerBound: lower, UpperBound: upper, diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index dedf4b1..1803bea 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -10,14 +10,14 @@ import ( ) func TestAtlas_NewAtlas(t *testing.T) { - a := NewAtlas(1) + a := NewAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, a.ChunkSize) assert.Equal(t, 1, len(a.Chunks)) // Should start empty } func TestAtlas_toChunk(t *testing.T) { - a := NewAtlas(1) + a := NewAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks @@ -38,7 +38,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) - a = NewAtlas(2) + a = NewAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -58,7 +58,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) - a = NewAtlas(2) + a = NewAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -83,7 +83,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) - a = NewAtlas(3) + a = NewAtlas(3).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -105,7 +105,7 @@ func TestAtlas_toChunk(t *testing.T) { } func TestAtlas_toWorld(t *testing.T) { - a := NewAtlas(1) + a := NewAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn some chunks @@ -119,7 +119,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) - a = NewAtlas(2) + a = NewAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -133,7 +133,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) - a = NewAtlas(2) + a = NewAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -152,7 +152,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) - a = NewAtlas(3) + a = NewAtlas(3).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -198,7 +198,7 @@ func TestAtlas_GetSetObject(t *testing.T) { func TestAtlas_Grown(t *testing.T) { // Start with a small example - a := NewAtlas(2) + a := NewAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) @@ -233,7 +233,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { for x := -i * 2; x < i*2; x++ { for y := -i * 2; y < i*2; y++ { - a := NewAtlas(i) + a := NewAtlas(i).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) diff --git a/pkg/game/world.go b/pkg/game/world.go index 19183f5..89a70e5 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -107,8 +107,8 @@ func (w *World) SpawnRover() (string, error) { // Spawn in a random place near the origin rover.Pos = vector.Vector{ - X: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), - Y: w.Atlas.ChunkSize/2 - rand.Intn(w.Atlas.ChunkSize), + X: 10 - rand.Intn(20), + Y: 10 - rand.Intn(20), } // Seach until we error (run out of world) From 655e00b41fbe33b9e63fa478baa29acb5c3957b2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:52:31 +0100 Subject: [PATCH 368/495] Don't expose Chunk externally --- pkg/atlas/atlas.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index b94d923..0793dc9 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -39,8 +39,8 @@ type Atlas interface { QueryPosition(v vector.Vector) (byte, objects.Object) } -// Chunk represents a fixed square grid of tiles -type Chunk struct { +// chunk represents a fixed square grid of tiles +type chunk struct { // Tiles represents the tiles within the chunk Tiles []byte `json:"tiles"` @@ -53,7 +53,7 @@ type Chunk struct { type ChunkBasedAtlas struct { // Chunks represents all chunks in the world // This is intentionally not a 2D array so it can be expanded in all directions - Chunks []Chunk `json:"chunks"` + Chunks []chunk `json:"chunks"` // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) LowerBound vector.Vector `json:"lowerBound"` @@ -82,7 +82,7 @@ func NewAtlas(chunkSize int) Atlas { // Start up with one chunk a := ChunkBasedAtlas{ ChunkSize: chunkSize, - Chunks: make([]Chunk, 1), + Chunks: make([]chunk, 1), LowerBound: vector.Vector{X: 0, Y: 0}, UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, terrainNoise: opensimplex.New(noiseSeed), @@ -269,7 +269,7 @@ func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { ChunkSize: a.ChunkSize, LowerBound: lower, UpperBound: upper, - Chunks: make([]Chunk, size.X*size.Y), + Chunks: make([]chunk, size.X*size.Y), terrainNoise: a.terrainNoise, objectNoise: a.objectNoise, } From a0be8a463c72ffdfe4e52fff7823316f1bedd660 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:54:43 +0100 Subject: [PATCH 369/495] Pull out chunk based atlas into new file --- pkg/atlas/atlas.go | 260 --------------------------------------- pkg/atlas/atlas_test.go | 28 ++--- pkg/atlas/chunkAtlas.go | 266 ++++++++++++++++++++++++++++++++++++++++ pkg/game/world.go | 2 +- 4 files changed, 281 insertions(+), 275 deletions(-) create mode 100644 pkg/atlas/chunkAtlas.go diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 0793dc9..d4054db 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,13 +1,8 @@ package atlas import ( - "log" - "math/rand" - - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" - "github.com/ojrac/opensimplex-go" ) // Tile describes the type of terrain @@ -38,258 +33,3 @@ type Atlas interface { // QueryPosition queries a position on the atlas QueryPosition(v vector.Vector) (byte, objects.Object) } - -// chunk represents a fixed square grid of tiles -type chunk struct { - // Tiles represents the tiles within the chunk - Tiles []byte `json:"tiles"` - - // Objects represents the objects within the chunk - // only one possible object per tile for now - Objects map[int]objects.Object `json:"objects"` -} - -// ChunkBasedAtlas represents a grid of Chunks -type ChunkBasedAtlas struct { - // Chunks represents all chunks in the world - // This is intentionally not a 2D array so it can be expanded in all directions - Chunks []chunk `json:"chunks"` - - // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) - LowerBound vector.Vector `json:"lowerBound"` - - // UpperBound is the top left corner of the current chunks (curent chunks cover < this value) - UpperBound vector.Vector `json:"upperBound"` - - // ChunkSize is the x/y dimensions of each square chunk - ChunkSize int `json:"chunksize"` - - // terrainNoise describes the noise function for the terrain - terrainNoise opensimplex.Noise - - // terrainNoise describes the noise function for the terrain - objectNoise opensimplex.Noise -} - -const ( - noiseSeed = 1024 - terrainNoiseScale = 6 - objectNoiseScale = 3 -) - -// NewAtlas creates a new empty atlas -func NewAtlas(chunkSize int) Atlas { - // Start up with one chunk - a := ChunkBasedAtlas{ - ChunkSize: chunkSize, - Chunks: make([]chunk, 1), - LowerBound: vector.Vector{X: 0, Y: 0}, - UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, - terrainNoise: opensimplex.New(noiseSeed), - objectNoise: opensimplex.New(noiseSeed), - } - // Initialise the first chunk - a.populate(0) - return &a -} - -// SetTile sets an individual tile's kind -func (a *ChunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { - c := a.worldSpaceToChunkWithGrow(v) - local := a.worldSpaceToChunkLocal(v) - a.setTile(c, local, byte(tile)) -} - -// SetObject sets the object on a tile -func (a *ChunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { - c := a.worldSpaceToChunkWithGrow(v) - local := a.worldSpaceToChunkLocal(v) - a.setObject(c, local, obj) -} - -// QueryPosition will return information for a specific position -func (a *ChunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { - c := a.worldSpaceToChunkWithGrow(v) - local := a.worldSpaceToChunkLocal(v) - a.populate(c) - chunk := a.Chunks[c] - i := a.chunkTileIndex(local) - return chunk.Tiles[i], chunk.Objects[i] -} - -// chunkTileID returns the tile index within a chunk -func (a *ChunkBasedAtlas) chunkTileIndex(local vector.Vector) int { - return local.X + local.Y*a.ChunkSize -} - -// populate will fill a chunk with data -func (a *ChunkBasedAtlas) populate(chunk int) { - c := a.Chunks[chunk] - if c.Tiles != nil { - return - } - - c.Tiles = make([]byte, a.ChunkSize*a.ChunkSize) - c.Objects = make(map[int]objects.Object) - - origin := a.chunkOriginInWorldSpace(chunk) - for i := 0; i < a.ChunkSize; i++ { - for j := 0; j < a.ChunkSize; j++ { - - // Get the terrain noise value for this location - t := a.terrainNoise.Eval2(float64(origin.X+i)/terrainNoiseScale, float64(origin.Y+j)/terrainNoiseScale) - var tile Tile - switch { - case t > 0.5: - tile = TileGravel - case t > 0.05: - tile = TileSand - default: - tile = TileRock - } - c.Tiles[j*a.ChunkSize+i] = byte(tile) - - // Get the object noise value for this location - o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) - var obj = objects.None - switch { - case o > 0.6: - obj = objects.LargeRock - case o > 0.5: - obj = objects.SmallRock - } - if obj != objects.None { - c.Objects[j*a.ChunkSize+i] = objects.Object{Type: obj} - } - } - } - - // Set up any objects - for i := 0; i < len(c.Tiles); i++ { - if rand.Intn(16) == 0 { - c.Objects[i] = objects.Object{Type: objects.LargeRock} - } else if rand.Intn(32) == 0 { - c.Objects[i] = objects.Object{Type: objects.SmallRock} - } - } - - a.Chunks[chunk] = c -} - -// setTile sets a tile in a specific chunk -func (a *ChunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { - a.populate(chunk) - c := a.Chunks[chunk] - c.Tiles[a.chunkTileIndex(local)] = tile - a.Chunks[chunk] = c -} - -// setObject sets an object in a specific chunk -func (a *ChunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { - a.populate(chunk) - - c := a.Chunks[chunk] - i := a.chunkTileIndex(local) - if object.Type != objects.None { - c.Objects[i] = object - } else { - delete(c.Objects, i) - } - a.Chunks[chunk] = c -} - -// worldSpaceToChunkLocal gets a chunk local coordinate for a tile -func (a *ChunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { - return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} -} - -// worldSpaceToChunkID gets the current chunk ID for a position in the world -func (a *ChunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { - // Shift the vector by our current min - v = v.Added(a.LowerBound.Negated()) - - // Divide by the current size and floor, to get chunk-scaled vector from the lower bound - v = v.DividedFloor(a.ChunkSize) - - // Calculate the width - width := a.UpperBound.X - a.LowerBound.X - widthInChunks := width / a.ChunkSize - - // Along the corridor and up the stairs - return (v.Y * widthInChunks) + v.X -} - -// chunkOriginInWorldSpace returns the origin of the chunk in world space -func (a *ChunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { - // Calculate the width - width := a.UpperBound.X - a.LowerBound.X - widthInChunks := width / a.ChunkSize - - // Reverse the along the corridor and up the stairs - v := vector.Vector{ - X: chunk % widthInChunks, - Y: chunk / widthInChunks, - } - // Multiply up to world scale - v = v.Multiplied(a.ChunkSize) - // Shift by the lower bound - return v.Added(a.LowerBound) -} - -// getNewBounds gets new lower and upper bounds for the world space given a vector -func (a *ChunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { - lower = vector.Min(v, a.LowerBound) - upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) - - lower = vector.Vector{ - X: maths.RoundDown(lower.X, a.ChunkSize), - Y: maths.RoundDown(lower.Y, a.ChunkSize), - } - upper = vector.Vector{ - X: maths.RoundUp(upper.X, a.ChunkSize), - Y: maths.RoundUp(upper.Y, a.ChunkSize), - } - return -} - -// worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed -func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { - // If we're within bounds, just return the current chunk - if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { - return a.worldSpaceToChunkIndex(v) - } - - // Calculate the new bounds - lower, upper := a.getNewBounds(v) - size := upper.Added(lower.Negated()) - size = size.Divided(a.ChunkSize) - - // Create the new empty atlas - newAtlas := ChunkBasedAtlas{ - ChunkSize: a.ChunkSize, - LowerBound: lower, - UpperBound: upper, - Chunks: make([]chunk, size.X*size.Y), - terrainNoise: a.terrainNoise, - objectNoise: a.objectNoise, - } - - // Log that we're resizing - log.Printf("Re-allocating world, old: %+v,%+v new: %+v,%+v\n", a.LowerBound, a.UpperBound, newAtlas.LowerBound, newAtlas.UpperBound) - - // Copy all old chunks into the new atlas - for chunk, chunkData := range a.Chunks { - - // Calculate the chunk ID in the new atlas - origin := a.chunkOriginInWorldSpace(chunk) - newChunk := newAtlas.worldSpaceToChunkIndex(origin) - - // Copy over the old chunk to the new atlas - newAtlas.Chunks[newChunk] = chunkData - } - - // Overwrite the old atlas with this one - *a = newAtlas - - return a.worldSpaceToChunkIndex(v) -} diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 1803bea..1805d66 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -10,14 +10,14 @@ import ( ) func TestAtlas_NewAtlas(t *testing.T) { - a := NewAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, a.ChunkSize) assert.Equal(t, 1, len(a.Chunks)) // Should start empty } func TestAtlas_toChunk(t *testing.T) { - a := NewAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks @@ -38,7 +38,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) - a = NewAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -58,7 +58,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) - a = NewAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -83,7 +83,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) - a = NewAtlas(3).(*ChunkBasedAtlas) + a = NewChunkAtlas(3).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -105,7 +105,7 @@ func TestAtlas_toChunk(t *testing.T) { } func TestAtlas_toWorld(t *testing.T) { - a := NewAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn some chunks @@ -119,7 +119,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) - a = NewAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -133,7 +133,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) - a = NewAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -152,7 +152,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) - a = NewAtlas(3).(*ChunkBasedAtlas) + a = NewChunkAtlas(3).(*ChunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -167,7 +167,7 @@ func TestAtlas_toWorld(t *testing.T) { } func TestAtlas_GetSetTile(t *testing.T) { - a := NewAtlas(10) + a := NewChunkAtlas(10) assert.NotNil(t, a) // Set the origin tile to 1 and test it @@ -182,7 +182,7 @@ func TestAtlas_GetSetTile(t *testing.T) { } func TestAtlas_GetSetObject(t *testing.T) { - a := NewAtlas(10) + a := NewChunkAtlas(10) assert.NotNil(t, a) // Set the origin tile to 1 and test it @@ -198,7 +198,7 @@ func TestAtlas_GetSetObject(t *testing.T) { func TestAtlas_Grown(t *testing.T) { // Start with a small example - a := NewAtlas(2).(*ChunkBasedAtlas) + a := NewChunkAtlas(2).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) @@ -233,7 +233,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { for x := -i * 2; x < i*2; x++ { for y := -i * 2; y < i*2; y++ { - a := NewAtlas(i).(*ChunkBasedAtlas) + a := NewChunkAtlas(i).(*ChunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) @@ -251,7 +251,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { } func TestAtlas_WorldGen(t *testing.T) { - a := NewAtlas(8) + a := NewChunkAtlas(8) // Spawn a large world _, _ = a.QueryPosition(vector.Vector{X: 20, Y: 20}) diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go new file mode 100644 index 0000000..00231af --- /dev/null +++ b/pkg/atlas/chunkAtlas.go @@ -0,0 +1,266 @@ +package atlas + +import ( + "log" + "math/rand" + + "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/objects" + "github.com/mdiluz/rove/pkg/vector" + "github.com/ojrac/opensimplex-go" +) + +// chunk represents a fixed square grid of tiles +type chunk struct { + // Tiles represents the tiles within the chunk + Tiles []byte `json:"tiles"` + + // Objects represents the objects within the chunk + // only one possible object per tile for now + Objects map[int]objects.Object `json:"objects"` +} + +// ChunkBasedAtlas represents a grid of Chunks +type ChunkBasedAtlas struct { + // Chunks represents all chunks in the world + // This is intentionally not a 2D array so it can be expanded in all directions + Chunks []chunk `json:"chunks"` + + // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) + LowerBound vector.Vector `json:"lowerBound"` + + // UpperBound is the top left corner of the current chunks (curent chunks cover < this value) + UpperBound vector.Vector `json:"upperBound"` + + // ChunkSize is the x/y dimensions of each square chunk + ChunkSize int `json:"chunksize"` + + // terrainNoise describes the noise function for the terrain + terrainNoise opensimplex.Noise + + // terrainNoise describes the noise function for the terrain + objectNoise opensimplex.Noise +} + +const ( + noiseSeed = 1024 + terrainNoiseScale = 6 + objectNoiseScale = 3 +) + +// NewChunkAtlas creates a new empty atlas +func NewChunkAtlas(chunkSize int) Atlas { + // Start up with one chunk + a := ChunkBasedAtlas{ + ChunkSize: chunkSize, + Chunks: make([]chunk, 1), + LowerBound: vector.Vector{X: 0, Y: 0}, + UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, + terrainNoise: opensimplex.New(noiseSeed), + objectNoise: opensimplex.New(noiseSeed), + } + // Initialise the first chunk + a.populate(0) + return &a +} + +// SetTile sets an individual tile's kind +func (a *ChunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { + c := a.worldSpaceToChunkWithGrow(v) + local := a.worldSpaceToChunkLocal(v) + a.setTile(c, local, byte(tile)) +} + +// SetObject sets the object on a tile +func (a *ChunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { + c := a.worldSpaceToChunkWithGrow(v) + local := a.worldSpaceToChunkLocal(v) + a.setObject(c, local, obj) +} + +// QueryPosition will return information for a specific position +func (a *ChunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { + c := a.worldSpaceToChunkWithGrow(v) + local := a.worldSpaceToChunkLocal(v) + a.populate(c) + chunk := a.Chunks[c] + i := a.chunkTileIndex(local) + return chunk.Tiles[i], chunk.Objects[i] +} + +// chunkTileID returns the tile index within a chunk +func (a *ChunkBasedAtlas) chunkTileIndex(local vector.Vector) int { + return local.X + local.Y*a.ChunkSize +} + +// populate will fill a chunk with data +func (a *ChunkBasedAtlas) populate(chunk int) { + c := a.Chunks[chunk] + if c.Tiles != nil { + return + } + + c.Tiles = make([]byte, a.ChunkSize*a.ChunkSize) + c.Objects = make(map[int]objects.Object) + + origin := a.chunkOriginInWorldSpace(chunk) + for i := 0; i < a.ChunkSize; i++ { + for j := 0; j < a.ChunkSize; j++ { + + // Get the terrain noise value for this location + t := a.terrainNoise.Eval2(float64(origin.X+i)/terrainNoiseScale, float64(origin.Y+j)/terrainNoiseScale) + var tile Tile + switch { + case t > 0.5: + tile = TileGravel + case t > 0.05: + tile = TileSand + default: + tile = TileRock + } + c.Tiles[j*a.ChunkSize+i] = byte(tile) + + // Get the object noise value for this location + o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) + var obj = objects.None + switch { + case o > 0.6: + obj = objects.LargeRock + case o > 0.5: + obj = objects.SmallRock + } + if obj != objects.None { + c.Objects[j*a.ChunkSize+i] = objects.Object{Type: obj} + } + } + } + + // Set up any objects + for i := 0; i < len(c.Tiles); i++ { + if rand.Intn(16) == 0 { + c.Objects[i] = objects.Object{Type: objects.LargeRock} + } else if rand.Intn(32) == 0 { + c.Objects[i] = objects.Object{Type: objects.SmallRock} + } + } + + a.Chunks[chunk] = c +} + +// setTile sets a tile in a specific chunk +func (a *ChunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { + a.populate(chunk) + c := a.Chunks[chunk] + c.Tiles[a.chunkTileIndex(local)] = tile + a.Chunks[chunk] = c +} + +// setObject sets an object in a specific chunk +func (a *ChunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { + a.populate(chunk) + + c := a.Chunks[chunk] + i := a.chunkTileIndex(local) + if object.Type != objects.None { + c.Objects[i] = object + } else { + delete(c.Objects, i) + } + a.Chunks[chunk] = c +} + +// worldSpaceToChunkLocal gets a chunk local coordinate for a tile +func (a *ChunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { + return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} +} + +// worldSpaceToChunkID gets the current chunk ID for a position in the world +func (a *ChunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { + // Shift the vector by our current min + v = v.Added(a.LowerBound.Negated()) + + // Divide by the current size and floor, to get chunk-scaled vector from the lower bound + v = v.DividedFloor(a.ChunkSize) + + // Calculate the width + width := a.UpperBound.X - a.LowerBound.X + widthInChunks := width / a.ChunkSize + + // Along the corridor and up the stairs + return (v.Y * widthInChunks) + v.X +} + +// chunkOriginInWorldSpace returns the origin of the chunk in world space +func (a *ChunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { + // Calculate the width + width := a.UpperBound.X - a.LowerBound.X + widthInChunks := width / a.ChunkSize + + // Reverse the along the corridor and up the stairs + v := vector.Vector{ + X: chunk % widthInChunks, + Y: chunk / widthInChunks, + } + // Multiply up to world scale + v = v.Multiplied(a.ChunkSize) + // Shift by the lower bound + return v.Added(a.LowerBound) +} + +// getNewBounds gets new lower and upper bounds for the world space given a vector +func (a *ChunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { + lower = vector.Min(v, a.LowerBound) + upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) + + lower = vector.Vector{ + X: maths.RoundDown(lower.X, a.ChunkSize), + Y: maths.RoundDown(lower.Y, a.ChunkSize), + } + upper = vector.Vector{ + X: maths.RoundUp(upper.X, a.ChunkSize), + Y: maths.RoundUp(upper.Y, a.ChunkSize), + } + return +} + +// worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed +func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { + // If we're within bounds, just return the current chunk + if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { + return a.worldSpaceToChunkIndex(v) + } + + // Calculate the new bounds + lower, upper := a.getNewBounds(v) + size := upper.Added(lower.Negated()) + size = size.Divided(a.ChunkSize) + + // Create the new empty atlas + newAtlas := ChunkBasedAtlas{ + ChunkSize: a.ChunkSize, + LowerBound: lower, + UpperBound: upper, + Chunks: make([]chunk, size.X*size.Y), + terrainNoise: a.terrainNoise, + objectNoise: a.objectNoise, + } + + // Log that we're resizing + log.Printf("Re-allocating world, old: %+v,%+v new: %+v,%+v\n", a.LowerBound, a.UpperBound, newAtlas.LowerBound, newAtlas.UpperBound) + + // Copy all old chunks into the new atlas + for chunk, chunkData := range a.Chunks { + + // Calculate the chunk ID in the new atlas + origin := a.chunkOriginInWorldSpace(chunk) + newChunk := newAtlas.worldSpaceToChunkIndex(origin) + + // Copy over the old chunk to the new atlas + newAtlas.Chunks[newChunk] = chunkData + } + + // Overwrite the old atlas with this one + *a = newAtlas + + return a.worldSpaceToChunkIndex(v) +} diff --git a/pkg/game/world.go b/pkg/game/world.go index 89a70e5..f7476fb 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -70,7 +70,7 @@ func NewWorld(chunkSize int) *World { Rovers: make(map[string]Rover), CommandQueue: make(map[string]CommandStream), CommandIncoming: make(map[string]CommandStream), - Atlas: atlas.NewAtlas(chunkSize), + Atlas: atlas.NewChunkAtlas(chunkSize), words: lines, TicksPerDay: 24, CurrentTicks: 0, From 9a7c48ae7828f1fc192b6e820117e2a1b66cd42f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:56:17 +0100 Subject: [PATCH 370/495] Make chunkBasedAtlas private --- pkg/atlas/atlas_test.go | 22 +++++++++++----------- pkg/atlas/chunkAtlas.go | 32 ++++++++++++++++---------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 1805d66..1b1447e 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -10,14 +10,14 @@ import ( ) func TestAtlas_NewAtlas(t *testing.T) { - a := NewChunkAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*chunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, a.ChunkSize) assert.Equal(t, 1, len(a.Chunks)) // Should start empty } func TestAtlas_toChunk(t *testing.T) { - a := NewChunkAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks @@ -38,7 +38,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) - a = NewChunkAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -58,7 +58,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) - a = NewChunkAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -83,7 +83,7 @@ func TestAtlas_toChunk(t *testing.T) { chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) - a = NewChunkAtlas(3).(*ChunkBasedAtlas) + a = NewChunkAtlas(3).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -105,7 +105,7 @@ func TestAtlas_toChunk(t *testing.T) { } func TestAtlas_toWorld(t *testing.T) { - a := NewChunkAtlas(1).(*ChunkBasedAtlas) + a := NewChunkAtlas(1).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn some chunks @@ -119,7 +119,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) - a = NewChunkAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks a.QueryPosition(vector.Vector{X: -2, Y: -2}) @@ -133,7 +133,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) - a = NewChunkAtlas(2).(*ChunkBasedAtlas) + a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -152,7 +152,7 @@ func TestAtlas_toWorld(t *testing.T) { assert.Equal(t, vector.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) assert.Equal(t, vector.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) - a = NewChunkAtlas(3).(*ChunkBasedAtlas) + a = NewChunkAtlas(3).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks a.QueryPosition(vector.Vector{X: 3, Y: 3}) @@ -198,7 +198,7 @@ func TestAtlas_GetSetObject(t *testing.T) { func TestAtlas_Grown(t *testing.T) { // Start with a small example - a := NewChunkAtlas(2).(*ChunkBasedAtlas) + a := NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) @@ -233,7 +233,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { for x := -i * 2; x < i*2; x++ { for y := -i * 2; y < i*2; y++ { - a := NewChunkAtlas(i).(*ChunkBasedAtlas) + a := NewChunkAtlas(i).(*chunkBasedAtlas) assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 00231af..1caac1e 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -20,8 +20,8 @@ type chunk struct { Objects map[int]objects.Object `json:"objects"` } -// ChunkBasedAtlas represents a grid of Chunks -type ChunkBasedAtlas struct { +// chunkBasedAtlas represents a grid of Chunks +type chunkBasedAtlas struct { // Chunks represents all chunks in the world // This is intentionally not a 2D array so it can be expanded in all directions Chunks []chunk `json:"chunks"` @@ -51,7 +51,7 @@ const ( // NewChunkAtlas creates a new empty atlas func NewChunkAtlas(chunkSize int) Atlas { // Start up with one chunk - a := ChunkBasedAtlas{ + a := chunkBasedAtlas{ ChunkSize: chunkSize, Chunks: make([]chunk, 1), LowerBound: vector.Vector{X: 0, Y: 0}, @@ -65,21 +65,21 @@ func NewChunkAtlas(chunkSize int) Atlas { } // SetTile sets an individual tile's kind -func (a *ChunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { +func (a *chunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setTile(c, local, byte(tile)) } // SetObject sets the object on a tile -func (a *ChunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { +func (a *chunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setObject(c, local, obj) } // QueryPosition will return information for a specific position -func (a *ChunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { +func (a *chunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.populate(c) @@ -89,12 +89,12 @@ func (a *ChunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) } // chunkTileID returns the tile index within a chunk -func (a *ChunkBasedAtlas) chunkTileIndex(local vector.Vector) int { +func (a *chunkBasedAtlas) chunkTileIndex(local vector.Vector) int { return local.X + local.Y*a.ChunkSize } // populate will fill a chunk with data -func (a *ChunkBasedAtlas) populate(chunk int) { +func (a *chunkBasedAtlas) populate(chunk int) { c := a.Chunks[chunk] if c.Tiles != nil { return @@ -148,7 +148,7 @@ func (a *ChunkBasedAtlas) populate(chunk int) { } // setTile sets a tile in a specific chunk -func (a *ChunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { +func (a *chunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { a.populate(chunk) c := a.Chunks[chunk] c.Tiles[a.chunkTileIndex(local)] = tile @@ -156,7 +156,7 @@ func (a *ChunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { } // setObject sets an object in a specific chunk -func (a *ChunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { +func (a *chunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { a.populate(chunk) c := a.Chunks[chunk] @@ -170,12 +170,12 @@ func (a *ChunkBasedAtlas) setObject(chunk int, local vector.Vector, object objec } // worldSpaceToChunkLocal gets a chunk local coordinate for a tile -func (a *ChunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { +func (a *chunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } // worldSpaceToChunkID gets the current chunk ID for a position in the world -func (a *ChunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { +func (a *chunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { // Shift the vector by our current min v = v.Added(a.LowerBound.Negated()) @@ -191,7 +191,7 @@ func (a *ChunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { } // chunkOriginInWorldSpace returns the origin of the chunk in world space -func (a *ChunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { +func (a *chunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { // Calculate the width width := a.UpperBound.X - a.LowerBound.X widthInChunks := width / a.ChunkSize @@ -208,7 +208,7 @@ func (a *ChunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { } // getNewBounds gets new lower and upper bounds for the world space given a vector -func (a *ChunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { +func (a *chunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { lower = vector.Min(v, a.LowerBound) upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) @@ -224,7 +224,7 @@ func (a *ChunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, up } // worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed -func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { +func (a *chunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { // If we're within bounds, just return the current chunk if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { return a.worldSpaceToChunkIndex(v) @@ -236,7 +236,7 @@ func (a *ChunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { size = size.Divided(a.ChunkSize) // Create the new empty atlas - newAtlas := ChunkBasedAtlas{ + newAtlas := chunkBasedAtlas{ ChunkSize: a.ChunkSize, LowerBound: lower, UpperBound: upper, From d6349d081eaa74e47dacee1008b9cf467f2983fb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 16:59:55 +0100 Subject: [PATCH 371/495] Clear the tile before warping to it --- pkg/game/world_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 35c0a22..262a7e9 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -395,6 +395,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A + world.Atlas.SetObject(vector.Vector{X: ra.Range, Y: 0}, objects.Object{Type: objects.None}) assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range, Y: 0})) // Broadcast from a again @@ -411,6 +412,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A + world.Atlas.SetObject(vector.Vector{X: ra.Range + 1, Y: 0}, objects.Object{Type: objects.None}) assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again From c1267829ac6b95834cf41a925fe7fe5ef9b29bb6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 17:00:30 +0100 Subject: [PATCH 372/495] Clear out genproto mod require --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index db01c84..32caba4 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( golang.org/x/net v0.0.0-20200602114024-627f9648deb9 golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 // indirect golang.org/x/text v0.3.3 // indirect - google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 google.golang.org/grpc v1.30.0 google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect From dc2800fa5461de76f35e12a12c361c9e20a18ea1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 17:09:47 +0100 Subject: [PATCH 373/495] Move Accountant behind an interface --- cmd/rove-server/internal/server.go | 4 +- pkg/accounts/accounts.go | 93 +++++------------------------- pkg/accounts/accounts_test.go | 9 +-- pkg/accounts/simpleAccountant.go | 90 +++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 85 deletions(-) create mode 100644 pkg/accounts/simpleAccountant.go diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index ff98f76..a38e20d 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -29,7 +29,7 @@ type Server struct { world *game.World // Accountant - accountant *accounts.Accountant + accountant accounts.Accountant // gRPC server netListener net.Listener @@ -81,7 +81,7 @@ func NewServer(opts ...ServerOption) *Server { persistence: EphemeralData, schedule: cron.New(), world: game.NewWorld(32), - accountant: accounts.NewAccountant(), + accountant: accounts.NewSimpleAccountant(), } // Apply all options diff --git a/pkg/accounts/accounts.go b/pkg/accounts/accounts.go index 08f3ee3..69508c0 100644 --- a/pkg/accounts/accounts.go +++ b/pkg/accounts/accounts.go @@ -1,11 +1,22 @@ package accounts -import ( - "fmt" - "time" +// Accountant decribes something that stores accounts and account values +type Accountant interface { + // RegisterAccount will register a new account and return it's info + RegisterAccount(name string) (acc Account, err error) - "github.com/google/uuid" -) + // AssignData stores a custom account key value pair + AssignData(account string, key string, value string) error + + // GetValue returns custom account data for a specific key + GetValue(account string, key string) (string, error) + + // VerifySecret will verify whether the account secret matches with the + VerifySecret(account string, secret string) (bool, error) + + // GetSecret gets the secret associated with an account + GetSecret(account string) (string, error) +} // Account represents a registered user type Account struct { @@ -15,75 +26,3 @@ type Account struct { // Data represents internal account data Data map[string]string `json:"data"` } - -// Accountant manages a set of accounts -type Accountant struct { - Accounts map[string]Account `json:"accounts"` -} - -// NewAccountant creates a new accountant -func NewAccountant() *Accountant { - return &Accountant{ - Accounts: make(map[string]Account), - } -} - -// RegisterAccount adds an account to the set of internal accounts -func (a *Accountant) RegisterAccount(name string) (acc Account, err error) { - - // Set up the account info - acc.Name = name - acc.Data = make(map[string]string) - - // Verify this acount isn't already registered - for _, a := range a.Accounts { - if a.Name == acc.Name { - return Account{}, fmt.Errorf("account name already registered: %s", a.Name) - } - } - - // Set the creation time - acc.Data["created"] = time.Now().String() - - // Create a secret - acc.Data["secret"] = uuid.New().String() - - // Simply add the account to the map - a.Accounts[acc.Name] = acc - - return -} - -// VerifySecret verifies if an account secret is correct -func (a *Accountant) VerifySecret(account string, secret string) (bool, error) { - // Find the account matching the ID - if this, ok := a.Accounts[account]; ok { - return this.Data["secret"] == secret, nil - } - - return false, fmt.Errorf("no account found for id: %s", account) -} - -// AssignData assigns data to an account -func (a *Accountant) AssignData(account string, key string, value string) error { - - // Find the account matching the ID - if this, ok := a.Accounts[account]; ok { - this.Data[key] = value - a.Accounts[account] = this - } else { - return fmt.Errorf("no account found for id: %s", account) - } - - return nil -} - -// GetValue gets the rover rover for the account -func (a *Accountant) GetValue(account string, key string) (string, error) { - // Find the account matching the ID - this, ok := a.Accounts[account] - if !ok { - return "", fmt.Errorf("no account found for id: %s", account) - } - return this.Data[key], nil -} diff --git a/pkg/accounts/accounts_test.go b/pkg/accounts/accounts_test.go index 893c57d..bd2416f 100644 --- a/pkg/accounts/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -8,7 +8,7 @@ import ( func TestNewAccountant(t *testing.T) { // Very basic verify here for now - accountant := NewAccountant() + accountant := NewSimpleAccountant() if accountant == nil { t.Error("Failed to create accountant") } @@ -16,7 +16,7 @@ func TestNewAccountant(t *testing.T) { func TestAccountant_RegisterAccount(t *testing.T) { - accountant := NewAccountant() + accountant := NewSimpleAccountant() // Start by making two accounts @@ -44,10 +44,7 @@ func TestAccountant_RegisterAccount(t *testing.T) { } func TestAccountant_AssignGetData(t *testing.T) { - accountant := NewAccountant() - if len(accountant.Accounts) != 0 { - t.Error("New accountant created with non-zero account number") - } + accountant := NewSimpleAccountant() name := uuid.New().String() a, err := accountant.RegisterAccount(name) diff --git a/pkg/accounts/simpleAccountant.go b/pkg/accounts/simpleAccountant.go new file mode 100644 index 0000000..023fe2f --- /dev/null +++ b/pkg/accounts/simpleAccountant.go @@ -0,0 +1,90 @@ +package accounts + +import ( + "fmt" + "time" + + "github.com/google/uuid" +) + +// SimpleAccountant manages a set of accounts +type SimpleAccountant struct { + Accounts map[string]Account `json:"accounts"` +} + +// NewSimpleAccountant creates a new accountant +func NewSimpleAccountant() Accountant { + return &SimpleAccountant{ + Accounts: make(map[string]Account), + } +} + +// RegisterAccount adds an account to the set of internal accounts +func (a *SimpleAccountant) RegisterAccount(name string) (acc Account, err error) { + + // Set up the account info + acc.Name = name + acc.Data = make(map[string]string) + + // Verify this acount isn't already registered + for _, a := range a.Accounts { + if a.Name == acc.Name { + return Account{}, fmt.Errorf("account name already registered: %s", a.Name) + } + } + + // Set the creation time + acc.Data["created"] = time.Now().String() + + // Create a secret + acc.Data["secret"] = uuid.New().String() + + // Simply add the account to the map + a.Accounts[acc.Name] = acc + + return +} + +// VerifySecret verifies if an account secret is correct +func (a *SimpleAccountant) VerifySecret(account string, secret string) (bool, error) { + // Find the account matching the ID + if this, ok := a.Accounts[account]; ok { + return this.Data["secret"] == secret, nil + } + + return false, fmt.Errorf("no account found for id: %s", account) +} + +// GetSecret gets the internal secret +func (a *SimpleAccountant) GetSecret(account string) (string, error) { + // Find the account matching the ID + if this, ok := a.Accounts[account]; ok { + return this.Data["secret"], nil + } + + return "", fmt.Errorf("no account found for id: %s", account) +} + +// AssignData assigns data to an account +func (a *SimpleAccountant) AssignData(account string, key string, value string) error { + + // Find the account matching the ID + if this, ok := a.Accounts[account]; ok { + this.Data[key] = value + a.Accounts[account] = this + } else { + return fmt.Errorf("no account found for id: %s", account) + } + + return nil +} + +// GetValue gets the rover rover for the account +func (a *SimpleAccountant) GetValue(account string, key string) (string, error) { + // Find the account matching the ID + this, ok := a.Accounts[account] + if !ok { + return "", fmt.Errorf("no account found for id: %s", account) + } + return this.Data[key], nil +} From b451ea519deb0c05668b3b47d3f0e1de57e18d67 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 17:21:59 +0100 Subject: [PATCH 374/495] Make sure the accounts are saved as well --- cmd/rove-server/internal/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index a38e20d..5ccd004 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -189,7 +189,7 @@ func (s *Server) SaveWorld() error { if s.persistence == PersistentData { s.world.RLock() defer s.world.RUnlock() - if err := persistence.SaveAll("world", s.world); err != nil { + if err := persistence.SaveAll("world", s.world, "accounts", s.accountant); err != nil { return fmt.Errorf("failed to save out persistent data: %s", err) } } @@ -201,7 +201,7 @@ func (s *Server) LoadWorld() error { if s.persistence == PersistentData { s.world.Lock() defer s.world.Unlock() - if err := persistence.LoadAll("world", &s.world); err != nil { + if err := persistence.LoadAll("world", &s.world, "accounts", &s.accountant); err != nil { return err } } From b534ac0516947030772da2f3197288d38df10e15 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:01:35 +0100 Subject: [PATCH 375/495] Rename generated rove package to roveapi and the game package to rove --- Makefile | 4 +- README.md | 2 +- cmd/rove-server/internal/routes.go | 60 +-- cmd/rove-server/internal/server.go | 8 +- cmd/rove/main.go | 40 +- pkg/{game => rove}/command.go | 6 +- pkg/{game => rove}/command_test.go | 10 +- pkg/{game => rove}/rover.go | 2 +- pkg/{game => rove}/world.go | 24 +- pkg/{game => rove}/world_test.go | 8 +- .../rove.pb.go => roveapi/roveapi.pb.go} | 495 +++++++++--------- .../rove.proto => roveapi/roveapi.proto} | 4 +- 12 files changed, 334 insertions(+), 329 deletions(-) rename pkg/{game => rove}/command.go (75%) rename pkg/{game => rove}/command_test.go (85%) rename pkg/{game => rove}/rover.go (99%) rename pkg/{game => rove}/world.go (97%) rename pkg/{game => rove}/world_test.go (98%) rename pkg/{rove/rove.pb.go => roveapi/roveapi.pb.go} (65%) rename proto/{rove/rove.proto => roveapi/roveapi.proto} (98%) diff --git a/Makefile b/Makefile index 0ef8cd7..b28ac4f 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,8 @@ gen: github.com/golang/protobuf/protoc-gen-go go mod download @echo Generating rove server gRPC and gateway - protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:pkg/ proto/rove/rove.proto - protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/rove/rove.proto + protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:pkg/ proto/roveapi/roveapi.proto + protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/roveapi/roveapi.proto test: @echo Unit tests diff --git a/README.md b/README.md index 8846cc3..445ecac 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ Rove is an asynchronous nomadic game about exploring as part of a loose communit This repository is a [living document](https://github.com/mdiluz/rove/tree/master/docs) of current game design, as well as source code for the `rove-server` deployment and the `rove` command line client. -See [rove.proto](https://github.com/mdiluz/rove/blob/master/proto/rove/rove.proto) for the current server-client API. +See [roveapi.proto](https://github.com/mdiluz/rove/blob/master/proto/rove/roveapi.proto) for the current server-client API. diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index e533cbf..8e8706c 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -5,14 +5,14 @@ import ( "fmt" "log" - "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" ) // ServerStatus returns the status of the current server to a gRPC request -func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove.ServerStatusResponse, error) { - response := &rove.ServerStatusResponse{ +func (s *Server) ServerStatus(context.Context, *roveapi.ServerStatusRequest) (*roveapi.ServerStatusResponse, error) { + response := &roveapi.ServerStatusResponse{ Ready: true, Version: version.Version, TickRate: int32(s.minutesPerTick), @@ -28,7 +28,7 @@ func (s *Server) ServerStatus(context.Context, *rove.ServerStatusRequest) (*rove } // Register registers a new account for a gRPC request -func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove.RegisterResponse, error) { +func (s *Server) Register(ctx context.Context, req *roveapi.RegisterRequest) (*roveapi.RegisterResponse, error) { log.Printf("Handling register request: %s\n", req.Name) if len(req.Name) == 0 { @@ -45,8 +45,8 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove return nil, fmt.Errorf("internal server error when saving world: %s", err) } else { - return &rove.RegisterResponse{ - Account: &rove.Account{ + return &roveapi.RegisterResponse{ + Account: &roveapi.Account{ Name: acc.Name, Secret: acc.Data["secret"], }, @@ -55,7 +55,7 @@ func (s *Server) Register(ctx context.Context, req *rove.RegisterRequest) (*rove } // Status returns rover information for a gRPC request -func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response *rove.StatusResponse, err error) { +func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (response *roveapi.StatusResponse, err error) { log.Printf("Handling status request: %s\n", req.Account.Name) if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { @@ -77,50 +77,50 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response } i, q := s.world.RoverCommands(resp) - var incoming, queued []*rove.Command + var incoming, queued []*roveapi.Command for _, i := range i { - c := &rove.Command{ + c := &roveapi.Command{ Command: i.Command, } switch i.Command { - case rove.CommandType_move: - c.Data = &rove.Command_Bearing{ + case roveapi.CommandType_move: + c.Data = &roveapi.Command_Bearing{ Bearing: i.Bearing, } - case rove.CommandType_broadcast: - c.Data = &rove.Command_Message{ + case roveapi.CommandType_broadcast: + c.Data = &roveapi.Command_Message{ Message: i.Message, } } incoming = append(incoming, c) } for _, q := range q { - c := &rove.Command{ + c := &roveapi.Command{ Command: q.Command, } switch q.Command { - case rove.CommandType_move: - c.Data = &rove.Command_Bearing{ + case roveapi.CommandType_move: + c.Data = &roveapi.Command_Bearing{ Bearing: q.Bearing, } - case rove.CommandType_broadcast: - c.Data = &rove.Command_Message{ + case roveapi.CommandType_broadcast: + c.Data = &roveapi.Command_Message{ Message: q.Message, } } queued = append(queued, c) } - var logs []*rove.Log + var logs []*roveapi.Log for _, log := range rover.Logs { - logs = append(logs, &rove.Log{ + logs = append(logs, &roveapi.Log{ Text: log.Text, Time: fmt.Sprintf("%d", log.Time.Unix()), // proto uses strings under the hood for 64bit ints anyway }) } - response = &rove.StatusResponse{ + response = &roveapi.StatusResponse{ Name: rover.Name, - Position: &rove.Vector{ + Position: &roveapi.Vector{ X: int32(rover.Pos.X), Y: int32(rover.Pos.Y), }, @@ -140,7 +140,7 @@ func (s *Server) Status(ctx context.Context, req *rove.StatusRequest) (response } // Radar returns the radar information for a rover -func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.RadarResponse, error) { +func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi.RadarResponse, error) { log.Printf("Handling radar request: %s\n", req.Account.Name) if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { @@ -150,7 +150,7 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) } - response := &rove.RadarResponse{} + response := &roveapi.RadarResponse{} resp, err := s.accountant.GetValue(req.Account.Name, "rover") if err != nil { @@ -172,7 +172,7 @@ func (s *Server) Radar(ctx context.Context, req *rove.RadarRequest) (*rove.Radar } // Command issues commands to the world based on a gRPC request -func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.CommandResponse, error) { +func (s *Server) Command(ctx context.Context, req *roveapi.CommandRequest) (*roveapi.CommandResponse, error) { log.Printf("Handling command request: %s and %+v\n", req.Account.Name, req.Commands) if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { @@ -187,15 +187,15 @@ func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.C return nil, err } - var cmds []game.Command + var cmds []rove.Command for _, c := range req.Commands { - n := game.Command{ + n := rove.Command{ Command: c.Command, } switch c.Command { - case rove.CommandType_move: + case roveapi.CommandType_move: n.Bearing = c.GetBearing() - case rove.CommandType_broadcast: + case roveapi.CommandType_broadcast: n.Message = c.GetMessage() } cmds = append(cmds, n) @@ -205,5 +205,5 @@ func (s *Server) Command(ctx context.Context, req *rove.CommandRequest) (*rove.C return nil, err } - return &rove.CommandResponse{}, nil + return &roveapi.CommandResponse{}, nil } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 5ccd004..f633601 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -7,9 +7,9 @@ import ( "sync" "github.com/mdiluz/rove/pkg/accounts" - "github.com/mdiluz/rove/pkg/game" "github.com/mdiluz/rove/pkg/persistence" "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" ) @@ -26,7 +26,7 @@ const ( type Server struct { // Internal state - world *game.World + world *rove.World // Accountant accountant accounts.Accountant @@ -80,7 +80,7 @@ func NewServer(opts ...ServerOption) *Server { address: "", persistence: EphemeralData, schedule: cron.New(), - world: game.NewWorld(32), + world: rove.NewWorld(32), accountant: accounts.NewSimpleAccountant(), } @@ -109,7 +109,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { log.Fatalf("failed to listen: %v", err) } s.grpcServ = grpc.NewServer() - rove.RegisterRoveServer(s.grpcServ, s) + roveapi.RegisterRoveServer(s.grpcServ, s) return nil } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 5f51e32..af48a61 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -13,7 +13,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" "golang.org/x/net/context" "google.golang.org/grpc" @@ -66,7 +66,7 @@ func ConfigPath() string { if len(override) > 0 { datapath = override } - datapath = path.Join(datapath, "rove.json") + datapath = path.Join(datapath, "roveapi.json") return datapath } @@ -163,14 +163,14 @@ func InnerMain(command string, args ...string) error { if err != nil { return err } - var client = rove.NewRoveClient(clientConn) + var client = roveapi.NewRoveClient(clientConn) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // Handle all the commands switch command { case "server-status": - response, err := client.ServerStatus(ctx, &rove.ServerStatusRequest{}) + response, err := client.ServerStatus(ctx, &roveapi.ServerStatusRequest{}) switch { case err != nil: return err @@ -188,7 +188,7 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("must pass name to 'register'") } - resp, err := client.Register(ctx, &rove.RegisterRequest{ + resp, err := client.Register(ctx, &roveapi.RegisterRequest{ Name: args[0], }) switch { @@ -209,7 +209,7 @@ func InnerMain(command string, args ...string) error { } // Iterate through each command - var commands []*rove.Command + var commands []*roveapi.Command for i := 0; i < len(args); i++ { switch args[i] { case "move": @@ -220,9 +220,9 @@ func InnerMain(command string, args ...string) error { return err } commands = append(commands, - &rove.Command{ - Command: rove.CommandType_move, - Data: &rove.Command_Bearing{Bearing: args[i]}, + &roveapi.Command{ + Command: roveapi.CommandType_move, + Data: &roveapi.Command_Bearing{Bearing: args[i]}, }, ) case "broadcast": @@ -233,23 +233,23 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("broadcast command must be given ASCII triplet of 3 or less: %s", args[i]) } commands = append(commands, - &rove.Command{ - Command: rove.CommandType_broadcast, - Data: &rove.Command_Message{Message: []byte(args[i])}, + &roveapi.Command{ + Command: roveapi.CommandType_broadcast, + Data: &roveapi.Command_Message{Message: []byte(args[i])}, }, ) default: // By default just use the command literally commands = append(commands, - &rove.Command{ - Command: rove.CommandType(rove.CommandType_value[args[i]]), + &roveapi.Command{ + Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), }, ) } } - _, err := client.Command(ctx, &rove.CommandRequest{ - Account: &rove.Account{ + _, err := client.Command(ctx, &roveapi.CommandRequest{ + Account: &roveapi.Account{ Name: config.Account.Name, Secret: config.Account.Secret, }, @@ -269,8 +269,8 @@ func InnerMain(command string, args ...string) error { return err } - response, err := client.Radar(ctx, &rove.RadarRequest{ - Account: &rove.Account{ + response, err := client.Radar(ctx, &roveapi.RadarRequest{ + Account: &roveapi.Account{ Name: config.Account.Name, Secret: config.Account.Secret, }, @@ -306,8 +306,8 @@ func InnerMain(command string, args ...string) error { return err } - response, err := client.Status(ctx, &rove.StatusRequest{ - Account: &rove.Account{ + response, err := client.Status(ctx, &roveapi.StatusRequest{ + Account: &roveapi.Account{ Name: config.Account.Name, Secret: config.Account.Secret, }, diff --git a/pkg/game/command.go b/pkg/rove/command.go similarity index 75% rename from pkg/game/command.go rename to pkg/rove/command.go index b57f678..6016555 100644 --- a/pkg/game/command.go +++ b/pkg/rove/command.go @@ -1,10 +1,10 @@ -package game +package rove -import "github.com/mdiluz/rove/pkg/rove" +import "github.com/mdiluz/rove/pkg/roveapi" // Command represends a single command to execute type Command struct { - Command rove.CommandType `json:"command"` + Command roveapi.CommandType `json:"command"` // Used in the move command Bearing string `json:"bearing,omitempty"` diff --git a/pkg/game/command_test.go b/pkg/rove/command_test.go similarity index 85% rename from pkg/game/command_test.go rename to pkg/rove/command_test.go index 10ccbe5..f4f6bd9 100644 --- a/pkg/game/command_test.go +++ b/pkg/rove/command_test.go @@ -1,9 +1,9 @@ -package game +package rove import ( "testing" - "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -21,7 +21,7 @@ func TestCommand_Move(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Try the move command - moveCommand := Command{Command: rove.CommandType_move, Bearing: "N"} + moveCommand := Command{Command: roveapi.CommandType_move, Bearing: "N"} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world @@ -47,7 +47,7 @@ func TestCommand_Recharge(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Move to use up some charge - moveCommand := Command{Command: rove.CommandType_move, Bearing: "N"} + moveCommand := Command{Command: roveapi.CommandType_move, Bearing: "N"} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to queue move command") // Tick the world @@ -57,7 +57,7 @@ func TestCommand_Recharge(t *testing.T) { rover, _ := world.GetRover(a) assert.Equal(t, rover.MaximumCharge-1, rover.Charge) - chargeCommand := Command{Command: rove.CommandType_recharge} + chargeCommand := Command{Command: roveapi.CommandType_recharge} assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue recharge command") // Tick the world diff --git a/pkg/game/rover.go b/pkg/rove/rover.go similarity index 99% rename from pkg/game/rover.go rename to pkg/rove/rover.go index 693ba9a..9ab0401 100644 --- a/pkg/game/rover.go +++ b/pkg/rove/rover.go @@ -1,4 +1,4 @@ -package game +package rove import ( "fmt" diff --git a/pkg/game/world.go b/pkg/rove/world.go similarity index 97% rename from pkg/game/world.go rename to pkg/rove/world.go index f7476fb..490747b 100644 --- a/pkg/game/world.go +++ b/pkg/rove/world.go @@ -1,4 +1,4 @@ -package game +package rove import ( "bufio" @@ -12,7 +12,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/vector" ) @@ -430,11 +430,11 @@ func (w *World) Enqueue(rover string, commands ...Command) error { // First validate the commands for _, c := range commands { switch c.Command { - case rove.CommandType_move: + case roveapi.CommandType_move: if _, err := bearing.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } - case rove.CommandType_broadcast: + case roveapi.CommandType_broadcast: if len(c.Message) > 3 { return fmt.Errorf("too many characters in message (limit 3): %d", len(c.Message)) } @@ -443,9 +443,9 @@ func (w *World) Enqueue(rover string, commands ...Command) error { return fmt.Errorf("invalid message character: %c", b) } } - case rove.CommandType_stash: - case rove.CommandType_repair: - case rove.CommandType_recharge: + case roveapi.CommandType_stash: + case roveapi.CommandType_repair: + case roveapi.CommandType_recharge: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -509,19 +509,19 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { log.Printf("Executing command: %+v for %s\n", *c, rover) switch c.Command { - case rove.CommandType_move: + case roveapi.CommandType_move: if dir, err := bearing.FromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err } - case rove.CommandType_stash: + case roveapi.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { return err } - case rove.CommandType_repair: + case roveapi.CommandType_repair: r, err := w.GetRover(rover) if err != nil { return err @@ -533,12 +533,12 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { r.AddLogEntryf("repaired self to %d", r.Integrity) w.Rovers[rover] = r } - case rove.CommandType_recharge: + case roveapi.CommandType_recharge: _, err := w.RoverRecharge(rover) if err != nil { return err } - case rove.CommandType_broadcast: + case roveapi.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.Message); err != nil { return err } diff --git a/pkg/game/world_test.go b/pkg/rove/world_test.go similarity index 98% rename from pkg/game/world_test.go rename to pkg/rove/world_test.go index 262a7e9..33ae973 100644 --- a/pkg/game/world_test.go +++ b/pkg/rove/world_test.go @@ -1,4 +1,4 @@ -package game +package rove import ( "testing" @@ -6,7 +6,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/rove" + "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -273,7 +273,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") - err = world.ExecuteCommand(&Command{Command: rove.CommandType_repair}, a) + err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) @@ -287,7 +287,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - err = world.ExecuteCommand(&Command{Command: rove.CommandType_repair}, a) + err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) diff --git a/pkg/rove/rove.pb.go b/pkg/roveapi/roveapi.pb.go similarity index 65% rename from pkg/rove/rove.pb.go rename to pkg/roveapi/roveapi.pb.go index 2186fd9..491231d 100644 --- a/pkg/rove/rove.pb.go +++ b/pkg/roveapi/roveapi.pb.go @@ -2,14 +2,14 @@ // versions: // protoc-gen-go v1.25.0 // protoc v3.6.1 -// source: rove/rove.proto +// source: roveapi/roveapi.proto // Rove // // Rove is an asychronous nomadic game about exploring a planet as part of a // loose community -package rove +package roveapi import ( context "context" @@ -82,11 +82,11 @@ func (x CommandType) String() string { } func (CommandType) Descriptor() protoreflect.EnumDescriptor { - return file_rove_rove_proto_enumTypes[0].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[0].Descriptor() } func (CommandType) Type() protoreflect.EnumType { - return &file_rove_rove_proto_enumTypes[0] + return &file_roveapi_roveapi_proto_enumTypes[0] } func (x CommandType) Number() protoreflect.EnumNumber { @@ -95,7 +95,7 @@ func (x CommandType) Number() protoreflect.EnumNumber { // Deprecated: Use CommandType.Descriptor instead. func (CommandType) EnumDescriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{0} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{0} } // ServerStatusRequest is an empty placeholder @@ -108,7 +108,7 @@ type ServerStatusRequest struct { func (x *ServerStatusRequest) Reset() { *x = ServerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[0] + mi := &file_roveapi_roveapi_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -121,7 +121,7 @@ func (x *ServerStatusRequest) String() string { func (*ServerStatusRequest) ProtoMessage() {} func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[0] + mi := &file_roveapi_roveapi_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -134,7 +134,7 @@ func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. func (*ServerStatusRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{0} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{0} } // ServerStatusResponse is a response with useful server information @@ -158,7 +158,7 @@ type ServerStatusResponse struct { func (x *ServerStatusResponse) Reset() { *x = ServerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[1] + mi := &file_roveapi_roveapi_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -171,7 +171,7 @@ func (x *ServerStatusResponse) String() string { func (*ServerStatusResponse) ProtoMessage() {} func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[1] + mi := &file_roveapi_roveapi_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +184,7 @@ func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. func (*ServerStatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{1} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } func (x *ServerStatusResponse) GetVersion() string { @@ -235,7 +235,7 @@ type RegisterRequest struct { func (x *RegisterRequest) Reset() { *x = RegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_roveapi_roveapi_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -248,7 +248,7 @@ func (x *RegisterRequest) String() string { func (*RegisterRequest) ProtoMessage() {} func (x *RegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[2] + mi := &file_roveapi_roveapi_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -261,7 +261,7 @@ func (x *RegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. func (*RegisterRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} } func (x *RegisterRequest) GetName() string { @@ -286,7 +286,7 @@ type Account struct { func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[3] + mi := &file_roveapi_roveapi_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -299,7 +299,7 @@ func (x *Account) String() string { func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[3] + mi := &file_roveapi_roveapi_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -312,7 +312,7 @@ func (x *Account) ProtoReflect() protoreflect.Message { // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } func (x *Account) GetName() string { @@ -342,7 +342,7 @@ type RegisterResponse struct { func (x *RegisterResponse) Reset() { *x = RegisterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_roveapi_roveapi_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -355,7 +355,7 @@ func (x *RegisterResponse) String() string { func (*RegisterResponse) ProtoMessage() {} func (x *RegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[4] + mi := &file_roveapi_roveapi_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -368,7 +368,7 @@ func (x *RegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. func (*RegisterResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } func (x *RegisterResponse) GetAccount() *Account { @@ -385,7 +385,7 @@ type Command struct { unknownFields protoimpl.UnknownFields // The command type - Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=rove.CommandType" json:"command,omitempty"` + Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` // Types that are assignable to Data: // *Command_Bearing // *Command_Message @@ -395,7 +395,7 @@ type Command struct { func (x *Command) Reset() { *x = Command{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_roveapi_roveapi_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -408,7 +408,7 @@ func (x *Command) String() string { func (*Command) ProtoMessage() {} func (x *Command) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[5] + mi := &file_roveapi_roveapi_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -421,7 +421,7 @@ func (x *Command) ProtoReflect() protoreflect.Message { // Deprecated: Use Command.ProtoReflect.Descriptor instead. func (*Command) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{5} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} } func (x *Command) GetCommand() CommandType { @@ -488,7 +488,7 @@ type CommandRequest struct { func (x *CommandRequest) Reset() { *x = CommandRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[6] + mi := &file_roveapi_roveapi_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -501,7 +501,7 @@ func (x *CommandRequest) String() string { func (*CommandRequest) ProtoMessage() {} func (x *CommandRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[6] + mi := &file_roveapi_roveapi_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -514,7 +514,7 @@ func (x *CommandRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandRequest.ProtoReflect.Descriptor instead. func (*CommandRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{6} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{6} } func (x *CommandRequest) GetAccount() *Account { @@ -541,7 +541,7 @@ type CommandResponse struct { func (x *CommandResponse) Reset() { *x = CommandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_roveapi_roveapi_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -554,7 +554,7 @@ func (x *CommandResponse) String() string { func (*CommandResponse) ProtoMessage() {} func (x *CommandResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[7] + mi := &file_roveapi_roveapi_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -567,7 +567,7 @@ func (x *CommandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandResponse.ProtoReflect.Descriptor instead. func (*CommandResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{7} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{7} } // RadarRequest is the data needed to request the radar for a rover @@ -583,7 +583,7 @@ type RadarRequest struct { func (x *RadarRequest) Reset() { *x = RadarRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_roveapi_roveapi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -596,7 +596,7 @@ func (x *RadarRequest) String() string { func (*RadarRequest) ProtoMessage() {} func (x *RadarRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[8] + mi := &file_roveapi_roveapi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -609,7 +609,7 @@ func (x *RadarRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarRequest.ProtoReflect.Descriptor instead. func (*RadarRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{8} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{8} } func (x *RadarRequest) GetAccount() *Account { @@ -637,7 +637,7 @@ type RadarResponse struct { func (x *RadarResponse) Reset() { *x = RadarResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_roveapi_roveapi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -650,7 +650,7 @@ func (x *RadarResponse) String() string { func (*RadarResponse) ProtoMessage() {} func (x *RadarResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[9] + mi := &file_roveapi_roveapi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -663,7 +663,7 @@ func (x *RadarResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RadarResponse.ProtoReflect.Descriptor instead. func (*RadarResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{9} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{9} } func (x *RadarResponse) GetRange() int32 { @@ -700,7 +700,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_roveapi_roveapi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -713,7 +713,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[10] + mi := &file_roveapi_roveapi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -726,7 +726,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{10} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{10} } func (x *StatusRequest) GetAccount() *Account { @@ -751,7 +751,7 @@ type Log struct { func (x *Log) Reset() { *x = Log{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[11] + mi := &file_roveapi_roveapi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +764,7 @@ func (x *Log) String() string { func (*Log) ProtoMessage() {} func (x *Log) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[11] + mi := &file_roveapi_roveapi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -777,7 +777,7 @@ func (x *Log) ProtoReflect() protoreflect.Message { // Deprecated: Use Log.ProtoReflect.Descriptor instead. func (*Log) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{11} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{11} } func (x *Log) GetTime() string { @@ -807,7 +807,7 @@ type Vector struct { func (x *Vector) Reset() { *x = Vector{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[12] + mi := &file_roveapi_roveapi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -820,7 +820,7 @@ func (x *Vector) String() string { func (*Vector) ProtoMessage() {} func (x *Vector) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[12] + mi := &file_roveapi_roveapi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -833,7 +833,7 @@ func (x *Vector) ProtoReflect() protoreflect.Message { // Deprecated: Use Vector.ProtoReflect.Descriptor instead. func (*Vector) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{12} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{12} } func (x *Vector) GetX() int32 { @@ -885,7 +885,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rove_rove_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -898,7 +898,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rove_rove_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -911,7 +911,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_rove_rove_proto_rawDescGZIP(), []int{13} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{13} } func (x *StatusResponse) GetName() string { @@ -998,174 +998,179 @@ func (x *StatusResponse) GetLogs() []*Log { return nil } -var File_rove_rove_proto protoreflect.FileDescriptor +var File_roveapi_roveapi_proto protoreflect.FileDescriptor -var file_rove_rove_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x76, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, - 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, - 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, - 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, - 0x63, 0x6b, 0x22, 0x25, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x22, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x76, 0x0a, - 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, - 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, - 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, - 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x38, - 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x27, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, - 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xb7, 0x03, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x56, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, - 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x12, 0x35, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x4c, 0x6f, - 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, - 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xb1, - 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, - 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x12, 0x12, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var file_roveapi_roveapi_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x25, 0x0a, 0x0f, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3e, 0x0a, 0x10, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x55, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, + 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, + 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, + 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x24, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, + 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_rove_rove_proto_rawDescOnce sync.Once - file_rove_rove_proto_rawDescData = file_rove_rove_proto_rawDesc + file_roveapi_roveapi_proto_rawDescOnce sync.Once + file_roveapi_roveapi_proto_rawDescData = file_roveapi_roveapi_proto_rawDesc ) -func file_rove_rove_proto_rawDescGZIP() []byte { - file_rove_rove_proto_rawDescOnce.Do(func() { - file_rove_rove_proto_rawDescData = protoimpl.X.CompressGZIP(file_rove_rove_proto_rawDescData) +func file_roveapi_roveapi_proto_rawDescGZIP() []byte { + file_roveapi_roveapi_proto_rawDescOnce.Do(func() { + file_roveapi_roveapi_proto_rawDescData = protoimpl.X.CompressGZIP(file_roveapi_roveapi_proto_rawDescData) }) - return file_rove_rove_proto_rawDescData + return file_roveapi_roveapi_proto_rawDescData } -var file_rove_rove_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_rove_rove_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_rove_rove_proto_goTypes = []interface{}{ - (CommandType)(0), // 0: rove.CommandType - (*ServerStatusRequest)(nil), // 1: rove.ServerStatusRequest - (*ServerStatusResponse)(nil), // 2: rove.ServerStatusResponse - (*RegisterRequest)(nil), // 3: rove.RegisterRequest - (*Account)(nil), // 4: rove.Account - (*RegisterResponse)(nil), // 5: rove.RegisterResponse - (*Command)(nil), // 6: rove.Command - (*CommandRequest)(nil), // 7: rove.CommandRequest - (*CommandResponse)(nil), // 8: rove.CommandResponse - (*RadarRequest)(nil), // 9: rove.RadarRequest - (*RadarResponse)(nil), // 10: rove.RadarResponse - (*StatusRequest)(nil), // 11: rove.StatusRequest - (*Log)(nil), // 12: rove.Log - (*Vector)(nil), // 13: rove.Vector - (*StatusResponse)(nil), // 14: rove.StatusResponse +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_roveapi_roveapi_proto_goTypes = []interface{}{ + (CommandType)(0), // 0: roveapi.CommandType + (*ServerStatusRequest)(nil), // 1: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 2: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 3: roveapi.RegisterRequest + (*Account)(nil), // 4: roveapi.Account + (*RegisterResponse)(nil), // 5: roveapi.RegisterResponse + (*Command)(nil), // 6: roveapi.Command + (*CommandRequest)(nil), // 7: roveapi.CommandRequest + (*CommandResponse)(nil), // 8: roveapi.CommandResponse + (*RadarRequest)(nil), // 9: roveapi.RadarRequest + (*RadarResponse)(nil), // 10: roveapi.RadarResponse + (*StatusRequest)(nil), // 11: roveapi.StatusRequest + (*Log)(nil), // 12: roveapi.Log + (*Vector)(nil), // 13: roveapi.Vector + (*StatusResponse)(nil), // 14: roveapi.StatusResponse } -var file_rove_rove_proto_depIdxs = []int32{ - 4, // 0: rove.RegisterResponse.account:type_name -> rove.Account - 0, // 1: rove.Command.command:type_name -> rove.CommandType - 4, // 2: rove.CommandRequest.account:type_name -> rove.Account - 6, // 3: rove.CommandRequest.commands:type_name -> rove.Command - 4, // 4: rove.RadarRequest.account:type_name -> rove.Account - 4, // 5: rove.StatusRequest.account:type_name -> rove.Account - 13, // 6: rove.StatusResponse.position:type_name -> rove.Vector - 6, // 7: rove.StatusResponse.incomingCommands:type_name -> rove.Command - 6, // 8: rove.StatusResponse.queuedCommands:type_name -> rove.Command - 12, // 9: rove.StatusResponse.logs:type_name -> rove.Log - 1, // 10: rove.Rove.ServerStatus:input_type -> rove.ServerStatusRequest - 3, // 11: rove.Rove.Register:input_type -> rove.RegisterRequest - 7, // 12: rove.Rove.Command:input_type -> rove.CommandRequest - 9, // 13: rove.Rove.Radar:input_type -> rove.RadarRequest - 11, // 14: rove.Rove.Status:input_type -> rove.StatusRequest - 2, // 15: rove.Rove.ServerStatus:output_type -> rove.ServerStatusResponse - 5, // 16: rove.Rove.Register:output_type -> rove.RegisterResponse - 8, // 17: rove.Rove.Command:output_type -> rove.CommandResponse - 10, // 18: rove.Rove.Radar:output_type -> rove.RadarResponse - 14, // 19: rove.Rove.Status:output_type -> rove.StatusResponse +var file_roveapi_roveapi_proto_depIdxs = []int32{ + 4, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType + 4, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account + 6, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 4, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account + 4, // 5: roveapi.StatusRequest.account:type_name -> roveapi.Account + 13, // 6: roveapi.StatusResponse.position:type_name -> roveapi.Vector + 6, // 7: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command + 6, // 8: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 12, // 9: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 1, // 10: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 3, // 11: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 7, // 12: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 9, // 13: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 11, // 14: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 2, // 15: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 5, // 16: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 8, // 17: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 10, // 18: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 14, // 19: roveapi.Rove.Status:output_type -> roveapi.StatusResponse 15, // [15:20] is the sub-list for method output_type 10, // [10:15] is the sub-list for method input_type 10, // [10:10] is the sub-list for extension type_name @@ -1173,13 +1178,13 @@ var file_rove_rove_proto_depIdxs = []int32{ 0, // [0:10] is the sub-list for field type_name } -func init() { file_rove_rove_proto_init() } -func file_rove_rove_proto_init() { - if File_rove_rove_proto != nil { +func init() { file_roveapi_roveapi_proto_init() } +func file_roveapi_roveapi_proto_init() { + if File_roveapi_roveapi_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_rove_rove_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerStatusRequest); i { case 0: return &v.state @@ -1191,7 +1196,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerStatusResponse); i { case 0: return &v.state @@ -1203,7 +1208,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RegisterRequest); i { case 0: return &v.state @@ -1215,7 +1220,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state @@ -1227,7 +1232,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RegisterResponse); i { case 0: return &v.state @@ -1239,7 +1244,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Command); i { case 0: return &v.state @@ -1251,7 +1256,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandRequest); i { case 0: return &v.state @@ -1263,7 +1268,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandResponse); i { case 0: return &v.state @@ -1275,7 +1280,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RadarRequest); i { case 0: return &v.state @@ -1287,7 +1292,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RadarResponse); i { case 0: return &v.state @@ -1299,7 +1304,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusRequest); i { case 0: return &v.state @@ -1311,7 +1316,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Log); i { case 0: return &v.state @@ -1323,7 +1328,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Vector); i { case 0: return &v.state @@ -1335,7 +1340,7 @@ func file_rove_rove_proto_init() { return nil } } - file_rove_rove_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_roveapi_roveapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -1348,7 +1353,7 @@ func file_rove_rove_proto_init() { } } } - file_rove_rove_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_roveapi_roveapi_proto_msgTypes[5].OneofWrappers = []interface{}{ (*Command_Bearing)(nil), (*Command_Message)(nil), } @@ -1356,21 +1361,21 @@ func file_rove_rove_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_rove_rove_proto_rawDesc, + RawDescriptor: file_roveapi_roveapi_proto_rawDesc, NumEnums: 1, NumMessages: 14, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_rove_rove_proto_goTypes, - DependencyIndexes: file_rove_rove_proto_depIdxs, - EnumInfos: file_rove_rove_proto_enumTypes, - MessageInfos: file_rove_rove_proto_msgTypes, + GoTypes: file_roveapi_roveapi_proto_goTypes, + DependencyIndexes: file_roveapi_roveapi_proto_depIdxs, + EnumInfos: file_roveapi_roveapi_proto_enumTypes, + MessageInfos: file_roveapi_roveapi_proto_msgTypes, }.Build() - File_rove_rove_proto = out.File - file_rove_rove_proto_rawDesc = nil - file_rove_rove_proto_goTypes = nil - file_rove_rove_proto_depIdxs = nil + File_roveapi_roveapi_proto = out.File + file_roveapi_roveapi_proto_rawDesc = nil + file_roveapi_roveapi_proto_goTypes = nil + file_roveapi_roveapi_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -1414,7 +1419,7 @@ func NewRoveClient(cc grpc.ClientConnInterface) RoveClient { func (c *roveClient) ServerStatus(ctx context.Context, in *ServerStatusRequest, opts ...grpc.CallOption) (*ServerStatusResponse, error) { out := new(ServerStatusResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/ServerStatus", in, out, opts...) + err := c.cc.Invoke(ctx, "/roveapi.Rove/ServerStatus", in, out, opts...) if err != nil { return nil, err } @@ -1423,7 +1428,7 @@ func (c *roveClient) ServerStatus(ctx context.Context, in *ServerStatusRequest, func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) { out := new(RegisterResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Register", in, out, opts...) + err := c.cc.Invoke(ctx, "/roveapi.Rove/Register", in, out, opts...) if err != nil { return nil, err } @@ -1432,7 +1437,7 @@ func (c *roveClient) Register(ctx context.Context, in *RegisterRequest, opts ... func (c *roveClient) Command(ctx context.Context, in *CommandRequest, opts ...grpc.CallOption) (*CommandResponse, error) { out := new(CommandResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Command", in, out, opts...) + err := c.cc.Invoke(ctx, "/roveapi.Rove/Command", in, out, opts...) if err != nil { return nil, err } @@ -1441,7 +1446,7 @@ func (c *roveClient) Command(ctx context.Context, in *CommandRequest, opts ...gr func (c *roveClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.CallOption) (*RadarResponse, error) { out := new(RadarResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Radar", in, out, opts...) + err := c.cc.Invoke(ctx, "/roveapi.Rove/Radar", in, out, opts...) if err != nil { return nil, err } @@ -1450,7 +1455,7 @@ func (c *roveClient) Radar(ctx context.Context, in *RadarRequest, opts ...grpc.C func (c *roveClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { out := new(StatusResponse) - err := c.cc.Invoke(ctx, "/rove.Rove/Status", in, out, opts...) + err := c.cc.Invoke(ctx, "/roveapi.Rove/Status", in, out, opts...) if err != nil { return nil, err } @@ -1512,7 +1517,7 @@ func _Rove_ServerStatus_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/ServerStatus", + FullMethod: "/roveapi.Rove/ServerStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoveServer).ServerStatus(ctx, req.(*ServerStatusRequest)) @@ -1530,7 +1535,7 @@ func _Rove_Register_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Register", + FullMethod: "/roveapi.Rove/Register", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoveServer).Register(ctx, req.(*RegisterRequest)) @@ -1548,7 +1553,7 @@ func _Rove_Command_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Command", + FullMethod: "/roveapi.Rove/Command", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoveServer).Command(ctx, req.(*CommandRequest)) @@ -1566,7 +1571,7 @@ func _Rove_Radar_Handler(srv interface{}, ctx context.Context, dec func(interfac } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Radar", + FullMethod: "/roveapi.Rove/Radar", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoveServer).Radar(ctx, req.(*RadarRequest)) @@ -1584,7 +1589,7 @@ func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interfa } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rove.Rove/Status", + FullMethod: "/roveapi.Rove/Status", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoveServer).Status(ctx, req.(*StatusRequest)) @@ -1593,7 +1598,7 @@ func _Rove_Status_Handler(srv interface{}, ctx context.Context, dec func(interfa } var _Rove_serviceDesc = grpc.ServiceDesc{ - ServiceName: "rove.Rove", + ServiceName: "roveapi.Rove", HandlerType: (*RoveServer)(nil), Methods: []grpc.MethodDesc{ { @@ -1618,5 +1623,5 @@ var _Rove_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "rove/rove.proto", + Metadata: "roveapi/roveapi.proto", } diff --git a/proto/rove/rove.proto b/proto/roveapi/roveapi.proto similarity index 98% rename from proto/rove/rove.proto rename to proto/roveapi/roveapi.proto index ab0160e..f39d2a6 100644 --- a/proto/rove/rove.proto +++ b/proto/roveapi/roveapi.proto @@ -4,8 +4,8 @@ syntax = "proto3"; // // Rove is an asychronous nomadic game about exploring a planet as part of a // loose community -package rove; -option go_package = "github.com/mdiluz/rove/pkg/rove"; +package roveapi; +option go_package = "github.com/mdiluz/rove/pkg/roveapi"; // The Rove server hosts a single game session and world with multiple players service Rove { From 065f79cbb308bf60e4244cc30ba89d499ee44a07 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:11:38 +0100 Subject: [PATCH 376/495] Fix warping to non-empty space --- pkg/rove/world_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 33ae973..52e8eec 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -144,6 +144,7 @@ func TestWorld_RoverStash(t *testing.T) { Y: 0.0, } + world.Atlas.SetObject(pos, objects.Object{Type: objects.None}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") From 97d3be000b7aba3748c1283c645b0ce01f131939 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:14:32 +0100 Subject: [PATCH 377/495] Re-order some World members --- pkg/rove/world.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 490747b..dcb39ea 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -18,32 +18,29 @@ import ( // World describes a self contained universe and everything in it type World struct { + // TicksPerDay is the amount of ticks in a single day + TicksPerDay int `json:"ticks-per-day"` + + // Current number of ticks from the start + CurrentTicks int `json:"current-ticks"` + // Rovers is a id->data map of all the rovers in the game Rovers map[string]Rover `json:"rovers"` // Atlas represends the world map of chunks and tiles Atlas atlas.Atlas `json:"atlas"` - // Mutex to lock around all world operations - worldMutex sync.RWMutex - // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream `json:"commands"` - // Incoming represents the set of commands to add to the queue at the end of the current tick CommandIncoming map[string]CommandStream `json:"incoming"` + // Mutex to lock around all world operations + worldMutex sync.RWMutex // Mutex to lock around command operations cmdMutex sync.RWMutex - // Set of possible words to use for names words []string - - // TicksPerDay is the amount of ticks in a single day - TicksPerDay int `json:"ticks-per-day"` - - // Current number of ticks from the start - CurrentTicks int `json:"current-ticks"` } var wordsFile = os.Getenv("WORDS_FILE") From 5b1fe61097e81e3220c95dfacbca8f72c3b28a9d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:22:59 +0100 Subject: [PATCH 378/495] Move vector into maths package --- pkg/atlas/atlas.go | 8 +- pkg/atlas/atlas_test.go | 114 +++++++++++++-------------- pkg/atlas/chunkAtlas.go | 43 +++++----- pkg/bearing/bearing.go | 6 +- pkg/bearing/bearing_test.go | 4 +- pkg/{vector => maths}/vector.go | 18 ++--- pkg/{vector => maths}/vector_test.go | 2 +- pkg/rove/command_test.go | 8 +- pkg/rove/rover.go | 4 +- pkg/rove/world.go | 24 +++--- pkg/rove/world_test.go | 34 ++++---- 11 files changed, 131 insertions(+), 134 deletions(-) rename pkg/{vector => maths}/vector.go (78%) rename pkg/{vector => maths}/vector_test.go (99%) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index d4054db..22873f7 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,8 +1,8 @@ package atlas import ( + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/vector" ) // Tile describes the type of terrain @@ -25,11 +25,11 @@ const ( // Atlas represents a 2D world atlas of tiles and objects type Atlas interface { // SetTile sets a location on the Atlas to a type of tile - SetTile(v vector.Vector, tile Tile) + SetTile(v maths.Vector, tile Tile) // SetObject will set a location on the Atlas to contain an object - SetObject(v vector.Vector, obj objects.Object) + SetObject(v maths.Vector, obj objects.Object) // QueryPosition queries a position on the atlas - QueryPosition(v vector.Vector) (byte, objects.Object) + QueryPosition(v maths.Vector) (byte, objects.Object) } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 1b1447e..4792e0b 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -4,8 +4,8 @@ import ( "fmt" "testing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -21,49 +21,49 @@ func TestAtlas_toChunk(t *testing.T) { assert.NotNil(t, a) // Get a tile to spawn the chunks - a.QueryPosition(vector.Vector{X: -1, Y: -1}) - a.QueryPosition(vector.Vector{X: 0, Y: 0}) + a.QueryPosition(maths.Vector{X: -1, Y: -1}) + a.QueryPosition(maths.Vector{X: 0, Y: 0}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID := a.worldSpaceToChunkIndex(vector.Vector{X: 0, Y: 0}) + chunkID := a.worldSpaceToChunkIndex(maths.Vector{X: 0, Y: 0}) assert.Equal(t, 3, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 0, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 0, Y: -1}) assert.Equal(t, 1, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -1, Y: -1}) assert.Equal(t, 0, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: 0}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -1, Y: 0}) assert.Equal(t, 2, chunkID) a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.QueryPosition(vector.Vector{X: -2, Y: -2}) + a.QueryPosition(maths.Vector{X: -2, Y: -2}) assert.Equal(t, 2*2, len(a.Chunks)) - a.QueryPosition(vector.Vector{X: 1, Y: 1}) + a.QueryPosition(maths.Vector{X: 1, Y: 1}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: 1}) assert.Equal(t, 3, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: -2}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: -2}) assert.Equal(t, 1, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: -2}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -2, Y: -2}) assert.Equal(t, 0, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -2, Y: 1}) assert.Equal(t, 2, chunkID) a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks - a.QueryPosition(vector.Vector{X: 3, Y: 3}) + a.QueryPosition(maths.Vector{X: 3, Y: 3}) assert.Equal(t, 2*2, len(a.Chunks)) - a.QueryPosition(vector.Vector{X: -3, Y: -3}) + a.QueryPosition(maths.Vector{X: -3, Y: -3}) assert.Equal(t, 4*4, len(a.Chunks)) // Chunks should look like: @@ -74,19 +74,19 @@ func TestAtlas_toChunk(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 3}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: 3}) assert.Equal(t, 14, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: -3}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: -3}) assert.Equal(t, 2, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -1, Y: -1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -1, Y: -1}) assert.Equal(t, 5, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: -2, Y: 2}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: -2, Y: 2}) assert.Equal(t, 13, chunkID) a = NewChunkAtlas(3).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks - a.QueryPosition(vector.Vector{X: 3, Y: 3}) + a.QueryPosition(maths.Vector{X: 3, Y: 3}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: @@ -94,13 +94,13 @@ func TestAtlas_toChunk(t *testing.T) { // ------- // || 0| 1 // ======= - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: 1}) assert.Equal(t, 0, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 3, Y: 1}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 3, Y: 1}) assert.Equal(t, 1, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 1, Y: 4}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 1, Y: 4}) assert.Equal(t, 2, chunkID) - chunkID = a.worldSpaceToChunkIndex(vector.Vector{X: 5, Y: 5}) + chunkID = a.worldSpaceToChunkIndex(maths.Vector{X: 5, Y: 5}) assert.Equal(t, 3, chunkID) } @@ -109,36 +109,36 @@ func TestAtlas_toWorld(t *testing.T) { assert.NotNil(t, a) // Get a tile to spawn some chunks - a.QueryPosition(vector.Vector{X: -1, Y: -1}) + a.QueryPosition(maths.Vector{X: -1, Y: -1}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - assert.Equal(t, vector.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) - assert.Equal(t, vector.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) + assert.Equal(t, maths.Vector{X: -1, Y: -1}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, maths.Vector{X: 0, Y: -1}, a.chunkOriginInWorldSpace(1)) a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn the chunks - a.QueryPosition(vector.Vector{X: -2, Y: -2}) + a.QueryPosition(maths.Vector{X: -2, Y: -2}) assert.Equal(t, 2*2, len(a.Chunks)) - a.QueryPosition(vector.Vector{X: 1, Y: 1}) + a.QueryPosition(maths.Vector{X: 1, Y: 1}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: // 2 | 3 // ----- // 0 | 1 - assert.Equal(t, vector.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) - assert.Equal(t, vector.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) + assert.Equal(t, maths.Vector{X: -2, Y: -2}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, maths.Vector{X: -2, Y: 0}, a.chunkOriginInWorldSpace(2)) a = NewChunkAtlas(2).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks - a.QueryPosition(vector.Vector{X: 3, Y: 3}) + a.QueryPosition(maths.Vector{X: 3, Y: 3}) assert.Equal(t, 2*2, len(a.Chunks)) - a.QueryPosition(vector.Vector{X: -3, Y: -3}) + a.QueryPosition(maths.Vector{X: -3, Y: -3}) assert.Equal(t, 4*4, len(a.Chunks)) // Chunks should look like: @@ -149,13 +149,13 @@ func TestAtlas_toWorld(t *testing.T) { // 4 | 5 || 6 | 7 // ---------------- // 0 | 1 || 2 | 3 - assert.Equal(t, vector.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) - assert.Equal(t, vector.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) + assert.Equal(t, maths.Vector{X: -4, Y: -4}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, maths.Vector{X: 2, Y: -2}, a.chunkOriginInWorldSpace(7)) a = NewChunkAtlas(3).(*chunkBasedAtlas) assert.NotNil(t, a) // Get a tile to spawn a 4x4 grid of chunks - a.QueryPosition(vector.Vector{X: 3, Y: 3}) + a.QueryPosition(maths.Vector{X: 3, Y: 3}) assert.Equal(t, 2*2, len(a.Chunks)) // Chunks should look like: @@ -163,7 +163,7 @@ func TestAtlas_toWorld(t *testing.T) { // ------- // || 0| 1 // ======= - assert.Equal(t, vector.Vector{X: 0, Y: 0}, a.chunkOriginInWorldSpace(0)) + assert.Equal(t, maths.Vector{X: 0, Y: 0}, a.chunkOriginInWorldSpace(0)) } func TestAtlas_GetSetTile(t *testing.T) { @@ -171,13 +171,13 @@ func TestAtlas_GetSetTile(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - a.SetTile(vector.Vector{X: 0, Y: 0}, 1) - tile, _ := a.QueryPosition(vector.Vector{X: 0, Y: 0}) + a.SetTile(maths.Vector{X: 0, Y: 0}, 1) + tile, _ := a.QueryPosition(maths.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) // Set another tile to 1 and test it - a.SetTile(vector.Vector{X: 5, Y: -2}, 2) - tile, _ = a.QueryPosition(vector.Vector{X: 5, Y: -2}) + a.SetTile(maths.Vector{X: 5, Y: -2}, 2) + tile, _ = a.QueryPosition(maths.Vector{X: 5, Y: -2}) assert.Equal(t, byte(2), tile) } @@ -186,13 +186,13 @@ func TestAtlas_GetSetObject(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - a.SetObject(vector.Vector{X: 0, Y: 0}, objects.Object{Type: objects.LargeRock}) - _, obj := a.QueryPosition(vector.Vector{X: 0, Y: 0}) + a.SetObject(maths.Vector{X: 0, Y: 0}, objects.Object{Type: objects.LargeRock}) + _, obj := a.QueryPosition(maths.Vector{X: 0, Y: 0}) assert.Equal(t, objects.Object{Type: objects.LargeRock}, obj) // Set another tile to 1 and test it - a.SetObject(vector.Vector{X: 5, Y: -2}, objects.Object{Type: objects.SmallRock}) - _, obj = a.QueryPosition(vector.Vector{X: 5, Y: -2}) + a.SetObject(maths.Vector{X: 5, Y: -2}, objects.Object{Type: objects.SmallRock}) + _, obj = a.QueryPosition(maths.Vector{X: 5, Y: -2}) assert.Equal(t, objects.Object{Type: objects.SmallRock}, obj) } @@ -203,27 +203,27 @@ func TestAtlas_Grown(t *testing.T) { assert.Equal(t, 1, len(a.Chunks)) // Set a few tiles to values - a.SetTile(vector.Vector{X: 0, Y: 0}, 1) - a.SetTile(vector.Vector{X: -1, Y: -1}, 2) - a.SetTile(vector.Vector{X: 1, Y: -2}, 3) + a.SetTile(maths.Vector{X: 0, Y: 0}, 1) + a.SetTile(maths.Vector{X: -1, Y: -1}, 2) + a.SetTile(maths.Vector{X: 1, Y: -2}, 3) // Check tile values - tile, _ := a.QueryPosition(vector.Vector{X: 0, Y: 0}) + tile, _ := a.QueryPosition(maths.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile, _ = a.QueryPosition(vector.Vector{X: -1, Y: -1}) + tile, _ = a.QueryPosition(maths.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile, _ = a.QueryPosition(vector.Vector{X: 1, Y: -2}) + tile, _ = a.QueryPosition(maths.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) - tile, _ = a.QueryPosition(vector.Vector{X: 0, Y: 0}) + tile, _ = a.QueryPosition(maths.Vector{X: 0, Y: 0}) assert.Equal(t, byte(1), tile) - tile, _ = a.QueryPosition(vector.Vector{X: -1, Y: -1}) + tile, _ = a.QueryPosition(maths.Vector{X: -1, Y: -1}) assert.Equal(t, byte(2), tile) - tile, _ = a.QueryPosition(vector.Vector{X: 1, Y: -2}) + tile, _ = a.QueryPosition(maths.Vector{X: 1, Y: -2}) assert.Equal(t, byte(3), tile) } @@ -237,7 +237,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { assert.NotNil(t, a) assert.Equal(t, 1, len(a.Chunks)) - pos := vector.Vector{X: x, Y: y} + pos := maths.Vector{X: x, Y: y} a.SetTile(pos, TileRock) a.SetObject(pos, objects.Object{Type: objects.LargeRock}) tile, obj := a.QueryPosition(pos) @@ -253,13 +253,13 @@ func TestAtlas_GetSetCorrect(t *testing.T) { func TestAtlas_WorldGen(t *testing.T) { a := NewChunkAtlas(8) // Spawn a large world - _, _ = a.QueryPosition(vector.Vector{X: 20, Y: 20}) + _, _ = a.QueryPosition(maths.Vector{X: 20, Y: 20}) // Print out the world for manual evaluation num := 20 for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { - t, o := a.QueryPosition(vector.Vector{X: i, Y: j}) + t, o := a.QueryPosition(maths.Vector{X: i, Y: j}) if o.Type != objects.None { fmt.Printf("%c", o.Type) } else if t != byte(TileNone) { diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 1caac1e..c3c969e 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -6,7 +6,6 @@ import ( "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/vector" "github.com/ojrac/opensimplex-go" ) @@ -27,10 +26,10 @@ type chunkBasedAtlas struct { Chunks []chunk `json:"chunks"` // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) - LowerBound vector.Vector `json:"lowerBound"` + LowerBound maths.Vector `json:"lowerBound"` // UpperBound is the top left corner of the current chunks (curent chunks cover < this value) - UpperBound vector.Vector `json:"upperBound"` + UpperBound maths.Vector `json:"upperBound"` // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` @@ -54,8 +53,8 @@ func NewChunkAtlas(chunkSize int) Atlas { a := chunkBasedAtlas{ ChunkSize: chunkSize, Chunks: make([]chunk, 1), - LowerBound: vector.Vector{X: 0, Y: 0}, - UpperBound: vector.Vector{X: chunkSize, Y: chunkSize}, + LowerBound: maths.Vector{X: 0, Y: 0}, + UpperBound: maths.Vector{X: chunkSize, Y: chunkSize}, terrainNoise: opensimplex.New(noiseSeed), objectNoise: opensimplex.New(noiseSeed), } @@ -65,21 +64,21 @@ func NewChunkAtlas(chunkSize int) Atlas { } // SetTile sets an individual tile's kind -func (a *chunkBasedAtlas) SetTile(v vector.Vector, tile Tile) { +func (a *chunkBasedAtlas) SetTile(v maths.Vector, tile Tile) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setTile(c, local, byte(tile)) } // SetObject sets the object on a tile -func (a *chunkBasedAtlas) SetObject(v vector.Vector, obj objects.Object) { +func (a *chunkBasedAtlas) SetObject(v maths.Vector, obj objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setObject(c, local, obj) } // QueryPosition will return information for a specific position -func (a *chunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) { +func (a *chunkBasedAtlas) QueryPosition(v maths.Vector) (byte, objects.Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.populate(c) @@ -89,7 +88,7 @@ func (a *chunkBasedAtlas) QueryPosition(v vector.Vector) (byte, objects.Object) } // chunkTileID returns the tile index within a chunk -func (a *chunkBasedAtlas) chunkTileIndex(local vector.Vector) int { +func (a *chunkBasedAtlas) chunkTileIndex(local maths.Vector) int { return local.X + local.Y*a.ChunkSize } @@ -148,7 +147,7 @@ func (a *chunkBasedAtlas) populate(chunk int) { } // setTile sets a tile in a specific chunk -func (a *chunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { +func (a *chunkBasedAtlas) setTile(chunk int, local maths.Vector, tile byte) { a.populate(chunk) c := a.Chunks[chunk] c.Tiles[a.chunkTileIndex(local)] = tile @@ -156,7 +155,7 @@ func (a *chunkBasedAtlas) setTile(chunk int, local vector.Vector, tile byte) { } // setObject sets an object in a specific chunk -func (a *chunkBasedAtlas) setObject(chunk int, local vector.Vector, object objects.Object) { +func (a *chunkBasedAtlas) setObject(chunk int, local maths.Vector, object objects.Object) { a.populate(chunk) c := a.Chunks[chunk] @@ -170,12 +169,12 @@ func (a *chunkBasedAtlas) setObject(chunk int, local vector.Vector, object objec } // worldSpaceToChunkLocal gets a chunk local coordinate for a tile -func (a *chunkBasedAtlas) worldSpaceToChunkLocal(v vector.Vector) vector.Vector { - return vector.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} +func (a *chunkBasedAtlas) worldSpaceToChunkLocal(v maths.Vector) maths.Vector { + return maths.Vector{X: maths.Pmod(v.X, a.ChunkSize), Y: maths.Pmod(v.Y, a.ChunkSize)} } // worldSpaceToChunkID gets the current chunk ID for a position in the world -func (a *chunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { +func (a *chunkBasedAtlas) worldSpaceToChunkIndex(v maths.Vector) int { // Shift the vector by our current min v = v.Added(a.LowerBound.Negated()) @@ -191,13 +190,13 @@ func (a *chunkBasedAtlas) worldSpaceToChunkIndex(v vector.Vector) int { } // chunkOriginInWorldSpace returns the origin of the chunk in world space -func (a *chunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { +func (a *chunkBasedAtlas) chunkOriginInWorldSpace(chunk int) maths.Vector { // Calculate the width width := a.UpperBound.X - a.LowerBound.X widthInChunks := width / a.ChunkSize // Reverse the along the corridor and up the stairs - v := vector.Vector{ + v := maths.Vector{ X: chunk % widthInChunks, Y: chunk / widthInChunks, } @@ -208,15 +207,15 @@ func (a *chunkBasedAtlas) chunkOriginInWorldSpace(chunk int) vector.Vector { } // getNewBounds gets new lower and upper bounds for the world space given a vector -func (a *chunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, upper vector.Vector) { - lower = vector.Min(v, a.LowerBound) - upper = vector.Max(v.Added(vector.Vector{X: 1, Y: 1}), a.UpperBound) +func (a *chunkBasedAtlas) getNewBounds(v maths.Vector) (lower maths.Vector, upper maths.Vector) { + lower = maths.Min2(v, a.LowerBound) + upper = maths.Max2(v.Added(maths.Vector{X: 1, Y: 1}), a.UpperBound) - lower = vector.Vector{ + lower = maths.Vector{ X: maths.RoundDown(lower.X, a.ChunkSize), Y: maths.RoundDown(lower.Y, a.ChunkSize), } - upper = vector.Vector{ + upper = maths.Vector{ X: maths.RoundUp(upper.X, a.ChunkSize), Y: maths.RoundUp(upper.Y, a.ChunkSize), } @@ -224,7 +223,7 @@ func (a *chunkBasedAtlas) getNewBounds(v vector.Vector) (lower vector.Vector, up } // worldSpaceToTrunkWithGrow will expand the current atlas for a given world space position if needed -func (a *chunkBasedAtlas) worldSpaceToChunkWithGrow(v vector.Vector) int { +func (a *chunkBasedAtlas) worldSpaceToChunkWithGrow(v maths.Vector) int { // If we're within bounds, just return the current chunk if v.X >= a.LowerBound.X && v.Y >= a.LowerBound.Y && v.X < a.UpperBound.X && v.Y < a.UpperBound.Y { return a.worldSpaceToChunkIndex(v) diff --git a/pkg/bearing/bearing.go b/pkg/bearing/bearing.go index 303c195..2eec3ba 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/bearing/bearing.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/mdiluz/rove/pkg/vector" + "github.com/mdiluz/rove/pkg/maths" ) // Bearing describes a compass direction @@ -67,7 +67,7 @@ func FromString(s string) (Bearing, error) { return -1, fmt.Errorf("unknown bearing: %s", s) } -var bearingVectors = []vector.Vector{ +var bearingVectors = []maths.Vector{ {X: 0, Y: 1}, // N {X: 1, Y: 1}, // NE {X: 1, Y: 0}, // E @@ -79,6 +79,6 @@ var bearingVectors = []vector.Vector{ } // Vector converts a Direction to a Vector -func (d Bearing) Vector() vector.Vector { +func (d Bearing) Vector() maths.Vector { return bearingVectors[d] } diff --git a/pkg/bearing/bearing_test.go b/pkg/bearing/bearing_test.go index 1232239..5bb36bc 100644 --- a/pkg/bearing/bearing_test.go +++ b/pkg/bearing/bearing_test.go @@ -3,7 +3,7 @@ package bearing import ( "testing" - "github.com/mdiluz/rove/pkg/vector" + "github.com/mdiluz/rove/pkg/maths" "github.com/stretchr/testify/assert" ) @@ -12,7 +12,7 @@ func TestDirection(t *testing.T) { assert.Equal(t, "North", dir.String()) assert.Equal(t, "N", dir.ShortString()) - assert.Equal(t, vector.Vector{X: 0, Y: 1}, dir.Vector()) + assert.Equal(t, maths.Vector{X: 0, Y: 1}, dir.Vector()) dir, err := FromString("N") assert.NoError(t, err) diff --git a/pkg/vector/vector.go b/pkg/maths/vector.go similarity index 78% rename from pkg/vector/vector.go rename to pkg/maths/vector.go index a8955be..2dd3bad 100644 --- a/pkg/vector/vector.go +++ b/pkg/maths/vector.go @@ -1,9 +1,7 @@ -package vector +package maths import ( "math" - - "github.com/mdiluz/rove/pkg/maths" ) // Vector desribes a 3D vector @@ -71,15 +69,15 @@ func (v Vector) DividedFloor(val int) Vector { // Abs returns an absolute version of the vector func (v Vector) Abs() Vector { - return Vector{maths.Abs(v.X), maths.Abs(v.Y)} + return Vector{Abs(v.X), Abs(v.Y)} } -// Min returns the minimum values in both vectors -func Min(v1 Vector, v2 Vector) Vector { - return Vector{maths.Min(v1.X, v2.X), maths.Min(v1.Y, v2.Y)} +// Min2 returns the minimum values in both vectors +func Min2(v1 Vector, v2 Vector) Vector { + return Vector{Min(v1.X, v2.X), Min(v1.Y, v2.Y)} } -// Max returns the max values in both vectors -func Max(v1 Vector, v2 Vector) Vector { - return Vector{maths.Max(v1.X, v2.X), maths.Max(v1.Y, v2.Y)} +// Max2 returns the max values in both vectors +func Max2(v1 Vector, v2 Vector) Vector { + return Vector{Max(v1.X, v2.X), Max(v1.Y, v2.Y)} } diff --git a/pkg/vector/vector_test.go b/pkg/maths/vector_test.go similarity index 99% rename from pkg/vector/vector_test.go rename to pkg/maths/vector_test.go index 5d92136..4177780 100644 --- a/pkg/vector/vector_test.go +++ b/pkg/maths/vector_test.go @@ -1,4 +1,4 @@ -package vector +package maths import ( "math" diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index f4f6bd9..e01a487 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -3,8 +3,8 @@ package rove import ( "testing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/roveapi" - "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -12,7 +12,7 @@ func TestCommand_Move(t *testing.T) { world := NewWorld(8) a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 1.0, Y: 2.0, } @@ -30,7 +30,7 @@ func TestCommand_Move(t *testing.T) { newPos, err := world.RoverPosition(a) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0.0, Y: 1}) + pos.Add(maths.Vector{X: 0.0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") } @@ -38,7 +38,7 @@ func TestCommand_Recharge(t *testing.T) { world := NewWorld(8) a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 1.0, Y: 2.0, } diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 9ab0401..45fb8f0 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -5,8 +5,8 @@ import ( "log" "time" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" - "github.com/mdiluz/rove/pkg/vector" ) // RoverLogEntry describes a single log entry for the rover @@ -24,7 +24,7 @@ type Rover struct { Name string `json:"name"` // Pos represents where this rover is in the world - Pos vector.Vector `json:"pos"` + Pos maths.Vector `json:"pos"` // Range represents the distance the unit's radar can see Range int `json:"range"` diff --git a/pkg/rove/world.go b/pkg/rove/world.go index dcb39ea..eb2ef85 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,9 +11,9 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" - "github.com/mdiluz/rove/pkg/vector" ) // World describes a self contained universe and everything in it @@ -103,7 +103,7 @@ func (w *World) SpawnRover() (string, error) { } // Spawn in a random place near the origin - rover.Pos = vector.Vector{ + rover.Pos = maths.Vector{ X: 10 - rand.Intn(20), Y: 10 - rand.Intn(20), } @@ -115,7 +115,7 @@ func (w *World) SpawnRover() (string, error) { break } else { // Try and spawn to the east of the blockage - rover.Pos.Add(vector.Vector{X: 1, Y: 0}) + rover.Pos.Add(maths.Vector{X: 1, Y: 0}) } } @@ -215,19 +215,19 @@ func (w *World) DestroyRover(rover string) error { } // RoverPosition returns the position of the rover -func (w *World) RoverPosition(rover string) (vector.Vector, error) { +func (w *World) RoverPosition(rover string) (maths.Vector, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() i, ok := w.Rovers[rover] if !ok { - return vector.Vector{}, fmt.Errorf("no rover matching id") + return maths.Vector{}, fmt.Errorf("no rover matching id") } return i.Pos, nil } // SetRoverPosition sets the position of the rover -func (w *World) SetRoverPosition(rover string, pos vector.Vector) error { +func (w *World) SetRoverPosition(rover string, pos maths.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -254,7 +254,7 @@ func (w *World) RoverInventory(rover string) ([]objects.Object, error) { } // WarpRover sets an rovers position -func (w *World) WarpRover(rover string, pos vector.Vector) error { +func (w *World) WarpRover(rover string, pos maths.Vector) error { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -279,13 +279,13 @@ func (w *World) WarpRover(rover string, pos vector.Vector) error { } // MoveRover attempts to move a rover in a specific direction -func (w *World) MoveRover(rover string, b bearing.Bearing) (vector.Vector, error) { +func (w *World) MoveRover(rover string, b bearing.Bearing) (maths.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() i, ok := w.Rovers[rover] if !ok { - return vector.Vector{}, fmt.Errorf("no rover matching id") + return maths.Vector{}, fmt.Errorf("no rover matching id") } // Ensure the rover has energy @@ -368,11 +368,11 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err roverPos := r.Pos // Get the radar min and max values - radarMin := vector.Vector{ + radarMin := maths.Vector{ X: roverPos.X - r.Range, Y: roverPos.Y - r.Range, } - radarMax := vector.Vector{ + radarMax := maths.Vector{ X: roverPos.X + r.Range, Y: roverPos.Y + r.Range, } @@ -382,7 +382,7 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err objs = make([]byte, radarSpan*radarSpan) for j := radarMin.Y; j <= radarMax.Y; j++ { for i := radarMin.X; i <= radarMax.X; i++ { - q := vector.Vector{X: i, Y: j} + q := maths.Vector{X: i, Y: j} tile, obj := w.Atlas.QueryPosition(q) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 52e8eec..89ea9c7 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -5,9 +5,9 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" - "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -68,7 +68,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 0.0, Y: 0.0, } @@ -83,7 +83,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { b := bearing.North newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") - pos.Add(vector.Vector{X: 0, Y: 1}) + pos.Add(maths.Vector{X: 0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") rover, err := world.GetRover(a) @@ -92,7 +92,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover - world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") @@ -111,9 +111,9 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.NoError(t, err) // Warp the rovers into position - bpos := vector.Vector{X: -3, Y: -3} + bpos := maths.Vector{X: -3, Y: -3} assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") - assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0}), "Failed to warp rover") + assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0}), "Failed to warp rover") radar, objs, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") @@ -139,7 +139,7 @@ func TestWorld_RoverStash(t *testing.T) { a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 0.0, Y: 0.0, } @@ -215,7 +215,7 @@ func TestWorld_RoverDamage(t *testing.T) { a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 0.0, Y: 0.0, } @@ -226,7 +226,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) vec, err := world.MoveRover(a, bearing.North) assert.NoError(t, err, "Failed to move rover") @@ -243,7 +243,7 @@ func TestWorld_RoverRepair(t *testing.T) { a, err := world.SpawnRover() assert.NoError(t, err) - pos := vector.Vector{ + pos := maths.Vector{ X: 0.0, Y: 0.0, } @@ -263,7 +263,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "Failed to stash") assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") - world.Atlas.SetObject(vector.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) // Try and bump into the rock vec, err := world.MoveRover(a, bearing.North) @@ -378,8 +378,8 @@ func TestWorld_Broadcast(t *testing.T) { assert.NoError(t, err) // Warp rovers near to eachother - assert.NoError(t, world.WarpRover(a, vector.Vector{X: 0, Y: 0})) - assert.NoError(t, world.WarpRover(b, vector.Vector{X: 1, Y: 0})) + assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0})) + assert.NoError(t, world.WarpRover(b, maths.Vector{X: 1, Y: 0})) // Broadcast from a assert.NoError(t, world.RoverBroadcast(a, []byte{'A', 'B', 'C'})) @@ -396,8 +396,8 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(vector.Vector{X: ra.Range, Y: 0}, objects.Object{Type: objects.None}) - assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range, Y: 0})) + world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, objects.Object{Type: objects.None}) + assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range, Y: 0})) // Broadcast from a again assert.NoError(t, world.RoverBroadcast(a, []byte{'X', 'Y', 'Z'})) @@ -413,8 +413,8 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(vector.Vector{X: ra.Range + 1, Y: 0}, objects.Object{Type: objects.None}) - assert.NoError(t, world.WarpRover(b, vector.Vector{X: ra.Range + 1, Y: 0})) + world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, objects.Object{Type: objects.None}) + assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again assert.NoError(t, world.RoverBroadcast(a, []byte{'H', 'J', 'K'})) From f40f7123d43b6f3731c3fa4937be851a35e76053 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:24:54 +0100 Subject: [PATCH 379/495] Move bearing into maths --- cmd/rove/main.go | 4 ++-- pkg/{bearing => maths}/bearing.go | 8 +++----- pkg/{bearing => maths}/bearing_test.go | 5 ++--- pkg/rove/world.go | 7 +++---- pkg/rove/world_test.go | 15 +++++++-------- 5 files changed, 17 insertions(+), 22 deletions(-) rename pkg/{bearing => maths}/bearing.go (92%) rename pkg/{bearing => maths}/bearing_test.go (83%) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index af48a61..cf239bf 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -11,7 +11,7 @@ import ( "time" "github.com/mdiluz/rove/pkg/atlas" - "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" @@ -216,7 +216,7 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := bearing.FromString(args[i]); err != nil { + } else if _, err := maths.FromString(args[i]); err != nil { return err } commands = append(commands, diff --git a/pkg/bearing/bearing.go b/pkg/maths/bearing.go similarity index 92% rename from pkg/bearing/bearing.go rename to pkg/maths/bearing.go index 2eec3ba..220855b 100644 --- a/pkg/bearing/bearing.go +++ b/pkg/maths/bearing.go @@ -1,10 +1,8 @@ -package bearing +package maths import ( "fmt" "strings" - - "github.com/mdiluz/rove/pkg/maths" ) // Bearing describes a compass direction @@ -67,7 +65,7 @@ func FromString(s string) (Bearing, error) { return -1, fmt.Errorf("unknown bearing: %s", s) } -var bearingVectors = []maths.Vector{ +var bearingVectors = []Vector{ {X: 0, Y: 1}, // N {X: 1, Y: 1}, // NE {X: 1, Y: 0}, // E @@ -79,6 +77,6 @@ var bearingVectors = []maths.Vector{ } // Vector converts a Direction to a Vector -func (d Bearing) Vector() maths.Vector { +func (d Bearing) Vector() Vector { return bearingVectors[d] } diff --git a/pkg/bearing/bearing_test.go b/pkg/maths/bearing_test.go similarity index 83% rename from pkg/bearing/bearing_test.go rename to pkg/maths/bearing_test.go index 5bb36bc..bb97043 100644 --- a/pkg/bearing/bearing_test.go +++ b/pkg/maths/bearing_test.go @@ -1,9 +1,8 @@ -package bearing +package maths import ( "testing" - "github.com/mdiluz/rove/pkg/maths" "github.com/stretchr/testify/assert" ) @@ -12,7 +11,7 @@ func TestDirection(t *testing.T) { assert.Equal(t, "North", dir.String()) assert.Equal(t, "N", dir.ShortString()) - assert.Equal(t, maths.Vector{X: 0, Y: 1}, dir.Vector()) + assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) dir, err := FromString("N") assert.NoError(t, err) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index eb2ef85..559073e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -10,7 +10,6 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" - "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" @@ -279,7 +278,7 @@ func (w *World) WarpRover(rover string, pos maths.Vector) error { } // MoveRover attempts to move a rover in a specific direction -func (w *World) MoveRover(rover string, b bearing.Bearing) (maths.Vector, error) { +func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -428,7 +427,7 @@ func (w *World) Enqueue(rover string, commands ...Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_move: - if _, err := bearing.FromString(c.Bearing); err != nil { + if _, err := maths.FromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) } case roveapi.CommandType_broadcast: @@ -507,7 +506,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { switch c.Command { case roveapi.CommandType_move: - if dir, err := bearing.FromString(c.Bearing); err != nil { + if dir, err := maths.FromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 89ea9c7..78e9160 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/mdiluz/rove/pkg/atlas" - "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" @@ -80,7 +79,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") - b := bearing.North + b := maths.North newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") pos.Add(maths.Vector{X: 0, Y: 1}) @@ -228,7 +227,7 @@ func TestWorld_RoverDamage(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) - vec, err := world.MoveRover(a, bearing.North) + vec, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -266,7 +265,7 @@ func TestWorld_RoverRepair(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) // Try and bump into the rock - vec, err := world.MoveRover(a, bearing.North) + vec, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -313,13 +312,13 @@ func TestWorld_Charge(t *testing.T) { assert.NoError(t, err, "Failed to get position for rover") // Ensure the path ahead is empty - world.Atlas.SetTile(initialPos.Added(bearing.North.Vector()), atlas.TileRock) - world.Atlas.SetObject(initialPos.Added(bearing.North.Vector()), objects.Object{Type: objects.None}) + world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), atlas.TileRock) + world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), objects.Object{Type: objects.None}) // Try and move north (along unblocked path) - newPos, err := world.MoveRover(a, bearing.North) + newPos, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to set position for rover") - assert.Equal(t, initialPos.Added(bearing.North.Vector()), newPos, "Failed to correctly move position for rover") + assert.Equal(t, initialPos.Added(maths.North.Vector()), newPos, "Failed to correctly move position for rover") // Ensure rover lost charge rover, err := world.GetRover(a) From f0ab2abf6e81488f1f07c02a6f203d023b4a70d9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:39:33 +0100 Subject: [PATCH 380/495] Move object into atlas --- cmd/rove/main.go | 3 +-- pkg/atlas/atlas.go | 5 ++-- pkg/atlas/atlas_test.go | 15 +++++------ pkg/atlas/chunkAtlas.go | 27 ++++++++++--------- pkg/{objects => atlas}/objects.go | 24 ++++++++--------- pkg/rove/rover.go | 4 +-- pkg/rove/world.go | 17 ++++++------ pkg/rove/world_test.go | 43 +++++++++++++++---------------- 8 files changed, 66 insertions(+), 72 deletions(-) rename pkg/{objects => atlas}/objects.go (63%) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index cf239bf..1ec0b24 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -12,7 +12,6 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" "golang.org/x/net/context" @@ -288,7 +287,7 @@ func InnerMain(command string, args ...string) error { for i := 0; i < num; i++ { t := response.Tiles[i+num*j] o := response.Objects[i+num*j] - if o != byte(objects.None) { + if o != byte(atlas.ObjectNone) { fmt.Printf("%c", o) } else if t != byte(atlas.TileNone) { fmt.Printf("%c", t) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 22873f7..1a2f3fb 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -2,7 +2,6 @@ package atlas import ( "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" ) // Tile describes the type of terrain @@ -28,8 +27,8 @@ type Atlas interface { SetTile(v maths.Vector, tile Tile) // SetObject will set a location on the Atlas to contain an object - SetObject(v maths.Vector, obj objects.Object) + SetObject(v maths.Vector, obj Object) // QueryPosition queries a position on the atlas - QueryPosition(v maths.Vector) (byte, objects.Object) + QueryPosition(v maths.Vector) (byte, Object) } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 4792e0b..9305b07 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" "github.com/stretchr/testify/assert" ) @@ -186,14 +185,14 @@ func TestAtlas_GetSetObject(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - a.SetObject(maths.Vector{X: 0, Y: 0}, objects.Object{Type: objects.LargeRock}) + a.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: ObjectLargeRock}) _, obj := a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, objects.Object{Type: objects.LargeRock}, obj) + assert.Equal(t, Object{Type: ObjectLargeRock}, obj) // Set another tile to 1 and test it - a.SetObject(maths.Vector{X: 5, Y: -2}, objects.Object{Type: objects.SmallRock}) + a.SetObject(maths.Vector{X: 5, Y: -2}, Object{Type: ObjectSmallRock}) _, obj = a.QueryPosition(maths.Vector{X: 5, Y: -2}) - assert.Equal(t, objects.Object{Type: objects.SmallRock}, obj) + assert.Equal(t, Object{Type: ObjectSmallRock}, obj) } func TestAtlas_Grown(t *testing.T) { @@ -239,11 +238,11 @@ func TestAtlas_GetSetCorrect(t *testing.T) { pos := maths.Vector{X: x, Y: y} a.SetTile(pos, TileRock) - a.SetObject(pos, objects.Object{Type: objects.LargeRock}) + a.SetObject(pos, Object{Type: ObjectLargeRock}) tile, obj := a.QueryPosition(pos) assert.Equal(t, TileRock, Tile(tile)) - assert.Equal(t, objects.Object{Type: objects.LargeRock}, obj) + assert.Equal(t, Object{Type: ObjectLargeRock}, obj) } } @@ -260,7 +259,7 @@ func TestAtlas_WorldGen(t *testing.T) { for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { t, o := a.QueryPosition(maths.Vector{X: i, Y: j}) - if o.Type != objects.None { + if o.Type != ObjectNone { fmt.Printf("%c", o.Type) } else if t != byte(TileNone) { fmt.Printf("%c", t) diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index c3c969e..daee6e6 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -5,7 +5,6 @@ import ( "math/rand" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" "github.com/ojrac/opensimplex-go" ) @@ -16,7 +15,7 @@ type chunk struct { // Objects represents the objects within the chunk // only one possible object per tile for now - Objects map[int]objects.Object `json:"objects"` + Objects map[int]Object `json:"objects"` } // chunkBasedAtlas represents a grid of Chunks @@ -71,14 +70,14 @@ func (a *chunkBasedAtlas) SetTile(v maths.Vector, tile Tile) { } // SetObject sets the object on a tile -func (a *chunkBasedAtlas) SetObject(v maths.Vector, obj objects.Object) { +func (a *chunkBasedAtlas) SetObject(v maths.Vector, obj Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setObject(c, local, obj) } // QueryPosition will return information for a specific position -func (a *chunkBasedAtlas) QueryPosition(v maths.Vector) (byte, objects.Object) { +func (a *chunkBasedAtlas) QueryPosition(v maths.Vector) (byte, Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.populate(c) @@ -100,7 +99,7 @@ func (a *chunkBasedAtlas) populate(chunk int) { } c.Tiles = make([]byte, a.ChunkSize*a.ChunkSize) - c.Objects = make(map[int]objects.Object) + c.Objects = make(map[int]Object) origin := a.chunkOriginInWorldSpace(chunk) for i := 0; i < a.ChunkSize; i++ { @@ -121,15 +120,15 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Get the object noise value for this location o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) - var obj = objects.None + var obj = ObjectNone switch { case o > 0.6: - obj = objects.LargeRock + obj = ObjectLargeRock case o > 0.5: - obj = objects.SmallRock + obj = ObjectSmallRock } - if obj != objects.None { - c.Objects[j*a.ChunkSize+i] = objects.Object{Type: obj} + if obj != ObjectNone { + c.Objects[j*a.ChunkSize+i] = Object{Type: obj} } } } @@ -137,9 +136,9 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Set up any objects for i := 0; i < len(c.Tiles); i++ { if rand.Intn(16) == 0 { - c.Objects[i] = objects.Object{Type: objects.LargeRock} + c.Objects[i] = Object{Type: ObjectLargeRock} } else if rand.Intn(32) == 0 { - c.Objects[i] = objects.Object{Type: objects.SmallRock} + c.Objects[i] = Object{Type: ObjectSmallRock} } } @@ -155,12 +154,12 @@ func (a *chunkBasedAtlas) setTile(chunk int, local maths.Vector, tile byte) { } // setObject sets an object in a specific chunk -func (a *chunkBasedAtlas) setObject(chunk int, local maths.Vector, object objects.Object) { +func (a *chunkBasedAtlas) setObject(chunk int, local maths.Vector, object Object) { a.populate(chunk) c := a.Chunks[chunk] i := a.chunkTileIndex(local) - if object.Type != objects.None { + if object.Type != ObjectNone { c.Objects[i] = object } else { delete(c.Objects, i) diff --git a/pkg/objects/objects.go b/pkg/atlas/objects.go similarity index 63% rename from pkg/objects/objects.go rename to pkg/atlas/objects.go index 9338b68..68b4ef8 100644 --- a/pkg/objects/objects.go +++ b/pkg/atlas/objects.go @@ -1,21 +1,21 @@ -package objects +package atlas // Type represents an object type type Type byte // Types of objects const ( - // None represents no object at all - None = Type(0) + // ObjectNone represents no object at all + ObjectNone = Type(0) - // Rover represents a live rover - Rover = Type('R') + // ObjectRover represents a live rover + ObjectRover = Type('R') - // SmallRock is a small stashable rock - SmallRock = Type('o') + // ObjectSmallRock is a small stashable rock + ObjectSmallRock = Type('o') - // LargeRock is a large blocking rock - LargeRock = Type('O') + // ObjectLargeRock is a large blocking rock + ObjectLargeRock = Type('O') ) // Object represents an object in the world @@ -26,8 +26,8 @@ type Object struct { // IsBlocking checks if an object is a blocking object func (o *Object) IsBlocking() bool { var blocking = [...]Type{ - Rover, - LargeRock, + ObjectRover, + ObjectLargeRock, } for _, t := range blocking { @@ -41,7 +41,7 @@ func (o *Object) IsBlocking() bool { // IsStashable checks if an object is stashable func (o *Object) IsStashable() bool { var stashable = [...]Type{ - SmallRock, + ObjectSmallRock, } for _, t := range stashable { diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 45fb8f0..089b44a 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -5,8 +5,8 @@ import ( "log" "time" + "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" ) // RoverLogEntry describes a single log entry for the rover @@ -30,7 +30,7 @@ type Rover struct { Range int `json:"range"` // Inventory represents any items the rover is carrying - Inventory []objects.Object `json:"inventory"` + Inventory []atlas.Object `json:"inventory"` // Capacity is the maximum number of inventory items Capacity int `json:"capacity"` diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 559073e..b0e796f 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,7 +11,6 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" ) @@ -241,7 +240,7 @@ func (w *World) SetRoverPosition(rover string, pos maths.Vector) error { } // RoverInventory returns the inventory of a requested rover -func (w *World) RoverInventory(rover string) ([]objects.Object, error) { +func (w *World) RoverInventory(rover string) ([]atlas.Object, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -319,35 +318,35 @@ func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { } // RoverStash will stash an item at the current rovers position -func (w *World) RoverStash(rover string) (objects.Type, error) { +func (w *World) RoverStash(rover string) (atlas.Type, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() r, ok := w.Rovers[rover] if !ok { - return objects.None, fmt.Errorf("no rover matching id") + return atlas.ObjectNone, fmt.Errorf("no rover matching id") } // Can't pick up when full if len(r.Inventory) >= r.Capacity { - return objects.None, nil + return atlas.ObjectNone, nil } // Ensure the rover has energy if r.Charge <= 0 { - return objects.None, nil + return atlas.ObjectNone, nil } r.Charge-- _, obj := w.Atlas.QueryPosition(r.Pos) if !obj.IsStashable() { - return objects.None, nil + return atlas.ObjectNone, nil } r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r - w.Atlas.SetObject(r.Pos, objects.Object{Type: objects.None}) + w.Atlas.SetObject(r.Pos, atlas.Object{Type: atlas.ObjectNone}) return obj.Type, nil } @@ -402,7 +401,7 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err if dist.X <= r.Range && dist.Y <= r.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - objs[index] = byte(objects.Rover) + objs[index] = byte(atlas.ObjectRover) } } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 78e9160..ceaff43 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -5,7 +5,6 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/roveapi" "github.com/stretchr/testify/assert" ) @@ -91,7 +90,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover - world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: atlas.ObjectLargeRock}) newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") @@ -121,8 +120,8 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") // Test the expected values - assert.Equal(t, byte(objects.Rover), objs[1+fullRange]) - assert.Equal(t, byte(objects.Rover), objs[4+4*fullRange]) + assert.Equal(t, byte(atlas.ObjectRover), objs[1+fullRange]) + assert.Equal(t, byte(atlas.ObjectRover), objs[4+4*fullRange]) // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) @@ -143,7 +142,7 @@ func TestWorld_RoverStash(t *testing.T) { Y: 0.0, } - world.Atlas.SetObject(pos, objects.Object{Type: objects.None}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectNone}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -155,22 +154,22 @@ func TestWorld_RoverStash(t *testing.T) { for i := 0; i < rover.Capacity; i++ { // Place an object - world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) // Pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") // Check it's gone _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, objects.None, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, atlas.ObjectNone, obj.Type, "Stash failed to remove object from atlas") // Check we have it inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) - assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) + assert.Equal(t, atlas.Object{Type: atlas.ObjectSmallRock}, inv[i]) // Check that this did reduce the charge info, err := world.GetRover(a) @@ -187,16 +186,16 @@ func TestWorld_RoverStash(t *testing.T) { } // Place an object - world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) // Try to pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, objects.None, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectNone, o, "Failed to get correct object") // Check it's still there _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, objects.SmallRock, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, atlas.ObjectSmallRock, obj.Type, "Stash failed to remove object from atlas") // Check we don't have it inv, err := world.RoverInventory(a) @@ -225,7 +224,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectLargeRock}) vec, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to move rover") @@ -248,7 +247,7 @@ func TestWorld_RoverRepair(t *testing.T) { } world.Atlas.SetTile(pos, atlas.TileNone) - world.Atlas.SetObject(pos, objects.Object{Type: objects.None}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectNone}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -257,12 +256,12 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, objects.Object{Type: objects.LargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectLargeRock}) // Try and bump into the rock vec, err := world.MoveRover(a, maths.North) @@ -282,10 +281,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, objects.Object{Type: objects.SmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, objects.SmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") @@ -313,7 +312,7 @@ func TestWorld_Charge(t *testing.T) { // Ensure the path ahead is empty world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), atlas.TileRock) - world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), objects.Object{Type: objects.None}) + world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: atlas.ObjectNone}) // Try and move north (along unblocked path) newPos, err := world.MoveRover(a, maths.North) @@ -395,7 +394,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, objects.Object{Type: objects.None}) + world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: atlas.ObjectNone}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range, Y: 0})) // Broadcast from a again @@ -412,7 +411,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, objects.Object{Type: objects.None}) + world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: atlas.ObjectNone}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again From 9ccb7ac019189d2693f949a26019fc2b82f12005 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:48:03 +0100 Subject: [PATCH 381/495] Remove google proto files, no longer needed --- proto/google/README.grpc-gateway | 23 -- proto/google/api/annotations.proto | 31 --- proto/google/api/http.proto | 318 --------------------------- proto/google/api/httpbody.proto | 78 ------- proto/google/rpc/code.proto | 186 ---------------- proto/google/rpc/error_details.proto | 200 ----------------- proto/google/rpc/status.proto | 92 -------- 7 files changed, 928 deletions(-) delete mode 100644 proto/google/README.grpc-gateway delete mode 100644 proto/google/api/annotations.proto delete mode 100644 proto/google/api/http.proto delete mode 100644 proto/google/api/httpbody.proto delete mode 100644 proto/google/rpc/code.proto delete mode 100644 proto/google/rpc/error_details.proto delete mode 100644 proto/google/rpc/status.proto diff --git a/proto/google/README.grpc-gateway b/proto/google/README.grpc-gateway deleted file mode 100644 index b7d1bea..0000000 --- a/proto/google/README.grpc-gateway +++ /dev/null @@ -1,23 +0,0 @@ -Google APIs -============ - -Project: Google APIs -URL: https://github.com/google/googleapis -Revision: 3544ab16c3342d790b00764251e348705991ea4b -License: Apache License 2.0 - - -Imported Files ---------------- - -- google/api/annotations.proto -- google/api/http.proto -- google/api/httpbody.proto - - -Generated Files ----------------- - -They are generated from the .proto files by protoc-gen-go. -- google/api/annotations.pb.go -- google/api/http.pb.go diff --git a/proto/google/api/annotations.proto b/proto/google/api/annotations.proto deleted file mode 100644 index 85c361b..0000000 --- a/proto/google/api/annotations.proto +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015, Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -import "google/api/http.proto"; -import "google/protobuf/descriptor.proto"; - -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "AnnotationsProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -extend google.protobuf.MethodOptions { - // See `HttpRule`. - HttpRule http = 72295728; -} diff --git a/proto/google/api/http.proto b/proto/google/api/http.proto deleted file mode 100644 index 2bd3a19..0000000 --- a/proto/google/api/http.proto +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "HttpProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - - -// Defines the HTTP configuration for an API service. It contains a list of -// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method -// to one or more HTTP REST API methods. -message Http { - // A list of HTTP configuration rules that apply to individual API methods. - // - // **NOTE:** All service configuration rules follow "last one wins" order. - repeated HttpRule rules = 1; - - // When set to true, URL path parmeters will be fully URI-decoded except in - // cases of single segment matches in reserved expansion, where "%2F" will be - // left encoded. - // - // The default behavior is to not decode RFC 6570 reserved characters in multi - // segment matches. - bool fully_decode_reserved_expansion = 2; -} - -// `HttpRule` defines the mapping of an RPC method to one or more HTTP -// REST API methods. The mapping specifies how different portions of the RPC -// request message are mapped to URL path, URL query parameters, and -// HTTP request body. The mapping is typically specified as an -// `google.api.http` annotation on the RPC method, -// see "google/api/annotations.proto" for details. -// -// The mapping consists of a field specifying the path template and -// method kind. The path template can refer to fields in the request -// message, as in the example below which describes a REST GET -// operation on a resource collection of messages: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// SubMessage sub = 2; // `sub.subfield` is url-mapped -// } -// message Message { -// string text = 1; // content of the resource -// } -// -// The same http annotation can alternatively be expressed inside the -// `GRPC API Configuration` YAML file. -// -// http: -// rules: -// - selector: .Messaging.GetMessage -// get: /v1/messages/{message_id}/{sub.subfield} -// -// This definition enables an automatic, bidrectional mapping of HTTP -// JSON to RPC. Example: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` -// -// In general, not only fields but also field paths can be referenced -// from a path pattern. Fields mapped to the path pattern cannot be -// repeated and must have a primitive (non-message) type. -// -// Any fields in the request message which are not bound by the path -// pattern automatically become (optional) HTTP query -// parameters. Assume the following definition of the request message: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// int64 revision = 2; // becomes a parameter -// SubMessage sub = 3; // `sub.subfield` becomes a parameter -// } -// -// -// This enables a HTTP JSON to RPC mapping as below: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` -// -// Note that fields which are mapped to HTTP parameters must have a -// primitive type or a repeated primitive type. Message types are not -// allowed. In the case of a repeated type, the parameter can be -// repeated in the URL, as in `...?param=A¶m=B`. -// -// For HTTP method kinds which allow a request body, the `body` field -// specifies the mapping. Consider a REST update method on the -// message resource collection: -// -// -// service Messaging { -// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "message" -// }; -// } -// } -// message UpdateMessageRequest { -// string message_id = 1; // mapped to the URL -// Message message = 2; // mapped to the body -// } -// -// -// The following HTTP JSON to RPC mapping is enabled, where the -// representation of the JSON in the request body is determined by -// protos JSON encoding: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` -// -// The special name `*` can be used in the body mapping to define that -// every field not bound by the path template should be mapped to the -// request body. This enables the following alternative definition of -// the update method: -// -// service Messaging { -// rpc UpdateMessage(Message) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "*" -// }; -// } -// } -// message Message { -// string message_id = 1; -// string text = 2; -// } -// -// -// The following HTTP JSON to RPC mapping is enabled: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` -// -// Note that when using `*` in the body mapping, it is not possible to -// have HTTP parameters, as all fields not bound by the path end in -// the body. This makes this option more rarely used in practice of -// defining REST APIs. The common usage of `*` is in custom methods -// which don't use the URL at all for transferring data. -// -// It is possible to define multiple HTTP methods for one RPC by using -// the `additional_bindings` option. Example: -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http) = { -// get: "/v1/messages/{message_id}" -// additional_bindings { -// get: "/v1/users/{user_id}/messages/{message_id}" -// } -// }; -// } -// } -// message GetMessageRequest { -// string message_id = 1; -// string user_id = 2; -// } -// -// -// This enables the following two alternative HTTP JSON to RPC -// mappings: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` -// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` -// -// # Rules for HTTP mapping -// -// The rules for mapping HTTP path, query parameters, and body fields -// to the request message are as follows: -// -// 1. The `body` field specifies either `*` or a field path, or is -// omitted. If omitted, it indicates there is no HTTP request body. -// 2. Leaf fields (recursive expansion of nested messages in the -// request) can be classified into three types: -// (a) Matched in the URL template. -// (b) Covered by body (if body is `*`, everything except (a) fields; -// else everything under the body field) -// (c) All other fields. -// 3. URL query parameters found in the HTTP request are mapped to (c) fields. -// 4. Any body sent with an HTTP request can contain only (b) fields. -// -// The syntax of the path template is as follows: -// -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// -// The syntax `*` matches a single path segment. The syntax `**` matches zero -// or more path segments, which must be the last part of the path except the -// `Verb`. The syntax `LITERAL` matches literal text in the path. -// -// The syntax `Variable` matches part of the URL path as specified by its -// template. A variable template must not contain other variables. If a variable -// matches a single path segment, its template may be omitted, e.g. `{var}` -// is equivalent to `{var=*}`. -// -// If a variable contains exactly one path segment, such as `"{var}"` or -// `"{var=*}"`, when such a variable is expanded into a URL path, all characters -// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the -// Discovery Document as `{var}`. -// -// If a variable contains one or more path segments, such as `"{var=foo/*}"` -// or `"{var=**}"`, when such a variable is expanded into a URL path, all -// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables -// show up in the Discovery Document as `{+var}`. -// -// NOTE: While the single segment variable matches the semantics of -// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 -// Simple String Expansion, the multi segment variable **does not** match -// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion -// does not expand special characters like `?` and `#`, which would lead -// to invalid URLs. -// -// NOTE: the field paths in variables and in the `body` must not refer to -// repeated fields or map fields. -message HttpRule { - // Selects methods to which this rule applies. - // - // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. - string selector = 1; - - // Determines the URL pattern is matched by this rules. This pattern can be - // used with any of the {get|put|post|delete|patch} methods. A custom method - // can be defined using the 'custom' field. - oneof pattern { - // Used for listing and getting information about resources. - string get = 2; - - // Used for updating a resource. - string put = 3; - - // Used for creating a resource. - string post = 4; - - // Used for deleting a resource. - string delete = 5; - - // Used for updating a resource. - string patch = 6; - - // The custom pattern is used for specifying an HTTP method that is not - // included in the `pattern` field, such as HEAD, or "*" to leave the - // HTTP method unspecified for this rule. The wild-card rule is useful - // for services that provide content to Web (HTML) clients. - CustomHttpPattern custom = 8; - } - - // The name of the request field whose value is mapped to the HTTP body, or - // `*` for mapping all fields not captured by the path pattern to the HTTP - // body. NOTE: the referred field must not be a repeated field and must be - // present at the top-level of request message type. - string body = 7; - - // Optional. The name of the response field whose value is mapped to the HTTP - // body of response. Other response fields are ignored. When - // not set, the response message will be used as HTTP body of response. - string response_body = 12; - - // Additional HTTP bindings for the selector. Nested bindings must - // not contain an `additional_bindings` field themselves (that is, - // the nesting may only be one level deep). - repeated HttpRule additional_bindings = 11; -} - -// A custom pattern is used for defining custom HTTP verb. -message CustomHttpPattern { - // The name of this custom HTTP verb. - string kind = 1; - - // The path matched by this custom verb. - string path = 2; -} diff --git a/proto/google/api/httpbody.proto b/proto/google/api/httpbody.proto deleted file mode 100644 index 4428515..0000000 --- a/proto/google/api/httpbody.proto +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2018 Google LLC. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -syntax = "proto3"; - -package google.api; - -import "google/protobuf/any.proto"; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody"; -option java_multiple_files = true; -option java_outer_classname = "HttpBodyProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -// Message that represents an arbitrary HTTP body. It should only be used for -// payload formats that can't be represented as JSON, such as raw binary or -// an HTML page. -// -// -// This message can be used both in streaming and non-streaming API methods in -// the request as well as the response. -// -// It can be used as a top-level request field, which is convenient if one -// wants to extract parameters from either the URL or HTTP template into the -// request fields and also want access to the raw HTTP body. -// -// Example: -// -// message GetResourceRequest { -// // A unique request id. -// string request_id = 1; -// -// // The raw HTTP body is bound to this field. -// google.api.HttpBody http_body = 2; -// } -// -// service ResourceService { -// rpc GetResource(GetResourceRequest) returns (google.api.HttpBody); -// rpc UpdateResource(google.api.HttpBody) returns -// (google.protobuf.Empty); -// } -// -// Example with streaming methods: -// -// service CaldavService { -// rpc GetCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// rpc UpdateCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// } -// -// Use of this type only changes how the request and response bodies are -// handled, all other features will continue to work unchanged. -message HttpBody { - // The HTTP Content-Type header value specifying the content type of the body. - string content_type = 1; - - // The HTTP request/response body as raw binary. - bytes data = 2; - - // Application specific response metadata. Must be set in the first response - // for streaming APIs. - repeated google.protobuf.Any extensions = 3; -} \ No newline at end of file diff --git a/proto/google/rpc/code.proto b/proto/google/rpc/code.proto deleted file mode 100644 index 8fef411..0000000 --- a/proto/google/rpc/code.proto +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -option go_package = "google.golang.org/genproto/googleapis/rpc/code;code"; -option java_multiple_files = true; -option java_outer_classname = "CodeProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - - -// The canonical error codes for Google APIs. -// -// -// Sometimes multiple error codes may apply. Services should return -// the most specific error code that applies. For example, prefer -// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply. -// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`. -enum Code { - // Not an error; returned on success - // - // HTTP Mapping: 200 OK - OK = 0; - - // The operation was cancelled, typically by the caller. - // - // HTTP Mapping: 499 Client Closed Request - CANCELLED = 1; - - // Unknown error. For example, this error may be returned when - // a `Status` value received from another address space belongs to - // an error space that is not known in this address space. Also - // errors raised by APIs that do not return enough error information - // may be converted to this error. - // - // HTTP Mapping: 500 Internal Server Error - UNKNOWN = 2; - - // The client specified an invalid argument. Note that this differs - // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments - // that are problematic regardless of the state of the system - // (e.g., a malformed file name). - // - // HTTP Mapping: 400 Bad Request - INVALID_ARGUMENT = 3; - - // The deadline expired before the operation could complete. For operations - // that change the state of the system, this error may be returned - // even if the operation has completed successfully. For example, a - // successful response from a server could have been delayed long - // enough for the deadline to expire. - // - // HTTP Mapping: 504 Gateway Timeout - DEADLINE_EXCEEDED = 4; - - // Some requested entity (e.g., file or directory) was not found. - // - // Note to server developers: if a request is denied for an entire class - // of users, such as gradual feature rollout or undocumented whitelist, - // `NOT_FOUND` may be used. If a request is denied for some users within - // a class of users, such as user-based access control, `PERMISSION_DENIED` - // must be used. - // - // HTTP Mapping: 404 Not Found - NOT_FOUND = 5; - - // The entity that a client attempted to create (e.g., file or directory) - // already exists. - // - // HTTP Mapping: 409 Conflict - ALREADY_EXISTS = 6; - - // The caller does not have permission to execute the specified - // operation. `PERMISSION_DENIED` must not be used for rejections - // caused by exhausting some resource (use `RESOURCE_EXHAUSTED` - // instead for those errors). `PERMISSION_DENIED` must not be - // used if the caller can not be identified (use `UNAUTHENTICATED` - // instead for those errors). This error code does not imply the - // request is valid or the requested entity exists or satisfies - // other pre-conditions. - // - // HTTP Mapping: 403 Forbidden - PERMISSION_DENIED = 7; - - // The request does not have valid authentication credentials for the - // operation. - // - // HTTP Mapping: 401 Unauthorized - UNAUTHENTICATED = 16; - - // Some resource has been exhausted, perhaps a per-user quota, or - // perhaps the entire file system is out of space. - // - // HTTP Mapping: 429 Too Many Requests - RESOURCE_EXHAUSTED = 8; - - // The operation was rejected because the system is not in a state - // required for the operation's execution. For example, the directory - // to be deleted is non-empty, an rmdir operation is applied to - // a non-directory, etc. - // - // Service implementors can use the following guidelines to decide - // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: - // (a) Use `UNAVAILABLE` if the client can retry just the failing call. - // (b) Use `ABORTED` if the client should retry at a higher level - // (e.g., when a client-specified test-and-set fails, indicating the - // client should restart a read-modify-write sequence). - // (c) Use `FAILED_PRECONDITION` if the client should not retry until - // the system state has been explicitly fixed. E.g., if an "rmdir" - // fails because the directory is non-empty, `FAILED_PRECONDITION` - // should be returned since the client should not retry unless - // the files are deleted from the directory. - // - // HTTP Mapping: 400 Bad Request - FAILED_PRECONDITION = 9; - - // The operation was aborted, typically due to a concurrency issue such as - // a sequencer check failure or transaction abort. - // - // See the guidelines above for deciding between `FAILED_PRECONDITION`, - // `ABORTED`, and `UNAVAILABLE`. - // - // HTTP Mapping: 409 Conflict - ABORTED = 10; - - // The operation was attempted past the valid range. E.g., seeking or - // reading past end-of-file. - // - // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may - // be fixed if the system state changes. For example, a 32-bit file - // system will generate `INVALID_ARGUMENT` if asked to read at an - // offset that is not in the range [0,2^32-1], but it will generate - // `OUT_OF_RANGE` if asked to read from an offset past the current - // file size. - // - // There is a fair bit of overlap between `FAILED_PRECONDITION` and - // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific - // error) when it applies so that callers who are iterating through - // a space can easily look for an `OUT_OF_RANGE` error to detect when - // they are done. - // - // HTTP Mapping: 400 Bad Request - OUT_OF_RANGE = 11; - - // The operation is not implemented or is not supported/enabled in this - // service. - // - // HTTP Mapping: 501 Not Implemented - UNIMPLEMENTED = 12; - - // Internal errors. This means that some invariants expected by the - // underlying system have been broken. This error code is reserved - // for serious errors. - // - // HTTP Mapping: 500 Internal Server Error - INTERNAL = 13; - - // The service is currently unavailable. This is most likely a - // transient condition, which can be corrected by retrying with - // a backoff. - // - // See the guidelines above for deciding between `FAILED_PRECONDITION`, - // `ABORTED`, and `UNAVAILABLE`. - // - // HTTP Mapping: 503 Service Unavailable - UNAVAILABLE = 14; - - // Unrecoverable data loss or corruption. - // - // HTTP Mapping: 500 Internal Server Error - DATA_LOSS = 15; -} diff --git a/proto/google/rpc/error_details.proto b/proto/google/rpc/error_details.proto deleted file mode 100644 index f24ae00..0000000 --- a/proto/google/rpc/error_details.proto +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -import "google/protobuf/duration.proto"; - -option go_package = "google.golang.org/genproto/googleapis/rpc/errdetails;errdetails"; -option java_multiple_files = true; -option java_outer_classname = "ErrorDetailsProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - - -// Describes when the clients can retry a failed request. Clients could ignore -// the recommendation here or retry when this information is missing from error -// responses. -// -// It's always recommended that clients should use exponential backoff when -// retrying. -// -// Clients should wait until `retry_delay` amount of time has passed since -// receiving the error response before retrying. If retrying requests also -// fail, clients should use an exponential backoff scheme to gradually increase -// the delay between retries based on `retry_delay`, until either a maximum -// number of retires have been reached or a maximum retry delay cap has been -// reached. -message RetryInfo { - // Clients should wait at least this long between retrying the same request. - google.protobuf.Duration retry_delay = 1; -} - -// Describes additional debugging info. -message DebugInfo { - // The stack trace entries indicating where the error occurred. - repeated string stack_entries = 1; - - // Additional debugging information provided by the server. - string detail = 2; -} - -// Describes how a quota check failed. -// -// For example if a daily limit was exceeded for the calling project, -// a service could respond with a QuotaFailure detail containing the project -// id and the description of the quota limit that was exceeded. If the -// calling project hasn't enabled the service in the developer console, then -// a service could respond with the project id and set `service_disabled` -// to true. -// -// Also see RetryDetail and Help types for other details about handling a -// quota failure. -message QuotaFailure { - // A message type used to describe a single quota violation. For example, a - // daily quota or a custom quota that was exceeded. - message Violation { - // The subject on which the quota check failed. - // For example, "clientip:" or "project:". - string subject = 1; - - // A description of how the quota check failed. Clients can use this - // description to find more about the quota configuration in the service's - // public documentation, or find the relevant quota limit to adjust through - // developer console. - // - // For example: "Service disabled" or "Daily Limit for read operations - // exceeded". - string description = 2; - } - - // Describes all quota violations. - repeated Violation violations = 1; -} - -// Describes what preconditions have failed. -// -// For example, if an RPC failed because it required the Terms of Service to be -// acknowledged, it could list the terms of service violation in the -// PreconditionFailure message. -message PreconditionFailure { - // A message type used to describe a single precondition failure. - message Violation { - // The type of PreconditionFailure. We recommend using a service-specific - // enum type to define the supported precondition violation types. For - // example, "TOS" for "Terms of Service violation". - string type = 1; - - // The subject, relative to the type, that failed. - // For example, "google.com/cloud" relative to the "TOS" type would - // indicate which terms of service is being referenced. - string subject = 2; - - // A description of how the precondition failed. Developers can use this - // description to understand how to fix the failure. - // - // For example: "Terms of service not accepted". - string description = 3; - } - - // Describes all precondition violations. - repeated Violation violations = 1; -} - -// Describes violations in a client request. This error type focuses on the -// syntactic aspects of the request. -message BadRequest { - // A message type used to describe a single bad request field. - message FieldViolation { - // A path leading to a field in the request body. The value will be a - // sequence of dot-separated identifiers that identify a protocol buffer - // field. E.g., "field_violations.field" would identify this field. - string field = 1; - - // A description of why the request element is bad. - string description = 2; - } - - // Describes all violations in a client request. - repeated FieldViolation field_violations = 1; -} - -// Contains metadata about the request that clients can attach when filing a bug -// or providing other forms of feedback. -message RequestInfo { - // An opaque string that should only be interpreted by the service generating - // it. For example, it can be used to identify requests in the service's logs. - string request_id = 1; - - // Any data that was used to serve this request. For example, an encrypted - // stack trace that can be sent back to the service provider for debugging. - string serving_data = 2; -} - -// Describes the resource that is being accessed. -message ResourceInfo { - // A name for the type of resource being accessed, e.g. "sql table", - // "cloud storage bucket", "file", "Google calendar"; or the type URL - // of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". - string resource_type = 1; - - // The name of the resource being accessed. For example, a shared calendar - // name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current - // error is [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. - string resource_name = 2; - - // The owner of the resource (optional). - // For example, "user:" or "project:". - string owner = 3; - - // Describes what error is encountered when accessing this resource. - // For example, updating a cloud project may require the `writer` permission - // on the developer console project. - string description = 4; -} - -// Provides links to documentation or for performing an out of band action. -// -// For example, if a quota check failed with an error indicating the calling -// project hasn't enabled the accessed service, this can contain a URL pointing -// directly to the right place in the developer console to flip the bit. -message Help { - // Describes a URL link. - message Link { - // Describes what the link offers. - string description = 1; - - // The URL of the link. - string url = 2; - } - - // URL(s) pointing to additional information on handling the current error. - repeated Link links = 1; -} - -// Provides a localized error message that is safe to return to the user -// which can be attached to an RPC error. -message LocalizedMessage { - // The locale used following the specification defined at - // http://www.rfc-editor.org/rfc/bcp/bcp47.txt. - // Examples are: "en-US", "fr-CH", "es-MX" - string locale = 1; - - // The localized error message in the above locale. - string message = 2; -} diff --git a/proto/google/rpc/status.proto b/proto/google/rpc/status.proto deleted file mode 100644 index 0839ee9..0000000 --- a/proto/google/rpc/status.proto +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -import "google/protobuf/any.proto"; - -option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; -option java_multiple_files = true; -option java_outer_classname = "StatusProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - - -// The `Status` type defines a logical error model that is suitable for different -// programming environments, including REST APIs and RPC APIs. It is used by -// [gRPC](https://github.com/grpc). The error model is designed to be: -// -// - Simple to use and understand for most users -// - Flexible enough to meet unexpected needs -// -// # Overview -// -// The `Status` message contains three pieces of data: error code, error message, -// and error details. The error code should be an enum value of -// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The -// error message should be a developer-facing English message that helps -// developers *understand* and *resolve* the error. If a localized user-facing -// error message is needed, put the localized message in the error details or -// localize it in the client. The optional error details may contain arbitrary -// information about the error. There is a predefined set of error detail types -// in the package `google.rpc` that can be used for common error conditions. -// -// # Language mapping -// -// The `Status` message is the logical representation of the error model, but it -// is not necessarily the actual wire format. When the `Status` message is -// exposed in different client libraries and different wire protocols, it can be -// mapped differently. For example, it will likely be mapped to some exceptions -// in Java, but more likely mapped to some error codes in C. -// -// # Other uses -// -// The error model and the `Status` message can be used in a variety of -// environments, either with or without APIs, to provide a -// consistent developer experience across different environments. -// -// Example uses of this error model include: -// -// - Partial errors. If a service needs to return partial errors to the client, -// it may embed the `Status` in the normal response to indicate the partial -// errors. -// -// - Workflow errors. A typical workflow has multiple steps. Each step may -// have a `Status` message for error reporting. -// -// - Batch operations. If a client uses batch request and batch response, the -// `Status` message should be used directly inside batch response, one for -// each error sub-response. -// -// - Asynchronous operations. If an API call embeds asynchronous operation -// results in its response, the status of those operations should be -// represented directly using the `Status` message. -// -// - Logging. If some API errors are stored in logs, the message `Status` could -// be used directly after any stripping needed for security/privacy reasons. -message Status { - // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. - int32 code = 1; - - // A developer-facing error message, which should be in English. Any - // user-facing error message should be localized and sent in the - // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. - string message = 2; - - // A list of messages that carry the error details. There is a common set of - // message types for APIs to use. - repeated google.protobuf.Any details = 3; -} From 46f81abbd7bd72c3d5062e4d9b2e3231d80c45a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 18:57:57 +0100 Subject: [PATCH 382/495] Move accounts into rove-server.internal --- Makefile | 2 +- {pkg/accounts => cmd/rove-server/internal}/accounts.go | 2 +- {pkg/accounts => cmd/rove-server/internal}/accounts_test.go | 2 +- cmd/rove-server/internal/server.go | 5 ++--- .../rove-server/internal}/simpleAccountant.go | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) rename {pkg/accounts => cmd/rove-server/internal}/accounts.go (98%) rename {pkg/accounts => cmd/rove-server/internal}/accounts_test.go (98%) rename {pkg/accounts => cmd/rove-server/internal}/simpleAccountant.go (99%) diff --git a/Makefile b/Makefile index b28ac4f..b36c19a 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ VERSION := $(shell git describe --always --long --dirty --tags) build: @echo Running no-output build go mod download - go build -ldflags="-X 'github.com/mdiluz/rove/pkg/version.Version=${VERSION}'" ./... + go build -ldflags="-X 'github.com/mdiluz/rove/cmd/version.Version=${VERSION}'" ./... install: @echo Installing to GOPATH diff --git a/pkg/accounts/accounts.go b/cmd/rove-server/internal/accounts.go similarity index 98% rename from pkg/accounts/accounts.go rename to cmd/rove-server/internal/accounts.go index 69508c0..99362ad 100644 --- a/pkg/accounts/accounts.go +++ b/cmd/rove-server/internal/accounts.go @@ -1,4 +1,4 @@ -package accounts +package internal // Accountant decribes something that stores accounts and account values type Accountant interface { diff --git a/pkg/accounts/accounts_test.go b/cmd/rove-server/internal/accounts_test.go similarity index 98% rename from pkg/accounts/accounts_test.go rename to cmd/rove-server/internal/accounts_test.go index bd2416f..9e7891f 100644 --- a/pkg/accounts/accounts_test.go +++ b/cmd/rove-server/internal/accounts_test.go @@ -1,4 +1,4 @@ -package accounts +package internal import ( "testing" diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index f633601..ad0c315 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -6,7 +6,6 @@ import ( "net" "sync" - "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/persistence" "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/roveapi" @@ -29,7 +28,7 @@ type Server struct { world *rove.World // Accountant - accountant accounts.Accountant + accountant Accountant // gRPC server netListener net.Listener @@ -81,7 +80,7 @@ func NewServer(opts ...ServerOption) *Server { persistence: EphemeralData, schedule: cron.New(), world: rove.NewWorld(32), - accountant: accounts.NewSimpleAccountant(), + accountant: NewSimpleAccountant(), } // Apply all options diff --git a/pkg/accounts/simpleAccountant.go b/cmd/rove-server/internal/simpleAccountant.go similarity index 99% rename from pkg/accounts/simpleAccountant.go rename to cmd/rove-server/internal/simpleAccountant.go index 023fe2f..3168f30 100644 --- a/pkg/accounts/simpleAccountant.go +++ b/cmd/rove-server/internal/simpleAccountant.go @@ -1,4 +1,4 @@ -package accounts +package internal import ( "fmt" From 737534f739a383b3b51fad3a90d148518019ffb5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 19:00:31 +0100 Subject: [PATCH 383/495] Move roveapi into the proto dir --- Makefile | 10 +++------- cmd/rove-server/internal/routes.go | 2 +- cmd/rove-server/internal/server.go | 2 +- cmd/rove/main.go | 2 +- pkg/rove/command.go | 2 +- pkg/rove/command_test.go | 2 +- pkg/rove/world.go | 2 +- pkg/rove/world_test.go | 2 +- {pkg => proto}/roveapi/roveapi.pb.go | 6 +++--- proto/roveapi/roveapi.proto | 2 +- 10 files changed, 14 insertions(+), 18 deletions(-) rename {pkg => proto}/roveapi/roveapi.pb.go (99%) diff --git a/Makefile b/Makefile index b36c19a..b73faf0 100644 --- a/Makefile +++ b/Makefile @@ -12,14 +12,10 @@ install: gen: @echo Installing go dependencies - go install \ - github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \ - github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger \ - github.com/golang/protobuf/protoc-gen-go + go install github.com/golang/protobuf/protoc-gen-go go mod download - @echo Generating rove server gRPC and gateway - protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:pkg/ proto/roveapi/roveapi.proto - protoc --proto_path proto --grpc-gateway_out=paths=source_relative:pkg/ proto/roveapi/roveapi.proto + @echo Generating rove server gRPC + protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:proto/ proto/roveapi/roveapi.proto test: @echo Unit tests diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 8e8706c..0fb41d8 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -6,8 +6,8 @@ import ( "log" "github.com/mdiluz/rove/pkg/rove" - "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" + "github.com/mdiluz/rove/proto/roveapi" ) // ServerStatus returns the status of the current server to a gRPC request diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index ad0c315..102c30d 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -8,7 +8,7 @@ import ( "github.com/mdiluz/rove/pkg/persistence" "github.com/mdiluz/rove/pkg/rove" - "github.com/mdiluz/rove/pkg/roveapi" + "github.com/mdiluz/rove/proto/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" ) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 1ec0b24..8a19e68 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -12,8 +12,8 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/roveapi" "github.com/mdiluz/rove/pkg/version" + "github.com/mdiluz/rove/proto/roveapi" "golang.org/x/net/context" "google.golang.org/grpc" ) diff --git a/pkg/rove/command.go b/pkg/rove/command.go index 6016555..86e9cad 100644 --- a/pkg/rove/command.go +++ b/pkg/rove/command.go @@ -1,6 +1,6 @@ package rove -import "github.com/mdiluz/rove/pkg/roveapi" +import "github.com/mdiluz/rove/proto/roveapi" // Command represends a single command to execute type Command struct { diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index e01a487..9150fde 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/roveapi" + "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" ) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index b0e796f..04cad81 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/roveapi" + "github.com/mdiluz/rove/proto/roveapi" ) // World describes a self contained universe and everything in it diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index ceaff43..f3be5c0 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -5,7 +5,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/pkg/roveapi" + "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" ) diff --git a/pkg/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go similarity index 99% rename from pkg/roveapi/roveapi.pb.go rename to proto/roveapi/roveapi.pb.go index 491231d..1eeeabd 100644 --- a/pkg/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -1113,10 +1113,10 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x24, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index f39d2a6..9dd2577 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -5,7 +5,7 @@ syntax = "proto3"; // Rove is an asychronous nomadic game about exploring a planet as part of a // loose community package roveapi; -option go_package = "github.com/mdiluz/rove/pkg/roveapi"; +option go_package = "github.com/mdiluz/rove/proto/roveapi"; // The Rove server hosts a single game session and world with multiple players service Rove { From 3bad9f012276309cfcf282e4e70e9c813af02a1f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 20:59:26 +0100 Subject: [PATCH 384/495] Update README.md Fix proto link and amend text --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 445ecac..2aff518 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,4 @@ Rove Rove is an asynchronous nomadic game about exploring as part of a loose community. -This repository is a [living document](https://github.com/mdiluz/rove/tree/master/docs) of current game design, as well as source code for the `rove-server` deployment and the `rove` command line client. - -See [roveapi.proto](https://github.com/mdiluz/rove/blob/master/proto/rove/roveapi.proto) for the current server-client API. +This repository contains the source code for the `rove-server` deployment and the `rove` command line client. See [mdiluz.github.io/rove](https://mdiluz.github.io/rove/) for game details, and [roveapi.proto](https://github.com/mdiluz/rove/blob/master/proto/roveapi/roveapi.proto) for the current server-client API. From 5c4d7469bb0bf337a8915181e490ab2f0e842bde Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 21:30:15 +0100 Subject: [PATCH 385/495] Update the github page markdown --- docs/README.md | 72 +++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/docs/README.md b/docs/README.md index 21a14d0..41efc48 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,67 +1,61 @@ Rove ===== -An asynchronous nomadic game about exploring a planet as part of a loose community. +Rove is asynchronous nomadic game about exploring a planet as part of a loose community. ------------------------------------------- -## The Basics +## Core gameplay -### Core +Remotely explore the surface of a planet with an upgradable and customisable rover. Send commands to be executed asynchronously, view the rover's radar, and communicate and coordinate with other nearby rovers. -Control a rover on the surface of the planet using a remote control interface. +### Key Components -Commands are sent and happen asynchronously, and the rover feeds back information about position and surroundings, as well as photos. - -### General - -Movement is slow and sometimes dangerous. - -Resources can be collected, and rovers recharge power during the day. - -Hazards damage the rover. Resources can be spent to repair. - -Spend resources to create and spawn a new improved rover a significant distance away, leaving the current one dormant. - -"Dying" leaves the current rover dormant and assigns the users a new rover. - -Players can repair dormant rovers to gain control of them, taking on their improvements and inventory. - -### Multiplayer - -Players can see each other and use very rudimentary signals. - -Dormant rovers store full history of travel and owners, as well as their improvements and resources. +* Navigate an expansive world +* Collect resources to repair and upgrade +* Keep the rover batteries charged as you explore +* Help other players on their journey +* Explore north to discover more ------------------------------------------- -### Implementation +## Installing -* A server that receives the commands, sends out data, and handles interactions between players. +On Ubuntu: +``` +$ snap install rove +``` -* An app, or apps, that interface with the server to let you control and view rover information +Elsewhere (with [go](https://golang.org/doc/install) installed) +``` +go get github.com/mdiluz/rove +cd $GOPATH/src/github.com/mdiluz/rove/ +make install +``` ------------------------------------------- -### To Solve +### Implementation Details + +`rove-server` hosts the game world and a gRPC server to allow users to interact from any client. + +`rove` is a basic example command-line client that allows for simple play, to explore it's usage, see the output of `rove help` + +------------------------------------------- + +### "Find the fun" issues to solve * What kinds of progression/upgrades exist? - * How does the game encourage cooperation? - * How would the gameplay prevent griefing? - * What drives the exploration? ------------------------------------------- ### Key ideas left to integrate -Feeling “known for” something - the person who did X thing. Limit number of X things that can be done, possibly over time. - -A significant aspect of failure - failing must be a focus of the game. Winning the game might actually be failing in some specific way. - -A clear and well defined investment vs. payoff curve. - -Not an infinite game, let the game have a point where you’re done and can move on. +* Feeling “known for” something - the person who did X thing. Limit number of X things that can be done, possibly over time. +* A significant aspect of failure - failing must be a focus of the game. Winning the game might actually be failing in some specific way. +* A clear and well defined investment vs. payoff curve. +* Not an infinite game, let the game have a point where you’re done and can move on. From 427db95b5b05dea0d5ea380dff7c93ad72694ce2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 21:32:02 +0100 Subject: [PATCH 386/495] Fix grammar --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 41efc48..2a0e6db 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ Rove ===== -Rove is asynchronous nomadic game about exploring a planet as part of a loose community. +Rove is an asynchronous nomadic game about exploring a planet as part of a loose community. ------------------------------------------- From 327c246c8e62c78f9475def05bfc2b39395ff9ac Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 21:37:19 +0100 Subject: [PATCH 387/495] Remove vscode viles --- .vscode/launch.json | 27 --------------------------- .vscode/settings.json | 5 ----- 2 files changed, 32 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 57d654f..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Launch Rove Server", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "${workspaceFolder}/cmd/rove-server/main.go", - "cwd": "${workspaceFolder}", - "env": { - "WORDS_FILE": "${workspaceFolder}/data/words_alpha.txt", - }, - "args": [], - }, - { - "name": "Launch Rove", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "${workspaceFolder}/cmd/rove/main.go", - "cwd": "${workspaceFolder}", - "env": {}, - "args": ["radar"], - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b3be4a5..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "gopls": { - "buildFlags": ["-tags=integration"] - }, -} \ No newline at end of file From 9593602dc5c7f898fc2c4c742990901b192954d0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 10 Jul 2020 21:38:16 +0100 Subject: [PATCH 388/495] Move flatpak file to data --- {flatpak => data}/io.github.mdiluz.Rove.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {flatpak => data}/io.github.mdiluz.Rove.json (100%) diff --git a/flatpak/io.github.mdiluz.Rove.json b/data/io.github.mdiluz.Rove.json similarity index 100% rename from flatpak/io.github.mdiluz.Rove.json rename to data/io.github.mdiluz.Rove.json From 105d69bd7c19d9ca1eace739b9b81ca7b5499891 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 11 Jul 2020 17:25:38 +0100 Subject: [PATCH 389/495] Fix SW direction to go south rather than north --- pkg/maths/bearing.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index 220855b..002b06a 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -66,14 +66,14 @@ func FromString(s string) (Bearing, error) { } var bearingVectors = []Vector{ - {X: 0, Y: 1}, // N - {X: 1, Y: 1}, // NE - {X: 1, Y: 0}, // E - {X: 1, Y: -1}, // SE - {X: 0, Y: -1}, // S - {X: -1, Y: 1}, // SW - {X: -1, Y: 0}, // W - {X: -1, Y: 1}, // NW + {X: 0, Y: 1}, // N + {X: 1, Y: 1}, // NE + {X: 1, Y: 0}, // E + {X: 1, Y: -1}, // SE + {X: 0, Y: -1}, // S + {X: -1, Y: -1}, // SW + {X: -1, Y: 0}, // W + {X: -1, Y: 1}, // NW } // Vector converts a Direction to a Vector From c2e3c9f0900df5b64088c822fe9541e016d5e0ea Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:26:08 +0100 Subject: [PATCH 390/495] Reject move commands in non-cardinal directions --- cmd/rove/main.go | 2 +- pkg/maths/bearing.go | 16 ++++++++++++++-- pkg/maths/bearing_test.go | 8 ++++---- pkg/rove/world.go | 6 ++++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8a19e68..75d4e3a 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -215,7 +215,7 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := maths.FromString(args[i]); err != nil { + } else if _, err := maths.BearingFromString(args[i]); err != nil { return err } commands = append(commands, diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index 002b06a..de4014d 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -55,8 +55,8 @@ func (d Bearing) ShortString() string { return bearingStrings[d].Short } -// FromString gets the Direction from a string -func FromString(s string) (Bearing, error) { +// BearingFromString gets the Direction from a string +func BearingFromString(s string) (Bearing, error) { for i, d := range bearingStrings { if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { return Bearing(i), nil @@ -80,3 +80,15 @@ var bearingVectors = []Vector{ func (d Bearing) Vector() Vector { return bearingVectors[d] } + +// IsCardinal returns if this is a cardinal (NESW) +func (d Bearing) IsCardinal() bool { + switch d { + case North: + case East: + case South: + case West: + return true + } + return false +} diff --git a/pkg/maths/bearing_test.go b/pkg/maths/bearing_test.go index bb97043..e0de345 100644 --- a/pkg/maths/bearing_test.go +++ b/pkg/maths/bearing_test.go @@ -13,19 +13,19 @@ func TestDirection(t *testing.T) { assert.Equal(t, "N", dir.ShortString()) assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) - dir, err := FromString("N") + dir, err := BearingFromString("N") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("n") + dir, err = BearingFromString("n") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("north") + dir, err = BearingFromString("north") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("NorthWest") + dir, err = BearingFromString("NorthWest") assert.NoError(t, err) assert.Equal(t, NorthWest, dir) } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 04cad81..157c636 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -426,8 +426,10 @@ func (w *World) Enqueue(rover string, commands ...Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_move: - if _, err := maths.FromString(c.Bearing); err != nil { + if b, err := maths.BearingFromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) + } else if !b.IsCardinal() { + return fmt.Errorf("bearing must be cardinal") } case roveapi.CommandType_broadcast: if len(c.Message) > 3 { @@ -505,7 +507,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { switch c.Command { case roveapi.CommandType_move: - if dir, err := maths.FromString(c.Bearing); err != nil { + if dir, err := maths.BearingFromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err From 5814ac95b87ed625baa1d7bf93735b04a2057be3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:29:28 +0100 Subject: [PATCH 391/495] Make sure we fallthrough for the NES cases --- pkg/maths/bearing.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index de4014d..e72148b 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -85,8 +85,11 @@ func (d Bearing) Vector() Vector { func (d Bearing) IsCardinal() bool { switch d { case North: + fallthrough case East: + fallthrough case South: + fallthrough case West: return true } From a0b811a659c81dca13b11ce5cc6122da52b9491c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:46:37 +0100 Subject: [PATCH 392/495] Move glyph definitions into a central type --- pkg/atlas/atlas.go | 8 ++++---- pkg/atlas/glyph.go | 27 +++++++++++++++++++++++++++ pkg/atlas/objects.go | 6 +++--- 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 pkg/atlas/glyph.go diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 1a2f3fb..73ea341 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -9,16 +9,16 @@ type Tile byte const ( // TileNone is a keyword for nothing - TileNone = Tile(0) + TileNone = Tile(GlyphNone) // TileRock is solid rock ground - TileRock = Tile('-') + TileRock = Tile(GlyphRock) // TileGravel is loose rocks - TileGravel = Tile(':') + TileGravel = Tile(GlyphGravel) // TileSand is sand - TileSand = Tile('~') + TileSand = Tile(GlyphSand) ) // Atlas represents a 2D world atlas of tiles and objects diff --git a/pkg/atlas/glyph.go b/pkg/atlas/glyph.go new file mode 100644 index 0000000..c39f1be --- /dev/null +++ b/pkg/atlas/glyph.go @@ -0,0 +1,27 @@ +package atlas + +// Glyph represents the text representation of something in the game +type Glyph byte + +const ( + // GlyphNone is a keyword for nothing + GlyphNone = Glyph(0) + + // GlyphRock is solid rock ground + GlyphRock = Glyph('-') + + // GlyphGravel is loose rocks + GlyphGravel = Glyph(':') + + // GlyphSand is sand + GlyphSand = Glyph('~') + + // GlyphRover represents a live rover + GlyphRover = Glyph('R') + + // GlyphSmallRock is a small stashable rock + GlyphSmallRock = Glyph('o') + + // GlyphLargeRock is a large blocking rock + GlyphLargeRock = Glyph('O') +) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 68b4ef8..c397ec1 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -6,13 +6,13 @@ type Type byte // Types of objects const ( // ObjectNone represents no object at all - ObjectNone = Type(0) + ObjectNone = Type(GlyphNone) // ObjectRover represents a live rover - ObjectRover = Type('R') + ObjectRover = Type(GlyphRover) // ObjectSmallRock is a small stashable rock - ObjectSmallRock = Type('o') + ObjectSmallRock = Type(GlyphSmallRock) // ObjectLargeRock is a large blocking rock ObjectLargeRock = Type('O') From 53d6ad08d965ca434de5f67b79e961942354de8f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:47:19 +0100 Subject: [PATCH 393/495] Rename Type to ObjectType --- pkg/atlas/objects.go | 19 ++++++++++--------- pkg/rove/world.go | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index c397ec1..cb71229 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -1,31 +1,32 @@ package atlas -// Type represents an object type -type Type byte +// ObjectType represents an object type +type ObjectType byte // Types of objects const ( // ObjectNone represents no object at all - ObjectNone = Type(GlyphNone) + ObjectNone = ObjectType(GlyphNone) // ObjectRover represents a live rover - ObjectRover = Type(GlyphRover) + ObjectRover = ObjectType(GlyphRover) // ObjectSmallRock is a small stashable rock - ObjectSmallRock = Type(GlyphSmallRock) + ObjectSmallRock = ObjectType(GlyphSmallRock) // ObjectLargeRock is a large blocking rock - ObjectLargeRock = Type('O') + ObjectLargeRock = ObjectType(GlyphLargeRock) ) // Object represents an object in the world type Object struct { - Type Type `json:"type"` + // The type of the object + Type ObjectType `json:"type"` } // IsBlocking checks if an object is a blocking object func (o *Object) IsBlocking() bool { - var blocking = [...]Type{ + var blocking = [...]ObjectType{ ObjectRover, ObjectLargeRock, } @@ -40,7 +41,7 @@ func (o *Object) IsBlocking() bool { // IsStashable checks if an object is stashable func (o *Object) IsStashable() bool { - var stashable = [...]Type{ + var stashable = [...]ObjectType{ ObjectSmallRock, } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 04cad81..177dbba 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -318,7 +318,7 @@ func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { } // RoverStash will stash an item at the current rovers position -func (w *World) RoverStash(rover string) (atlas.Type, error) { +func (w *World) RoverStash(rover string) (atlas.ObjectType, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() From acdd01909315c4a6f6dbae7064540f3a21b36008 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:50:19 +0100 Subject: [PATCH 394/495] Add Glyph methods to convert to a glyph --- pkg/atlas/atlas.go | 19 +++++++++++++++++++ pkg/atlas/objects.go | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 73ea341..aaa7fd8 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,6 +1,8 @@ package atlas import ( + "log" + "github.com/mdiluz/rove/pkg/maths" ) @@ -21,6 +23,23 @@ const ( TileSand = Tile(GlyphSand) ) +// Glyph returns the glyph for this tile type +func (t Tile) Glyph() Glyph { + switch t { + case TileNone: + return GlyphNone + case TileRock: + return GlyphRock + case TileGravel: + return GlyphGravel + case TileSand: + return GlyphSand + } + + log.Fatalf("Unknown tile type: %c", t) + return GlyphNone +} + // Atlas represents a 2D world atlas of tiles and objects type Atlas interface { // SetTile sets a location on the Atlas to a type of tile diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index cb71229..1b9eb87 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -1,5 +1,7 @@ package atlas +import "log" + // ObjectType represents an object type type ObjectType byte @@ -18,6 +20,23 @@ const ( ObjectLargeRock = ObjectType(GlyphLargeRock) ) +// Glyph returns the glyph for this object type +func (o ObjectType) Glyph() Glyph { + switch o { + case ObjectNone: + return GlyphNone + case ObjectRover: + return GlyphRover + case ObjectSmallRock: + return GlyphSmallRock + case ObjectLargeRock: + return GlyphLargeRock + } + + log.Fatalf("Unknown object type: %c", o) + return GlyphNone +} + // Object represents an object in the world type Object struct { // The type of the object From f6654360077cf4926a00915af7c3b59ae65a0e6f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:54:11 +0100 Subject: [PATCH 395/495] Convert objects and tiles to base ints --- pkg/atlas/atlas.go | 8 ++++---- pkg/atlas/chunkAtlas.go | 2 +- pkg/atlas/objects.go | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index aaa7fd8..e681ff2 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -11,16 +11,16 @@ type Tile byte const ( // TileNone is a keyword for nothing - TileNone = Tile(GlyphNone) + TileNone = iota // TileRock is solid rock ground - TileRock = Tile(GlyphRock) + TileRock // TileGravel is loose rocks - TileGravel = Tile(GlyphGravel) + TileGravel // TileSand is sand - TileSand = Tile(GlyphSand) + TileSand ) // Glyph returns the glyph for this tile type diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index daee6e6..1d21741 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -128,7 +128,7 @@ func (a *chunkBasedAtlas) populate(chunk int) { obj = ObjectSmallRock } if obj != ObjectNone { - c.Objects[j*a.ChunkSize+i] = Object{Type: obj} + c.Objects[j*a.ChunkSize+i] = Object{Type: ObjectType(obj)} } } } diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 1b9eb87..ac847fe 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -8,16 +8,16 @@ type ObjectType byte // Types of objects const ( // ObjectNone represents no object at all - ObjectNone = ObjectType(GlyphNone) + ObjectNone = iota // ObjectRover represents a live rover - ObjectRover = ObjectType(GlyphRover) + ObjectRover // ObjectSmallRock is a small stashable rock - ObjectSmallRock = ObjectType(GlyphSmallRock) + ObjectSmallRock // ObjectLargeRock is a large blocking rock - ObjectLargeRock = ObjectType(GlyphLargeRock) + ObjectLargeRock ) // Glyph returns the glyph for this object type From 7e41ac00286e5acafa2da750f05681d863fb3273 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:56:05 +0100 Subject: [PATCH 396/495] Rename the glyphs --- pkg/atlas/atlas.go | 6 +++--- pkg/atlas/atlas_test.go | 12 ++++++------ pkg/atlas/chunkAtlas.go | 8 ++++---- pkg/atlas/glyph.go | 24 ++++++++++++------------ pkg/atlas/objects.go | 24 ++++++++++++------------ pkg/rove/world.go | 2 +- pkg/rove/world_test.go | 28 ++++++++++++++-------------- 7 files changed, 52 insertions(+), 52 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index e681ff2..305c355 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -29,11 +29,11 @@ func (t Tile) Glyph() Glyph { case TileNone: return GlyphNone case TileRock: - return GlyphRock + return GlyphGroundRock case TileGravel: - return GlyphGravel + return GlyphGroundGravel case TileSand: - return GlyphSand + return GlyphGroundSand } log.Fatalf("Unknown tile type: %c", t) diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 9305b07..5141371 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -185,14 +185,14 @@ func TestAtlas_GetSetObject(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - a.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: ObjectLargeRock}) + a.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: ObjectRockLarge}) _, obj := a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, Object{Type: ObjectLargeRock}, obj) + assert.Equal(t, Object{Type: ObjectRockLarge}, obj) // Set another tile to 1 and test it - a.SetObject(maths.Vector{X: 5, Y: -2}, Object{Type: ObjectSmallRock}) + a.SetObject(maths.Vector{X: 5, Y: -2}, Object{Type: ObjectRockSmall}) _, obj = a.QueryPosition(maths.Vector{X: 5, Y: -2}) - assert.Equal(t, Object{Type: ObjectSmallRock}, obj) + assert.Equal(t, Object{Type: ObjectRockSmall}, obj) } func TestAtlas_Grown(t *testing.T) { @@ -238,11 +238,11 @@ func TestAtlas_GetSetCorrect(t *testing.T) { pos := maths.Vector{X: x, Y: y} a.SetTile(pos, TileRock) - a.SetObject(pos, Object{Type: ObjectLargeRock}) + a.SetObject(pos, Object{Type: ObjectRockLarge}) tile, obj := a.QueryPosition(pos) assert.Equal(t, TileRock, Tile(tile)) - assert.Equal(t, Object{Type: ObjectLargeRock}, obj) + assert.Equal(t, Object{Type: ObjectRockLarge}, obj) } } diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 1d21741..99d4668 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -123,9 +123,9 @@ func (a *chunkBasedAtlas) populate(chunk int) { var obj = ObjectNone switch { case o > 0.6: - obj = ObjectLargeRock + obj = ObjectRockLarge case o > 0.5: - obj = ObjectSmallRock + obj = ObjectRockSmall } if obj != ObjectNone { c.Objects[j*a.ChunkSize+i] = Object{Type: ObjectType(obj)} @@ -136,9 +136,9 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Set up any objects for i := 0; i < len(c.Tiles); i++ { if rand.Intn(16) == 0 { - c.Objects[i] = Object{Type: ObjectLargeRock} + c.Objects[i] = Object{Type: ObjectRockLarge} } else if rand.Intn(32) == 0 { - c.Objects[i] = Object{Type: ObjectSmallRock} + c.Objects[i] = Object{Type: ObjectRockSmall} } } diff --git a/pkg/atlas/glyph.go b/pkg/atlas/glyph.go index c39f1be..c5c0ad7 100644 --- a/pkg/atlas/glyph.go +++ b/pkg/atlas/glyph.go @@ -7,21 +7,21 @@ const ( // GlyphNone is a keyword for nothing GlyphNone = Glyph(0) - // GlyphRock is solid rock ground - GlyphRock = Glyph('-') + // GlyphGroundRock is solid rock ground + GlyphGroundRock = Glyph('-') - // GlyphGravel is loose rocks - GlyphGravel = Glyph(':') + // GlyphGroundGravel is loose rocks + GlyphGroundGravel = Glyph(':') - // GlyphSand is sand - GlyphSand = Glyph('~') + // GlyphGroundSand is sand + GlyphGroundSand = Glyph('~') - // GlyphRover represents a live rover - GlyphRover = Glyph('R') + // GlyphRoverLive represents a live rover + GlyphRoverLive = Glyph('R') - // GlyphSmallRock is a small stashable rock - GlyphSmallRock = Glyph('o') + // GlyphRockSmall is a small stashable rock + GlyphRockSmall = Glyph('o') - // GlyphLargeRock is a large blocking rock - GlyphLargeRock = Glyph('O') + // GlyphRockLarge is a large blocking rock + GlyphRockLarge = Glyph('O') ) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index ac847fe..032ca10 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -11,13 +11,13 @@ const ( ObjectNone = iota // ObjectRover represents a live rover - ObjectRover + ObjectRoverLive // ObjectSmallRock is a small stashable rock - ObjectSmallRock + ObjectRockSmall // ObjectLargeRock is a large blocking rock - ObjectLargeRock + ObjectRockLarge ) // Glyph returns the glyph for this object type @@ -25,12 +25,12 @@ func (o ObjectType) Glyph() Glyph { switch o { case ObjectNone: return GlyphNone - case ObjectRover: - return GlyphRover - case ObjectSmallRock: - return GlyphSmallRock - case ObjectLargeRock: - return GlyphLargeRock + case ObjectRoverLive: + return GlyphRoverLive + case ObjectRockSmall: + return GlyphRockSmall + case ObjectRockLarge: + return GlyphRockLarge } log.Fatalf("Unknown object type: %c", o) @@ -46,8 +46,8 @@ type Object struct { // IsBlocking checks if an object is a blocking object func (o *Object) IsBlocking() bool { var blocking = [...]ObjectType{ - ObjectRover, - ObjectLargeRock, + ObjectRoverLive, + ObjectRockLarge, } for _, t := range blocking { @@ -61,7 +61,7 @@ func (o *Object) IsBlocking() bool { // IsStashable checks if an object is stashable func (o *Object) IsStashable() bool { var stashable = [...]ObjectType{ - ObjectSmallRock, + ObjectRockSmall, } for _, t := range stashable { diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 177dbba..7375df1 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -401,7 +401,7 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err if dist.X <= r.Range && dist.Y <= r.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - objs[index] = byte(atlas.ObjectRover) + objs[index] = byte(atlas.ObjectRoverLive) } } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index f3be5c0..5a3e34f 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -90,7 +90,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover - world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: atlas.ObjectLargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: atlas.ObjectRockLarge}) newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") @@ -120,8 +120,8 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") // Test the expected values - assert.Equal(t, byte(atlas.ObjectRover), objs[1+fullRange]) - assert.Equal(t, byte(atlas.ObjectRover), objs[4+4*fullRange]) + assert.Equal(t, byte(atlas.ObjectRoverLive), objs[1+fullRange]) + assert.Equal(t, byte(atlas.ObjectRoverLive), objs[4+4*fullRange]) // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) @@ -154,12 +154,12 @@ func TestWorld_RoverStash(t *testing.T) { for i := 0; i < rover.Capacity; i++ { // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) // Pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") // Check it's gone _, obj := world.Atlas.QueryPosition(pos) @@ -169,7 +169,7 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) - assert.Equal(t, atlas.Object{Type: atlas.ObjectSmallRock}, inv[i]) + assert.Equal(t, atlas.Object{Type: atlas.ObjectRockSmall}, inv[i]) // Check that this did reduce the charge info, err := world.GetRover(a) @@ -186,7 +186,7 @@ func TestWorld_RoverStash(t *testing.T) { } // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) // Try to pick it up o, err := world.RoverStash(a) @@ -195,7 +195,7 @@ func TestWorld_RoverStash(t *testing.T) { // Check it's still there _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, atlas.ObjectSmallRock, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, atlas.ObjectRockSmall, obj.Type, "Stash failed to remove object from atlas") // Check we don't have it inv, err := world.RoverInventory(a) @@ -224,7 +224,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectLargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectRockLarge}) vec, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to move rover") @@ -256,12 +256,12 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectLargeRock}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectRockLarge}) // Try and bump into the rock vec, err := world.MoveRover(a, maths.North) @@ -281,10 +281,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectSmallRock}) + world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectSmallRock, o, "Failed to get correct object") + assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") From 24d4fe92734992b906aa5b19bb0a075ed06dd83b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:59:14 +0100 Subject: [PATCH 397/495] Convert tiles and object types to typed consts --- pkg/atlas/atlas.go | 8 ++++---- pkg/atlas/objects.go | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 305c355..700be09 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -11,16 +11,16 @@ type Tile byte const ( // TileNone is a keyword for nothing - TileNone = iota + TileNone = Tile(0) // TileRock is solid rock ground - TileRock + TileRock = Tile(1) // TileGravel is loose rocks - TileGravel + TileGravel = Tile(2) // TileSand is sand - TileSand + TileSand = Tile(3) ) // Glyph returns the glyph for this tile type diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 032ca10..52d88df 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -8,16 +8,16 @@ type ObjectType byte // Types of objects const ( // ObjectNone represents no object at all - ObjectNone = iota + ObjectNone = ObjectType(0) // ObjectRover represents a live rover - ObjectRoverLive + ObjectRoverLive = ObjectType(1) // ObjectSmallRock is a small stashable rock - ObjectRockSmall + ObjectRockSmall = ObjectType(2) // ObjectLargeRock is a large blocking rock - ObjectRockLarge + ObjectRockLarge = ObjectType(3) ) // Glyph returns the glyph for this object type From 305f64ec38ecaa06c121f0fa33a3e43f890f8bdb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:26:57 +0100 Subject: [PATCH 398/495] Large refactor, move object and tile types out into the proto --- cmd/rove/main.go | 8 +- pkg/atlas/atlas.go | 34 ++--- pkg/atlas/atlas_test.go | 55 ++++---- pkg/atlas/chunkAtlas.go | 31 ++-- pkg/atlas/objects.go | 44 ++---- pkg/rove/world.go | 22 +-- pkg/rove/world_test.go | 48 +++---- proto/roveapi/roveapi.pb.go | 273 ++++++++++++++++++++++++++---------- proto/roveapi/roveapi.proto | 33 ++++- 9 files changed, 338 insertions(+), 210 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8a19e68..8e4f740 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -287,10 +287,10 @@ func InnerMain(command string, args ...string) error { for i := 0; i < num; i++ { t := response.Tiles[i+num*j] o := response.Objects[i+num*j] - if o != byte(atlas.ObjectNone) { - fmt.Printf("%c", o) - } else if t != byte(atlas.TileNone) { - fmt.Printf("%c", t) + if o != roveapi.Object_ObjectNone { + fmt.Printf("%c", atlas.ObjectGlyph(o)) + } else if t != roveapi.Tile_TileNone { + fmt.Printf("%c", atlas.TileGlyph(t)) } else { fmt.Printf(" ") } diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 700be09..de83642 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -4,35 +4,19 @@ import ( "log" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/proto/roveapi" ) -// Tile describes the type of terrain -type Tile byte - -const ( - // TileNone is a keyword for nothing - TileNone = Tile(0) - - // TileRock is solid rock ground - TileRock = Tile(1) - - // TileGravel is loose rocks - TileGravel = Tile(2) - - // TileSand is sand - TileSand = Tile(3) -) - -// Glyph returns the glyph for this tile type -func (t Tile) Glyph() Glyph { +// TileGlyph returns the glyph for this tile type +func TileGlyph(t roveapi.Tile) Glyph { switch t { - case TileNone: + case roveapi.Tile_TileNone: return GlyphNone - case TileRock: + case roveapi.Tile_Rock: return GlyphGroundRock - case TileGravel: + case roveapi.Tile_Gravel: return GlyphGroundGravel - case TileSand: + case roveapi.Tile_Sand: return GlyphGroundSand } @@ -43,11 +27,11 @@ func (t Tile) Glyph() Glyph { // Atlas represents a 2D world atlas of tiles and objects type Atlas interface { // SetTile sets a location on the Atlas to a type of tile - SetTile(v maths.Vector, tile Tile) + SetTile(v maths.Vector, tile roveapi.Tile) // SetObject will set a location on the Atlas to contain an object SetObject(v maths.Vector, obj Object) // QueryPosition queries a position on the atlas - QueryPosition(v maths.Vector) (byte, Object) + QueryPosition(v maths.Vector) (roveapi.Tile, Object) } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 5141371..de8b7b9 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" ) @@ -169,15 +170,15 @@ func TestAtlas_GetSetTile(t *testing.T) { a := NewChunkAtlas(10) assert.NotNil(t, a) - // Set the origin tile to 1 and test it - a.SetTile(maths.Vector{X: 0, Y: 0}, 1) + // Set the origin tile and test it + a.SetTile(maths.Vector{X: 0, Y: 0}, roveapi.Tile_Gravel) tile, _ := a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, byte(1), tile) + assert.Equal(t, roveapi.Tile_Gravel, tile) - // Set another tile to 1 and test it - a.SetTile(maths.Vector{X: 5, Y: -2}, 2) + // Set another tile and test it + a.SetTile(maths.Vector{X: 5, Y: -2}, roveapi.Tile_Rock) tile, _ = a.QueryPosition(maths.Vector{X: 5, Y: -2}) - assert.Equal(t, byte(2), tile) + assert.Equal(t, roveapi.Tile_Rock, tile) } func TestAtlas_GetSetObject(t *testing.T) { @@ -185,14 +186,14 @@ func TestAtlas_GetSetObject(t *testing.T) { assert.NotNil(t, a) // Set the origin tile to 1 and test it - a.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: ObjectRockLarge}) + a.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_RockLarge}) _, obj := a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, Object{Type: ObjectRockLarge}, obj) + assert.Equal(t, Object{Type: roveapi.Object_RockLarge}, obj) // Set another tile to 1 and test it - a.SetObject(maths.Vector{X: 5, Y: -2}, Object{Type: ObjectRockSmall}) + a.SetObject(maths.Vector{X: 5, Y: -2}, Object{Type: roveapi.Object_RockSmall}) _, obj = a.QueryPosition(maths.Vector{X: 5, Y: -2}) - assert.Equal(t, Object{Type: ObjectRockSmall}, obj) + assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, obj) } func TestAtlas_Grown(t *testing.T) { @@ -202,28 +203,28 @@ func TestAtlas_Grown(t *testing.T) { assert.Equal(t, 1, len(a.Chunks)) // Set a few tiles to values - a.SetTile(maths.Vector{X: 0, Y: 0}, 1) - a.SetTile(maths.Vector{X: -1, Y: -1}, 2) - a.SetTile(maths.Vector{X: 1, Y: -2}, 3) + a.SetTile(maths.Vector{X: 0, Y: 0}, roveapi.Tile_Gravel) + a.SetTile(maths.Vector{X: -1, Y: -1}, roveapi.Tile_Rock) + a.SetTile(maths.Vector{X: 1, Y: -2}, roveapi.Tile_Sand) // Check tile values tile, _ := a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, byte(1), tile) + assert.Equal(t, roveapi.Tile_Gravel, tile) tile, _ = a.QueryPosition(maths.Vector{X: -1, Y: -1}) - assert.Equal(t, byte(2), tile) + assert.Equal(t, roveapi.Tile_Rock, tile) tile, _ = a.QueryPosition(maths.Vector{X: 1, Y: -2}) - assert.Equal(t, byte(3), tile) + assert.Equal(t, roveapi.Tile_Sand, tile) tile, _ = a.QueryPosition(maths.Vector{X: 0, Y: 0}) - assert.Equal(t, byte(1), tile) + assert.Equal(t, roveapi.Tile_Gravel, tile) tile, _ = a.QueryPosition(maths.Vector{X: -1, Y: -1}) - assert.Equal(t, byte(2), tile) + assert.Equal(t, roveapi.Tile_Rock, tile) tile, _ = a.QueryPosition(maths.Vector{X: 1, Y: -2}) - assert.Equal(t, byte(3), tile) + assert.Equal(t, roveapi.Tile_Sand, tile) } func TestAtlas_GetSetCorrect(t *testing.T) { @@ -237,12 +238,12 @@ func TestAtlas_GetSetCorrect(t *testing.T) { assert.Equal(t, 1, len(a.Chunks)) pos := maths.Vector{X: x, Y: y} - a.SetTile(pos, TileRock) - a.SetObject(pos, Object{Type: ObjectRockLarge}) + a.SetTile(pos, roveapi.Tile_Rock) + a.SetObject(pos, Object{Type: roveapi.Object_RockLarge}) tile, obj := a.QueryPosition(pos) - assert.Equal(t, TileRock, Tile(tile)) - assert.Equal(t, Object{Type: ObjectRockLarge}, obj) + assert.Equal(t, roveapi.Tile_Rock, roveapi.Tile(tile)) + assert.Equal(t, Object{Type: roveapi.Object_RockLarge}, obj) } } @@ -259,10 +260,10 @@ func TestAtlas_WorldGen(t *testing.T) { for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { t, o := a.QueryPosition(maths.Vector{X: i, Y: j}) - if o.Type != ObjectNone { - fmt.Printf("%c", o.Type) - } else if t != byte(TileNone) { - fmt.Printf("%c", t) + if o.Type != roveapi.Object_ObjectNone { + fmt.Printf("%c", ObjectGlyph(o.Type)) + } else if t != roveapi.Tile_TileNone { + fmt.Printf("%c", TileGlyph(t)) } else { fmt.Printf(" ") } diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 99d4668..43ca3af 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -5,6 +5,7 @@ import ( "math/rand" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/proto/roveapi" "github.com/ojrac/opensimplex-go" ) @@ -63,7 +64,7 @@ func NewChunkAtlas(chunkSize int) Atlas { } // SetTile sets an individual tile's kind -func (a *chunkBasedAtlas) SetTile(v maths.Vector, tile Tile) { +func (a *chunkBasedAtlas) SetTile(v maths.Vector, tile roveapi.Tile) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.setTile(c, local, byte(tile)) @@ -77,13 +78,13 @@ func (a *chunkBasedAtlas) SetObject(v maths.Vector, obj Object) { } // QueryPosition will return information for a specific position -func (a *chunkBasedAtlas) QueryPosition(v maths.Vector) (byte, Object) { +func (a *chunkBasedAtlas) QueryPosition(v maths.Vector) (roveapi.Tile, Object) { c := a.worldSpaceToChunkWithGrow(v) local := a.worldSpaceToChunkLocal(v) a.populate(c) chunk := a.Chunks[c] i := a.chunkTileIndex(local) - return chunk.Tiles[i], chunk.Objects[i] + return roveapi.Tile(chunk.Tiles[i]), chunk.Objects[i] } // chunkTileID returns the tile index within a chunk @@ -107,28 +108,28 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Get the terrain noise value for this location t := a.terrainNoise.Eval2(float64(origin.X+i)/terrainNoiseScale, float64(origin.Y+j)/terrainNoiseScale) - var tile Tile + var tile roveapi.Tile switch { case t > 0.5: - tile = TileGravel + tile = roveapi.Tile_Gravel case t > 0.05: - tile = TileSand + tile = roveapi.Tile_Sand default: - tile = TileRock + tile = roveapi.Tile_Rock } c.Tiles[j*a.ChunkSize+i] = byte(tile) // Get the object noise value for this location o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) - var obj = ObjectNone + var obj = roveapi.Object_ObjectNone switch { case o > 0.6: - obj = ObjectRockLarge + obj = roveapi.Object_RockLarge case o > 0.5: - obj = ObjectRockSmall + obj = roveapi.Object_RockSmall } - if obj != ObjectNone { - c.Objects[j*a.ChunkSize+i] = Object{Type: ObjectType(obj)} + if obj != roveapi.Object_ObjectNone { + c.Objects[j*a.ChunkSize+i] = Object{Type: roveapi.Object(obj)} } } } @@ -136,9 +137,9 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Set up any objects for i := 0; i < len(c.Tiles); i++ { if rand.Intn(16) == 0 { - c.Objects[i] = Object{Type: ObjectRockLarge} + c.Objects[i] = Object{Type: roveapi.Object_RockLarge} } else if rand.Intn(32) == 0 { - c.Objects[i] = Object{Type: ObjectRockSmall} + c.Objects[i] = Object{Type: roveapi.Object_RockSmall} } } @@ -159,7 +160,7 @@ func (a *chunkBasedAtlas) setObject(chunk int, local maths.Vector, object Object c := a.Chunks[chunk] i := a.chunkTileIndex(local) - if object.Type != ObjectNone { + if object.Type != roveapi.Object_ObjectNone { c.Objects[i] = object } else { delete(c.Objects, i) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 52d88df..ccbb69b 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -1,35 +1,21 @@ package atlas -import "log" +import ( + "log" -// ObjectType represents an object type -type ObjectType byte - -// Types of objects -const ( - // ObjectNone represents no object at all - ObjectNone = ObjectType(0) - - // ObjectRover represents a live rover - ObjectRoverLive = ObjectType(1) - - // ObjectSmallRock is a small stashable rock - ObjectRockSmall = ObjectType(2) - - // ObjectLargeRock is a large blocking rock - ObjectRockLarge = ObjectType(3) + "github.com/mdiluz/rove/proto/roveapi" ) -// Glyph returns the glyph for this object type -func (o ObjectType) Glyph() Glyph { +// ObjectGlyph returns the glyph for this object type +func ObjectGlyph(o roveapi.Object) Glyph { switch o { - case ObjectNone: + case roveapi.Object_ObjectNone: return GlyphNone - case ObjectRoverLive: + case roveapi.Object_RoverLive: return GlyphRoverLive - case ObjectRockSmall: + case roveapi.Object_RockSmall: return GlyphRockSmall - case ObjectRockLarge: + case roveapi.Object_RockLarge: return GlyphRockLarge } @@ -40,14 +26,14 @@ func (o ObjectType) Glyph() Glyph { // Object represents an object in the world type Object struct { // The type of the object - Type ObjectType `json:"type"` + Type roveapi.Object `json:"type"` } // IsBlocking checks if an object is a blocking object func (o *Object) IsBlocking() bool { - var blocking = [...]ObjectType{ - ObjectRoverLive, - ObjectRockLarge, + var blocking = [...]roveapi.Object{ + roveapi.Object_RoverLive, + roveapi.Object_RockLarge, } for _, t := range blocking { @@ -60,8 +46,8 @@ func (o *Object) IsBlocking() bool { // IsStashable checks if an object is stashable func (o *Object) IsStashable() bool { - var stashable = [...]ObjectType{ - ObjectRockSmall, + var stashable = [...]roveapi.Object{ + roveapi.Object_RockSmall, } for _, t := range stashable { diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 7375df1..51b81ef 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -318,40 +318,40 @@ func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { } // RoverStash will stash an item at the current rovers position -func (w *World) RoverStash(rover string) (atlas.ObjectType, error) { +func (w *World) RoverStash(rover string) (roveapi.Object, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() r, ok := w.Rovers[rover] if !ok { - return atlas.ObjectNone, fmt.Errorf("no rover matching id") + return roveapi.Object_ObjectNone, fmt.Errorf("no rover matching id") } // Can't pick up when full if len(r.Inventory) >= r.Capacity { - return atlas.ObjectNone, nil + return roveapi.Object_ObjectNone, nil } // Ensure the rover has energy if r.Charge <= 0 { - return atlas.ObjectNone, nil + return roveapi.Object_ObjectNone, nil } r.Charge-- _, obj := w.Atlas.QueryPosition(r.Pos) if !obj.IsStashable() { - return atlas.ObjectNone, nil + return roveapi.Object_ObjectNone, nil } r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r - w.Atlas.SetObject(r.Pos, atlas.Object{Type: atlas.ObjectNone}) + w.Atlas.SetObject(r.Pos, atlas.Object{Type: roveapi.Object_ObjectNone}) return obj.Type, nil } // RadarFromRover can be used to query what a rover can currently see -func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err error) { +func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []roveapi.Object, err error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -376,8 +376,8 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err } // Gather up all tiles within the range - radar = make([]byte, radarSpan*radarSpan) - objs = make([]byte, radarSpan*radarSpan) + radar = make([]roveapi.Tile, radarSpan*radarSpan) + objs = make([]roveapi.Object, radarSpan*radarSpan) for j := radarMin.Y; j <= radarMax.Y; j++ { for i := radarMin.X; i <= radarMax.X; i++ { q := maths.Vector{X: i, Y: j} @@ -388,7 +388,7 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err relative := q.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan radar[index] = tile - objs[index] = byte(obj.Type) + objs[index] = obj.Type } } @@ -401,7 +401,7 @@ func (w *World) RadarFromRover(rover string) (radar []byte, objs []byte, err err if dist.X <= r.Range && dist.Y <= r.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - objs[index] = byte(atlas.ObjectRoverLive) + objs[index] = roveapi.Object_RoverLive } } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 5a3e34f..8142858 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -90,7 +90,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover - world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: atlas.ObjectRockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: roveapi.Object_RockLarge}) newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") @@ -120,8 +120,8 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") // Test the expected values - assert.Equal(t, byte(atlas.ObjectRoverLive), objs[1+fullRange]) - assert.Equal(t, byte(atlas.ObjectRoverLive), objs[4+4*fullRange]) + assert.Equal(t, roveapi.Object_RoverLive, objs[1+fullRange]) + assert.Equal(t, roveapi.Object_RoverLive, objs[4+4*fullRange]) // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) @@ -142,34 +142,34 @@ func TestWorld_RoverStash(t *testing.T) { Y: 0.0, } - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectNone}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectNone}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") // Set to a traversible tile - world.Atlas.SetTile(pos, atlas.TileRock) + world.Atlas.SetTile(pos, roveapi.Tile_TileNone) rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover") for i := 0; i < rover.Capacity; i++ { // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) // Pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") // Check it's gone _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, atlas.ObjectNone, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, roveapi.Object_ObjectNone, obj.Type, "Stash failed to remove object from atlas") // Check we have it inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) - assert.Equal(t, atlas.Object{Type: atlas.ObjectRockSmall}, inv[i]) + assert.Equal(t, atlas.Object{Type: roveapi.Object_RockSmall}, inv[i]) // Check that this did reduce the charge info, err := world.GetRover(a) @@ -186,16 +186,16 @@ func TestWorld_RoverStash(t *testing.T) { } // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) // Try to pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectNone, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_ObjectNone, o, "Failed to get correct object") // Check it's still there _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, atlas.ObjectRockSmall, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, roveapi.Object_RockSmall, obj.Type, "Stash failed to remove object from atlas") // Check we don't have it inv, err := world.RoverInventory(a) @@ -224,7 +224,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectRockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) vec, err := world.MoveRover(a, maths.North) assert.NoError(t, err, "Failed to move rover") @@ -246,8 +246,8 @@ func TestWorld_RoverRepair(t *testing.T) { Y: 0.0, } - world.Atlas.SetTile(pos, atlas.TileNone) - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectNone}) + world.Atlas.SetTile(pos, roveapi.Tile_TileNone) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectNone}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -256,12 +256,12 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: atlas.ObjectRockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) // Try and bump into the rock vec, err := world.MoveRover(a, maths.North) @@ -281,10 +281,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, atlas.Object{Type: atlas.ObjectRockSmall}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, atlas.ObjectRockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") @@ -311,8 +311,8 @@ func TestWorld_Charge(t *testing.T) { assert.NoError(t, err, "Failed to get position for rover") // Ensure the path ahead is empty - world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), atlas.TileRock) - world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: atlas.ObjectNone}) + world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), roveapi.Tile_Rock) + world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: roveapi.Object_ObjectNone}) // Try and move north (along unblocked path) newPos, err := world.MoveRover(a, maths.North) @@ -394,7 +394,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: atlas.ObjectNone}) + world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectNone}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range, Y: 0})) // Broadcast from a again @@ -411,7 +411,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: atlas.ObjectNone}) + world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectNone}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 1eeeabd..842d574 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -98,6 +98,119 @@ func (CommandType) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{0} } +// Types of objects +type Object int32 + +const ( + // ObjectNone represents no object at all + Object_ObjectNone Object = 0 + // RoverLive represents a live rover + Object_RoverLive Object = 1 + // RockSmall is a small stashable rock + Object_RockSmall Object = 2 + // RockLarge is a large blocking rock + Object_RockLarge Object = 3 +) + +// Enum value maps for Object. +var ( + Object_name = map[int32]string{ + 0: "ObjectNone", + 1: "RoverLive", + 2: "RockSmall", + 3: "RockLarge", + } + Object_value = map[string]int32{ + "ObjectNone": 0, + "RoverLive": 1, + "RockSmall": 2, + "RockLarge": 3, + } +) + +func (x Object) Enum() *Object { + p := new(Object) + *p = x + return p +} + +func (x Object) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Object) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[1].Descriptor() +} + +func (Object) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[1] +} + +func (x Object) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Object.Descriptor instead. +func (Object) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} +} + +type Tile int32 + +const ( + // TileNone is a keyword for nothing + Tile_TileNone Tile = 0 + // Rock is solid rock ground + Tile_Rock Tile = 1 + // Gravel is loose rocks + Tile_Gravel Tile = 2 + // Sand is sand + Tile_Sand Tile = 3 +) + +// Enum value maps for Tile. +var ( + Tile_name = map[int32]string{ + 0: "TileNone", + 1: "Rock", + 2: "Gravel", + 3: "Sand", + } + Tile_value = map[string]int32{ + "TileNone": 0, + "Rock": 1, + "Gravel": 2, + "Sand": 3, + } +) + +func (x Tile) Enum() *Tile { + p := new(Tile) + *p = x + return p +} + +func (x Tile) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Tile) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() +} + +func (Tile) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[2] +} + +func (x Tile) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Tile.Descriptor instead. +func (Tile) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} +} + // ServerStatusRequest is an empty placeholder type ServerStatusRequest struct { state protoimpl.MessageState @@ -629,9 +742,9 @@ type RadarResponse struct { Range int32 `protobuf:"varint,1,opt,name=range,proto3" json:"range,omitempty"` // A 1D array representing range*2 + 1 squared set of tiles, origin bottom // left and in row->column order - Tiles []byte `protobuf:"bytes,2,opt,name=tiles,proto3" json:"tiles,omitempty"` + Tiles []Tile `protobuf:"varint,2,rep,packed,name=tiles,proto3,enum=roveapi.Tile" json:"tiles,omitempty"` // A similar array to the tile array, but containing objects - Objects []byte `protobuf:"bytes,3,opt,name=objects,proto3" json:"objects,omitempty"` + Objects []Object `protobuf:"varint,3,rep,packed,name=objects,proto3,enum=roveapi.Object" json:"objects,omitempty"` } func (x *RadarResponse) Reset() { @@ -673,14 +786,14 @@ func (x *RadarResponse) GetRange() int32 { return 0 } -func (x *RadarResponse) GetTiles() []byte { +func (x *RadarResponse) GetTiles() []Tile { if x != nil { return x.Tiles } return nil } -func (x *RadarResponse) GetObjects() []byte { +func (x *RadarResponse) GetObjects() []Object { if x != nil { return x.Objects } @@ -1044,11 +1157,13 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x55, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, @@ -1092,31 +1207,39 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x10, 0x05, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, - 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x45, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x0e, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x34, 0x0a, 0x04, + 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x6e, 0x65, + 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, + 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, + 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, + 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, + 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1131,51 +1254,55 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType - (*ServerStatusRequest)(nil), // 1: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 2: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 3: roveapi.RegisterRequest - (*Account)(nil), // 4: roveapi.Account - (*RegisterResponse)(nil), // 5: roveapi.RegisterResponse - (*Command)(nil), // 6: roveapi.Command - (*CommandRequest)(nil), // 7: roveapi.CommandRequest - (*CommandResponse)(nil), // 8: roveapi.CommandResponse - (*RadarRequest)(nil), // 9: roveapi.RadarRequest - (*RadarResponse)(nil), // 10: roveapi.RadarResponse - (*StatusRequest)(nil), // 11: roveapi.StatusRequest - (*Log)(nil), // 12: roveapi.Log - (*Vector)(nil), // 13: roveapi.Vector - (*StatusResponse)(nil), // 14: roveapi.StatusResponse + (Object)(0), // 1: roveapi.Object + (Tile)(0), // 2: roveapi.Tile + (*ServerStatusRequest)(nil), // 3: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 4: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 5: roveapi.RegisterRequest + (*Account)(nil), // 6: roveapi.Account + (*RegisterResponse)(nil), // 7: roveapi.RegisterResponse + (*Command)(nil), // 8: roveapi.Command + (*CommandRequest)(nil), // 9: roveapi.CommandRequest + (*CommandResponse)(nil), // 10: roveapi.CommandResponse + (*RadarRequest)(nil), // 11: roveapi.RadarRequest + (*RadarResponse)(nil), // 12: roveapi.RadarResponse + (*StatusRequest)(nil), // 13: roveapi.StatusRequest + (*Log)(nil), // 14: roveapi.Log + (*Vector)(nil), // 15: roveapi.Vector + (*StatusResponse)(nil), // 16: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 4, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 6, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 4, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account - 6, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 4, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account - 4, // 5: roveapi.StatusRequest.account:type_name -> roveapi.Account - 13, // 6: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 6, // 7: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command - 6, // 8: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 12, // 9: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 1, // 10: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 3, // 11: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 7, // 12: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 9, // 13: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 11, // 14: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 2, // 15: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 5, // 16: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 8, // 17: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 10, // 18: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 14, // 19: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 15, // [15:20] is the sub-list for method output_type - 10, // [10:15] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 6, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account + 8, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 6, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account + 2, // 5: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 1, // 6: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 6, // 7: roveapi.StatusRequest.account:type_name -> roveapi.Account + 15, // 8: roveapi.StatusResponse.position:type_name -> roveapi.Vector + 8, // 9: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command + 8, // 10: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 14, // 11: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 3, // 12: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 5, // 13: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 9, // 14: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 11, // 15: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 13, // 16: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 4, // 17: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 7, // 18: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 10, // 19: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 12, // 20: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 16, // 21: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 17, // [17:22] is the sub-list for method output_type + 12, // [12:17] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1362,7 +1489,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 1, + NumEnums: 3, NumMessages: 14, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 9dd2577..62dbc5a 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -134,6 +134,35 @@ message CommandResponse {} // Radar // +// Types of objects +enum Object { + // ObjectNone represents no object at all + ObjectNone = 0; + + // RoverLive represents a live rover + RoverLive = 1; + + // RockSmall is a small stashable rock + RockSmall = 2; + + // RockLarge is a large blocking rock + RockLarge = 3; +} + +enum Tile { + // TileNone is a keyword for nothing + TileNone = 0; + + // Rock is solid rock ground + Rock = 1; + + // Gravel is loose rocks + Gravel = 2; + + // Sand is sand + Sand = 3; +} + // RadarRequest is the data needed to request the radar for a rover message RadarRequest { // The account for this request @@ -147,10 +176,10 @@ message RadarResponse { // A 1D array representing range*2 + 1 squared set of tiles, origin bottom // left and in row->column order - bytes tiles = 2; + repeated Tile tiles = 2; // A similar array to the tile array, but containing objects - bytes objects = 3; + repeated Object objects = 3; } // From 7bdfa44fb60eda92eea042449af17a34fe2105be Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:33:11 +0100 Subject: [PATCH 399/495] Fix up the concept of "None" tiles and objects Replace with "Unknown" which is effectively an invalid value --- cmd/rove/main.go | 6 +-- pkg/atlas/atlas.go | 4 +- pkg/atlas/atlas_test.go | 6 +-- pkg/atlas/chunkAtlas.go | 6 +-- pkg/atlas/glyph.go | 3 -- pkg/atlas/objects.go | 4 +- pkg/rove/world.go | 10 ++-- pkg/rove/world_test.go | 18 +++---- proto/roveapi/roveapi.pb.go | 94 ++++++++++++++++++------------------- proto/roveapi/roveapi.proto | 8 ++-- 10 files changed, 72 insertions(+), 87 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8e4f740..c782850 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -287,12 +287,10 @@ func InnerMain(command string, args ...string) error { for i := 0; i < num; i++ { t := response.Tiles[i+num*j] o := response.Objects[i+num*j] - if o != roveapi.Object_ObjectNone { + if o != roveapi.Object_ObjectUnknown { fmt.Printf("%c", atlas.ObjectGlyph(o)) - } else if t != roveapi.Tile_TileNone { - fmt.Printf("%c", atlas.TileGlyph(t)) } else { - fmt.Printf(" ") + fmt.Printf("%c", atlas.TileGlyph(t)) } } diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index de83642..dfdcb74 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -10,8 +10,6 @@ import ( // TileGlyph returns the glyph for this tile type func TileGlyph(t roveapi.Tile) Glyph { switch t { - case roveapi.Tile_TileNone: - return GlyphNone case roveapi.Tile_Rock: return GlyphGroundRock case roveapi.Tile_Gravel: @@ -21,7 +19,7 @@ func TileGlyph(t roveapi.Tile) Glyph { } log.Fatalf("Unknown tile type: %c", t) - return GlyphNone + return 0 } // Atlas represents a 2D world atlas of tiles and objects diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index de8b7b9..bc0467a 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -260,12 +260,10 @@ func TestAtlas_WorldGen(t *testing.T) { for j := num - 1; j >= 0; j-- { for i := 0; i < num; i++ { t, o := a.QueryPosition(maths.Vector{X: i, Y: j}) - if o.Type != roveapi.Object_ObjectNone { + if o.Type != roveapi.Object_ObjectUnknown { fmt.Printf("%c", ObjectGlyph(o.Type)) - } else if t != roveapi.Tile_TileNone { - fmt.Printf("%c", TileGlyph(t)) } else { - fmt.Printf(" ") + fmt.Printf("%c", TileGlyph(t)) } } diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 43ca3af..3f19b07 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -121,14 +121,14 @@ func (a *chunkBasedAtlas) populate(chunk int) { // Get the object noise value for this location o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) - var obj = roveapi.Object_ObjectNone + var obj = roveapi.Object_ObjectUnknown switch { case o > 0.6: obj = roveapi.Object_RockLarge case o > 0.5: obj = roveapi.Object_RockSmall } - if obj != roveapi.Object_ObjectNone { + if obj != roveapi.Object_ObjectUnknown { c.Objects[j*a.ChunkSize+i] = Object{Type: roveapi.Object(obj)} } } @@ -160,7 +160,7 @@ func (a *chunkBasedAtlas) setObject(chunk int, local maths.Vector, object Object c := a.Chunks[chunk] i := a.chunkTileIndex(local) - if object.Type != roveapi.Object_ObjectNone { + if object.Type != roveapi.Object_ObjectUnknown { c.Objects[i] = object } else { delete(c.Objects, i) diff --git a/pkg/atlas/glyph.go b/pkg/atlas/glyph.go index c5c0ad7..ff186e3 100644 --- a/pkg/atlas/glyph.go +++ b/pkg/atlas/glyph.go @@ -4,9 +4,6 @@ package atlas type Glyph byte const ( - // GlyphNone is a keyword for nothing - GlyphNone = Glyph(0) - // GlyphGroundRock is solid rock ground GlyphGroundRock = Glyph('-') diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index ccbb69b..269beb4 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -9,8 +9,6 @@ import ( // ObjectGlyph returns the glyph for this object type func ObjectGlyph(o roveapi.Object) Glyph { switch o { - case roveapi.Object_ObjectNone: - return GlyphNone case roveapi.Object_RoverLive: return GlyphRoverLive case roveapi.Object_RockSmall: @@ -20,7 +18,7 @@ func ObjectGlyph(o roveapi.Object) Glyph { } log.Fatalf("Unknown object type: %c", o) - return GlyphNone + return 0 } // Object represents an object in the world diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 51b81ef..b3b15a0 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -324,29 +324,29 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { r, ok := w.Rovers[rover] if !ok { - return roveapi.Object_ObjectNone, fmt.Errorf("no rover matching id") + return roveapi.Object_ObjectUnknown, fmt.Errorf("no rover matching id") } // Can't pick up when full if len(r.Inventory) >= r.Capacity { - return roveapi.Object_ObjectNone, nil + return roveapi.Object_ObjectUnknown, nil } // Ensure the rover has energy if r.Charge <= 0 { - return roveapi.Object_ObjectNone, nil + return roveapi.Object_ObjectUnknown, nil } r.Charge-- _, obj := w.Atlas.QueryPosition(r.Pos) if !obj.IsStashable() { - return roveapi.Object_ObjectNone, nil + return roveapi.Object_ObjectUnknown, nil } r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r - w.Atlas.SetObject(r.Pos, atlas.Object{Type: roveapi.Object_ObjectNone}) + w.Atlas.SetObject(r.Pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) return obj.Type, nil } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 8142858..6534d89 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -142,13 +142,10 @@ func TestWorld_RoverStash(t *testing.T) { Y: 0.0, } - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectNone}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") - // Set to a traversible tile - world.Atlas.SetTile(pos, roveapi.Tile_TileNone) - rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover") @@ -163,7 +160,7 @@ func TestWorld_RoverStash(t *testing.T) { // Check it's gone _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, roveapi.Object_ObjectNone, obj.Type, "Stash failed to remove object from atlas") + assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type, "Stash failed to remove object from atlas") // Check we have it inv, err := world.RoverInventory(a) @@ -191,7 +188,7 @@ func TestWorld_RoverStash(t *testing.T) { // Try to pick it up o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_ObjectNone, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_ObjectUnknown, o, "Failed to get correct object") // Check it's still there _, obj := world.Atlas.QueryPosition(pos) @@ -246,8 +243,7 @@ func TestWorld_RoverRepair(t *testing.T) { Y: 0.0, } - world.Atlas.SetTile(pos, roveapi.Tile_TileNone) - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectNone}) + world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -312,7 +308,7 @@ func TestWorld_Charge(t *testing.T) { // Ensure the path ahead is empty world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), roveapi.Tile_Rock) - world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: roveapi.Object_ObjectNone}) + world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: roveapi.Object_ObjectUnknown}) // Try and move north (along unblocked path) newPos, err := world.MoveRover(a, maths.North) @@ -394,7 +390,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectNone}) + world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range, Y: 0})) // Broadcast from a again @@ -411,7 +407,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectNone}) + world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 842d574..dd47ca9 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -102,8 +102,8 @@ func (CommandType) EnumDescriptor() ([]byte, []int) { type Object int32 const ( - // ObjectNone represents no object at all - Object_ObjectNone Object = 0 + // ObjectUnknown represents no object at all + Object_ObjectUnknown Object = 0 // RoverLive represents a live rover Object_RoverLive Object = 1 // RockSmall is a small stashable rock @@ -115,16 +115,16 @@ const ( // Enum value maps for Object. var ( Object_name = map[int32]string{ - 0: "ObjectNone", + 0: "ObjectUnknown", 1: "RoverLive", 2: "RockSmall", 3: "RockLarge", } Object_value = map[string]int32{ - "ObjectNone": 0, - "RoverLive": 1, - "RockSmall": 2, - "RockLarge": 3, + "ObjectUnknown": 0, + "RoverLive": 1, + "RockSmall": 2, + "RockLarge": 3, } ) @@ -158,8 +158,8 @@ func (Object) EnumDescriptor() ([]byte, []int) { type Tile int32 const ( - // TileNone is a keyword for nothing - Tile_TileNone Tile = 0 + // TileUnknown is a keyword for nothing + Tile_TileUnknown Tile = 0 // Rock is solid rock ground Tile_Rock Tile = 1 // Gravel is loose rocks @@ -171,16 +171,16 @@ const ( // Enum value maps for Tile. var ( Tile_name = map[int32]string{ - 0: "TileNone", + 0: "TileUnknown", 1: "Rock", 2: "Gravel", 3: "Sand", } Tile_value = map[string]int32{ - "TileNone": 0, - "Rock": 1, - "Gravel": 2, - "Sand": 3, + "TileUnknown": 0, + "Rock": 1, + "Gravel": 2, + "Sand": 3, } ) @@ -1207,39 +1207,39 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x45, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x0e, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x34, 0x0a, 0x04, - 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x6e, 0x65, - 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, - 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, - 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, - 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x48, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, + 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, + 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 62dbc5a..0813533 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -136,8 +136,8 @@ message CommandResponse {} // Types of objects enum Object { - // ObjectNone represents no object at all - ObjectNone = 0; + // ObjectUnknown represents no object at all + ObjectUnknown = 0; // RoverLive represents a live rover RoverLive = 1; @@ -150,8 +150,8 @@ enum Object { } enum Tile { - // TileNone is a keyword for nothing - TileNone = 0; + // TileUnknown is a keyword for nothing + TileUnknown = 0; // Rock is solid rock ground Rock = 1; From 4a89cb9d6e76eb1a4a36dd84ec98d49343ab9c4d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:34:54 +0100 Subject: [PATCH 400/495] Move glyph functions out to the glyph file --- pkg/atlas/atlas.go | 17 ----------------- pkg/atlas/glyph.go | 36 ++++++++++++++++++++++++++++++++++++ pkg/atlas/objects.go | 17 ----------------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index dfdcb74..05012aa 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -1,27 +1,10 @@ package atlas import ( - "log" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" ) -// TileGlyph returns the glyph for this tile type -func TileGlyph(t roveapi.Tile) Glyph { - switch t { - case roveapi.Tile_Rock: - return GlyphGroundRock - case roveapi.Tile_Gravel: - return GlyphGroundGravel - case roveapi.Tile_Sand: - return GlyphGroundSand - } - - log.Fatalf("Unknown tile type: %c", t) - return 0 -} - // Atlas represents a 2D world atlas of tiles and objects type Atlas interface { // SetTile sets a location on the Atlas to a type of tile diff --git a/pkg/atlas/glyph.go b/pkg/atlas/glyph.go index ff186e3..183f460 100644 --- a/pkg/atlas/glyph.go +++ b/pkg/atlas/glyph.go @@ -1,5 +1,11 @@ package atlas +import ( + "log" + + "github.com/mdiluz/rove/proto/roveapi" +) + // Glyph represents the text representation of something in the game type Glyph byte @@ -22,3 +28,33 @@ const ( // GlyphRockLarge is a large blocking rock GlyphRockLarge = Glyph('O') ) + +// TileGlyph returns the glyph for this tile type +func TileGlyph(t roveapi.Tile) Glyph { + switch t { + case roveapi.Tile_Rock: + return GlyphGroundRock + case roveapi.Tile_Gravel: + return GlyphGroundGravel + case roveapi.Tile_Sand: + return GlyphGroundSand + } + + log.Fatalf("Unknown tile type: %c", t) + return 0 +} + +// ObjectGlyph returns the glyph for this object type +func ObjectGlyph(o roveapi.Object) Glyph { + switch o { + case roveapi.Object_RoverLive: + return GlyphRoverLive + case roveapi.Object_RockSmall: + return GlyphRockSmall + case roveapi.Object_RockLarge: + return GlyphRockLarge + } + + log.Fatalf("Unknown object type: %c", o) + return 0 +} diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 269beb4..e1b6730 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -1,26 +1,9 @@ package atlas import ( - "log" - "github.com/mdiluz/rove/proto/roveapi" ) -// ObjectGlyph returns the glyph for this object type -func ObjectGlyph(o roveapi.Object) Glyph { - switch o { - case roveapi.Object_RoverLive: - return GlyphRoverLive - case roveapi.Object_RockSmall: - return GlyphRockSmall - case roveapi.Object_RockLarge: - return GlyphRockLarge - } - - log.Fatalf("Unknown object type: %c", o) - return 0 -} - // Object represents an object in the world type Object struct { // The type of the object From da91d316491e9bf3ce063775cbb53631a3231083 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:36:48 +0100 Subject: [PATCH 401/495] MOve glyph code into client --- {pkg/atlas => cmd/rove}/glyph.go | 2 +- cmd/rove/main.go | 5 ++--- pkg/atlas/atlas_test.go | 17 +---------------- 3 files changed, 4 insertions(+), 20 deletions(-) rename {pkg/atlas => cmd/rove}/glyph.go (98%) diff --git a/pkg/atlas/glyph.go b/cmd/rove/glyph.go similarity index 98% rename from pkg/atlas/glyph.go rename to cmd/rove/glyph.go index 183f460..57f556d 100644 --- a/pkg/atlas/glyph.go +++ b/cmd/rove/glyph.go @@ -1,4 +1,4 @@ -package atlas +package main import ( "log" diff --git a/cmd/rove/main.go b/cmd/rove/main.go index c782850..e00fd9f 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -10,7 +10,6 @@ import ( "path/filepath" "time" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/version" "github.com/mdiluz/rove/proto/roveapi" @@ -288,9 +287,9 @@ func InnerMain(command string, args ...string) error { t := response.Tiles[i+num*j] o := response.Objects[i+num*j] if o != roveapi.Object_ObjectUnknown { - fmt.Printf("%c", atlas.ObjectGlyph(o)) + fmt.Printf("%c", ObjectGlyph(o)) } else { - fmt.Printf("%c", atlas.TileGlyph(t)) + fmt.Printf("%c", TileGlyph(t)) } } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index bc0467a..3d715f1 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -1,7 +1,6 @@ package atlas import ( - "fmt" "testing" "github.com/mdiluz/rove/pkg/maths" @@ -252,21 +251,7 @@ func TestAtlas_GetSetCorrect(t *testing.T) { func TestAtlas_WorldGen(t *testing.T) { a := NewChunkAtlas(8) + // Spawn a large world _, _ = a.QueryPosition(maths.Vector{X: 20, Y: 20}) - - // Print out the world for manual evaluation - num := 20 - for j := num - 1; j >= 0; j-- { - for i := 0; i < num; i++ { - t, o := a.QueryPosition(maths.Vector{X: i, Y: j}) - if o.Type != roveapi.Object_ObjectUnknown { - fmt.Printf("%c", ObjectGlyph(o.Type)) - } else { - fmt.Printf("%c", TileGlyph(t)) - } - - } - fmt.Print("\n") - } } From e9188dbbf654bfa30a7f6611251b0d5b7bf13a94 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:37:36 +0100 Subject: [PATCH 402/495] Auto-format proto file --- proto/roveapi/roveapi.proto | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 0813533..680aa9a 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -136,31 +136,31 @@ message CommandResponse {} // Types of objects enum Object { - // ObjectUnknown represents no object at all - ObjectUnknown = 0; + // ObjectUnknown represents no object at all + ObjectUnknown = 0; - // RoverLive represents a live rover - RoverLive = 1; + // RoverLive represents a live rover + RoverLive = 1; - // RockSmall is a small stashable rock - RockSmall = 2; + // RockSmall is a small stashable rock + RockSmall = 2; - // RockLarge is a large blocking rock - RockLarge = 3; + // RockLarge is a large blocking rock + RockLarge = 3; } enum Tile { - // TileUnknown is a keyword for nothing - TileUnknown = 0; + // TileUnknown is a keyword for nothing + TileUnknown = 0; - // Rock is solid rock ground - Rock = 1; + // Rock is solid rock ground + Rock = 1; - // Gravel is loose rocks - Gravel = 2; + // Gravel is loose rocks + Gravel = 2; - // Sand is sand - Sand = 3; + // Sand is sand + Sand = 3; } // RadarRequest is the data needed to request the radar for a rover From 4e0e55af8822b12a27ca05292fa3d0f5b8c4a560 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:54:41 +0100 Subject: [PATCH 403/495] Move bearing into proto file --- cmd/rove/main.go | 24 ++- pkg/maths/bearing.go | 97 ---------- pkg/maths/bearing_test.go | 31 --- pkg/maths/vector.go | 18 ++ pkg/rove/command.go | 2 +- pkg/rove/command_test.go | 4 +- pkg/rove/world.go | 12 +- pkg/rove/world_test.go | 14 +- proto/roveapi/roveapi.pb.go | 372 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 13 +- 10 files changed, 281 insertions(+), 306 deletions(-) delete mode 100644 pkg/maths/bearing.go delete mode 100644 pkg/maths/bearing_test.go diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 17d8dd4..dd8c39c 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -10,7 +10,6 @@ import ( "path/filepath" "time" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/version" "github.com/mdiluz/rove/proto/roveapi" "golang.org/x/net/context" @@ -123,6 +122,21 @@ func checkAccount(a Account) error { return nil } +// StringToBearing converts a string to a bearing +func StringToBearing(s string) roveapi.Bearing { + switch s { + case "N": + return roveapi.Bearing_North + case "E": + return roveapi.Bearing_East + case "S": + return roveapi.Bearing_South + case "W": + return roveapi.Bearing_West + } + return roveapi.Bearing_BearingUnknown +} + // InnerMain wraps the main function so we can test it func InnerMain(command string, args ...string) error { @@ -214,13 +228,15 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := maths.BearingFromString(args[i]); err != nil { - return err + } + var b roveapi.Bearing + if b = StringToBearing(args[i]); b == roveapi.Bearing_BearingUnknown { + return fmt.Errorf("unrecognised bearing: %s", args[i]) } commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType_move, - Data: &roveapi.Command_Bearing{Bearing: args[i]}, + Data: &roveapi.Command_Bearing{Bearing: b}, }, ) case "broadcast": diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go deleted file mode 100644 index e72148b..0000000 --- a/pkg/maths/bearing.go +++ /dev/null @@ -1,97 +0,0 @@ -package maths - -import ( - "fmt" - "strings" -) - -// Bearing describes a compass direction -type Bearing int - -const ( - // North describes a 0,1 vector - North Bearing = iota - // NorthEast describes a 1,1 vector - NorthEast - // East describes a 1,0 vector - East - // SouthEast describes a 1,-1 vector - SouthEast - // South describes a 0,-1 vector - South - // SouthWest describes a -1,-1 vector - SouthWest - // West describes a -1,0 vector - West - // NorthWest describes a -1,1 vector - NorthWest -) - -// bearingString simply describes the strings associated with a direction -type bearingString struct { - Long string - Short string -} - -// bearingStrings is the set of strings for each direction -var bearingStrings = []bearingString{ - {"North", "N"}, - {"NorthEast", "NE"}, - {"East", "E"}, - {"SouthEast", "SE"}, - {"South", "S"}, - {"SouthWest", "SW"}, - {"West", "W"}, - {"NorthWest", "NW"}, -} - -// String converts a Direction to a String -func (d Bearing) String() string { - return bearingStrings[d].Long -} - -// ShortString converts a Direction to a short string version -func (d Bearing) ShortString() string { - return bearingStrings[d].Short -} - -// BearingFromString gets the Direction from a string -func BearingFromString(s string) (Bearing, error) { - for i, d := range bearingStrings { - if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { - return Bearing(i), nil - } - } - return -1, fmt.Errorf("unknown bearing: %s", s) -} - -var bearingVectors = []Vector{ - {X: 0, Y: 1}, // N - {X: 1, Y: 1}, // NE - {X: 1, Y: 0}, // E - {X: 1, Y: -1}, // SE - {X: 0, Y: -1}, // S - {X: -1, Y: -1}, // SW - {X: -1, Y: 0}, // W - {X: -1, Y: 1}, // NW -} - -// Vector converts a Direction to a Vector -func (d Bearing) Vector() Vector { - return bearingVectors[d] -} - -// IsCardinal returns if this is a cardinal (NESW) -func (d Bearing) IsCardinal() bool { - switch d { - case North: - fallthrough - case East: - fallthrough - case South: - fallthrough - case West: - return true - } - return false -} diff --git a/pkg/maths/bearing_test.go b/pkg/maths/bearing_test.go deleted file mode 100644 index e0de345..0000000 --- a/pkg/maths/bearing_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package maths - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestDirection(t *testing.T) { - dir := North - - assert.Equal(t, "North", dir.String()) - assert.Equal(t, "N", dir.ShortString()) - assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) - - dir, err := BearingFromString("N") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = BearingFromString("n") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = BearingFromString("north") - assert.NoError(t, err) - assert.Equal(t, North, dir) - - dir, err = BearingFromString("NorthWest") - assert.NoError(t, err) - assert.Equal(t, NorthWest, dir) -} diff --git a/pkg/maths/vector.go b/pkg/maths/vector.go index 2dd3bad..8a63708 100644 --- a/pkg/maths/vector.go +++ b/pkg/maths/vector.go @@ -2,6 +2,8 @@ package maths import ( "math" + + "github.com/mdiluz/rove/proto/roveapi" ) // Vector desribes a 3D vector @@ -81,3 +83,19 @@ func Min2(v1 Vector, v2 Vector) Vector { func Max2(v1 Vector, v2 Vector) Vector { return Vector{Max(v1.X, v2.X), Max(v1.Y, v2.Y)} } + +// BearingToVector converts a bearing to a vector +func BearingToVector(b roveapi.Bearing) Vector { + switch b { + case roveapi.Bearing_North: + return Vector{Y: 1} + case roveapi.Bearing_East: + return Vector{X: 1} + case roveapi.Bearing_South: + return Vector{Y: -1} + case roveapi.Bearing_West: + return Vector{X: -1} + } + + return Vector{} +} diff --git a/pkg/rove/command.go b/pkg/rove/command.go index 86e9cad..e64d646 100644 --- a/pkg/rove/command.go +++ b/pkg/rove/command.go @@ -7,7 +7,7 @@ type Command struct { Command roveapi.CommandType `json:"command"` // Used in the move command - Bearing string `json:"bearing,omitempty"` + Bearing roveapi.Bearing `json:"bearing,omitempty"` // Used in the broadcast command Message []byte `json:"message,omitempty"` diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 9150fde..337782f 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -21,7 +21,7 @@ func TestCommand_Move(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Try the move command - moveCommand := Command{Command: roveapi.CommandType_move, Bearing: "N"} + moveCommand := Command{Command: roveapi.CommandType_move, Bearing: roveapi.Bearing_North} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") // Tick the world @@ -47,7 +47,7 @@ func TestCommand_Recharge(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") // Move to use up some charge - moveCommand := Command{Command: roveapi.CommandType_move, Bearing: "N"} + moveCommand := Command{Command: roveapi.CommandType_move, Bearing: roveapi.Bearing_North} assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to queue move command") // Tick the world diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 4693555..a5ab05f 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -277,7 +277,7 @@ func (w *World) WarpRover(rover string, pos maths.Vector) error { } // MoveRover attempts to move a rover in a specific direction -func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { +func (w *World) MoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -293,7 +293,7 @@ func (w *World) MoveRover(rover string, b maths.Bearing) (maths.Vector, error) { i.Charge-- // Try the new move position - newPos := i.Pos.Added(b.Vector()) + newPos := i.Pos.Added(maths.BearingToVector(b)) // Get the tile and verify it's empty _, obj := w.Atlas.QueryPosition(newPos) @@ -426,9 +426,7 @@ func (w *World) Enqueue(rover string, commands ...Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_move: - if b, err := maths.BearingFromString(c.Bearing); err != nil { - return fmt.Errorf("unknown bearing: %s", c.Bearing) - } else if !b.IsCardinal() { + if c.Bearing == roveapi.Bearing_BearingUnknown { return fmt.Errorf("bearing must be cardinal") } case roveapi.CommandType_broadcast: @@ -507,9 +505,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { switch c.Command { case roveapi.CommandType_move: - if dir, err := maths.BearingFromString(c.Bearing); err != nil { - return err - } else if _, err := w.MoveRover(rover, dir); err != nil { + if _, err := w.MoveRover(rover, c.Bearing); err != nil { return err } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 6534d89..7cf2483 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -78,7 +78,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.NoError(t, err, "Failed to set position for rover") assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") - b := maths.North + b := roveapi.Bearing_North newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") pos.Add(maths.Vector{X: 0, Y: 1}) @@ -223,7 +223,7 @@ func TestWorld_RoverDamage(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) - vec, err := world.MoveRover(a, maths.North) + vec, err := world.MoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -260,7 +260,7 @@ func TestWorld_RoverRepair(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) // Try and bump into the rock - vec, err := world.MoveRover(a, maths.North) + vec, err := world.MoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -307,13 +307,13 @@ func TestWorld_Charge(t *testing.T) { assert.NoError(t, err, "Failed to get position for rover") // Ensure the path ahead is empty - world.Atlas.SetTile(initialPos.Added(maths.North.Vector()), roveapi.Tile_Rock) - world.Atlas.SetObject(initialPos.Added(maths.North.Vector()), atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetTile(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), roveapi.Tile_Rock) + world.Atlas.SetObject(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), atlas.Object{Type: roveapi.Object_ObjectUnknown}) // Try and move north (along unblocked path) - newPos, err := world.MoveRover(a, maths.North) + newPos, err := world.MoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to set position for rover") - assert.Equal(t, initialPos.Added(maths.North.Vector()), newPos, "Failed to correctly move position for rover") + assert.Equal(t, initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), newPos, "Failed to correctly move position for rover") // Ensure rover lost charge rover, err := world.GetRover(a) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index dd47ca9..e35c863 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -98,6 +98,62 @@ func (CommandType) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{0} } +type Bearing int32 + +const ( + // BearingUnknown an unknown invalid bearing + Bearing_BearingUnknown Bearing = 0 + Bearing_North Bearing = 1 + Bearing_East Bearing = 2 + Bearing_South Bearing = 3 + Bearing_West Bearing = 4 +) + +// Enum value maps for Bearing. +var ( + Bearing_name = map[int32]string{ + 0: "BearingUnknown", + 1: "North", + 2: "East", + 3: "South", + 4: "West", + } + Bearing_value = map[string]int32{ + "BearingUnknown": 0, + "North": 1, + "East": 2, + "South": 3, + "West": 4, + } +) + +func (x Bearing) Enum() *Bearing { + p := new(Bearing) + *p = x + return p +} + +func (x Bearing) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Bearing) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[1].Descriptor() +} + +func (Bearing) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[1] +} + +func (x Bearing) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Bearing.Descriptor instead. +func (Bearing) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} +} + // Types of objects type Object int32 @@ -139,11 +195,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[1].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[1] + return &file_roveapi_roveapi_proto_enumTypes[2] } func (x Object) Number() protoreflect.EnumNumber { @@ -152,7 +208,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} } type Tile int32 @@ -195,11 +251,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Tile) Number() protoreflect.EnumNumber { @@ -208,7 +264,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } // ServerStatusRequest is an empty placeholder @@ -551,11 +607,11 @@ func (m *Command) GetData() isCommand_Data { return nil } -func (x *Command) GetBearing() string { +func (x *Command) GetBearing() Bearing { if x, ok := x.GetData().(*Command_Bearing); ok { return x.Bearing } - return "" + return Bearing_BearingUnknown } func (x *Command) GetMessage() []byte { @@ -570,9 +626,9 @@ type isCommand_Data interface { } type Command_Bearing struct { - // A bearing, example: NE + // A bearing // Used with MOVE - Bearing string `protobuf:"bytes,2,opt,name=bearing,proto3,oneof"` + Bearing Bearing `protobuf:"varint,2,opt,name=bearing,proto3,enum=roveapi.Bearing,oneof"` } type Command_Message struct { @@ -1137,109 +1193,115 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, + 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, - 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x55, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x10, - 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, - 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x48, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, - 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, - 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, + 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, + 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, + 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, + 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, + 0x73, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, + 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, + 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, + 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x47, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, + 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x04, 0x2a, 0x48, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x37, 0x0a, 0x04, 0x54, + 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, + 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1254,55 +1316,57 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 4) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType - (Object)(0), // 1: roveapi.Object - (Tile)(0), // 2: roveapi.Tile - (*ServerStatusRequest)(nil), // 3: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 4: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 5: roveapi.RegisterRequest - (*Account)(nil), // 6: roveapi.Account - (*RegisterResponse)(nil), // 7: roveapi.RegisterResponse - (*Command)(nil), // 8: roveapi.Command - (*CommandRequest)(nil), // 9: roveapi.CommandRequest - (*CommandResponse)(nil), // 10: roveapi.CommandResponse - (*RadarRequest)(nil), // 11: roveapi.RadarRequest - (*RadarResponse)(nil), // 12: roveapi.RadarResponse - (*StatusRequest)(nil), // 13: roveapi.StatusRequest - (*Log)(nil), // 14: roveapi.Log - (*Vector)(nil), // 15: roveapi.Vector - (*StatusResponse)(nil), // 16: roveapi.StatusResponse + (Bearing)(0), // 1: roveapi.Bearing + (Object)(0), // 2: roveapi.Object + (Tile)(0), // 3: roveapi.Tile + (*ServerStatusRequest)(nil), // 4: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 5: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 6: roveapi.RegisterRequest + (*Account)(nil), // 7: roveapi.Account + (*RegisterResponse)(nil), // 8: roveapi.RegisterResponse + (*Command)(nil), // 9: roveapi.Command + (*CommandRequest)(nil), // 10: roveapi.CommandRequest + (*CommandResponse)(nil), // 11: roveapi.CommandResponse + (*RadarRequest)(nil), // 12: roveapi.RadarRequest + (*RadarResponse)(nil), // 13: roveapi.RadarResponse + (*StatusRequest)(nil), // 14: roveapi.StatusRequest + (*Log)(nil), // 15: roveapi.Log + (*Vector)(nil), // 16: roveapi.Vector + (*StatusResponse)(nil), // 17: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 6, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 7, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 6, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account - 8, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 6, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account - 2, // 5: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 1, // 6: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 6, // 7: roveapi.StatusRequest.account:type_name -> roveapi.Account - 15, // 8: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 8, // 9: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command - 8, // 10: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 14, // 11: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 3, // 12: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 5, // 13: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 9, // 14: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 11, // 15: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 13, // 16: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 4, // 17: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 7, // 18: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 10, // 19: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 12, // 20: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 16, // 21: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 17, // [17:22] is the sub-list for method output_type - 12, // [12:17] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing + 7, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account + 9, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 7, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account + 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 7, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account + 16, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector + 9, // 10: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command + 9, // 11: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 15, // 12: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 4, // 13: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 6, // 14: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 10, // 15: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 12, // 16: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 14, // 17: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 5, // 18: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 8, // 19: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 11, // 20: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 13, // 21: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 17, // 22: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 18, // [18:23] is the sub-list for method output_type + 13, // [13:18] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1489,7 +1553,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 3, + NumEnums: 4, NumMessages: 14, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 680aa9a..b43087b 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -101,15 +101,24 @@ enum CommandType { broadcast = 5; } +enum Bearing { + // BearingUnknown an unknown invalid bearing + BearingUnknown = 0; + North = 1; + East = 2; + South = 3; + West = 4; +} + // Command is a single command for a rover message Command { // The command type CommandType command = 1; oneof data { - // A bearing, example: NE + // A bearing // Used with MOVE - string bearing = 2; + Bearing bearing = 2; // A simple message, must be composed of printable ASCII glyphs (32-126) // maximum of three characters From cd6a275bb97a6800a774c859ddec1c30a50c4cda Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 12:59:36 +0100 Subject: [PATCH 404/495] Move code to internal cmd/main --- cmd/rove/{ => internal}/glyph.go | 2 +- cmd/rove/main.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) rename cmd/rove/{ => internal}/glyph.go (98%) diff --git a/cmd/rove/glyph.go b/cmd/rove/internal/glyph.go similarity index 98% rename from cmd/rove/glyph.go rename to cmd/rove/internal/glyph.go index 57f556d..1a26f5d 100644 --- a/cmd/rove/glyph.go +++ b/cmd/rove/internal/glyph.go @@ -1,4 +1,4 @@ -package main +package internal import ( "log" diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 17d8dd4..4e3a1d2 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -10,6 +10,7 @@ import ( "path/filepath" "time" + "github.com/mdiluz/rove/cmd/rove/internal" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/version" "github.com/mdiluz/rove/proto/roveapi" @@ -287,9 +288,9 @@ func InnerMain(command string, args ...string) error { t := response.Tiles[i+num*j] o := response.Objects[i+num*j] if o != roveapi.Object_ObjectUnknown { - fmt.Printf("%c", ObjectGlyph(o)) + fmt.Printf("%c", internal.ObjectGlyph(o)) } else { - fmt.Printf("%c", TileGlyph(t)) + fmt.Printf("%c", internal.TileGlyph(t)) } } From 57f668ae548ab28745e11afec08df78820b7e42d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:13:09 +0100 Subject: [PATCH 405/495] Reinstate BearingFromString function --- cmd/rove/main.go | 24 ++++++++++++++++++++---- pkg/rove/world.go | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 4e3a1d2..bd98d52 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -11,7 +11,6 @@ import ( "time" "github.com/mdiluz/rove/cmd/rove/internal" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/version" "github.com/mdiluz/rove/proto/roveapi" "golang.org/x/net/context" @@ -124,6 +123,21 @@ func checkAccount(a Account) error { return nil } +// BearingFromString converts a string to a bearing +func BearingFromString(s string) roveapi.Bearing { + switch s { + case "N": + return roveapi.Bearing_North + case "E": + return roveapi.Bearing_East + case "S": + return roveapi.Bearing_South + case "W": + return roveapi.Bearing_West + } + return roveapi.Bearing_BearingUnknown +} + // InnerMain wraps the main function so we can test it func InnerMain(command string, args ...string) error { @@ -215,13 +229,15 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := maths.BearingFromString(args[i]); err != nil { - return err + } + var b roveapi.Bearing + if b = BearingFromString(args[i]); b == roveapi.Bearing_BearingUnknown { + return fmt.Errorf("unrecognised bearing: %s", args[i]) } commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType_move, - Data: &roveapi.Command_Bearing{Bearing: args[i]}, + Data: &roveapi.Command_Bearing{Bearing: b}, }, ) case "broadcast": diff --git a/pkg/rove/world.go b/pkg/rove/world.go index a5ab05f..7c313ba 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -427,7 +427,7 @@ func (w *World) Enqueue(rover string, commands ...Command) error { switch c.Command { case roveapi.CommandType_move: if c.Bearing == roveapi.Bearing_BearingUnknown { - return fmt.Errorf("bearing must be cardinal") + return fmt.Errorf("bearing must be valid") } case roveapi.CommandType_broadcast: if len(c.Message) > 3 { From fd0992353d282c1c7b0855afb8121bbf4d1a3b1b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:27:29 +0100 Subject: [PATCH 406/495] Add data to objects --- pkg/atlas/objects.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index e1b6730..69ce560 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -8,6 +8,9 @@ import ( type Object struct { // The type of the object Type roveapi.Object `json:"type"` + + // Data is an internal type used for certain types of object + Data []byte `json:"data"` } // IsBlocking checks if an object is a blocking object From 713699687f0d21f4047fba2f9ad528aa1b8c14f2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:27:38 +0100 Subject: [PATCH 407/495] Add a dormat rover data type --- proto/roveapi/roveapi.pb.go | 67 ++++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 3 ++ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index e35c863..2f5e069 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -162,6 +162,8 @@ const ( Object_ObjectUnknown Object = 0 // RoverLive represents a live rover Object_RoverLive Object = 1 + // RoverDormant describes a dormant rover + Object_RoverDormant Object = 4 // RockSmall is a small stashable rock Object_RockSmall Object = 2 // RockLarge is a large blocking rock @@ -173,12 +175,14 @@ var ( Object_name = map[int32]string{ 0: "ObjectUnknown", 1: "RoverLive", + 4: "RoverDormant", 2: "RockSmall", 3: "RockLarge", } Object_value = map[string]int32{ "ObjectUnknown": 0, "RoverLive": 1, + "RoverDormant": 4, "RockSmall": 2, "RockLarge": 3, } @@ -1269,39 +1273,40 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x04, 0x2a, 0x48, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, + 0x04, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x37, 0x0a, 0x04, 0x54, - 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, - 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, - 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, + 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x04, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x37, 0x0a, + 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, + 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, + 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index b43087b..7d227fb 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -151,6 +151,9 @@ enum Object { // RoverLive represents a live rover RoverLive = 1; + // RoverDormant describes a dormant rover + RoverDormant = 4; + // RockSmall is a small stashable rock RockSmall = 2; From 4f1a9c2c2b4b6f4a2de506982afc625927921830 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:27:59 +0100 Subject: [PATCH 408/495] Re-order object types --- proto/roveapi/roveapi.pb.go | 24 ++++++++++++------------ proto/roveapi/roveapi.proto | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 2f5e069..783325f 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -163,11 +163,11 @@ const ( // RoverLive represents a live rover Object_RoverLive Object = 1 // RoverDormant describes a dormant rover - Object_RoverDormant Object = 4 + Object_RoverDormant Object = 2 // RockSmall is a small stashable rock - Object_RockSmall Object = 2 + Object_RockSmall Object = 3 // RockLarge is a large blocking rock - Object_RockLarge Object = 3 + Object_RockLarge Object = 4 ) // Enum value maps for Object. @@ -175,16 +175,16 @@ var ( Object_name = map[int32]string{ 0: "ObjectUnknown", 1: "RoverLive", - 4: "RoverDormant", - 2: "RockSmall", - 3: "RockLarge", + 2: "RoverDormant", + 3: "RockSmall", + 4: "RockLarge", } Object_value = map[string]int32{ "ObjectUnknown": 0, "RoverLive": 1, - "RoverDormant": 4, - "RockSmall": 2, - "RockLarge": 3, + "RoverDormant": 2, + "RockSmall": 3, + "RockLarge": 4, } ) @@ -1276,9 +1276,9 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x04, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x04, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x03, 0x2a, 0x37, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 7d227fb..566bcfd 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -152,13 +152,13 @@ enum Object { RoverLive = 1; // RoverDormant describes a dormant rover - RoverDormant = 4; + RoverDormant = 2; // RockSmall is a small stashable rock - RockSmall = 2; + RockSmall = 3; // RockLarge is a large blocking rock - RockLarge = 3; + RockLarge = 4; } enum Tile { From 1eba9a865279f0f4d28b714f7c42978935f8876e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:41:47 +0100 Subject: [PATCH 409/495] Pull world gen out into interface --- pkg/atlas/chunkAtlas.go | 64 +++++++++++++---------------------------- pkg/atlas/worldgen.go | 64 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 pkg/atlas/worldgen.go diff --git a/pkg/atlas/chunkAtlas.go b/pkg/atlas/chunkAtlas.go index 3f19b07..4abb0e8 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/atlas/chunkAtlas.go @@ -6,7 +6,6 @@ import ( "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" - "github.com/ojrac/opensimplex-go" ) // chunk represents a fixed square grid of tiles @@ -34,29 +33,23 @@ type chunkBasedAtlas struct { // ChunkSize is the x/y dimensions of each square chunk ChunkSize int `json:"chunksize"` - // terrainNoise describes the noise function for the terrain - terrainNoise opensimplex.Noise - - // terrainNoise describes the noise function for the terrain - objectNoise opensimplex.Noise + // worldGen is the internal world generator + worldGen WorldGen } const ( - noiseSeed = 1024 - terrainNoiseScale = 6 - objectNoiseScale = 3 + noiseSeed = 1024 ) // NewChunkAtlas creates a new empty atlas func NewChunkAtlas(chunkSize int) Atlas { // Start up with one chunk a := chunkBasedAtlas{ - ChunkSize: chunkSize, - Chunks: make([]chunk, 1), - LowerBound: maths.Vector{X: 0, Y: 0}, - UpperBound: maths.Vector{X: chunkSize, Y: chunkSize}, - terrainNoise: opensimplex.New(noiseSeed), - objectNoise: opensimplex.New(noiseSeed), + ChunkSize: chunkSize, + Chunks: make([]chunk, 1), + LowerBound: maths.Vector{X: 0, Y: 0}, + UpperBound: maths.Vector{X: chunkSize, Y: chunkSize}, + worldGen: NewNoiseWorldGen(noiseSeed), } // Initialise the first chunk a.populate(0) @@ -105,31 +98,15 @@ func (a *chunkBasedAtlas) populate(chunk int) { origin := a.chunkOriginInWorldSpace(chunk) for i := 0; i < a.ChunkSize; i++ { for j := 0; j < a.ChunkSize; j++ { + loc := maths.Vector{X: origin.X + i, Y: origin.Y + j} - // Get the terrain noise value for this location - t := a.terrainNoise.Eval2(float64(origin.X+i)/terrainNoiseScale, float64(origin.Y+j)/terrainNoiseScale) - var tile roveapi.Tile - switch { - case t > 0.5: - tile = roveapi.Tile_Gravel - case t > 0.05: - tile = roveapi.Tile_Sand - default: - tile = roveapi.Tile_Rock - } - c.Tiles[j*a.ChunkSize+i] = byte(tile) + // Set the tile + c.Tiles[j*a.ChunkSize+i] = byte(a.worldGen.GetTile(loc)) - // Get the object noise value for this location - o := a.objectNoise.Eval2(float64(origin.X+i)/objectNoiseScale, float64(origin.Y+j)/objectNoiseScale) - var obj = roveapi.Object_ObjectUnknown - switch { - case o > 0.6: - obj = roveapi.Object_RockLarge - case o > 0.5: - obj = roveapi.Object_RockSmall - } - if obj != roveapi.Object_ObjectUnknown { - c.Objects[j*a.ChunkSize+i] = Object{Type: roveapi.Object(obj)} + // Set the object + obj := a.worldGen.GetObject(loc) + if obj.Type != roveapi.Object_ObjectUnknown { + c.Objects[j*a.ChunkSize+i] = obj } } } @@ -236,12 +213,11 @@ func (a *chunkBasedAtlas) worldSpaceToChunkWithGrow(v maths.Vector) int { // Create the new empty atlas newAtlas := chunkBasedAtlas{ - ChunkSize: a.ChunkSize, - LowerBound: lower, - UpperBound: upper, - Chunks: make([]chunk, size.X*size.Y), - terrainNoise: a.terrainNoise, - objectNoise: a.objectNoise, + ChunkSize: a.ChunkSize, + LowerBound: lower, + UpperBound: upper, + Chunks: make([]chunk, size.X*size.Y), + worldGen: a.worldGen, } // Log that we're resizing diff --git a/pkg/atlas/worldgen.go b/pkg/atlas/worldgen.go new file mode 100644 index 0000000..38bcd4f --- /dev/null +++ b/pkg/atlas/worldgen.go @@ -0,0 +1,64 @@ +package atlas + +import ( + "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/proto/roveapi" + "github.com/ojrac/opensimplex-go" +) + +// WorldGen describes a world gen algorythm +type WorldGen interface { + // GetTile generates a tile for a location + GetTile(v maths.Vector) roveapi.Tile + + // GetObject generates an object for a location + GetObject(v maths.Vector) Object +} + +// NoiseWorldGen returns a noise based world generator +type NoiseWorldGen struct { + // terrainNoise describes the noise function for the terrain + terrainNoise opensimplex.Noise + + // terrainNoise describes the noise function for the terrain + objectNoise opensimplex.Noise +} + +// NewNoiseWorldGen creates a new noise based world generator +func NewNoiseWorldGen(seed int64) WorldGen { + return &NoiseWorldGen{ + terrainNoise: opensimplex.New(seed), + objectNoise: opensimplex.New(seed), + } +} + +const ( + terrainNoiseScale = 6 + objectNoiseScale = 3 +) + +// GetTile returns the chosen tile at a location +func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { + t := g.terrainNoise.Eval2(float64(v.X)/terrainNoiseScale, float64(v.Y)/terrainNoiseScale) + switch { + case t > 0.5: + return roveapi.Tile_Gravel + case t > 0.05: + return roveapi.Tile_Sand + default: + return roveapi.Tile_Rock + } +} + +// GetObject returns the chosen object at a location +func (g *NoiseWorldGen) GetObject(v maths.Vector) Object { + o := g.objectNoise.Eval2(float64(v.X)/objectNoiseScale, float64(v.Y)/objectNoiseScale) + var obj = roveapi.Object_ObjectUnknown + switch { + case o > 0.6: + obj = roveapi.Object_RockLarge + case o > 0.5: + obj = roveapi.Object_RockSmall + } + return Object{Type: roveapi.Object(obj)} +} From 87a9abcd12d26bce54cf2281b006f764e379cb0f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:49:34 +0100 Subject: [PATCH 410/495] Add a glyph for the dormant rover --- cmd/rove/internal/glyph.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/rove/internal/glyph.go b/cmd/rove/internal/glyph.go index 1a26f5d..eac12c0 100644 --- a/cmd/rove/internal/glyph.go +++ b/cmd/rove/internal/glyph.go @@ -22,6 +22,9 @@ const ( // GlyphRoverLive represents a live rover GlyphRoverLive = Glyph('R') + // GlyphRoverDormant represents a dormant rover + GlyphRoverDormant = Glyph('r') + // GlyphRockSmall is a small stashable rock GlyphRockSmall = Glyph('o') @@ -51,6 +54,8 @@ func ObjectGlyph(o roveapi.Object) Glyph { return GlyphRoverLive case roveapi.Object_RockSmall: return GlyphRockSmall + case roveapi.Object_RoverDormant: + return GlyphRoverDormant case roveapi.Object_RockLarge: return GlyphRockLarge } From c637ed37b93018a7c74e9fba90b7971fe17f3663 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:49:43 +0100 Subject: [PATCH 411/495] Make the dormat rover blocking --- pkg/atlas/objects.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/atlas/objects.go b/pkg/atlas/objects.go index 69ce560..cadfa4a 100644 --- a/pkg/atlas/objects.go +++ b/pkg/atlas/objects.go @@ -17,6 +17,7 @@ type Object struct { func (o *Object) IsBlocking() bool { var blocking = [...]roveapi.Object{ roveapi.Object_RoverLive, + roveapi.Object_RoverDormant, roveapi.Object_RockLarge, } From 959cbfa15a036a34a97d0ce55b0ec3b6b6a9fa45 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:51:49 +0100 Subject: [PATCH 412/495] Combine the two noise functions, we only need one --- pkg/atlas/worldgen.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pkg/atlas/worldgen.go b/pkg/atlas/worldgen.go index 38bcd4f..6c5f4b7 100644 --- a/pkg/atlas/worldgen.go +++ b/pkg/atlas/worldgen.go @@ -17,18 +17,14 @@ type WorldGen interface { // NoiseWorldGen returns a noise based world generator type NoiseWorldGen struct { - // terrainNoise describes the noise function for the terrain - terrainNoise opensimplex.Noise - - // terrainNoise describes the noise function for the terrain - objectNoise opensimplex.Noise + // noise describes the noise function + noise opensimplex.Noise } // NewNoiseWorldGen creates a new noise based world generator func NewNoiseWorldGen(seed int64) WorldGen { return &NoiseWorldGen{ - terrainNoise: opensimplex.New(seed), - objectNoise: opensimplex.New(seed), + noise: opensimplex.New(seed), } } @@ -39,7 +35,7 @@ const ( // GetTile returns the chosen tile at a location func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { - t := g.terrainNoise.Eval2(float64(v.X)/terrainNoiseScale, float64(v.Y)/terrainNoiseScale) + t := g.noise.Eval2(float64(v.X)/terrainNoiseScale, float64(v.Y)/terrainNoiseScale) switch { case t > 0.5: return roveapi.Tile_Gravel @@ -52,7 +48,7 @@ func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { // GetObject returns the chosen object at a location func (g *NoiseWorldGen) GetObject(v maths.Vector) Object { - o := g.objectNoise.Eval2(float64(v.X)/objectNoiseScale, float64(v.Y)/objectNoiseScale) + o := g.noise.Eval2(float64(v.X)/objectNoiseScale, float64(v.Y)/objectNoiseScale) var obj = roveapi.Object_ObjectUnknown switch { case o > 0.6: From 37d828c457966ba871f444b0eeb9ea377106c347 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:53:38 +0100 Subject: [PATCH 413/495] Rename the rock noise --- pkg/atlas/worldgen.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/atlas/worldgen.go b/pkg/atlas/worldgen.go index 6c5f4b7..590596a 100644 --- a/pkg/atlas/worldgen.go +++ b/pkg/atlas/worldgen.go @@ -30,7 +30,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { const ( terrainNoiseScale = 6 - objectNoiseScale = 3 + rockNoiseScale = 3 ) // GetTile returns the chosen tile at a location @@ -48,7 +48,7 @@ func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { // GetObject returns the chosen object at a location func (g *NoiseWorldGen) GetObject(v maths.Vector) Object { - o := g.noise.Eval2(float64(v.X)/objectNoiseScale, float64(v.Y)/objectNoiseScale) + o := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) var obj = roveapi.Object_ObjectUnknown switch { case o > 0.6: From faa1271c5a01bb555ceb3fc9d678e333bd5a4691 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 13:57:45 +0100 Subject: [PATCH 414/495] Try and very rarely spawn a dormant rover --- pkg/atlas/worldgen.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/atlas/worldgen.go b/pkg/atlas/worldgen.go index 590596a..8ec8571 100644 --- a/pkg/atlas/worldgen.go +++ b/pkg/atlas/worldgen.go @@ -31,6 +31,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { const ( terrainNoiseScale = 6 rockNoiseScale = 3 + dormantRoverScale = 25 ) // GetTile returns the chosen tile at a location @@ -56,5 +57,14 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) Object { case o > 0.5: obj = roveapi.Object_RockSmall } + + // Very rarely spawn a dormant rover + if obj == roveapi.Object_ObjectUnknown { + o = g.noise.Eval2(float64(v.X)/dormantRoverScale, float64(v.Y)/dormantRoverScale) + if o > 0.8 { + obj = roveapi.Object_RoverDormant + } + } + return Object{Type: roveapi.Object(obj)} } From ddbbdce1f8f835c9cd68fbe72c697935fdafb675 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:23:11 +0100 Subject: [PATCH 415/495] Move default rover params to function --- pkg/rove/rover.go | 14 ++++++++++++++ pkg/rove/world.go | 11 +---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 089b44a..ad2d76d 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -5,6 +5,7 @@ import ( "log" "time" + "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" ) @@ -51,6 +52,19 @@ type Rover struct { Logs []RoverLogEntry `json:"logs"` } +// DefaultRover returns a default rover object with default settings +func DefaultRover() Rover { + return Rover{ + Range: 4, + Integrity: 10, + MaximumIntegrity: 10, + Capacity: 10, + Charge: 10, + MaximumCharge: 10, + Name: uuid.New().String(), + } +} + // AddLogEntryf adds an entry to the rovers log func (r *Rover) AddLogEntryf(format string, args ...interface{}) { text := fmt.Sprintf(format, args...) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 7c313ba..2e26c4c 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -8,7 +8,6 @@ import ( "os" "sync" - "github.com/google/uuid" "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" @@ -78,15 +77,7 @@ func (w *World) SpawnRover() (string, error) { defer w.worldMutex.Unlock() // Initialise the rover - rover := Rover{ - Range: 4, - Integrity: 10, - MaximumIntegrity: 10, - Capacity: 10, - Charge: 10, - MaximumCharge: 10, - Name: uuid.New().String(), - } + rover := DefaultRover() // Assign a random name if we have words if len(w.words) > 0 { From c48274eb23281758c5178e5a7e6eab84ba3f35a2 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:27:58 +0100 Subject: [PATCH 416/495] Small refactor in GetObject --- pkg/atlas/worldgen.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/atlas/worldgen.go b/pkg/atlas/worldgen.go index 8ec8571..c2bd05d 100644 --- a/pkg/atlas/worldgen.go +++ b/pkg/atlas/worldgen.go @@ -48,23 +48,22 @@ func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { } // GetObject returns the chosen object at a location -func (g *NoiseWorldGen) GetObject(v maths.Vector) Object { +func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { o := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) - var obj = roveapi.Object_ObjectUnknown switch { case o > 0.6: - obj = roveapi.Object_RockLarge + obj.Type = roveapi.Object_RockLarge case o > 0.5: - obj = roveapi.Object_RockSmall + obj.Type = roveapi.Object_RockSmall } // Very rarely spawn a dormant rover - if obj == roveapi.Object_ObjectUnknown { + if obj.Type == roveapi.Object_ObjectUnknown { o = g.noise.Eval2(float64(v.X)/dormantRoverScale, float64(v.Y)/dormantRoverScale) if o > 0.8 { - obj = roveapi.Object_RoverDormant + obj.Type = roveapi.Object_RoverDormant } } - return Object{Type: roveapi.Object(obj)} + return obj } From 9130cf2517722a55d53a362b9bb3ff0042b58c0b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:30:07 +0100 Subject: [PATCH 417/495] Move atlas package into rove --- pkg/{atlas => rove}/atlas.go | 2 +- pkg/{atlas => rove}/atlas_test.go | 2 +- pkg/{atlas => rove}/chunkAtlas.go | 2 +- pkg/{atlas => rove}/objects.go | 2 +- pkg/rove/rover.go | 3 +-- pkg/rove/world.go | 9 ++++----- pkg/rove/world_test.go | 27 +++++++++++++-------------- pkg/{atlas => rove}/worldgen.go | 2 +- 8 files changed, 23 insertions(+), 26 deletions(-) rename pkg/{atlas => rove}/atlas.go (97%) rename pkg/{atlas => rove}/atlas_test.go (99%) rename pkg/{atlas => rove}/chunkAtlas.go (99%) rename pkg/{atlas => rove}/objects.go (98%) rename pkg/{atlas => rove}/worldgen.go (99%) diff --git a/pkg/atlas/atlas.go b/pkg/rove/atlas.go similarity index 97% rename from pkg/atlas/atlas.go rename to pkg/rove/atlas.go index 05012aa..ab09dba 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/rove/atlas.go @@ -1,4 +1,4 @@ -package atlas +package rove import ( "github.com/mdiluz/rove/pkg/maths" diff --git a/pkg/atlas/atlas_test.go b/pkg/rove/atlas_test.go similarity index 99% rename from pkg/atlas/atlas_test.go rename to pkg/rove/atlas_test.go index 3d715f1..56e5d8d 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/rove/atlas_test.go @@ -1,4 +1,4 @@ -package atlas +package rove import ( "testing" diff --git a/pkg/atlas/chunkAtlas.go b/pkg/rove/chunkAtlas.go similarity index 99% rename from pkg/atlas/chunkAtlas.go rename to pkg/rove/chunkAtlas.go index 4abb0e8..f7ea36c 100644 --- a/pkg/atlas/chunkAtlas.go +++ b/pkg/rove/chunkAtlas.go @@ -1,4 +1,4 @@ -package atlas +package rove import ( "log" diff --git a/pkg/atlas/objects.go b/pkg/rove/objects.go similarity index 98% rename from pkg/atlas/objects.go rename to pkg/rove/objects.go index cadfa4a..94595df 100644 --- a/pkg/atlas/objects.go +++ b/pkg/rove/objects.go @@ -1,4 +1,4 @@ -package atlas +package rove import ( "github.com/mdiluz/rove/proto/roveapi" diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index ad2d76d..fb898eb 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -6,7 +6,6 @@ import ( "time" "github.com/google/uuid" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" ) @@ -31,7 +30,7 @@ type Rover struct { Range int `json:"range"` // Inventory represents any items the rover is carrying - Inventory []atlas.Object `json:"inventory"` + Inventory []Object `json:"inventory"` // Capacity is the maximum number of inventory items Capacity int `json:"capacity"` diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 2e26c4c..74d56b7 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -8,7 +8,6 @@ import ( "os" "sync" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" ) @@ -25,7 +24,7 @@ type World struct { Rovers map[string]Rover `json:"rovers"` // Atlas represends the world map of chunks and tiles - Atlas atlas.Atlas `json:"atlas"` + Atlas Atlas `json:"atlas"` // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream `json:"commands"` @@ -64,7 +63,7 @@ func NewWorld(chunkSize int) *World { Rovers: make(map[string]Rover), CommandQueue: make(map[string]CommandStream), CommandIncoming: make(map[string]CommandStream), - Atlas: atlas.NewChunkAtlas(chunkSize), + Atlas: NewChunkAtlas(chunkSize), words: lines, TicksPerDay: 24, CurrentTicks: 0, @@ -231,7 +230,7 @@ func (w *World) SetRoverPosition(rover string, pos maths.Vector) error { } // RoverInventory returns the inventory of a requested rover -func (w *World) RoverInventory(rover string) ([]atlas.Object, error) { +func (w *World) RoverInventory(rover string) ([]Object, error) { w.worldMutex.RLock() defer w.worldMutex.RUnlock() @@ -337,7 +336,7 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) w.Rovers[rover] = r - w.Atlas.SetObject(r.Pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) + w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_ObjectUnknown}) return obj.Type, nil } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 7cf2483..9af411c 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -3,7 +3,6 @@ package rove import ( "testing" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" @@ -90,7 +89,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover - world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, atlas.Object{Type: roveapi.Object_RockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, Object{Type: roveapi.Object_RockLarge}) newPos, err = world.MoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") @@ -142,7 +141,7 @@ func TestWorld_RoverStash(t *testing.T) { Y: 0.0, } - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -151,7 +150,7 @@ func TestWorld_RoverStash(t *testing.T) { for i := 0; i < rover.Capacity; i++ { // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) // Pick it up o, err := world.RoverStash(a) @@ -166,7 +165,7 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) - assert.Equal(t, atlas.Object{Type: roveapi.Object_RockSmall}, inv[i]) + assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, inv[i]) // Check that this did reduce the charge info, err := world.GetRover(a) @@ -183,7 +182,7 @@ func TestWorld_RoverStash(t *testing.T) { } // Place an object - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) // Try to pick it up o, err := world.RoverStash(a) @@ -221,7 +220,7 @@ func TestWorld_RoverDamage(t *testing.T) { info, err := world.GetRover(a) assert.NoError(t, err, "couldn't get rover info") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) vec, err := world.MoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to move rover") @@ -243,7 +242,7 @@ func TestWorld_RoverRepair(t *testing.T) { Y: 0.0, } - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") @@ -252,12 +251,12 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, atlas.Object{Type: roveapi.Object_RockLarge}) + world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) // Try and bump into the rock vec, err := world.MoveRover(a, roveapi.Bearing_North) @@ -277,7 +276,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, atlas.Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") @@ -308,7 +307,7 @@ func TestWorld_Charge(t *testing.T) { // Ensure the path ahead is empty world.Atlas.SetTile(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), roveapi.Tile_Rock) - world.Atlas.SetObject(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), Object{Type: roveapi.Object_ObjectUnknown}) // Try and move north (along unblocked path) newPos, err := world.MoveRover(a, roveapi.Bearing_North) @@ -390,7 +389,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "ABC", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(maths.Vector{X: ra.Range, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range, Y: 0})) // Broadcast from a again @@ -407,7 +406,7 @@ func TestWorld_Broadcast(t *testing.T) { assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "XYZ", "Rover A should have logged it's broadcast") // Warp B outside of the range of A - world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, atlas.Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(maths.Vector{X: ra.Range + 1, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(b, maths.Vector{X: ra.Range + 1, Y: 0})) // Broadcast from a again diff --git a/pkg/atlas/worldgen.go b/pkg/rove/worldgen.go similarity index 99% rename from pkg/atlas/worldgen.go rename to pkg/rove/worldgen.go index c2bd05d..2fe3bad 100644 --- a/pkg/atlas/worldgen.go +++ b/pkg/rove/worldgen.go @@ -1,4 +1,4 @@ -package atlas +package rove import ( "github.com/mdiluz/rove/pkg/maths" From 128171321185106f557ec6e9552291782fefbaa6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:35:12 +0100 Subject: [PATCH 418/495] Clear locations before warp in tests --- pkg/rove/world_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 9af411c..f393f3d 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -109,7 +109,9 @@ func TestWorld_RadarFromRover(t *testing.T) { // Warp the rovers into position bpos := maths.Vector{X: -3, Y: -3} + world.Atlas.SetObject(bpos, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(b, bpos), "Failed to warp rover") + world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0}), "Failed to warp rover") radar, objs, err := world.RadarFromRover(a) @@ -371,6 +373,8 @@ func TestWorld_Broadcast(t *testing.T) { assert.NoError(t, err) // Warp rovers near to eachother + world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) + world.Atlas.SetObject(maths.Vector{X: 1, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0})) assert.NoError(t, world.WarpRover(b, maths.Vector{X: 1, Y: 0})) From d3c480cb049a629167d048b046ea12df974f26c9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:39:16 +0100 Subject: [PATCH 419/495] Add dormant rover data marshalled into obj data --- pkg/rove/worldgen.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 2fe3bad..96ac669 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -1,6 +1,9 @@ package rove import ( + "encoding/json" + "log" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/ojrac/opensimplex-go" @@ -65,5 +68,21 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { } } + // Post process any spawned objects + switch obj.Type { + case roveapi.Object_RoverDormant: + // Create the rover + r := DefaultRover() + + // Set the rover variables + r.Pos = v + + // Marshal the rover data into the object data + obj.Data, err := json.Marshal(r) + if err == nil { + log.Fatalf("couldn't marshal rover, should never fail: %s", err) + } + } + return obj } From 211771121fe91cc7d8a4017279676c41bad9671b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:47:44 +0100 Subject: [PATCH 420/495] Extract rover naming to rover.go --- pkg/rove/rover.go | 38 +++++++++++++++++++++++++++++++++++++- pkg/rove/world.go | 35 ----------------------------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index fb898eb..6968c57 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -1,8 +1,11 @@ package rove import ( + "bufio" "fmt" "log" + "math/rand" + "os" "time" "github.com/google/uuid" @@ -60,7 +63,7 @@ func DefaultRover() Rover { Capacity: 10, Charge: 10, MaximumCharge: 10, - Name: uuid.New().String(), + Name: GenerateRoverName(), } } @@ -75,3 +78,36 @@ func (r *Rover) AddLogEntryf(format string, args ...interface{}) { }, ) } + +var wordsFile = os.Getenv("WORDS_FILE") +var roverWords []string + +// GenerateRoverName generates a new rover name +func GenerateRoverName() string { + + // Try and load the rover words file + if len(roverWords) == 0 { + // Try and load the words file + if file, err := os.Open(wordsFile); err != nil { + log.Printf("Couldn't read words file [%s], running without words: %s\n", wordsFile, err) + } else { + defer file.Close() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + roverWords = append(roverWords, scanner.Text()) + } + if scanner.Err() != nil { + log.Printf("Failure during word file scan: %s\n", scanner.Err()) + } + } + } + + // Assign a random name if we have words + if len(roverWords) > 0 { + // Loop until we find a unique name + return fmt.Sprintf("%s-%s", roverWords[rand.Intn(len(roverWords))], roverWords[rand.Intn(len(roverWords))]) + } + + // Default to a unique string + return uuid.New().String() +} diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 74d56b7..25aa933 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -1,11 +1,9 @@ package rove import ( - "bufio" "fmt" "log" "math/rand" - "os" "sync" "github.com/mdiluz/rove/pkg/maths" @@ -35,36 +33,15 @@ type World struct { worldMutex sync.RWMutex // Mutex to lock around command operations cmdMutex sync.RWMutex - // Set of possible words to use for names - words []string } -var wordsFile = os.Getenv("WORDS_FILE") - // NewWorld creates a new world object func NewWorld(chunkSize int) *World { - - // Try and load the words file - var lines []string - if file, err := os.Open(wordsFile); err != nil { - log.Printf("Couldn't read words file [%s], running without words: %s\n", wordsFile, err) - } else { - defer file.Close() - scanner := bufio.NewScanner(file) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - if scanner.Err() != nil { - log.Printf("Failure during word file scan: %s\n", scanner.Err()) - } - } - return &World{ Rovers: make(map[string]Rover), CommandQueue: make(map[string]CommandStream), CommandIncoming: make(map[string]CommandStream), Atlas: NewChunkAtlas(chunkSize), - words: lines, TicksPerDay: 24, CurrentTicks: 0, } @@ -78,18 +55,6 @@ func (w *World) SpawnRover() (string, error) { // Initialise the rover rover := DefaultRover() - // Assign a random name if we have words - if len(w.words) > 0 { - for { - // Loop until we find a unique name - name := fmt.Sprintf("%s-%s", w.words[rand.Intn(len(w.words))], w.words[rand.Intn(len(w.words))]) - if _, ok := w.Rovers[name]; !ok { - rover.Name = name - break - } - } - } - // Spawn in a random place near the origin rover.Pos = maths.Vector{ X: 10 - rand.Intn(20), From 04d7a5a4ca7a5ea15a370764adf7847e1e09d682 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:47:54 +0100 Subject: [PATCH 421/495] Fill in the dormant rover log --- pkg/rove/worldgen.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 96ac669..3561768 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -77,11 +77,17 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Set the rover variables r.Pos = v + // For now, mark the log as corrupted + r.AddLogEntryf("log corrupted") + // Marshal the rover data into the object data - obj.Data, err := json.Marshal(r) + b, err := json.Marshal(r) if err == nil { log.Fatalf("couldn't marshal rover, should never fail: %s", err) - } + } + + // Store the bytes + obj.Data = b } return obj From bffad84181974c6c2a0b9e0b7ab8e7af94ff6c31 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:57:12 +0100 Subject: [PATCH 422/495] Don't use noise for rover spawns for now --- pkg/rove/worldgen.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 3561768..af7660f 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -34,7 +34,6 @@ func NewNoiseWorldGen(seed int64) WorldGen { const ( terrainNoiseScale = 6 rockNoiseScale = 3 - dormantRoverScale = 25 ) // GetTile returns the chosen tile at a location @@ -62,8 +61,8 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Very rarely spawn a dormant rover if obj.Type == roveapi.Object_ObjectUnknown { - o = g.noise.Eval2(float64(v.X)/dormantRoverScale, float64(v.Y)/dormantRoverScale) - if o > 0.8 { + // TODO: Make this better, ideally with noise + if v.X%25 == 0 && v.Y%25 == 0 && v.X != 0 && v.Y != 0 { obj.Type = roveapi.Object_RoverDormant } } From 77212c72584427262d459e96415304d850ff6218 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 18:57:22 +0100 Subject: [PATCH 423/495] Fix logic for rover marshal test --- pkg/rove/worldgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index af7660f..e36b7b6 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -81,7 +81,7 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Marshal the rover data into the object data b, err := json.Marshal(r) - if err == nil { + if err != nil { log.Fatalf("couldn't marshal rover, should never fail: %s", err) } From 6c75f07aff6588b0000edc5085b51f4976f81298 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 21 Jul 2020 22:48:16 +0100 Subject: [PATCH 424/495] Remove move and recharge commands in favor of toggle command for the sails --- cmd/rove-server/internal/routes.go | 10 - cmd/rove/main.go | 18 +- cmd/rove/main_test.go | 4 +- pkg/rove/command.go | 3 - pkg/rove/command_test.go | 81 ++------ pkg/rove/world.go | 19 +- proto/roveapi/roveapi.pb.go | 300 +++++++++++++---------------- proto/roveapi/roveapi.proto | 14 +- 8 files changed, 169 insertions(+), 280 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 0fb41d8..393bf93 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -83,10 +83,6 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon Command: i.Command, } switch i.Command { - case roveapi.CommandType_move: - c.Data = &roveapi.Command_Bearing{ - Bearing: i.Bearing, - } case roveapi.CommandType_broadcast: c.Data = &roveapi.Command_Message{ Message: i.Message, @@ -99,10 +95,6 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon Command: q.Command, } switch q.Command { - case roveapi.CommandType_move: - c.Data = &roveapi.Command_Bearing{ - Bearing: q.Bearing, - } case roveapi.CommandType_broadcast: c.Data = &roveapi.Command_Message{ Message: q.Message, @@ -193,8 +185,6 @@ func (s *Server) Command(ctx context.Context, req *roveapi.CommandRequest) (*rov Command: c.Command, } switch c.Command { - case roveapi.CommandType_move: - n.Bearing = c.GetBearing() case roveapi.CommandType_broadcast: n.Message = c.GetMessage() } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index bd98d52..8d94106 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -33,10 +33,9 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") fmt.Fprintln(os.Stderr, "\tversion outputs version info") fmt.Fprintln(os.Stderr, "\nRover commands:") - fmt.Fprintln(os.Stderr, "\tmove BEARING moves the rover in the chosen direction") + fmt.Fprintln(os.Stderr, "\ttoggle toggles the sails, either catching the wind, or charging from the sun") fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") - fmt.Fprintln(os.Stderr, "\trecharge wait a tick to recharge the rover") fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) @@ -225,21 +224,6 @@ func InnerMain(command string, args ...string) error { var commands []*roveapi.Command for i := 0; i < len(args); i++ { switch args[i] { - case "move": - i++ - if len(args) == i { - return fmt.Errorf("move command must be passed bearing") - } - var b roveapi.Bearing - if b = BearingFromString(args[i]); b == roveapi.Bearing_BearingUnknown { - return fmt.Errorf("unrecognised bearing: %s", args[i]) - } - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType_move, - Data: &roveapi.Command_Bearing{Bearing: b}, - }, - ) case "broadcast": i++ if len(args) == i { diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index dd588e1..2eb564c 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -50,12 +50,12 @@ func Test_InnerMain(t *testing.T) { assert.Error(t, InnerMain("command")) // Give it commands - assert.NoError(t, InnerMain("command", "move", "N")) + assert.NoError(t, InnerMain("command", "toggle")) assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) // Give it malformed commands - assert.Error(t, InnerMain("command", "move", "stash")) + assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) } diff --git a/pkg/rove/command.go b/pkg/rove/command.go index e64d646..df49bea 100644 --- a/pkg/rove/command.go +++ b/pkg/rove/command.go @@ -6,9 +6,6 @@ import "github.com/mdiluz/rove/proto/roveapi" type Command struct { Command roveapi.CommandType `json:"command"` - // Used in the move command - Bearing roveapi.Bearing `json:"bearing,omitempty"` - // Used in the broadcast command Message []byte `json:"message,omitempty"` } diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 337782f..7506cd6 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -2,69 +2,28 @@ package rove import ( "testing" - - "github.com/mdiluz/rove/pkg/maths" - "github.com/mdiluz/rove/proto/roveapi" - "github.com/stretchr/testify/assert" ) -func TestCommand_Move(t *testing.T) { - world := NewWorld(8) - a, err := world.SpawnRover() - assert.NoError(t, err) - pos := maths.Vector{ - X: 1.0, - Y: 2.0, - } - - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - // Try the move command - moveCommand := Command{Command: roveapi.CommandType_move, Bearing: roveapi.Bearing_North} - assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to execute move command") - - // Tick the world - world.EnqueueAllIncoming() - world.ExecuteCommandQueues() - - newPos, err := world.RoverPosition(a) - assert.NoError(t, err, "Failed to set position for rover") - pos.Add(maths.Vector{X: 0.0, Y: 1}) - assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") +func TestCommand_Raise(t *testing.T) { + // TODO: Test the raise command } -func TestCommand_Recharge(t *testing.T) { - world := NewWorld(8) - a, err := world.SpawnRover() - assert.NoError(t, err) - pos := maths.Vector{ - X: 1.0, - Y: 2.0, - } - - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - // Move to use up some charge - moveCommand := Command{Command: roveapi.CommandType_move, Bearing: roveapi.Bearing_North} - assert.NoError(t, world.Enqueue(a, moveCommand), "Failed to queue move command") - - // Tick the world - world.EnqueueAllIncoming() - world.ExecuteCommandQueues() - - rover, _ := world.GetRover(a) - assert.Equal(t, rover.MaximumCharge-1, rover.Charge) - - chargeCommand := Command{Command: roveapi.CommandType_recharge} - assert.NoError(t, world.Enqueue(a, chargeCommand), "Failed to queue recharge command") - - // Tick the world - world.EnqueueAllIncoming() - world.ExecuteCommandQueues() - - rover, _ = world.GetRover(a) - assert.Equal(t, rover.MaximumCharge, rover.Charge) - +func TestCommand_Lower(t *testing.T) { + // TODO: Test the lower command +} + +func TestCommand_Stash(t *testing.T) { + // TODO: Test the stash command +} + +func TestCommand_Repair(t *testing.T) { + // TODO: Test the repair command +} + +func TestCommand_Broadcast(t *testing.T) { + // TODO: Test the stash command +} + +func TestCommand_Invalid(t *testing.T) { + // TODO: Test the invalid command } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 25aa933..6658417 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -380,10 +380,6 @@ func (w *World) Enqueue(rover string, commands ...Command) error { // First validate the commands for _, c := range commands { switch c.Command { - case roveapi.CommandType_move: - if c.Bearing == roveapi.Bearing_BearingUnknown { - return fmt.Errorf("bearing must be valid") - } case roveapi.CommandType_broadcast: if len(c.Message) > 3 { return fmt.Errorf("too many characters in message (limit 3): %d", len(c.Message)) @@ -393,9 +389,9 @@ func (w *World) Enqueue(rover string, commands ...Command) error { return fmt.Errorf("invalid message character: %c", b) } } + case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: - case roveapi.CommandType_recharge: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -459,10 +455,8 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { log.Printf("Executing command: %+v for %s\n", *c, rover) switch c.Command { - case roveapi.CommandType_move: - if _, err := w.MoveRover(rover, c.Bearing); err != nil { - return err - } + case roveapi.CommandType_toggle: + // TODO: Toggle the sails case roveapi.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { @@ -481,15 +475,12 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { r.AddLogEntryf("repaired self to %d", r.Integrity) w.Rovers[rover] = r } - case roveapi.CommandType_recharge: - _, err := w.RoverRecharge(rover) - if err != nil { - return err - } + case roveapi.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.Message); err != nil { return err } + default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 783325f..3bd9665 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -39,35 +39,31 @@ type CommandType int32 const ( CommandType_none CommandType = 0 - // Move the rover in a direction, requires bearing - CommandType_move CommandType = 1 + // Toggles the sails, either catching the wind, or charging from the sun + CommandType_toggle CommandType = 1 // Stashes item at current location in rover inventory CommandType_stash CommandType = 2 // Repairs the rover using an inventory object CommandType_repair CommandType = 3 - // Waits a tick to add more charge to the rover - CommandType_recharge CommandType = 4 // Broadcasts a message to nearby rovers - CommandType_broadcast CommandType = 5 + CommandType_broadcast CommandType = 4 ) // Enum value maps for CommandType. var ( CommandType_name = map[int32]string{ 0: "none", - 1: "move", + 1: "toggle", 2: "stash", 3: "repair", - 4: "recharge", - 5: "broadcast", + 4: "broadcast", } CommandType_value = map[string]int32{ "none": 0, - "move": 1, + "toggle": 1, "stash": 2, "repair": 3, - "recharge": 4, - "broadcast": 5, + "broadcast": 4, } ) @@ -560,7 +556,6 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` // Types that are assignable to Data: - // *Command_Bearing // *Command_Message Data isCommand_Data `protobuf_oneof:"data"` } @@ -611,13 +606,6 @@ func (m *Command) GetData() isCommand_Data { return nil } -func (x *Command) GetBearing() Bearing { - if x, ok := x.GetData().(*Command_Bearing); ok { - return x.Bearing - } - return Bearing_BearingUnknown -} - func (x *Command) GetMessage() []byte { if x, ok := x.GetData().(*Command_Message); ok { return x.Message @@ -629,21 +617,13 @@ type isCommand_Data interface { isCommand_Data() } -type Command_Bearing struct { - // A bearing - // Used with MOVE - Bearing Bearing `protobuf:"varint,2,opt,name=bearing,proto3,enum=roveapi.Bearing,oneof"` -} - type Command_Message struct { // A simple message, must be composed of printable ASCII glyphs (32-126) // maximum of three characters // Used with BROADCAST - Message []byte `protobuf:"bytes,3,opt,name=message,proto3,oneof"` + Message []byte `protobuf:"bytes,2,opt,name=message,proto3,oneof"` } -func (*Command_Bearing) isCommand_Data() {} - func (*Command_Message) isCommand_Data() {} // CommandRequest describes a set of commands to be requested for the rover @@ -1197,116 +1177,112 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, - 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, - 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, - 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, 0x0e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, - 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, - 0x73, 0x2a, 0x55, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x6d, 0x6f, - 0x76, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x72, - 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, - 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x47, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, - 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x04, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, - 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, - 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, - 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, - 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, + 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, + 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, + 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x2a, 0x49, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x47, 0x0a, + 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x02, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x57, 0x65, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, + 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, + 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, + 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, + 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, + 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, + 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, + 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, + 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, + 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, + 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1346,32 +1322,31 @@ var file_roveapi_roveapi_proto_goTypes = []interface{}{ var file_roveapi_roveapi_proto_depIdxs = []int32{ 7, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing - 7, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account - 9, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 7, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 7, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 16, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 9, // 10: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command - 9, // 11: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 15, // 12: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 4, // 13: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 6, // 14: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 10, // 15: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 12, // 16: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 14, // 17: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 5, // 18: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 8, // 19: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 11, // 20: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 13, // 21: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 17, // 22: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 18, // [18:23] is the sub-list for method output_type - 13, // [13:18] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 7, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account + 9, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 7, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account + 3, // 5: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 2, // 6: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 7, // 7: roveapi.StatusRequest.account:type_name -> roveapi.Account + 16, // 8: roveapi.StatusResponse.position:type_name -> roveapi.Vector + 9, // 9: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command + 9, // 10: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 15, // 11: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 4, // 12: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 6, // 13: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 10, // 14: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 12, // 15: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 14, // 16: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 5, // 17: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 8, // 18: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 11, // 19: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 13, // 20: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 17, // 21: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 17, // [17:22] is the sub-list for method output_type + 12, // [12:17] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1550,7 +1525,6 @@ func file_roveapi_roveapi_proto_init() { } } file_roveapi_roveapi_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*Command_Bearing)(nil), (*Command_Message)(nil), } type x struct{} diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 566bcfd..96c4609 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -89,16 +89,14 @@ message RegisterResponse { // CommandType defines the type of a command to give to the rover enum CommandType { none = 0; - // Move the rover in a direction, requires bearing - move = 1; + // Toggles the sails, either catching the wind, or charging from the sun + toggle = 1; // Stashes item at current location in rover inventory stash = 2; // Repairs the rover using an inventory object repair = 3; - // Waits a tick to add more charge to the rover - recharge = 4; // Broadcasts a message to nearby rovers - broadcast = 5; + broadcast = 4; } enum Bearing { @@ -116,14 +114,10 @@ message Command { CommandType command = 1; oneof data { - // A bearing - // Used with MOVE - Bearing bearing = 2; - // A simple message, must be composed of printable ASCII glyphs (32-126) // maximum of three characters // Used with BROADCAST - bytes message = 3; + bytes message = 2; } } From 6f30b665c746a87ac7a796e2938e1776263aee3d Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 21 Jul 2020 22:58:59 +0100 Subject: [PATCH 425/495] Make the bearings 8 directional --- proto/roveapi/roveapi.pb.go | 113 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 11 +++- 2 files changed, 73 insertions(+), 51 deletions(-) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 3bd9665..9717407 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -94,15 +94,20 @@ func (CommandType) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{0} } +// Bearing represents a compass direction type Bearing int32 const ( // BearingUnknown an unknown invalid bearing Bearing_BearingUnknown Bearing = 0 Bearing_North Bearing = 1 - Bearing_East Bearing = 2 - Bearing_South Bearing = 3 - Bearing_West Bearing = 4 + Bearing_NorthEast Bearing = 2 + Bearing_East Bearing = 3 + Bearing_SouthEast Bearing = 4 + Bearing_South Bearing = 5 + Bearing_SouthWest Bearing = 6 + Bearing_West Bearing = 7 + Bearing_NorthWest Bearing = 8 ) // Enum value maps for Bearing. @@ -110,16 +115,24 @@ var ( Bearing_name = map[int32]string{ 0: "BearingUnknown", 1: "North", - 2: "East", - 3: "South", - 4: "West", + 2: "NorthEast", + 3: "East", + 4: "SouthEast", + 5: "South", + 6: "SouthWest", + 7: "West", + 8: "NorthWest", } Bearing_value = map[string]int32{ "BearingUnknown": 0, "North": 1, - "East": 2, - "South": 3, - "West": 4, + "NorthEast": 2, + "East": 3, + "SouthEast": 4, + "South": 5, + "SouthWest": 6, + "West": 7, + "NorthWest": 8, } ) @@ -1244,45 +1257,49 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x47, 0x0a, - 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, - 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x02, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, - 0x57, 0x65, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, - 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, - 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, - 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, - 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, - 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, - 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, - 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, - 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, - 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, - 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x83, 0x01, + 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, + 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, + 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, + 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 96c4609..033fcf3 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -99,13 +99,18 @@ enum CommandType { broadcast = 4; } +// Bearing represents a compass direction enum Bearing { // BearingUnknown an unknown invalid bearing BearingUnknown = 0; North = 1; - East = 2; - South = 3; - West = 4; + NorthEast = 2; + East = 3; + SouthEast = 4; + South = 5; + SouthWest = 6; + West = 7; + NorthWest = 8; } // Command is a single command for a rover From f78efd122384aea4da96915897ac466a8942017b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 21 Jul 2020 23:12:50 +0100 Subject: [PATCH 426/495] Add SailPosition to the rover and implement toggle command This also converts the commands to use the proto type for simplicity --- cmd/rove-server/internal/routes.go | 45 +-- cmd/rove/main.go | 25 +- pkg/maths/vector.go | 8 + pkg/rove/command.go | 14 - pkg/rove/command_test.go | 43 ++- pkg/rove/rover.go | 11 +- pkg/rove/world.go | 92 +++++- pkg/rove/world_test.go | 4 +- proto/roveapi/roveapi.pb.go | 462 ++++++++++++++++++----------- proto/roveapi/roveapi.proto | 53 +++- 10 files changed, 490 insertions(+), 267 deletions(-) delete mode 100644 pkg/rove/command.go diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 393bf93..19a5fef 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -5,7 +5,6 @@ import ( "fmt" "log" - "github.com/mdiluz/rove/pkg/rove" "github.com/mdiluz/rove/pkg/version" "github.com/mdiluz/rove/proto/roveapi" ) @@ -76,31 +75,13 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon inv = append(inv, byte(i.Type)) } - i, q := s.world.RoverCommands(resp) + in, qu := s.world.RoverCommands(resp) var incoming, queued []*roveapi.Command - for _, i := range i { - c := &roveapi.Command{ - Command: i.Command, - } - switch i.Command { - case roveapi.CommandType_broadcast: - c.Data = &roveapi.Command_Message{ - Message: i.Message, - } - } - incoming = append(incoming, c) + for i := range in { + incoming = append(incoming, &in[i]) } - for _, q := range q { - c := &roveapi.Command{ - Command: q.Command, - } - switch q.Command { - case roveapi.CommandType_broadcast: - c.Data = &roveapi.Command_Message{ - Message: q.Message, - } - } - queued = append(queued, c) + for i := range qu { + queued = append(queued, &qu[i]) } var logs []*roveapi.Log for _, log := range rover.Logs { @@ -116,6 +97,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon X: int32(rover.Pos.X), Y: int32(rover.Pos.Y), }, + Bearing: rover.Bearing, Range: int32(rover.Range), Inventory: inv, Capacity: int32(rover.Capacity), @@ -125,6 +107,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon MaximumCharge: int32(rover.MaximumCharge), IncomingCommands: incoming, QueuedCommands: queued, + SailPosition: rover.SailPosition, Logs: logs, } } @@ -179,19 +162,7 @@ func (s *Server) Command(ctx context.Context, req *roveapi.CommandRequest) (*rov return nil, err } - var cmds []rove.Command - for _, c := range req.Commands { - n := rove.Command{ - Command: c.Command, - } - switch c.Command { - case roveapi.CommandType_broadcast: - n.Message = c.GetMessage() - } - cmds = append(cmds, n) - } - - if err := s.world.Enqueue(resp, cmds...); err != nil { + if err := s.world.Enqueue(resp, req.Commands...); err != nil { return nil, err } diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8d94106..51038a7 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -127,12 +127,20 @@ func BearingFromString(s string) roveapi.Bearing { switch s { case "N": return roveapi.Bearing_North + case "NE": + return roveapi.Bearing_NorthEast case "E": return roveapi.Bearing_East + case "SE": + return roveapi.Bearing_SouthEast case "S": return roveapi.Bearing_South + case "SW": + return roveapi.Bearing_SouthWest case "W": return roveapi.Bearing_West + case "NW": + return roveapi.Bearing_NorthWest } return roveapi.Bearing_BearingUnknown } @@ -224,6 +232,21 @@ func InnerMain(command string, args ...string) error { var commands []*roveapi.Command for i := 0; i < len(args); i++ { switch args[i] { + case "turn": + i++ + if len(args) == i { + return fmt.Errorf("turn command must be passed a compass bearing") + } + b := BearingFromString(args[i]) + if b == roveapi.Bearing_BearingUnknown { + return fmt.Errorf("turn command must be given a valid bearing %s", args[i]) + } + commands = append(commands, + &roveapi.Command{ + Command: roveapi.CommandType_broadcast, + Data: &roveapi.Command_Broadcast{Broadcast: []byte(args[i])}, + }, + ) case "broadcast": i++ if len(args) == i { @@ -234,7 +257,7 @@ func InnerMain(command string, args ...string) error { commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType_broadcast, - Data: &roveapi.Command_Message{Message: []byte(args[i])}, + Data: &roveapi.Command_Broadcast{Broadcast: []byte(args[i])}, }, ) default: diff --git a/pkg/maths/vector.go b/pkg/maths/vector.go index 8a63708..92305cc 100644 --- a/pkg/maths/vector.go +++ b/pkg/maths/vector.go @@ -89,12 +89,20 @@ func BearingToVector(b roveapi.Bearing) Vector { switch b { case roveapi.Bearing_North: return Vector{Y: 1} + case roveapi.Bearing_NorthEast: + return Vector{X: 1, Y: 1} case roveapi.Bearing_East: return Vector{X: 1} + case roveapi.Bearing_SouthEast: + return Vector{X: 1, Y: -1} case roveapi.Bearing_South: return Vector{Y: -1} + case roveapi.Bearing_SouthWest: + return Vector{X: -1, Y: -1} case roveapi.Bearing_West: return Vector{X: -1} + case roveapi.Bearing_NorthWest: + return Vector{X: -1, Y: 1} } return Vector{} diff --git a/pkg/rove/command.go b/pkg/rove/command.go deleted file mode 100644 index df49bea..0000000 --- a/pkg/rove/command.go +++ /dev/null @@ -1,14 +0,0 @@ -package rove - -import "github.com/mdiluz/rove/proto/roveapi" - -// Command represends a single command to execute -type Command struct { - Command roveapi.CommandType `json:"command"` - - // Used in the broadcast command - Message []byte `json:"message,omitempty"` -} - -// CommandStream is a list of commands to execute in order -type CommandStream []Command diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 7506cd6..c7990d1 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -2,14 +2,49 @@ package rove import ( "testing" + + "github.com/mdiluz/rove/proto/roveapi" + "github.com/stretchr/testify/assert" ) -func TestCommand_Raise(t *testing.T) { - // TODO: Test the raise command +func TestCommand_Toggle(t *testing.T) { + w := NewWorld(8) + a, err := w.SpawnRover() + assert.NoError(t, err) + + r, err := w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) + + w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + w.EnqueueAllIncoming() + w.ExecuteCommandQueues() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) + + w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + w.EnqueueAllIncoming() + w.ExecuteCommandQueues() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) } -func TestCommand_Lower(t *testing.T) { - // TODO: Test the lower command +func TestCommand_Turn(t *testing.T) { + w := NewWorld(8) + a, err := w.SpawnRover() + assert.NoError(t, err) + + w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Data: &roveapi.Command_Turn{Turn: roveapi.Bearing_NorthWest}}) + w.EnqueueAllIncoming() + w.ExecuteCommandQueues() + + r, err := w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.Bearing_NorthWest, r.Bearing) } func TestCommand_Stash(t *testing.T) { diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 6968c57..36b875f 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -10,6 +10,7 @@ import ( "github.com/google/uuid" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/proto/roveapi" ) // RoverLogEntry describes a single log entry for the rover @@ -29,6 +30,9 @@ type Rover struct { // Pos represents where this rover is in the world Pos maths.Vector `json:"pos"` + // Bearing is the current direction the rover is facing + Bearing roveapi.Bearing `json:"bearing"` + // Range represents the distance the unit's radar can see Range int `json:"range"` @@ -48,7 +52,10 @@ type Rover struct { Charge int `json:"charge"` // MaximumCharge is the maximum charge able to be stored - MaximumCharge int `json:"maximum-Charge"` + MaximumCharge int `json:"maximum-charge"` + + // SailPosition is the current position of the sails + SailPosition roveapi.SailPosition `json:"sail-position"` // Logs Stores log of information Logs []RoverLogEntry `json:"logs"` @@ -63,6 +70,8 @@ func DefaultRover() Rover { Capacity: 10, Charge: 10, MaximumCharge: 10, + Bearing: roveapi.Bearing_North, + SailPosition: roveapi.SailPosition_SolarCharging, Name: GenerateRoverName(), } } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 6658417..43fbe83 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -10,6 +10,9 @@ import ( "github.com/mdiluz/rove/proto/roveapi" ) +// CommandStream is a list of commands to execute in order +type CommandStream []roveapi.Command + // World describes a self contained universe and everything in it type World struct { // TicksPerDay is the amount of ticks in a single day @@ -305,6 +308,45 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { return obj.Type, nil } +// RoverToggle will toggle the sail position +func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return roveapi.SailPosition_UnknownSailPosition, fmt.Errorf("no rover matching id") + } + + // Swap the sail position + switch r.SailPosition { + case roveapi.SailPosition_CatchingWind: + r.SailPosition = roveapi.SailPosition_SolarCharging + case roveapi.SailPosition_SolarCharging: + r.SailPosition = roveapi.SailPosition_CatchingWind + } + + w.Rovers[rover] = r + return r.SailPosition, nil +} + +// RoverTurn will turn the rover +func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearing, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return roveapi.Bearing_BearingUnknown, fmt.Errorf("no rover matching id") + } + + // Set the new bearing + r.Bearing = bearing + + w.Rovers[rover] = r + return r.Bearing, nil +} + // RadarFromRover can be used to query what a rover can currently see func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []roveapi.Object, err error) { w.worldMutex.RLock() @@ -364,7 +406,7 @@ func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []rovea } // RoverCommands returns current commands for the given rover -func (w *World) RoverCommands(rover string) (incoming []Command, queued []Command) { +func (w *World) RoverCommands(rover string) (incoming []roveapi.Command, queued []roveapi.Command) { if c, ok := w.CommandIncoming[rover]; ok { incoming = c } @@ -375,20 +417,24 @@ func (w *World) RoverCommands(rover string) (incoming []Command, queued []Comman } // Enqueue will queue the commands given -func (w *World) Enqueue(rover string, commands ...Command) error { +func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { // First validate the commands for _, c := range commands { switch c.Command { case roveapi.CommandType_broadcast: - if len(c.Message) > 3 { - return fmt.Errorf("too many characters in message (limit 3): %d", len(c.Message)) + if len(c.GetBroadcast()) > 3 { + return fmt.Errorf("too many characters in message (limit 3): %d", len(c.GetBroadcast())) } - for _, b := range c.Message { + for _, b := range c.GetBroadcast() { if b < 37 || b > 126 { return fmt.Errorf("invalid message character: %c", b) } } + case roveapi.CommandType_turn: + if c.GetTurn() == roveapi.Bearing_BearingUnknown { + return fmt.Errorf("turn command given unknown bearing") + } case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: @@ -403,7 +449,17 @@ func (w *World) Enqueue(rover string, commands ...Command) error { defer w.cmdMutex.Unlock() // Override the incoming command set - w.CommandIncoming[rover] = commands + var cmds []roveapi.Command + for _, c := range commands { + // Copy the command and data but none of the locks or internals + cmds = append(cmds, + roveapi.Command{ + Command: c.Command, + Data: c.Data, + }) + } + + w.CommandIncoming[rover] = cmds return nil } @@ -427,16 +483,16 @@ func (w *World) ExecuteCommandQueues() { // Iterate through all the current commands for rover, cmds := range w.CommandQueue { if len(cmds) != 0 { - // Extract the first command in the queue - c := cmds[0] - w.CommandQueue[rover] = cmds[1:] // Execute the command - if err := w.ExecuteCommand(&c, rover); err != nil { + if err := w.ExecuteCommand(&cmds[0], rover); err != nil { log.Println(err) // TODO: Report this error somehow } + // Extract the first command in the queue + w.CommandQueue[rover] = cmds[1:] + } else { // Clean out the empty entry delete(w.CommandQueue, rover) @@ -451,13 +507,14 @@ func (w *World) ExecuteCommandQueues() { } // ExecuteCommand will execute a single command -func (w *World) ExecuteCommand(c *Command, rover string) (err error) { - log.Printf("Executing command: %+v for %s\n", *c, rover) +func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { + log.Printf("Executing command: %+v for %s\n", c.Command, rover) switch c.Command { case roveapi.CommandType_toggle: - // TODO: Toggle the sails - + if _, err := w.RoverToggle(rover); err != nil { + return err + } case roveapi.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { return err @@ -477,7 +534,12 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { } case roveapi.CommandType_broadcast: - if err := w.RoverBroadcast(rover, c.Message); err != nil { + if err := w.RoverBroadcast(rover, c.GetBroadcast()); err != nil { + return err + } + + case roveapi.CommandType_turn: + if _, err := w.RoverTurn(rover, c.GetTurn()); err != nil { return err } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index f393f3d..ffac1af 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -269,7 +269,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") - err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) + err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) @@ -283,7 +283,7 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "Failed to stash") assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") - err = world.ExecuteCommand(&Command{Command: roveapi.CommandType_repair}, a) + err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") newinfo, err = world.GetRover(a) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 9717407..cee8615 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -41,12 +41,14 @@ const ( CommandType_none CommandType = 0 // Toggles the sails, either catching the wind, or charging from the sun CommandType_toggle CommandType = 1 + // Turns the rover in the specified bearing, requires data + CommandType_turn CommandType = 2 // Stashes item at current location in rover inventory - CommandType_stash CommandType = 2 + CommandType_stash CommandType = 3 // Repairs the rover using an inventory object - CommandType_repair CommandType = 3 - // Broadcasts a message to nearby rovers - CommandType_broadcast CommandType = 4 + CommandType_repair CommandType = 4 + // Broadcasts a message to nearby rovers, requires data + CommandType_broadcast CommandType = 5 ) // Enum value maps for CommandType. @@ -54,16 +56,18 @@ var ( CommandType_name = map[int32]string{ 0: "none", 1: "toggle", - 2: "stash", - 3: "repair", - 4: "broadcast", + 2: "turn", + 3: "stash", + 4: "repair", + 5: "broadcast", } CommandType_value = map[string]int32{ "none": 0, "toggle": 1, - "stash": 2, - "repair": 3, - "broadcast": 4, + "turn": 2, + "stash": 3, + "repair": 4, + "broadcast": 5, } ) @@ -280,6 +284,58 @@ func (Tile) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } +// SailPosition represents the position of the sola sail +type SailPosition int32 + +const ( + SailPosition_UnknownSailPosition SailPosition = 0 + // CatchingWind means the sail is catching the wind and moving the rover + SailPosition_CatchingWind SailPosition = 1 + // SolarCharging means the sail is facing the sun and charging + SailPosition_SolarCharging SailPosition = 2 +) + +// Enum value maps for SailPosition. +var ( + SailPosition_name = map[int32]string{ + 0: "UnknownSailPosition", + 1: "CatchingWind", + 2: "SolarCharging", + } + SailPosition_value = map[string]int32{ + "UnknownSailPosition": 0, + "CatchingWind": 1, + "SolarCharging": 2, + } +) + +func (x SailPosition) Enum() *SailPosition { + p := new(SailPosition) + *p = x + return p +} + +func (x SailPosition) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SailPosition) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() +} + +func (SailPosition) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[4] +} + +func (x SailPosition) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SailPosition.Descriptor instead. +func (SailPosition) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} +} + // ServerStatusRequest is an empty placeholder type ServerStatusRequest struct { state protoimpl.MessageState @@ -569,7 +625,8 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` // Types that are assignable to Data: - // *Command_Message + // *Command_Broadcast + // *Command_Turn Data isCommand_Data `protobuf_oneof:"data"` } @@ -619,25 +676,38 @@ func (m *Command) GetData() isCommand_Data { return nil } -func (x *Command) GetMessage() []byte { - if x, ok := x.GetData().(*Command_Message); ok { - return x.Message +func (x *Command) GetBroadcast() []byte { + if x, ok := x.GetData().(*Command_Broadcast); ok { + return x.Broadcast } return nil } +func (x *Command) GetTurn() Bearing { + if x, ok := x.GetData().(*Command_Turn); ok { + return x.Turn + } + return Bearing_BearingUnknown +} + type isCommand_Data interface { isCommand_Data() } -type Command_Message struct { +type Command_Broadcast struct { // A simple message, must be composed of printable ASCII glyphs (32-126) // maximum of three characters - // Used with BROADCAST - Message []byte `protobuf:"bytes,2,opt,name=message,proto3,oneof"` + Broadcast []byte `protobuf:"bytes,2,opt,name=broadcast,proto3,oneof"` } -func (*Command_Message) isCommand_Data() {} +type Command_Turn struct { + // The bearing for the rover to turn to + Turn Bearing `protobuf:"varint,3,opt,name=turn,proto3,enum=roveapi.Bearing,oneof"` +} + +func (*Command_Broadcast) isCommand_Data() {} + +func (*Command_Turn) isCommand_Data() {} // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { @@ -1026,26 +1096,30 @@ type StatusResponse struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Position of the rover in world coordinates Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` + // The current direction of the rover + Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` // The range of this rover's radar and broadcasting - Range int32 `protobuf:"varint,3,opt,name=range,proto3" json:"range,omitempty"` + Range int32 `protobuf:"varint,4,opt,name=range,proto3" json:"range,omitempty"` // The items in the rover inventory - Inventory []byte `protobuf:"bytes,4,opt,name=inventory,proto3" json:"inventory,omitempty"` + Inventory []byte `protobuf:"bytes,5,opt,name=inventory,proto3" json:"inventory,omitempty"` // The capacity of the inventory - Capacity int32 `protobuf:"varint,5,opt,name=capacity,proto3" json:"capacity,omitempty"` + Capacity int32 `protobuf:"varint,6,opt,name=capacity,proto3" json:"capacity,omitempty"` // The current health of the rover - Integrity int32 `protobuf:"varint,6,opt,name=integrity,proto3" json:"integrity,omitempty"` + Integrity int32 `protobuf:"varint,7,opt,name=integrity,proto3" json:"integrity,omitempty"` // The maximum health of the rover - MaximumIntegrity int32 `protobuf:"varint,7,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` + MaximumIntegrity int32 `protobuf:"varint,8,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` // The energy stored in the rover - Charge int32 `protobuf:"varint,8,opt,name=charge,proto3" json:"charge,omitempty"` + Charge int32 `protobuf:"varint,9,opt,name=charge,proto3" json:"charge,omitempty"` // The max energy the rover can store - MaximumCharge int32 `protobuf:"varint,9,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` + MaximumCharge int32 `protobuf:"varint,10,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` + // The current position of the sails + SailPosition SailPosition `protobuf:"varint,11,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` // The set of currently incoming commands for this tick - IncomingCommands []*Command `protobuf:"bytes,10,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` + IncomingCommands []*Command `protobuf:"bytes,12,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` // The set of currently queued commands - QueuedCommands []*Command `protobuf:"bytes,11,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` + QueuedCommands []*Command `protobuf:"bytes,13,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` // The most recent logs - Logs []*Log `protobuf:"bytes,12,rep,name=logs,proto3" json:"logs,omitempty"` + Logs []*Log `protobuf:"bytes,14,rep,name=logs,proto3" json:"logs,omitempty"` } func (x *StatusResponse) Reset() { @@ -1094,6 +1168,13 @@ func (x *StatusResponse) GetPosition() *Vector { return nil } +func (x *StatusResponse) GetBearing() Bearing { + if x != nil { + return x.Bearing + } + return Bearing_BearingUnknown +} + func (x *StatusResponse) GetRange() int32 { if x != nil { return x.Range @@ -1143,6 +1224,13 @@ func (x *StatusResponse) GetMaximumCharge() int32 { return 0 } +func (x *StatusResponse) GetSailPosition() SailPosition { + if x != nil { + return x.SailPosition + } + return SailPosition_UnknownSailPosition +} + func (x *StatusResponse) GetIncomingCommands() []*Command { if x != nil { return x.IncomingCommands @@ -1190,116 +1278,131 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x89, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x09, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x42, 0x06, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xc3, 0x03, 0x0a, - 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, - 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, + 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xaa, 0x04, 0x0a, 0x0e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, + 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x10, + 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, - 0x67, 0x73, 0x2a, 0x49, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, - 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, - 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x04, 0x2a, 0x83, 0x01, - 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, - 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, - 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, - 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, - 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, - 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, - 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, + 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, + 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, + 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, + 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, + 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, + 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, + 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, + 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, + 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, + 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1314,56 +1417,60 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing (Object)(0), // 2: roveapi.Object (Tile)(0), // 3: roveapi.Tile - (*ServerStatusRequest)(nil), // 4: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 5: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 6: roveapi.RegisterRequest - (*Account)(nil), // 7: roveapi.Account - (*RegisterResponse)(nil), // 8: roveapi.RegisterResponse - (*Command)(nil), // 9: roveapi.Command - (*CommandRequest)(nil), // 10: roveapi.CommandRequest - (*CommandResponse)(nil), // 11: roveapi.CommandResponse - (*RadarRequest)(nil), // 12: roveapi.RadarRequest - (*RadarResponse)(nil), // 13: roveapi.RadarResponse - (*StatusRequest)(nil), // 14: roveapi.StatusRequest - (*Log)(nil), // 15: roveapi.Log - (*Vector)(nil), // 16: roveapi.Vector - (*StatusResponse)(nil), // 17: roveapi.StatusResponse + (SailPosition)(0), // 4: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest + (*Account)(nil), // 8: roveapi.Account + (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse + (*Command)(nil), // 10: roveapi.Command + (*CommandRequest)(nil), // 11: roveapi.CommandRequest + (*CommandResponse)(nil), // 12: roveapi.CommandResponse + (*RadarRequest)(nil), // 13: roveapi.RadarRequest + (*RadarResponse)(nil), // 14: roveapi.RadarResponse + (*StatusRequest)(nil), // 15: roveapi.StatusRequest + (*Log)(nil), // 16: roveapi.Log + (*Vector)(nil), // 17: roveapi.Vector + (*StatusResponse)(nil), // 18: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 7, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 7, // 2: roveapi.CommandRequest.account:type_name -> roveapi.Account - 9, // 3: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 7, // 4: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 5: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 6: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 7, // 7: roveapi.StatusRequest.account:type_name -> roveapi.Account - 16, // 8: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 9, // 9: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command - 9, // 10: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 15, // 11: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 4, // 12: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 6, // 13: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 10, // 14: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 12, // 15: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 14, // 16: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 5, // 17: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 8, // 18: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 11, // 19: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 13, // 20: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 17, // 21: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 17, // [17:22] is the sub-list for method output_type - 12, // [12:17] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 1, // 2: roveapi.Command.turn:type_name -> roveapi.Bearing + 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account + 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account + 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account + 17, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector + 1, // 10: roveapi.StatusResponse.bearing:type_name -> roveapi.Bearing + 4, // 11: roveapi.StatusResponse.sailPosition:type_name -> roveapi.SailPosition + 10, // 12: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command + 10, // 13: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 16, // 14: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 5, // 15: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 16: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 17: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 18: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 19: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 20: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 21: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 22: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 23: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 18, // 24: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 20, // [20:25] is the sub-list for method output_type + 15, // [15:20] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1542,14 +1649,15 @@ func file_roveapi_roveapi_proto_init() { } } file_roveapi_roveapi_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*Command_Message)(nil), + (*Command_Broadcast)(nil), + (*Command_Turn)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 4, + NumEnums: 5, NumMessages: 14, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 033fcf3..9f13a17 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -91,12 +91,14 @@ enum CommandType { none = 0; // Toggles the sails, either catching the wind, or charging from the sun toggle = 1; + // Turns the rover in the specified bearing, requires data + turn = 2; // Stashes item at current location in rover inventory - stash = 2; + stash = 3; // Repairs the rover using an inventory object - repair = 3; - // Broadcasts a message to nearby rovers - broadcast = 4; + repair = 4; + // Broadcasts a message to nearby rovers, requires data + broadcast = 5; } // Bearing represents a compass direction @@ -121,8 +123,10 @@ message Command { oneof data { // A simple message, must be composed of printable ASCII glyphs (32-126) // maximum of three characters - // Used with BROADCAST - bytes message = 2; + bytes broadcast = 2; + + // The bearing for the rover to turn to + Bearing turn = 3; } } @@ -218,6 +222,17 @@ message Vector { int32 y = 2; } +// SailPosition represents the position of the sola sail +enum SailPosition { + UnknownSailPosition = 0; + + // CatchingWind means the sail is catching the wind and moving the rover + CatchingWind = 1; + + // SolarCharging means the sail is facing the sun and charging + SolarCharging = 2; +} + // StatusResponse is the response given to a status request message StatusResponse { // The name of the rover @@ -226,33 +241,39 @@ message StatusResponse { // Position of the rover in world coordinates Vector position = 2; + // The current direction of the rover + Bearing bearing = 3; + // The range of this rover's radar and broadcasting - int32 range = 3; + int32 range = 4; // The items in the rover inventory - bytes inventory = 4; + bytes inventory = 5; // The capacity of the inventory - int32 capacity = 5; + int32 capacity = 6; // The current health of the rover - int32 integrity = 6; + int32 integrity = 7; // The maximum health of the rover - int32 maximumIntegrity = 7; + int32 maximumIntegrity = 8; // The energy stored in the rover - int32 charge = 8; + int32 charge = 9; // The max energy the rover can store - int32 maximumCharge = 9; + int32 maximumCharge = 10; + + // The current position of the sails + SailPosition sailPosition = 11; // The set of currently incoming commands for this tick - repeated Command incomingCommands = 10; + repeated Command incomingCommands = 12; // The set of currently queued commands - repeated Command queuedCommands = 11; + repeated Command queuedCommands = 13; // The most recent logs - repeated Log logs = 12; + repeated Log logs = 14; } \ No newline at end of file From 8667f551438cc66e8aa1b1dbbe1ec7f37c0dc8ff Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Tue, 21 Jul 2020 23:52:14 +0100 Subject: [PATCH 427/495] Simplify by making command streams pointer lists like in proto --- cmd/rove-server/internal/routes.go | 9 +- cmd/rove/main.go | 8 +- pkg/rove/command_test.go | 2 +- pkg/rove/world.go | 19 +- proto/roveapi/roveapi.pb.go | 286 +++++++++++++---------------- proto/roveapi/roveapi.proto | 12 +- 6 files changed, 143 insertions(+), 193 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 19a5fef..02a7483 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -75,14 +75,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon inv = append(inv, byte(i.Type)) } - in, qu := s.world.RoverCommands(resp) - var incoming, queued []*roveapi.Command - for i := range in { - incoming = append(incoming, &in[i]) - } - for i := range qu { - queued = append(queued, &qu[i]) - } + incoming, queued := s.world.RoverCommands(resp) var logs []*roveapi.Log for _, log := range rover.Logs { logs = append(logs, &roveapi.Log{ diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 51038a7..2977baa 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -243,8 +243,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Data: &roveapi.Command_Broadcast{Broadcast: []byte(args[i])}, + Command: roveapi.CommandType_broadcast, + Broadcast: []byte(args[i]), }, ) case "broadcast": @@ -256,8 +256,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Data: &roveapi.Command_Broadcast{Broadcast: []byte(args[i])}, + Command: roveapi.CommandType_broadcast, + Broadcast: []byte(args[i]), }, ) default: diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index c7990d1..26c5e56 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -38,7 +38,7 @@ func TestCommand_Turn(t *testing.T) { a, err := w.SpawnRover() assert.NoError(t, err) - w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Data: &roveapi.Command_Turn{Turn: roveapi.Bearing_NorthWest}}) + w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) w.EnqueueAllIncoming() w.ExecuteCommandQueues() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 43fbe83..5e8483f 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,7 +11,7 @@ import ( ) // CommandStream is a list of commands to execute in order -type CommandStream []roveapi.Command +type CommandStream []*roveapi.Command // World describes a self contained universe and everything in it type World struct { @@ -406,7 +406,7 @@ func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []rovea } // RoverCommands returns current commands for the given rover -func (w *World) RoverCommands(rover string) (incoming []roveapi.Command, queued []roveapi.Command) { +func (w *World) RoverCommands(rover string) (incoming CommandStream, queued CommandStream) { if c, ok := w.CommandIncoming[rover]; ok { incoming = c } @@ -448,18 +448,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() - // Override the incoming command set - var cmds []roveapi.Command - for _, c := range commands { - // Copy the command and data but none of the locks or internals - cmds = append(cmds, - roveapi.Command{ - Command: c.Command, - Data: c.Data, - }) - } - - w.CommandIncoming[rover] = cmds + w.CommandIncoming[rover] = commands return nil } @@ -485,7 +474,7 @@ func (w *World) ExecuteCommandQueues() { if len(cmds) != 0 { // Execute the command - if err := w.ExecuteCommand(&cmds[0], rover); err != nil { + if err := w.ExecuteCommand(cmds[0], rover); err != nil { log.Println(err) // TODO: Report this error somehow } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index cee8615..51a886f 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -624,10 +624,11 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // Types that are assignable to Data: - // *Command_Broadcast - // *Command_Turn - Data isCommand_Data `protobuf_oneof:"data"` + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + Broadcast []byte `protobuf:"bytes,2,opt,name=broadcast,proto3" json:"broadcast,omitempty"` + // The bearing for the rover to turn to + Turn Bearing `protobuf:"varint,3,opt,name=turn,proto3,enum=roveapi.Bearing" json:"turn,omitempty"` } func (x *Command) Reset() { @@ -669,46 +670,20 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } -func (m *Command) GetData() isCommand_Data { - if m != nil { - return m.Data - } - return nil -} - func (x *Command) GetBroadcast() []byte { - if x, ok := x.GetData().(*Command_Broadcast); ok { + if x != nil { return x.Broadcast } return nil } func (x *Command) GetTurn() Bearing { - if x, ok := x.GetData().(*Command_Turn); ok { + if x != nil { return x.Turn } return Bearing_BearingUnknown } -type isCommand_Data interface { - isCommand_Data() -} - -type Command_Broadcast struct { - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - Broadcast []byte `protobuf:"bytes,2,opt,name=broadcast,proto3,oneof"` -} - -type Command_Turn struct { - // The bearing for the rover to turn to - Turn Bearing `protobuf:"varint,3,opt,name=turn,proto3,enum=roveapi.Bearing,oneof"` -} - -func (*Command_Broadcast) isCommand_Data() {} - -func (*Command_Turn) isCommand_Data() {} - // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1278,131 +1253,130 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x89, 0x01, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x09, 0x62, 0x72, 0x6f, 0x61, - 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x42, 0x06, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xaa, 0x04, 0x0a, 0x0e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, - 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, - 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x10, - 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, - 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, - 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, - 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, - 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, - 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, - 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, - 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, - 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, - 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, - 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, - 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xaa, 0x04, 0x0a, + 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, + 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, + 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, + 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, + 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, + 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, + 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, + 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, + 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, + 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, + 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, + 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1648,10 +1622,6 @@ func file_roveapi_roveapi_proto_init() { } } } - file_roveapi_roveapi_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*Command_Broadcast)(nil), - (*Command_Turn)(nil), - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 9f13a17..9ca09d8 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -120,14 +120,12 @@ message Command { // The command type CommandType command = 1; - oneof data { - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - bytes broadcast = 2; + // A simple message, must be composed of printable ASCII glyphs (32-126) + // maximum of three characters + bytes broadcast = 2; - // The bearing for the rover to turn to - Bearing turn = 3; - } + // The bearing for the rover to turn to + Bearing turn = 3; } // CommandRequest describes a set of commands to be requested for the rover From 6b5d5abea174039e17efe1de2ee26aaa897158f6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 19:24:36 +0100 Subject: [PATCH 428/495] Rename the world tick function and set the tick rate back to default --- cmd/rove-server/internal/server.go | 4 ++-- docker-compose.yml | 1 - pkg/rove/command_test.go | 6 +++--- pkg/rove/world.go | 4 ++-- pkg/rove/world_test.go | 4 ++-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 102c30d..786eb00 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -131,8 +131,8 @@ func (s *Server) Run() { log.Println("Executing server tick") - // Run the command queues - s.world.ExecuteCommandQueues() + // Tick the world + s.world.Tick() // Save out the new world state if err := s.SaveWorld(); err != nil { diff --git a/docker-compose.yml b/docker-compose.yml index 71013b5..509af03 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,6 @@ services: - PORT=9090 - DATA_PATH=/mnt/rove-server - WORDS_FILE=data/words_alpha.txt - - TICK_RATE=5 volumes: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 26c5e56..773b098 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -18,7 +18,7 @@ func TestCommand_Toggle(t *testing.T) { w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) w.EnqueueAllIncoming() - w.ExecuteCommandQueues() + w.Tick() r, err = w.GetRover(a) assert.NoError(t, err) @@ -26,7 +26,7 @@ func TestCommand_Toggle(t *testing.T) { w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) w.EnqueueAllIncoming() - w.ExecuteCommandQueues() + w.Tick() r, err = w.GetRover(a) assert.NoError(t, err) @@ -40,7 +40,7 @@ func TestCommand_Turn(t *testing.T) { w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) w.EnqueueAllIncoming() - w.ExecuteCommandQueues() + w.Tick() r, err := w.GetRover(a) assert.NoError(t, err) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 5e8483f..e50fa6f 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -464,8 +464,8 @@ func (w *World) EnqueueAllIncoming() { w.CommandIncoming = make(map[string]CommandStream) } -// ExecuteCommandQueues will execute any commands in the current command queue -func (w *World) ExecuteCommandQueues() { +// Tick will execute any commands in the current command queue and tick the world +func (w *World) Tick() { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index ffac1af..785baa2 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -343,7 +343,7 @@ func TestWorld_Daytime(t *testing.T) { // Loop for half the day for i := 0; i < world.TicksPerDay/2; i++ { assert.True(t, world.Daytime()) - world.ExecuteCommandQueues() + world.Tick() } // Remove rover charge again @@ -359,7 +359,7 @@ func TestWorld_Daytime(t *testing.T) { // Loop for half the day for i := 0; i < world.TicksPerDay/2; i++ { assert.False(t, world.Daytime()) - world.ExecuteCommandQueues() + world.Tick() } } From 447dbe358273d0a08b5ec8cbf354a8a0c9d66241 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 19:24:55 +0100 Subject: [PATCH 429/495] Fix a test comment --- pkg/rove/command_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 773b098..f22f797 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -60,5 +60,5 @@ func TestCommand_Broadcast(t *testing.T) { } func TestCommand_Invalid(t *testing.T) { - // TODO: Test the invalid command + // TODO: Test an invalid command } From 9e4276439841be819efe77b4b9ff877cad899a30 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 19:25:32 +0100 Subject: [PATCH 430/495] Update the rover list to a list of pointers --- pkg/rove/rover.go | 4 ++-- pkg/rove/world.go | 15 +++------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 36b875f..f1e0972 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -62,8 +62,8 @@ type Rover struct { } // DefaultRover returns a default rover object with default settings -func DefaultRover() Rover { - return Rover{ +func DefaultRover() *Rover { + return &Rover{ Range: 4, Integrity: 10, MaximumIntegrity: 10, diff --git a/pkg/rove/world.go b/pkg/rove/world.go index e50fa6f..10fae64 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -22,7 +22,7 @@ type World struct { CurrentTicks int `json:"current-ticks"` // Rovers is a id->data map of all the rovers in the game - Rovers map[string]Rover `json:"rovers"` + Rovers map[string]*Rover `json:"rovers"` // Atlas represends the world map of chunks and tiles Atlas Atlas `json:"atlas"` @@ -41,7 +41,7 @@ type World struct { // NewWorld creates a new world object func NewWorld(chunkSize int) *World { return &World{ - Rovers: make(map[string]Rover), + Rovers: make(map[string]*Rover), CommandQueue: make(map[string]CommandStream), CommandIncoming: make(map[string]CommandStream), Atlas: NewChunkAtlas(chunkSize), @@ -94,7 +94,7 @@ func (w *World) GetRover(rover string) (Rover, error) { if !ok { return Rover{}, fmt.Errorf("Failed to find rover with name: %s", rover) } - return i, nil + return *i, nil } // RoverRecharge charges up a rover @@ -117,7 +117,6 @@ func (w *World) RoverRecharge(rover string) (int, error) { i.Charge++ i.AddLogEntryf("recharged to %d", i.Charge) } - w.Rovers[rover] = i return i.Charge, nil } @@ -152,7 +151,6 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) { } i.AddLogEntryf("broadcasted %s", string(message)) - w.Rovers[rover] = i return } @@ -193,7 +191,6 @@ func (w *World) SetRoverPosition(rover string, pos maths.Vector) error { } i.Pos = pos - w.Rovers[rover] = i return nil } @@ -230,7 +227,6 @@ func (w *World) WarpRover(rover string, pos maths.Vector) error { } i.Pos = pos - w.Rovers[rover] = i return nil } @@ -259,7 +255,6 @@ func (w *World) MoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) i.AddLogEntryf("moved %s to %+v", b.String(), newPos) // Perform the move i.Pos = newPos - w.Rovers[rover] = i } else { // If it is a blocking tile, reduce the rover integrity i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) @@ -267,8 +262,6 @@ func (w *World) MoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) if i.Integrity == 0 { // TODO: The rover needs to be left dormant with the player - } else { - w.Rovers[rover] = i } } @@ -303,7 +296,6 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { r.AddLogEntryf("stashed %c", obj.Type) r.Inventory = append(r.Inventory, obj) - w.Rovers[rover] = r w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_ObjectUnknown}) return obj.Type, nil } @@ -343,7 +335,6 @@ func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearin // Set the new bearing r.Bearing = bearing - w.Rovers[rover] = r return r.Bearing, nil } From 075a502103f5725dabf17478eeff0ed9bd0175d0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 19:25:47 +0100 Subject: [PATCH 431/495] Pull the repair function out --- pkg/rove/world.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 10fae64..9d2e27c 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -338,6 +338,26 @@ func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearin return r.Bearing, nil } +// RoverRepair will turn the rover +func (w *World) RoverRepair(rover string) (int, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return 0, fmt.Errorf("no rover matching id") + } + + // Consume an inventory item to repair if possible + if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { + r.Inventory = r.Inventory[:len(r.Inventory)-1] + r.Integrity = r.Integrity + 1 + r.AddLogEntryf("repaired self to %d", r.Integrity) + } + + return r.Integrity, nil +} + // RadarFromRover can be used to query what a rover can currently see func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []roveapi.Object, err error) { w.worldMutex.RLock() @@ -501,17 +521,9 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { } case roveapi.CommandType_repair: - r, err := w.GetRover(rover) - if err != nil { + if _, err := w.RoverRepair(rover); err != nil { return err } - // Consume an inventory item to repair if possible - if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { - r.Inventory = r.Inventory[:len(r.Inventory)-1] - r.Integrity = r.Integrity + 1 - r.AddLogEntryf("repaired self to %d", r.Integrity) - w.Rovers[rover] = r - } case roveapi.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.GetBroadcast()); err != nil { From c94ac68f44cb1d86e9303545e6f38cec10c5daaf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 19:55:38 +0100 Subject: [PATCH 432/495] Remove all json tags, simply not needed --- cmd/rove-server/internal/accounts.go | 4 +-- cmd/rove-server/internal/simpleAccountant.go | 2 +- cmd/rove/main.go | 8 +++--- pkg/maths/vector.go | 4 +-- pkg/rove/chunkAtlas.go | 12 ++++----- pkg/rove/objects.go | 4 +-- pkg/rove/rover.go | 28 ++++++++++---------- pkg/rove/world.go | 12 ++++----- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/cmd/rove-server/internal/accounts.go b/cmd/rove-server/internal/accounts.go index 99362ad..9ae6db9 100644 --- a/cmd/rove-server/internal/accounts.go +++ b/cmd/rove-server/internal/accounts.go @@ -21,8 +21,8 @@ type Accountant interface { // Account represents a registered user type Account struct { // Name simply describes the account and must be unique - Name string `json:"name"` + Name string // Data represents internal account data - Data map[string]string `json:"data"` + Data map[string]string } diff --git a/cmd/rove-server/internal/simpleAccountant.go b/cmd/rove-server/internal/simpleAccountant.go index 3168f30..611ff59 100644 --- a/cmd/rove-server/internal/simpleAccountant.go +++ b/cmd/rove-server/internal/simpleAccountant.go @@ -9,7 +9,7 @@ import ( // SimpleAccountant manages a set of accounts type SimpleAccountant struct { - Accounts map[string]Account `json:"accounts"` + Accounts map[string]Account } // NewSimpleAccountant creates a new accountant diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2977baa..01e16ae 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -45,14 +45,14 @@ const gRPCport = 9090 // Account stores data for an account type Account struct { - Name string `json:"name"` - Secret string `json:"secret"` + Name string + Secret string } // Config is used to store internal data type Config struct { - Host string `json:"host,omitempty"` - Account Account `json:"account,omitempty"` + Host string + Account Account } // ConfigPath returns the configuration path diff --git a/pkg/maths/vector.go b/pkg/maths/vector.go index 92305cc..9b9d755 100644 --- a/pkg/maths/vector.go +++ b/pkg/maths/vector.go @@ -8,8 +8,8 @@ import ( // Vector desribes a 3D vector type Vector struct { - X int `json:"x"` - Y int `json:"y"` + X int + Y int } // Add adds one vector to another diff --git a/pkg/rove/chunkAtlas.go b/pkg/rove/chunkAtlas.go index f7ea36c..88f1102 100644 --- a/pkg/rove/chunkAtlas.go +++ b/pkg/rove/chunkAtlas.go @@ -11,27 +11,27 @@ import ( // chunk represents a fixed square grid of tiles type chunk struct { // Tiles represents the tiles within the chunk - Tiles []byte `json:"tiles"` + Tiles []byte // Objects represents the objects within the chunk // only one possible object per tile for now - Objects map[int]Object `json:"objects"` + Objects map[int]Object } // chunkBasedAtlas represents a grid of Chunks type chunkBasedAtlas struct { // Chunks represents all chunks in the world // This is intentionally not a 2D array so it can be expanded in all directions - Chunks []chunk `json:"chunks"` + Chunks []chunk // LowerBound is the origin of the bottom left corner of the current chunks in world space (current chunks cover >= this value) - LowerBound maths.Vector `json:"lowerBound"` + LowerBound maths.Vector // UpperBound is the top left corner of the current chunks (curent chunks cover < this value) - UpperBound maths.Vector `json:"upperBound"` + UpperBound maths.Vector // ChunkSize is the x/y dimensions of each square chunk - ChunkSize int `json:"chunksize"` + ChunkSize int // worldGen is the internal world generator worldGen WorldGen diff --git a/pkg/rove/objects.go b/pkg/rove/objects.go index 94595df..f1ce227 100644 --- a/pkg/rove/objects.go +++ b/pkg/rove/objects.go @@ -7,10 +7,10 @@ import ( // Object represents an object in the world type Object struct { // The type of the object - Type roveapi.Object `json:"type"` + Type roveapi.Object // Data is an internal type used for certain types of object - Data []byte `json:"data"` + Data []byte } // IsBlocking checks if an object is a blocking object diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index f1e0972..0bb9e4e 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -16,49 +16,49 @@ import ( // RoverLogEntry describes a single log entry for the rover type RoverLogEntry struct { // Time is the timestamp of the entry - Time time.Time `json:"time"` + Time time.Time // Text contains the information in this log entry - Text string `json:"text"` + Text string } // Rover describes a single rover in the world type Rover struct { // Unique name of this rover - Name string `json:"name"` + Name string // Pos represents where this rover is in the world - Pos maths.Vector `json:"pos"` + Pos maths.Vector // Bearing is the current direction the rover is facing - Bearing roveapi.Bearing `json:"bearing"` + Bearing roveapi.Bearing // Range represents the distance the unit's radar can see - Range int `json:"range"` + Range int // Inventory represents any items the rover is carrying - Inventory []Object `json:"inventory"` + Inventory []Object // Capacity is the maximum number of inventory items - Capacity int `json:"capacity"` + Capacity int // Integrity represents current rover health - Integrity int `json:"integrity"` + Integrity int // MaximumIntegrity is the full integrity of the rover - MaximumIntegrity int `json:"maximum-integrity"` + MaximumIntegrity int // Charge is the amount of energy the rover has - Charge int `json:"charge"` + Charge int // MaximumCharge is the maximum charge able to be stored - MaximumCharge int `json:"maximum-charge"` + MaximumCharge int // SailPosition is the current position of the sails - SailPosition roveapi.SailPosition `json:"sail-position"` + SailPosition roveapi.SailPosition // Logs Stores log of information - Logs []RoverLogEntry `json:"logs"` + Logs []RoverLogEntry } // DefaultRover returns a default rover object with default settings diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 9d2e27c..fa7a0e2 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -16,21 +16,21 @@ type CommandStream []*roveapi.Command // World describes a self contained universe and everything in it type World struct { // TicksPerDay is the amount of ticks in a single day - TicksPerDay int `json:"ticks-per-day"` + TicksPerDay int // Current number of ticks from the start - CurrentTicks int `json:"current-ticks"` + CurrentTicks int // Rovers is a id->data map of all the rovers in the game - Rovers map[string]*Rover `json:"rovers"` + Rovers map[string]*Rover // Atlas represends the world map of chunks and tiles - Atlas Atlas `json:"atlas"` + Atlas Atlas // Commands is the set of currently executing command streams per rover - CommandQueue map[string]CommandStream `json:"commands"` + CommandQueue map[string]CommandStream // Incoming represents the set of commands to add to the queue at the end of the current tick - CommandIncoming map[string]CommandStream `json:"incoming"` + CommandIncoming map[string]CommandStream // Mutex to lock around all world operations worldMutex sync.RWMutex From c89c5f6e74a3c87776108ec4765b36b976d72d45 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 23:36:13 +0100 Subject: [PATCH 433/495] Implement current wind direction and rover wind movement --- cmd/rove-server/internal/routes.go | 1 + pkg/maths/vector.go | 10 ++ pkg/rove/rover.go | 3 + pkg/rove/world.go | 82 ++++++++++++++-- pkg/rove/world_test.go | 46 +-------- proto/roveapi/roveapi.pb.go | 148 ++++++++++++++++------------- proto/roveapi/roveapi.proto | 3 + 7 files changed, 174 insertions(+), 119 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 02a7483..6cb5a99 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -102,6 +102,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon QueuedCommands: queued, SailPosition: rover.SailPosition, Logs: logs, + Wind: s.world.Wind, } } return response, nil diff --git a/pkg/maths/vector.go b/pkg/maths/vector.go index 9b9d755..a74ff16 100644 --- a/pkg/maths/vector.go +++ b/pkg/maths/vector.go @@ -107,3 +107,13 @@ func BearingToVector(b roveapi.Bearing) Vector { return Vector{} } + +// Dot returns the dot product of two vectors +func Dot(a Vector, b Vector) int { + return a.X*b.X + a.Y*b.Y +} + +// AngleCos returns the cosine of the angle between two vectors +func AngleCos(a Vector, b Vector) float64 { + return float64(Dot(a, b)) / a.Length() * b.Length() +} diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index 0bb9e4e..fb13ddc 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -57,6 +57,9 @@ type Rover struct { // SailPosition is the current position of the sails SailPosition roveapi.SailPosition + // Current number of ticks in this move, used for sailing speeds + MoveTicks int + // Logs Stores log of information Logs []RoverLogEntry } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index fa7a0e2..0265951 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -10,11 +10,16 @@ import ( "github.com/mdiluz/rove/proto/roveapi" ) +const ( + TicksPerNormalMove = 4 +) + // CommandStream is a list of commands to execute in order type CommandStream []*roveapi.Command // World describes a self contained universe and everything in it type World struct { + // TicksPerDay is the amount of ticks in a single day TicksPerDay int @@ -27,6 +32,9 @@ type World struct { // Atlas represends the world map of chunks and tiles Atlas Atlas + // Wind is the current wind direction + Wind roveapi.Bearing + // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream // Incoming represents the set of commands to add to the queue at the end of the current tick @@ -230,8 +238,8 @@ func (w *World) WarpRover(rover string, pos maths.Vector) error { return nil } -// MoveRover attempts to move a rover in a specific direction -func (w *World) MoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) { +// TryMoveRover attempts to move a rover in a specific direction +func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() @@ -240,12 +248,6 @@ func (w *World) MoveRover(rover string, b roveapi.Bearing) (maths.Vector, error) return maths.Vector{}, fmt.Errorf("no rover matching id") } - // Ensure the rover has energy - if i.Charge <= 0 { - return i.Pos, nil - } - i.Charge-- - // Try the new move position newPos := i.Pos.Added(maths.BearingToVector(b)) @@ -318,7 +320,9 @@ func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { r.SailPosition = roveapi.SailPosition_CatchingWind } - w.Rovers[rover] = r + // Reset the movement ticks + r.MoveTicks = 0 + return r.SailPosition, nil } @@ -334,6 +338,8 @@ func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearin // Set the new bearing r.Bearing = bearing + // Reset the movement ticks + r.MoveTicks = 0 return r.Bearing, nil } @@ -502,6 +508,64 @@ func (w *World) Tick() { // Add any incoming commands from this tick and clear that queue w.EnqueueAllIncoming() + // Change the wind every day + if (w.CurrentTicks % w.TicksPerDay) == 0 { + w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing + } + + // Move all the rovers based on current wind and sails + for n, r := range w.Rovers { + // Skip if we're not catching the wind + if r.SailPosition != roveapi.SailPosition_CatchingWind { + continue + } + + // Increment the current move ticks + r.MoveTicks++ + + // Get the difference between the two bearings + // Normalise, we don't care about clockwise/anticlockwise + diff := maths.Abs(int(w.Wind - r.Bearing)) + if diff > 4 { + diff = 8 - diff + } + + // Calculate the travel "ticks" + var ticksToMove int + switch diff { + case 0: + // Going with the wind, travel at base speed of once every 4 ticks + ticksToMove = TicksPerNormalMove + case 1: + // At a slight angle, we can go a little faster + ticksToMove = TicksPerNormalMove / 2 + case 2: + // Perpendicular to wind, max speed + ticksToMove = 1 + case 3: + // Heading at 45 degrees into the wind, back to min speed + ticksToMove = TicksPerNormalMove + case 4: + // Heading durectly into the wind, no movement at all + default: + log.Fatalf("bearing difference of %d should be impossible", diff) + } + + // If we've incremented over the current move ticks on the rover, we can try and make the move + if r.MoveTicks >= ticksToMove { + _, err := w.TryMoveRover(n, r.Bearing) + if err != nil { + log.Println(err) + // TODO: Report this error somehow + } + + // Reset the move ticks + r.MoveTicks = 0 + } + + log.Print(ticksToMove) + } + // Increment the current tick count w.CurrentTicks++ } diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 785baa2..2dbcc86 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -78,25 +78,20 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly set position for rover") b := roveapi.Bearing_North - newPos, err = world.MoveRover(a, b) + newPos, err = world.TryMoveRover(a, b) assert.NoError(t, err, "Failed to set position for rover") pos.Add(maths.Vector{X: 0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") rover, err := world.GetRover(a) assert.NoError(t, err, "Failed to get rover information") - assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving") assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "moved", "Rover logs should contain the move") // Place a tile in front of the rover world.Atlas.SetObject(maths.Vector{X: 0, Y: 2}, Object{Type: roveapi.Object_RockLarge}) - newPos, err = world.MoveRover(a, b) + newPos, err = world.TryMoveRover(a, b) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") - - rover, err = world.GetRover(a) - assert.NoError(t, err, "Failed to get rover information") - assert.Equal(t, rover.MaximumCharge-2, rover.Charge, "Rover should have lost charge for move attempt") } func TestWorld_RadarFromRover(t *testing.T) { @@ -224,7 +219,7 @@ func TestWorld_RoverDamage(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) - vec, err := world.MoveRover(a, roveapi.Bearing_North) + vec, err := world.TryMoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -261,7 +256,7 @@ func TestWorld_RoverRepair(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) // Try and bump into the rock - vec, err := world.MoveRover(a, roveapi.Bearing_North) + vec, err := world.TryMoveRover(a, roveapi.Bearing_North) assert.NoError(t, err, "Failed to move rover") assert.Equal(t, pos, vec, "Rover managed to move into large rock") @@ -291,39 +286,6 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") } -func TestWorld_Charge(t *testing.T) { - world := NewWorld(4) - a, err := world.SpawnRover() - assert.NoError(t, err) - - // Get the rover information - rover, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover information") - assert.Equal(t, rover.MaximumCharge, rover.Charge, "Rover should start with maximum charge") - - // Use up all the charge - for i := 0; i < rover.MaximumCharge; i++ { - // Get the initial position - initialPos, err := world.RoverPosition(a) - assert.NoError(t, err, "Failed to get position for rover") - - // Ensure the path ahead is empty - world.Atlas.SetTile(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), roveapi.Tile_Rock) - world.Atlas.SetObject(initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), Object{Type: roveapi.Object_ObjectUnknown}) - - // Try and move north (along unblocked path) - newPos, err := world.MoveRover(a, roveapi.Bearing_North) - assert.NoError(t, err, "Failed to set position for rover") - assert.Equal(t, initialPos.Added(maths.BearingToVector(roveapi.Bearing_North)), newPos, "Failed to correctly move position for rover") - - // Ensure rover lost charge - rover, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover information") - assert.Equal(t, rover.MaximumCharge-(i+1), rover.Charge, "Rover should have lost charge") - } - -} - func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 51a886f..a9bf133 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -1095,6 +1095,8 @@ type StatusResponse struct { QueuedCommands []*Command `protobuf:"bytes,13,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` // The most recent logs Logs []*Log `protobuf:"bytes,14,rep,name=logs,proto3" json:"logs,omitempty"` + // The current wind direction + Wind Bearing `protobuf:"varint,15,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` } func (x *StatusResponse) Reset() { @@ -1227,6 +1229,13 @@ func (x *StatusResponse) GetLogs() []*Log { return nil } +func (x *StatusResponse) GetWind() Bearing { + if x != nil { + return x.Wind + } + return Bearing_BearingUnknown +} + var File_roveapi_roveapi_proto protoreflect.FileDescriptor var file_roveapi_roveapi_proto_rawDesc = []byte{ @@ -1289,7 +1298,7 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xaa, 0x04, 0x0a, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xd0, 0x04, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, @@ -1324,59 +1333,61 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, - 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, - 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, - 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, - 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, - 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, - 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, - 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, - 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, - 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, - 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, - 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, + 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, + 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x2a, + 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, + 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, + 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, + 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, + 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, + 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, + 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, + 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, + 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, + 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1430,21 +1441,22 @@ var file_roveapi_roveapi_proto_depIdxs = []int32{ 10, // 12: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command 10, // 13: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command 16, // 14: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 5, // 15: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 16: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 17: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 18: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 19: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 20: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 21: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 22: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 23: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 18, // 24: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 20, // [20:25] is the sub-list for method output_type - 15, // [15:20] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 1, // 15: roveapi.StatusResponse.wind:type_name -> roveapi.Bearing + 5, // 16: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 17: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 18: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 19: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 20: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 21: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 22: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 23: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 24: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 18, // 25: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 21, // [21:26] is the sub-list for method output_type + 16, // [16:21] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 9ca09d8..c45f29c 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -274,4 +274,7 @@ message StatusResponse { // The most recent logs repeated Log logs = 14; + + // The current wind direction + Bearing wind = 15; } \ No newline at end of file From 5d80cb2596848ea6d745d33dfb5deae4b40bcf5c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 23:50:42 +0100 Subject: [PATCH 434/495] Implement sailing tests and fix into-the-wind bug --- pkg/rove/world.go | 2 +- pkg/rove/world_test.go | 78 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 0265951..b8464aa 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -552,7 +552,7 @@ func (w *World) Tick() { } // If we've incremented over the current move ticks on the rover, we can try and make the move - if r.MoveTicks >= ticksToMove { + if ticksToMove != 0 && r.MoveTicks >= ticksToMove { _, err := w.TryMoveRover(n, r.Bearing) if err != nil { log.Println(err) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 2dbcc86..a3c2f47 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -388,3 +388,81 @@ func TestWorld_Broadcast(t *testing.T) { assert.NoError(t, err) assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "HJK", "Rover A should have logged it's broadcast") } + +func TestWorld_Sailing(t *testing.T) { + world := NewWorld(8) + world.Tick() // One initial tick to set the wind direction the first time + world.Wind = roveapi.Bearing_North // Set the wind direction to north + + name, err := world.SpawnRover() + assert.NoError(t, err) + + // Warp the rover to 0,0 after clearing it + world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) + assert.NoError(t, world.WarpRover(name, maths.Vector{X: 0, Y: 0})) + + s, err := world.RoverToggle(name) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_CatchingWind, s) + + b, err := world.RoverTurn(name, roveapi.Bearing_North) + assert.NoError(t, err) + assert.Equal(t, roveapi.Bearing_North, b) + + // Clear the space to the north + world.Atlas.SetObject(maths.Vector{X: 0, Y: 1}, Object{Type: roveapi.Object_ObjectUnknown}) + + // Tick the world and check we've moved not moved + world.Tick() + info, err := world.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, maths.Vector{Y: 0}, info.Pos) + + // Loop a few more times + for i := 0; i < TicksPerNormalMove-2; i++ { + world.Tick() + info, err := world.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, maths.Vector{Y: 0}, info.Pos) + } + + // Now check we've moved (after the TicksPerNormalMove number of ticks) + world.Tick() + info, err = world.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, maths.Vector{Y: 1}, info.Pos) + + // Reset the world ticks back to stop any wind changes etc. + world.CurrentTicks = 1 + + // Face the rover south, into the wind + b, err = world.RoverTurn(name, roveapi.Bearing_South) + assert.NoError(t, err) + assert.Equal(t, roveapi.Bearing_South, b) + + // Tick a bunch, we should never move + for i := 0; i < TicksPerNormalMove*2; i++ { + world.Tick() + info, err := world.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, maths.Vector{Y: 1}, info.Pos) + } + + // Reset the world ticks back to stop any wind changes etc. + world.CurrentTicks = 1 + world.Wind = roveapi.Bearing_SouthEast // Set up a south easternly wind + + // Turn the rover perpendicular + b, err = world.RoverTurn(name, roveapi.Bearing_NorthEast) + assert.NoError(t, err) + assert.Equal(t, roveapi.Bearing_NorthEast, b) + + // Clear a space + world.Atlas.SetObject(maths.Vector{X: 1, Y: 2}, Object{Type: roveapi.Object_ObjectUnknown}) + + // Now check we've moved immediately + world.Tick() + info, err = world.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, maths.Vector{X: 1, Y: 2}, info.Pos) +} From 1e18610c5c7322cd1ba13653e92d6d0efd40ae2a Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 23:57:22 +0100 Subject: [PATCH 435/495] Set tick rate to 3 --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 509af03..f1962a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,7 @@ services: - PORT=9090 - DATA_PATH=/mnt/rove-server - WORDS_FILE=data/words_alpha.txt + - TICK_RATE=3 volumes: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] From 6adc652cea8becdc6cebef2ba35a133857b2115f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 Jul 2020 23:59:28 +0100 Subject: [PATCH 436/495] Fix lint errors --- pkg/rove/command_test.go | 9 ++++++--- pkg/rove/world.go | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index f22f797..536f656 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -16,7 +16,8 @@ func TestCommand_Toggle(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) - w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + assert.NoError(t, err) w.EnqueueAllIncoming() w.Tick() @@ -24,7 +25,8 @@ func TestCommand_Toggle(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) - w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) + assert.NoError(t, err) w.EnqueueAllIncoming() w.Tick() @@ -38,7 +40,8 @@ func TestCommand_Turn(t *testing.T) { a, err := w.SpawnRover() assert.NoError(t, err) - w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) + assert.NoError(t, err) w.EnqueueAllIncoming() w.Tick() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index b8464aa..1fa166d 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -262,9 +262,9 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) - if i.Integrity == 0 { - // TODO: The rover needs to be left dormant with the player - } + // TODO: The rover needs to be left dormant with the player + //if i.Integrity == 0 { + //} } return i.Pos, nil From 2bc247712879e19b65187db6c80f3a61ee07bddb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 00:13:28 +0100 Subject: [PATCH 437/495] Remove the incoming command streams, de-scopes and simplifies --- cmd/rove-server/internal/routes.go | 3 +- pkg/rove/command_test.go | 3 - pkg/rove/world.go | 34 ++---- proto/roveapi/roveapi.pb.go | 179 +++++++++++++---------------- proto/roveapi/roveapi.proto | 9 +- 5 files changed, 94 insertions(+), 134 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 6cb5a99..7174c31 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -75,7 +75,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon inv = append(inv, byte(i.Type)) } - incoming, queued := s.world.RoverCommands(resp) + queued := s.world.RoverCommands(resp) var logs []*roveapi.Log for _, log := range rover.Logs { logs = append(logs, &roveapi.Log{ @@ -98,7 +98,6 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon MaximumIntegrity: int32(rover.MaximumIntegrity), Charge: int32(rover.Charge), MaximumCharge: int32(rover.MaximumCharge), - IncomingCommands: incoming, QueuedCommands: queued, SailPosition: rover.SailPosition, Logs: logs, diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 536f656..f55c6cb 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -18,7 +18,6 @@ func TestCommand_Toggle(t *testing.T) { err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) assert.NoError(t, err) - w.EnqueueAllIncoming() w.Tick() r, err = w.GetRover(a) @@ -27,7 +26,6 @@ func TestCommand_Toggle(t *testing.T) { err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_toggle}) assert.NoError(t, err) - w.EnqueueAllIncoming() w.Tick() r, err = w.GetRover(a) @@ -42,7 +40,6 @@ func TestCommand_Turn(t *testing.T) { err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) assert.NoError(t, err) - w.EnqueueAllIncoming() w.Tick() r, err := w.GetRover(a) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 1fa166d..591ba8e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -37,8 +37,6 @@ type World struct { // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream - // Incoming represents the set of commands to add to the queue at the end of the current tick - CommandIncoming map[string]CommandStream // Mutex to lock around all world operations worldMutex sync.RWMutex @@ -49,12 +47,11 @@ type World struct { // NewWorld creates a new world object func NewWorld(chunkSize int) *World { return &World{ - Rovers: make(map[string]*Rover), - CommandQueue: make(map[string]CommandStream), - CommandIncoming: make(map[string]CommandStream), - Atlas: NewChunkAtlas(chunkSize), - TicksPerDay: 24, - CurrentTicks: 0, + Rovers: make(map[string]*Rover), + CommandQueue: make(map[string]CommandStream), + Atlas: NewChunkAtlas(chunkSize), + TicksPerDay: 24, + CurrentTicks: 0, } } @@ -423,10 +420,7 @@ func (w *World) RadarFromRover(rover string) (radar []roveapi.Tile, objs []rovea } // RoverCommands returns current commands for the given rover -func (w *World) RoverCommands(rover string) (incoming CommandStream, queued CommandStream) { - if c, ok := w.CommandIncoming[rover]; ok { - incoming = c - } +func (w *World) RoverCommands(rover string) (queued CommandStream) { if c, ok := w.CommandQueue[rover]; ok { queued = c } @@ -465,22 +459,11 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { w.cmdMutex.Lock() defer w.cmdMutex.Unlock() - w.CommandIncoming[rover] = commands + w.CommandQueue[rover] = commands return nil } -// EnqueueAllIncoming will enqueue the incoming commands -func (w *World) EnqueueAllIncoming() { - // Add any incoming commands from this tick and clear that queue - for id, incoming := range w.CommandIncoming { - commands := w.CommandQueue[id] - commands = append(commands, incoming...) - w.CommandQueue[id] = commands - } - w.CommandIncoming = make(map[string]CommandStream) -} - // Tick will execute any commands in the current command queue and tick the world func (w *World) Tick() { w.cmdMutex.Lock() @@ -505,9 +488,6 @@ func (w *World) Tick() { } } - // Add any incoming commands from this tick and clear that queue - w.EnqueueAllIncoming() - // Change the wind every day if (w.CurrentTicks % w.TicksPerDay) == 0 { w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index a9bf133..4fbea99 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -1089,14 +1089,12 @@ type StatusResponse struct { MaximumCharge int32 `protobuf:"varint,10,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` // The current position of the sails SailPosition SailPosition `protobuf:"varint,11,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` - // The set of currently incoming commands for this tick - IncomingCommands []*Command `protobuf:"bytes,12,rep,name=incomingCommands,proto3" json:"incomingCommands,omitempty"` // The set of currently queued commands - QueuedCommands []*Command `protobuf:"bytes,13,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` + QueuedCommands []*Command `protobuf:"bytes,12,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` // The most recent logs - Logs []*Log `protobuf:"bytes,14,rep,name=logs,proto3" json:"logs,omitempty"` + Logs []*Log `protobuf:"bytes,13,rep,name=logs,proto3" json:"logs,omitempty"` // The current wind direction - Wind Bearing `protobuf:"varint,15,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` + Wind Bearing `protobuf:"varint,14,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` } func (x *StatusResponse) Reset() { @@ -1208,13 +1206,6 @@ func (x *StatusResponse) GetSailPosition() SailPosition { return SailPosition_UnknownSailPosition } -func (x *StatusResponse) GetIncomingCommands() []*Command { - if x != nil { - return x.IncomingCommands - } - return nil -} - func (x *StatusResponse) GetQueuedCommands() []*Command { if x != nil { return x.QueuedCommands @@ -1298,7 +1289,7 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xd0, 0x04, 0x0a, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x92, 0x04, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, @@ -1324,70 +1315,67 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3c, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x10, 0x69, 0x6e, 0x63, - 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, - 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, - 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x2a, - 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, - 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, - 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, - 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, - 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, - 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, - 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, - 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, - 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, - 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, + 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x77, + 0x69, 0x6e, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, + 0x64, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, + 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, + 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, + 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, + 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, + 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, + 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, + 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, + 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, + 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, + 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, + 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, + 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, + 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -1438,25 +1426,24 @@ var file_roveapi_roveapi_proto_depIdxs = []int32{ 17, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector 1, // 10: roveapi.StatusResponse.bearing:type_name -> roveapi.Bearing 4, // 11: roveapi.StatusResponse.sailPosition:type_name -> roveapi.SailPosition - 10, // 12: roveapi.StatusResponse.incomingCommands:type_name -> roveapi.Command - 10, // 13: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 16, // 14: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 1, // 15: roveapi.StatusResponse.wind:type_name -> roveapi.Bearing - 5, // 16: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 17: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 18: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 19: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 20: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 21: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 22: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 23: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 24: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 18, // 25: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 21, // [21:26] is the sub-list for method output_type - 16, // [16:21] is the sub-list for method input_type - 16, // [16:16] is the sub-list for extension type_name - 16, // [16:16] is the sub-list for extension extendee - 0, // [0:16] is the sub-list for field type_name + 10, // 12: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command + 16, // 13: roveapi.StatusResponse.logs:type_name -> roveapi.Log + 1, // 14: roveapi.StatusResponse.wind:type_name -> roveapi.Bearing + 5, // 15: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 16: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 17: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 18: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 19: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 20: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 21: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 22: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 23: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 18, // 24: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 20, // [20:25] is the sub-list for method output_type + 15, // [15:20] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index c45f29c..33bbc25 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -266,15 +266,12 @@ message StatusResponse { // The current position of the sails SailPosition sailPosition = 11; - // The set of currently incoming commands for this tick - repeated Command incomingCommands = 12; - // The set of currently queued commands - repeated Command queuedCommands = 13; + repeated Command queuedCommands = 12; // The most recent logs - repeated Log logs = 14; + repeated Log logs = 13; // The current wind direction - Bearing wind = 15; + Bearing wind = 14; } \ No newline at end of file From f7192b39977d7c72c42d037cecacdfc9df2b653c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 00:32:19 +0100 Subject: [PATCH 438/495] Organise the status response into sub-sections --- cmd/rove-server/internal/routes.go | 38 +- proto/roveapi/roveapi.pb.go | 632 +++++++++++++++++++---------- proto/roveapi/roveapi.proto | 70 ++-- 3 files changed, 481 insertions(+), 259 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 7174c31..86becd7 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -85,23 +85,29 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon } response = &roveapi.StatusResponse{ - Name: rover.Name, - Position: &roveapi.Vector{ - X: int32(rover.Pos.X), - Y: int32(rover.Pos.Y), + Readings: &roveapi.RoverReadings{ + Position: &roveapi.Vector{ + X: int32(rover.Pos.X), + Y: int32(rover.Pos.Y), + }, + Logs: logs, + Wind: s.world.Wind, + }, + Spec: &roveapi.RoverSpecifications{ + Name: rover.Name, + Range: int32(rover.Range), + Capacity: int32(rover.Capacity), + MaximumIntegrity: int32(rover.MaximumIntegrity), + MaximumCharge: int32(rover.MaximumCharge), + }, + Status: &roveapi.RoverStatus{ + Bearing: rover.Bearing, + Inventory: inv, + Integrity: int32(rover.Integrity), + Charge: int32(rover.Charge), + QueuedCommands: queued, + SailPosition: rover.SailPosition, }, - Bearing: rover.Bearing, - Range: int32(rover.Range), - Inventory: inv, - Capacity: int32(rover.Capacity), - Integrity: int32(rover.Integrity), - MaximumIntegrity: int32(rover.MaximumIntegrity), - Charge: int32(rover.Charge), - MaximumCharge: int32(rover.MaximumCharge), - QueuedCommands: queued, - SailPosition: rover.SailPosition, - Logs: logs, - Wind: s.world.Wind, } } return response, nil diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 4fbea99..d5f0a46 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -1061,46 +1061,267 @@ func (x *Vector) GetY() int32 { return 0 } -// StatusResponse is the response given to a status request -type StatusResponse struct { +type RoverSpecifications struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the rover Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Position of the rover in world coordinates - Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` - // The current direction of the rover - Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` // The range of this rover's radar and broadcasting - Range int32 `protobuf:"varint,4,opt,name=range,proto3" json:"range,omitempty"` - // The items in the rover inventory - Inventory []byte `protobuf:"bytes,5,opt,name=inventory,proto3" json:"inventory,omitempty"` + Range int32 `protobuf:"varint,2,opt,name=range,proto3" json:"range,omitempty"` // The capacity of the inventory - Capacity int32 `protobuf:"varint,6,opt,name=capacity,proto3" json:"capacity,omitempty"` - // The current health of the rover - Integrity int32 `protobuf:"varint,7,opt,name=integrity,proto3" json:"integrity,omitempty"` + Capacity int32 `protobuf:"varint,3,opt,name=capacity,proto3" json:"capacity,omitempty"` // The maximum health of the rover - MaximumIntegrity int32 `protobuf:"varint,8,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` - // The energy stored in the rover - Charge int32 `protobuf:"varint,9,opt,name=charge,proto3" json:"charge,omitempty"` + MaximumIntegrity int32 `protobuf:"varint,4,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` // The max energy the rover can store - MaximumCharge int32 `protobuf:"varint,10,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` + MaximumCharge int32 `protobuf:"varint,5,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` +} + +func (x *RoverSpecifications) Reset() { + *x = RoverSpecifications{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverSpecifications) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverSpecifications) ProtoMessage() {} + +func (x *RoverSpecifications) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverSpecifications.ProtoReflect.Descriptor instead. +func (*RoverSpecifications) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{13} +} + +func (x *RoverSpecifications) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RoverSpecifications) GetRange() int32 { + if x != nil { + return x.Range + } + return 0 +} + +func (x *RoverSpecifications) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + +func (x *RoverSpecifications) GetMaximumIntegrity() int32 { + if x != nil { + return x.MaximumIntegrity + } + return 0 +} + +func (x *RoverSpecifications) GetMaximumCharge() int32 { + if x != nil { + return x.MaximumCharge + } + return 0 +} + +type RoverStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The current direction of the rover + Bearing Bearing `protobuf:"varint,1,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` // The current position of the sails - SailPosition SailPosition `protobuf:"varint,11,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` + SailPosition SailPosition `protobuf:"varint,2,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` + // The items in the rover inventory + Inventory []byte `protobuf:"bytes,3,opt,name=inventory,proto3" json:"inventory,omitempty"` + // The current health of the rover + Integrity int32 `protobuf:"varint,4,opt,name=integrity,proto3" json:"integrity,omitempty"` + // The energy stored in the rover + Charge int32 `protobuf:"varint,5,opt,name=charge,proto3" json:"charge,omitempty"` // The set of currently queued commands - QueuedCommands []*Command `protobuf:"bytes,12,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` - // The most recent logs - Logs []*Log `protobuf:"bytes,13,rep,name=logs,proto3" json:"logs,omitempty"` + QueuedCommands []*Command `protobuf:"bytes,6,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` +} + +func (x *RoverStatus) Reset() { + *x = RoverStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverStatus) ProtoMessage() {} + +func (x *RoverStatus) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverStatus.ProtoReflect.Descriptor instead. +func (*RoverStatus) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{14} +} + +func (x *RoverStatus) GetBearing() Bearing { + if x != nil { + return x.Bearing + } + return Bearing_BearingUnknown +} + +func (x *RoverStatus) GetSailPosition() SailPosition { + if x != nil { + return x.SailPosition + } + return SailPosition_UnknownSailPosition +} + +func (x *RoverStatus) GetInventory() []byte { + if x != nil { + return x.Inventory + } + return nil +} + +func (x *RoverStatus) GetIntegrity() int32 { + if x != nil { + return x.Integrity + } + return 0 +} + +func (x *RoverStatus) GetCharge() int32 { + if x != nil { + return x.Charge + } + return 0 +} + +func (x *RoverStatus) GetQueuedCommands() []*Command { + if x != nil { + return x.QueuedCommands + } + return nil +} + +type RoverReadings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Position of the rover in world coordinates + Position *Vector `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` // The current wind direction - Wind Bearing `protobuf:"varint,14,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` + Wind Bearing `protobuf:"varint,2,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` + // The most recent logs + Logs []*Log `protobuf:"bytes,3,rep,name=logs,proto3" json:"logs,omitempty"` +} + +func (x *RoverReadings) Reset() { + *x = RoverReadings{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverReadings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverReadings) ProtoMessage() {} + +func (x *RoverReadings) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverReadings.ProtoReflect.Descriptor instead. +func (*RoverReadings) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{15} +} + +func (x *RoverReadings) GetPosition() *Vector { + if x != nil { + return x.Position + } + return nil +} + +func (x *RoverReadings) GetWind() Bearing { + if x != nil { + return x.Wind + } + return Bearing_BearingUnknown +} + +func (x *RoverReadings) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +// StatusResponse is the response given to a status request +type StatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The static rover information + Spec *RoverSpecifications `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` + // Current rover status + Status *RoverStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + // Current rover readings + Readings *RoverReadings `protobuf:"bytes,3,opt,name=readings,proto3" json:"readings,omitempty"` } func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_roveapi_roveapi_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1113,7 +1334,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_roveapi_roveapi_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1126,107 +1347,30 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{13} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{16} } -func (x *StatusResponse) GetName() string { +func (x *StatusResponse) GetSpec() *RoverSpecifications { if x != nil { - return x.Name - } - return "" -} - -func (x *StatusResponse) GetPosition() *Vector { - if x != nil { - return x.Position + return x.Spec } return nil } -func (x *StatusResponse) GetBearing() Bearing { +func (x *StatusResponse) GetStatus() *RoverStatus { if x != nil { - return x.Bearing - } - return Bearing_BearingUnknown -} - -func (x *StatusResponse) GetRange() int32 { - if x != nil { - return x.Range - } - return 0 -} - -func (x *StatusResponse) GetInventory() []byte { - if x != nil { - return x.Inventory + return x.Status } return nil } -func (x *StatusResponse) GetCapacity() int32 { +func (x *StatusResponse) GetReadings() *RoverReadings { if x != nil { - return x.Capacity - } - return 0 -} - -func (x *StatusResponse) GetIntegrity() int32 { - if x != nil { - return x.Integrity - } - return 0 -} - -func (x *StatusResponse) GetMaximumIntegrity() int32 { - if x != nil { - return x.MaximumIntegrity - } - return 0 -} - -func (x *StatusResponse) GetCharge() int32 { - if x != nil { - return x.Charge - } - return 0 -} - -func (x *StatusResponse) GetMaximumCharge() int32 { - if x != nil { - return x.MaximumCharge - } - return 0 -} - -func (x *StatusResponse) GetSailPosition() SailPosition { - if x != nil { - return x.SailPosition - } - return SailPosition_UnknownSailPosition -} - -func (x *StatusResponse) GetQueuedCommands() []*Command { - if x != nil { - return x.QueuedCommands + return x.Readings } return nil } -func (x *StatusResponse) GetLogs() []*Log { - if x != nil { - return x.Logs - } - return nil -} - -func (x *StatusResponse) GetWind() Bearing { - if x != nil { - return x.Wind - } - return Bearing_BearingUnknown -} - var File_roveapi_roveapi_proto protoreflect.FileDescriptor var file_roveapi_roveapi_proto_rawDesc = []byte{ @@ -1289,93 +1433,105 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x92, 0x04, 0x0a, - 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, + 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, - 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x77, - 0x69, 0x6e, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, - 0x64, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, - 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, - 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, - 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, - 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, - 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, - 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, - 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, - 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, - 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, - 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, - 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, - 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, - 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, - 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, + 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, + 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, + 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, + 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, + 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, + 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, + 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, + 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, + 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, + 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, + 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, + 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, + 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1391,7 +1547,7 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { } var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing @@ -1411,7 +1567,10 @@ var file_roveapi_roveapi_proto_goTypes = []interface{}{ (*StatusRequest)(nil), // 15: roveapi.StatusRequest (*Log)(nil), // 16: roveapi.Log (*Vector)(nil), // 17: roveapi.Vector - (*StatusResponse)(nil), // 18: roveapi.StatusResponse + (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 19: roveapi.RoverStatus + (*RoverReadings)(nil), // 20: roveapi.RoverReadings + (*StatusResponse)(nil), // 21: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account @@ -1423,27 +1582,30 @@ var file_roveapi_roveapi_proto_depIdxs = []int32{ 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 17, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 1, // 10: roveapi.StatusResponse.bearing:type_name -> roveapi.Bearing - 4, // 11: roveapi.StatusResponse.sailPosition:type_name -> roveapi.SailPosition - 10, // 12: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 16, // 13: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 1, // 14: roveapi.StatusResponse.wind:type_name -> roveapi.Bearing - 5, // 15: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 16: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 17: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 18: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 19: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 20: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 21: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 22: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 23: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 18, // 24: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 20, // [20:25] is the sub-list for method output_type - 15, // [15:20] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 23, // [23:28] is the sub-list for method output_type + 18, // [18:23] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1609,6 +1771,42 @@ func file_roveapi_roveapi_proto_init() { } } file_roveapi_roveapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverSpecifications); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverReadings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -1627,7 +1825,7 @@ func file_roveapi_roveapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, NumEnums: 5, - NumMessages: 14, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 33bbc25..cc7826a 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -231,47 +231,65 @@ enum SailPosition { SolarCharging = 2; } -// StatusResponse is the response given to a status request -message StatusResponse { +message RoverSpecifications { + // The name of the rover string name = 1; - // Position of the rover in world coordinates - Vector position = 2; - - // The current direction of the rover - Bearing bearing = 3; - // The range of this rover's radar and broadcasting - int32 range = 4; - - // The items in the rover inventory - bytes inventory = 5; + int32 range = 2; // The capacity of the inventory - int32 capacity = 6; - - // The current health of the rover - int32 integrity = 7; + int32 capacity = 3; // The maximum health of the rover - int32 maximumIntegrity = 8; - - // The energy stored in the rover - int32 charge = 9; + int32 maximumIntegrity = 4; // The max energy the rover can store - int32 maximumCharge = 10; + int32 maximumCharge = 5; +} + +message RoverStatus { + + // The current direction of the rover + Bearing bearing = 1; // The current position of the sails - SailPosition sailPosition = 11; + SailPosition sailPosition = 2; + + // The items in the rover inventory + bytes inventory = 3; + + // The current health of the rover + int32 integrity = 4; + + // The energy stored in the rover + int32 charge = 5; // The set of currently queued commands - repeated Command queuedCommands = 12; + repeated Command queuedCommands = 6; +} - // The most recent logs - repeated Log logs = 13; +message RoverReadings { + // Position of the rover in world coordinates + Vector position = 1; // The current wind direction - Bearing wind = 14; + Bearing wind = 2; + + // The most recent logs + repeated Log logs = 3; +} + +// StatusResponse is the response given to a status request +message StatusResponse { + + // The static rover information + RoverSpecifications spec = 1; + + // Current rover status + RoverStatus status = 2; + + // Current rover readings + RoverReadings readings = 3; } \ No newline at end of file From 13e4d6a5e609bac7452bc928107e9155e946f648 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 00:34:57 +0100 Subject: [PATCH 439/495] Remove an old log left in --- pkg/rove/world.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 591ba8e..ea91fbc 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -542,8 +542,6 @@ func (w *World) Tick() { // Reset the move ticks r.MoveTicks = 0 } - - log.Print(ticksToMove) } // Increment the current tick count From 46d904acc6889cf7b1335ce2df371f70d653acd8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:41:08 +0100 Subject: [PATCH 440/495] Rename and comment ticksPerNormalMove --- pkg/rove/world.go | 9 +++++---- pkg/rove/world_test.go | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index ea91fbc..a81cf05 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,7 +11,8 @@ import ( ) const ( - TicksPerNormalMove = 4 + // ticksPerNormalMove defines the number of ticks it should take for a "normal" speed move + ticksPerNormalMove = 4 ) // CommandStream is a list of commands to execute in order @@ -515,16 +516,16 @@ func (w *World) Tick() { switch diff { case 0: // Going with the wind, travel at base speed of once every 4 ticks - ticksToMove = TicksPerNormalMove + ticksToMove = ticksPerNormalMove case 1: // At a slight angle, we can go a little faster - ticksToMove = TicksPerNormalMove / 2 + ticksToMove = ticksPerNormalMove / 2 case 2: // Perpendicular to wind, max speed ticksToMove = 1 case 3: // Heading at 45 degrees into the wind, back to min speed - ticksToMove = TicksPerNormalMove + ticksToMove = ticksPerNormalMove case 4: // Heading durectly into the wind, no movement at all default: diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index a3c2f47..db9fcb6 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -419,7 +419,7 @@ func TestWorld_Sailing(t *testing.T) { assert.Equal(t, maths.Vector{Y: 0}, info.Pos) // Loop a few more times - for i := 0; i < TicksPerNormalMove-2; i++ { + for i := 0; i < ticksPerNormalMove-2; i++ { world.Tick() info, err := world.GetRover(name) assert.NoError(t, err) @@ -441,7 +441,7 @@ func TestWorld_Sailing(t *testing.T) { assert.Equal(t, roveapi.Bearing_South, b) // Tick a bunch, we should never move - for i := 0; i < TicksPerNormalMove*2; i++ { + for i := 0; i < ticksPerNormalMove*2; i++ { world.Tick() info, err := world.GetRover(name) assert.NoError(t, err) From 8279a08a376edc93e53bcff552aede6a2398ff28 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:47:39 +0100 Subject: [PATCH 441/495] Limit the log entries to a max number --- pkg/rove/rover.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index fb13ddc..ce0edcd 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -13,6 +13,10 @@ import ( "github.com/mdiluz/rove/proto/roveapi" ) +const ( + maxLogEntries = 16 +) + // RoverLogEntry describes a single log entry for the rover type RoverLogEntry struct { // Time is the timestamp of the entry @@ -89,6 +93,11 @@ func (r *Rover) AddLogEntryf(format string, args ...interface{}) { Text: text, }, ) + + // Limit the number of logs + if len(r.Logs) > maxLogEntries { + r.Logs = r.Logs[len(r.Logs)-maxLogEntries:] + } } var wordsFile = os.Getenv("WORDS_FILE") From 3bfc91b8f6352e9d5a88766119e15f8072d2b47e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:56:28 +0100 Subject: [PATCH 442/495] Add command test for stashing --- pkg/rove/command_test.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index f55c6cb..0dc2f11 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -48,7 +48,31 @@ func TestCommand_Turn(t *testing.T) { } func TestCommand_Stash(t *testing.T) { - // TODO: Test the stash command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Empty(t, info.Inventory) + + // Drop a pickup below us + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + + // Try and stash it + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_stash}) + assert.NoError(t, err) + w.Tick() + + // Check we now have it in the inventory + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, 1, len(info.Inventory)) + assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, info.Inventory[0]) + + // Check it's no longer on the atlas + _, obj := w.Atlas.QueryPosition(info.Pos) + assert.Equal(t, Object{Type: roveapi.Object_ObjectUnknown}, obj) } func TestCommand_Repair(t *testing.T) { From 8a8a27ab47713ec568190a62eaa379f7bb3857e6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:37:54 +0100 Subject: [PATCH 443/495] Add a test for the repair command --- pkg/rove/command_test.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 0dc2f11..ec9c1b5 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -3,6 +3,7 @@ package rove import ( "testing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" ) @@ -76,7 +77,43 @@ func TestCommand_Stash(t *testing.T) { } func TestCommand_Repair(t *testing.T) { - // TODO: Test the repair command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity, info.Integrity) + + // Put a blocking rock to the north + w.Atlas.SetObject(info.Pos.Added(maths.Vector{X: 0, Y: 1}), Object{Type: roveapi.Object_RockLarge}) + + // Try and move and make sure we're blocked + newpos, err := w.TryMoveRover(name, roveapi.Bearing_North) + assert.NoError(t, err) + assert.Equal(t, info.Pos, newpos) + + // Check we're damaged + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity-1, info.Integrity) + + // Stash a repair object + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + obj, err := w.RoverStash(name) + assert.NoError(t, err) + assert.Equal(t, roveapi.Object_RockSmall, obj) + + // Enqueue the repair and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_repair}) + assert.NoError(t, err) + w.Tick() + + // Check we're repaired + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity, info.Integrity) + assert.Equal(t, 0, len(info.Inventory)) } func TestCommand_Broadcast(t *testing.T) { From 8cc3b9155ec66ff1087b74fd46e86923b24426ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:40:32 +0100 Subject: [PATCH 444/495] Implement broadcast command test --- pkg/rove/command_test.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index ec9c1b5..b0f2336 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -117,7 +117,18 @@ func TestCommand_Repair(t *testing.T) { } func TestCommand_Broadcast(t *testing.T) { - // TODO: Test the stash command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + // Enqueue the broadcast and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Broadcast: []byte("ABC")}) + assert.NoError(t, err) + w.Tick() + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC") } func TestCommand_Invalid(t *testing.T) { From 41cd93e9866287a421f02a740e557e62170f4378 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:41:12 +0100 Subject: [PATCH 445/495] Add command test for no command as error --- pkg/rove/command_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index b0f2336..d73b25c 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -132,5 +132,10 @@ func TestCommand_Broadcast(t *testing.T) { } func TestCommand_Invalid(t *testing.T) { - // TODO: Test an invalid command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) + assert.Error(t, err) } From 2c1bb8077931bc75b678d0b08aa25240d3b6e1a5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 19:01:16 +0100 Subject: [PATCH 446/495] Add salvage command Slight refactor to re-use command variables Also fixes the cmdline client turn command --- cmd/rove/main.go | 8 +- pkg/rove/command_test.go | 4 +- pkg/rove/world.go | 12 +- proto/roveapi/roveapi.pb.go | 481 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 26 +- 5 files changed, 306 insertions(+), 225 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 01e16ae..97a7a24 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -243,8 +243,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Broadcast: []byte(args[i]), + Command: roveapi.CommandType_turn, + Bearing: b, }, ) case "broadcast": @@ -256,8 +256,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Broadcast: []byte(args[i]), + Command: roveapi.CommandType_broadcast, + Data: []byte(args[i]), }, ) default: diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index d73b25c..8f4dd36 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -39,7 +39,7 @@ func TestCommand_Turn(t *testing.T) { a, err := w.SpawnRover() assert.NoError(t, err) - err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) assert.NoError(t, err) w.Tick() @@ -122,7 +122,7 @@ func TestCommand_Broadcast(t *testing.T) { assert.NoError(t, err) // Enqueue the broadcast and tick - err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Broadcast: []byte("ABC")}) + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Data: []byte("ABC")}) assert.NoError(t, err) w.Tick() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index a81cf05..50348dc 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -435,16 +435,16 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_broadcast: - if len(c.GetBroadcast()) > 3 { - return fmt.Errorf("too many characters in message (limit 3): %d", len(c.GetBroadcast())) + if len(c.GetData()) > 3 { + return fmt.Errorf("too many characters in message (limit 3): %d", len(c.GetData())) } - for _, b := range c.GetBroadcast() { + for _, b := range c.GetData() { if b < 37 || b > 126 { return fmt.Errorf("invalid message character: %c", b) } } case roveapi.CommandType_turn: - if c.GetTurn() == roveapi.Bearing_BearingUnknown { + if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } case roveapi.CommandType_toggle: @@ -569,12 +569,12 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { } case roveapi.CommandType_broadcast: - if err := w.RoverBroadcast(rover, c.GetBroadcast()); err != nil { + if err := w.RoverBroadcast(rover, c.GetData()); err != nil { return err } case roveapi.CommandType_turn: - if _, err := w.RoverTurn(rover, c.GetTurn()); err != nil { + if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { return err } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index d5f0a46..c5e458c 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -41,14 +41,16 @@ const ( CommandType_none CommandType = 0 // Toggles the sails, either catching the wind, or charging from the sun CommandType_toggle CommandType = 1 - // Turns the rover in the specified bearing, requires data + // Turns the rover in the specified bearing (requires bearing) CommandType_turn CommandType = 2 // Stashes item at current location in rover inventory CommandType_stash CommandType = 3 // Repairs the rover using an inventory object CommandType_repair CommandType = 4 - // Broadcasts a message to nearby rovers, requires data + // Broadcasts a message to nearby rovers (requires data) CommandType_broadcast CommandType = 5 + // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + CommandType_salvage CommandType = 6 ) // Enum value maps for CommandType. @@ -60,6 +62,7 @@ var ( 3: "stash", 4: "repair", 5: "broadcast", + 6: "salvage", } CommandType_value = map[string]int32{ "none": 0, @@ -68,6 +71,7 @@ var ( "stash": 3, "repair": 4, "broadcast": 5, + "salvage": 6, } ) @@ -167,6 +171,53 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } +type SalvageType int32 + +const ( + SalvageType_SalvageUnknown SalvageType = 0 + // Salvage a nearby rover for parts + SalvageType_SalvageParts SalvageType = 1 +) + +// Enum value maps for SalvageType. +var ( + SalvageType_name = map[int32]string{ + 0: "SalvageUnknown", + 1: "SalvageParts", + } + SalvageType_value = map[string]int32{ + "SalvageUnknown": 0, + "SalvageParts": 1, + } +) + +func (x SalvageType) Enum() *SalvageType { + p := new(SalvageType) + *p = x + return p +} + +func (x SalvageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SalvageType) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() +} + +func (SalvageType) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[2] +} + +func (x SalvageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SalvageType.Descriptor instead. +func (SalvageType) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} +} + // Types of objects type Object int32 @@ -212,11 +263,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Object) Number() protoreflect.EnumNumber { @@ -225,7 +276,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } type Tile int32 @@ -268,11 +319,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x Tile) Number() protoreflect.EnumNumber { @@ -281,7 +332,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // SailPosition represents the position of the sola sail @@ -320,11 +371,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[5] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -333,7 +384,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} } // ServerStatusRequest is an empty placeholder @@ -624,11 +675,13 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - Broadcast []byte `protobuf:"bytes,2,opt,name=broadcast,proto3" json:"broadcast,omitempty"` - // The bearing for the rover to turn to - Turn Bearing `protobuf:"varint,3,opt,name=turn,proto3,enum=roveapi.Bearing" json:"turn,omitempty"` + // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // move - the bearing for the rover to turn to + // salvage - the direction of the rover + Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // salvage - the type of salvage to execute + Salvage SalvageType `protobuf:"varint,4,opt,name=salvage,proto3,enum=roveapi.SalvageType" json:"salvage,omitempty"` } func (x *Command) Reset() { @@ -670,20 +723,27 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } -func (x *Command) GetBroadcast() []byte { +func (x *Command) GetData() []byte { if x != nil { - return x.Broadcast + return x.Data } return nil } -func (x *Command) GetTurn() Bearing { +func (x *Command) GetBearing() Bearing { if x != nil { - return x.Turn + return x.Bearing } return Bearing_BearingUnknown } +func (x *Command) GetSalvage() SalvageType { + if x != nil { + return x.Salvage + } + return SalvageType_SalvageUnknown +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1397,141 +1457,148 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, + 0x6c, 0x76, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, - 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, - 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, - 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, - 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, - 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, - 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, - 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, - 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, - 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, - 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, - 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, - 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, - 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, + 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, + 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, + 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, + 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, + 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, + 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, + 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, + 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x08, 0x2a, 0x33, 0x0a, 0x0b, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x61, 0x6c, 0x76, 0x61, + 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x01, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, + 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, + 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, + 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, + 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, + 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, + 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, + 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, + 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1546,66 +1613,68 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (Object)(0), // 2: roveapi.Object - (Tile)(0), // 3: roveapi.Tile - (SailPosition)(0), // 4: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest - (*Account)(nil), // 8: roveapi.Account - (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse - (*Command)(nil), // 10: roveapi.Command - (*CommandRequest)(nil), // 11: roveapi.CommandRequest - (*CommandResponse)(nil), // 12: roveapi.CommandResponse - (*RadarRequest)(nil), // 13: roveapi.RadarRequest - (*RadarResponse)(nil), // 14: roveapi.RadarResponse - (*StatusRequest)(nil), // 15: roveapi.StatusRequest - (*Log)(nil), // 16: roveapi.Log - (*Vector)(nil), // 17: roveapi.Vector - (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 19: roveapi.RoverStatus - (*RoverReadings)(nil), // 20: roveapi.RoverReadings - (*StatusResponse)(nil), // 21: roveapi.StatusResponse + (SalvageType)(0), // 2: roveapi.SalvageType + (Object)(0), // 3: roveapi.Object + (Tile)(0), // 4: roveapi.Tile + (SailPosition)(0), // 5: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest + (*Account)(nil), // 9: roveapi.Account + (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse + (*Command)(nil), // 11: roveapi.Command + (*CommandRequest)(nil), // 12: roveapi.CommandRequest + (*CommandResponse)(nil), // 13: roveapi.CommandResponse + (*RadarRequest)(nil), // 14: roveapi.RadarRequest + (*RadarResponse)(nil), // 15: roveapi.RadarResponse + (*StatusRequest)(nil), // 16: roveapi.StatusRequest + (*Log)(nil), // 17: roveapi.Log + (*Vector)(nil), // 18: roveapi.Vector + (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 20: roveapi.RoverStatus + (*RoverReadings)(nil), // 21: roveapi.RoverReadings + (*StatusResponse)(nil), // 22: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 1, // 2: roveapi.Command.turn:type_name -> roveapi.Bearing - 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account - 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing + 2, // 3: roveapi.Command.salvage:type_name -> roveapi.SalvageType + 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account + 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account + 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1824,7 +1893,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index cc7826a..2d8917e 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -91,14 +91,16 @@ enum CommandType { none = 0; // Toggles the sails, either catching the wind, or charging from the sun toggle = 1; - // Turns the rover in the specified bearing, requires data + // Turns the rover in the specified bearing (requires bearing) turn = 2; // Stashes item at current location in rover inventory stash = 3; // Repairs the rover using an inventory object repair = 4; - // Broadcasts a message to nearby rovers, requires data + // Broadcasts a message to nearby rovers (requires data) broadcast = 5; + // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + salvage = 6; } // Bearing represents a compass direction @@ -115,17 +117,27 @@ enum Bearing { NorthWest = 8; } +enum SalvageType { + SalvageUnknown = 0; + + // Salvage a nearby rover for parts + SalvageParts = 1; +} + // Command is a single command for a rover message Command { // The command type CommandType command = 1; - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - bytes broadcast = 2; + // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + bytes data = 2; - // The bearing for the rover to turn to - Bearing turn = 3; + // move - the bearing for the rover to turn to + // salvage - the direction of the rover + Bearing bearing = 3; + + // salvage - the type of salvage to execute + SalvageType salvage = 4; } // CommandRequest describes a set of commands to be requested for the rover From ce6e10afbb0deb73601b07ff5640a23453d7abe0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:08:03 +0100 Subject: [PATCH 447/495] Add salvage command to main.go man page --- cmd/rove/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 97a7a24..aaca561 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -37,6 +37,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } From 2f1ccdfdb91fa2676e417e376b127afae0946a18 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:08:39 +0100 Subject: [PATCH 448/495] Make repair require rover parts --- pkg/rove/command_test.go | 4 +- pkg/rove/objects.go | 1 + pkg/rove/world.go | 23 +- pkg/rove/world_test.go | 8 +- proto/roveapi/roveapi.pb.go | 461 ++++++++++++++++-------------------- proto/roveapi/roveapi.proto | 15 +- 6 files changed, 230 insertions(+), 282 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 8f4dd36..9ca2748 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -99,10 +99,10 @@ func TestCommand_Repair(t *testing.T) { assert.Equal(t, info.MaximumIntegrity-1, info.Integrity) // Stash a repair object - w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RoverParts}) obj, err := w.RoverStash(name) assert.NoError(t, err) - assert.Equal(t, roveapi.Object_RockSmall, obj) + assert.Equal(t, roveapi.Object_RoverParts, obj) // Enqueue the repair and tick err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_repair}) diff --git a/pkg/rove/objects.go b/pkg/rove/objects.go index f1ce227..d5fd237 100644 --- a/pkg/rove/objects.go +++ b/pkg/rove/objects.go @@ -33,6 +33,7 @@ func (o *Object) IsBlocking() bool { func (o *Object) IsStashable() bool { var stashable = [...]roveapi.Object{ roveapi.Object_RockSmall, + roveapi.Object_RoverParts, } for _, t := range stashable { diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 50348dc..de0bcae 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -352,11 +352,24 @@ func (w *World) RoverRepair(rover string) (int, error) { return 0, fmt.Errorf("no rover matching id") } - // Consume an inventory item to repair if possible - if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { - r.Inventory = r.Inventory[:len(r.Inventory)-1] - r.Integrity = r.Integrity + 1 - r.AddLogEntryf("repaired self to %d", r.Integrity) + // Can't repair past max + if r.Integrity >= r.MaximumIntegrity { + return r.Integrity, nil + } + + // Find rover parts in inventory + for i, o := range r.Inventory { + if o.Type == roveapi.Object_RoverParts { + + // Copy-erase from slice + r.Inventory[i] = r.Inventory[len(r.Inventory)-1] + r.Inventory = r.Inventory[:len(r.Inventory)-1] + + // Repair + r.Integrity = r.Integrity + 1 + r.AddLogEntryf("repaired self to %d", r.Integrity) + break + } } return r.Integrity, nil diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index db9fcb6..53be582 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -248,10 +248,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) @@ -273,10 +273,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index c5e458c..e86ab46 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -49,7 +49,7 @@ const ( CommandType_repair CommandType = 4 // Broadcasts a message to nearby rovers (requires data) CommandType_broadcast CommandType = 5 - // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + // Salvages a neighboring dormant rover for parts CommandType_salvage CommandType = 6 ) @@ -171,53 +171,6 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } -type SalvageType int32 - -const ( - SalvageType_SalvageUnknown SalvageType = 0 - // Salvage a nearby rover for parts - SalvageType_SalvageParts SalvageType = 1 -) - -// Enum value maps for SalvageType. -var ( - SalvageType_name = map[int32]string{ - 0: "SalvageUnknown", - 1: "SalvageParts", - } - SalvageType_value = map[string]int32{ - "SalvageUnknown": 0, - "SalvageParts": 1, - } -) - -func (x SalvageType) Enum() *SalvageType { - p := new(SalvageType) - *p = x - return p -} - -func (x SalvageType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SalvageType) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() -} - -func (SalvageType) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] -} - -func (x SalvageType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SalvageType.Descriptor instead. -func (SalvageType) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} -} - // Types of objects type Object int32 @@ -232,6 +185,8 @@ const ( Object_RockSmall Object = 3 // RockLarge is a large blocking rock Object_RockLarge Object = 4 + // RoverParts is one unit of rover parts, used for repairing and fixing the rover + Object_RoverParts Object = 5 ) // Enum value maps for Object. @@ -242,6 +197,7 @@ var ( 2: "RoverDormant", 3: "RockSmall", 4: "RockLarge", + 5: "RoverParts", } Object_value = map[string]int32{ "ObjectUnknown": 0, @@ -249,6 +205,7 @@ var ( "RoverDormant": 2, "RockSmall": 3, "RockLarge": 4, + "RoverParts": 5, } ) @@ -263,11 +220,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[2] } func (x Object) Number() protoreflect.EnumNumber { @@ -276,7 +233,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} } type Tile int32 @@ -319,11 +276,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Tile) Number() protoreflect.EnumNumber { @@ -332,7 +289,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } // SailPosition represents the position of the sola sail @@ -371,11 +328,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[5] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -384,7 +341,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // ServerStatusRequest is an empty placeholder @@ -680,8 +637,6 @@ type Command struct { // move - the bearing for the rover to turn to // salvage - the direction of the rover Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` - // salvage - the type of salvage to execute - Salvage SalvageType `protobuf:"varint,4,opt,name=salvage,proto3,enum=roveapi.SalvageType" json:"salvage,omitempty"` } func (x *Command) Reset() { @@ -737,13 +692,6 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } -func (x *Command) GetSalvage() SalvageType { - if x != nil { - return x.Salvage - } - return SalvageType_SalvageUnknown -} - // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1457,148 +1405,143 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, - 0x6c, 0x76, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, - 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, - 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, - 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, - 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, - 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, - 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, - 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, - 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, - 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x08, 0x2a, 0x33, 0x0a, 0x0b, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x61, 0x6c, 0x76, 0x61, - 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x01, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, - 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, - 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, - 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, - 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, - 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, - 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, - 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, - 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, - 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, - 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, - 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, - 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, + 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, + 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, + 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, + 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, + 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, + 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, 0x01, + 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, + 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, + 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, + 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, + 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, + 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, + 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1613,68 +1556,66 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (SalvageType)(0), // 2: roveapi.SalvageType - (Object)(0), // 3: roveapi.Object - (Tile)(0), // 4: roveapi.Tile - (SailPosition)(0), // 5: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest - (*Account)(nil), // 9: roveapi.Account - (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse - (*Command)(nil), // 11: roveapi.Command - (*CommandRequest)(nil), // 12: roveapi.CommandRequest - (*CommandResponse)(nil), // 13: roveapi.CommandResponse - (*RadarRequest)(nil), // 14: roveapi.RadarRequest - (*RadarResponse)(nil), // 15: roveapi.RadarResponse - (*StatusRequest)(nil), // 16: roveapi.StatusRequest - (*Log)(nil), // 17: roveapi.Log - (*Vector)(nil), // 18: roveapi.Vector - (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 20: roveapi.RoverStatus - (*RoverReadings)(nil), // 21: roveapi.RoverReadings - (*StatusResponse)(nil), // 22: roveapi.StatusResponse + (Object)(0), // 2: roveapi.Object + (Tile)(0), // 3: roveapi.Tile + (SailPosition)(0), // 4: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest + (*Account)(nil), // 8: roveapi.Account + (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse + (*Command)(nil), // 10: roveapi.Command + (*CommandRequest)(nil), // 11: roveapi.CommandRequest + (*CommandResponse)(nil), // 12: roveapi.CommandResponse + (*RadarRequest)(nil), // 13: roveapi.RadarRequest + (*RadarResponse)(nil), // 14: roveapi.RadarResponse + (*StatusRequest)(nil), // 15: roveapi.StatusRequest + (*Log)(nil), // 16: roveapi.Log + (*Vector)(nil), // 17: roveapi.Vector + (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 19: roveapi.RoverStatus + (*RoverReadings)(nil), // 20: roveapi.RoverReadings + (*StatusResponse)(nil), // 21: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing - 2, // 3: roveapi.Command.salvage:type_name -> roveapi.SalvageType - 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account - 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account - 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 24, // [24:29] is the sub-list for method output_type - 19, // [19:24] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account + 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account + 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 23, // [23:28] is the sub-list for method output_type + 18, // [18:23] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1893,7 +1834,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 6, + NumEnums: 5, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 2d8917e..6b9515c 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -99,7 +99,7 @@ enum CommandType { repair = 4; // Broadcasts a message to nearby rovers (requires data) broadcast = 5; - // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + // Salvages a neighboring dormant rover for parts salvage = 6; } @@ -117,13 +117,6 @@ enum Bearing { NorthWest = 8; } -enum SalvageType { - SalvageUnknown = 0; - - // Salvage a nearby rover for parts - SalvageParts = 1; -} - // Command is a single command for a rover message Command { // The command type @@ -135,9 +128,6 @@ message Command { // move - the bearing for the rover to turn to // salvage - the direction of the rover Bearing bearing = 3; - - // salvage - the type of salvage to execute - SalvageType salvage = 4; } // CommandRequest describes a set of commands to be requested for the rover @@ -172,6 +162,9 @@ enum Object { // RockLarge is a large blocking rock RockLarge = 4; + + // RoverParts is one unit of rover parts, used for repairing and fixing the rover + RoverParts = 5; } enum Tile { From 524487ce149ddffb4ec39fb95950acf764e8f84c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:27:54 +0100 Subject: [PATCH 449/495] Stop the dormant rover from being a blocking object --- pkg/rove/objects.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/rove/objects.go b/pkg/rove/objects.go index d5fd237..df10453 100644 --- a/pkg/rove/objects.go +++ b/pkg/rove/objects.go @@ -17,7 +17,6 @@ type Object struct { func (o *Object) IsBlocking() bool { var blocking = [...]roveapi.Object{ roveapi.Object_RoverLive, - roveapi.Object_RoverDormant, roveapi.Object_RockLarge, } From 7cccb4394f7eb0583ba603d34e1097e002149156 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:28:44 +0100 Subject: [PATCH 450/495] Fix the help text comment --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index aaca561..b3a7ed6 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -37,7 +37,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage uses an inventory object to repair the rover") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } From c321f88d962fcdba8de9a9e8950f6c31f8f702b5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:14 +0100 Subject: [PATCH 451/495] Add code for salvage command --- pkg/rove/command_test.go | 28 ++++++++++++++++++++++++ pkg/rove/world.go | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 9ca2748..9a8a35a 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -131,6 +131,34 @@ func TestCommand_Broadcast(t *testing.T) { assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC") } +func TestCommand_Salvage(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RoverDormant}) + + // Enqueue the broadcast and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_salvage}) + assert.NoError(t, err) + w.Tick() + + // Check we now have some rover parts + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.NotEmpty(t, info.Inventory) + for _, i := range info.Inventory { + assert.Equal(t, roveapi.Object_RoverParts, i.Type) + } + + // Check the dormant rover is gone + _, obj := w.Atlas.QueryPosition(info.Pos) + assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type) +} + func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) name, err := w.SpawnRover() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index de0bcae..b18f23e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -300,6 +300,46 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { return obj.Type, nil } +// RoverSalvage will salvage a rover for parts +func (w *World) RoverSalvage(rover string) (roveapi.Object, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return roveapi.Object_ObjectUnknown, fmt.Errorf("no rover matching id") + } + + // Can't pick up when full + if len(r.Inventory) >= r.Capacity { + r.AddLogEntryf("tried to salvage dormant rover but inventory was full") + return roveapi.Object_ObjectUnknown, nil + } + + // Ensure the rover has energy + if r.Charge <= 0 { + r.AddLogEntryf("tried to salvage dormant rover but had no charge") + return roveapi.Object_ObjectUnknown, nil + } + r.Charge-- + + _, obj := w.Atlas.QueryPosition(r.Pos) + if obj.Type != roveapi.Object_RoverDormant { + r.AddLogEntryf("tried to salvage dormant rover but found no rover to salvage") + return roveapi.Object_ObjectUnknown, nil + } + + r.AddLogEntryf("salvaged dormant rover") + for i := 0; i < 5; i++ { + if len(r.Inventory) == r.Capacity { + break + } + r.Inventory = append(r.Inventory, Object{Type: roveapi.Object_RoverParts}) + } + w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_ObjectUnknown}) + return obj.Type, nil +} + // RoverToggle will toggle the sail position func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { w.worldMutex.Lock() @@ -463,6 +503,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: + case roveapi.CommandType_salvage: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -591,6 +632,11 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { return err } + case roveapi.CommandType_salvage: + if _, err := w.RoverSalvage(rover); err != nil { + return err + } + default: return fmt.Errorf("unknown command: %s", c.Command) } From be36f0631b830f849ef0148e21ef38576e196da8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:25 +0100 Subject: [PATCH 452/495] Add logs for failed stashes --- pkg/rove/world.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index b18f23e..a500287 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -280,11 +280,13 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { // Can't pick up when full if len(r.Inventory) >= r.Capacity { + r.AddLogEntryf("tried to stash object but inventory was full") return roveapi.Object_ObjectUnknown, nil } // Ensure the rover has energy if r.Charge <= 0 { + r.AddLogEntryf("tried to stash object but had no charge") return roveapi.Object_ObjectUnknown, nil } r.Charge-- From b0ff3eb6ea58201a657a493be7dd36c4a00a4182 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:33 +0100 Subject: [PATCH 453/495] Remove redundant tests (covered in command_tests) --- pkg/rove/world_test.go | 130 ----------------------------------------- 1 file changed, 130 deletions(-) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 53be582..430d571 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -128,79 +128,6 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, objs1, objs2) } -func TestWorld_RoverStash(t *testing.T) { - world := NewWorld(2) - a, err := world.SpawnRover() - assert.NoError(t, err) - - pos := maths.Vector{ - X: 0.0, - Y: 0.0, - } - - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - rover, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - - for i := 0; i < rover.Capacity; i++ { - // Place an object - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) - - // Pick it up - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") - - // Check it's gone - _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type, "Stash failed to remove object from atlas") - - // Check we have it - inv, err := world.RoverInventory(a) - assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, i+1, len(inv)) - assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, inv[i]) - - // Check that this did reduce the charge - info, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") - assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "stashed", "Rover logs should contain the move") - } - - // Recharge the rover - for i := 0; i < rover.MaximumCharge; i++ { - _, err = world.RoverRecharge(a) - assert.NoError(t, err) - - } - - // Place an object - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) - - // Try to pick it up - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_ObjectUnknown, o, "Failed to get correct object") - - // Check it's still there - _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, roveapi.Object_RockSmall, obj.Type, "Stash failed to remove object from atlas") - - // Check we don't have it - inv, err := world.RoverInventory(a) - assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, rover.Capacity, len(inv)) - - // Check that this didn't reduce the charge - info, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - assert.Equal(t, info.MaximumCharge, info.Charge, "Rover lost charge for non-stash") -} - func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) a, err := world.SpawnRover() @@ -229,63 +156,6 @@ func TestWorld_RoverDamage(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision") } -func TestWorld_RoverRepair(t *testing.T) { - world := NewWorld(2) - a, err := world.SpawnRover() - assert.NoError(t, err) - - pos := maths.Vector{ - X: 0.0, - Y: 0.0, - } - - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) - - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - originalInfo, err := world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - - // Pick up something to repair with - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") - - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) - - // Try and bump into the rock - vec, err := world.TryMoveRover(a, roveapi.Bearing_North) - assert.NoError(t, err, "Failed to move rover") - assert.Equal(t, pos, vec, "Rover managed to move into large rock") - - newinfo, err := world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") - - err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) - assert.NoError(t, err, "Failed to repair rover") - - newinfo, err = world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") - assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") - - // Check again that it can't repair past the max - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) - o, err = world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") - - err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) - assert.NoError(t, err, "Failed to repair rover") - - newinfo, err = world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") -} - func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) From edd3e5a6cbc3855ecd089c950e964ab3c70fce41 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:42:34 +0100 Subject: [PATCH 454/495] Fix test by removing object before warping rover --- pkg/rove/world_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 430d571..e1fa700 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -138,6 +138,7 @@ func TestWorld_RoverDamage(t *testing.T) { Y: 0.0, } + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") From 5b2ea533f41081564724025b7fe7c8891d1e5819 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:46:32 +0100 Subject: [PATCH 455/495] Remove incorrect proto comment --- proto/roveapi/roveapi.proto | 1 - 1 file changed, 1 deletion(-) diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 6b9515c..7acedac 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -126,7 +126,6 @@ message Command { bytes data = 2; // move - the bearing for the rover to turn to - // salvage - the direction of the rover Bearing bearing = 3; } From 1e4d642038660ceda198bc769c22d688efe5b7a1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 20:01:35 +0100 Subject: [PATCH 456/495] Add rover transfer command and implementation Need to swap the accounts --- pkg/rove/world.go | 54 +++++++++++++++++++ proto/roveapi/roveapi.pb.go | 104 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 2 + 3 files changed, 110 insertions(+), 50 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index a500287..afe7605 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -1,6 +1,7 @@ package rove import ( + "encoding/json" "fmt" "log" "math/rand" @@ -342,6 +343,53 @@ func (w *World) RoverSalvage(rover string) (roveapi.Object, error) { return obj.Type, nil } +// RoverTransfer will transfer rover control to dormant rover +func (w *World) RoverTransfer(rover string) (string, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + oldRover, ok := w.Rovers[rover] + if !ok { + return "", fmt.Errorf("no rover matching id") + } + + _, obj := w.Atlas.QueryPosition(oldRover.Pos) + if obj.Type != roveapi.Object_RoverDormant { + oldRover.AddLogEntryf("tried to transfer to dormant rover but found no rover") + return "", nil + } + + // Unmarshal the dormant rover + var newRover Rover + err := json.Unmarshal(obj.Data, &newRover) + if err != nil { + return "", err + } + + // Add logs + oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) + newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) + + // Marshal old rover + oldRoverData, err := json.Marshal(oldRover) + if err != nil { + return "", err + } + + // Add this new rover to tracking + w.Rovers[newRover.Name] = &newRover + + // TODO: Swap account rover to the dormant one + + // Place the old rover into the world + w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) + + // Remove old rover from current tracking + delete(w.Rovers, oldRover.Name) + + return newRover.Name, nil +} + // RoverToggle will toggle the sail position func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { w.worldMutex.Lock() @@ -506,6 +554,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { case roveapi.CommandType_stash: case roveapi.CommandType_repair: case roveapi.CommandType_salvage: + case roveapi.CommandType_transfer: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -639,6 +688,11 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { return err } + case roveapi.CommandType_transfer: + if _, err := w.RoverTransfer(rover); err != nil { + return err + } + default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index e86ab46..cc6fe07 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -51,6 +51,8 @@ const ( CommandType_broadcast CommandType = 5 // Salvages a neighboring dormant rover for parts CommandType_salvage CommandType = 6 + // Transfers remote control into dormant rover + CommandType_transfer CommandType = 7 ) // Enum value maps for CommandType. @@ -63,6 +65,7 @@ var ( 4: "repair", 5: "broadcast", 6: "salvage", + 7: "transfer", } CommandType_value = map[string]int32{ "none": 0, @@ -72,6 +75,7 @@ var ( "repair": 4, "broadcast": 5, "salvage": 6, + "transfer": 7, } ) @@ -635,7 +639,6 @@ type Command struct { // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to - // salvage - the direction of the rover Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` } @@ -1487,61 +1490,62 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, 0x43, + 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x6e, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, - 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, 0x01, - 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, - 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, - 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, - 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, - 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, - 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, - 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, - 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, - 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, - 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, + 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x07, 0x2a, 0x83, 0x01, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, + 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, + 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, + 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, + 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, + 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, + 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, + 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, - 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 7acedac..5470e19 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -101,6 +101,8 @@ enum CommandType { broadcast = 5; // Salvages a neighboring dormant rover for parts salvage = 6; + // Transfers remote control into dormant rover + transfer = 7; } // Bearing represents a compass direction From e840b3e47bc09e4e105aa2e89aae3fe62f15ed43 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 20:06:06 +0100 Subject: [PATCH 457/495] Move accountant into world --- cmd/rove-server/internal/routes.go | 14 +++++++------- cmd/rove-server/internal/server.go | 10 +++------- .../internal => pkg/accounts}/accounts.go | 2 +- .../internal => pkg/accounts}/accounts_test.go | 2 +- .../internal => pkg/accounts}/simpleAccountant.go | 2 +- pkg/rove/world.go | 5 +++++ 6 files changed, 18 insertions(+), 17 deletions(-) rename {cmd/rove-server/internal => pkg/accounts}/accounts.go (98%) rename {cmd/rove-server/internal => pkg/accounts}/accounts_test.go (98%) rename {cmd/rove-server/internal => pkg/accounts}/simpleAccountant.go (99%) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 86becd7..69dd820 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -34,7 +34,7 @@ func (s *Server) Register(ctx context.Context, req *roveapi.RegisterRequest) (*r return nil, fmt.Errorf("empty account name") } - if acc, err := s.accountant.RegisterAccount(req.Name); err != nil { + if acc, err := s.world.Accountant.RegisterAccount(req.Name); err != nil { return nil, err } else if _, err := s.SpawnRoverForAccount(req.Name); err != nil { @@ -57,13 +57,13 @@ func (s *Server) Register(ctx context.Context, req *roveapi.RegisterRequest) (*r func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (response *roveapi.StatusResponse, err error) { log.Printf("Handling status request: %s\n", req.Account.Name) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) - } else if resp, err := s.accountant.GetValue(req.Account.Name, "rover"); err != nil { + } else if resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover"); err != nil { return nil, err } else if rover, err := s.world.GetRover(resp); err != nil { @@ -117,7 +117,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi.RadarResponse, error) { log.Printf("Handling radar request: %s\n", req.Account.Name) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { @@ -126,7 +126,7 @@ func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi response := &roveapi.RadarResponse{} - resp, err := s.accountant.GetValue(req.Account.Name, "rover") + resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err @@ -149,14 +149,14 @@ func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi func (s *Server) Command(ctx context.Context, req *roveapi.CommandRequest) (*roveapi.CommandResponse, error) { log.Printf("Handling command request: %s and %+v\n", req.Account.Name, req.Commands) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) } - resp, err := s.accountant.GetValue(req.Account.Name, "rover") + resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 786eb00..564656e 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -27,9 +27,6 @@ type Server struct { // Internal state world *rove.World - // Accountant - accountant Accountant - // gRPC server netListener net.Listener grpcServ *grpc.Server @@ -80,7 +77,6 @@ func NewServer(opts ...ServerOption) *Server { persistence: EphemeralData, schedule: cron.New(), world: rove.NewWorld(32), - accountant: NewSimpleAccountant(), } // Apply all options @@ -188,7 +184,7 @@ func (s *Server) SaveWorld() error { if s.persistence == PersistentData { s.world.RLock() defer s.world.RUnlock() - if err := persistence.SaveAll("world", s.world, "accounts", s.accountant); err != nil { + if err := persistence.SaveAll("world", s.world); err != nil { return fmt.Errorf("failed to save out persistent data: %s", err) } } @@ -200,7 +196,7 @@ func (s *Server) LoadWorld() error { if s.persistence == PersistentData { s.world.Lock() defer s.world.Unlock() - if err := persistence.LoadAll("world", &s.world, "accounts", &s.accountant); err != nil { + if err := persistence.LoadAll("world", &s.world); err != nil { return err } } @@ -214,7 +210,7 @@ func (s *Server) SpawnRoverForAccount(account string) (string, error) { return "", err } - err = s.accountant.AssignData(account, "rover", inst) + err = s.world.Accountant.AssignData(account, "rover", inst) if err != nil { log.Printf("Failed to assign rover to account, %s", err) diff --git a/cmd/rove-server/internal/accounts.go b/pkg/accounts/accounts.go similarity index 98% rename from cmd/rove-server/internal/accounts.go rename to pkg/accounts/accounts.go index 9ae6db9..eb8637d 100644 --- a/cmd/rove-server/internal/accounts.go +++ b/pkg/accounts/accounts.go @@ -1,4 +1,4 @@ -package internal +package accounts // Accountant decribes something that stores accounts and account values type Accountant interface { diff --git a/cmd/rove-server/internal/accounts_test.go b/pkg/accounts/accounts_test.go similarity index 98% rename from cmd/rove-server/internal/accounts_test.go rename to pkg/accounts/accounts_test.go index 9e7891f..bd2416f 100644 --- a/cmd/rove-server/internal/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "testing" diff --git a/cmd/rove-server/internal/simpleAccountant.go b/pkg/accounts/simpleAccountant.go similarity index 99% rename from cmd/rove-server/internal/simpleAccountant.go rename to pkg/accounts/simpleAccountant.go index 611ff59..9d6c43f 100644 --- a/cmd/rove-server/internal/simpleAccountant.go +++ b/pkg/accounts/simpleAccountant.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "fmt" diff --git a/pkg/rove/world.go b/pkg/rove/world.go index afe7605..0d828ae 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -7,6 +7,7 @@ import ( "math/rand" "sync" + "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" ) @@ -40,6 +41,9 @@ type World struct { // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream + // Accountant + Accountant accounts.Accountant + // Mutex to lock around all world operations worldMutex sync.RWMutex // Mutex to lock around command operations @@ -54,6 +58,7 @@ func NewWorld(chunkSize int) *World { Atlas: NewChunkAtlas(chunkSize), TicksPerDay: 24, CurrentTicks: 0, + Accountant: accounts.NewSimpleAccountant(), } } From 6f2d67bd7c14e312cc5b44acef62addd2a8aa93e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:22:32 +0100 Subject: [PATCH 458/495] Tag rovers by the controlling account --- cmd/rove-server/internal/server.go | 2 +- pkg/rove/command_test.go | 14 +++++++------- pkg/rove/rover.go | 3 +++ pkg/rove/world.go | 12 ++++++++++-- pkg/rove/world_test.go | 26 +++++++++++++------------- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 564656e..42392f3 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -205,7 +205,7 @@ func (s *Server) LoadWorld() error { // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(account string) (string, error) { - inst, err := s.world.SpawnRover() + inst, err := s.world.SpawnRover(account) if err != nil { return "", err } diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 9a8a35a..6560e53 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -10,7 +10,7 @@ import ( func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover() + a, err := w.SpawnRover("tmp") assert.NoError(t, err) r, err := w.GetRover(a) @@ -36,7 +36,7 @@ func TestCommand_Toggle(t *testing.T) { func TestCommand_Turn(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover() + a, err := w.SpawnRover("tmp") assert.NoError(t, err) err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) @@ -50,7 +50,7 @@ func TestCommand_Turn(t *testing.T) { func TestCommand_Stash(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -78,7 +78,7 @@ func TestCommand_Stash(t *testing.T) { func TestCommand_Repair(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -118,7 +118,7 @@ func TestCommand_Repair(t *testing.T) { func TestCommand_Broadcast(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) // Enqueue the broadcast and tick @@ -133,7 +133,7 @@ func TestCommand_Broadcast(t *testing.T) { func TestCommand_Salvage(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -161,7 +161,7 @@ func TestCommand_Salvage(t *testing.T) { func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index ce0edcd..d0fb9cb 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -66,6 +66,9 @@ type Rover struct { // Logs Stores log of information Logs []RoverLogEntry + + // The account that owns this rover + Owner string } // DefaultRover returns a default rover object with default settings diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 0d828ae..922ab70 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -63,13 +63,16 @@ func NewWorld(chunkSize int) *World { } // SpawnRover adds an rover to the game -func (w *World) SpawnRover() (string, error) { +func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() // Initialise the rover rover := DefaultRover() + // Assign the owner + rover.Owner = account + // Spawn in a random place near the origin rover.Pos = maths.Vector{ X: 10 - rand.Intn(20), @@ -375,6 +378,9 @@ func (w *World) RoverTransfer(rover string) (string, error) { oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) + // Clear the old owner + oldRover.Owner = "" + // Marshal old rover oldRoverData, err := json.Marshal(oldRover) if err != nil { @@ -384,7 +390,9 @@ func (w *World) RoverTransfer(rover string) (string, error) { // Add this new rover to tracking w.Rovers[newRover.Name] = &newRover - // TODO: Swap account rover to the dormant one + // Swap account rover to the dormant one + newRover.Owner = oldRover.Owner + w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) // Place the old rover into the world w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index e1fa700..d0c4c01 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -18,9 +18,9 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Basic duplicate check @@ -33,7 +33,7 @@ func TestWorld_CreateRover(t *testing.T) { func TestWorld_GetRover(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) rover, err := world.GetRover(a) @@ -44,9 +44,9 @@ func TestWorld_GetRover(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) err = world.DestroyRover(a) @@ -62,7 +62,7 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) pos := maths.Vector{ @@ -97,9 +97,9 @@ func TestWorld_GetSetMovePosition(t *testing.T) { func TestWorld_RadarFromRover(t *testing.T) { // Create world that should have visible walls on the radar world := NewWorld(2) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp the rovers into position @@ -130,7 +130,7 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) pos := maths.Vector{ @@ -160,7 +160,7 @@ func TestWorld_RoverDamage(t *testing.T) { func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) // Remove rover charge @@ -199,10 +199,10 @@ func TestWorld_Daytime(t *testing.T) { func TestWorld_Broadcast(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp rovers near to eachother @@ -265,7 +265,7 @@ func TestWorld_Sailing(t *testing.T) { world.Tick() // One initial tick to set the wind direction the first time world.Wind = roveapi.Bearing_North // Set the wind direction to north - name, err := world.SpawnRover() + name, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp the rover to 0,0 after clearing it From fdfcc88540587ead99d016ebf9e0e69c5e78ddb6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:50:35 +0100 Subject: [PATCH 459/495] Move the account registration into the world --- cmd/rove-server/internal/server.go | 12 ------------ pkg/rove/world.go | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 42392f3..7debe0a 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -210,17 +210,5 @@ func (s *Server) SpawnRoverForAccount(account string) (string, error) { return "", err } - err = s.world.Accountant.AssignData(account, "rover", inst) - if err != nil { - log.Printf("Failed to assign rover to account, %s", err) - - // Try and clear up the rover - if err := s.world.DestroyRover(inst); err != nil { - log.Printf("Failed to destroy rover after failed rover assign: %s", err) - } - - return "", err - } - return inst, nil } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 922ab70..09d271a 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -97,7 +97,7 @@ func (w *World) SpawnRover(account string) (string, error) { // Append the rover to the list w.Rovers[rover.Name] = rover - return rover.Name, nil + return rover.Name, w.Accountant.AssignData(account, "rover", rover.Name) } // GetRover gets a specific rover by name From 57621d169aaa0669484eef832f9ee8f3678f5176 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:50:47 +0100 Subject: [PATCH 460/495] Implement a test for transfer and fix bugs --- pkg/rove/command_test.go | 52 ++++++++++++++++++++++++++++++++++++++++ pkg/rove/world.go | 27 +++++++++++---------- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 6560e53..13b95bf 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -1,6 +1,7 @@ package rove import ( + "encoding/json" "testing" "github.com/mdiluz/rove/pkg/maths" @@ -159,6 +160,57 @@ func TestCommand_Salvage(t *testing.T) { assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type) } +func TestCommand_Transfer(t *testing.T) { + w := NewWorld(8) + acc, err := w.Accountant.RegisterAccount("tmp") + assert.NoError(t, err) + nameA, err := w.SpawnRover(acc.Name) + assert.NoError(t, err) + + infoA, err := w.GetRover(nameA) + assert.NoError(t, err) + + // Drop a dormant rover on the current position + infoB := DefaultRover() + infoB.Name = "abc" + infoB.Pos = infoA.Pos + data, err := json.Marshal(infoB) + assert.NoError(t, err) + w.Atlas.SetObject(infoA.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data}) + + // Enqueue a transfer as well as a dud command + err = w.Enqueue(nameA, + &roveapi.Command{Command: roveapi.CommandType_transfer}, + &roveapi.Command{Command: roveapi.CommandType_broadcast, Data: []byte("xyz")}) + assert.NoError(t, err) + w.Tick() + + // Ensure both command queues are empty + assert.Empty(t, w.CommandQueue[nameA]) + assert.Empty(t, w.CommandQueue[infoB.Name]) + + // Verify the account now controls the new rover + accountRover, err := w.Accountant.GetValue(acc.Name, "rover") + assert.NoError(t, err) + assert.Equal(t, infoB.Name, accountRover) + + // Verify the position now has a dormant rover + _, obj := w.Atlas.QueryPosition(infoA.Pos) + assert.Equal(t, roveapi.Object_RoverDormant, obj.Type) + + // Verify the stored data matches + var stored Rover + err = json.Unmarshal(obj.Data, &stored) + assert.NoError(t, err) + assert.Equal(t, infoA.Name, stored.Name) + + // Verify the new rover data matches what we put in + infoB2, err := w.GetRover(infoB.Name) + assert.NoError(t, err) + assert.Equal(t, infoB.Name, infoB2.Name) + +} + func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) name, err := w.SpawnRover("tmp") diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 09d271a..bf68395 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -378,28 +378,26 @@ func (w *World) RoverTransfer(rover string) (string, error) { oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) - // Clear the old owner + // Transfer the ownership + w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + newRover.Owner = oldRover.Owner oldRover.Owner = "" - // Marshal old rover + // Place the old rover in the world oldRoverData, err := json.Marshal(oldRover) if err != nil { return "", err } - - // Add this new rover to tracking - w.Rovers[newRover.Name] = &newRover - - // Swap account rover to the dormant one - newRover.Owner = oldRover.Owner - w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) - - // Place the old rover into the world w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) - // Remove old rover from current tracking + // Swap the rovers in the tracking + w.Rovers[newRover.Name] = &newRover delete(w.Rovers, oldRover.Name) + // Clear the command queues for both rovers + delete(w.CommandQueue, oldRover.Name) + delete(w.CommandQueue, newRover.Name) + return newRover.Name, nil } @@ -599,7 +597,10 @@ func (w *World) Tick() { } // Extract the first command in the queue - w.CommandQueue[rover] = cmds[1:] + // Only if the command queue still has entries + if _, ok := w.CommandQueue[rover]; ok { + w.CommandQueue[rover] = cmds[1:] + } } else { // Clean out the empty entry From a93ce97b0bcfe4e21331e6d0d31f3b00a5e3805b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:54:06 +0100 Subject: [PATCH 461/495] Only assign rovers to accounts if given an account --- pkg/rove/command_test.go | 14 +++++++------- pkg/rove/world.go | 8 +++++++- pkg/rove/world_test.go | 26 +++++++++++++------------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 13b95bf..935e35d 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -11,7 +11,7 @@ import ( func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover("tmp") + a, err := w.SpawnRover("") assert.NoError(t, err) r, err := w.GetRover(a) @@ -37,7 +37,7 @@ func TestCommand_Toggle(t *testing.T) { func TestCommand_Turn(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover("tmp") + a, err := w.SpawnRover("") assert.NoError(t, err) err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) @@ -51,7 +51,7 @@ func TestCommand_Turn(t *testing.T) { func TestCommand_Stash(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -79,7 +79,7 @@ func TestCommand_Stash(t *testing.T) { func TestCommand_Repair(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -119,7 +119,7 @@ func TestCommand_Repair(t *testing.T) { func TestCommand_Broadcast(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) // Enqueue the broadcast and tick @@ -134,7 +134,7 @@ func TestCommand_Broadcast(t *testing.T) { func TestCommand_Salvage(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -213,7 +213,7 @@ func TestCommand_Transfer(t *testing.T) { func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index bf68395..3d651da 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -97,7 +97,13 @@ func (w *World) SpawnRover(account string) (string, error) { // Append the rover to the list w.Rovers[rover.Name] = rover - return rover.Name, w.Accountant.AssignData(account, "rover", rover.Name) + var err error + // Only assign if we've been given an account + if len(account) > 0 { + err = w.Accountant.AssignData(account, "rover", rover.Name) + } + + return rover.Name, err } // GetRover gets a specific rover by name diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index d0c4c01..747a891 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -18,9 +18,9 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Basic duplicate check @@ -33,7 +33,7 @@ func TestWorld_CreateRover(t *testing.T) { func TestWorld_GetRover(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) rover, err := world.GetRover(a) @@ -44,9 +44,9 @@ func TestWorld_GetRover(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) err = world.DestroyRover(a) @@ -62,7 +62,7 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) pos := maths.Vector{ @@ -97,9 +97,9 @@ func TestWorld_GetSetMovePosition(t *testing.T) { func TestWorld_RadarFromRover(t *testing.T) { // Create world that should have visible walls on the radar world := NewWorld(2) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Warp the rovers into position @@ -130,7 +130,7 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) pos := maths.Vector{ @@ -160,7 +160,7 @@ func TestWorld_RoverDamage(t *testing.T) { func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) // Remove rover charge @@ -199,10 +199,10 @@ func TestWorld_Daytime(t *testing.T) { func TestWorld_Broadcast(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Warp rovers near to eachother @@ -265,7 +265,7 @@ func TestWorld_Sailing(t *testing.T) { world.Tick() // One initial tick to set the wind direction the first time world.Wind = roveapi.Bearing_North // Set the wind direction to north - name, err := world.SpawnRover("tmp") + name, err := world.SpawnRover("") assert.NoError(t, err) // Warp the rover to 0,0 after clearing it From a0e04b7e3a287ee842d9240edd57f18e7e4271d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:56:35 +0100 Subject: [PATCH 462/495] Placed dormant world rovers randomly have better base stats --- pkg/rove/worldgen.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index e36b7b6..724837d 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -3,6 +3,7 @@ package rove import ( "encoding/json" "log" + "math/rand" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" @@ -76,6 +77,12 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Set the rover variables r.Pos = v + // Upgrade this rover randomly + r.MaximumCharge += rand.Int() % 3 + r.MaximumIntegrity += rand.Int() % 3 + r.Capacity += rand.Int() % 3 + r.Range += rand.Int() % 3 + // For now, mark the log as corrupted r.AddLogEntryf("log corrupted") From 7be0f83c5ea64bdcaf3635bc747e664fb54eaf20 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:58:59 +0100 Subject: [PATCH 463/495] Fix golanglint missing error check --- pkg/rove/world.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 3d651da..27ded3b 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -385,7 +385,10 @@ func (w *World) RoverTransfer(rover string) (string, error) { newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) // Transfer the ownership - w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + err = w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + if err != nil { + return "", err + } newRover.Owner = oldRover.Owner oldRover.Owner = "" From 5d4fd801c108607b07979eaade39dc05333a9bab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 23:22:46 +0100 Subject: [PATCH 464/495] Add the starting wind as north and ensure it's only updated the next day --- pkg/rove/world.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 27ded3b..7e22323 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -59,6 +59,7 @@ func NewWorld(chunkSize int) *World { TicksPerDay: 24, CurrentTicks: 0, Accountant: accounts.NewSimpleAccountant(), + Wind: roveapi.Bearing_North, } } @@ -617,11 +618,6 @@ func (w *World) Tick() { } } - // Change the wind every day - if (w.CurrentTicks % w.TicksPerDay) == 0 { - w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing - } - // Move all the rovers based on current wind and sails for n, r := range w.Rovers { // Skip if we're not catching the wind @@ -675,6 +671,11 @@ func (w *World) Tick() { // Increment the current tick count w.CurrentTicks++ + + // Change the wind every day + if (w.CurrentTicks % w.TicksPerDay) == 0 { + w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing + } } // ExecuteCommand will execute a single command From f9b3ce3edbd6087987c1b79dae97568f33f973db Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:13:05 +0100 Subject: [PATCH 465/495] Destroy the rover when it has 0 integrity --- pkg/rove/world.go | 44 +++++++++++++++++++++++++++++++++--------- pkg/rove/world_test.go | 20 +++++++++++++++++-- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 7e22323..ea1fdd3 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -67,7 +67,11 @@ func NewWorld(chunkSize int) *World { func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() + return w.spawnRover(account) +} +// spawnRover adds an rover to the game (without lock) +func (w *World) spawnRover(account string) (string, error) { // Initialise the rover rover := DefaultRover() @@ -176,17 +180,28 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) { return } -// DestroyRover Removes an rover from the game -func (w *World) DestroyRover(rover string) error { - w.worldMutex.Lock() - defer w.worldMutex.Unlock() - - _, ok := w.Rovers[rover] +// destroyRover Removes an rover from the game +func (w *World) destroyRover(rover string) error { + r, ok := w.Rovers[rover] if !ok { return fmt.Errorf("no rover matching id") } + // Remove this rover from tracked rovers delete(w.Rovers, rover) + + r.Owner = "" + r.AddLogEntryf("rover destroyed") + + // Marshal the rover data + data, err := json.Marshal(r) + if err != nil { + return err + } + + // Place the dormant rover down + w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data}) + return nil } @@ -276,9 +291,20 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) - // TODO: The rover needs to be left dormant with the player - //if i.Integrity == 0 { - //} + + if i.Integrity == 0 { + // The rover has died destroy it + err := w.destroyRover(rover) + if err != nil { + return maths.Vector{}, err + } + + // Spawn a new one for this account + _, err = w.spawnRover(i.Owner) + if err != nil { + return maths.Vector{}, err + } + } } return i.Pos, nil diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 747a891..8363c0b 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -49,7 +49,7 @@ func TestWorld_DestroyRover(t *testing.T) { b, err := world.SpawnRover("") assert.NoError(t, err) - err = world.DestroyRover(a) + err = world.destroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check @@ -130,7 +130,9 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover("") + acc, err := world.Accountant.RegisterAccount("tmp") + assert.NoError(t, err) + a, err := world.SpawnRover(acc.Name) assert.NoError(t, err) pos := maths.Vector{ @@ -155,6 +157,20 @@ func TestWorld_RoverDamage(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity") assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision") + + // Keep moving to damage the rover + for i := 0; i < info.Integrity-1; i++ { + vec, err := world.TryMoveRover(a, roveapi.Bearing_North) + assert.NoError(t, err, "Failed to move rover") + assert.Equal(t, pos, vec, "Rover managed to move into large rock") + } + + // Rover should have been destroyed now + _, err = world.GetRover(a) + assert.Error(t, err) + + _, obj := world.Atlas.QueryPosition(info.Pos) + assert.Equal(t, roveapi.Object_RoverDormant, obj.Type) } func TestWorld_Daytime(t *testing.T) { From cd97220a11969c3219fa8f9ea965d6d4631d3295 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:18:21 +0100 Subject: [PATCH 466/495] Perform rover destruction during the main server tick --- pkg/rove/world.go | 46 +++++++++++++++++++++++------------------- pkg/rove/world_test.go | 5 ++++- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index ea1fdd3..dc163f3 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -63,15 +63,11 @@ func NewWorld(chunkSize int) *World { } } -// SpawnRover adds an rover to the game +// SpawnRover adds an rover to the game (without lock) func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - return w.spawnRover(account) -} -// spawnRover adds an rover to the game (without lock) -func (w *World) spawnRover(account string) (string, error) { // Initialise the rover rover := DefaultRover() @@ -180,8 +176,11 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) { return } -// destroyRover Removes an rover from the game -func (w *World) destroyRover(rover string) error { +// DestroyRover Removes an rover from the game +func (w *World) DestroyRover(rover string) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + r, ok := w.Rovers[rover] if !ok { return fmt.Errorf("no rover matching id") @@ -291,20 +290,6 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) - - if i.Integrity == 0 { - // The rover has died destroy it - err := w.destroyRover(rover) - if err != nil { - return maths.Vector{}, err - } - - // Spawn a new one for this account - _, err = w.spawnRover(i.Owner) - if err != nil { - return maths.Vector{}, err - } - } } return i.Pos, nil @@ -695,6 +680,25 @@ func (w *World) Tick() { } } + // Check all rover integrities + for _, r := range w.Rovers { + if r.Integrity <= 0 { + // The rover has died destroy it + err := w.DestroyRover(r.Name) + if err != nil { + log.Println(err) + // TODO: Report this error somehow + } + + // Spawn a new one for this account + _, err = w.SpawnRover(r.Owner) + if err != nil { + log.Println(err) + // TODO: Report this error somehow + } + } + } + // Increment the current tick count w.CurrentTicks++ diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 8363c0b..afc8f53 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -49,7 +49,7 @@ func TestWorld_DestroyRover(t *testing.T) { b, err := world.SpawnRover("") assert.NoError(t, err) - err = world.destroyRover(a) + err = world.DestroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check @@ -165,6 +165,9 @@ func TestWorld_RoverDamage(t *testing.T) { assert.Equal(t, pos, vec, "Rover managed to move into large rock") } + // Tick the world to check for rover deaths + world.Tick() + // Rover should have been destroyed now _, err = world.GetRover(a) assert.Error(t, err) From 113090fbcb5b041d46709804a8ea1a89566f76ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:39:13 +0100 Subject: [PATCH 467/495] Fix bug where we were still placing psuedo-random objects down --- pkg/rove/chunkAtlas.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/rove/chunkAtlas.go b/pkg/rove/chunkAtlas.go index 88f1102..1903c7b 100644 --- a/pkg/rove/chunkAtlas.go +++ b/pkg/rove/chunkAtlas.go @@ -2,7 +2,6 @@ package rove import ( "log" - "math/rand" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" @@ -111,15 +110,6 @@ func (a *chunkBasedAtlas) populate(chunk int) { } } - // Set up any objects - for i := 0; i < len(c.Tiles); i++ { - if rand.Intn(16) == 0 { - c.Objects[i] = Object{Type: roveapi.Object_RockLarge} - } else if rand.Intn(32) == 0 { - c.Objects[i] = Object{Type: roveapi.Object_RockSmall} - } - } - a.Chunks[chunk] = c } From 6891ec843968022f51180a9a6069f8001e0e760f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:39:32 +0100 Subject: [PATCH 468/495] Adjust the terrain scale to be much larger --- pkg/rove/worldgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 724837d..dd864b8 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -33,7 +33,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { } const ( - terrainNoiseScale = 6 + terrainNoiseScale = 15 rockNoiseScale = 3 ) From cec61a9db75c02e4f0b9c258ea3bb4df42f0052c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 16:57:43 +0100 Subject: [PATCH 469/495] Big update to help text and add a simple description --- cmd/rove/main.go | 49 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index b3a7ed6..2340d0d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -22,24 +22,28 @@ var defaultDataPath = path.Join(home, ".local/share/") // Command usage func printUsage() { - fmt.Fprintf(os.Stderr, "Usage: rove COMMAND [ARGS...]\n") - fmt.Fprintln(os.Stderr, "\nCommands") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tcommand COMMAND [VAL...] issue commands to rover, accepts multiple, see below") - fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") - fmt.Fprintln(os.Stderr, "\tstatus gets status info for current rover") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") - fmt.Fprintln(os.Stderr, "\tversion outputs version info") - fmt.Fprintln(os.Stderr, "\nRover commands:") - fmt.Fprintln(os.Stderr, "\ttoggle toggles the sails, either catching the wind, or charging from the sun") - fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") - fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") - fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") - fmt.Fprintln(os.Stderr, "\nEnvironment") - fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) + fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Arguments:") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Rover commands:") + fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") + fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") + fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") + fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") + fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Environment") + fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } const gRPCport = 9090 @@ -356,6 +360,15 @@ func InnerMain(command string, args ...string) error { func main() { // Bail without any args if len(os.Args) == 1 { + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "m mm mmm m m mmm") + fmt.Fprintln(os.Stderr, "#\" \" #\" \"# \"m m\" #\" #") + fmt.Fprintln(os.Stderr, "# # # #m# #\"\"\"\"") + fmt.Fprintln(os.Stderr, "# \"#m#\" # \"#mm\"") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Rove is an asychronous nomadic game about exploring a planet as part of a loose community.") + fmt.Fprintln(os.Stderr, "Visit https://mdiluz.github.io/rove/ for more information.") + fmt.Fprintf(os.Stderr, "\n") printUsage() os.Exit(1) } From bcf71f0bf9991f25f5f177f0d3d92cf16cbb47c9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:09:47 +0100 Subject: [PATCH 470/495] Add a "wait" command with a number --- pkg/rove/command_test.go | 37 ++++- pkg/rove/world.go | 39 +++-- proto/roveapi/roveapi.pb.go | 289 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 11 +- 4 files changed, 218 insertions(+), 158 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 935e35d..592b40c 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -9,6 +9,15 @@ import ( "github.com/stretchr/testify/assert" ) +func TestCommand_Invalid(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover("") + assert.NoError(t, err) + + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) + assert.Error(t, err) +} + func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) a, err := w.SpawnRover("") @@ -211,11 +220,31 @@ func TestCommand_Transfer(t *testing.T) { } -func TestCommand_Invalid(t *testing.T) { +func TestCommand_Wait(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("") + a, err := w.SpawnRover("") assert.NoError(t, err) - err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) - assert.Error(t, err) + r, err := w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) + + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Number: 5}, &roveapi.Command{Command: roveapi.CommandType_toggle}) + assert.NoError(t, err) + + // Tick 5 times during the wait + for i := 0; i < 5; i++ { + w.Tick() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) + } + + // One last tick to do the toggle + w.Tick() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index dc163f3..07e8e5e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -582,6 +582,10 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } + case roveapi.CommandType_wait: + if c.GetNumber() <= 0 { + return fmt.Errorf("wait command must be given positie number of ticks to wait") + } case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: @@ -612,15 +616,16 @@ func (w *World) Tick() { if len(cmds) != 0 { // Execute the command - if err := w.ExecuteCommand(cmds[0], rover); err != nil { + if done, err := w.ExecuteCommand(cmds[0], rover); err != nil { log.Println(err) // TODO: Report this error somehow - } - // Extract the first command in the queue - // Only if the command queue still has entries - if _, ok := w.CommandQueue[rover]; ok { - w.CommandQueue[rover] = cmds[1:] + } else if done { + // Extract the first command in the queue + // Only if the command queue still has entries (the command may have modified this queue) + if _, ok := w.CommandQueue[rover]; ok { + w.CommandQueue[rover] = cmds[1:] + } } } else { @@ -709,46 +714,50 @@ func (w *World) Tick() { } // ExecuteCommand will execute a single command -func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { +func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) switch c.Command { case roveapi.CommandType_toggle: if _, err := w.RoverToggle(rover); err != nil { - return err + return true, err } case roveapi.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { - return err + return true, err } case roveapi.CommandType_repair: if _, err := w.RoverRepair(rover); err != nil { - return err + return true, err } case roveapi.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.GetData()); err != nil { - return err + return true, err } case roveapi.CommandType_turn: if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { - return err + return true, err } case roveapi.CommandType_salvage: if _, err := w.RoverSalvage(rover); err != nil { - return err + return true, err } case roveapi.CommandType_transfer: if _, err := w.RoverTransfer(rover); err != nil { - return err + return true, err } + case roveapi.CommandType_wait: + c.Number-- + return c.Number == 0, nil + default: - return fmt.Errorf("unknown command: %s", c.Command) + return true, fmt.Errorf("unknown command: %s", c.Command) } return diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index cc6fe07..2b4df0b 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -53,6 +53,8 @@ const ( CommandType_salvage CommandType = 6 // Transfers remote control into dormant rover CommandType_transfer CommandType = 7 + // Waits for the specified number of server ticks (requires number) + CommandType_wait CommandType = 8 ) // Enum value maps for CommandType. @@ -66,6 +68,7 @@ var ( 5: "broadcast", 6: "salvage", 7: "transfer", + 8: "wait", } CommandType_value = map[string]int32{ "none": 0, @@ -76,6 +79,7 @@ var ( "broadcast": 5, "salvage": 6, "transfer": 7, + "wait": 8, } ) @@ -640,6 +644,8 @@ type Command struct { Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // wait - the number of server ticks to wait + Number int32 `protobuf:"varint,4,opt,name=number,proto3" json:"number,omitempty"` } func (x *Command) Reset() { @@ -695,6 +701,13 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } +func (x *Command) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1408,144 +1421,146 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x6a, 0x0a, + 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, + 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, + 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, + 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, + 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, + 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, - 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, - 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, - 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, - 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, - 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x6e, 0x0a, 0x0b, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, - 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, - 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, - 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, - 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x07, 0x2a, 0x83, 0x01, 0x0a, 0x07, - 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, - 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, - 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, - 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, - 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, - 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, - 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x78, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, + 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, + 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, + 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x08, 0x2a, 0x83, + 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, + 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, + 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, + 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, + 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, + 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, + 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, + 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, + 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 5470e19..46cb858 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -103,6 +103,8 @@ enum CommandType { salvage = 6; // Transfers remote control into dormant rover transfer = 7; + // Waits for the specified number of server ticks (requires number) + wait = 8; } // Bearing represents a compass direction @@ -124,11 +126,15 @@ message Command { // The command type CommandType command = 1; - // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + // broadcast - a simple message, must be composed of up to 3 printable ASCII + // glyphs (32-126) bytes data = 2; // move - the bearing for the rover to turn to Bearing bearing = 3; + + // wait - the number of server ticks to wait + int32 number = 4; } // CommandRequest describes a set of commands to be requested for the rover @@ -164,7 +170,8 @@ enum Object { // RockLarge is a large blocking rock RockLarge = 4; - // RoverParts is one unit of rover parts, used for repairing and fixing the rover + // RoverParts is one unit of rover parts, used for repairing and fixing the + // rover RoverParts = 5; } From 15146035177e6ba8da33bb26861beb70b905a1bb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:19:04 +0100 Subject: [PATCH 471/495] Allow number to be used in all commands --- pkg/rove/world.go | 43 +++++++++++-------------------------- proto/roveapi/roveapi.pb.go | 42 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 12 +++++------ 3 files changed, 40 insertions(+), 57 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 07e8e5e..4d08c7a 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -717,50 +717,31 @@ func (w *World) Tick() { func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) + // Decrement the number of the command + c.Number-- + switch c.Command { case roveapi.CommandType_toggle: - if _, err := w.RoverToggle(rover); err != nil { - return true, err - } + _, err = w.RoverToggle(rover) case roveapi.CommandType_stash: - if _, err := w.RoverStash(rover); err != nil { - return true, err - } - + _, err = w.RoverStash(rover) case roveapi.CommandType_repair: - if _, err := w.RoverRepair(rover); err != nil { - return true, err - } - + _, err = w.RoverRepair(rover) case roveapi.CommandType_broadcast: - if err := w.RoverBroadcast(rover, c.GetData()); err != nil { - return true, err - } - + err = w.RoverBroadcast(rover, c.GetData()) case roveapi.CommandType_turn: - if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { - return true, err - } - + _, err = w.RoverTurn(rover, c.GetBearing()) case roveapi.CommandType_salvage: - if _, err := w.RoverSalvage(rover); err != nil { - return true, err - } - + _, err = w.RoverSalvage(rover) case roveapi.CommandType_transfer: - if _, err := w.RoverTransfer(rover); err != nil { - return true, err - } - + _, err = w.RoverTransfer(rover) case roveapi.CommandType_wait: - c.Number-- - return c.Number == 0, nil - + // Nothing to do default: return true, fmt.Errorf("unknown command: %s", c.Command) } - return + return c.Number <= 0, err } // Daytime returns if it's currently daytime diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 2b4df0b..4c0178e 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -53,7 +53,7 @@ const ( CommandType_salvage CommandType = 6 // Transfers remote control into dormant rover CommandType_transfer CommandType = 7 - // Waits for the specified number of server ticks (requires number) + // Waits before performing the next command CommandType_wait CommandType = 8 ) @@ -193,7 +193,8 @@ const ( Object_RockSmall Object = 3 // RockLarge is a large blocking rock Object_RockLarge Object = 4 - // RoverParts is one unit of rover parts, used for repairing and fixing the rover + // RoverParts is one unit of rover parts, used for repairing and fixing the + // rover Object_RoverParts Object = 5 ) @@ -640,12 +641,13 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The number of times to execute the command (assumes 1 if not present or 0) + Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // broadcast - a simple message, must be composed of up to 3 printable ASCII + // glyphs (32-126) + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to - Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` - // wait - the number of server ticks to wait - Number int32 `protobuf:"varint,4,opt,name=number,proto3" json:"number,omitempty"` + Bearing Bearing `protobuf:"varint,4,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` } func (x *Command) Reset() { @@ -687,6 +689,13 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } +func (x *Command) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + func (x *Command) GetData() []byte { if x != nil { return x.Data @@ -701,13 +710,6 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } -func (x *Command) GetNumber() int32 { - if x != nil { - return x.Number - } - return 0 -} - // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1425,12 +1427,12 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x6a, 0x0a, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 46cb858..21c992b 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -103,7 +103,7 @@ enum CommandType { salvage = 6; // Transfers remote control into dormant rover transfer = 7; - // Waits for the specified number of server ticks (requires number) + // Waits before performing the next command wait = 8; } @@ -126,15 +126,15 @@ message Command { // The command type CommandType command = 1; + // The number of times to execute the command (assumes 1 if not present or 0) + int32 number = 2; + // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) - bytes data = 2; + bytes data = 3; // move - the bearing for the rover to turn to - Bearing bearing = 3; - - // wait - the number of server ticks to wait - int32 number = 4; + Bearing bearing = 4; } // CommandRequest describes a set of commands to be requested for the rover From c0d4a809c9f88d61a84ad1b23a207adbafd101a6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:31:09 +0100 Subject: [PATCH 472/495] Update command line client to allow specifying command number --- cmd/rove/main.go | 43 +++++++++++++++++++++++++++++-------------- cmd/rove/main_test.go | 4 ++++ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2340d0d..6613121 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -8,6 +8,7 @@ import ( "os" "path" "path/filepath" + "strconv" "time" "github.com/mdiluz/rove/cmd/rove/internal" @@ -25,22 +26,23 @@ func printUsage() { fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Arguments:") - fmt.Fprintln(os.Stderr, "\tversion outputs version") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") - fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") - fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand [NUM] CMD [VAL...] queues commands, accepts multiple, see below") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") - fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") - fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") - fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") - fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") - fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") + fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") + fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") + fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") + fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\twait waits before performing the next command") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Environment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) @@ -236,6 +238,16 @@ func InnerMain(command string, args ...string) error { // Iterate through each command var commands []*roveapi.Command for i := 0; i < len(args); i++ { + number := 0 + num, err := strconv.Atoi(args[i]) + if err == nil { + number = num + i++ + if i >= len(args) { + return fmt.Errorf("must pass command after number") + } + } + switch args[i] { case "turn": i++ @@ -250,6 +262,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_turn, Bearing: b, + Number: int32(number), }, ) case "broadcast": @@ -263,6 +276,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), + Number: int32(number), }, ) default: @@ -270,6 +284,7 @@ func InnerMain(command string, args ...string) error { commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), + Number: int32(number), }, ) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 2eb564c..50fdf98 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -54,8 +54,12 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) + assert.NoError(t, InnerMain("command", "10", "wait")) + assert.NoError(t, InnerMain("command", "1", "wait", "turn", "NW", "toggle", "broadcast", "zyx")) // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) + assert.Error(t, InnerMain("command", "0", "wait")) + assert.Error(t, InnerMain("command", "1")) } From 74e1cd4564eae3ba165ba3b6f187fd4a2394ecd0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 18:02:06 +0100 Subject: [PATCH 473/495] Convert number to repeat to avoid confusion --- cmd/rove/main.go | 24 ++++++++++++------------ cmd/rove/main_test.go | 1 - pkg/rove/command_test.go | 4 ++-- pkg/rove/world.go | 10 +++------- proto/roveapi/roveapi.pb.go | 12 ++++++------ proto/roveapi/roveapi.proto | 4 ++-- 6 files changed, 25 insertions(+), 30 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 6613121..9fc853a 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -26,14 +26,14 @@ func printUsage() { fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Arguments:") - fmt.Fprintln(os.Stderr, "\tversion outputs version") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") - fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") - fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand [NUM] CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand [REPEAT] CMD [VAL...] queues commands, accepts multiple in sequence for command values see below") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") @@ -244,7 +244,7 @@ func InnerMain(command string, args ...string) error { number = num i++ if i >= len(args) { - return fmt.Errorf("must pass command after number") + return fmt.Errorf("must pass command after repeat number") } } @@ -262,7 +262,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_turn, Bearing: b, - Number: int32(number), + Repeat: int32(number), }, ) case "broadcast": @@ -276,7 +276,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), - Number: int32(number), + Repeat: int32(number), }, ) default: @@ -284,7 +284,7 @@ func InnerMain(command string, args ...string) error { commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), - Number: int32(number), + Repeat: int32(number), }, ) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 50fdf98..d0e12d6 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -60,6 +60,5 @@ func Test_InnerMain(t *testing.T) { // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) - assert.Error(t, InnerMain("command", "0", "wait")) assert.Error(t, InnerMain("command", "1")) } diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 592b40c..dde7070 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -229,10 +229,10 @@ func TestCommand_Wait(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) - err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Number: 5}, &roveapi.Command{Command: roveapi.CommandType_toggle}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Repeat: 4}, &roveapi.Command{Command: roveapi.CommandType_toggle}) assert.NoError(t, err) - // Tick 5 times during the wait + // Tick 5 times during the wait (1 normal execute + 4) for i := 0; i < 5; i++ { w.Tick() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 4d08c7a..d2483b5 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -583,9 +583,6 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { return fmt.Errorf("turn command given unknown bearing") } case roveapi.CommandType_wait: - if c.GetNumber() <= 0 { - return fmt.Errorf("wait command must be given positie number of ticks to wait") - } case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: @@ -717,9 +714,6 @@ func (w *World) Tick() { func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) - // Decrement the number of the command - c.Number-- - switch c.Command { case roveapi.CommandType_toggle: _, err = w.RoverToggle(rover) @@ -741,7 +735,9 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err return true, fmt.Errorf("unknown command: %s", c.Command) } - return c.Number <= 0, err + // Decrement the repeat number + c.Repeat-- + return c.Repeat < 0, err } // Daytime returns if it's currently daytime diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 4c0178e..753c058 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -641,8 +641,8 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // The number of times to execute the command (assumes 1 if not present or 0) - Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // The number of times to repeat the command after the first + Repeat int32 `protobuf:"varint,2,opt,name=repeat,proto3" json:"repeat,omitempty"` // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` @@ -689,9 +689,9 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } -func (x *Command) GetNumber() int32 { +func (x *Command) GetRepeat() int32 { if x != nil { - return x.Number + return x.Repeat } return 0 } @@ -1427,8 +1427,8 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 21c992b..9aad682 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -126,8 +126,8 @@ message Command { // The command type CommandType command = 1; - // The number of times to execute the command (assumes 1 if not present or 0) - int32 number = 2; + // The number of times to repeat the command after the first + int32 repeat = 2; // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) From e542999b91e167d8b90c63c131ccfed2d0cb6f4b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 18:10:55 +0100 Subject: [PATCH 474/495] Move test deployment out to it's own file --- Makefile | 4 ++-- docker-compose-test.yml | 31 +++++++++++++++++++++++++++++++ docker-compose.yml | 13 ------------- 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 docker-compose-test.yml diff --git a/Makefile b/Makefile index b73faf0..be0edcb 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ test: go test -v ./... @echo Integration tests - docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests - docker-compose down + docker-compose -f docker-compose-test.yml up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests + docker-compose -f docker-compose-test.yml down go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html @echo Done, coverage data can be found in /tmp/coverage.html diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..64a71a8 --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,31 @@ +version: '3' + +services: + rove-test-server: + build: + context: . + dockerfile: Dockerfile + image: rove:latest + ports: + - "9090:9090" + environment: + - PORT=9090 + - DATA_PATH=/tmp/ + - WORDS_FILE=data/words_alpha.txt + - TICK_RATE=10 + command: [ "./rove-server"] + + rove-tests: + depends_on: [ rove-test-server ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + environment: + - ROVE_GRPC=rove-test-server + command: [ "./script/wait-for-it.sh", "rove-test-server:9090", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] + volumes: + - /tmp/coverage-data:/mnt/coverage-data:rw + + + diff --git a/docker-compose.yml b/docker-compose.yml index f1962a9..f84d876 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,17 +20,4 @@ services: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] - rove-tests: - depends_on: [ rove-server ] - build: - context: . - dockerfile: Dockerfile - image: rove:latest - environment: - - ROVE_GRPC=rove-server - command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] - volumes: - - /tmp/coverage-data:/mnt/coverage-data:rw - - From a321e5d72f3a3356a6ec6621321c50173b372be7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 22:48:48 +0100 Subject: [PATCH 475/495] Add gRPC reflection to the server --- cmd/rove-server/internal/server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 7debe0a..e32f64a 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -11,6 +11,7 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" + "google.golang.org/grpc/reflection" ) const ( @@ -105,6 +106,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { } s.grpcServ = grpc.NewServer() roveapi.RegisterRoveServer(s.grpcServ, s) + reflection.Register(s.grpcServ) return nil } From 70d92c2d5ee06c221fdaa3c1df44e03530322b8b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:10:39 +0100 Subject: [PATCH 476/495] Add TLS to gRPC --- cmd/rove-server/internal/server.go | 20 +++++++++++++++++++- cmd/rove-server/internal/server_test.go | 3 +++ docker-compose-test.yml | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index e32f64a..4969687 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "net" + "os" + "path" "sync" "github.com/mdiluz/rove/pkg/persistence" @@ -11,9 +13,12 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" "google.golang.org/grpc/reflection" ) +var cert = os.Getenv("CERT_NAME") + const ( // PersistentData will allow the server to load and save it's state PersistentData = iota @@ -104,7 +109,20 @@ func (s *Server) Initialise(fillWorld bool) (err error) { if err != nil { log.Fatalf("failed to listen: %v", err) } - s.grpcServ = grpc.NewServer() + + // Load TLS + var opts []grpc.ServerOption + if len(os.Getenv("NO_TLS")) == 0 { + pem := path.Join("/etc/letsencrypt/live/", cert, "cert.pem") + key := path.Join("/etc/letsencrypt/live/", cert, "privkey.pem") + creds, err := credentials.NewServerTLSFromFile(pem, key) + if err != nil { + log.Fatalf("failed to setup TLS: %v", err) + } + opts = append(opts, grpc.Creds(creds)) + } + + s.grpcServ = grpc.NewServer(opts...) roveapi.RegisterRoveServer(s.grpcServ, s) reflection.Register(s.grpcServ) diff --git a/cmd/rove-server/internal/server_test.go b/cmd/rove-server/internal/server_test.go index 36db679..40d4b80 100644 --- a/cmd/rove-server/internal/server_test.go +++ b/cmd/rove-server/internal/server_test.go @@ -1,6 +1,7 @@ package internal import ( + "os" "testing" ) @@ -30,6 +31,7 @@ func TestNewServer_OptionPersistentData(t *testing.T) { } func TestServer_Run(t *testing.T) { + os.Setenv("NO_TLS", "1") server := NewServer() if server == nil { t.Error("Failed to create server") @@ -45,6 +47,7 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { + os.Setenv("NO_TLS", "1") server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 64a71a8..aec8cee 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -13,6 +13,7 @@ services: - DATA_PATH=/tmp/ - WORDS_FILE=data/words_alpha.txt - TICK_RATE=10 + - NO_TLS=1 command: [ "./rove-server"] rove-tests: From ac3844fe7af5da3fb1d685ed8cd081d1fc141c88 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:26:36 +0100 Subject: [PATCH 477/495] Mount letsencrypt in the docker to read the certs --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index f84d876..05dd68f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,6 +18,7 @@ services: - TICK_RATE=3 volumes: - persistent-data:/mnt/rove-server:rw + - /etc/letsencrypt/:/etc/letsencrypt/ command: [ "./rove-server"] From 4821a901434ef4072afe62c728083b20dc31abcf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:29:58 +0100 Subject: [PATCH 478/495] Pass the cert name into the docker deployment --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 05dd68f..d5606f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ services: - DATA_PATH=/mnt/rove-server - WORDS_FILE=data/words_alpha.txt - TICK_RATE=3 + - CERT_NAME=${CERT_NAME} volumes: - persistent-data:/mnt/rove-server:rw - /etc/letsencrypt/:/etc/letsencrypt/ From 9b03ffb7f1a0cf4cb41d7f40fd4917dd86483971 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:30:09 +0100 Subject: [PATCH 479/495] Add skip verify on the client for now --- cmd/rove/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 9fc853a..99a1f77 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -1,6 +1,7 @@ package main import ( + "crypto/tls" "encoding/json" "fmt" "io/ioutil" @@ -16,6 +17,7 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "golang.org/x/net/context" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) var home = os.Getenv("HOME") @@ -185,8 +187,12 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } + tls := &tls.Config{ + InsecureSkipVerify: true, + } + // Set up the server - clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithInsecure()) + clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) if err != nil { return err } From 71a0ef9920ac06845013d03ef24e6ceae3c3563f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:36:34 +0100 Subject: [PATCH 480/495] Use the fullchain.pem not the cert.pem as explained by letsencrypt --- cmd/rove-server/internal/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 4969687..e2b7e16 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -113,7 +113,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { // Load TLS var opts []grpc.ServerOption if len(os.Getenv("NO_TLS")) == 0 { - pem := path.Join("/etc/letsencrypt/live/", cert, "cert.pem") + pem := path.Join("/etc/letsencrypt/live/", cert, "fullchain.pem") key := path.Join("/etc/letsencrypt/live/", cert, "privkey.pem") creds, err := credentials.NewServerTLSFromFile(pem, key) if err != nil { From cf1dff2814586b04855230735552e81d3e0727f9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:41:52 +0100 Subject: [PATCH 481/495] Make sure the client verifies the TLS --- cmd/rove/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 99a1f77..4ea6a45 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,9 +187,7 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{ - InsecureSkipVerify: true, - } + tls := &tls.Config{} // Set up the server clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) From 4f2a7edeb1828bdbd6ac8aed00d214b640022cca Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:42:23 +0100 Subject: [PATCH 482/495] Skip local tests, removing duplicate test runs --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index be0edcb..3aedd83 100644 --- a/Makefile +++ b/Makefile @@ -18,10 +18,7 @@ gen: protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:proto/ proto/roveapi/roveapi.proto test: - @echo Unit tests - go test -v ./... - - @echo Integration tests + @echo Run unit and integration tests docker-compose -f docker-compose-test.yml up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests docker-compose -f docker-compose-test.yml down go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html From 500e0f9557571f96a6b8b45e7ad971e47c574f23 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:46:42 +0100 Subject: [PATCH 483/495] Skip the tls verify on the client side for now --- cmd/rove/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 4ea6a45..99a1f77 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,7 +187,9 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{} + tls := &tls.Config{ + InsecureSkipVerify: true, + } // Set up the server clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) From 94767f06d3c4c7e4c4f2dd23e4b1da9165ba2f74 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:53:29 +0100 Subject: [PATCH 484/495] Fix to disable TLS in tests --- cmd/rove/main.go | 9 ++++++--- cmd/rove/main_test.go | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 99a1f77..06999d3 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,12 +187,15 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{ - InsecureSkipVerify: true, + var opts []grpc.DialOption + if len(os.Getenv("NO_TLS")) == 0 { + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) + } else { + opts = append(opts, grpc.WithInsecure()) } // Set up the server - clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) + clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), opts...) if err != nil { return err } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index d0e12d6..25e08ae 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -13,6 +13,7 @@ import ( ) func Test_InnerMain(t *testing.T) { + os.Setenv("NO_TLS", "1") // Use temporary local user data tmp, err := ioutil.TempDir(os.TempDir(), "rove-") From 70f041ae5d16686b65ffb77c9528b216d19c4310 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:09:15 +0100 Subject: [PATCH 485/495] Spawn rover parts in the world --- pkg/rove/worldgen.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index dd864b8..a1593c6 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -35,6 +35,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { const ( terrainNoiseScale = 15 rockNoiseScale = 3 + partsNoiseScale = 2 ) // GetTile returns the chosen tile at a location @@ -52,12 +53,21 @@ func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { // GetObject returns the chosen object at a location func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { - o := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) + r := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) switch { - case o > 0.6: + // Prioritise rocks + case r > 0.6: obj.Type = roveapi.Object_RockLarge - case o > 0.5: + case r > 0.5: obj.Type = roveapi.Object_RockSmall + + default: + // Otherwise, try some rover parts + p := g.noise.Eval2(float64(v.X)/partsNoiseScale, float64(v.Y)/partsNoiseScale) + switch { + case p > 0.8: + obj.Type = roveapi.Object_RoverParts + } } // Very rarely spawn a dormant rover From e66b899e2aef8ce5299dc01b589da760a8e9e6fb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:09:41 +0100 Subject: [PATCH 486/495] Increase the base rover range to 10 --- pkg/rove/rover.go | 2 +- pkg/rove/world_test.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index d0fb9cb..bebde50 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -74,7 +74,7 @@ type Rover struct { // DefaultRover returns a default rover object with default settings func DefaultRover() *Rover { return &Rover{ - Range: 4, + Range: 10, Integrity: 10, MaximumIntegrity: 10, Capacity: 10, diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index afc8f53..f085d89 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -109,15 +109,16 @@ func TestWorld_RadarFromRover(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0}), "Failed to warp rover") + r, err := world.GetRover(a) + assert.NoError(t, err) + radar, objs, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") - fullRange := 4 + 4 + 1 + fullRange := r.Range + r.Range + 1 assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong length") assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") - // Test the expected values - assert.Equal(t, roveapi.Object_RoverLive, objs[1+fullRange]) - assert.Equal(t, roveapi.Object_RoverLive, objs[4+4*fullRange]) + // TODO: Verify the other rover is on the radar // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) From 018c122861f7a1536b3fe8ee754dfd1c2207a477 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:24:53 +0100 Subject: [PATCH 487/495] Stop spawning dormant rovers in the world --- pkg/rove/worldgen.go | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index a1593c6..2abb447 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -1,10 +1,6 @@ package rove import ( - "encoding/json" - "log" - "math/rand" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/ojrac/opensimplex-go" @@ -70,41 +66,5 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { } } - // Very rarely spawn a dormant rover - if obj.Type == roveapi.Object_ObjectUnknown { - // TODO: Make this better, ideally with noise - if v.X%25 == 0 && v.Y%25 == 0 && v.X != 0 && v.Y != 0 { - obj.Type = roveapi.Object_RoverDormant - } - } - - // Post process any spawned objects - switch obj.Type { - case roveapi.Object_RoverDormant: - // Create the rover - r := DefaultRover() - - // Set the rover variables - r.Pos = v - - // Upgrade this rover randomly - r.MaximumCharge += rand.Int() % 3 - r.MaximumIntegrity += rand.Int() % 3 - r.Capacity += rand.Int() % 3 - r.Range += rand.Int() % 3 - - // For now, mark the log as corrupted - r.AddLogEntryf("log corrupted") - - // Marshal the rover data into the object data - b, err := json.Marshal(r) - if err != nil { - log.Fatalf("couldn't marshal rover, should never fail: %s", err) - } - - // Store the bytes - obj.Data = b - } - return obj } From 636f0ed7734cc3642eac9b9bda9e807c00a91ede Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:26:10 +0100 Subject: [PATCH 488/495] Spawn rover parts a little more frequently --- pkg/rove/worldgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 2abb447..6cb425f 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -61,7 +61,7 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Otherwise, try some rover parts p := g.noise.Eval2(float64(v.X)/partsNoiseScale, float64(v.Y)/partsNoiseScale) switch { - case p > 0.8: + case p > 0.7: obj.Type = roveapi.Object_RoverParts } } From 6a44633d40ae92c0c66e2baecae387ec9a9762ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 11:28:14 +0100 Subject: [PATCH 489/495] Add rover parts to the cmdline pretty printer --- cmd/rove/internal/glyph.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/rove/internal/glyph.go b/cmd/rove/internal/glyph.go index eac12c0..4a774e7 100644 --- a/cmd/rove/internal/glyph.go +++ b/cmd/rove/internal/glyph.go @@ -25,6 +25,9 @@ const ( // GlyphRoverDormant represents a dormant rover GlyphRoverDormant = Glyph('r') + // GlyphRoverParts represents spare rover parts + GlyphRoverParts = Glyph('*') + // GlyphRockSmall is a small stashable rock GlyphRockSmall = Glyph('o') @@ -58,6 +61,8 @@ func ObjectGlyph(o roveapi.Object) Glyph { return GlyphRoverDormant case roveapi.Object_RockLarge: return GlyphRockLarge + case roveapi.Object_RoverParts: + return GlyphRoverParts } log.Fatalf("Unknown object type: %c", o) From 1200b0a2a2361e6ea26ff036367796b33c910868 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 11:39:28 +0100 Subject: [PATCH 490/495] Add "upgrade" command to use the rover parts --- proto/roveapi/roveapi.pb.go | 526 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 44 ++- 2 files changed, 333 insertions(+), 237 deletions(-) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 753c058..81a6cb5 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -39,47 +39,51 @@ type CommandType int32 const ( CommandType_none CommandType = 0 - // Toggles the sails, either catching the wind, or charging from the sun - CommandType_toggle CommandType = 1 - // Turns the rover in the specified bearing (requires bearing) - CommandType_turn CommandType = 2 - // Stashes item at current location in rover inventory - CommandType_stash CommandType = 3 - // Repairs the rover using an inventory object - CommandType_repair CommandType = 4 - // Broadcasts a message to nearby rovers (requires data) - CommandType_broadcast CommandType = 5 - // Salvages a neighboring dormant rover for parts - CommandType_salvage CommandType = 6 - // Transfers remote control into dormant rover - CommandType_transfer CommandType = 7 // Waits before performing the next command - CommandType_wait CommandType = 8 + CommandType_wait CommandType = 1 + // Toggles the sails, either catching the wind, or charging from the sun + CommandType_toggle CommandType = 2 + // Turns the rover in the specified bearing (requires bearing) + CommandType_turn CommandType = 3 + // Stashes item at current location in rover inventory + CommandType_stash CommandType = 4 + // Repairs the rover using an inventory object + CommandType_repair CommandType = 5 + // Broadcasts a message to nearby rovers (requires data) + CommandType_broadcast CommandType = 6 + // Salvages a neighboring dormant rover for parts + CommandType_salvage CommandType = 7 + // Transfers remote control into dormant rover + CommandType_transfer CommandType = 8 + // Upgrades a chosen rover specification using 5 rover parts + CommandType_upgrade CommandType = 9 ) // Enum value maps for CommandType. var ( CommandType_name = map[int32]string{ 0: "none", - 1: "toggle", - 2: "turn", - 3: "stash", - 4: "repair", - 5: "broadcast", - 6: "salvage", - 7: "transfer", - 8: "wait", + 1: "wait", + 2: "toggle", + 3: "turn", + 4: "stash", + 5: "repair", + 6: "broadcast", + 7: "salvage", + 8: "transfer", + 9: "upgrade", } CommandType_value = map[string]int32{ "none": 0, - "toggle": 1, - "turn": 2, - "stash": 3, - "repair": 4, - "broadcast": 5, - "salvage": 6, - "transfer": 7, - "wait": 8, + "wait": 1, + "toggle": 2, + "turn": 3, + "stash": 4, + "repair": 5, + "broadcast": 6, + "salvage": 7, + "transfer": 8, + "upgrade": 9, } ) @@ -179,6 +183,62 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } +// Describes the type of upgrade +type RoverUpgrade int32 + +const ( + RoverUpgrade_RoverUpgradeUnknown RoverUpgrade = 0 + RoverUpgrade_Range RoverUpgrade = 1 + RoverUpgrade_Capacity RoverUpgrade = 2 + RoverUpgrade_MaximumIntegrity RoverUpgrade = 3 + RoverUpgrade_MaximumCharge RoverUpgrade = 4 +) + +// Enum value maps for RoverUpgrade. +var ( + RoverUpgrade_name = map[int32]string{ + 0: "RoverUpgradeUnknown", + 1: "Range", + 2: "Capacity", + 3: "MaximumIntegrity", + 4: "MaximumCharge", + } + RoverUpgrade_value = map[string]int32{ + "RoverUpgradeUnknown": 0, + "Range": 1, + "Capacity": 2, + "MaximumIntegrity": 3, + "MaximumCharge": 4, + } +) + +func (x RoverUpgrade) Enum() *RoverUpgrade { + p := new(RoverUpgrade) + *p = x + return p +} + +func (x RoverUpgrade) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RoverUpgrade) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() +} + +func (RoverUpgrade) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[2] +} + +func (x RoverUpgrade) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RoverUpgrade.Descriptor instead. +func (RoverUpgrade) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} +} + // Types of objects type Object int32 @@ -229,11 +289,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Object) Number() protoreflect.EnumNumber { @@ -242,7 +302,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } type Tile int32 @@ -285,11 +345,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x Tile) Number() protoreflect.EnumNumber { @@ -298,7 +358,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // SailPosition represents the position of the sola sail @@ -337,11 +397,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[5] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -350,7 +410,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} } // ServerStatusRequest is an empty placeholder @@ -648,6 +708,8 @@ type Command struct { Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to Bearing Bearing `protobuf:"varint,4,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // upgrade - the upgrade to apply to the rover + Upgrade RoverUpgrade `protobuf:"varint,5,opt,name=upgrade,proto3,enum=roveapi.RoverUpgrade" json:"upgrade,omitempty"` } func (x *Command) Reset() { @@ -710,6 +772,13 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } +func (x *Command) GetUpgrade() RoverUpgrade { + if x != nil { + return x.Upgrade + } + return RoverUpgrade_RoverUpgradeUnknown +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1423,7 +1492,7 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, @@ -1432,137 +1501,148 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, - 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, - 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, + 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x6a, + 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, - 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, - 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, - 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, - 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, - 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, + 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, + 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x78, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, - 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, - 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, - 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, - 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x08, 0x2a, 0x83, - 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, - 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, - 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, - 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, - 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, - 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, - 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, - 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, - 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, - 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, + 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, + 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, + 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x85, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x03, 0x12, + 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, + 0x70, 0x61, 0x69, 0x72, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, + 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x08, + 0x12, 0x0b, 0x0a, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x10, 0x09, 0x2a, 0x83, 0x01, + 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x08, 0x2a, 0x69, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x6a, + 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, + 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, + 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, + 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, + 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1577,66 +1657,68 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (Object)(0), // 2: roveapi.Object - (Tile)(0), // 3: roveapi.Tile - (SailPosition)(0), // 4: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest - (*Account)(nil), // 8: roveapi.Account - (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse - (*Command)(nil), // 10: roveapi.Command - (*CommandRequest)(nil), // 11: roveapi.CommandRequest - (*CommandResponse)(nil), // 12: roveapi.CommandResponse - (*RadarRequest)(nil), // 13: roveapi.RadarRequest - (*RadarResponse)(nil), // 14: roveapi.RadarResponse - (*StatusRequest)(nil), // 15: roveapi.StatusRequest - (*Log)(nil), // 16: roveapi.Log - (*Vector)(nil), // 17: roveapi.Vector - (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 19: roveapi.RoverStatus - (*RoverReadings)(nil), // 20: roveapi.RoverReadings - (*StatusResponse)(nil), // 21: roveapi.StatusResponse + (RoverUpgrade)(0), // 2: roveapi.RoverUpgrade + (Object)(0), // 3: roveapi.Object + (Tile)(0), // 4: roveapi.Tile + (SailPosition)(0), // 5: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest + (*Account)(nil), // 9: roveapi.Account + (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse + (*Command)(nil), // 11: roveapi.Command + (*CommandRequest)(nil), // 12: roveapi.CommandRequest + (*CommandResponse)(nil), // 13: roveapi.CommandResponse + (*RadarRequest)(nil), // 14: roveapi.RadarRequest + (*RadarResponse)(nil), // 15: roveapi.RadarResponse + (*StatusRequest)(nil), // 16: roveapi.StatusRequest + (*Log)(nil), // 17: roveapi.Log + (*Vector)(nil), // 18: roveapi.Vector + (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 20: roveapi.RoverStatus + (*RoverReadings)(nil), // 21: roveapi.RoverReadings + (*StatusResponse)(nil), // 22: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing - 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account - 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 2, // 3: roveapi.Command.upgrade:type_name -> roveapi.RoverUpgrade + 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account + 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account + 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1855,7 +1937,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 9aad682..72a1fc2 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -89,22 +89,24 @@ message RegisterResponse { // CommandType defines the type of a command to give to the rover enum CommandType { none = 0; - // Toggles the sails, either catching the wind, or charging from the sun - toggle = 1; - // Turns the rover in the specified bearing (requires bearing) - turn = 2; - // Stashes item at current location in rover inventory - stash = 3; - // Repairs the rover using an inventory object - repair = 4; - // Broadcasts a message to nearby rovers (requires data) - broadcast = 5; - // Salvages a neighboring dormant rover for parts - salvage = 6; - // Transfers remote control into dormant rover - transfer = 7; // Waits before performing the next command - wait = 8; + wait = 1; + // Toggles the sails, either catching the wind, or charging from the sun + toggle = 2; + // Turns the rover in the specified bearing (requires bearing) + turn = 3; + // Stashes item at current location in rover inventory + stash = 4; + // Repairs the rover using an inventory object + repair = 5; + // Broadcasts a message to nearby rovers (requires data) + broadcast = 6; + // Salvages a neighboring dormant rover for parts + salvage = 7; + // Transfers remote control into dormant rover + transfer = 8; + // Upgrades a chosen rover specification using 5 rover parts + upgrade = 9; } // Bearing represents a compass direction @@ -121,6 +123,15 @@ enum Bearing { NorthWest = 8; } +// Describes the type of upgrade +enum RoverUpgrade { + RoverUpgradeUnknown = 0; + Range = 1; + Capacity = 2; + MaximumIntegrity = 3; + MaximumCharge = 4; +} + // Command is a single command for a rover message Command { // The command type @@ -135,6 +146,9 @@ message Command { // move - the bearing for the rover to turn to Bearing bearing = 4; + + // upgrade - the upgrade to apply to the rover + RoverUpgrade upgrade = 5; } // CommandRequest describes a set of commands to be requested for the rover From b114b68ff751aae8f153da53bd34804f14794d73 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:03:12 +0100 Subject: [PATCH 491/495] Add upgrade command code --- pkg/rove/world.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index d2483b5..64e3982 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -15,6 +15,9 @@ import ( const ( // ticksPerNormalMove defines the number of ticks it should take for a "normal" speed move ticksPerNormalMove = 4 + + // upgradeCost is the cost in rover parts needed to upgrade a rover specification + upgradeCost = 5 ) // CommandStream is a list of commands to execute in order @@ -446,6 +449,63 @@ func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { return r.SailPosition, nil } +// RoverUpgrade will try to upgrade the rover +func (w *World) RoverUpgrade(rover string, upgrade roveapi.RoverUpgrade) (int, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return 0, fmt.Errorf("no rover matching id") + } + + cost := upgradeCost + num := 0 + for i := range r.Inventory { + if r.Inventory[i].Type == roveapi.Object_RoverParts { + num++ + } + } + + if num < cost { + r.AddLogEntryf("tried to upgrade but lacked rover parts") + return 0, nil + } + + // Apply the upgrade + var ret int + switch upgrade { + case roveapi.RoverUpgrade_Capacity: + r.Capacity++ + ret = r.Capacity + case roveapi.RoverUpgrade_Range: + r.Range++ + ret = r.Range + case roveapi.RoverUpgrade_MaximumCharge: + r.MaximumCharge++ + ret = r.MaximumCharge + case roveapi.RoverUpgrade_MaximumIntegrity: + r.MaximumIntegrity++ + ret = r.MaximumIntegrity + default: + return 0, fmt.Errorf("unknown upgrade: %s", upgrade) + } + + // Remove the cost in rover parts + var n []Object + for _, o := range r.Inventory { + if o.Type == roveapi.Object_RoverParts && cost > 0 { + cost-- + } else { + n = append(n, o) + } + } + // Assign back the inventory + r.Inventory = n + + return ret, nil +} + // RoverTurn will turn the rover func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearing, error) { w.worldMutex.Lock() @@ -582,6 +642,10 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } + case roveapi.CommandType_upgrade: + if c.GetUpgrade() == roveapi.RoverUpgrade_RoverUpgradeUnknown { + return fmt.Errorf("upgrade command given unknown upgrade") + } case roveapi.CommandType_wait: case roveapi.CommandType_toggle: case roveapi.CommandType_stash: @@ -729,6 +793,8 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err _, err = w.RoverSalvage(rover) case roveapi.CommandType_transfer: _, err = w.RoverTransfer(rover) + case roveapi.CommandType_upgrade: + _, err = w.RoverUpgrade(rover, c.GetUpgrade()) case roveapi.CommandType_wait: // Nothing to do default: From 4e4af1a1beeaf042b9fad985a99f14a7fb9323eb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:15:49 +0100 Subject: [PATCH 492/495] Add a test for the upgrade command --- pkg/rove/command_test.go | 55 ++++++++++++++++++++++++++++++++++++++++ pkg/rove/world.go | 2 ++ 2 files changed, 57 insertions(+) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index dde7070..bf1eed6 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -248,3 +248,58 @@ func TestCommand_Wait(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) } + +func TestCommand_Upgrade(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover("") + assert.NoError(t, err) + rover, ok := w.Rovers[name] + assert.True(t, ok) + + // Try an invalid upgrade + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade}) + assert.Error(t, err) + + // Try a valid command but without the parts + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade, Upgrade: roveapi.RoverUpgrade_Capacity}) + assert.NoError(t, err) + + // Ensure nothing changed and we logged the attempt + pre := rover.Capacity + w.Tick() + assert.Equal(t, pre, rover.Capacity) + assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "tried") + + // One non-part item + rover.Inventory = []Object{ + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RockSmall, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + } + + // Try a valid command again + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade, Upgrade: roveapi.RoverUpgrade_Capacity}) + assert.NoError(t, err) + + // Check that the capacity increases on the tick and all the parts are used + pre = rover.Capacity + w.Tick() + assert.Equal(t, pre+1, rover.Capacity) + assert.Equal(t, 1, len(rover.Inventory)) + assert.Equal(t, roveapi.Object_RockSmall, rover.Inventory[0].Type) +} diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 64e3982..d509d8d 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -503,6 +503,8 @@ func (w *World) RoverUpgrade(rover string, upgrade roveapi.RoverUpgrade) (int, e // Assign back the inventory r.Inventory = n + r.AddLogEntryf("upgraded %s to %d", upgrade, ret) + return ret, nil } From 804f82dd2015121222d758bbcb74d41a14d0ae4e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:43:44 +0100 Subject: [PATCH 493/495] Fix up commandline interface for repeat commands to go after the command --- cmd/rove/main.go | 56 ++++++++++++++++++++----------------------- cmd/rove/main_test.go | 4 ++-- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 06999d3..551cda1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -35,7 +35,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand [REPEAT] CMD [VAL...] queues commands, accepts multiple in sequence for command values see below") + fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] [REPEAT] sets the command queue, accepts multiple in sequence") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") @@ -247,16 +247,8 @@ func InnerMain(command string, args ...string) error { // Iterate through each command var commands []*roveapi.Command for i := 0; i < len(args); i++ { - number := 0 - num, err := strconv.Atoi(args[i]) - if err == nil { - number = num - i++ - if i >= len(args) { - return fmt.Errorf("must pass command after repeat number") - } - } + var cmd *roveapi.Command switch args[i] { case "turn": i++ @@ -267,13 +259,10 @@ func InnerMain(command string, args ...string) error { if b == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command must be given a valid bearing %s", args[i]) } - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType_turn, - Bearing: b, - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType_turn, + Bearing: b, + } case "broadcast": i++ if len(args) == i { @@ -281,22 +270,29 @@ func InnerMain(command string, args ...string) error { } else if len(args[i]) > 3 { return fmt.Errorf("broadcast command must be given ASCII triplet of 3 or less: %s", args[i]) } - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Data: []byte(args[i]), - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType_broadcast, + Data: []byte(args[i]), + } default: // By default just use the command literally - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), + } } + + // Try and convert the next command to a number + number := 0 + if len(args) > i+1 { + num, err := strconv.Atoi(args[i+1]) + if err == nil { + number = num + i++ + } + } + cmd.Repeat = int32(number) + + commands = append(commands, cmd) } _, err := client.Command(ctx, &roveapi.CommandRequest{ diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 25e08ae..ca83947 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -55,8 +55,8 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) - assert.NoError(t, InnerMain("command", "10", "wait")) - assert.NoError(t, InnerMain("command", "1", "wait", "turn", "NW", "toggle", "broadcast", "zyx")) + assert.NoError(t, InnerMain("command", "wait", "10")) + assert.NoError(t, InnerMain("command", "wait", "1", "turn", "NW", "toggle", "broadcast", "zyx")) // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) From 35b25dde9880436fe4a2394fc2bdf47e5733f271 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:49:15 +0100 Subject: [PATCH 494/495] Add the upgrade command to the cmdline client --- cmd/rove/main.go | 23 +++++++++++++++++++++++ cmd/rove/main_test.go | 2 ++ 2 files changed, 25 insertions(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 551cda1..f1e993d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -44,6 +44,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\tupgrade SPEC spends rover parts to upgrade one rover spec (capacity, range, integrity, charge") fmt.Fprintln(os.Stderr, "\twait waits before performing the next command") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Environment") @@ -274,6 +275,28 @@ func InnerMain(command string, args ...string) error { Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), } + case "upgrade": + i++ + if len(args) == i { + return fmt.Errorf("upgrade command must be passed a spec to upgrade") + } + var u roveapi.RoverUpgrade + switch args[i] { + case "capacity": + u = roveapi.RoverUpgrade_Capacity + case "range": + u = roveapi.RoverUpgrade_Range + case "integrity": + u = roveapi.RoverUpgrade_MaximumIntegrity + case "charge": + u = roveapi.RoverUpgrade_MaximumCharge + default: + return fmt.Errorf("upgrade command must be passed a known upgrade spec") + } + cmd = &roveapi.Command{ + Command: roveapi.CommandType_upgrade, + Upgrade: u, + } default: // By default just use the command literally cmd = &roveapi.Command{ diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index ca83947..250988a 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -54,6 +54,7 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "toggle")) assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) + assert.NoError(t, InnerMain("command", "upgrade", "capacity")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) assert.NoError(t, InnerMain("command", "wait", "10")) assert.NoError(t, InnerMain("command", "wait", "1", "turn", "NW", "toggle", "broadcast", "zyx")) @@ -61,5 +62,6 @@ func Test_InnerMain(t *testing.T) { // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) + assert.Error(t, InnerMain("command", "upgrade")) assert.Error(t, InnerMain("command", "1")) } From f29b189a4252986a5a0a2b820f96219828e46db3 Mon Sep 17 00:00:00 2001 From: mdiluz Date: Fri, 27 Sep 2024 10:43:28 +0100 Subject: [PATCH 495/495] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2aff518..aad1a6f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ Rove ==== -![Tests](https://github.com/mdiluz/rove/workflows/Tests/badge.svg) ![Docker](https://github.com/mdiluz/rove/workflows/Docker/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) -![Rove](https://github.com/mdiluz/rove/blob/master/data/icon.svg) +![Rove](data/icon.svg) Rove is an asynchronous nomadic game about exploring as part of a loose community. -This repository contains the source code for the `rove-server` deployment and the `rove` command line client. See [mdiluz.github.io/rove](https://mdiluz.github.io/rove/) for game details, and [roveapi.proto](https://github.com/mdiluz/rove/blob/master/proto/roveapi/roveapi.proto) for the current server-client API. +This repository contains the source code for the `rove-server` deployment and the `rove` command line client. See [mdiluz.github.io/rove](https://mdiluz.github.io/rove/) for game details, and [roveapi.proto](proto/roveapi/roveapi.proto) for the current server-client API.