From 254d69fce6654dfdde7f197997229f66a7bbaa57 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 19:17:44 +0100 Subject: [PATCH 001/197] Added simple chrono widget with easier UI --- apps/chronosimplewid/ChangeLog | 6 ++ apps/chronosimplewid/README.md | 41 ++++++++++++ apps/chronosimplewid/app-icon.js | 1 + apps/chronosimplewid/app.js | 93 ++++++++++++++++++++++++++++ apps/chronosimplewid/app.png | Bin 0 -> 1060 bytes apps/chronosimplewid/metadata.json | 17 +++++ apps/chronosimplewid/screenshot.png | Bin 0 -> 2920 bytes apps/chronosimplewid/widget.js | 79 +++++++++++++++++++++++ 8 files changed, 237 insertions(+) create mode 100644 apps/chronosimplewid/ChangeLog create mode 100644 apps/chronosimplewid/README.md create mode 100644 apps/chronosimplewid/app-icon.js create mode 100644 apps/chronosimplewid/app.js create mode 100644 apps/chronosimplewid/app.png create mode 100644 apps/chronosimplewid/metadata.json create mode 100644 apps/chronosimplewid/screenshot.png create mode 100644 apps/chronosimplewid/widget.js diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog new file mode 100644 index 000000000..ed230b737 --- /dev/null +++ b/apps/chronosimplewid/ChangeLog @@ -0,0 +1,6 @@ +0.01: New widget and app! +0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) +0.03: Display only minutes:seconds when less than 1 hour left +0.04: Change to 7 segment font, move to top widget bar + Better auto-update behaviour, less RAM used +0.05: Fix error running app on new firmwares (fix #1140) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md new file mode 100644 index 000000000..6e0aba681 --- /dev/null +++ b/apps/chronosimplewid/README.md @@ -0,0 +1,41 @@ +# Chronometer Widget + +Chronometer (timer) that runs as a widget. +The advantage is, that you can still see your normal watchface and other widgets when the timer is running. +The widget is always active, but only shown when the timer is on. +Hours, minutes, seconds and timer status can be set with an app. + +When there is less than one second left on the timer it buzzes. + +The widget has been tested on Bangle 1 and Bangle 2 + +## Screenshots + +![](screenshot.png) + + +## Features + +* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) +* Target time is saved to a file and timer picks up again when widget is loaded again. + +## Settings + +There are no settings section in the settings app, timer can be set using an app. + +* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file +* Hours: Set the hours for the timer +* Minutes: Set the minutes for the timer +* Seconds: Set the seconds for the timer +* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. + + +## Releases + +* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) +* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) +* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid + +## Requests + +If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ diff --git a/apps/chronosimplewid/app-icon.js b/apps/chronosimplewid/app-icon.js new file mode 100644 index 000000000..db2010218 --- /dev/null +++ b/apps/chronosimplewid/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js new file mode 100644 index 000000000..8e2c82b68 --- /dev/null +++ b/apps/chronosimplewid/app.js @@ -0,0 +1,93 @@ +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +const storage = require('Storage'); +let settingsChronowid; + +function updateSettings() { + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + settingsChronowid.goal = goal.getTime(); + storage.writeJSON('chronowid.json', settingsChronowid); + if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); +} + +function resetSettings() { + settingsChronowid = { + hours : 0, + minutes : 0, + seconds : 0, + started : false, + counter : 0, + goal : 0, + }; + updateSettings(); +} + +settingsChronowid = storage.readJSON('chronowid.json',1); +if (!settingsChronowid) resetSettings(); + +E.on('kill', () => { + updateSettings(); +}); + +function showMenu() { + const timerMenu = { + '': { + 'title': 'Set timer' + }, + '< Back' : ()=>{load();}, + 'Reset Values': function() { + settingsChronowid.hours = 0; + settingsChronowid.minutes = 0; + settingsChronowid.seconds = 0; + settingsChronowid.started = false; + updateSettings(); + showMenu(); + }, + 'Hours': { + value: settingsChronowid.hours, + min: 0, + max: 24, + step: 1, + onchange: v => { + settingsChronowid.hours = v; + updateSettings(); + } + }, + 'Minutes': { + value: settingsChronowid.minutes, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.minutes = v; + updateSettings(); + } + }, + 'Seconds': { + value: settingsChronowid.seconds, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.seconds = v; + updateSettings(); + } + }, + 'Timer on': { + value: settingsChronowid.started, + format: v => v ? "On" : "Off", + onchange: v => { + settingsChronowid.started = v; + updateSettings(); + } + }, + }; + + return E.showMenu(timerMenu); +} + +showMenu(); diff --git a/apps/chronosimplewid/app.png b/apps/chronosimplewid/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac7a480c5d4533c9851ba6264b74aae48035eb0 GIT binary patch literal 1060 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 literal 0 HcmV?d00001 diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js new file mode 100644 index 000000000..2d1c78941 --- /dev/null +++ b/apps/chronosimplewid/widget.js @@ -0,0 +1,79 @@ +(() => { + var settingsChronowid; + var interval = 0; //used for the 1 second interval timer + var diff; + + //Convert ms to time + function getTime(t) { + var milliseconds = parseInt((t % 1000) / 100), + seconds = Math.floor((t / 1000) % 60), + minutes = Math.floor((t / (1000 * 60)) % 60), + hours = Math.floor((t / (1000 * 60 * 60)) % 24); + return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); + } + + /*function printDebug() { + print ("Goaltime: " + getTime(settingsChronowid.goal)); + print ("Goal: " + settingsChronowid.goal); + print("Difftime: " + getTime(diff)); + print("Diff: " + diff); + print ("Started: " + settingsChronowid.started); + print ("----"); + }*/ + + //counts down, calculates and displays + function countDown() { + var now = new Date(); + diff = settingsChronowid.goal - now; //calculate difference + // time is up + if (settingsChronowid.started && diff < 1000) { + Bangle.buzz(1500); + //write timer off to file + settingsChronowid.started = false; + require('Storage').writeJSON('chronowid.json', settingsChronowid); + clearInterval(interval); //stop interval + interval = undefined; + } + // calculates width and redraws accordingly + WIDGETS["chronowid"].redraw(); + } + + // add the widget + WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { + if (!this.width) return; + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); + //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; + var timeStr; + if (diff < 3600000) { //less than 1 hour left + width = 58; + scale = 2; + timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 + } else { //one hour or more left + width = 48; + scale = 1; + timeStr = getTime(diff); //display hour 00:00:00 but small + } + // Font5x9Numeric7Seg - just build this in as it's tiny + g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); + g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { + var last = this.width; + if (!settingsChronowid.started) this.width = 0; + else this.width = (diff < 3600000) ? 58 : 48; + if (last != this.width) Bangle.drawWidgets(); + else this.draw(); + }, reload:function() { + settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + if (interval) clearInterval(interval); + interval = undefined; + // start countdown each second + if (settingsChronowid.started) interval = setInterval(countDown, 1000); + // reset everything + countDown(); + }}; + + //printDebug(); + // set width correctly, start countdown each second + WIDGETS["chronowid"].reload(); +})(); From 4cb1cf2ba4438e93aa2e337133d00e3bba7cc99e Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 20:10:09 +0100 Subject: [PATCH 002/197] Simpler UI --- apps/chronosimplewid/ChangeLog | 7 +- apps/chronosimplewid/README.md | 45 ++--------- apps/chronosimplewid/app.js | 119 +++++++++++++++-------------- apps/chronosimplewid/metadata.json | 10 +-- 4 files changed, 73 insertions(+), 108 deletions(-) diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog index ed230b737..07afedd21 100644 --- a/apps/chronosimplewid/ChangeLog +++ b/apps/chronosimplewid/ChangeLog @@ -1,6 +1 @@ -0.01: New widget and app! -0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) -0.03: Display only minutes:seconds when less than 1 hour left -0.04: Change to 7 segment font, move to top widget bar - Better auto-update behaviour, less RAM used -0.05: Fix error running app on new firmwares (fix #1140) +0.01: Release \ No newline at end of file diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md index 6e0aba681..6f3b417c0 100644 --- a/apps/chronosimplewid/README.md +++ b/apps/chronosimplewid/README.md @@ -1,41 +1,10 @@ -# Chronometer Widget +# Simple Chronometer Widget -Chronometer (timer) that runs as a widget. -The advantage is, that you can still see your normal watchface and other widgets when the timer is running. -The widget is always active, but only shown when the timer is on. -Hours, minutes, seconds and timer status can be set with an app. +A fork of the awesome Chronometer Widget, but with a simple UI to set +a timer faster using only a tab events. Also very useful if combined +with the Pattern Launcher. -When there is less than one second left on the timer it buzzes. +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) -The widget has been tested on Bangle 1 and Bangle 2 - -## Screenshots - -![](screenshot.png) - - -## Features - -* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) -* Target time is saved to a file and timer picks up again when widget is loaded again. - -## Settings - -There are no settings section in the settings app, timer can be set using an app. - -* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file -* Hours: Set the hours for the timer -* Minutes: Set the minutes for the timer -* Seconds: Set the seconds for the timer -* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. - - -## Releases - -* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) -* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) -* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid - -## Requests - -If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index 8e2c82b68..b115bde00 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,10 +1,15 @@ -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - const storage = require('Storage'); let settingsChronowid; + +const screenWidth = g.getWidth(); +const screenHeight = g.getHeight(); +const screenHalfWidth = parseInt(screenWidth/2); +const screenHalfHeight = parseInt(screenHeight/2); +let interval = 0; + + + function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), @@ -33,61 +38,57 @@ E.on('kill', () => { updateSettings(); }); -function showMenu() { - const timerMenu = { - '': { - 'title': 'Set timer' - }, - '< Back' : ()=>{load();}, - 'Reset Values': function() { - settingsChronowid.hours = 0; - settingsChronowid.minutes = 0; - settingsChronowid.seconds = 0; - settingsChronowid.started = false; - updateSettings(); - showMenu(); - }, - 'Hours': { - value: settingsChronowid.hours, - min: 0, - max: 24, - step: 1, - onchange: v => { - settingsChronowid.hours = v; - updateSettings(); - } - }, - 'Minutes': { - value: settingsChronowid.minutes, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.minutes = v; - updateSettings(); - } - }, - 'Seconds': { - value: settingsChronowid.seconds, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.seconds = v; - updateSettings(); - } - }, - 'Timer on': { - value: settingsChronowid.started, - format: v => v ? "On" : "Off", - onchange: v => { - settingsChronowid.started = v; - updateSettings(); - } - }, - }; +function draw(){ + g.clear(1); + Bangle.drawWidgets(); - return E.showMenu(timerMenu); + g.setColor(g.theme.fg); + g.setFont("Vector", 25).setFontAlign(0,-1); + + g.setFontAlign(0, 0, 0); + g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + + if(settingsChronowid.started){ + g.setColor("#ff0000"); + g.setFont("Vector", 16).setFontAlign(0,-1); + g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + } } -showMenu(); +Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; + var upper = 24 + parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var isLeft = e.x < left; + var isRight = e.x > right; + var isUpper = e.y < upper; + var isLower = e.y > lower; + + if(isRight){ + print("right"); + settingsChronowid.minutes += 1; + } else if(isLeft){ + print("left"); + settingsChronowid.minutes -= 1; + } else if(isUpper){ + print("upper"); + settingsChronowid.minutes += 5; + } else if(isLower){ + print("lower"); + settingsChronowid.minutes -= 5; + } else { + print("else"); + settingsChronowid.started = !settingsChronowid.started; + } + + settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + updateSettings(); + draw(); +}); + +g.reset(); +setWatch(_=>load(), BTN1); +Bangle.loadWidgets(); +draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json index ad219ea4f..72cc13e32 100644 --- a/apps/chronosimplewid/metadata.json +++ b/apps/chronosimplewid/metadata.json @@ -1,12 +1,12 @@ { "id": "chronosimplewid", - "name": "Simple Chrono Widget", - "shortName": "Simple Chrono Widget", - "version": "0.05", - "description": "Fork from Chrono Widget with simpler UI.", + "name": "Simple Chrono", + "shortName": "Simple Chrono", + "version": "0.01", + "description": "Chrono Widget Fork. Implements a simpler UI.", "icon": "app.png", "tags": "tool,widget", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS","BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}], "readme": "README.md", "storage": [ From e678892223dbc96dfebc32179d1c4fb770d16fae Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:47:22 +0100 Subject: [PATCH 003/197] Bugfixes and improvements --- apps/chronosimplewid/app.js | 25 ++++++++++++------------- apps/chronosimplewid/widget.js | 4 ++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index b115bde00..ff97d20dd 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,13 +1,13 @@ +Bangle.loadWidgets(); + + const storage = require('Storage'); let settingsChronowid; - const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const screenHalfWidth = parseInt(screenWidth/2); const screenHalfHeight = parseInt(screenHeight/2); -let interval = 0; - function updateSettings() { @@ -15,10 +15,11 @@ function updateSettings() { const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronowid.json', settingsChronowid); + storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); } + function resetSettings() { settingsChronowid = { hours : 0, @@ -31,34 +32,34 @@ function resetSettings() { updateSettings(); } -settingsChronowid = storage.readJSON('chronowid.json',1); + +settingsChronowid = storage.readJSON('chronosimplewid.json',1); if (!settingsChronowid) resetSettings(); -E.on('kill', () => { - updateSettings(); -}); +setWatch(_=>load(), BTN1); function draw(){ g.clear(1); Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 25).setFontAlign(0,-1); + g.setFont("Vector", 26).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 16).setFontAlign(0,-1); + g.setFont("Vector", 20).setFontAlign(0,-1); g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); } } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; - var upper = 24 + parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -89,6 +90,4 @@ Bangle.on('touch', function(btn, e){ }); g.reset(); -setWatch(_=>load(), BTN1); -Bangle.loadWidgets(); draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js index 2d1c78941..3fc5888b1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/chronosimplewid/widget.js @@ -30,7 +30,7 @@ Bangle.buzz(1500); //write timer off to file settingsChronowid.started = false; - require('Storage').writeJSON('chronowid.json', settingsChronowid); + require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); clearInterval(interval); //stop interval interval = undefined; } @@ -64,7 +64,7 @@ if (last != this.width) Bangle.drawWidgets(); else this.draw(); }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; if (interval) clearInterval(interval); interval = undefined; // start countdown each second From 56880b96f64ca8e35c6b47d32896ac339ab710ba Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:53:27 +0100 Subject: [PATCH 004/197] Improvements and fixes --- apps/chronosimplewid/app.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index ff97d20dd..c8d3a4db7 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -6,8 +6,8 @@ let settingsChronowid; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); -const screenHalfWidth = parseInt(screenWidth/2); -const screenHalfHeight = parseInt(screenHeight/2); +const cx = parseInt(screenWidth/2); +const cy = parseInt(screenHeight/2); function updateSettings() { @@ -43,15 +43,15 @@ function draw(){ Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 26).setFontAlign(0,-1); + g.setFont("Vector", 32).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); - g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + g.drawString(settingsChronowid.minutes + " min.", cx, cy); if(settingsChronowid.started){ g.setColor("#ff0000"); g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + g.drawString("[started]", cx, cy+20); } } @@ -68,23 +68,22 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - print("right"); settingsChronowid.minutes += 1; } else if(isLeft){ - print("left"); settingsChronowid.minutes -= 1; } else if(isUpper){ - print("upper"); settingsChronowid.minutes += 5; } else if(isLower){ - print("lower"); settingsChronowid.minutes -= 5; } else { - print("else"); settingsChronowid.started = !settingsChronowid.started; } - settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + if(settingsChronowid.minutes <= 0){ + settingsChronowid.minutes = 0; + settingsChronowid.started = false; + } + updateSettings(); draw(); }); From 6a085c11d78a41b2988bba396424331923192c20 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 13:23:56 +0100 Subject: [PATCH 005/197] Improvements of design and user feedback --- apps/chronosimplewid/app.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index c8d3a4db7..d3293bc90 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -13,7 +13,7 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); settingsChronowid.goal = goal.getTime(); storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); @@ -42,24 +42,26 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); - g.setColor(g.theme.fg); - g.setFont("Vector", 32).setFontAlign(0,-1); - g.setFontAlign(0, 0, 0); - g.drawString(settingsChronowid.minutes + " min.", cx, cy); + g.setFont("Vector", 32).setFontAlign(0,-1); + var text = settingsChronowid.minutes + " min."; + var rectWidth = parseInt(g.stringWidth(text) / 2); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", cx, cy+20); + } else { + g.setColor(g.theme.fg); } + g.fillRect(cx-rectWidth-5, cy-5, cx+rectWidth, cy+30); + + g.setColor(g.theme.bg); + g.drawString(text, cx, cy); } - Bangle.on('touch', function(btn, e){ - var left = parseInt(g.getWidth() * 0.2); + var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.25); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -69,14 +71,19 @@ Bangle.on('touch', function(btn, e){ if(isRight){ settingsChronowid.minutes += 1; + Bangle.buzz(40, 0.3); } else if(isLeft){ settingsChronowid.minutes -= 1; + Bangle.buzz(40, 0.3); } else if(isUpper){ settingsChronowid.minutes += 5; + Bangle.buzz(40, 0.3); } else if(isLower){ settingsChronowid.minutes -= 5; + Bangle.buzz(40, 0.3); } else { settingsChronowid.started = !settingsChronowid.started; + Bangle.buzz(120, 0.6); } if(settingsChronowid.minutes <= 0){ From a03fdec826819931f9058f7dab986ffc8dfb27e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:14:19 +0100 Subject: [PATCH 006/197] Renaming --- apps/chronosimplewid/README.md | 10 --- apps/chronosimplewid/metadata.json | 17 ---- apps/{chronosimplewid => widtmr}/ChangeLog | 0 apps/widtmr/README.md | 12 +++ apps/{chronosimplewid => widtmr}/app-icon.js | 0 apps/{chronosimplewid => widtmr}/app.js | 47 +++++++---- apps/{chronosimplewid => widtmr}/app.png | Bin apps/widtmr/metadata.json | 17 ++++ .../screenshot.png | Bin apps/{chronosimplewid => widtmr}/widget.js | 78 +++++++++++------- 10 files changed, 108 insertions(+), 73 deletions(-) delete mode 100644 apps/chronosimplewid/README.md delete mode 100644 apps/chronosimplewid/metadata.json rename apps/{chronosimplewid => widtmr}/ChangeLog (100%) create mode 100644 apps/widtmr/README.md rename apps/{chronosimplewid => widtmr}/app-icon.js (100%) rename apps/{chronosimplewid => widtmr}/app.js (58%) rename apps/{chronosimplewid => widtmr}/app.png (100%) create mode 100644 apps/widtmr/metadata.json rename apps/{chronosimplewid => widtmr}/screenshot.png (100%) rename apps/{chronosimplewid => widtmr}/widget.js (60%) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md deleted file mode 100644 index 6f3b417c0..000000000 --- a/apps/chronosimplewid/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Simple Chronometer Widget - -A fork of the awesome Chronometer Widget, but with a simple UI to set -a timer faster using only a tab events. Also very useful if combined -with the Pattern Launcher. - -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json deleted file mode 100644 index 72cc13e32..000000000 --- a/apps/chronosimplewid/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "chronosimplewid", - "name": "Simple Chrono", - "shortName": "Simple Chrono", - "version": "0.01", - "description": "Chrono Widget Fork. Implements a simpler UI.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "storage": [ - {"name":"chronosimplewid.wid.js","url":"widget.js"}, - {"name":"chronosimplewid.app.js","url":"app.js"}, - {"name":"chronosimplewid.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/chronosimplewid/ChangeLog b/apps/widtmr/ChangeLog similarity index 100% rename from apps/chronosimplewid/ChangeLog rename to apps/widtmr/ChangeLog diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md new file mode 100644 index 000000000..0694a13cc --- /dev/null +++ b/apps/widtmr/README.md @@ -0,0 +1,12 @@ +# Simple Chronometer Widget + +This is a fork of the Chrono Widget, but implements a +simpler UI which to be able to set a timer faster with +less interaction. Additionally, it exposes some functions +that can be used by other apps or clocks to easily +implement a timer. It is used e.g. by lcars or notanalog. + +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app-icon.js b/apps/widtmr/app-icon.js similarity index 100% rename from apps/chronosimplewid/app-icon.js rename to apps/widtmr/app-icon.js diff --git a/apps/chronosimplewid/app.js b/apps/widtmr/app.js similarity index 58% rename from apps/chronosimplewid/app.js rename to apps/widtmr/app.js index d3293bc90..311e0d3ea 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/widtmr/app.js @@ -1,8 +1,19 @@ +/* + * This is a fork of the Chrono Widget, but implements a + * simpler UI which to be able to set a timer faster with + * less interaction. Additionally, it exposes some functions + * that can be used by other apps or clocks to easily + * implement a timer. It is used e.g. by lcars or notanalog. + * + * Creator: David Peer + * Date: 02/2022 + */ + Bangle.loadWidgets(); const storage = require('Storage'); -let settingsChronowid; +let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); @@ -13,15 +24,15 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); - settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronosimplewid.json', settingsChronowid); - if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { - settingsChronowid = { + settings = { hours : 0, minutes : 0, seconds : 0, @@ -33,8 +44,8 @@ function resetSettings() { } -settingsChronowid = storage.readJSON('chronosimplewid.json',1); -if (!settingsChronowid) resetSettings(); +settings = storage.readJSON('widtmr.json',1); +if (!settings) resetSettings(); setWatch(_=>load(), BTN1); @@ -44,10 +55,10 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var text = settingsChronowid.minutes + " min."; + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settingsChronowid.started){ + if(settings.started){ g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -70,25 +81,25 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - settingsChronowid.minutes += 1; + settings.minutes += 1; Bangle.buzz(40, 0.3); } else if(isLeft){ - settingsChronowid.minutes -= 1; + settings.minutes -= 1; Bangle.buzz(40, 0.3); } else if(isUpper){ - settingsChronowid.minutes += 5; + settings.minutes += 5; Bangle.buzz(40, 0.3); } else if(isLower){ - settingsChronowid.minutes -= 5; + settings.minutes -= 5; Bangle.buzz(40, 0.3); } else { - settingsChronowid.started = !settingsChronowid.started; + settings.started = !settings.started; Bangle.buzz(120, 0.6); } - if(settingsChronowid.minutes <= 0){ - settingsChronowid.minutes = 0; - settingsChronowid.started = false; + if(settings.minutes <= 0){ + settings.minutes = 0; + settings.started = false; } updateSettings(); diff --git a/apps/chronosimplewid/app.png b/apps/widtmr/app.png similarity index 100% rename from apps/chronosimplewid/app.png rename to apps/widtmr/app.png diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json new file mode 100644 index 000000000..9645cc00c --- /dev/null +++ b/apps/widtmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "widtmr", + "name": "Timer Widget", + "shortName": "Timer Widget", + "version": "0.01", + "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", + "icon": "app.png", + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"widtmr.wid.js","url":"widget.js"}, + {"name":"widtmr.app.js","url":"app.js"}, + {"name":"widtmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/chronosimplewid/screenshot.png b/apps/widtmr/screenshot.png similarity index 100% rename from apps/chronosimplewid/screenshot.png rename to apps/widtmr/screenshot.png diff --git a/apps/chronosimplewid/widget.js b/apps/widtmr/widget.js similarity index 60% rename from apps/chronosimplewid/widget.js rename to apps/widtmr/widget.js index 3fc5888b1..c918a52e1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/widtmr/widget.js @@ -1,8 +1,11 @@ (() => { - var settingsChronowid; + let storage = require('Storage'); + + var settings; var interval = 0; //used for the 1 second interval timer var diff; + //Convert ms to time function getTime(t) { var milliseconds = parseInt((t % 1000) / 100), @@ -12,37 +15,35 @@ return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); } - /*function printDebug() { - print ("Goaltime: " + getTime(settingsChronowid.goal)); - print ("Goal: " + settingsChronowid.goal); - print("Difftime: " + getTime(diff)); - print("Diff: " + diff); - print ("Started: " + settingsChronowid.started); - print ("----"); - }*/ //counts down, calculates and displays function countDown() { var now = new Date(); - diff = settingsChronowid.goal - now; //calculate difference + diff = settings.goal - now; //calculate difference // time is up - if (settingsChronowid.started && diff < 1000) { + if (settings.started && diff < 1000) { Bangle.buzz(1500); //write timer off to file - settingsChronowid.started = false; - require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); + settings.started = false; + storage.writeJSON('widtmr.json', settings); clearInterval(interval); //stop interval interval = undefined; } // calculates width and redraws accordingly - WIDGETS["chronowid"].redraw(); + WIDGETS["widtmr"].redraw(); } - // add the widget - WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { - if (!this.width) return; + + /* + * Add the widgets and functions for other apps + */ + WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { + if (!this.width) { + return; + } + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; var timeStr; if (diff < 3600000) { //less than 1 hour left @@ -54,26 +55,47 @@ scale = 1; timeStr = getTime(diff); //display hour 00:00:00 but small } + // Font5x9Numeric7Seg - just build this in as it's tiny g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { var last = this.width; - if (!settingsChronowid.started) this.width = 0; - else this.width = (diff < 3600000) ? 58 : 48; - if (last != this.width) Bangle.drawWidgets(); - else this.draw(); + if (!settings.started) { + this.width = 0; + } else { + this.width = (diff < 3600000) ? 58 : 48; + } + + if (last != this.width) { + Bangle.drawWidgets(); + } else { + this.draw(); + } + }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; - if (interval) clearInterval(interval); + settings = storage.readJSON("widtmr.json",1)||{}; + if (interval) { + clearInterval(interval); + } interval = undefined; + // start countdown each second - if (settingsChronowid.started) interval = setInterval(countDown, 1000); + if (settings.started) { + interval = setInterval(countDown, 1000); + } + // reset everything countDown(); - }}; - //printDebug(); + }, isStarted: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + return settings.started; + } + +}; + // set width correctly, start countdown each second - WIDGETS["chronowid"].reload(); + WIDGETS["widtmr"].reload(); })(); From b8215908a625a754748a92ebc6512c3430e6940d Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:55:47 +0100 Subject: [PATCH 007/197] Expose timer functions for other apps. Updated notanalog and lcars to use this lib. --- apps/lcars/ChangeLog | 3 +- apps/lcars/README.md | 9 ++--- apps/lcars/lcars.app.js | 61 +++++---------------------------- apps/lcars/metadata.json | 3 +- apps/notanalog/ChangeLog | 3 +- apps/notanalog/README.md | 6 ++-- apps/notanalog/metadata.json | 3 +- apps/notanalog/notanalog.app.js | 56 ++++-------------------------- apps/widtmr/README.md | 18 +++++++--- apps/widtmr/app.js | 4 ++- apps/widtmr/widget.js | 38 ++++++++++++++++++++ 11 files changed, 85 insertions(+), 119 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 7d8fecb1e..08b3b3d4d 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -15,4 +15,5 @@ 0.15: Using wpedom to count steps. 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. -0.18: Fullscreen mode can now be enabled or disabled in the settings. \ No newline at end of file +0.18: Fullscreen mode can now be enabled or disabled in the settings. +0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f979b2304..cf360d647 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -15,7 +15,7 @@ with Gadgetbride and the weather app must be installed. * Tab on left/right to switch between different screens. * Cusomizable data that is shown on screen 1 (steps, weather etc.) * Shows random and real images of planets. - * Tap on top/bottom of screen 1 to activate an alarm. + * Tap on top/bottom of screen 1 to activate an alarm. Depends on widtmr. * The lower orange line indicates the battery level. * Display graphs (day or month) for steps + hrm on the second screen. @@ -36,8 +36,9 @@ Access different screens via tap on the left/ right side of the screen ![](screenshot_1.png) ![](screenshot_2.png) +## Creator +- [David Peer](https://github.com/peerdavid) ## Contributors -- [David Peer](https://github.com/peerdavid). -- [Adam Schmalhofer](https://github.com/adamschmalhofer). -- [Jon Warrington](https://github.com/BartokW). +- [Adam Schmalhofer](https://github.com/adamschmalhofer) +- [Jon Warrington](https://github.com/BartokW) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7d5da2d8e..13c163e26 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -480,9 +480,6 @@ function draw(){ // Queue draw first to ensure that its called in one minute again. queueDraw(); - // First handle alarm to show this correctly afterwards - handleAlarm(); - // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); @@ -561,43 +558,21 @@ function getWeather(){ /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } +function increaseAlarm(){ + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +} - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); +function decreaseAlarm(){ + WIDGETS["widtmr"].decreaseTimer(5); } @@ -625,26 +600,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} - - -function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} function feedback(){ Bangle.buzz(40, 0.3); diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index e6ca10f79..5efd29e7c 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,8 +3,9 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.18", + "version":"0.19", "readme": "README.md", + "dependencies": {"widtmr":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 574d46609..bb5297476 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,3 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. -0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. \ No newline at end of file +0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. +0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 2928fd959..3a0963090 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -8,8 +8,8 @@ black one the battery level (100% = 360 degrees). The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. -## Other features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). +## Other Features +- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. @@ -29,5 +29,5 @@ which helped a lot for this development. Icons from by Freepik - Flaticon -## Contributors +## Creator - [David Peer](https://github.com/peerdavid). \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5efb6bccf..5a0ddbaf0 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -3,10 +3,11 @@ "name": "Not Analog", "shortName":"Not Analog", "icon": "notanalog.png", - "version":"0.03", + "version":"0.04", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", + "dependencies": {"widtmr":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index cea8072b8..be9a01fa7 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -291,7 +291,6 @@ function drawSleep(){ function draw(fastUpdate){ // Execute handlers handleState(fastUpdate); - handleAlarm(); if(state.sleep){ drawSleep(); @@ -388,71 +387,28 @@ function queueDraw() { /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } - - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); -} - - function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); } - function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ Bangle.buzz(40, 0.6); } + /* * Lets start widgets, listen for btn etc. */ diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 0694a13cc..6820b74d0 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,4 +1,4 @@ -# Simple Chronometer Widget +# Timer Widget This is a fork of the Chrono Widget, but implements a simpler UI which to be able to set a timer faster with @@ -6,7 +6,17 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) +# Lib +Different functions are exposed to integrate a timer +into your own app. -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file +Example: +```Javascript +WIDGETS["widtmr"].isStarted(); +WIDGETS["widtmr"].reload(); +WIDGETS["widtmr"].getRemainingMinutes(); +``` +# Creator + +[David Peer](https://github.com/peerdavid) + forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 311e0d3ea..5f836d417 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -1,4 +1,6 @@ /* + * TIMER WIDGET + * * This is a fork of the Chrono Widget, but implements a * simpler UI which to be able to set a timer faster with * less interaction. Additionally, it exposes some functions @@ -18,7 +20,7 @@ let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); -const cy = parseInt(screenHeight/2); +const cy = parseInt(screenHeight/2)-12; function updateSettings() { diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c918a52e1..127217364 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -34,6 +34,18 @@ } + function updateSettings(){ + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + WIDGETS["widtmr"].reload(); + } + + /* * Add the widgets and functions for other apps */ @@ -92,6 +104,32 @@ }, isStarted: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; return settings.started; + + }, setStarted: function(started){ + settings.started=started; + updateSettings(); + + }, increaseTimer: function(m){ + settings.minutes += m; + updateSettings(); + + }, decreaseTimer: function(m){ + settings.minutes -= m; + if(settings.minutes <= 0){ + settings.started=false; + settings.minutes=0; + } + updateSettings(); + + }, getRemainingMinutes: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return -1; + } + + var now = new Date(); + var diff = settings.goal - now; + return Math.floor(diff / (1000*60)); } }; From 6cfd7649162313e7cdcf085fcf2681a3a8eae3c6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:07:09 +0100 Subject: [PATCH 008/197] Improved documentation --- apps/widtmr/README.md | 29 +++++++++++++++++++++++++---- apps/widtmr/description.png | Bin 0 -> 7771 bytes apps/widtmr/metadata.json | 2 +- apps/widtmr/screenshot.png | Bin 2920 -> 1845 bytes apps/widtmr/screenshot_2.png | Bin 0 -> 1950 bytes 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 apps/widtmr/description.png create mode 100644 apps/widtmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 6820b74d0..9216a7b05 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -6,16 +6,37 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + # Lib Different functions are exposed to integrate a timer into your own app. -Example: +The following functions are available: +- isStarted() -> boolean +- setStarted(boolean) -> void +- increaseTimer(int) -> void +- decreaseTimer(int) -> void +- getRemainingMinutes() -> int + +Example to increase the timer by 5 and ensure that its started: ```Javascript -WIDGETS["widtmr"].isStarted(); -WIDGETS["widtmr"].reload(); -WIDGETS["widtmr"].getRemainingMinutes(); +WIDGETS["widtmr"].increaseTimer(5); +WIDGETS["widtmr"].setStarted(true); ``` + +Example to decrease the timer. This also disables the timer if time <= 0.: +```Javascript +WIDGETS["widtmr"].decreaseTimer(5); +``` + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/description.png b/apps/widtmr/description.png new file mode 100644 index 0000000000000000000000000000000000000000..1286d1ab94e56658995ba8dabe08bfc7dea51bc6 GIT binary patch literal 7771 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 SWZ<+Iq^bmYRH|V9`ab}V`IlM% literal 0 HcmV?d00001 diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json index 9645cc00c..a30aea4c3 100644 --- a/apps/widtmr/metadata.json +++ b/apps/widtmr/metadata.json @@ -7,7 +7,7 @@ "icon": "app.png", "tags": "tool,widget", "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", "storage": [ {"name":"widtmr.wid.js","url":"widget.js"}, diff --git a/apps/widtmr/screenshot.png b/apps/widtmr/screenshot.png index f94eece94099f8e5e72db95bd1f6dd3e5a58a7b4..eff94475c73638521c0dc59ff9ec55182f609d2b 100644 GIT binary patch literal 1845 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 diff --git a/apps/widtmr/screenshot_2.png b/apps/widtmr/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5dc9a3df7dc091d1dfe6d8dd3aa29c51351127 GIT binary patch literal 1950 zcmeHI`#01H6d&KFOlD<9MQCO6Y+4K%#tepb3p;JQzwKYJXMec&bMC#L`?=@bbMCp{e(8>tm)j=? zfk5P)ogBQRSo_IfJEXp*X*y5}GI3s5dkFi5`a1|j*4NqL#2Iqn;{CzPbTk55ytOsA zAP#GjRq9;T(yeft5t}>F=j#rNCTqH<#2Y*XpaR;Ccx_=dx`~5Ova&=Q1Oa?mAYk;C zcW_4&_%@C_<&gMCBOmG|-;osV?VxO(z2uY)o_uT_Jx~D7hmj_Gmvjg(yW?b2GdcB2 zmC!)bvINghbo!GbtEl`V8CN1T;_oh_N*UdG1z>-&nxc-#RZXE+f-9=e?fmWb(cR>> z#u*_)ZfxI_KVr?pMv!eaY#S(_P~@g%KrumElU zShU_=&^KAa>W?@*yUT>q->L7C3x?ZknkfUAG}EXKW9OYk$AJ(*TFH9aq$L9vA zF24=qpZ1_|ejE>&sz}gHRW*agn|XsKXVx|&+l&YEQG_6r*q6S^?`x5q^(*H6aiH|$;;RBWDoD_jWr z4MC=&vM%^xMthg0!@DLjnuk@%6OnwFxFum4L+p^_Yw#P8WQV;u=bw(vUfW{CK@+=* z9JM5fW7S4{O1cY#;_Wq*ubU3)oi8=YhXB>(4^5mQ6kM16X=52E-r3WK3IPhTuUDJ_ zU`%QmTUQ2pNEPnJfFgYL90|?<67OBUV z=%SYn8XL{KDBAI;j|T4imj~`WBueNB{dLF?@F)%2)E2pp9xH@Xq7lmmrbr6LYC?@E z|8J4F5r{?wT-nZryA@Yfkp+^VAHSbGSeK1!Jr#lSlP^=Dp*@s^%p~Z3rzDSCPBz|5 zVi7TM-e%C!hk)f#ru}0LUoy@aonJ(G7Kdw9uuGB6@Hd-%{;`i=aO$rX9_hDZhGqyS zTE_?~}92lt`QYc&Ap(|&*f;LCfj5gFmk*uk? z=4597+VmxMFHdK?n$_Aq;X}kLAL?-c!=?5_4v!+qjz1Wb6IE38NI3S~)5P);ddjWd zJ>qdrYEOiPq-68`K%WY9fRYL&#U zxdDz{apX27*(TkwffvcoxO6}Ii$pxZ!u@LvN&>Yn zCDVJL%ITRfUlqsl=EnS8K)%lbN1ixLNdmFFG64HimG#9&_u_SC3$bVp4d|Fzi!eYF z`KEwS9?Qlj6fX#?hN|OAyj60P2tEnHp+%FCd)lAVW>Yd1Mq;+OCZ?11- Date: Fri, 25 Feb 2022 18:07:35 +0100 Subject: [PATCH 009/197] Minor changes --- apps/widtmr/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9216a7b05..9f3d96d9b 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -40,4 +40,4 @@ WIDGETS["widtmr"].decreaseTimer(5); # Creator [David Peer](https://github.com/peerdavid) - forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) + forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) From 6bce7594dce96a074af47a345d935b48be2644f4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:13:01 +0100 Subject: [PATCH 010/197] Updated icons. --- apps/widtmr/README.md | 4 ++++ apps/widtmr/app-icon.js | 2 +- apps/widtmr/app.png | Bin 1060 -> 1153 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9f3d96d9b..e81cac3d5 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -41,3 +41,7 @@ WIDGETS["widtmr"].decreaseTimer(5); [David Peer](https://github.com/peerdavid) forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index db2010218..48f91a33b 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file diff --git a/apps/widtmr/app.png b/apps/widtmr/app.png index 5ac7a480c5d4533c9851ba6264b74aae48035eb0..04ed03751e6b271309a236bd123fa68ad8acfdba 100644 GIT binary patch delta 1132 zcmV-y1e5!u2!RQZB!2{RLP=Bz2nYy#2xN!=00cNmL_t(&f$iB_h*f122k_sSMjbN} zt>|v1Nl*`YA%hGeiR?xsm{1Qv7l?ca%BTp!mx>~=pvWG2=!Os#K@VLlNDM+`j3iM@ z4TUTdgh_8U*MGnG5L2okdn`=AQXG($dmHXI zxQaFho!R)D{F_=#KF3(xi_IdO>KTEjF!2OqJF>A`vvK{x8Ov~Hi})6zh8wY73a2i- z>e$KGE>`c4?EiKAipPZh9~R8R_mVfeu%dua4G&?TWbjTbGH~-c<*4Cuyf0on`bAPM zZu;L1*nc8bu#LFZ2vP!*MLEp9`?<6V?RZWqmFsX_RS&Mp1N%kj^kly;71DqRk*UI< zK71*1rxH}TggsJ|pq3qX2;%wmy!2Mq@u0yj76hA#!63Zo}+~o?8hn zz#C#O$aCNU%oK8CK5i0Sjy%cN;;P{w+l-l5C4Wfe8`?@CxnCDywHlYkCh zY>cNIHL(Y*lf2$75_uY)#^2fX!+2Me+h?TSPhH56C5rn~Ekhgb6qO`T$hz2tr{YNi zH>`df6cTxg$dz3U_x6g_IVDDP;9=~MbkOg3LP+2h8QFYiZtgIz#w?K+n2$BEF`FL`&n@Z>Cfru_GW zJoXo6V^>Kl(JS5wF0R^u*&=T1qOyFIU0Wb@O-`WfQ5VU)MC8Rvsq@^6cW_>n1}trO zc&7-NMM6=Y%$JwH@RCUW`D!j# zqB5105@$7>?-B`pj%qwK0r%isd@Z$7rkCM2QuO#3p;`}0LT{`R4jL&23>l*a3^z`D z1BNP~4hu=qT@jBi(Q_R%hHAieydZQ-6{U0!e!(?^9e6AQ+C*K>L#(lPbGGQfb!BEp zRhVdCXRkx3)4W}?PeHrA$a^!y+tj><`{N{IdxTzT1=^+hf5gDB+JFb~^NA)|ESB_S yB|_E5e%#kgwx|mIAT)brUq>oH9X~1v+5Z7%-K2onB!mS30000m;x<_9I=$uURJ1ZseBV6R)F#Xg92C;;k!X6tX2rp*iB9q=U=45y zm<6tfq%{NOz;R#zF~J#TM22egDKJPw=zW_$>jHUpdnVmAI3OLSh6 zXa!Os2$%L1*ngAHB%;817Xc~M^LhX^4r0JkU>WL;)mh*5=jecQK%q+#CN z1Wcf2iXx5Q7Rw}xfHq(_3+JFsq&Xup0P= zv**2v2Y76mSHyr(5i^CF1dP!qh^B#RLyj-NXG5ROILE|ULk>3JoW42@Im&FlWrn_o zMC>_Wy$Qi7L6E?F^V4YaZ#49c0I!6G6DH0dg>##s0Dumge}@l$Ie|>zu@iR)#}xWS zDi^wK9Dm(D{ELA}p`}SS(q*($T;D(yT&Aeb^4TkX0yo9~nq?zh0`=nhfsf#oWIp$e zz(yZDL*iO$)8aLmx2?`FXcelm)K#0hjgA`{1jn!!Cs`@R+?zXa4X5}&cEyk@F8q^T zoMwen)G(-9sq9IB4MoD=F&1@WAZ-{#!fl@&bbk--(56e^hqzvD804PIcY}spvhJGp z;v`o<(?MK={xM1d>kPT%AWp~zx;ro;uD2Qn9RX@lgZaB-JYLjIId5ATIc`f4ywWzho9=q2M(JGwtc>;BMkT1k>Zt9bm z*JJb8C&<#MqYvMNE{Fq9HSt=566?-GM=@XE+)#_N=hLWj(!eMLZfnS=QKtt%W~T^n z80Rye25#~9XfZHK(I=5c)lTiGg~uz3QGfHioGR_&OGDB=k3!s!*C&C?z(LfC8At6U zqSogI>$?G*E3ABMLhE@Q+R$$qgIbah2CP@aQ9TvbE2duZGqdGH1?t3X!lPJO+w@o* zz7fh#UQk6=J+KSdj@s0eqh2wAnq?+{x2V^x_ffA|e+3Qv8;y4S&y5Yu=l}o!00>D% JPDHLkV1fs`=HmbW From 217acc89aa61f0525bf1333d35b5f6a84cee8a78 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:23:22 +0100 Subject: [PATCH 011/197] New icon --- apps/widtmr/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index 48f91a33b..bc4261459 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMAg//AAXgApcAvAZBhwCBuAFuGoUeAQM4AQM8AQl8Bwn4AQMPgEB+AFBg+AgZYBgED4AHBAoIPBCYIAC/AfCGwQrCGAQ3CAAMcIYQFCJ4QABnoREvIdE/eeAgUB+fPAoUD8/nIIUHz/zJoUPn/5LIUev/8MoU8//+OIU5XwO8AoN7AoPeAoNzAoPOAsrFKg4QBAAPgApYA==")) \ No newline at end of file From 2cc953e2b399f81f796ec3c9afbf869ba13cbfcd Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:58:35 +0100 Subject: [PATCH 012/197] Updated readme --- apps/widtmr/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index e81cac3d5..9e640c618 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,7 +15,7 @@ started / stopped. ![](description.png) -# Lib +# Library for other Apps Different functions are exposed to integrate a timer into your own app. @@ -28,20 +28,25 @@ The following functions are available: Example to increase the timer by 5 and ensure that its started: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); ``` Example to decrease the timer. This also disables the timer if time <= 0.: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].decreaseTimer(5); ``` # Creator [David Peer](https://github.com/peerdavid) - forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) # Thanks to... -Time icon created by CreativeCons - Flaticon \ No newline at end of file +Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Time icon created by CreativeCons - Flaticon \ No newline at end of file From 9daf898f1f310599256cc60b132009e47a73ea94 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:14:57 +0100 Subject: [PATCH 013/197] Show ceil of remaining minutes which is much easier to read. --- apps/widtmr/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 127217364..3b7cfb25e 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -129,7 +129,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.floor(diff / (1000*60)); + return Math.ceil(diff / (1000*60)); } }; From c6c86213d19560619c423f1277d22391a43c3ca5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:17:46 +0100 Subject: [PATCH 014/197] Add function to get the time rather than minutes only --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9e640c618..7edaffb10 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -25,6 +25,7 @@ The following functions are available: - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int +- getRemainingTime() -> DateTime Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 3b7cfb25e..b83b4a204 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -130,6 +130,15 @@ var now = new Date(); var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); + + }, getRemainingTime: function(){ + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return getTime(diff); } }; From ef31fd4f01cd72b14e2630b1d675329d4ced3831 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:24:42 +0100 Subject: [PATCH 015/197] Added more functions to get the time, time str or remaining minutes. --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 7edaffb10..bd795d20f 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -26,6 +26,7 @@ The following functions are available: - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime +- getRemainingTimeStr() -> str Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index b83b4a204..8dcc5ec41 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -131,16 +131,30 @@ var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); - }, getRemainingTime: function(){ + }, getRemainingTimeStr: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ return; } var now = new Date(); var diff = settings.goal - now; - return getTime(diff); - } + var timeStr = getTime(diff); + if(diff < 3600000){ + timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 + } + return timeStr; + }, getRemainingTime: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return diff; + } }; // set width correctly, start countdown each second From 777943e0315c1fa2e176bbcb24402d9d85d1629c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:36:29 +0100 Subject: [PATCH 016/197] For watch faces we want to start at 0 rather than the last value that was set... --- apps/lcars/lcars.app.js | 5 +++++ apps/notanalog/notanalog.app.js | 4 ++++ apps/widtmr/README.md | 21 ++++++++++++++++----- apps/widtmr/widget.js | 7 ++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 13c163e26..958ab7388 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,6 +567,11 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index be9a01fa7..6bd725f58 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,6 +396,10 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index bd795d20f..4bdf20b93 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,25 +22,36 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void +- resetTimer() -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime - getRemainingTimeStr() -> str -Example to increase the timer by 5 and ensure that its started: +For example if we want to increase the timer by +5 minutes each time +the touch event is fired: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].increaseTimer(5); -WIDGETS["widtmr"].setStarted(true); +Bangle.on('touch', function(btn, e){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +}); ``` -Example to decrease the timer. This also disables the timer if time <= 0.: +Example to decrease the timer by 5 and stop if 0 is reached: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].decreaseTimer(5); +Bangle.on('touch', function(btn, e){ + WIDGETS["widtmr"].decreaseTimer(5); +} ``` # Creator diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 8dcc5ec41..751da4ee8 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,6 +121,11 @@ } updateSettings(); + }, resetTimer: function(){ + settings.started=false; + settings.minutes = 0; + updateSettings(); + }, getRemainingMinutes: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ @@ -129,7 +134,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.ceil(diff / (1000*60)); + return Math.round(diff / (1000*60)); }, getRemainingTimeStr: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; From 3bbbd8831c4c56e326e59b5a999000a6cbce07fe Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:53:38 +0100 Subject: [PATCH 017/197] Updated lcars and notanalog to also work if the widget is not installed. Then this functionality is not provided but the apps are not crashing. Also faster updates of the watch face in timer mode to show the correct time... --- apps/lcars/lcars.app.js | 35 ++++++++++++++++++++++++++++-- apps/notanalog/notanalog.app.js | 38 ++++++++++++++++++++++++++++++--- apps/widtmr/README.md | 6 ++++-- apps/widtmr/widget.js | 6 +++--- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 958ab7388..848065994 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -124,11 +124,16 @@ Graphics.prototype.setFontAntonioLarge = function(scale) { */ var drawTimeout; function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; draw(); - }, 60000 - (Date.now() % 60000)); + }, timeout - (Date.now() % timeout)); } /** @@ -558,18 +563,40 @@ function getWeather(){ /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -577,6 +604,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 6bd725f58..8939a5a75 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -376,28 +376,56 @@ Bangle.on('touch', function(btn, e){ * Some helpers */ function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; - draw(true); - }, 60000 - (Date.now() % 60000)); + draw(); + }, timeout - (Date.now() % timeout)); } /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -405,6 +433,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 4bdf20b93..c4304bd81 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,7 +22,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- resetTimer() -> void +- setTime(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.loadWidgets(); Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -54,6 +54,8 @@ Bangle.on('touch', function(btn, e){ } ``` +You can find even more examples in the lcars or notanalog app ... + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 751da4ee8..c9ef4ffdb 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,9 +121,9 @@ } updateSettings(); - }, resetTimer: function(){ - settings.started=false; - settings.minutes = 0; + }, setTime: function(t){ + settings.minutes = Math.max(0, t); + settings.started = t > 0; updateSettings(); }, getRemainingMinutes: function(){ From 2124c2b0d4f7087d5bb167d546ccdca58db825c9 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 10:00:53 +0100 Subject: [PATCH 018/197] Bugfix --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 848065994..9af585ff7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 8939a5a75..91381fe71 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,7 +396,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; From fd3401bd2372e4c522162546708d2dbf938f4927 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:05:39 +0100 Subject: [PATCH 019/197] Updated readme --- apps/widtmr/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index c4304bd81..2ffbfc8cf 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,10 +1,9 @@ # Timer Widget This is a fork of the Chrono Widget, but implements a -simpler UI which to be able to set a timer faster with -less interaction. Additionally, it exposes some functions -that can be used by other apps or clocks to easily -implement a timer. It is used e.g. by lcars or notanalog. +simpler UI. Additionally, it exposes functions for other +apps or clocks such that they can easily implement a timer. +Currently, it is used by lcars and notanalog. # Overview If you open the app, you can simply control the timer @@ -15,7 +14,7 @@ started / stopped. ![](description.png) -# Library for other Apps +# Lib Different functions are exposed to integrate a timer into your own app. @@ -35,7 +34,8 @@ the touch event is fired: Bangle.loadWidgets(); ... Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before + // Set to zero if alarm was disabled before. Otherwise + // it starts from the last setting made by the user. if(!isAlarmEnabled()){ WIDGETS["widtmr"].setTime(0); } @@ -54,10 +54,10 @@ Bangle.on('touch', function(btn, e){ } ``` -You can find even more examples in the lcars or notanalog app ... +You can find implementations and usages in the lcars or notanalog app. + # Creator - [David Peer](https://github.com/peerdavid) From 56a4cd0dff87d2e0e34071a813708a560d23e62a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:55:35 +0100 Subject: [PATCH 020/197] Renaming of setTime to setTimer. --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- apps/widtmr/README.md | 4 ++-- apps/widtmr/widget.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9af585ff7..6ffc78ca7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -596,7 +596,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 91381fe71..5e56d6f6a 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -425,7 +425,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 2ffbfc8cf..ae8b0945e 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -21,7 +21,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- setTime(t) -> void +- setTimer(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before. Otherwise // it starts from the last setting made by the user. if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c9ef4ffdb..30eb950cf 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,7 +121,7 @@ } updateSettings(); - }, setTime: function(t){ + }, setTimer: function(t){ settings.minutes = Math.max(0, t); settings.started = t > 0; updateSettings(); From bffbe40290eaa0bb1258c9a58c70e647a44b06f3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 12:02:18 +0100 Subject: [PATCH 021/197] Minor changes --- apps/widtmr/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index ae8b0945e..88893ce74 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,8 +15,8 @@ started / stopped. # Lib -Different functions are exposed to integrate a timer -into your own app. +Different functions are exposed by widtmr which enables other +apps to directly use and integrate this functionality: The following functions are available: - isStarted() -> boolean From 61c29c1c7ae2c4537434f9507be2cb5c1a8c1924 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 4 Mar 2022 17:35:34 +0100 Subject: [PATCH 022/197] First alarm lib test --- apps/alarm/ChangeLog | 1 + apps/alarm/lib.js | 3 +++ apps/alarm/metadata.json | 5 +++-- apps/widtmr/app.js | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 apps/alarm/lib.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 4576237a5..9442c234e 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,3 +14,4 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system +0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js new file mode 100644 index 000000000..9dfcca897 --- /dev/null +++ b/apps/alarm/lib.js @@ -0,0 +1,3 @@ +exports.createTimer = function() { + return 0; +} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index d29298309..bbb6012d9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.15", + "version": "0.16", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,7 +12,8 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + {"name":"alarm.wid.js","url":"widget.js"}, + {"name":"alarm","url":"lib.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 5f836d417..2a10b3b5c 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -57,6 +57,9 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + + print(require("alarm").createTimer()); + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); From 29faff8eb8af71808b0ad4c51b8432793e82891f Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 7 Mar 2022 17:07:28 +0100 Subject: [PATCH 023/197] Tests with qalarm --- apps/qalarm/ChangeLog | 1 + apps/qalarm/lib.js | 81 +++++++++++++++++++++++++++++++++++++++ apps/qalarm/metadata.json | 3 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 apps/qalarm/lib.js diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index b9be6039d..850735ddb 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,3 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. +0.05: Include library for other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js new file mode 100644 index 000000000..1cb602456 --- /dev/null +++ b/apps/qalarm/lib.js @@ -0,0 +1,81 @@ +Bangle.loadWidgets(); + +let alarms = require("Storage").readJSON("qalarm.json", 1) || []; + +/** + * LIBRARY + */ +function alarmExists(alarmIndex){ + return alarmIndex > 0 && alarmIndex < alarms.length; +} + +function isAlarmStarted(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return false; + } + + let time = new Date(); + let t = getCurrentTime(); + a = alarms[alarmIndex]; + return a.on && + a.t <= t && + a.last != time.getDate() && + (a.timer || a.daysOfWeek[time.getDay()]); +} + +function getAlarmMin(alarmIndex){ + if(!isAlarmStarted(alarmIndex)){ + return 0; + } + + let t = getCurrentTime(); + let a = alarms[alarmIndex] ; + return a.t - t * 60; + } + +function _reload(){ + require("Storage").write("qalarm.json", JSON.stringify(alarms)); + eval(require("Storage").read("qalarmcheck.js")); + if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); +} + +function editTimer(alarmIndex, hrs, mins, secs){ + var a = { + timer: 300, + on: true, + rp: false, + as: false, + hard: false, + }; + a.timer = hrs * 3600 + mins * 60 + secs; + a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + + if(alarmExists(a)){ + alarms[alarmIndex] = a; + } else { + alarmIndex = alarms.length; + alarms.push(a) + } + + _reload(); + return alarmIndex; +} + + +function deleteAlarm(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return; + } + + alarms.splice(alarmIndex, 1); + + _reload(); +} + + +// Export functions +exports.alarmExists = alarmExists; +exports.isAlarmStarted = isAlarmStarted; +exports.getAlarmMin = getAlarmMin; +exports.editTimer = editTimer; +exports.deleteAlarm = deleteAlarm; \ No newline at end of file diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 326ba33a7..1ab4f4192 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,11 +3,12 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.04", + "version": "0.05", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ + { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, From 630ea1a21c020114a531033eb39abcb29b1aa9be Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:03:23 +0100 Subject: [PATCH 024/197] Added library to qalarm and created a simple timer app which is an alternative UI. --- apps/alarm/ChangeLog | 1 - apps/alarm/lib.js | 3 - apps/alarm/metadata.json | 5 +- apps/alarm/widget.js | 8 +- apps/qalarm/ChangeLog | 2 +- apps/qalarm/lib.js | 41 ++++-- apps/{widtmr => smpltmr}/ChangeLog | 0 apps/smpltmr/README.md | 21 +++ apps/{widtmr => smpltmr}/app-icon.js | 0 apps/{widtmr => smpltmr}/app.js | 74 ++++++---- apps/{widtmr => smpltmr}/app.png | Bin apps/{widtmr => smpltmr}/description.png | Bin apps/smpltmr/metadata.json | 17 +++ apps/{widtmr => smpltmr}/screenshot.png | Bin apps/{widtmr => smpltmr}/screenshot_2.png | Bin apps/widtmr/README.md | 67 --------- apps/widtmr/metadata.json | 17 --- apps/widtmr/widget.js | 167 ---------------------- 18 files changed, 116 insertions(+), 307 deletions(-) delete mode 100644 apps/alarm/lib.js rename apps/{widtmr => smpltmr}/ChangeLog (100%) create mode 100644 apps/smpltmr/README.md rename apps/{widtmr => smpltmr}/app-icon.js (100%) rename apps/{widtmr => smpltmr}/app.js (55%) rename apps/{widtmr => smpltmr}/app.png (100%) rename apps/{widtmr => smpltmr}/description.png (100%) create mode 100644 apps/smpltmr/metadata.json rename apps/{widtmr => smpltmr}/screenshot.png (100%) rename apps/{widtmr => smpltmr}/screenshot_2.png (100%) delete mode 100644 apps/widtmr/README.md delete mode 100644 apps/widtmr/metadata.json delete mode 100644 apps/widtmr/widget.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 9442c234e..4576237a5 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,4 +14,3 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system -0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js deleted file mode 100644 index 9dfcca897..000000000 --- a/apps/alarm/lib.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.createTimer = function() { - return 0; -} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index bbb6012d9..d29298309 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.16", + "version": "0.15", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,8 +12,7 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"}, - {"name":"alarm","url":"lib.js"} + {"name":"alarm.wid.js","url":"widget.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index e8bb79fc7..e1dec5ea2 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -1,7 +1,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { - if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); - },reload:function() { - WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; - } + if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); +},reload:function() { + WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; +} }; WIDGETS["alarm"].reload(); diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 850735ddb..424571439 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library for other apps. \ No newline at end of file +0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 1cb602456..670ee99ae 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -5,8 +5,19 @@ let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** * LIBRARY */ + +function getCurrentTime() { + let time = new Date(); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); +} + function alarmExists(alarmIndex){ - return alarmIndex > 0 && alarmIndex < alarms.length; + var exists = alarmIndex >= 0 && alarmIndex < alarms.length; + return exists; } function isAlarmStarted(alarmIndex){ @@ -18,20 +29,23 @@ function isAlarmStarted(alarmIndex){ let t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && - a.t <= t && + t <= a.t && a.last != time.getDate() && (a.timer || a.daysOfWeek[time.getDay()]); } -function getAlarmMin(alarmIndex){ +function getTimerMin(alarmIndex){ if(!isAlarmStarted(alarmIndex)){ return 0; } - let t = getCurrentTime(); let a = alarms[alarmIndex] ; - return a.t - t * 60; - } + let diff = a.t - getCurrentTime(); + // let hrs = Math.floor(t / 3600000); + let mins = Math.round((diff / 60000) % 60); + // return hrs + ":" + ("0" + mins).substr(-2); + return mins; +} function _reload(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); @@ -41,34 +55,31 @@ function _reload(){ function editTimer(alarmIndex, hrs, mins, secs){ var a = { - timer: 300, on: true, rp: false, as: false, hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + a.t = (getCurrentTime() + a.timer * 1000) % 86400000; if(alarmExists(a)){ alarms[alarmIndex] = a; } else { - alarmIndex = alarms.length; alarms.push(a) + alarmIndex = alarms.length-1; } _reload(); return alarmIndex; } - function deleteAlarm(alarmIndex){ if(!alarmExists(alarmIndex)){ return; } alarms.splice(alarmIndex, 1); - _reload(); } @@ -76,6 +87,10 @@ function deleteAlarm(alarmIndex){ // Export functions exports.alarmExists = alarmExists; exports.isAlarmStarted = isAlarmStarted; -exports.getAlarmMin = getAlarmMin; +exports.deleteAlarm = deleteAlarm; + +exports.timerExists = alarmExists; +exports.isTimerStarted = isAlarmStarted; +exports.getTimerMin = getTimerMin; exports.editTimer = editTimer; -exports.deleteAlarm = deleteAlarm; \ No newline at end of file +exports.deleteTimer = deleteAlarm; diff --git a/apps/widtmr/ChangeLog b/apps/smpltmr/ChangeLog similarity index 100% rename from apps/widtmr/ChangeLog rename to apps/smpltmr/ChangeLog diff --git a/apps/smpltmr/README.md b/apps/smpltmr/README.md new file mode 100644 index 000000000..1296166e2 --- /dev/null +++ b/apps/smpltmr/README.md @@ -0,0 +1,21 @@ +# Simple Timer + +A simple app to set a timer quickly. Simply tab on top/bottom/left/right +to select the minutes and tab in the middle of the screen to start/stop +the timer. Note that this timer depends on qalarm. + +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + +# Creator +[David Peer](https://github.com/peerdavid) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/smpltmr/app-icon.js similarity index 100% rename from apps/widtmr/app-icon.js rename to apps/smpltmr/app-icon.js diff --git a/apps/widtmr/app.js b/apps/smpltmr/app.js similarity index 55% rename from apps/widtmr/app.js rename to apps/smpltmr/app.js index 2a10b3b5c..1de9057e8 100644 --- a/apps/widtmr/app.js +++ b/apps/smpltmr/app.js @@ -15,32 +15,26 @@ Bangle.loadWidgets(); const storage = require('Storage'); +const alarm = require('qalarm'); + let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); const cy = parseInt(screenHeight/2)-12; +var minutes = 5; +var interval; //used for the 1 second interval timer function updateSettings() { - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); storage.writeJSON('widtmr.json', settings); - if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { settings = { - hours : 0, - minutes : 0, - seconds : 0, - started : false, - counter : 0, - goal : 0, + alarmIndex: -1 }; updateSettings(); } @@ -55,15 +49,25 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); + if (interval) { + clearInterval(interval); + } + interval = undefined; + + // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + var started = alarm.isTimerStarted(settings.alarmIndex); + var text = minutes + " min."; + if(started){ + var min = alarm.getTimerMin(settings.alarmIndex); + text = min + " min."; + } - print(require("alarm").createTimer()); - - var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settings.started){ + if(started){ + interval = setInterval(draw, 1000); g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -74,6 +78,7 @@ function draw(){ g.drawString(text, cx, cy); } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; @@ -84,27 +89,34 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; var isUpper = e.y < upper; var isLower = e.y > lower; + var isMiddle = !isLeft && !isRight && !isUpper && !isLower; + print(settings.alarmIndex); + var started = alarm.isTimerStarted(settings.alarmIndex); - if(isRight){ - settings.minutes += 1; + if(isRight && !started){ + minutes += 1; Bangle.buzz(40, 0.3); - } else if(isLeft){ - settings.minutes -= 1; + } else if(isLeft && !started){ + minutes -= 1; Bangle.buzz(40, 0.3); - } else if(isUpper){ - settings.minutes += 5; + } else if(isUpper && !started){ + minutes += 5; Bangle.buzz(40, 0.3); - } else if(isLower){ - settings.minutes -= 5; + } else if(isLower && !started){ + minutes -= 5; Bangle.buzz(40, 0.3); - } else { - settings.started = !settings.started; - Bangle.buzz(120, 0.6); - } - - if(settings.minutes <= 0){ - settings.minutes = 0; - settings.started = false; + } else if(isMiddle) { + if(!started){ + settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + print("-----") + print(settings.alarmIndex); + print(alarm.timerExists(settings.alarmIndex)) + print(alarm.isTimerStarted(settings.alarmIndex)) + print("-----") + } else { + alarm.deleteTimer(settings.alarmIndex); + } + Bangle.buzz(80, 0.6); } updateSettings(); diff --git a/apps/widtmr/app.png b/apps/smpltmr/app.png similarity index 100% rename from apps/widtmr/app.png rename to apps/smpltmr/app.png diff --git a/apps/widtmr/description.png b/apps/smpltmr/description.png similarity index 100% rename from apps/widtmr/description.png rename to apps/smpltmr/description.png diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json new file mode 100644 index 000000000..4f0d473b4 --- /dev/null +++ b/apps/smpltmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "smpltmr", + "name": "Simple Timer", + "shortName": "Simple Timer", + "version": "0.01", + "description": "A simple app to set a timer.", + "icon": "app.png", + "tags": "tool", + "dependencies": {"qalarm":"app"}, + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], + "readme": "README.md", + "storage": [ + {"name":"smpltmr.app.js","url":"app.js"}, + {"name":"smpltmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/widtmr/screenshot.png b/apps/smpltmr/screenshot.png similarity index 100% rename from apps/widtmr/screenshot.png rename to apps/smpltmr/screenshot.png diff --git a/apps/widtmr/screenshot_2.png b/apps/smpltmr/screenshot_2.png similarity index 100% rename from apps/widtmr/screenshot_2.png rename to apps/smpltmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md deleted file mode 100644 index 88893ce74..000000000 --- a/apps/widtmr/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Timer Widget - -This is a fork of the Chrono Widget, but implements a -simpler UI. Additionally, it exposes functions for other -apps or clocks such that they can easily implement a timer. -Currently, it is used by lcars and notanalog. - -# Overview -If you open the app, you can simply control the timer -by clicking on top, bottom, left or right of the screen. -If you tab at the middle of the screen, the timer is -started / stopped. - -![](description.png) - - -# Lib -Different functions are exposed by widtmr which enables other -apps to directly use and integrate this functionality: - -The following functions are available: -- isStarted() -> boolean -- setStarted(boolean) -> void -- setTimer(t) -> void -- increaseTimer(int) -> void -- decreaseTimer(int) -> void -- getRemainingMinutes() -> int -- getRemainingTime() -> DateTime -- getRemainingTimeStr() -> str - -For example if we want to increase the timer by +5 minutes each time -the touch event is fired: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before. Otherwise - // it starts from the last setting made by the user. - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); -}); -``` - -Example to decrease the timer by 5 and stop if 0 is reached: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - WIDGETS["widtmr"].decreaseTimer(5); -} -``` - -You can find implementations and usages in the lcars or notanalog app. - - -# Creator -[David Peer](https://github.com/peerdavid) - - -# Thanks to... -Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json deleted file mode 100644 index a30aea4c3..000000000 --- a/apps/widtmr/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "widtmr", - "name": "Timer Widget", - "shortName": "Timer Widget", - "version": "0.01", - "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], - "readme": "README.md", - "storage": [ - {"name":"widtmr.wid.js","url":"widget.js"}, - {"name":"widtmr.app.js","url":"app.js"}, - {"name":"widtmr.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js deleted file mode 100644 index 30eb950cf..000000000 --- a/apps/widtmr/widget.js +++ /dev/null @@ -1,167 +0,0 @@ -(() => { - let storage = require('Storage'); - - var settings; - var interval = 0; //used for the 1 second interval timer - var diff; - - - //Convert ms to time - function getTime(t) { - var milliseconds = parseInt((t % 1000) / 100), - seconds = Math.floor((t / 1000) % 60), - minutes = Math.floor((t / (1000 * 60)) % 60), - hours = Math.floor((t / (1000 * 60 * 60)) % 24); - return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); - } - - - //counts down, calculates and displays - function countDown() { - var now = new Date(); - diff = settings.goal - now; //calculate difference - // time is up - if (settings.started && diff < 1000) { - Bangle.buzz(1500); - //write timer off to file - settings.started = false; - storage.writeJSON('widtmr.json', settings); - clearInterval(interval); //stop interval - interval = undefined; - } - // calculates width and redraws accordingly - WIDGETS["widtmr"].redraw(); - } - - - function updateSettings(){ - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); - - settings.goal = goal.getTime(); - storage.writeJSON('widtmr.json', settings); - WIDGETS["widtmr"].reload(); - } - - - /* - * Add the widgets and functions for other apps - */ - WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { - if (!this.width) { - return; - } - - g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - - var scale; - var timeStr; - if (diff < 3600000) { //less than 1 hour left - width = 58; - scale = 2; - timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 - } else { //one hour or more left - width = 48; - scale = 1; - timeStr = getTime(diff); //display hour 00:00:00 but small - } - - // Font5x9Numeric7Seg - just build this in as it's tiny - g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); - g.drawString(timeStr, this.x+this.width/2, this.y+12); - - }, redraw:function() { - var last = this.width; - if (!settings.started) { - this.width = 0; - } else { - this.width = (diff < 3600000) ? 58 : 48; - } - - if (last != this.width) { - Bangle.drawWidgets(); - } else { - this.draw(); - } - - }, reload:function() { - settings = storage.readJSON("widtmr.json",1)||{}; - if (interval) { - clearInterval(interval); - } - interval = undefined; - - // start countdown each second - if (settings.started) { - interval = setInterval(countDown, 1000); - } - - // reset everything - countDown(); - - }, isStarted: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - return settings.started; - - }, setStarted: function(started){ - settings.started=started; - updateSettings(); - - }, increaseTimer: function(m){ - settings.minutes += m; - updateSettings(); - - }, decreaseTimer: function(m){ - settings.minutes -= m; - if(settings.minutes <= 0){ - settings.started=false; - settings.minutes=0; - } - updateSettings(); - - }, setTimer: function(t){ - settings.minutes = Math.max(0, t); - settings.started = t > 0; - updateSettings(); - - }, getRemainingMinutes: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return -1; - } - - var now = new Date(); - var diff = settings.goal - now; - return Math.round(diff / (1000*60)); - - }, getRemainingTimeStr: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - var timeStr = getTime(diff); - if(diff < 3600000){ - timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 - } - return timeStr; - - }, getRemainingTime: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - return diff; - } -}; - - // set width correctly, start countdown each second - WIDGETS["widtmr"].reload(); -})(); From 8d2e3b81800fc89db35996b043c5dc3ca90b3cfc Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:12:35 +0100 Subject: [PATCH 025/197] Removed print statements --- apps/qalarm/lib.js | 6 +++--- apps/smpltmr/app.js | 14 +------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 670ee99ae..189041a02 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -47,7 +47,7 @@ function getTimerMin(alarmIndex){ return mins; } -function _reload(){ +function reloadQalarm(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); eval(require("Storage").read("qalarmcheck.js")); if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); @@ -70,7 +70,7 @@ function editTimer(alarmIndex, hrs, mins, secs){ alarmIndex = alarms.length-1; } - _reload(); + reloadQalarm(); return alarmIndex; } @@ -80,7 +80,7 @@ function deleteAlarm(alarmIndex){ } alarms.splice(alarmIndex, 1); - _reload(); + reloadQalarm(); } diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 1de9057e8..caa3e5cae 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -1,11 +1,5 @@ /* - * TIMER WIDGET - * - * This is a fork of the Chrono Widget, but implements a - * simpler UI which to be able to set a timer faster with - * less interaction. Additionally, it exposes some functions - * that can be used by other apps or clocks to easily - * implement a timer. It is used e.g. by lcars or notanalog. + * SIMPLE TIMER * * Creator: David Peer * Date: 02/2022 @@ -90,7 +84,6 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - print(settings.alarmIndex); var started = alarm.isTimerStarted(settings.alarmIndex); if(isRight && !started){ @@ -108,11 +101,6 @@ Bangle.on('touch', function(btn, e){ } else if(isMiddle) { if(!started){ settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); - print("-----") - print(settings.alarmIndex); - print(alarm.timerExists(settings.alarmIndex)) - print(alarm.isTimerStarted(settings.alarmIndex)) - print("-----") } else { alarm.deleteTimer(settings.alarmIndex); } From 49053e61214af5956ae85c13f11345c605ab1436 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:28:49 +0100 Subject: [PATCH 026/197] Include id such that the timer can precisely be selected by each app. --- apps/qalarm/lib.js | 48 ++++++++++++++++++++++++-------------- apps/qalarm/qalarmcheck.js | 1 - apps/smpltmr/app.js | 32 +++++-------------------- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 189041a02..8c4be311f 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -15,18 +15,29 @@ function getCurrentTime() { ); } -function alarmExists(alarmIndex){ +function getAlarmIndex(idx){ + for(var i=0; i= 0 && alarmIndex < alarms.length; return exists; } -function isAlarmStarted(alarmIndex){ - if(!alarmExists(alarmIndex)){ +function isAlarmStarted(idx){ + if(!alarmExists(idx)){ return false; } - let time = new Date(); - let t = getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var time = new Date(); + var t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && t <= a.t && @@ -34,15 +45,16 @@ function isAlarmStarted(alarmIndex){ (a.timer || a.daysOfWeek[time.getDay()]); } -function getTimerMin(alarmIndex){ - if(!isAlarmStarted(alarmIndex)){ +function getTimerMin(idx){ + if(!isAlarmStarted(idx)){ return 0; } - let a = alarms[alarmIndex] ; - let diff = a.t - getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var a = alarms[alarmIndex] ; + var diff = a.t - getCurrentTime(); // let hrs = Math.floor(t / 3600000); - let mins = Math.round((diff / 60000) % 60); + var mins = Math.round((diff / 60000) % 60); // return hrs + ":" + ("0" + mins).substr(-2); return mins; } @@ -53,12 +65,14 @@ function reloadQalarm(){ if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); } -function editTimer(alarmIndex, hrs, mins, secs){ +function editTimer(idx, hrs, mins, secs){ + var alarmIndex = getAlarmIndex(idx); var a = { - on: true, - rp: false, - as: false, - hard: false, + idx: idx, + on: true, + rp: false, + as: false, + hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; @@ -71,10 +85,10 @@ function editTimer(alarmIndex, hrs, mins, secs){ } reloadQalarm(); - return alarmIndex; } -function deleteAlarm(alarmIndex){ +function deleteAlarm(idx){ + var alarmIndex = getAlarmIndex(idx); if(!alarmExists(alarmIndex)){ return; } diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 8dac43800..4976afb6f 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,7 +2,6 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ -print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index caa3e5cae..e1bb49c78 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,11 +8,9 @@ Bangle.loadWidgets(); -const storage = require('Storage'); const alarm = require('qalarm'); -let settings; - +const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); @@ -21,23 +19,6 @@ var minutes = 5; var interval; //used for the 1 second interval timer -function updateSettings() { - storage.writeJSON('widtmr.json', settings); -} - - -function resetSettings() { - settings = { - alarmIndex: -1 - }; - updateSettings(); -} - - -settings = storage.readJSON('widtmr.json',1); -if (!settings) resetSettings(); - - setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -51,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(settings.alarmIndex); + var min = alarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -84,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -100,14 +81,13 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + alarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(settings.alarmIndex); + alarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } - updateSettings(); draw(); }); From 06293ad9c0847768234462eeeaef8a4323332995 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:32:09 +0100 Subject: [PATCH 027/197] Fixed delete. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 8c4be311f..37be55927 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -89,7 +89,7 @@ function editTimer(idx, hrs, mins, secs){ function deleteAlarm(idx){ var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(alarmIndex)){ + if(!alarmExists(idx)){ return; } From ad84ec029b4eef0583f9ed9de0eb09bc41cf5e42 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:41:44 +0100 Subject: [PATCH 028/197] Minor renaming --- apps/smpltmr/app.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index e1bb49c78..ab08e3d3d 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require('qalarm'); +const qalarm = require('qalarm'); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -32,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(TIMER_IDX); + var min = qalarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -65,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -81,9 +81,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - alarm.editTimer(TIMER_IDX, 0, minutes, 0); + qalarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(TIMER_IDX); + qalarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } From 75e88bd587031885badb9b1f6994361731a59076 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:43:56 +0100 Subject: [PATCH 029/197] Ensure time > 0. --- apps/smpltmr/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index ab08e3d3d..754fbae5b 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -87,6 +87,7 @@ Bangle.on('touch', function(btn, e){ } Bangle.buzz(80, 0.6); } + minutes = Math.max(0, minutes); draw(); }); From e8adb6aa15bc5f812fe76dc66a4b1305bb64e06c Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:56:53 +0100 Subject: [PATCH 030/197] Wrong index fix. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 37be55927..d75ce4204 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -77,7 +77,7 @@ function editTimer(idx, hrs, mins, secs){ a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - if(alarmExists(a)){ + if(alarmExists(idx)){ alarms[alarmIndex] = a; } else { alarms.push(a) From 0fb271dfefa11dc0ad12e3e40c8fd9a9d4c34e80 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:06:24 +0100 Subject: [PATCH 031/197] Updated lcars and notanalog to use qalarm --- apps/lcars/ChangeLog | 2 +- apps/lcars/lcars.app.js | 47 ++++++++------------------------- apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/metadata.json | 2 +- apps/notanalog/notanalog.app.js | 45 +++++++------------------------ apps/qalarm/lib.js | 2 -- 7 files changed, 25 insertions(+), 77 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 08b3b3d4d..fcd817015 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,4 +16,4 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file +0.19: Use qalarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 6ffc78ca7..94159a74e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,6 +1,7 @@ const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); -const storage = require('Storage') +const storage = require('Storage'); +const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -563,52 +564,26 @@ function getWeather(){ /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 5efd29e7c..b5d8e0a52 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,7 @@ "icon": "lcars.png", "version":"0.19", "readme": "README.md", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index bb5297476..3d6f1fce8 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5a0ddbaf0..25cfa706d 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,7 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 5e56d6f6a..f51fc23fd 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -5,6 +5,7 @@ const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; +const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -392,52 +393,26 @@ function queueDraw() { /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index d75ce4204..6d186d190 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -1,5 +1,3 @@ -Bangle.loadWidgets(); - let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** From 02faa5cc267dd2cb31b686c72d03649517be3c76 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:11:46 +0100 Subject: [PATCH 032/197] Unique alarm ID for notanalog --- apps/notanalog/notanalog.app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index f51fc23fd..fcd49af25 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,24 +394,24 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + return qalarm.isTimerStarted("notanalog"); } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + return qalarm.getTimerMin("notanalog"); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + var mins = qalarm.getTimerMin("notanalog")+5; + qalarm.deleteTimer("notanalog"); + qalarm.editTimer("notanalog", 0, mins, 0); } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); + var mins = qalarm.getTimerMin("notanalog")-5; + qalarm.deleteTimer("notanalog"); if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); + qalarm.editTimer("notanalog", 0, mins, 0); } } From 8a6152b7ceb4df6bcdebb95e28d30f741179bc45 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 20 Mar 2022 20:42:19 +0100 Subject: [PATCH 033/197] Minor fix --- apps/lcars/lcars.app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 94159a74e..b00fe40b3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -244,6 +244,7 @@ function drawInfo(){ return; } + g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); From 8658582dd79cb60fba6080cae02b4d6835f08edb Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 10:44:53 +0100 Subject: [PATCH 034/197] Create My Denti --- apps/My Denti | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/My Denti diff --git a/apps/My Denti b/apps/My Denti new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/My Denti @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From e4077325f542cb0953ed1781cd2f61d9bd23f9fd Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:01:33 +0100 Subject: [PATCH 035/197] Create app-icon.js --- apps/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/app-icon.js diff --git a/apps/app-icon.js b/apps/app-icon.js new file mode 100644 index 000000000..0b121d700 --- /dev/null +++ b/apps/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("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")) From 1b9dbd58afb2c7978cd86b10b2644092f17ab27f Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:11:46 +0100 Subject: [PATCH 036/197] Create metadata.js --- apps/metadata.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/metadata.js diff --git a/apps/metadata.js b/apps/metadata.js new file mode 100644 index 000000000..198e44df2 --- /dev/null +++ b/apps/metadata.js @@ -0,0 +1,13 @@ +{ "id": "dentigrossi", + "name": "My app monitors the teeth brush", + "shortName":"Short Name", + "version":"0.01", + "description": "A detailed description of my great app", + "icon": "brush-teeth.png", + "tags": "", + "supports" : ["BANGLEJS1"], + "storage": [ + {"name":"denti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From 4723f2cb96d9c287297fe2fbcddae4800b68c84f Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:21:25 +0100 Subject: [PATCH 037/197] Create metadata.json --- apps/metadata.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/metadata.json diff --git a/apps/metadata.json b/apps/metadata.json new file mode 100644 index 000000000..198e44df2 --- /dev/null +++ b/apps/metadata.json @@ -0,0 +1,13 @@ +{ "id": "dentigrossi", + "name": "My app monitors the teeth brush", + "shortName":"Short Name", + "version":"0.01", + "description": "A detailed description of my great app", + "icon": "brush-teeth.png", + "tags": "", + "supports" : ["BANGLEJS1"], + "storage": [ + {"name":"denti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From fd01680ef995b1b9b5ed8d266ae9411a1d6e975d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 18:12:38 +0100 Subject: [PATCH 038/197] Addd 90s clk --- apps/90sclk/ChangeLog | 2 ++ apps/90sclk/README.md | 4 +++ apps/90sclk/app-icon.js | 1 + apps/90sclk/app.js | 72 +++++++++++++++++++++++++++++++++++++ apps/90sclk/app.png | Bin 0 -> 2446 bytes apps/90sclk/metadata.json | 16 +++++++++ apps/90sclk/screenshot.png | Bin 0 -> 2884 bytes 7 files changed, 95 insertions(+) create mode 100644 apps/90sclk/ChangeLog create mode 100644 apps/90sclk/README.md create mode 100644 apps/90sclk/app-icon.js create mode 100644 apps/90sclk/app.js create mode 100644 apps/90sclk/app.png create mode 100644 apps/90sclk/metadata.json create mode 100644 apps/90sclk/screenshot.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog new file mode 100644 index 000000000..8c2a33143 --- /dev/null +++ b/apps/90sclk/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Load widgets after setUI so widclk knows when to hide diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md new file mode 100644 index 000000000..470a27c6c --- /dev/null +++ b/apps/90sclk/README.md @@ -0,0 +1,4 @@ +# Wave Clock + +![](screenshot.png) + diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js new file mode 100644 index 000000000..00892e9c3 --- /dev/null +++ b/apps/90sclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js new file mode 100644 index 000000000..f1c67ce2f --- /dev/null +++ b/apps/90sclk/app.js @@ -0,0 +1,72 @@ +function getImg() { + return require("heatshrink").decompress(atob("2Ftge27dtAX4C/AUmgVoJB87UAgOi6EAhZB6wEbAweAlo+12kKgsAg3bvu+74MBIIPago+wfwIACgO3/f9/5BC4BBxtB9CBIe+/d9B4fYi3QIN3QgA+EYQP+/YSFRwJBtYQMbHYS/C9//IIoFCgBBsgE2/fv+/fvu+79vQwIPDizIEINVAhu/PoP3/ft+zFBIIkBwEDt4FBINXQgd//4AD94MC3zFF4F9+yDD0FbIMm0gH7HwXt/zCBCQ4IB7Ft+3AA4NogFQgECIMUB3xAC/d9/37/v3CQzLB7EN33AHYNAsFQ7cAQ0Noh7BDQwf/+7CF7bUB/cNZANi7dDsEA4BBh7UDF4P/9+/7YCB7/9QwIVG33fHYMDAQMbtkmwrCg23Qj58CIgPbHwP/vv2CQcAgAFCJQOEPYO0BAXFIMG0g7CDv++Aofv+37O4PaIIObDAPfDYXtAQNsg3AIMGgn46BXgLCB/f/337QwKACjACBjYbEIgYLBgpBggJ8CYoX3/d9B4fYGQIACIIm37/vBwMW7UtIL9ov4/C+/fYoL4BIKAOC23aQYVFILlDIAS8B79vBgW0qa2EII5QHA4NAILfQj7DD/379oMBtgsBB4JAEgEQhohHsEmIgNaIgRBZwBADYoIMDIIQ4BIIoICc5UA4BBa2kPIAf9+wMEwEAgO24BBRLIOAixBZ0E/II+wjEN2BBJpu2jYhF96VBsEAgdCILMBYghBCNAMDgJBCwBBGDYMDII32BgNbocCILFoj5AD/ftBIJoCHARBKAQP+7YHB7f/+3ADgNAYrNAIAf3IIoAMaIVt33bi3Qjd///YHzICB7UH//+IIP+/dtF4IARIIfagdvRILCZAQPQQQf/BINsICUAsO+7R9Bodv+5Bcw4+B3xBDYRwAEgcAm3ADIJBB/6JBILO0YgP/+//v4JBQSYACgpBg0N/YoxBWlpBCv/2DoMLILEPHwX+QbI4DoYgB7dsILFoUIP7/pBD7BBVrZBD9/27KDZoXvIIKFCIIsB2BAPgQjC7UDvu24u0JQYCT7UfHoPfv6DB97FEhpBQiwjBi3ajft20tQCwCB6E//+3IIO+/ZBEgdtIIUwIBcFEYQFBjYnBILOAQQP3YoO/IgIMBtEAzYPBZAICBABQ4DIIiMDIKm0h5BEYoN/+wPC/f9AoTILgIjD0BBBsE27ZBX0F/IILCBAQXv//ftoFB/v+CQOAIJ7pBjdsgnZIK8DIAP9QYQ+BvoFBBAIFB/37IJkLEwnaIIIKBHygCBpEfHgPvIIf/t+3AgQ+BRIRBBhhBIrZBFBAKAWDQKCC/Y7B7Z6B75BD/3Ctu37/tIIK3CIAsCHC4CI6CCC7dv237vu+AoRHB+0AVoKSB2EbvuwQQz7XAROBXIR9C/ftBgX2B4UCkEwn/vDAZBn2kPXIT4B2wCCQYK/BhGA6ENQAJBE4FtIIiAeAQMAv///v2HwX7B4tsg3bhuAgA+ChqDBBARBitCCC/v+/d9CRPf9/wjEB20DgOwYgsFIL3aQQX/vu+Bgn2Qwm3/ZQB7dh20boJBGlpBewEfv/+YQJBEt++/ftIIffCIP7IIPb8BAFIL+0gyBBF4Pv+xBEHYNvAoN9+4RBAALLCtkG4BBLyxBWgM/IIf9+4SIQAO/RIIRBRIX9+xBK5oECRifagEN/xBB253BYogCFQwPfvqSD/dgg3bhhACgIWDzYbEQyWAj5xB//vHwL+DARXtwEbAoPYgBBBtuAIItuOA1bIJ+gg7yDVoIPHRgIFDw3btkAgQ+BYQXYgJBGmwhGpZBPgP3/f9AQKAB/d9II3fAoY1CAAZBCAQRBE7IxIIJ9v+//v++IIICBQwxBBJQUNIKPNGJGtIJzDD/3/HAP79/3B4dvRgP9AoMMIAsAjDFCIIwxJ2pBOv7CB/6ABt++74ICB4PDvv27/92HDII5EFIIezGhQGGwMAgRBF33/94+Btu+PoO/AoIPBjuGj6DCthBJAAhBB3ZBKywDC7QVCjUgTYQLB97EBGQI7C7EPQYN9B4Mfw3D/+0rdgIKC4L6wDB2kAgb4D2EFB4R6CHAK/C4EPZYIfCh5BC+0bILvaAYMgg3ft5BB9o1BB4Vt+wIC7dggwlB+wcC7Ftg3Yv+2IKEAl3btJBLtENXIPv+68Bw3YixBCPQgyCgO2TAIIBgE27cBwAODIKObtobBI4narUAv5BEvgYBIIZYEVIewgBkG0xBRk3bpum6ZBBzZBB7QtDjd9/z7B2/ftgYBYoZBHAAVtwypGDQQANg3TtJBBtO0HwM2I4XQg3b9/+XIT+B2EtII/YE4sMwEbIJM24BBKgnTps0IIubpu0gLNBEwn7/u24pBGX4IAHgcNZAuAagJWHAAuatM07SGDAQNNwAjFMoJuCIIvDIJSvCCQP2EAWIUge2JAIAHiaDB3Q+ByfN02atEDF4RECIIMYU4JBHFBIAC7dvQwu379tizIJgZBBz1Nmuarsmzx6CUIfbsDpDgpBE7BBOtv3IIvbBYJBJgA+Dk+S9Nm2CkBPoJBBwGbIIW2wxBGhgLBhugYpW//fvQwhBMhM1HwNl6XLkp3BC4QACjZBBHwPQlpBE7dAB4KGJIINv3//voUBZYPaTJYABk2yrtk3VZNYJxBCI4+DIIaPBAwMbTAQAGmEDvv//6DB/f/+xrFABOXpcs61AgYsBB48BHwZBDwxWCAwKDIgBBC7/v2//v5BQgVJsglBFJRBJ4EBIJtv+6ABZAPv+3AIJwADmzCDggLFhZBHw/bsJBNtv279///79u26BBSABZBHgEO/ZBB79t2BBK20D9//7dggyDTABdbII19+/bhO2/YJBOJBBBJoN9/w+Hgy2DACcFII3aFgP2gdN23/QwIpJhuwgdsmwLGgO379gQbm0A4JxBjdt+/fIJcB2ECsBBHh//AALgJAA8KAYUoIIoPE7dv35BOAYJBHv5BC+zIUIItABIVoAwNv/37IIPbBAMAgWAD48G4AGEgfvIIX/ZCWgAYULIIPaBYZIC9/3/cNSAR6BIJIAGjf/cAJCC/hBUgNt2gLEtu3798I4lsVSXf9/27f9IIP9LJ4AMtv2nf8m/TIIQcT/f9IIKhBIQJBPgoMLt+wnf9w7CBIKkH/99cYW+I4LgBILT+B49twxBC7BBSm//9pBB9qGBv/2ILmG4EAmyDVgO//9v23fDQV9/wjBIJ8oIJIgBAQyqPgEN//fvu3DQdv/zjTIKOADR9v35BBDQv//dsIDEbII8DsC3DoAaKgd9+44BcAltZwIFBgFhAQIASgyAYLgXv+/bhodF2//9+379/23AEiMBEYJBNlAcKGQRBE24gC///+4CC7BAQgdvHwfftv24ENQaMG/fvIJPf//+IIO+/YjUtkA7ftcCk2/YXBIIm/EAXbv4+B9u//dgERsN33/9uAgZBB7AmBICUBfALdChqACdIv2BwO///8PQzOChdjTwffHwMAhkAjEB23AIKNt3wyB0AFBYQYCH2///uwDYk3DQP3a4X7vrCDAAUYWAJTCAB0DPQewjY1B4ChCMQPbEYPbF4P/v/+BAKeC/y8BX4ILDgwjCSpAAOjd9+3bsO2I4O24YjDMQRBDO4P//YOBPQIFB9q/B/v2GoQgCX6RTE75BCsE2HwSGBIIRiCkxBC7d/IQN/+/79++I4LXDO4sDICkBMQIvB4ZBDFISnDFgKwBIIVt//f9v2HwO+BAMAgQaCgFAgoaB/ZBUtv+/fsm2AGoJBEA4IABjCDCt4LC2/7XgJ9CTwJlCIIQAB0EH/5ATjdv+/btkGjYCBIJUgZwK2BXghBGAAKJCI4LXBBYgABhRAKWAP9III4BGQOGGoXb9pBFKwILB4ENfwgFCGoWggEDCIUPIIJiEABieB/fvNYuAAoXfEAkDAQQvCXIVt2AKBmxBBgNAigrDgfv//fA")); +} +var IMAGEWIDTH = 176; +var IMAGEHEIGHT = 109; + +Graphics.prototype.setFontZCOOL = function() { +// Actual height 40 (46 - 7) +var widths = atob("CxAhEh8hJCIjGSMdCw=="); +var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); +var scale = 1; // size multiplier for this font +g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); +}; + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +function draw() { + var x = g.getWidth()/2; + var y = 24+20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); + if (g.getWidth() == IMAGEWIDTH) + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); + else { + let scale = g.getWidth()/IMAGEWIDTH; + y *= scale; + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); + } + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date,1); + var dateStr = require("locale").date(date).toUpperCase(); + // draw time + g.setFontAlign(0,0).setFont("ZCOOL"); + g.drawString(timeStr,x,y); + // draw date + y += 35; + g.setFontAlign(0,0,1).setFont("6x8"); + g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ff43bb10655c67224603dec35559aac7b98fc560 GIT binary patch literal 2446 zcmV;9332v`P)R}BKQ(n^v* zNlPWs(#8iqu)2gPKG5649J%=-(`#LGBn8U{f{+LJozMN_aO@m;duQ(SM{D*UzqR+; zYkz-huf6tK+l0^`iQM!Dqdx)t3Fr?3$n<{$)J*z8n&@EfldMumHL=!`A>EMNs|`Ib zAz2!X2vKXZfB`@n2wGD`)173@unvH|j?w0>N`OU9-&3h;MNzwj9+j+8x^!GJq)4ey zdQU2F6?;*dDh-rINhaw#>AKXxG1^D6NpCyJ8+UD?`(ZE$PQY5|4ZT2605e=Ayqvwu> zCI8EoNsncZs8uwm%4$VJ&b}R=<6idVt&#Tuc!p`;zlWNG@uM^XuI&u9TnwS033t_ z5Cl5ip-N5F`t`mkDUo3LEZeGEh#ckAr8ypYHxkgd${m!P{#|L&CAb2UAQLj-D~NNI z?FZ>FVBbEk)vML9(^@U-F=vg>_z_Lxrp{7S&H7)3<&6Opj%;To zgu_7a10^MEWt2dxSG#!Vp)c&Sn?Ogqny(K&HGGl(w1r!`eD<;5kxEtGxzJx>Tmt~v zWD6b?=>S7HGy@ri-hW@8eyTltBx&bPO?ACyH^u3Ao__t+2V}FU@Pe?#fR-e+U%26+ z;GO}GbiX^Nwmly7BybXdIWW{Pl#-%xa%^1ycKhGa-zN-_*xz9yOE;h{x~WHQxRhL~g+*GsPqFAtUUbN73%YNh|!lWqgrs;!N_k;cM9PJl{PI-<$w z*rKaH!cu7ODml@SZ+SvAY=@5_`0{0eJKVP@w$?1vRDs2c#fp=)YHp7FP9-WH>N6@d zJLhva1xuhm_&7XC^6BFCR))|GiScct$VOquv)0_ zBp|gxm+P8SXTE}CkOD8mAXo;kI~6v*Fb(4EJs*CkPMzfEXZI9I8ZbbTA|jkhk5~lD zt0mrscsII!KyN`F9E9HB3%#J}%9Y0;$!?qC;`k-+=;%>Et5#|A=9-SUN#5SKx!3d> zNzc~0;NxkC13LdmpI0AF-aRaJP5<2OPj5V#sKhEj_dpkDV;7%0R~CyT-=jwr7pJ1D zx_D6;@5pMj{bZ|ley)!`szOkAHGH-?pNVX7Q~W9l#dT3Aie>!MYi6G{W6zzu2x+hs zPJu#0yZ0Jjr0WO?WVH%3V}?9DoU(2=si)@7QD&yf%PqJ6acCd4>Ff?|CrnV!2W74y zv}TPF&xp0nSS=PbW3xXQGG=*XeBh~s#X9+&PM@yQ79KwIryq5*D8~EsDhtVGQ~r5n z@05p!9tl;je+|EU;er<&hA{8~59kCs@{J@}JZm)4wsxwV@g&1uC1gIKFI5IT5zt|X zKx3b(k_eRc?3Xl8ar?D*w|Sof(6M7mOV!`PRaPcYU|_WZ#Z5s$Q{fQgz7eNm z^;~6c<`wSuCd$-&V2Hl{T9J`*lN9VMGg2e(bn4j!1!1R7D|3{f+v(H#xlq9^?$qt) zXDTXE$BvId?Af!HfBcgUGns7>@%8|yt0&a8_Is|AFa_+)((Anum@y- zf8yH$?MYX3s-*E6|NCqoA4&4@)`A5tS|cJV;R*oDa&to?BkRS{R&DK?TdCE2%}4Cg zuDJ zLWUtwMTNfqUel&I3f$TYH-G=hkPX2lC4(J45Cj=u8Z)LUGPP<|Q;lji%Ph%H)u0Ck zN`_%F40ljvr3^z|yE+R5yZWHhD`)Eo@VOmFe!d+|D43xqoPspSg)LwnF`|A;TP#gS zkAC6Wwfie8rTBQ$EZG4p6rS=sQiG82S@xnDnddg^x&{rb5C##*R-R@OWS2Ib@^ zeT!031Rj~0!tpkim#5|}bzu8Yn@!LI&cHXYw6O5WbLU20yS5rSLCcJdffTd@B_{_< z{R1YcPp=j+G1AjdyEumYYX;)&?Y3@RG|YjPpapYvB2SM#sv}4255}#JA9r&0cIxJ% zn>YPHVPUdbTR<24-JF&tP(nf{`35OK1B3M53e9{>4|M(@=c`}fzb(4C5nw3;yZ`_I M07*qoM6N<$g2mI7k^lez literal 0 HcmV?d00001 diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json new file mode 100644 index 000000000..3d96bf844 --- /dev/null +++ b/apps/90sclk/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "90sclk", + "name": "90s Clock", + "version": "0.02", + "description": "A clock in 90s style", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"90sclk.app.js","url":"app.js"}, + {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/90sclk/screenshot.png b/apps/90sclk/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7f05ce68880935db0de4aaf840077e9b30413db7 GIT binary patch literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:16:23 +0100 Subject: [PATCH 039/197] Finished 90s clock --- apps/90sclk/ChangeLog | 3 +- apps/90sclk/README.md | 2 +- apps/90sclk/app-icon.js | 2 +- apps/90sclk/app.js | 100 ++++++++++++++++++++++++------------- apps/90sclk/app.png | Bin 2446 -> 4238 bytes apps/90sclk/bg.png | Bin 0 -> 37016 bytes apps/90sclk/metadata.json | 4 +- apps/90sclk/screenshot.png | Bin 2884 -> 6093 bytes 8 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 apps/90sclk/bg.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 8c2a33143..2286a7f70 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1,2 +1 @@ -0.01: New App! -0.02: Load widgets after setUI so widclk knows when to hide +0.01: New App! \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 470a27c6c..55fe21ce6 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,4 @@ -# Wave Clock +# 90s Clock ![](screenshot.png) diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js index 00892e9c3..28f75c4e6 100644 --- a/apps/90sclk/app-icon.js +++ b/apps/90sclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index f1c67ce2f..02a35e69f 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,17 +1,24 @@ -function getImg() { - return require("heatshrink").decompress(atob("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")); -} -var IMAGEWIDTH = 176; -var IMAGEHEIGHT = 109; +const locale = require('locale'); -Graphics.prototype.setFontZCOOL = function() { -// Actual height 40 (46 - 7) -var widths = atob("CxAhEh8hJCIjGSMdCw=="); -var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); -var scale = 1; // size multiplier for this font -g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); + +function getImg() { + return require("heatshrink").decompress(atob("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")); +} + +Graphics.prototype.setFontTime = function(scale) { + // Actual height 54 (56 - 3) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAPwAAAAAAAA/gAAAAAAAF/AAAAAAAA/8AAAAAAAD/wAAAAAAAP/AAAAAAAA/wAAAAAAAB/AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAB+AAAAAAAAf4AAAAAAAH/wAAAAAAB//AAAAAAAf/+AAAAAAH//8AAAAAB///wAAAAAf///gAAAAH///+AAAAB////4AAAAf///+AAAAH////gAAAB////8AAAA/////AAAAP////wAAAD////8AAAA/////AAAAP////gAAAD////4AAAA////+AAAAD////gAAAAP///4AAAAAf//+AAAAAB///gAAAAAD//4AAAAAAP/+AAAAAAAf/gAAAAAAB/wAAAAAAAH8AAAAAAAAPAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAf/wAAAAAAH//gAAAAAD///gAAAAAf///AAAAAB///+AAAAgP///8AAAHg////wAAAfn////gAAD/t////AAAP/j///8AAA//D///4AAH//D///gAAf//H//+AAB///H//4AAH//+P//gAAP//+P/+AAA///8f/4AAD///8f/gAAP///8f+AAAf///8/wAAB////w/AAAD////A4AAAH///4BgAAAP///gAAAAAf//8AAAAAA///AAAAAAA//wAAAAAAA/+AAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAD+AAAAAAAAP4AAAAAAAB/gAAAAAAAP+AAAAAAAA/5//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+Af7//////4A/v//////gA+//////+AA7///hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAD/4AAfwAAAf/gAD/AAAH/+AA/8AAA//4AH/wAAP//gA//AAD//+AH/8AA///4Af/wAP///gD//AD///+AP/8Af///4A//wH////gD//B////+AP/8f//7/4A//3///P/gD/////w/+AP////8D/4A/////AP/gD////4A/+AP///+AD/4Af///gAH/gB///4AAf/AD///AAB/8AH//wAAH/wAP/8AAAf/AAf/gAAB/4AA/4AAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wB/+AAAAAAAAAB/4A//8A////////wH////////Af///////8A////////wD///+////AP///7///8A////P///wB///8f//+AH///h///4AP//+D///AAf//wH//4AA//+AP//AAB//wAf/4AAD/+AAf/AAAD/gAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAH//AAAAAAA//+AAAAAAP//8AAAAAB///4AAAAAP///wAAAAA////gAAAAH////AAAAA////8AAAAD////4AAAAf////j//gB////+//+AP///////4A////////gD///////+Af///////4B////////gH///////+Af///////gB//////AAAH8AAAHAAAAAAA//wAAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AB/AAf///+AP/+B////4A//4H////AD//gf///8AP/+B////4A//4H////gD//gf/////+AAAAAAAP///wP//gA////A//+AD///8D//4AP///wP//gAf//+A//+AB///4D//4AD///gAB/gAH//8AAAAAAP//gAAAAAAf/8AAAAAAA//gAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAP/8AAAAAAB//8AAAAAAf//8AAAAAD///4AAAAAf///wAAAAD////wAAAAf////AAAAD////+AAAAP////8AAAB/////wAAAP/////gAAA/////+AAAH/////8AAAf/////wAAB//////gAAP/////+AAA//////4AAD//////gAAP/////+AAA//////4AAD//////gAAP//////AAA//////8AAAAf////wAAAAAAP//gAAAAB///+AAAAAH///4AAAAAf///gAAAAB///+AAAAAH///wAAAAAf///AAAAAA///8AAAAAD///gAAAAAH//+AAAAAAP//wAAAAAAf/+AAAAAAA//wAAAAAAB/+AAAAAAAB/gAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAA//AAAAAAAAAAAAAAAAwAAP//////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAD/gAH//AAA//gA//+AAP//AH//8AB//+A///4AP//8H///wA///4f///AH///j///+Af///P///4D///9////wP////////A////////8D////////wP///3///+AAAAAAAAAAB/wAAAAAAAP///x4AAAA////P///4D///8////gH///z///+Af///H///4B///8f///gD///g///8AH//8D///wAf//wH//+AA//+AP//wAA//gA//+AAA/4AA//gAAAEAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAH/8AAAAAAB//8AAAAAAP//4AAAAAB///wAAAAAP///gAAAAB////AAAAAP///8AAAAA////4AAAAH////gAAAAf////AAAAD////8AAAAP////wAAAA/////AAAAD////8AAAAH////wAAAAAAAAAAAAAD///+AAAAAP///////AA///////8AD///////wAP///////AA///////8AB///////wAH//////+AAf//////4AA///////gAD//////8AAH//////wAAf/////+AAA//////4AAB//////AAAH/////4AAAP/////AAAAf////4AAAA////+AAAAB////wAAAAB///8AAAAAB///AAAAAAB//wAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AB8AAAAAH8AP4AAAAA/4B/wAAAAH/gO/AAAAAf+A/8AAAAB/4D/wAAAAH/AP/AAAAAP4AfwAAAAAfAA+AAAAAAQAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("FionHyIiJiIyJScyFA=="), 58+(scale<<8)+(1<<16)); + return this; }; + +Graphics.prototype.setFontDate = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wf///B///8H///wf//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAfwAAB+AAAAAAAAfwAAB/AAAH8AAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAADg8AAfH+AB//4A///gD//+AP//AA/w/gBPf+AB//4A///wB//8AH//AAfw8AAPDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAD4AAAfwAAD/h4B/+HwH/4/Af//+AP5/4A/n/gB8f8ADg/gAAD8AAADgAAAAAAAAAAAAAAAAAAAAAAAAB8AAAP4CAB/gcAH+D4Af4/wB/n+AH9/wAHv+AAB/wAAf8AAD/gAA/54AH/PwAf5/gB+H+ADw/4AEB/gAAH8AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAP4AB9/wAP//gB///AP//8A///4D///gH//+Af3/wAfP/AAAf8AAB/gAAP/AAB/8AAP/wAAfOAAAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAP4AAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBgAH///g////n////f///9/////8AB/fgAH8AAAPAAAAAAAAAAAAAAAAAAAAAAD9/AAf38AB/f///9////z///+H///wP//8AAAAAAAAAAAAAAAAAAAAAAAAFAAAA+AAAH8AAAfwAAB/AAAD8AAAEAAAAAAAAAAAAAAAAAAAAAAAAfAAAB8AAAHwAAAfAAA//wAD//AAP/8AA//wAD//AAAfAAAB8AAAHwAAAfAAAAAAAAAAAAAAAAAAAAAAABkAAAPwAAA/AAAB4AAACAAAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAAAAAAAAAAAAAAAAAAAAACAAAAeAAAD4AAAPgAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAPAAAD+AAA/4AAP/wAD//AB//wAf/8AH//AB//wAf/8AA//AAD/wAAH8AAAeAAAAgAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/4AEP/wAd//gD9//AP9/8A/9/wD/7/AP/78Af/7wA//CAB/8AAD/AAADwAAAAAAAAAAAAAAAAAAAABwAAAPAAAB8AAAH3//+ff//59///n3//+Pf//4d///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAD8B4AfwfgH/B+A/8P4P/w/j//D+//8P//vw//4/D/+B8H/gHwf8AfAfAA8AAAAAAAAAAAAAAfgAPx/AB/H8AH8fwAPwH/f/H///8f///x/+//H/7/8P/H/gf8P8A/APgAAAAAAAAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//gAD//AAf/9/h///+H///4f///h//8AAD/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAf/4PB//g/n/+D+f/4P5/gf/n/B/+f8H/5/wP/AAAf4AAA/AAAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/8AAf/4AD//wAP//gB//+AH//8A///wD///AP//8A///wAAP/AAD/+AAH/4AAf/AAB/8AAD/gAAH+AAAPgAAAAAAAAAAAAAAAAAAAAeAAD/4AAP/gAA/+AAB/4AAAAAM+f///5////n///+f///5////n///+f5AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AP4H+B/w/8P/n/4////n///+f///4AAAAH/9/+P///4/+f/j/5/+H/D/wH4H+AAAHgAAAAAAAAAAAAAAAAAAAA/AAAP/AAB/+AAP/4AA//wAH//AAf/8AB//wAH///wf///B///8H///wP//+A///4B///gD//8AP//gAP/4AAf+AAAPAAAAAAAAAAAAAAAAAAAAAAGAwAA8HgAH4+AAfD4AA4HAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAB4+AAPn4AA+PgABwcAAAAAAAAAAAAAAAAAAAAABgAAAOAAAB8AAAf4AAD/wAAf/AAD/+AAfz8AA8HwADgfgAEA+AAABgAAAAAAAAAAAAAAAAAAAAHj4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHj4AAAAAAAAAAAAAAAAAAAAAAAAAAAYAAQDwADgfgAfD8AB/fgAD/8AAH/wAAP+AAAfwAAA+AAABwAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAf8AAD/wAAf/gAB/+AAH/4AgA//3B///cH//9wf//3A//8YD/+AAH/4AAP+AAAPgAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//wAH8fgAfu+AAf98AOf7wA///ADn/8AO//wA///AD//YAP/8AA/gMAB//wAD//AAH/4AAP/AAAPwAAAAAAAAAAAAAAAAAAAAP///h///+P///5////n///+f//AB+D8AH///+f///4////h///+B///4AAAAAAAAAAAAAAAAAAAAAAAf///j////P///8////z////P///8////z///AP///+f///5////D/5/8H/H/gPwH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAA//gAH//AA//+AH//8A///4D///gf///B///8H///wf///B/gH8H+Afwf4B/BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//8A////D///8P///w////B///8H///gP//+A///wB//+AD//wAD/8AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////n///+f///5////n///+f///5////n/fP+f9+/5/37/n/AP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAf///5////n///+f///5////n///+f///5/z8AH/PwAf8AAAAAAAAAAAAAAAAAAAAAAA/gAAP/wAD//wAf//gD///Af//+B///4P///w////H///8f///x////H///8f4H/x/gf/D+B/8AAHAAAAcAAABwAAAHAAAAAAAAAAAAAAAAAAAAAAABgH///gf//+B///4H///gf//+B///4AB+AAf/9+B///4H///gf//+B///4H///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8P///w////D///8P///w////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAfAAAB+AAAH4AAAfgAAB+f///5////n///+f///x///8AAAAAAAAAAAAAAAAAAAAAAAAAAANH///8f///x////H///8f///x////H//+AAH/8AA//4AH//wA///gD//+Af//8B///wH///Af//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX5////n///+f///5////v///+////5//7/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAvh///+P///5////n///+f///5/wAAD+AAAP8AAAfwAAD/AAAP4AAB////n///+f///5////j///+H///4AAAAAAAAAAAAAAAAAAAAAAAH///gf//+B///4H///gf//+B///4B//4AB//4B///4H///gf//+B///4H///gf//+B///4AAAAAAAAAAAAAAAD/AAA//gAH//AA//+AH//8Af//wD///gf//+B///8H///wf///B/z/8H//wAf///B///8H///wf///A///8D///gH//8AP//wAf/+AA//gAA/4AAAAAAAAAAAAAAAAAA/x////H///8f///x////H///8f///x//gAH/+AAf/4AA//gAB/8AAD/gAAH8AAAAAAAAAAAAAAAAAAAAAAAcAAAP8AAD/8AA//8AH//4Af//wD///AP//+B///4H///wf///B///8H//+Af///B///8H///wf///A///8D///gH//+Af//4A///gB//+AB//4AB/PgAAAYAAAAAAAAAAAAAAAAAAAP///5////n///+f///5////n///+P///4////D///+P///4////h/9/+D/gAAD4AAAAAAAAAAAAAAAAAAAAAAAAAADwAAA/wAAH/gAA//AfH/8D8f/4f5////n+P/+f4P/5/g//j8D/8DgH/wAAP8AAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAfAAAB8//8H///wf///B///8H///wf//AB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAB///8H///8f///5////n///+AAAH5////n///+f///x////H///wf/gAAAAAAAAAAAAAAAAQAAAD8AAAP/AAA//wAH//8Af//+B////gf//+AP//4AP//gP//+P///5////n///gP//gA//AAD/gAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+D///8P///4////j///+PAAfwAAB/AAAH4AAAfw////j//++P//74///vj///8AAB7AAAAAAAAAAAAAAAAAAAAAAAAAAABgeAA+B/AP8P/n/w////j///+H///gH//4D///8P///4////h/4/8H8AfwPAAOAgAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHwAAAfgAAB/AAAH8H/wf///B///8H///wf///B///8H/8cAfwAAB+AAAHwAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABwAAAHAAD8cAD/xwD//HH//+f///5////n///+P//w4f/wDh/gAOHgAA4AAADgAAAOAAAAAAAAAAAAAA///+////////////////////////+AAA/wAAD/gAAP+AAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA/AAAD/AAAf/AAB//gAD//gAD//gAD//gAD//gAD//gAD//AAD/4AAB/AAAB8AAABgAAAAAAAAAAAAAAAAAAOAAAe4AAB7gAAHuAAAe////7////v///+////7////v///YwAAAAAAAA="), 32, atob("HA4NFhEaFwoNDQsRCRALFBMPEBESEBgSExgKCRARERIXEhQVExEPGBMOERYRFhQaExwUExARFRYTFhMPFA4="), 28+(scale<<8)+(1<<16)); + return this; +} + + // timeout used to update every minute var drawTimeout; @@ -25,35 +32,49 @@ function queueDraw() { } -function draw() { - var x = g.getWidth()/2; - var y = 24+20; - - g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); - if (g.getWidth() == IMAGEWIDTH) - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - else { - let scale = g.getWidth()/IMAGEWIDTH; - y *= scale; - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); +function drawBorderString(str, x, y, bw, fc){ + g.setColor("#000"); + for(var i=-bw; i{};wd.area="";} + var x = g.getWidth()/2; + var y = g.getHeight()/2-20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); + g.drawImage(getImg(),0,0); + var date = new Date(); - var timeStr = require("locale").time(date,1); - var dateStr = require("locale").date(date).toUpperCase(); - // draw time - g.setFontAlign(0,0).setFont("ZCOOL"); - g.drawString(timeStr,x,y); - // draw date - y += 35; - g.setFontAlign(0,0,1).setFont("6x8"); - g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + var timeStr = locale.time(date,1); + g.setFontAlign(0,0); + g.setFontTime(); + drawBorderString(timeStr, x, y, 5, "#fff"); + + y += 50; + x = x - g.stringWidth(timeStr) / 2 + 5; + g.setFontDate(); + g.setFontAlign(-1,0); + var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + fc = E.getBattery() < 50 ? "#f00" : fc; + drawBorderString(dateStr, x, y, 3, fc); + // queue draw in one minute queueDraw(); } +Bangle.loadWidgets(); + // Clear the screen once, at startup -g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on @@ -65,8 +86,15 @@ Bangle.on('lcdPower',on=>{ drawTimeout = undefined; } }); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png index ff43bb10655c67224603dec35559aac7b98fc560..29875b1dceaa209aa7aaad86d60402290ee0f9cc 100644 GIT binary patch literal 4238 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 M07*qoM6N<$g2mI7k^lez diff --git a/apps/90sclk/bg.png b/apps/90sclk/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebf755ad53d9a2f452b8fb2be6f19589986f318 GIT binary patch literal 37016 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 literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:18:42 +0100 Subject: [PATCH 040/197] Fixed lcars --- apps/lcars/lcars.app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 77321f19c..357070fdc 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -618,6 +618,8 @@ function increaseAlarm(){ } else { settings.alarm = getCurrentTimeInMinutes() + 5; } +} + function feedback(){ Bangle.buzz(40, 0.3); From d93646abd7f9dcdded6e6351d6b50f9a7f9c41d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 21:36:15 +0100 Subject: [PATCH 041/197] Show steps. Performance improvement --- apps/90sclk/app.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 02a35e69f..76676b49a 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -32,32 +32,49 @@ function queueDraw() { } -function drawBorderString(str, x, y, bw, fc){ +function drawBorderString(str, x, y, b, fc){ g.setColor("#000"); - for(var i=-bw; i{};wd.area="";} - var x = g.getWidth()/2; + var x = g.getWidth()/2-5; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); + // Draw time var date = new Date(); var timeStr = locale.time(date,1); g.setFontAlign(0,0); g.setFontTime(); drawBorderString(timeStr, x, y, 5, "#fff"); + // Draw date y += 50; x = x - g.stringWidth(timeStr) / 2 + 5; g.setFontDate(); @@ -67,6 +84,11 @@ function draw() { fc = E.getBattery() < 50 ? "#f00" : fc; drawBorderString(dateStr, x, y, 3, fc); + // Draw steps + g.setFontAlign(1,1); + var steps = parseInt(getSteps() / 1000); + drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // queue draw in one minute queueDraw(); } From 034026019ad845fd59ad274d8f7465358c3ec507 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:07:29 +0100 Subject: [PATCH 042/197] Minor changes --- apps/90sclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 76676b49a..750a129b6 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -61,7 +61,7 @@ function getSteps() { function draw() { for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - var x = g.getWidth()/2-5; + var x = g.getWidth()/2; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); From 12678604206308f03c97f2022619c75e9c1fe606 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:14:30 +0100 Subject: [PATCH 043/197] Added settings for fullscreen mode --- apps/90sclk/ChangeLog | 3 ++- apps/90sclk/README.md | 9 +++++++++ apps/90sclk/app.js | 28 +++++++++++++++++++++++++--- apps/90sclk/metadata.json | 8 +++++--- apps/90sclk/settings.js | 31 +++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 apps/90sclk/settings.js diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 2286a7f70..feb008f5f 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Fullscreen settings. \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 55fe21ce6..6f820886a 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,13 @@ # 90s Clock +A watch face in 90s style: + ![](screenshot.png) + +# Settings +In the settings you can enable / disable the fullscreen mode. + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 750a129b6..367d77502 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,4 +1,19 @@ +const SETTINGS_FILE = "90sclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: false, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} function getImg() { @@ -60,9 +75,9 @@ function getSteps() { function draw() { - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} var x = g.getWidth()/2; - var y = g.getHeight()/2-20; + var y_offset = settings.fullscreen ? 0 : 10; + var y = g.getHeight()/2-20 + y_offset; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); @@ -89,6 +104,13 @@ function draw() { var steps = parseInt(getSteps() / 1000); drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } + // queue draw in one minute queueDraw(); } @@ -96,7 +118,7 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index f3cf33eae..95ef96ccf 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -1,8 +1,9 @@ { "id": "90sclk", "name": "90s Clock", - "version": "0.01", - "description": "A clock in 90s style", + "version": "0.02", + "description": "A 90s style watch-face", + "readme": "README.md", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", @@ -11,6 +12,7 @@ "allow_emulator": true, "storage": [ {"name":"90sclk.app.js","url":"app.js"}, - {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + {"name":"90sclk.img","url":"app-icon.js","evaluate":true}, + {"name":"90sclk.settings.js","url":"settings.js"} ] } diff --git a/apps/90sclk/settings.js b/apps/90sclk/settings.js new file mode 100644 index 000000000..8f97cd317 --- /dev/null +++ b/apps/90sclk/settings.js @@ -0,0 +1,31 @@ +(function(back) { + const SETTINGS_FILE = "90sclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + fullscreen: false, + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + + E.showMenu({ + '': { 'title': '90s Clock' }, + '< Back': back, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From c32040c3118b47079689c26f497621e2b488e0f5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:19:18 +0100 Subject: [PATCH 044/197] Minor changes --- apps/90sclk/README.md | 8 ++++---- apps/90sclk/metadata.json | 2 +- apps/90sclk/screenshot_2.png | Bin 0 -> 5412 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 apps/90sclk/screenshot_2.png diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 6f820886a..c09c6fe23 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -2,12 +2,12 @@ A watch face in 90s style: +![](screenshot_2.png) + +Fullscreen mode can be enabled in the settings: + ![](screenshot.png) -# Settings -In the settings you can enable / disable the fullscreen mode. - - ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index 95ef96ccf..fb2824a6f 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -5,7 +5,7 @@ "description": "A 90s style watch-face", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], diff --git a/apps/90sclk/screenshot_2.png b/apps/90sclk/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9646b11683a95eee86a16dba9344cae669ed8996 GIT binary patch literal 5412 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 Date: Fri, 25 Mar 2022 17:22:39 +0100 Subject: [PATCH 045/197] Add black and white clock --- apps/bwclk/ChangeLog | 1 + apps/bwclk/README.md | 7 +++ apps/bwclk/app-icon.js | 1 + apps/bwclk/app.js | 97 ++++++++++++++++++++++++++++++++++++++ apps/bwclk/app.png | Bin 0 -> 4238 bytes apps/bwclk/metadata.json | 17 +++++++ apps/bwclk/screenshot.png | Bin 0 -> 6093 bytes 7 files changed, 123 insertions(+) create mode 100644 apps/bwclk/ChangeLog create mode 100644 apps/bwclk/README.md create mode 100644 apps/bwclk/app-icon.js create mode 100644 apps/bwclk/app.js create mode 100644 apps/bwclk/app.png create mode 100644 apps/bwclk/metadata.json create mode 100644 apps/bwclk/screenshot.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/bwclk/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md new file mode 100644 index 000000000..49ee7f593 --- /dev/null +++ b/apps/bwclk/README.md @@ -0,0 +1,7 @@ +# Black & White clock + +![](screenshot.png) + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js new file mode 100644 index 000000000..28f75c4e6 --- /dev/null +++ b/apps/bwclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js new file mode 100644 index 000000000..709597a0b --- /dev/null +++ b/apps/bwclk/app.js @@ -0,0 +1,97 @@ +const locale = require('locale'); + + +// timeout used to update every minute +var W = g.getWidth(); +var H = g.getHeight(); +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + + +function getSteps() { + try{ + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } else if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom.getSteps(); + } + } catch(ex) { + // In case we failed, we can only show 0 steps. + } + + return 0; +} + + +function draw() { + // Hide widgets + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + + // Clear old watch face + var x = W/2; + var y = H/2-20; + g.reset().clearRect(0,0,W,W); + + // Draw background + g.setColor("#000"); + g.fillRect(0,0,W/2,H/2); + g.setColor("#fff"); + g.fillRect(W/2,H/2,W/2,H/2); + + // // Draw time + // var date = new Date(); + // var timeStr = locale.time(date,1); + // g.setFontAlign(0,0); + // g.setFontTime(); + // g.drawString(timeStr, x, y); + + // // Draw date + // y += 50; + // x = x - g.stringWidth(timeStr) / 2 + 5; + // g.setFontDate(); + // g.setFontAlign(-1,0); + // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + // fc = E.getBattery() < 50 ? "#f00" : fc; + // g.drawString(dateStr, x, y); + + // queue draw in one minute + queueDraw(); +} + +Bangle.loadWidgets(); + +// Clear the screen once, at startup +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + +// Show launcher when middle button pressed +Bangle.setUI("clock"); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..29875b1dceaa209aa7aaad86d60402290ee0f9cc GIT binary patch literal 4238 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 literal 0 HcmV?d00001 From d3dcc50071a5ef549846aed8ce15c92d55f4681a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:23:54 +0100 Subject: [PATCH 046/197] Fixed invalid json --- apps/bwclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 0d48401c6..d570fb2d2 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -12,6 +12,6 @@ "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.img","url":"app-icon.js","evaluate":true} ] } From c2bce25a424440a28ce01b92a89f0414e8086c10 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:57:19 +0100 Subject: [PATCH 047/197] Finished V1 --- apps/bwclk/app.js | 63 ++++++++++++++++++++++++-------------- apps/bwclk/app.png | Bin 4238 -> 2103 bytes apps/bwclk/screenshot.png | Bin 6093 -> 2882 bytes 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 709597a0b..ec00b46fd 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,5 +1,18 @@ const locale = require('locale'); +// Manrope font +Graphics.prototype.setLargeFont = function(scale) { + // Actual height 41 (42 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); + return this; +}; + +Graphics.prototype.setSmallFont = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); + return this; +}; + // timeout used to update every minute var W = g.getWidth(); @@ -36,33 +49,37 @@ function draw() { // Hide widgets for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - // Clear old watch face - var x = W/2; - var y = H/2-20; - g.reset().clearRect(0,0,W,W); - // Draw background - g.setColor("#000"); - g.fillRect(0,0,W/2,H/2); + g.reset().clearRect(0,0,W,W); g.setColor("#fff"); - g.fillRect(W/2,H/2,W/2,H/2); + g.fillRect(0,0,W,H/5*2); - // // Draw time - // var date = new Date(); - // var timeStr = locale.time(date,1); - // g.setFontAlign(0,0); - // g.setFontTime(); - // g.drawString(timeStr, x, y); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,0); + var date = new Date(); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, H/5*2 + 40); - // // Draw date - // y += 50; - // x = x - g.stringWidth(timeStr) / 2 + 5; - // g.setFontDate(); - // g.setFontAlign(-1,0); - // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); - // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; - // fc = E.getBattery() < 50 ? "#f00" : fc; - // g.drawString(dateStr, x, y); + // Draw Steps + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, H/5*4 + 10); + + // Draw date + g.setColor("#000"); + g.setSmallFont(); + g.setFontAlign(0,1); + var y = H/5+30; + g.drawString(locale.dow(date, true), W/2-55, y); + var monthStr = date.getMonth()+1; + + monthStr = monthStr < 10 ? "0" + monthStr : monthStr; + g.drawString(monthStr, W/2+55, y); + + g.setLargeFont(); + g.drawString(date.getDate(), W/2, y+7); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index 29875b1dceaa209aa7aaad86d60402290ee0f9cc..cbe7fa8978429136351c0f09dd6becfea57b8b01 100644 GIT binary patch delta 2075 zcmV+$2;}#UA-52aGk*u}Nkl86k90Gqrp9m)6{$(fJ|LB%tc5Jm zrKHgp!^$%H$D*);6pZM@polCmKcI*p5-O7{YnV|=m`-!nVtrT?YHGSPoh+aCkMf6m z_t9GmLg>I@zkBX;?>T4Z+ktCCnlI$>lirkJsdwV+oKqL|gvhm*l@bu|Z zOq(_hRaI3m8jT1F3c{K-YvAYS=dOCk5jcGKFe4%&s8lMsefxGnZZsNs;=~D;|44g# zJHx`l7#JAHo}M0(-=l;dc`uPj2!PSi(d_K(v>AK)^nYnaMn*C&E{^r}^)#7GR4SEJ zDwR|y6n1!$bm+joefwBhSt+zjN=kU_*fACr74gQ68%~X{uCC_HnKLPoNT}241o@#u zhnSw8&g$xFc6N61{Q2_~i9}qxcCCQv?d|25*RSK{%a_n-G`M!{8Wt{G2$@US_Q$OiT<-2Axia;NW0fx^xNm?%jh{s}<()^72AQM+ZKA`h@!WdISarqOGkB@87>iLP7%i z`+xf}I5=o;fTO%RdGaJ5Ja{0qckI}~&dyFge*Bn6j~=zbj$fev%VXPUK|uk%y}c$=J6f~JkHglDflu)TuQl(O{si}!(vzc10mP)0PM~)nExDAU)_wEB%uU^I1 zuU{SZB_}5%Ffb4R@aWMaoIigaqobpkJ%4*Pva_=xlgZps4FGW4fxk@?z8V$%D6}Rl ziST{FO<0=nDKz07a9NFphK3?DGZTJ(emHXE2+U?PHf-2{ef##=VFv~VkeHYVv)OFd z=j-c>yu3U+`QYH7U73-Qk%9R5c*x~))YjJG*s)_685wcugu_E9At8b9-o3Lsuzxmh z-b{nRz}D7Q8Vm*+3?9H1u0!Azrv#6+uqobqj>+9p& zw{J<3_4V~m56U0xxTCVNl8udxLRISQ#0?D%<;chg@7=rSRLPhFg@uKb%jE*gWHJG> zYSk)|WJN^I4<0{$+@%9~d3hvBl}hDQNo;H^ zNm8v=JH?FMj{^b%erB)@J6*&L4Gpkbt)o*uQ^2JUr}|;JkVB1kAZ}=MWMS;?f4Uu9O;$26N`jL4Qt84n{{u z1^L5=4;?B6CN~P@X?&jUQ zcYl2i{ET+(+6A##jH03vd1%Fj471PtxX)>8? z(r?kCMI_1BuU|7UF_9{jij9qpv{)=$xpL*7O`)+pd(WOd4#$kYc>$oOrzg*zJ!^BL z>hA7lYHF&@xV?M#(rh*hnBn1J78De?wC|_Y=;Xe1idZ--GR6j-rh1pwg5lP7ro{JG0H|CQ5!o7{3>#*7)z z>-Es<^=NNzM{sa3R<2x$y1F{Fw6q{2BLe`iapOj`wzi_Nu@Oq864}|=(ChVRX=%Zg zD_7ih;9zwY9aJKYu<$LPGfB#S4nXVt*QqMg|85Q>|9>^5x6I zSglqoyk!3_yZt)7b?a6{MMa^hsR;n!=jVrK&z`|*wPI*!2qKXPw{G1+O-&7gf`X8l znJJ7-OG`smR+hUaxEBF$Z*O{ed9kXhieX`4Y-(x}w$QQf=H_OGhlevYHI=2MrNT+< zss#Uk*{wAY8GjjxWy_XfWMl;X{{E0iBDbWF!1VNV0$@^75}TWw zSyxxbS+iyl0B_v5!O4>+yB&dl=fK~le-8X@n(z+%7ZgCSjsX$Ymp=di002ovPDHLk FV1nvT3L5|b delta 4226 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

2$QTw4l{$NlQ!P#*G_%|NZxz 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 From ec40e5d8fdd11299d161b8d23033281dac7f4983 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:00:22 +0100 Subject: [PATCH 048/197] Show lock status. --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index ec00b46fd..eb95bc777 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,7 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, H/5*4 + 10); + g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 288123d72934809857ccf401da3e73d76a656e6a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:05:17 +0100 Subject: [PATCH 049/197] Minor fix --- apps/bwclk/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb95bc777..6c7db898e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,9 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); + var lock = Bangle.isLocked() ? "L" : ""; + var steps = getSteps(); + g.drawString(steps + lock, W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 0bd35cec29274bb3c5de179f5d3fcbfefee98e27 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:28:25 +0100 Subject: [PATCH 050/197] Improvements accordingly to the community --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 22 ++++++++++++++-------- apps/bwclk/metadata.json | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 2286a7f70..1e1f155bb 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Use build in function for steps and other improvements. \ No newline at end of file diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index 28f75c4e6..a84b133d7 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) +require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 6c7db898e..e022a1d2a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -36,6 +36,8 @@ function getSteps() { return WIDGETS.wpedom.getSteps(); } else if (WIDGETS.activepedom !== undefined) { return WIDGETS.activepedom.getSteps(); + } else { + return Bangle.getHealthStatus("day").steps; } } catch(ex) { // In case we failed, we can only show 0 steps. @@ -71,17 +73,21 @@ function draw() { // Draw date g.setColor("#000"); - g.setSmallFont(); - g.setFontAlign(0,1); var y = H/5+30; - g.drawString(locale.dow(date, true), W/2-55, y); - var monthStr = date.getMonth()+1; - - monthStr = monthStr < 10 ? "0" + monthStr : monthStr; - g.drawString(monthStr, W/2+55, y); + g.setFontAlign(0,1); g.setLargeFont(); - g.drawString(date.getDate(), W/2, y+7); + var dateStr = date.getDate(); + g.drawString(dateStr, W/2, y+7); + var strW = g.stringWidth(dateStr); + + g.setSmallFont(); + g.setFontAlign(1,1); + g.drawString(locale.dow(date, true), W/2-strW/2, y); + + g.setFontAlign(-1,1); + var monthStr = locale.month(date, 1); + g.drawString(monthStr, W/2+strW/2, y); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index d570fb2d2..aefb1e531 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.01", + "version": "0.02", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", From 9f3935cb9e9edebc01474d0cacb8200c075da5e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:31:06 +0100 Subject: [PATCH 051/197] Minor changes --- apps/bwclk/app.js | 1 - apps/bwclk/screenshot.png | Bin 2882 -> 2963 bytes 2 files changed, 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index e022a1d2a..eb61221d9 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -111,7 +111,6 @@ Bangle.on('lcdPower',on=>{ Bangle.on('lock', function(isLocked) { - print("LOCK"); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index f6d1d96e34df9dd506d9b7689ef7bfdae01666b2..84fb273b760489ecfbee271b5c7bc2b45a3feca0 100644 GIT binary patch literal 2963 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 Date: Sun, 27 Mar 2022 11:26:22 +0200 Subject: [PATCH 052/197] Finished V0.02 with fullscreen mode and optional lock icon --- apps/90sclk/app.js | 6 +-- apps/bwclk/README.md | 9 ++++ apps/bwclk/app.js | 86 +++++++++++++++++++++++++----------- apps/bwclk/lock.png | Bin 0 -> 9212 bytes apps/bwclk/metadata.json | 5 ++- apps/bwclk/screenshot.png | Bin 2963 -> 2693 bytes apps/bwclk/screenshot_2.png | Bin 0 -> 3113 bytes apps/bwclk/settings.js | 40 +++++++++++++++++ 8 files changed, 116 insertions(+), 30 deletions(-) create mode 100644 apps/bwclk/lock.png create mode 100644 apps/bwclk/screenshot_2.png create mode 100644 apps/bwclk/settings.js diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 367d77502..6babbfec2 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -75,6 +75,9 @@ function getSteps() { function draw() { + // queue draw in one minute + queueDraw(); + var x = g.getWidth()/2; var y_offset = settings.fullscreen ? 0 : 10; var y = g.getHeight()/2-20 + y_offset; @@ -110,9 +113,6 @@ function draw() { } else { Bangle.drawWidgets(); } - - // queue draw in one minute - queueDraw(); } Bangle.loadWidgets(); diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 49ee7f593..18c87d7e8 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -3,5 +3,14 @@ ![](screenshot.png) +In the settings, fullscreen mode can be enabled and disabled: + +![](screenshot_2.png) + +Additionally, in fullscreen mode a lock icon can be shown... + +## Thanks to +Lock icons created by Those Icons - Flaticon + ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb61221d9..b1f433c12 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,4 +1,25 @@ +const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: true, + showLock: true, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} + + +/* + * Assets + */ // Manrope font Graphics.prototype.setLargeFont = function(scale) { @@ -13,6 +34,12 @@ Graphics.prototype.setSmallFont = function(scale) { return this; }; +var imgLock = { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) +}; + // timeout used to update every minute var W = g.getWidth(); @@ -48,37 +75,23 @@ function getSteps() { function draw() { - // Hide widgets - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + // queue draw in one minute + queueDraw(); // Draw background + var yOffset = settings.fullscreen ? 0 : 10; + var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#fff"); - g.fillRect(0,0,W,H/5*2); - - // Draw time - g.setColor("#fff"); - g.setLargeFont(); - g.setFontAlign(0,0); - var date = new Date(); - var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, H/5*2 + 40); - - // Draw Steps - g.setSmallFont(); - g.setFontAlign(0,0); - var lock = Bangle.isLocked() ? "L" : ""; - var steps = getSteps(); - g.drawString(steps + lock, W/2, H/5*4 + 10); + g.setColor("#000"); + g.fillRect(0,y,W,H); // Draw date + var date = new Date(); g.setColor("#000"); - var y = H/5+30; - g.setFontAlign(0,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+7); + g.drawString(dateStr, W/2, y+5); var strW = g.stringWidth(dateStr); g.setSmallFont(); @@ -89,14 +102,37 @@ function draw() { var monthStr = locale.month(date, 1); g.drawString(monthStr, W/2+strW/2, y); - // queue draw in one minute - queueDraw(); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,-1); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, y+10); + + // Draw Steps + y += H/5*2+10; + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, y); + + // Draw lock + if(settings.showLock && Bangle.isLocked()){ + g.setColor("#000"); + g.drawImage(imgLock, 2, 2); + } + + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } } Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2c8407e79bd5f67969487c1028db745fca11fa GIT binary patch literal 9212 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 HbLsy8P0)rp literal 0 HcmV?d00001 diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index aefb1e531..3fe04c4d5 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -5,13 +5,14 @@ "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true} + {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.settings.js","url":"settings.js"} ] } diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 84fb273b760489ecfbee271b5c7bc2b45a3feca0..5a3c17c868b9710cf95b1518d9122efc3485a798 100644 GIT binary patch literal 2693 zcmcgu`#aS67k__dOzyWrg^?u{vuup(WGsb|E@F{e(_km-QpRQ&GcF(LBDs{PP{^Gz zGp52+OkE7Nn7~ri!xmkto78)a*wo8i3>|3V?uk*dbSzwB!Fo z*`n2z6|(l*&(~z!gU*k3z{QDl;ge2#;9%FQcw6?a*vgw^|G36{!CnR4N1RfoCjpSEy*Y@vP;h_HmEuUddfU=C`U8V-bD0r9T{)}G** zs#p@UXo$^FsQ6f=o8VwleCvH{$Bv&?dV=wYdIZg?x17>XEAl+k-tzzHD ztzT{PT{WS8-;4NU*P+>Mf6}7S$r!!%1d5=VLOklbJZGQya2_<(@g1W94r}> z)dUhJsDSS)m1q9URFy8JAuN(uQhDDL-(B7SmPP%#9w60V{j(XEG|q^%!I0f?&A@Nt z!kHX{0xo0OxZAVTw7c`4xD}OQQSMJ>0 z`S!xA&yNeMw>~871-^N$nM;L}=6kSlgxYRnaZvsWJ^&AiXVAQtmVF_J%$UoVR{DIIB~b` z4X%ULndg}U9NNL2b>C(GyM6ex6-UmrXIqjgTs;U2t+L35(XT&TU!8LH!CHh8oD##} z_>1u$(V`3b!$A|o>T@cX_?6Go+J<9L!^aSEP{mH6kwvKLExaYZj(uvh5?PX*eA>uZ zL7Un-#H$Gcwt}pE*ay4fEIxnf*m0xt^73g_m5hWatMJ*PEj<&xlS$xf#p+3C@gF$s z&AOc@)Acg6y02bnMwKyhVm7&8sxWGDwxCOdFJm^Ayv#z}kGh^7;9&0h+2{PIRbkygNlb5%6NEu* zA)~7`x<}RRFn@!FvcB-6y9HX_H`M$h?a2GD5GKU|O7JmEvT8c;OEuO8T(Ih4)VkR@Vt5R5MfQAvsWKcb)9^qZ zUTY2pL6E3FDMw8qajKH7PoG3Coi>7O>nLv5jw; zW5rv-nR>t)WaHS7ZCD_*=py_yA4o4Mt*^~|TMZ-*p5Kk>iUx8Ab*8QsXU z-8ghzO~lXw9ta-w3$y4Dy4fa|{|Q=K?h$nC`m1L3geGq~#zE$*p0WU)@^XC$I{bC*GatXFQqS>`!YFe`zxg4x*0k`$fRgzB~ zex9pmt^~X246<>3#`!5-K>YqPL@^NH8yfZJukO9oJhvZ+hj3dr6Nt9OcGnT8IO(5@ hr)IbO?~K~!cBT@d+B+t%L+UHRVVC31?1Q8W{{p+I;AQ{- literal 2963 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 (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From 2583bdd4afc0f2c9c89ee678586136083e5235fb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:26:34 +0200 Subject: [PATCH 053/197] Minor chnages --- apps/bwclk/lock.png | Bin 9212 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/bwclk/lock.png diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png deleted file mode 100644 index 8c2c8407e79bd5f67969487c1028db745fca11fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9212 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 HbLsy8P0)rp From d51fd882466376dce27d1e3c5cb3f315fb14d4f1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:29:37 +0200 Subject: [PATCH 054/197] Set defaults correctly --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index b1f433c12..3a89bc68f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -7,7 +7,7 @@ const storage = require('Storage'); * Load settings */ let settings = { - fullscreen: true, + fullscreen: false, showLock: true, }; From bceb2949bf46928498251a1c8e9bfc5abd75c3b7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:53:27 +0200 Subject: [PATCH 055/197] Optional timer if qalarm is installed --- apps/bwclk/README.md | 2 ++ apps/bwclk/app.js | 71 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 18c87d7e8..85f01c8fe 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,6 +8,8 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... +If you installed the "qalarm" app, you can directly set a timer. Simply tab at +top / bottom of the screen. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 3a89bc68f..39c6b1e17 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -56,7 +56,9 @@ function queueDraw() { } - +/* + * Handle alarm + */ function getSteps() { try{ if (WIDGETS.wpedom !== undefined) { @@ -74,6 +76,44 @@ function getSteps() { } +function isAlarmEnabled(){ + try{ + var qalarm = require('qalarm'); + return qalarm.isTimerStarted("bwclk"); + } catch(ex){ } + return false; +} + + +function getAlarmMinutes(){ + try{ + var qalarm = require('qalarm'); + return qalarm.getTimerMin("bwclk"); + } catch(ex){ } + return -1; +} + +function increaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")+5; + qalarm.deleteTimer("bwclk"); + qalarm.editTimer("bwclk", 0, mins, 0); + } catch(ex){ } +} + +function decreaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")-5; + qalarm.deleteTimer("bwclk"); + if(mins > 0){ + qalarm.editTimer("bwclk", 0, mins, 0); + } + } catch(ex){ } +} + + function draw() { // queue draw in one minute queueDraw(); @@ -109,11 +149,13 @@ function draw() { var timeStr = locale.time(date,1); g.drawString(timeStr, W/2, y+10); - // Draw Steps + // Draw steps or timer y += H/5*2+10; g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, y); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + // Draw lock if(settings.showLock && Bangle.isLocked()){ @@ -135,6 +177,8 @@ Bangle.loadWidgets(); g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); + + // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -153,5 +197,26 @@ Bangle.on('lock', function(isLocked) { }); +Bangle.on('touch', function(btn, e){ + var upper = parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var is_upper = e.y < upper; + var is_lower = e.y > lower; + + if(is_upper){ + Bangle.buzz(40, 0.6); + increaseAlarm(); + draw(true); + } + + if(is_lower){ + Bangle.buzz(40, 0.6); + decreaseAlarm(); + draw(true); + } +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); From bf51d5ed7ae9407874b0cf0bda40a80381202270 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 28 Mar 2022 06:29:42 +0200 Subject: [PATCH 056/197] Minor improvement --- apps/bwclk/app.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39c6b1e17..5da262d03 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -128,19 +128,16 @@ function draw() { // Draw date var date = new Date(); g.setColor("#000"); - g.setFontAlign(0,1); + g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); g.drawString(dateStr, W/2, y+5); - var strW = g.stringWidth(dateStr); g.setSmallFont(); - g.setFontAlign(1,1); - g.drawString(locale.dow(date, true), W/2-strW/2, y); - g.setFontAlign(-1,1); var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2+strW/2, y); + g.drawString(monthStr, W/2 + 5, y+2); + g.drawString(locale.dow(date, true), W/2 + 5, y-22); // Draw time g.setColor("#fff"); From c0c9f690b18675a990526fca199f5e4d31be1632 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 09:59:02 +0200 Subject: [PATCH 057/197] Create dentigrossi --- apps/dentigrossi | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/dentigrossi diff --git a/apps/dentigrossi b/apps/dentigrossi new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/dentigrossi @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From eafdef1782d6a5cd5932ef595a0a4a122ed4e325 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:06:10 +0200 Subject: [PATCH 058/197] Create dentispessi --- apps/dentispessi | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/dentispessi diff --git a/apps/dentispessi b/apps/dentispessi new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/dentispessi @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From dc2d576a352973c35dad1885a637e50361c4bb32 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:07:05 +0200 Subject: [PATCH 059/197] Create dentoni --- App_Denti/dentoni | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 App_Denti/dentoni diff --git a/App_Denti/dentoni b/App_Denti/dentoni new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/App_Denti/dentoni @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From f4c4f701906a5cc9229d5ceb25dbb63763373608 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:08:56 +0200 Subject: [PATCH 060/197] Create Dentix --- apps/AppDentus/Dentix | 94 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/AppDentus/Dentix diff --git a/apps/AppDentus/Dentix b/apps/AppDentus/Dentix new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/AppDentus/Dentix @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From 7cd02f6794daf16adde6bc881c34f8d3076513a7 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:15:51 +0200 Subject: [PATCH 061/197] Create appDenti.js --- apps/SuperDenti/appDenti.js | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/SuperDenti/appDenti.js diff --git a/apps/SuperDenti/appDenti.js b/apps/SuperDenti/appDenti.js new file mode 100644 index 000000000..556a35ac1 --- /dev/null +++ b/apps/SuperDenti/appDenti.js @@ -0,0 +1,99 @@ +var i = 0; +var counter = 10; +var counterInterval; + +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # ###### # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +g.setColor('#012345'); + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + // again, 10 secs later + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + g.clear(img); + outOfTime(); + return; + + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + if (counter<=5){ + immagine(); + } +} + + + +function startTimer() { + counter = 10; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); + + +} + + +startTimer(); From 1f4225a20230f982db457ce87421253631c64246 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:29:06 +0200 Subject: [PATCH 062/197] Create app.js --- apps/MegaDenti/app.js | 99 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/MegaDenti/app.js diff --git a/apps/MegaDenti/app.js b/apps/MegaDenti/app.js new file mode 100644 index 000000000..556a35ac1 --- /dev/null +++ b/apps/MegaDenti/app.js @@ -0,0 +1,99 @@ +var i = 0; +var counter = 10; +var counterInterval; + +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # ###### # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +g.setColor('#012345'); + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + // again, 10 secs later + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + g.clear(img); + outOfTime(); + return; + + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + if (counter<=5){ + immagine(); + } +} + + + +function startTimer() { + counter = 10; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); + + +} + + +startTimer(); From 3703a8d81f9e492b2328f51083a46c1c6b861360 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:32:36 +0200 Subject: [PATCH 063/197] Add files via upload --- apps/MegaDenti/brush-teeth.png | Bin 0 -> 42215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/MegaDenti/brush-teeth.png diff --git a/apps/MegaDenti/brush-teeth.png b/apps/MegaDenti/brush-teeth.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c8e2baf15f33b5483693e0e97203505861fe84 GIT binary patch literal 42215 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 Mz+Aunj%&jI0i39MCjbBd literal 0 HcmV?d00001 From 1263a35facac55760aa26c5770fefb0223e0b0ec Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:50:47 +0200 Subject: [PATCH 064/197] Create app-icon.js --- apps/MegaDenti/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/MegaDenti/app-icon.js diff --git a/apps/MegaDenti/app-icon.js b/apps/MegaDenti/app-icon.js new file mode 100644 index 000000000..0b121d700 --- /dev/null +++ b/apps/MegaDenti/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("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")) From f07dcb49c36b093e87c8ff6a7bc0505b47dcaf6b Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:08:56 +0200 Subject: [PATCH 065/197] Create metadata.json --- apps/MegaDenti/metadata.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/MegaDenti/metadata.json diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json new file mode 100644 index 000000000..eb184d789 --- /dev/null +++ b/apps/MegaDenti/metadata.json @@ -0,0 +1,12 @@ +{ "id": "MegaDenti", + "name": "Denti", + "shortName":"My Denti", + "icon": "brush-teeth.png", + "version":"0.01", + "description": "This is a description of my awesome teeths app", + "tags": "", + "storage": [ + {"name":"MegaDenti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From 72c670db137e82a7ca3eb9aca0a71c63f1b4d2da Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:13:25 +0200 Subject: [PATCH 066/197] Update metadata.json --- apps/MegaDenti/metadata.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json index eb184d789..5e820a097 100644 --- a/apps/MegaDenti/metadata.json +++ b/apps/MegaDenti/metadata.json @@ -4,7 +4,9 @@ "icon": "brush-teeth.png", "version":"0.01", "description": "This is a description of my awesome teeths app", - "tags": "", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"MegaDenti.app.js","url":"app.js"}, {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} From 3ad2ea625013fd30d9240d0eb75eab0c2d702eea Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:24:00 +0200 Subject: [PATCH 067/197] Create README.md --- apps/MegaDenti/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/MegaDenti/README.md diff --git a/apps/MegaDenti/README.md b/apps/MegaDenti/README.md new file mode 100644 index 000000000..eaee2a98c --- /dev/null +++ b/apps/MegaDenti/README.md @@ -0,0 +1,2 @@ +Denti : +This teeth washing assistan helps you to wash your teeth From e405ac350ea182e0859a7f8f68fa3076b2230b6d Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:28:33 +0200 Subject: [PATCH 068/197] Create ChangeLog --- apps/MegaDenti/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/MegaDenti/ChangeLog diff --git a/apps/MegaDenti/ChangeLog b/apps/MegaDenti/ChangeLog new file mode 100644 index 000000000..7f28ed46d --- /dev/null +++ b/apps/MegaDenti/ChangeLog @@ -0,0 +1 @@ +0.01: Create New App ! From 20cfb3329cafadf2725db20b1a42e8bb9c339de5 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:31:43 +0200 Subject: [PATCH 069/197] Delete App_Denti directory --- App_Denti/dentoni | 94 ----------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 App_Denti/dentoni diff --git a/App_Denti/dentoni b/App_Denti/dentoni deleted file mode 100644 index 5a026893c..000000000 --- a/App_Denti/dentoni +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From c7bbfa6059debc050de30e3a29953b5d84864735 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:31:56 +0200 Subject: [PATCH 070/197] Delete apps/SuperDenti directory --- apps/SuperDenti/appDenti.js | 99 ------------------------------------- 1 file changed, 99 deletions(-) delete mode 100644 apps/SuperDenti/appDenti.js diff --git a/apps/SuperDenti/appDenti.js b/apps/SuperDenti/appDenti.js deleted file mode 100644 index 556a35ac1..000000000 --- a/apps/SuperDenti/appDenti.js +++ /dev/null @@ -1,99 +0,0 @@ -var i = 0; -var counter = 10; -var counterInterval; - -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # ###### # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -g.setColor('#012345'); - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - // again, 10 secs later - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - g.clear(img); - outOfTime(); - return; - - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - if (counter<=5){ - immagine(); - } -} - - - -function startTimer() { - counter = 10; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); - - -} - - -startTimer(); From 36debde6c94009770e4edd35c0b4fd87455d9dad Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:08 +0200 Subject: [PATCH 071/197] Delete apps/AppDentus directory --- apps/AppDentus/Dentix | 94 ------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 apps/AppDentus/Dentix diff --git a/apps/AppDentus/Dentix b/apps/AppDentus/Dentix deleted file mode 100644 index 5a026893c..000000000 --- a/apps/AppDentus/Dentix +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From f0aed4896a59026666d68e509a31579d41d9e319 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:39 +0200 Subject: [PATCH 072/197] Delete My Denti --- apps/My Denti | 94 --------------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 apps/My Denti diff --git a/apps/My Denti b/apps/My Denti deleted file mode 100644 index 5a026893c..000000000 --- a/apps/My Denti +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 979fde2ac576daadc936fe53fddff50727c17234 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:55 +0200 Subject: [PATCH 073/197] Delete dentigrossi --- apps/dentigrossi | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 apps/dentigrossi diff --git a/apps/dentigrossi b/apps/dentigrossi deleted file mode 100644 index 5a026893c..000000000 --- a/apps/dentigrossi +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 8d7344b9d40e6be51660bc0e2d14b56eb3261f74 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:08 +0200 Subject: [PATCH 074/197] Delete app-icon.js --- apps/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/app-icon.js diff --git a/apps/app-icon.js b/apps/app-icon.js deleted file mode 100644 index 0b121d700..000000000 --- a/apps/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("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")) From bf4fde3baa3f3b301dbe126e4a64bab349d27b26 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:28 +0200 Subject: [PATCH 075/197] Delete dentispessi --- apps/dentispessi | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 apps/dentispessi diff --git a/apps/dentispessi b/apps/dentispessi deleted file mode 100644 index 5a026893c..000000000 --- a/apps/dentispessi +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 25ccff51948c6b3115ac53146373ea48fdd09a5e Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:38 +0200 Subject: [PATCH 076/197] Delete metadata.js --- apps/metadata.js | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/metadata.js diff --git a/apps/metadata.js b/apps/metadata.js deleted file mode 100644 index 198e44df2..000000000 --- a/apps/metadata.js +++ /dev/null @@ -1,13 +0,0 @@ -{ "id": "dentigrossi", - "name": "My app monitors the teeth brush", - "shortName":"Short Name", - "version":"0.01", - "description": "A detailed description of my great app", - "icon": "brush-teeth.png", - "tags": "", - "supports" : ["BANGLEJS1"], - "storage": [ - {"name":"denti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} From d56e247b9cce4f2b6d3fbd83afb1695c6308d675 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:47 +0200 Subject: [PATCH 077/197] Delete metadata.json --- apps/metadata.json | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/metadata.json diff --git a/apps/metadata.json b/apps/metadata.json deleted file mode 100644 index 198e44df2..000000000 --- a/apps/metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ "id": "dentigrossi", - "name": "My app monitors the teeth brush", - "shortName":"Short Name", - "version":"0.01", - "description": "A detailed description of my great app", - "icon": "brush-teeth.png", - "tags": "", - "supports" : ["BANGLEJS1"], - "storage": [ - {"name":"denti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} From 1e91a2095e6e9e1380b7fa5ffa1106bbcefc2c6a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:05 +0100 Subject: [PATCH 078/197] Create fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 apps/fuzzyw/fuzzyw.app.js diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js new file mode 100644 index 000000000..4057563d3 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.app.js @@ -0,0 +1,78 @@ + +// adapted from https://github.com/hallettj/Fuzzy-Text-International/ +const fuzzy_strings = { + en_GB:{ + hours:[ + // AM hours + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + // PM hours + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + minutes:[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + text_scale:3.5, + }, + }; + + //const SETTINGS_FILE = "fuzzyw.settings.json"; + //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; + + //let fuzzy_string = fuzzy_strings[settings.language]; + let fuzzy_string = fuzzy_strings['en_GB']; + + const h = g.getHeight(); + const w = g.getWidth(); + + function getTimeString(date) { + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; + } + + function draw() { + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); + g.setFontAlign(0, 0); + g.clearRect(0, 24, w, h-24); + g.setColor(g.theme.fg); + g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + } + + g.clear(); + draw(); + setInterval(draw, 10000); // refresh every 10s + + // Stop updates when LCD is off, restart when on + Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } + }); + + Bangle.setUI('clock'); + Bangle.loadWidgets(); + Bangle.drawWidgets(); From 18ac62c0ede389efb61e65c68359ed060e6ca90d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:28 +0100 Subject: [PATCH 079/197] Add files via upload --- apps/fuzzyw/ChangeLog | 1 + apps/fuzzyw/README.md | 15 +++++++++++++++ apps/fuzzyw/fuzzy.png | Bin 0 -> 173 bytes apps/fuzzyw/fuzzyw-dark.png | Bin 0 -> 2172 bytes apps/fuzzyw/fuzzyw-light.png | Bin 0 -> 2578 bytes apps/fuzzyw/fuzzyw.icon.js | 1 + apps/fuzzyw/metadata.json | 19 +++++++++++++++++++ 7 files changed, 36 insertions(+) create mode 100644 apps/fuzzyw/ChangeLog create mode 100644 apps/fuzzyw/README.md create mode 100644 apps/fuzzyw/fuzzy.png create mode 100644 apps/fuzzyw/fuzzyw-dark.png create mode 100644 apps/fuzzyw/fuzzyw-light.png create mode 100644 apps/fuzzyw/fuzzyw.icon.js create mode 100644 apps/fuzzyw/metadata.json diff --git a/apps/fuzzyw/ChangeLog b/apps/fuzzyw/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/fuzzyw/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md new file mode 100644 index 000000000..1b5f2b8e8 --- /dev/null +++ b/apps/fuzzyw/README.md @@ -0,0 +1,15 @@ +# Fuzzy Text Clock + +An inaccurate clock for when you're not in a rush. + +This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! + +## TODO +* Other languages (currently only uk style time, could tie into the Languages app) +* Bold hour word + +## References +Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International + +![](fuzzyw-light.png) +![](fuzzyw-dark.png) diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-dark.png b/apps/fuzzyw/fuzzyw-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..88220e5c7f3414e922f735d895d5eea03bae3f5a GIT binary patch literal 2172 zcmeH}|5wt78pr7~ObDIdCUZG=B}JW7cT3YL%F_fqJ?H-LJg@V5etFJ$|MX_Z zMu%H(+rA9~fmla;8-_Qt`>%m*HSeyzxua%mq2a?rA)WG17akR; zUs*vLHa8ct0{X=GGw9Uvjt;>yV?K!LR+N4o_@=m|sOTN@%}ly&0z_4tLr@7{oaq2~PId`sdirI|8}+5voR_>GYZXs+K^@kjU&y7al1G;FVvcurRUQ2L z#mK6S6p&Zp7md0YhUGO{B3|z}21st(&w3&+#mw46U-R3;RZ6PAv~7lU9BRDR6y@~= z=XUV$+*UBIksN$mMDMZ8W20}!xSP*tn7?@IewCsrdgM1~w5Aeo18l~?LC4feHu|hg zz;FM81pzQW{IA*t*k?ux$yuNoCto1mE5RUtl4U~IRXLvVWg&2<)K5iMEj;vNG`&qH6zc8-0 zXxRXdI#`z0YeS}VQQ}WlHMT!;&(XGC>wkrHpyf)Db!zH?iGn=obOl%26u4dj>;IlG zFukfwDImSQcZ20DSoK-u!>VP2(9Zrd;Z@Z#7*ix$u76&+sFiXBmeMr_3YUsF9PvcI zICaHSr#wZ{)Q`C|{FEtPi4`-DleBH^J;{b{ZyRrFo@t{xJ(*YW2XRZT)T{Cec6S7p^n4cq5~ocJ`c);lv; z9p9z@**?%ej{cBj{`gU2RWY`Vc?;S(o($i!em7@@U?9XL{9c;%rT7GZK|H6b4>=?_ zUZK1G5uL}C{xZKybn;{2a}{wz!oMqu%Gg4TdN9Dr9w2#9b36N*x(tE*E?#DyGJsLh zthXgP-WsI?ZY|fyOQ!nA&|+M<=18UNSfZOQp)Ji1y4x;s3oPq}+U9_&xLjie3u;Vn zwgwM|9f1HO;d+^!kb`o_-?<;-Y}WfJ9y#pFvlIY!dCDad19$yzv_$(rw95w9&(P}tB2D%>XV zENDET&$N<`RdP0;(q{cKcMnC%afJA%~9o89|Qu-%ZkN7?S literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-light.png b/apps/fuzzyw/fuzzyw-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5383e08a49cad86ee7683b811f4bed918a36cd68 GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json new file mode 100644 index 000000000..56ed896a8 --- /dev/null +++ b/apps/fuzzyw/metadata.json @@ -0,0 +1,19 @@ +{ + "id":"fuzzyw", + "name":"Fuzzy Text Clock", + "shortName": "Fuzzy Text", + "version": "0.01", + "description": "An inaccurate clock for when you're not in a rush", + "readme": "README.md", + "icon":"fuzzyw.png", + "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + ] +} From 949e746a75f1d26361d63420dd3d6c9d47c79f76 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:20:34 +0100 Subject: [PATCH 080/197] Add files via upload --- apps/fuzzyw/fuzzyw-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw-icon.js diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw-icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From b03930125ca0f84ea1ba3e1383b96bf76a3a4785 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:24:17 +0100 Subject: [PATCH 081/197] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 0 -> 173 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/fuzzyw/fuzzyw.png diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 From 0689cb6c03ce19a44549c579b35dcdee69ef38d2 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:25:42 +0100 Subject: [PATCH 082/197] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 56ed896a8..b1fa4c6d7 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -6,7 +6,7 @@ "description": "An inaccurate clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", - "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], From 96ea439a4560452d0860c4ce3b884133a15a2e8c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:38 +0100 Subject: [PATCH 083/197] Create fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw.settings.js diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -0,0 +1 @@ + From a23dd54b5d446ab6aff9742ac39056a1b9288418 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:57 +0100 Subject: [PATCH 084/197] Delete fuzzy.png --- apps/fuzzyw/fuzzy.png | Bin 173 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/fuzzyw/fuzzy.png diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png deleted file mode 100644 index 125265aea211223268c701ba1d548552d26c7b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T From c474d0c5f812557ca61ca738c87f577301296924 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:27:09 +0100 Subject: [PATCH 085/197] Delete fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/fuzzyw/fuzzyw.icon.js diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js deleted file mode 100644 index 48750da61..000000000 --- a/apps/fuzzyw/fuzzyw.icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From c536aee610158a719d5f54fe5fcec1e3a3397144 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:31:33 +0100 Subject: [PATCH 086/197] Rename fuzzyw-icon.js to fuzzyw.img.js --- apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} (100%) diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw.img.js similarity index 100% rename from apps/fuzzyw/fuzzyw-icon.js rename to apps/fuzzyw/fuzzyw.img.js From 991fd8726ee5740e4b13d314f3bb6da98f10c46a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:34:30 +0100 Subject: [PATCH 087/197] Rename fuzzyw.img.js to fuzzyw.icon.js --- apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} (100%) diff --git a/apps/fuzzyw/fuzzyw.img.js b/apps/fuzzyw/fuzzyw.icon.js similarity index 100% rename from apps/fuzzyw/fuzzyw.img.js rename to apps/fuzzyw/fuzzyw.icon.js From 2fc67c46cecf8cfb9d7db42a4e25ecd394f800bb Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:04 +0100 Subject: [PATCH 088/197] Update fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js index 48750da61..acc7e2fcf 100644 --- a/apps/fuzzyw/fuzzyw.icon.js +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) +require("heatshrink").decompress(atob("mEwgP/ABX8oYFD+AFE8AFE8IXE8YFKwFCj08h4FBocenEHCIPDjk4CoIFBhlwAoeMuIFEuBSBAoOI+AFD4HxGoQFB+AFD4P4uYFC8P4gYFD/w7BAFEfApfEj+B/Ecg/Ah8A+EMg/Dw0YseHj/Dw/8sfHAoPH/lhDoIFBwFwj4FB40AvkPAoU8v4dCAoIdDw04FIMP4EOgFwh47Bj8EvEfw/DJwgFXABY")) From 52a237f3e8c8a7cf8549c6ac4c8a4dfbc5702257 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:19 +0100 Subject: [PATCH 089/197] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 173 -> 893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png index 125265aea211223268c701ba1d548552d26c7b77..afd0b0f7669ba9f467b95edff2023270b30e76bf 100644 GIT binary patch delta 871 zcmV-t1DO1+0sRJ$BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!e zW~dHgK~%(1s#pXIrLEAagUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7 zNufoI2gm(*ckglc4iM^PrkWiSfT~$WG8Ppx*;O&{3O|O?jejwOBxdUI)M6T*F%=a_C-#2dsjo0iUbpE$&dl0tk=JZ{hhi66NxyZpwv;IP0m zLq<9|PaGl^3vDd7F)JD>@icK*Q8mgJGA=8ew>YciDr?@8zc857R#IH2IfNLN5Jv(c zWK>Z?85Sb6YJa4dNYZ}P!$0Ww6XcS~RRSZ&0xD1;Iezdz_}#6UpPF=&f>EIJ#kN02 zfWR)$sM+@Sv28a_0RJ;^rM3K(Ixzc5dab2}kAS{y;NrTa$$P-%4lwYfONQh~ewso) z54@kzH)VnTTcBsn?X9_w(+40;T`k`L2Zz9DfwI><-hbWI-rK)tn*IF%mCbUs8u46L z00006VoOIv03rYe067`TGob(g010qNS#tmYE+YT{E+YYWr9XB6000McNliru<^vxI zEf{}eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C4-mcmVz@jM+PuJe`AS+vt0Dr{Of}M^hE*iMIR1L>Hz+qGhg#hq$ z!>fP>04iY3Q`p@bwP@lM3K0>@e~oQG)x-s$02F|@MSX;^%BzY(VJNgJ;<*T^Ezox> zw?21YhnfRc-HQ|J#i<0>BALCj%uDu{7_rF<%_ySHOf8u#S_JhhW_pIIJ*%A%Mtaj8 z-(VcjD!5kl+%50W$h9KV2s1NOO;_&kfvjuH^K%t?a{ToAr*%!csfE9i{?SSsBgN3d xb1n|-xMWEiW-Ag`Hd+7*K!SoMYlAMm20mqH+ zTi^2eD Date: Thu, 31 Mar 2022 12:48:13 +0100 Subject: [PATCH 090/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 8b1378917..6b2dadb1e 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1 +1,46 @@ +(function(back) { + const SETTINGS_FILE = "fuzzyw.json"; + + var align_options = ['Left','Centre','Right']; + var language_options = ['System', 'en_GB']; + // initialize with default settings... + let s = {'language': language_options[0], 'align': align_options[1]}; + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || s; + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + E.showMenu({ + '': { 'title': 'Fuzzy Clock' }, + '< Back': back, + 'Language': { + value: 0 | language_options.indexOf(s.theme), + min: 0, max: language_options.length - 1, + format: v => language_options[v], + onchange: v => { + s.theme = language_options[v]; + save(); + } + }, + 'Language': { + value: 0 | align_options.indexOf(s.theme), + min: 0, max: align_options.length - 1, + format: v => align_options[v], + onchange: v => { + s.theme = align_options[v]; + save(); + } + }, + }); +}) From c270f8d34da94f3db4640d5ef1be54786e6b74ce Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:50:36 +0100 Subject: [PATCH 091/197] Create fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/fuzzyw/fuzzy_strings.json diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json new file mode 100644 index 000000000..21926d747 --- /dev/null +++ b/apps/fuzzyw/fuzzy_strings.json @@ -0,0 +1,25 @@ +{ + "en_GB":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + } +} From 924c68527fad3f0863897db80a049f7178bb079c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:51:43 +0100 Subject: [PATCH 092/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 6b2dadb1e..40505aecb 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -33,7 +33,7 @@ save(); } }, - 'Language': { + 'Alignment': { value: 0 | align_options.indexOf(s.theme), min: 0, max: align_options.length - 1, format: v => align_options[v], From dce327bf620759a20f3ec5d6e0b424c195659d78 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:52:55 +0100 Subject: [PATCH 093/197] Update metadata.json --- apps/fuzzyw/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index b1fa4c6d7..1f197c519 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -14,6 +14,7 @@ "storage": [ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzy_strings.json"} ] } From f76cb9a346639505baa690138dd8e99c603fde16 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:56:53 +0100 Subject: [PATCH 094/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 110 +++++++++++++++----------------------- 1 file changed, 42 insertions(+), 68 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 4057563d3..a8a5c02d5 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,78 +1,52 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = { - en_GB:{ - hours:[ - // AM hours - "midnight", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven", - // PM hours - "twelve", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven" - ], - minutes:[ - "*$1 o'clock", - "five past *$1", - "ten past *$1", - "quarter past *$1", - "twenty past *$1", - "twenty five past *$1", - "half past *$1", - "twenty five to *$2", - "twenty to *$2", - "quarter to *$2", - "ten to *$2", - "five to *$2" - ], - text_scale:3.5, - }, - }; +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); - //const SETTINGS_FILE = "fuzzyw.settings.json"; - //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; +const SETTINGS_FILE = "fuzzyw.settings.json"; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; - //let fuzzy_string = fuzzy_strings[settings.language]; - let fuzzy_string = fuzzy_strings['en_GB']; +let fuzzy_string = fuzzy_strings[settings.language]; +//let fuzzy_string = fuzzy_strings['en_GB']; - const h = g.getHeight(); - const w = g.getWidth(); +const h = g.getHeight(); +const w = g.getWidth(); - function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); - let hour = date.getHours() + Math.floor(segment/12); - f_string = fuzzy_string.minutes[segment % 12]; - if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); - } else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); - } - return f_string; - } +function getTimeString(date) { +let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); +let hour = date.getHours() + Math.floor(segment/12); +f_string = fuzzy_string.minutes[segment % 12]; +if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); +} else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); +} +return f_string; +} - function draw() { - let time_string = getTimeString(new Date()).replace('*', ''); - // print(time_string); - g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); - g.setFontAlign(0, 0); - g.clearRect(0, 24, w, h-24); - g.setColor(g.theme.fg); - g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); - } +function draw() { +let time_string = getTimeString(new Date()).replace('*', ''); +// print(time_string); +g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); +g.setFontAlign(0, 0); +g.clearRect(0, 24, w, h-24); +g.setColor(g.theme.fg); +g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); +} - g.clear(); - draw(); - setInterval(draw, 10000); // refresh every 10s +g.clear(); +draw(); +setInterval(draw, 10000); // refresh every 10s - // Stop updates when LCD is off, restart when on - Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately - } - }); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ +if (secondInterval) clearInterval(secondInterval); +secondInterval = undefined; +if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately +} +}); - Bangle.setUI('clock'); - Bangle.loadWidgets(); - Bangle.drawWidgets(); +Bangle.setUI('clock'); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From cc0e5f14b1ccddd1bcdb05db419263f245588648 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:58:17 +0100 Subject: [PATCH 095/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index a8a5c02d5..988080ea1 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,6 +1,6 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; From 61c5c04c133a6f44ed55193105f3977a40b3cd03 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:04:30 +0100 Subject: [PATCH 096/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 52 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 988080ea1..ba1db294f 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,36 +1,38 @@ - // adapted from https://github.com/hallettj/Fuzzy-Text-International/ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; + +if (settings.language == 'System') { + settings.language = require('locale').name; +} let fuzzy_string = fuzzy_strings[settings.language]; -//let fuzzy_string = fuzzy_strings['en_GB']; const h = g.getHeight(); const w = g.getWidth(); function getTimeString(date) { -let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); -let hour = date.getHours() + Math.floor(segment/12); -f_string = fuzzy_string.minutes[segment % 12]; -if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); -} else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); -} -return f_string; + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; } function draw() { -let time_string = getTimeString(new Date()).replace('*', ''); -// print(time_string); -g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); -g.setFontAlign(0, 0); -g.clearRect(0, 24, w, h-24); -g.setColor(g.theme.fg); -g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); + g.setFontAlign(0, 0); + g.clearRect(0, 24, w, h-24); + g.setColor(g.theme.fg); + g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); } g.clear(); @@ -39,12 +41,12 @@ setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ -if (secondInterval) clearInterval(secondInterval); -secondInterval = undefined; -if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately -} + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } }); Bangle.setUI('clock'); From 23916389beb4ee3d4103f941b6e39c6f733a1f3f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:06:30 +0100 Subject: [PATCH 097/197] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 1f197c519..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -15,6 +15,6 @@ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, - {"name":"fuzzy_strings.json"} + {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From ea6b4624e671f37775d7fb5b58394129a5a98d07 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:26:41 +0100 Subject: [PATCH 098/197] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 138 +++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 21926d747..6b4b71419 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -21,5 +21,143 @@ "five to *$2" ], "text_scale":3.5 + }, + "en_US":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five after *$1", + "ten after *$1", + "quarter after *$1", + "twenty after *$1", + "twenty five after *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + }, + "es_ES":{ + "hours":[ + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once", + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once" + ], + "minutes":[ + "*$1 en punto", + "*$1 y cinco", + "*$1 y diez", + "*$1 y cuarto", + "*$1 y veinte", + "*$1 y veinti- cinco", + "*$1 y media", + "*$2 menos veinti- cinco", + "*$2 menos veinte", + "*$2 menos cuarto", + "*$2 menos diez", + "*$2 menos cinco" + ], + "text_scale":3.5 + }, + "fr_FR":{ + "hours":[ + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze", + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze" + ], + "minutes":[ + "*$1 heures", + "*$1 heures cinq", + "*$1 heures dix", + "*$1 heures et quart", + "*$1 heures vingt", + "*$1 heures vingt- cinq", + "*$1 heures et demie", + "*$2 moins vingt- cinq", + "*$2 heures moins vingt", + "*$2 moins le quart", + "*$2 heures moins dix", + "*$2 heures moins cinq" + ], + "text_scale":3.5 + }, + "no_NO":{ + "hours":[ + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve", + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve" + ], + "minutes":[ + "klokka er *$1", + "fem over *$1", + "ti over *$1", + "kvart over *$1", + "ti på halv *$2", + "fem på halv *$2", + "halv *$2", + "fem over halv *$2", + "ti over halv *$2", + "kvart på *$2", + "ti på *$2", + "fem på *$2" + ], + "text_scale":3.5 + }, + "sv_SE":{ + "hours":[ + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva", + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva" + ], + "minutes":[ + "*$1", + "fem över *$1", + "tio över *$1", + "kvart över *$1", + "tjugo över *$1", + "fem i halv *$2", + "halv *$2", + "fem över halv *$2", + "tjugo i *$2", + "kvart i *$2", + "tio i *$2", + "fem i *$2" + ], + "text_scale":3.5 + }, + "de_DE":{ + "hours":[ + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf", + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf" + ], + "minutes":[ + "*$1 uhr", + "fünf nach *$1", + "zehn nach *$1", + "viertel nach *$1", + "zwanzig nach *$1", + "fünf for halb *$2", + "halb *$2", + "fünf nach halb *$2", + "zwanzig vor *$2", + "viertel vor *$2", + "zehn vor *$2", + "fünf vor *$2" + ], + "text_scale":3.5 } } From 5242d8662b70656d495155ff5358702648f48af8 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:28:05 +0100 Subject: [PATCH 099/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 40505aecb..cb0d1117c 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "fuzzyw.json"; var align_options = ['Left','Centre','Right']; - var language_options = ['System', 'en_GB']; + var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... let s = {'language': language_options[0], 'align': align_options[1]}; From 0feebdb318130e9ef0246b698b9ae941d6980bc3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 13:48:45 +0100 Subject: [PATCH 100/197] improved alarm app --- apps/alarm/alarm.js | 52 +++++++---- apps/alarm/app.js | 219 ++++++++++++++++++++++++-------------------- apps/alarm/boot.js | 22 +++-- 3 files changed, 171 insertions(+), 122 deletions(-) diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js index a655dad1e..9a9e172cc 100644 --- a/apps/alarm/alarm.js +++ b/apps/alarm/alarm.js @@ -1,20 +1,38 @@ // Chances are boot0.js got run already and scheduled *another* // 'load(alarm.js)' - so let's remove it first! -clearInterval(); - -function formatTime(t) { - var hrs = 0|t; - var mins = Math.round((t-hrs)*60); - return hrs+":"+("0"+mins).substr(-2); +if (Bangle.ALARM) { + clearInterval(Bangle.ALARM); + delete Bangle.ALARM; } -function getCurrentHr() { +// time in ms -> { hrs, mins } +function decodeTime(t) { + t = 0|t; // sanitise + var hrs = 0|(t/3600000); + return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; +} + +// time in { hrs, mins } -> ms +function encodeTime(o) { + return o.hrs*3600000 + o.mins*60000; +} + +function formatTime(t) { + var o = decodeTime(t); + return o.hrs+":"+("0"+o.mins).substr(-2); +} + +function getCurrentTime() { var time = new Date(); - return time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); } function showAlarm(alarm) { - var msg = formatTime(alarm.hr); + var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); var buzzCount = 10; if (alarm.msg) msg += "\n"+alarm.msg; @@ -26,13 +44,13 @@ function showAlarm(alarm) { }).then(function(sleep) { buzzCount = 0; if (sleep) { - if(alarm.ohr===undefined) alarm.ohr = alarm.hr; - alarm.hr += 10/60; // 10 minutes + if(alarm.ot===undefined) alarm.ot = alarm.t; + alarm.t += 10*60*1000; // 10 minutes } else { alarm.last = (new Date()).getDate(); - if (alarm.ohr!==undefined) { - alarm.hr = alarm.ohr; - delete alarm.ohr; + if (alarm.ot!==undefined) { + alarm.t = alarm.ot; + delete alarm.ot; } if (!alarm.rp) alarm.on = false; } @@ -59,12 +77,12 @@ function showAlarm(alarm) { // Check for alarms var day = (new Date()).getDate(); -var hr = getCurrentHr()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early +var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early var alarms = require("Storage").readJSON("alarm.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.hra.on&&(a.ta.hr-b.hr); + active = active.sort((a,b)=>a.t-b.t); showAlarm(active[0]); } else { // otherwise just go back to default app diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 56184edf1..7419f0d5d 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -4,33 +4,49 @@ Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; /*alarms = [ { on : true, - hr : 6.5, // hours + minutes/60 + t : 23400000, // Time of day since midnight in ms msg : "Eat chocolate", last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat as : false, // auto snooze - timer : 5, // OPTIONAL - if set, this is a timer and it's the time in minutes + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms } ];*/ +// time in ms -> { hrs, mins } +function decodeTime(t) { + t = 0|t; // sanitise + var hrs = 0|(t/3600000); + return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; +} + +// time in { hrs, mins } -> ms +function encodeTime(o) { + return o.hrs*3600000 + o.mins*60000; +} + function formatTime(t) { - var hrs = 0|t; - var mins = Math.round((t-hrs)*60); - return hrs+":"+("0"+mins).substr(-2); + var o = decodeTime(t); + return o.hrs+":"+("0"+o.mins).substr(-2); } -function formatMins(t) { - mins = (0|t)%60; - hrs = 0|(t/60); - return hrs+":"+("0"+mins).substr(-2); -} - -function getCurrentHr() { +function getCurrentTime() { var time = new Date(); - return time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); +} + +function saveAndReload() { + require("Storage").write("alarm.json",JSON.stringify(alarms)); + eval(require("Storage").read("alarm.boot.js")); } function showMainMenu() { + // Timer img "\0"+atob("DhKBAP////MDDAwwMGGBzgPwB4AeAPwHOBhgwMMzDez////w") + // Alarm img "\0"+atob("FBSBAABgA4YcMPDGP8Zn/mx/48//PP/zD/8A//AP/wD/8A//AP/wH/+D//w//8AAAADwAAYA") const menu = { '': { 'title': 'Alarm/Timer' }, /*LANG*/'< Back' : ()=>{load();}, @@ -38,140 +54,147 @@ function showMainMenu() { /*LANG*/'New Timer': ()=>editTimer(-1) }; alarms.forEach((alarm,idx)=>{ - if (alarm.timer) { - txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatMins(alarm.timer); - } else { - txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatTime(alarm.hr); - if (alarm.rp) txt += /*LANG*/" (repeat)"; - } - menu[txt] = function() { - if (alarm.timer) editTimer(idx); - else editAlarm(idx); + var txt; // a leading space is currently required (JS error in Espruino 2v12) + if (alarm.timer) + txt = /*LANG*/"Timer"+" "+formatTime(alarm.timer); + else + txt = /*LANG*/"Alarm"+" "+formatTime(alarm.t); + if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA="); + menu[txt] = { + value : "\0"+atob(alarm.on?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"), + onchange : function() { + if (alarm.timer) editTimer(idx, alarm); + else editAlarm(idx, alarm); + } }; }); - if (WIDGETS["alarm"]) WIDGETS["alarm"].reload(); return E.showMenu(menu); } -function editAlarm(alarmIndex) { +function editDOW(dow, onchange) { + const menu = { + '': { 'title': /*LANG*/'Days of Week' }, + '< Back' : () => onchange(dow) + }; + for (var i = 0; i < 7; i++) (i => { + var dayOfWeek = require("locale").dow({ getDay: () => i }); + menu[dayOfWeek] = { + value: !!(dow&(1< v ? "Yes" : "No", + onchange: v => v ? dow |= 1< showMainMenu(), /*LANG*/'Hours': { - value: hrs, min : 0, max : 23, wrap : true, - onchange: v => hrs=v + value: t.hrs, min : 0, max : 23, wrap : true, + onchange: v => t.hrs=v }, /*LANG*/'Minutes': { - value: mins, min : 0, max : 59, wrap : true, - onchange: v => mins=v + value: t.mins, min : 0, max : 59, wrap : true, + onchange: v => t.mins=v }, /*LANG*/'Enabled': { - value: en, + value: a.on, format: v=>v?"On":"Off", - onchange: v=>en=v + onchange: v=>a.on=v }, /*LANG*/'Repeat': { - value: en, + value: a.rp, format: v=>v?"Yes":"No", - onchange: v=>repeat=v + onchange: v=>a.rp=v + }, + /*LANG*/'Days': { + value: "SMTWTFS".split("").map((d,n)=>a.dow&(1< editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)}) }, /*LANG*/'Auto snooze': { - value: as, + value: a.as, format: v=>v?"Yes":"No", - onchange: v=>as=v + onchange: v=>a.as=v } }; - function getAlarm() { - var hr = hrs+(mins/60); - var day = 0; - // If alarm is for tomorrow not today (eg, in the past), set day - if (hr < getCurrentHr()) - day = (new Date()).getDate(); - // Save alarm - return { - on : en, hr : hr, - last : day, rp : repeat, as: as - }; - } - menu[/*LANG*/"> Save"] = function() { - if (newAlarm) alarms.push(getAlarm()); - else alarms[alarmIndex] = getAlarm(); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + menu[/*LANG*/"Save"] = function() { + a.t = encodeTime(t); + if (a.t < getCurrentTime()) + a.day = (new Date()).getDate(); + if (newAlarm) alarms.push(a); + else alarms[alarmIndex] = a; + saveAndReload(); showMainMenu(); }; if (!newAlarm) { - menu[/*LANG*/"> Delete"] = function() { + menu[/*LANG*/"Delete"] = function() { alarms.splice(alarmIndex,1); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + saveAndReload(); showMainMenu(); }; } return E.showMenu(menu); } -function editTimer(alarmIndex) { +function editTimer(alarmIndex, alarm) { var newAlarm = alarmIndex<0; - var hrs = 0; - var mins = 5; - var en = true; - if (!newAlarm) { - var a = alarms[alarmIndex]; - mins = (0|a.timer)%60; - hrs = 0|(a.timer/60); - en = a.on; + var a = { + timer : 5*60*1000, // 5 minutes + on : true, + rp : false, + as : false, + dow : 0b1111111, + last : 0 } + if (!newAlarm) Object.assign(a, alarms[alarmIndex]); + if (alarm) Object.assign(a,alarm); + var t = decodeTime(a.timer); + const menu = { '': { 'title': /*LANG*/'Timer' }, + '< Back' : () => showMainMenu(), /*LANG*/'Hours': { - value: hrs, min : 0, max : 23, wrap : true, - onchange: v => hrs=v + value: t.hrs, min : 0, max : 23, wrap : true, + onchange: v => t.hrs=v }, /*LANG*/'Minutes': { - value: mins, min : 0, max : 59, wrap : true, - onchange: v => mins=v + value: t.mins, min : 0, max : 59, wrap : true, + onchange: v => t.mins=v }, /*LANG*/'Enabled': { - value: en, - format: v=>v?/*LANG*/"On":/*LANG*/"Off", - onchange: v=>en=v + value: a.on, + format: v=>v?"On":"Off", + onchange: v=>a.on=v } }; - function getTimer() { - var d = new Date(Date.now() + ((hrs*60)+mins)*60000); - var hr = d.getHours() + (d.getMinutes()/60) + (d.getSeconds()/3600); - // Save alarm - return { - on : en, - timer : (hrs*60)+mins, - hr : hr, - rp : false, as: false - }; - } - menu["> Save"] = function() { - if (newAlarm) alarms.push(getTimer()); - else alarms[alarmIndex] = getTimer(); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + menu[/*LANG*/"Save"] = function() { + a.timer = encodeTime(t); + a.hr = getCurrentTime() + a.timer; + if (newAlarm) alarms.push(a); + else alarms[alarmIndex] = a; + saveAndReload(); showMainMenu(); }; if (!newAlarm) { - menu["> Delete"] = function() { + menu[/*LANG*/"Delete"] = function() { alarms.splice(alarmIndex,1); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + saveAndReload(); showMainMenu(); }; } diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index 47dae5361..a7fdd3658 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -1,25 +1,33 @@ // check for alarms (function() { + if (Bangle.ALARM) { + clearTimeout(Bangle.ALARM); + delete Bangle.ALARM; + } var alarms = require('Storage').readJSON('alarm.json',1)||[]; var time = new Date(); - var active = alarms.filter(a=>a.on); + var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1); if (active.length) { - active = active.sort((a,b)=>(a.hr-b.hr)+(a.last-b.last)*24); - var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); if (!require('Storage').read("alarm.js")) { console.log("No alarm app!"); require('Storage').write('alarm.json',"[]"); } else { - var t = 3600000*(active[0].hr-hr); - if (active[0].last == time.getDate() || t < 0) t += 86400000; - if (t<1000) t=1000; + var t = active[0].t-currentTime; + if (active[0].last == time.getDate() || t < -60000) t += 86400000; + if (t<1000) t=1000; // start alarm min 1 sec from now /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed normally. */ - setTimeout(function() { + Bangle.ALARM = setTimeout(function() { load("alarm.js"); },t); } + } else { // check for new alarms at midnight (so day of week works) + Bangle.ALARM = setTimeout(() => { + eval(require("Storage").read("alarm.boot.js")); + }, 86400000 - (Date.now()%86400000)); } })(); From 9055cd79900da0886920766fbf2fd7d04cf66576 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 15:32:26 +0100 Subject: [PATCH 101/197] Fixes, README and alarm lib --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 70 ++++++++++++++++++++++++++++++++++++++++ apps/alarm/app.js | 19 ++++++----- apps/alarm/boot.js | 7 ++-- apps/alarm/lib.js | 45 ++++++++++++++++++++++++++ apps/alarm/metadata.json | 6 ++-- apps/alarm/widget.js | 1 + 7 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 apps/alarm/README.md create mode 100644 apps/alarm/lib.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 4576237a5..e07e748d4 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,3 +14,4 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system +0.16: Adding alarm library diff --git a/apps/alarm/README.md b/apps/alarm/README.md new file mode 100644 index 000000000..16a39f8b9 --- /dev/null +++ b/apps/alarm/README.md @@ -0,0 +1,70 @@ +Default Alarm & Timer +====================== + +This provides an app, widget, library and tools for alarms and timers. + +Other apps can use this to provide alarm functionality. + +App +--- + +The Alarm app allows you to add/modify any running timers. + + +Internals / Library +------------------- + +Alarms are stored in an array in `alarm.json`, and take the form: + +``` +{ + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms + msg : "Eat chocolate", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat + as : false, // auto snooze + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') + // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) +} +``` + +The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains +a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to +use too much RAM. + +It can be used as follows: + +``` +// add/update an existing alarm +require("alarm").setAlarm("mytimer", { + msg : "Wake up", + timer : 10*60*1000, // 10 Minutes +}); +// Ensure the widget and alarm timer updates to schedule the new alarm properly +require("alarm").reload(); + +// Get the time to the next alarm for us +var timeToNext = require("alarm").getTimeToAlarm(require("alarm").getAlarm("mytimer")); +// timeToNext===undefined if no alarm or alarm disabled + +// delete an alarm +require("alarm").setAlarm("mytimer", undefined); +// reload after deleting... +require("alarm").reload(); + +// Or add an alarm that runs your own code - in this case +// loading the settings app. The alarm will not be removed/stopped +// automatically. +require("alarm").setAlarm("customrunner", { + js : "load('setting.app.js')", + timer : 1*60*1000, // 1 Minute +}); +``` + + + +If your app requires alarms, you can specify that the alarms app needs to +be installed by adding `"dependencies": {"alarm":"app"},` to your metadata. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 7419f0d5d..b5efb3f17 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -3,13 +3,16 @@ Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; /*alarms = [ - { on : true, - t : 23400000, // Time of day since midnight in ms - msg : "Eat chocolate", - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - as : false, // auto snooze + { + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms + msg : "Eat chocolate", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat + as : false, // auto snooze timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') } ];*/ @@ -41,7 +44,7 @@ function getCurrentTime() { function saveAndReload() { require("Storage").write("alarm.json",JSON.stringify(alarms)); - eval(require("Storage").read("alarm.boot.js")); + require("alarm").reload(); } function showMainMenu() { @@ -185,7 +188,7 @@ function editTimer(alarmIndex, alarm) { }; menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); - a.hr = getCurrentTime() + a.timer; + a.t = getCurrentTime() + a.timer; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index a7fdd3658..cb3a82a7e 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -20,10 +20,9 @@ /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed - normally. */ - Bangle.ALARM = setTimeout(function() { - load("alarm.js"); - },t); + normally. + If active[0].js is defined, just run that code as-is and not alarm.js */ + Bangle.ALARM = setTimeout(active[0].js||'load("alarm.js")',t); } } else { // check for new alarms at midnight (so day of week works) Bangle.ALARM = setTimeout(() => { diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js new file mode 100644 index 000000000..a0d8b3938 --- /dev/null +++ b/apps/alarm/lib.js @@ -0,0 +1,45 @@ +// Return an array of all alarms +exports.getAlarms = function() { + return require("Storage").readJSON("alarm.json",1)||[]; +}; +// Return an alarm object based on ID +exports.getAlarm = function(id) { + var alarms = require("Storage").readJSON("alarm.json",1)||[]; + return alarms.find(a=>a.id==id); +}; +// Set an alarm object based on ID. Leave 'alarm' undefined to remove it +exports.setAlarm = function(id, alarm) { + var alarms = require("Storage").readJSON("alarm.json",1)||[]; + alarms = alarms.filter(a=>a.id!=id); + if (alarm !== undefined) { + alarm.id = id; + if (alarm.dow===undefined) alarm.dow = 0b1111111; + if (alarm.on!==false) alarm.on=true; + if (alarm.timer) { // if it's a timer, set the start time as a time from *now* + var time = new Date(); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + alarm.t = currentTime + alarm.timer; + } + } + alarms.push(alarm); + require("Storage").writeJSON("alarm.json", alarms); +}; +/// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future +exports.getTimeToAlarm = function(alarm, time) { + if (!alarm) return undefined; + if (!time) time = new Date(); + var active = alarm.on && (alarm.dow>>time.getDay())&1; + if (!active) return undefined; + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var t = alarm.t-currentTime; + if (alarm.last == time.getDate() || t < -60000) t += 86400000; + return t; +}; +/// Force a reload of the current alarms and widget +exports.reload = function() { + eval(require("Storage").read("alarm.boot.js")); + if (WIDGETS["alarm"]) { + WIDGETS["alarm"].reload(); + Bangle.drawWidgets(); + } +}; diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index d29298309..c10f64a5c 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,17 +2,19 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.15", + "version": "0.16", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"alarm.app.js","url":"app.js"}, {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + {"name":"alarm.wid.js","url":"widget.js"}, + {"name":"alarm","url":"lib.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index e8bb79fc7..54c17dc6d 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -1,6 +1,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); },reload:function() { + // don't include library here as we're trying to use as little RAM as possible WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; } }; From a11999648f539a8397c43dede991544e89565790 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 1 Apr 2022 08:17:59 +0200 Subject: [PATCH 102/197] Minor changes --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/app.png | Bin 2103 -> 1795 bytes apps/bwclk/screenshot.png | Bin 2693 -> 2575 bytes apps/bwclk/screenshot_2.png | Bin 3113 -> 2892 bytes 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a84b133d7..a90e091fd 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) +require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 5da262d03..272f78ca8 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -126,28 +126,30 @@ function draw() { g.fillRect(0,y,W,H); // Draw date + y -= settings.fullscreen ? 5 : 0; var date = new Date(); g.setColor("#000"); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+5); + dateStr = ("0"+dateStr).substr(-2); + g.drawString(dateStr, W/2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2 + 5, y+2); g.drawString(locale.dow(date, true), W/2 + 5, y-22); + g.drawString(locale.month(date, 1), W/2 + 5, y); // Draw time g.setColor("#fff"); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, y+10); + y += settings.fullscreen ? 20 : 10; + g.drawString(timeStr, W/2, y); // Draw steps or timer - y += H/5*2+10; + y += H/5*2; g.setSmallFont(); g.setFontAlign(0,0); var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index cbe7fa8978429136351c0f09dd6becfea57b8b01..c7c42effa88b07093d74b0322dc1446e2b148818 100644 GIT binary patch delta 1764 zcmVnQR|=SuYQzR6Lx&C_8jU8- zfCQqcsfhs0kv)6%P&gbWBBIgJQ7S1Z;otduKE5x@vQ$-7#XpaYjnSDiXXxa~lVr2m zC>o6lbz>d`5r44T?F4{KCKGwRUYeMgpz7*s0zlWVUne4>>gsAzDwR}RT)ZHGyu3WJ z*=*F+)kS@MeUzV{PknuT#4rp+B9Vj%2nr#m(+Pz_fyu3dvzEXM8I zw*dhA_wUE>@GvSXD;KmOl}eG3k%8~uzXJfaZ{Ln>+kdtt9y+sjg(!u?VaQ}MWM*da zZECd|V)0-6jYi{7ZK&01n9XJYz`c9-5^!~4{42YVR4PSoZZ7|~FOl$4YJ0J^)old}D<5C8y=#{;EOiLS0LSglrk z`0xQ89e*9*I1ahFxu~zN$Nl^FF)}g&tyT+@$t1|G;1G&NqX>t?{PVYO-{$3kpTTao z!)mocB9Y+Lt5@JS4tBd86%`d292`VzYbzc;e2C%UVd!)^!FB}^FdB{c{P{C#Yiq%> zEc|{y%w{uUu^9Av{gVA>6Wsgv?~$3A3Aft~0DmYfEX2;8JJHb4falMj0|55!-HW24 zBEbX%g^$f-YsY|CnpCMiv`b~J%iKf6za-62x6L+mPQ_r zha!;(`FuX|`Fs?Q$I0Pv@H$GRa>0LkvG&&1Rw5!gaNqzb6bfo@Z>PGtx_>5wv|25V zkB<`((a6XMy?*_gh=>LT21ub$5PtxYNF>BC4E>qie@bBW>ecl1>sJ~Z8zYfOv?$4? zL~sZlJ9Z2kH*Q38b2ADH3$bCt26T0Gp{%Toze16kJ2qvIZDggk^&CMVp#N%%jHYjYieo&0Dlx07o)ws z9hWX$0x)x5bnxK8)Dz%14ggS9RmHc>{+@l8m6e5$A3x&MsZ&eZlgVTNfL*(G!E838 zuC5NiOp=`41cX9RtZmw~i9(?eefjc*TrL;6TrP@6qck}=N$Kh71c2mnIoWJBG8ha? zt^tWeLQ<)em+b6pA|kqY@qZ$T#p2X2VgOWHT1t-|JtCH6iDg-GI-R7`>6Yx5o}Nyf zot?CA-@c@D7LwoP^m1dx6G++BqFgRVLqh}7($aAD>{+Z?vxeVUrl+Uja5zw3U(f3| zHZ~$2k0(8D%4Xool`G&l4qmSpH*VYj%d+V2?}yjx#f}|2@afYh^ndsFL#0wdqtPUl zynaN=W?*u15?i-!MIaD>-|y$;=+UF->FEK-anNWqC@(KZWo2c`2&8NVq*5uSrlt@K z2It(?Su7T`x3>cT1_lOj`0!zLc6QGBIFc-Wwfb97TrL-1#65ZPgaA-cQ4zUZF1~o1 zE&7IrhDfDSrDWWcg86k90Gqrp9m)6{$(fJ|LB%tc5Jm zrKHgp!^$%H$D*);6pZM@polCmKcI*p5-O7{YnV|=m`-!nVtrT?YHGSPoh+aCkMf6m z_t9GmLg>I@zkBX;?>T4Z+ktCCnlI$>lirkJsdwV+oKqL|gvhm*l@bu|Z zOq(_hRaI3m8jT1F3c{K-YvAYS=dOCk5jcGKFe4%&s8lMsefxGnZZsNs;=~D;|44g# zJHx`l7#JAHo}M0(-=l;dc`uPj2!PSi(d_K(v>AK)^nYnaMn*C&E{^r}^)#7GR4SEJ zDwR|y6n1!$bm+joefwBhSt+zjN=kU_*fACr74gQ68%~X{uCC_HnKLPoNT}241o@#u zhnSw8&g$xFc6N61{Q2_~i9}qxcCCQv?d|25*RSK{%a_n-G`M!{8Wt{G2$@US_Q$OiT<-2Axia;NW0fx^xNm?%jh{s}<()^72AQM+ZKA`h@!WdISarqOGkB@87>iLP7%i z`+xf}I5=o;fTO%RdGaJ5Ja{0qckI}~&dyFge*Bn6j~=zbj$fev%VXPUK|uk%y}c$=J6f~JkHglDflu)TuQl(O{si}!(vzc10mP)0PM~)nExDAU)_wEB%uU^I1 zuU{SZB_}5%Ffb4R@aWMaoIigaqobpkJ%4*Pva_=xlgZps4FGW4fxk@?z8V$%D6}Rl ziST{FO<0=nDKz07a9NFphK3?DGZTJ(emHXE2+U?PHf-2{ef##=VFv~VkeHYVv)OFd z=j-c>yu3U+`QYH7U73-Qk%9R5c*x~))YjJG*s)_685wcugu_E9At8b9-o3Lsuzxmh z-b{nRz}D7Q8Vm*+3?9H1u0!Azrv#6+uqobqj>+9p& zw{J<3_4V~m56U0xxTCVNl8udxLRISQ#0?D%<;chg@7=rSRLPhFg@uKb%jE*gWHJG> zYSk)|WJN^I4<0{$+@%9~d3hvBl}hDQNo;H^ zNm8v=JH?FMj{^b%erB)@J6*&L4Gpkbt)o*uQ^2JUr}|;JkVB1kAZ}=MWMS;?f4Uu9O;$26N`jL4Qt84n{{u z1^L5=4;?B6CN~P@X?&jUQ zcYl2i{ET+(+6A##jH03vd1%Fj471PtxX)>8? z(r?kCMI_1BuU|7UF_9{jij9qpv{)=$xpL*7O`)+pd(WOd4#$kYc>$oOrzg*zJ!^BL z>hA7lYHF&@xV?M#(rh*hnBn1J78De?wC|_Y=;Xe1idZ--GR6j-rh1pwg5lP7ro{JG0H|CQ5!o7{3>#*7)z z>-Es<^=NNzM{sa3R<2x$y1F{Fw6q{2BLe`iapOj`wzi_Nu@Oq864}|=(ChVRX=%Zg zD_7ih;9zwY9aJKYu<$LPGfB#S4nXVt*QqMg|85Q>|9>^5x6I zSglqoyk!3_yZt)7b?a6{MMa^hsR;n!=jVrK&z`|*wPI*!2qKXPw{G1+O-&7gf`X8l znJJ7-OG`smR+hUaxEBF$Z*O{ed9kXhieX`4Y-(x}w$QQf=H_OGhlevYHI=2MrNT+< zss#Uk*{wAY8GjjxWy_XfWMl;X{{E0iBDbWF!1VNV0$@^75}TWw zSyxxbS+iyl0B_v5!O4>+yB&dl=fK~le-8X@n(z+%7ZgCSjsX$Ymp=di002ovPDHLk FV1oB43H<;7 diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a3c17c868b9710cf95b1518d9122efc3485a798..51f632ed36cd05f851968b66b1ec80d71e93c184 100644 GIT binary patch literal 2575 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 diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index 5ce483d7d5aebdf0a65b89c889db121d9f323970..71259932db68015eef9c2c477e43b15b0951229c 100644 GIT binary patch delta 2872 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 HlWzSF79U+A delta 3095 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 Date: Fri, 1 Apr 2022 12:50:36 +0100 Subject: [PATCH 103/197] docs --- apps/alarm/README.md | 10 +++++++++- apps/alarm/app.js | 14 +------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 16a39f8b9..a38d6f6ed 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -20,7 +20,15 @@ Alarms are stored in an array in `alarm.json`, and take the form: { id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms + t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) + dow : 0b1111111, // Binary encoding for days of the week to run alarm on + // SUN = 1 + // MON = 2 + // TUE = 4 + // WED = 8 + // THU = 16 + // FRI = 32 + // SAT = 64 msg : "Eat chocolate", // message to display last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat diff --git a/apps/alarm/app.js b/apps/alarm/app.js index b5efb3f17..4968fc95b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -2,19 +2,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; -/*alarms = [ - { - id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers - on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms - msg : "Eat chocolate", // message to display - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - as : false, // auto snooze - timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms - js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') - } -];*/ +// An array of alarm objects (see README.md) // time in ms -> { hrs, mins } function decodeTime(t) { From 5c33cad685a4dfa52059e5512bd3f34c9e74518a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 1 Apr 2022 13:27:37 +0100 Subject: [PATCH 104/197] Adding alarm.vibrate and menu --- apps/alarm/README.md | 4 ++++ apps/alarm/alarm.js | 20 ++++++++------------ apps/alarm/app.js | 10 +++++++--- apps/messages/settings.js | 10 +--------- apps/messages/widget.js | 9 +-------- modules/buzz.js | 14 ++++++++++++++ modules/buzz_menu.js | 13 +++++++++++++ 7 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 modules/buzz.js create mode 100644 modules/buzz_menu.js diff --git a/apps/alarm/README.md b/apps/alarm/README.md index a38d6f6ed..7bc4b7155 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -32,13 +32,17 @@ Alarms are stored in an array in `alarm.json`, and take the form: msg : "Eat chocolate", // message to display last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat + vibrate : "...", // pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) as : false, // auto snooze timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) + data : { ... } // OPTIONAL - your app can store custom data in here if needed } ``` +You app + The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to use too much RAM. diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js index 9a9e172cc..7ec8d0b73 100644 --- a/apps/alarm/alarm.js +++ b/apps/alarm/alarm.js @@ -58,20 +58,16 @@ function showAlarm(alarm) { load(); }); function buzz() { - if ((require('Storage').readJSON('setting.json',1)||{}).quiet>1) return; // total silence - Bangle.buzz(100).then(()=>{ - setTimeout(()=>{ - Bangle.buzz(100).then(function() { - if (buzzCount--) - setTimeout(buzz, 3000); - else if(alarm.as) { // auto-snooze - buzzCount = 10; - setTimeout(buzz, 600000); - } - }); - },100); + require("buzz").pattern(alarm.vibrate===undefined?"..":alarm.vibrate).then(function() { + if (buzzCount--) + setTimeout(buzz, 3000); + else if(alarm.as) { // auto-snooze + buzzCount = 10; + setTimeout(buzz, 600000); + } }); } + if ((require('Storage').readJSON('setting.json',1)||{}).quiet>1) return; buzz(); } diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 4968fc95b..e83e1c3d5 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -87,7 +87,8 @@ function editAlarm(alarmIndex, alarm) { rp : true, as : false, dow : 0b1111111, - last : 0 + last : 0, + vibrate : ".." } if (!newAlarm) Object.assign(a, alarms[alarmIndex]); if (alarm) Object.assign(a,alarm); @@ -118,6 +119,7 @@ function editAlarm(alarmIndex, alarm) { value: "SMTWTFS".split("").map((d,n)=>a.dow&(1< editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)}) }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ), /*LANG*/'Auto snooze': { value: a.as, format: v=>v?"Yes":"No", @@ -151,7 +153,8 @@ function editTimer(alarmIndex, alarm) { rp : false, as : false, dow : 0b1111111, - last : 0 + last : 0, + vibrate : ".." } if (!newAlarm) Object.assign(a, alarms[alarmIndex]); if (alarm) Object.assign(a,alarm); @@ -172,7 +175,8 @@ function editTimer(alarmIndex, alarm) { value: a.on, format: v=>v?"On":"Off", onchange: v=>a.on=v - } + }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ), }; menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 589d603da..7449b473b 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -15,18 +15,10 @@ require('Storage').writeJSON("messages.settings.json", settings); } - var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"]; var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, "< Back" : back, - /*LANG*/'Vibrate': { - value: Math.max(0,vibPatterns.indexOf(settings().vibrate)), - min: 0, max: vibPatterns.length, - format: v => vibPatterns[v]||"Off", - onchange: v => { - updateSetting("vibrate", vibPatterns[v]); - } - }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v) }), /*LANG*/'Repeat': { value: settings().repeat, min: 0, max: 10, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 7abb415c3..3ac726e77 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -32,14 +32,7 @@ draw:function() { Bangle.drawWidgets(); },buzz:function() { if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return; // never buzz during Quiet Mode - let v = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."; - function b() { - var c = v[0]; - v = v.substr(1); - if (c==".") Bangle.buzz().then(()=>setTimeout(b,100)); - if (c=="-") Bangle.buzz(500).then(()=>setTimeout(b,100)); - } - b(); + require("buzz").pattern((require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."); },touch:function(b,c) { var w=WIDGETS["messages"]; if (!w||!w.width||c.xw.x+w.width||c.yw.y+w.iconwidth) return; diff --git a/modules/buzz.js b/modules/buzz.js new file mode 100644 index 000000000..488d0228d --- /dev/null +++ b/modules/buzz.js @@ -0,0 +1,14 @@ +/* Call this with a pattern like '.-.', '.. .' or '..' to buzz that pattern +out on the internal vibration motor. use buzz_menu to display a menu +where the patterns can be chosen. */ +exports.pattern = pattern => new Promise(resolve => { + function b() { + if (pattern=="") resolve(); + var c = pattern[0]; + pattern = pattern.substr(1); + if (c==".") Bangle.buzz().then(()=>setTimeout(b,100)); + else if (c=="-") Bangle.buzz(500).then(()=>setTimeout(b,100)); + else setTimeout(b,100); + } + b(); +}); diff --git a/modules/buzz_menu.js b/modules/buzz_menu.js new file mode 100644 index 000000000..64b225343 --- /dev/null +++ b/modules/buzz_menu.js @@ -0,0 +1,13 @@ +/* Display a menu to select from various vibration patterns for use with buzz.js */ + +exports.pattern = function(value, callback) { + var vibPatterns = ["", ".", "..", "-", "--", "-.-", "---"]; + return { + value: Math.max(0,vibPatterns.indexOf(value)), + min: 0, max: vibPatterns.length, + format: v => vibPatterns[v]||/*LANG*/"Off", + onchange: v => { + callback(vibPatterns[v]); + } + }; +} From 74203945a291f54237dca6e8063825012be3abbd Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 1 Apr 2022 13:50:06 +0100 Subject: [PATCH 105/197] oops --- apps/messages/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 7449b473b..754347f19 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -18,7 +18,7 @@ var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, "< Back" : back, - /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v) }), + /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v)), /*LANG*/'Repeat': { value: settings().repeat, min: 0, max: 10, From 0fdb4db1d91fe33531148a2e0811c290a4cca377 Mon Sep 17 00:00:00 2001 From: Robert Kaiser Date: Sat, 2 Apr 2022 02:57:24 +0200 Subject: [PATCH 106/197] add stardate clock --- apps/stardateclock/ChangeLog | 1 + apps/stardateclock/README.md | 23 ++ apps/stardateclock/app-icon.js | 1 + apps/stardateclock/app.js | 362 +++++++++++++++++++++++++++++ apps/stardateclock/app.png | Bin 0 -> 594 bytes apps/stardateclock/metadata.json | 23 ++ apps/stardateclock/screenshot1.png | Bin 0 -> 3431 bytes apps/stardateclock/screenshot2.png | Bin 0 -> 2354 bytes apps/stardateclock/screenshot3.png | Bin 0 -> 4017 bytes apps/stardateclock/screenshot4.png | Bin 0 -> 5287 bytes 10 files changed, 410 insertions(+) create mode 100644 apps/stardateclock/ChangeLog create mode 100644 apps/stardateclock/README.md create mode 100644 apps/stardateclock/app-icon.js create mode 100644 apps/stardateclock/app.js create mode 100644 apps/stardateclock/app.png create mode 100644 apps/stardateclock/metadata.json create mode 100644 apps/stardateclock/screenshot1.png create mode 100644 apps/stardateclock/screenshot2.png create mode 100644 apps/stardateclock/screenshot3.png create mode 100644 apps/stardateclock/screenshot4.png diff --git a/apps/stardateclock/ChangeLog b/apps/stardateclock/ChangeLog new file mode 100644 index 000000000..7ebdc317a --- /dev/null +++ b/apps/stardateclock/ChangeLog @@ -0,0 +1 @@ +1.0: Initial release on the app repository for Bangle.js 1 and 2 diff --git a/apps/stardateclock/README.md b/apps/stardateclock/README.md new file mode 100644 index 000000000..2b5da3a41 --- /dev/null +++ b/apps/stardateclock/README.md @@ -0,0 +1,23 @@ +# Stardate Clock + +A clock face displaying a stardate along with a "standard" digital/analog clock +in LCARS design. + +That design has been made popular by various Star Trek shows. Credits for the +original LCARS designs go to Michael Okuda, copyrights are owned by Paramount Global, +usage of that type of design is permitted freely for non-profit use cases. +The Bangle.js version has been created by Robert Kaiser . + +The stardate concept used leans on the shows released from the late 80s onward +by using 1000 units per Earth year, but to apply this more cleanly, this split +is applied exactly. Also, to give more relationship to the shows and +incidentally make values look similar to those depicted there, the zero point +is set to the first airing of the original 'Star Trek' series in the US on +Thursday, September 8, 1966, at 8:30 p.m. Eastern Time. + +The clock face supports Bangle.js 1 and 2 with some compromises (e.g. the +colors will look best on Bangle.js 1, the font sizes will look best on +Bangle.js 2). + +Any tap on the diaply while unlocked switches the "standard" Earth-style clock +between digital and analog display. diff --git a/apps/stardateclock/app-icon.js b/apps/stardateclock/app-icon.js new file mode 100644 index 000000000..d38013a98 --- /dev/null +++ b/apps/stardateclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgkiAA0gDRwX/C/4X/C5MO9wBDgnkAIMAAQQXKAItehwECAQIXK8gBEIQIeDC5YAF8EAAIIECC48hE4oYCAogXIkQvHDIgCBiQXHiCPFAIaaCgECJBChDAIsOU4RIJbJwwIDIVEABIYBMJAXOAC8SmYAHmHdABJfBCxAXNCpEyRxoWVgETC46+OkYXHRpxGWC5EwBQMBkQDBiK4DKQMBiAXKNQMggQ2CgI7CkcgC5UjicwkYXCgUxmakBC5kCmERC4MiAoMjgMTC50AC4KYCkcAgYXRPgJFBC6YABgYEBC6iQBC6cRgMgL6ikBR4IXOiR3EX4IXPAgTXDBgIXNgUiiClCAAMikIKBC5YAMC64AXogAGoAX/C6w")) \ No newline at end of file diff --git a/apps/stardateclock/app.js b/apps/stardateclock/app.js new file mode 100644 index 000000000..70f1070fc --- /dev/null +++ b/apps/stardateclock/app.js @@ -0,0 +1,362 @@ +// Stardate clock face, by KaiRo.at, 2021-2022 + +var redrawClock = true; +var clockface = "digital"; + +// note: Bangle.js 1 has 240x240x16, 2 has 176x176x3 screen +var bpp = g.getBPP ? g.getBPP() : 16; + +// Load fonts +Graphics.prototype.setFontAntonio27 = function(scale) { + // Actual height 23 (23 - 1) + g.setFontCustom(atob("AAAAAAGAAAAwAAAGAAAAwAAAGAAAAwAAAAAAAAAAAAAAAAAADAAAA4AAAHAAAAAAAAAAAAAAAAAAAAAA4AAB/AAD/4AH/4AP/wAf/gAD/AAAeAAAAAAAAAAAAA///AP//+D///4eAAPDgAA4cAAHD///4P//+A///gAAAAAAAAAAAAAAYAAAHAAAA4AAAOAAAD///4f///D///4AAAAAAAAAAAAAAAAAAAAAAA/gD4P8B/D/g/4cAfzDgP4Yf/8DD/+AYP/ADAGAAAAAAAAAAAAHwD8B+AfwfwD/DgMA4cDgHDgeA4f///B/3/wH8P8AAAAAAAAAAAAOAAAPwAAP+AAP/wAf8OAf4BwD///4f///D///4AABwAAAGAAAAAAAAAAAAAAD/4Pwf/h/D/4P4cMAHDjgA4cf//Dh//4cH/8AAAAAAAAAAAAAAH//8B///wf///Dg4A4cHAHDg4A4f3//B+f/wHh/8AAAAAAAAAAAAAAcAAADgAA4cAD/DgH/4cH//Dv/4Af/gAD/gAAfAAADgAAAAAAAAAAAAH4f8B///wf///Dg8A4cDAHDg8A4f///B///wH8/8AAAAAAAAAAAAAAH/h4B/+Pwf/5/DgHA4cA4HDgHA4f///B///wH//8AAAAAAAAAAAAAAAAAAAHgeAA8DwAHgeAAAAAAAAAA"), 45, atob("CQcKDAsMDAwMDAwMDAc="), 27+(scale<<8)+(1<<16)); +}; +Graphics.prototype.setFontAntonio42 = function(scale) { + // Actual height 36 (36 - 1) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAHgAAAAAHgAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAfgAAAAH/gAAAB//gAAAf//gAAH//4AAB//+AAAf//gAAH//4AAAf/+AAAAf/gAAAAf4AAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAA////gAH////+AP/////Af/////gf/////gfAAAAPgeAAAAHgeAAAAHgfAAAAPgf/////gf/////gP/////AH////+AB////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAB4AAAAAB4AAAAADwAAAAAHwAAAAAP/////gf/////gf/////gf/////gf/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAPgH/8AD/gP/8AP/gP/8A//gf/8B//gfAAH/ngeAAf+HgeAB/4HgfAH/gHgf//+AHgP//4AHgH//wAHgD/+AAHgAPgAAAAAAAAAAAAAAAAAAAAAAAAAA+AAfwAH+AAf+AP+AAf/AP+AAf/Af+AAf/gfADwAPgeADwAHgeADwAHgfAH4APgf///h/gf/////AP/+///AH/+f/+AB/4H/4AAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAA/gAAAAH/gAAAB//gAAAP//gAAB//HgAAf/wHgAD/8AHgAf/AAHgAf/////gf/////gf/////gf/////gf/////gAAAAHgAAAAAHgAAAAAHAAAAAAAAAAAAAAAAAAAAAAAf//gP8Af//gP+Af//gP/Af//gP/gf/+AAfgeB8AAHgeB4AAHgeB8AAHgeB////geB////geA////AeAf//+AAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///gAD////8AH/////AP/////Af/////gfAPgAfgeAPAAHgeAPAAHgeAPAAHgf+PgAPgf+P///gP+H///AH+H//+AB+B//8AAAAD8AAAAAAAAAAAAAAAAAAAAAAAeAAAAAAeAAAAAAeAAAAPgeAAAP/geAAD//geAA///geAH///geB///+AeP//4AAe//8AAAf//AAAAf/wAAAAf+AAAAAfwAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wH/4AH/8f/+AP/////Af/////gf/////geAH4APgeADgAHgeADgAHgeAHwAHgf/////gf/////gP/////AH/8//+AB/wH/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//gPgAH//4P+AP//8P/Af//+P/AfwB+P/geAAeAPgeAAeAHgeAAeAHgfAAeAPgf/////gP/////AP/////AH////8AA////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4APgAAH4AfgAAH4AfgAAH4AfgAAH4AfgAAD4APgAAAAAAAAAAAAAAA="), 45, atob("DgsPEhESEhISEhISEgo="), 42+(scale<<8)+(1<<16)); +}; +const fontName = "Antonio27"; +const fontNameLarge = "Antonio42"; +const fontSize = 1; +const fontSizeLarge = 1; +const fontHeightLarge = 42 * fontSizeLarge; + +// LCARS dimensions +if (g.getWidth() < 200) { // Bangle.js 2 + const baseUnit1 = 3; + const baseUnit2 = 2; + const baseUnit3 = 7; +} +else { + const baseUnit1 = 5; + const baseUnit2 = 3; + const baseUnit3 = 10; +} +const widgetsHeight = 24; +const sbarWid = baseUnit3 * 5; +const hbarHt = baseUnit1; +const outRad = baseUnit1 * 5; +const inRad = outRad - hbarHt; +const gap = baseUnit2; +const divisionPos = baseUnit3 * 8; +const sbarGapPos = baseUnit3 * 15; +const lowerTop = divisionPos+gap+1; + +// Star Trek famously premiered on Thursday, September 8, 1966, at 8:30 p.m. +// See http://www.startrek.com/article/what-if-the-original-star-trek-had-debuted-on-friday-nights +const gSDBase = new Date("September 8, 1966 20:30:00 EST"); +const sdatePosBottom = divisionPos - hbarHt - 1; +const sdatePosRight = g.getWidth() - baseUnit2; +const sdateDecimals = 1; +const secondsPerYear = 86400 * 365.2425; +const sdateDecFactor = Math.pow(10, sdateDecimals); + +const clockAreaLeft = sbarWid + inRad / 2; +const clockAreaTop = lowerTop + hbarHt + inRad / 2; +const clockWid = g.getWidth() - clockAreaLeft; +const clockHt = g.getHeight() - clockAreaTop; + +const ctimePosTop = clockAreaTop + baseUnit1 * 5; +const ctimePosCenter = clockAreaLeft + clockWid / 2; +const cdatePosTop = ctimePosTop + fontHeightLarge; +const cdatePosCenter = clockAreaLeft + clockWid / 2; + +const clockCtrX = Math.floor(clockAreaLeft + clockWid / 2); +const clockCtrY = Math.floor(clockAreaTop + clockHt / 2); +const analogRad = Math.floor(Math.min(clockWid, clockHt) / 2); + +const analogMainLineLength = baseUnit1 * 2; +const analogSubLineLength = baseUnit1; + +const analogHourHandLength = analogRad / 2; +const analogMinuteHandLength = analogRad - analogMainLineLength / 2; + +const colorBg = "#000000"; +const colorTime = "#9C9CFF"; +const colorDate = "#A09090"; +const colorStardate = "#FFCF00"; +// On low-bpp devices (Bangle.js 2), use basic colors for analog clock. +const colorHours = bpp > 3 ? "#9C9CFF" : "#00FF00"; +const colorSeconds = bpp > 3 ? "#E7ADE7" : "#FFFF00"; +const colorHands = bpp > 3 ? "#A09090" : "#00FFFF"; +const colorLCARSGray = "#A09090"; +const colorLCARSOrange = "#FF9F00"; +const colorLCARSPink = "#E7ADE7"; +const colorLCARSPurple = "#A06060"; +const colorLCARSBrown = "#C09070"; +// More colors: teal #008484, yellow FFCF00, purple #6050B0 + +var lastSDateString; +var lastTimeStringToMin; +var lastTimeStringSec; +var lastDateString; +var lastAnalogDate; + +function updateStardate() { + var curDate = new Date(); + + // Note that the millisecond division and the 1000-unit multiplier cancel each other out. + var sdateval = (curDate - gSDBase) / secondsPerYear; + + var sdatestring = (Math.floor(sdateval * sdateDecFactor) / sdateDecFactor).toFixed(sdateDecimals); + + // Reset the state of the graphics library. + g.reset(); + g.setBgColor(colorBg); + // Set Font + g.setFont(fontName, fontSize); + if (lastSDateString) { + // Clear the area where we want to draw the time. + //g.setBgColor("#FF6600"); // for debugging + g.clearRect(sdatePosRight - g.stringWidth(lastSDateString) - 1, + sdatePosBottom - g.getFontHeight(), + sdatePosRight, + sdatePosBottom); + } + // Draw the current stardate. + g.setColor(colorStardate); + g.setFontAlign(1, 1, 0); // Align following string to bottom right. + g.drawString(sdatestring, sdatePosRight, sdatePosBottom); + lastSDateString = sdatestring; + + // Schedule next when an update to the last decimal is due. + var mstonextUpdate = (Math.ceil(sdateval * sdateDecFactor) / sdateDecFactor - sdateval) * secondsPerYear; + if (redrawClock) { + setTimeout(updateStardate, mstonextUpdate); + } +} + +function updateConventionalTime() { + var curDate = new Date(); + + if (clockface == "digital") { + drawDigitalClock(curDate); + } + else { + drawAnalogClock(curDate); + } + + // Schedule next when an update to the last second is due. + var mstonextUpdate = Math.ceil(curDate / 1000) * 1000 - curDate; + if (redrawClock) { + setTimeout(updateConventionalTime, mstonextUpdate); + } +} + +function drawDigitalClock(curDate) { + var timestringToMin = ("0" + curDate.getHours()).substr(-2) + ":" + + ("0" + curDate.getMinutes()).substr(-2) + ":"; + var timestringSec = ("0" + curDate.getSeconds()).substr(-2); + var datestring = "" + curDate.getFullYear() + "-" + + ("0" + (curDate.getMonth() + 1)).substr(-2) + "-" + + ("0" + curDate.getDate()).substr(-2); + + // Reset the state of the graphics library. + g.reset(); + g.setBgColor(colorBg); + // Set Font + g.setFont(fontNameLarge, fontSizeLarge); + var ctimePosLeft = ctimePosCenter - g.stringWidth("12:34:56") / 2; + if (ctimePosLeft + g.stringWidth("00:00:00") > g.getWidth()) { + ctimePosLeft = g.getWidth() - g.stringWidth("00:00:00"); + } + g.setColor(colorTime); + if (timestringToMin != lastTimeStringToMin) { + if (lastTimeStringToMin) { + // Clear the area where we want to draw the time. + //g.setBgColor("#FF6600"); // for debugging + g.clearRect(ctimePosLeft, + ctimePosTop, + ctimePosLeft + g.stringWidth(lastTimeStringToMin) + 1, + ctimePosTop + g.getFontHeight()); + } + // Draw the current time. + g.drawString(timestringToMin, ctimePosLeft, ctimePosTop); + lastTimeStringToMin = timestringToMin; + } + var ctimePosLeftSec = ctimePosLeft + g.stringWidth(timestringToMin); + if (lastTimeStringSec) { + // Clear the area where we want to draw the seconds. + //g.setBgColor("#FF6600"); // for debugging + g.clearRect(ctimePosLeftSec, + ctimePosTop, + ctimePosLeftSec + g.stringWidth(lastTimeStringSec) + 1, + ctimePosTop + g.getFontHeight()); + } + // Draw the current seconds. + g.drawString(timestringSec, ctimePosLeftSec, ctimePosTop); + lastTimeStringSec = timestringSec; + + if (datestring != lastDateString) { + // Set Font + g.setFont(fontName, fontSize); + var cdatePosLeft = cdatePosCenter - g.stringWidth("1234-56-78") / 2; + if (lastDateString) { + // Clear the area where we want to draw the time. + //g.setBgColor("#FF6600"); // for debugging + g.clearRect(cdatePosLeft, + cdatePosTop, + cdatePosLeft + g.stringWidth(lastDateString) + 1, + cdatePosTop + g.getFontHeight()); + } + // Draw the current date. + g.setColor(colorDate); + //g.setFontAlign(0, -1, 0); // Align following string to bottom right. + g.drawString(datestring, cdatePosLeft, cdatePosTop); + lastDateString = datestring; + } +} + +function drawLine(x1, y1, x2, y2, color) { + g.setColor(color); + // On high-bpp devices, use anti-aliasing. Low-bpp (Bangle.js 2) doesn't clear nicely with AA. + if (bpp > 3 && g.drawLineAA) { + g.drawLineAA(x1, y1, x2, y2); + } + else { + g.drawLine(x1, y1, x2, y2); + } +} + +function clearLine(x1, y1, x2, y2) { + drawLine(x1, y1, x2, y2, colorBg); +} + +function drawAnalogClock(curDate) { + // Reset the state of the graphics library. + g.reset(); + g.setBgColor(colorBg); + // Init variables for drawing any seconds we have not drawn. + // If minute changed, we'll set for the full wheel below. + var firstDrawSecond = lastAnalogDate ? lastAnalogDate.getSeconds() + 1 : curDate.getSeconds(); + var lastDrawSecond = curDate.getSeconds(); + if (!lastAnalogDate || curDate.getMinutes() != lastAnalogDate.getMinutes()) { + // Draw the main hour lines. + //g.setColor("#9C9CFF"); + //g.drawCircle(clockCtrX, clockCtrY, analogRad); + for (let i = 0; i < 60; i = i + 15) { + let edgeX = clockCtrX + analogRad * Math.sin(i * Math.PI / 30); + let edgeY = clockCtrY - analogRad * Math.cos(i * Math.PI / 30); + let innerX = clockCtrX + (analogRad - analogMainLineLength) * Math.sin(i * Math.PI / 30); + let innerY = clockCtrY - (analogRad - analogMainLineLength) * Math.cos(i * Math.PI / 30); + drawLine(edgeX, edgeY, innerX, innerY, colorHours); + } + // Set for drawing the full second wheel. + firstDrawSecond = 0; + lastDrawSecond = 59; + } + // Draw the second wheel, or the parts of it that we haven't done yet. + for (let i = firstDrawSecond; i <= lastDrawSecond; i++) { + let edgeX = clockCtrX + analogRad * Math.sin(i * Math.PI / 30); + let edgeY = clockCtrY - analogRad * Math.cos(i * Math.PI / 30); + let innerX = clockCtrX + (analogRad - analogSubLineLength) * Math.sin(i * Math.PI / 30); + let innerY = clockCtrY - (analogRad - analogSubLineLength) * Math.cos(i * Math.PI / 30); + if (i <= curDate.getSeconds()) { + drawLine(edgeX, edgeY, innerX, innerY, colorSeconds); + } + else if (i % 5 == 0) { + drawLine(edgeX, edgeY, innerX, innerY, colorHours); + } + else { + clearLine(edgeX, edgeY, innerX, innerY); + } + } + if (lastAnalogDate) { + // Clear previous hands. + if (curDate.getMinutes() != lastAnalogDate.getMinutes()) { + // Clear hour hand. + let HhAngle = (lastAnalogDate.getHours() + lastAnalogDate.getMinutes() / 60) * Math.PI / 6; + let HhEdgeX = clockCtrX + analogHourHandLength * Math.sin(HhAngle); + let HhEdgeY = clockCtrY - analogHourHandLength * Math.cos(HhAngle); + clearLine(HhEdgeX, HhEdgeY, clockCtrX, clockCtrY); + // Clear minute hand. + let MhEdgeX = clockCtrX + analogMinuteHandLength * Math.sin(lastAnalogDate.getMinutes() * Math.PI / 30); + let MhEdgeY = clockCtrY - analogMinuteHandLength * Math.cos(lastAnalogDate.getMinutes() * Math.PI / 30); + clearLine(MhEdgeX, MhEdgeY, clockCtrX, clockCtrY); + } + } + if (!lastAnalogDate || curDate.getMinutes() != lastAnalogDate.getMinutes()) { + // Draw hour hand. + let HhAngle = (curDate.getHours() + curDate.getMinutes() / 60) * Math.PI / 6; + let HhEdgeX = clockCtrX + analogHourHandLength * Math.sin(HhAngle); + let HhEdgeY = clockCtrY - analogHourHandLength * Math.cos(HhAngle); + drawLine(HhEdgeX, HhEdgeY, clockCtrX, clockCtrY, colorHands); + // Draw minute hand. + let MhEdgeX = clockCtrX + analogMinuteHandLength * Math.sin(curDate.getMinutes() * Math.PI / 30); + let MhEdgeY = clockCtrY - analogMinuteHandLength * Math.cos(curDate.getMinutes() * Math.PI / 30); + drawLine(MhEdgeX, MhEdgeY, clockCtrX, clockCtrY, colorHands); + } + lastAnalogDate = curDate; +} + +function switchClockface() { + if (clockface == "digital") { + clockface = "analog"; + } + else { + clockface = "digital"; + } + // Clear whole lower area. + g.clearRect(clockAreaLeft,clockAreaTop,g.getWidth(),g.getHeight()); + lastTimeStringToMin = undefined; + lastTimeStringSec = undefined; + lastDateString = undefined; + lastAnalogDate = undefined; +} + +// Clear the screen once, at startup. +g.setBgColor(colorBg); +g.clear(); +// Draw LCARS borders. +// Upper section: rounded corner. +g.setColor(colorLCARSGray); +g.fillCircle(outRad, divisionPos - outRad, outRad); +g.fillRect(outRad, divisionPos - outRad, sbarWid + inRad, divisionPos); +g.fillRect(outRad, divisionPos - hbarHt, sbarWid + outRad, divisionPos); // div bar stub +g.fillRect(0, 0, sbarWid, divisionPos - outRad); // side bar +g.setColor(colorBg); // blocked out areas of corner +g.fillCircle(sbarWid + inRad + 1, divisionPos - hbarHt - inRad - 1, inRad); +g.fillRect(sbarWid + 1, divisionPos - outRad * 2, sbarWid + outRad, divisionPos - hbarHt - inRad); +// upper division bar +g.setColor(colorLCARSPurple); +g.fillRect(sbarWid + outRad + gap + 1, divisionPos - hbarHt, g.getWidth(), divisionPos); +// Lower section: rounded corner. +g.setColor(colorLCARSPink); +g.fillCircle(outRad, lowerTop + outRad, outRad); +g.fillRect(outRad, lowerTop, sbarWid + inRad, lowerTop + outRad); +g.fillRect(outRad, lowerTop, sbarWid + outRad, lowerTop + hbarHt); // div bar stub +g.fillRect(0, lowerTop + outRad, sbarWid, sbarGapPos); // side bar +g.setColor(colorBg); // blocked out areas of corner +g.fillCircle(sbarWid + inRad + 1, lowerTop + hbarHt + inRad + 1, inRad); +g.fillRect(sbarWid + 1, lowerTop + hbarHt + inRad, sbarWid + outRad, lowerTop + outRad * 2); +// lower division bar +g.setColor(colorLCARSOrange); +g.fillRect(sbarWid + outRad + gap + 1, lowerTop, g.getWidth(), lowerTop + hbarHt); +// second color of side bar +g.setColor(colorLCARSBrown); +g.fillRect(0, sbarGapPos + gap + 1, sbarWid, g.getHeight()); +// Draw immediately at first. +updateStardate(); +updateConventionalTime(); +// Make sure widgets can be shown. +//g.setColor("#FF0000"); g.fillRect(0, 0, g.getWidth(), widgetsHeight); // debug +Bangle.loadWidgets(); +Bangle.drawWidgets(); +// Show launcher on button press as usual for a clock face +Bangle.setUI("clock", Bangle.showLauncher); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower', on => { + if (on) { + redrawClock = true; + // Draw immediately to kick things off. + updateStardate(); + updateConventionalTime(); + } + else { + redrawClock = false; + } +}); +Bangle.on('touch', button => { + // button == 1 is left, 2 is right + switchClockface(); +}); diff --git a/apps/stardateclock/app.png b/apps/stardateclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..86426721b8492f302a1609de5246bed582b59689 GIT binary patch literal 594 zcmV-Y04Po1Q`WL9dB_KkEu?x$?kx_MMGC zmt+N$Qo#(x=+0(sSP$8=0N_9TPG2j(XcjWYpau}JAh|s$00-iBmPxNJXl@694uAy! zB1*3`OyXe}kgBA1S%D*p2sNXW>6X0jd)QL}07R5D@S-I&j$^Vf zou;W66N!}UQ!?LE5jyAj&08(YY8X8TRegFN4KjZA7!5QnDZAYe*g4P;R zN=PXeL_tK*S|e1xTYR$u0D#No0su2n#LSv4zS)mej4_KIF~-b+@gd6TJjPd)ZaP=< zTI+?~&uplt)_esjku@fZDYt3>tYzH=|B9xoK3e2WTr~in_mxs0qJK?XbqTq~G{$V& zkBAbP{j`Z=d_}3ue$vD-z9J{9_=AbR^Sr9dj2dVitH#JW{=>Px#07*qoM6N<$g0k`Wr2qf` literal 0 HcmV?d00001 diff --git a/apps/stardateclock/metadata.json b/apps/stardateclock/metadata.json new file mode 100644 index 000000000..8be981038 --- /dev/null +++ b/apps/stardateclock/metadata.json @@ -0,0 +1,23 @@ +{ + "id": "stardateclock", + "name":"Stardate Clock", + "shortName":"Stardate Clock", + "description": "A clock displaying a stardate along with a 'standard' digital/analog clock in LCARS design", + "version":"1.0", + "icon": "app.png", + "type":"clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name": "stardateclock.app.js","url": "app.js"}, + {"name": "stardateclock.img","url": "app-icon.js","evaluate": true} + ], + "screenshots": [ + {"url": "screenshot1.png"}, + {"url": "screenshot2.png"}, + {"url": "screenshot3.png"}, + {"url": "screenshot4.png"} + ] +} diff --git a/apps/stardateclock/screenshot1.png b/apps/stardateclock/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..98bd0cea3f25eccbdeced27f9b765b45ae467d72 GIT binary patch literal 3431 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 literal 0 HcmV?d00001 diff --git a/apps/stardateclock/screenshot2.png b/apps/stardateclock/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70c3f522117d08bc8c9671bdd6a01eba2a4a5f GIT binary patch literal 2354 zcmbtWc{H2b7XOkUh6+j>_2T8xit2#g<9TIcMu&;IST_u1>L-#%$B&bG4B zD$)P|$lBXkxk0l2&nYPZt*n+gUr4|r+-xm@x*^PGND+&$v_CHijd;m`TL2(AVQ*z| zKE`+DA^qM*ojq1FyXI{g1h%|jOntxa2Sz?>g@|8UYS2yZ_tDNB=p3I7f99LpX=gee z&ZonP(xj606UrAu*Q1g+fgnQs@jlO(E_%(px{DJGD7gg0M&GB-}+?eKQt zvzR{ZMv~iy#fZpv2Pog~-m4ZJ-z=dyevMPH(yCnl|dRj zT2K_MRONhecaELw9*L>>`uniswxJkG@S^+|E_0cS&k2qX6?m9y!@uttTcV!2h#5;M zI42xYtAQof<$L#qsa|atglv3O2h*;pe!h;_*7-%{{X5syk{$z!V6Tu_G!i~YJht4B zJ30g6xbewbsKy^ATh-HgoVg|}_ORh(x=NqfEU5MGB)!b9#q}o57FG8r>J1sPy68?- zA~EkaF_s41efnEf4Y^emGt^H}Wpfie`?}}}d8cj{gclz)T+3|P%-d3&?Bp~pOmTh` z`p^C=ntRC;24+z2hvUWQBwPbN>Q#Q=XWMtkO+Vp!)!8qUxDrakX@2KtvGO)amU{=C zAC`3+QDQS33@ocWA;wqBG}Jnsb@bZ)7#0Tn0h$qZV$UyYu6cZ!X8#tA=Kmau7qa?m zO?{8rzET}pYMK%WMnUXA*gtzO|>yq}LR z4!)qa7{bJi89OVGM?kohin~y-%mJp13f~)f_n=|D^xNx_DYGC$eXb2{>m%E$FFcts zk7f+7gLFe+7X0#>@dSNoC&(srG=IY+VPy3W4OTaEh`BbtG-?{O#w$Aw9OqoGJe648 ze(4qQiOiR<-oWkzg_!Ne@xUB!r}@oeF}*F{Ji?vKjjr1KBk`z6Yy8!>V)X2d;$Ux? zKJV}A!!Ze+=H}vNW&|dxYHi{o?xYKmr^;*2ZTQxFM^SscDacE)=6Pw}=wCoe@{ys! zfitdl;Y(!%6|$eEnXz6iWuXr#{!D)-;f40K(*|aSZ`GuzN}5w9k=%~=!!d6~OrKj5 zQiKMRyK%@_aHWWueI}L>@d=Eps+dkIw0RU;JU3cDP7LRnosGy!hhLS>!>~i`N?mx- z(s=-fm3jlaO5u5zwhuh{zI~0OYL}}H?&ip>r%~3^b!u}>9NODU2UAT4a1X>iCx3O< zgkxe%Q;$DOYrMc$QhjQg-zOf7VGBqK%Y_rnmQ~9t6KxZ2ig`+;-HN|q!IFt0)#SAT z?~XQ&_z+D+xNvoQ%xU87vLU4cJDWRaIyr9TIod-t9tyAGe*pU_p$Mu<-c>YzGs)fj zT{knq;~r{Hhse?!D254^R~*K7E)}|M(VJOVu*_nIt;cwc*gAc}hKX1tsLGLbkrKS* z!rI^gH&6bSeWs*7>R9AvwL`^T9@o?^$c;zgqQXEQzY;7V54gg#^=U3VKYOo4ach4B-zhW;bq zi|oicsW&(BYNlSi+K>EeU3r9)B(nH_(n=M>KMKwNjxb5nN_XCE!fX_e(nrTzh2Gr> zu;`TBXY!m1|8?wP9TsAjKtj#1z#r!t}wVPWxVTtU#~KdAcRw$x@^-A z?3qG?1Ctdw+iQ1uW0sfegHIbB_76a9xXPR9r;rhQ@?2NScpX3n{*R*$?inbGBYE4@Wr$gyf$MS6U= z@pQq}^?CTqHzyWfuHO43G^mq7krI#oY;A>PHx$eoQ~e(W+(htN+<4&001q4-Tm|IX zCF3q~C^5x&+aQr;r3WOz9kF=%E+7+ue7>Pa1bXQ(d=nf`{j@d%;&p&j z4*-esF~cY$Q8GG0+*w;JUiuACB#~!El~0C2r^%O%o&LL%1n)J})%*rhw}a01Mf25N zWWj5+uwA`{1T}TqPlX4ebnL}*3PY^e{q_O0hx*0Q+9{3o%?n=p&*xfwVrH$QOtktZ=iTD5FA%$Iz>;>%M?? z#CqPjqfEnD9(dep<4Dvw+I2!Eq6HZ9&zus*4)*&wV#X}ExHE8Sb|#*h?WmdzupJ^X zY==se1whg;Mv*iWEgnPldz>u_Y(G&TF>avJS#j8Nqr)qzE5P&Jj+~)wMz`CP{Gb0G Nz~0)~s?L&}{7+|NPYwV8 literal 0 HcmV?d00001 diff --git a/apps/stardateclock/screenshot3.png b/apps/stardateclock/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..7acb91d0a6a0abce308ccf2adbf0e81a5f4edabf GIT binary patch literal 4017 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 literal 0 HcmV?d00001 From b1382248789c37ea2a0af6d946a89827aa4d147c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 12:22:16 +0200 Subject: [PATCH 107/197] bwclk, lcars, notanalog and smpltmr uses now the new alarm library. --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 52 +++++++++------ apps/lcars/ChangeLog | 2 +- apps/lcars/README.md | 3 +- apps/lcars/lcars.app.js | 62 ++++++++++++------ apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/README.md | 2 +- apps/notanalog/notanalog.app.js | 56 +++++++++++++---- apps/qalarm/ChangeLog | 1 - apps/qalarm/lib.js | 108 -------------------------------- apps/qalarm/metadata.json | 3 +- apps/qalarm/qalarmcheck.js | 1 + apps/smpltmr/app.js | 40 ++++++++++-- apps/smpltmr/metadata.json | 4 +- 15 files changed, 164 insertions(+), 176 deletions(-) delete mode 100644 apps/qalarm/lib.js diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 85f01c8fe..83e4e97dd 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,7 +8,7 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "qalarm" app, you can directly set a timer. Simply tab at +If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. ## Thanks to diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 272f78ca8..967231648 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,3 +1,4 @@ +const TIMER_IDX = "bwclk"; const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); const storage = require('Storage'); @@ -75,41 +76,56 @@ function getSteps() { return 0; } - function isAlarmEnabled(){ try{ - var qalarm = require('qalarm'); - return qalarm.isTimerStarted("bwclk"); + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + } catch(ex){ } return false; } - function getAlarmMinutes(){ - try{ - var qalarm = require('qalarm'); - return qalarm.getTimerMin("bwclk"); - } catch(ex){ } - return -1; + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")+5; - qalarm.deleteTimer("bwclk"); - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); } catch(ex){ } } function decreaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")-5; - qalarm.deleteTimer("bwclk"); - if(mins > 0){ - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); } + + alarm.reload(); } catch(ex){ } } diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index dec0a4aa2..4935fe714 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,5 +16,5 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use qalarm for alarm functionality instead of own implementation. 0.19: Alarms can not go bigger than 100. +0.20: Use alarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index cf360d647..f506f96c4 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -3,7 +3,8 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected -with Gadgetbride and the weather app must be installed. +with Gadgetbride and the weather app must be installed. To use the timer +the "alarm" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 357070fdc..353cc62dd 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,7 +1,7 @@ +const TIMER_IDX = "lcars"; const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); const storage = require('Storage'); -const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -566,25 +566,56 @@ function getWeather(){ * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); - if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } @@ -612,15 +643,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled() && getAlarmMinutes() < 95){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } -} - - function feedback(){ Bangle.buzz(40, 0.3); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index b5d8e0a52..2fb17b550 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,7 +3,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.19", + "version":"0.20", "readme": "README.md", "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 3d6f1fce8..6515f787c 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use alarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 3a0963090..f4cf19ed6 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index fcd49af25..b7c81837d 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -1,11 +1,10 @@ /** * NOT ANALOG CLOCK */ - +const TIMER_IDX = "notanalog"; const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; -const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -394,25 +393,56 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("notanalog"); -} + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; + } function getAlarmMinutes(){ - return qalarm.getTimerMin("notanalog"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")+5; - qalarm.deleteTimer("notanalog"); - qalarm.editTimer("notanalog", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")-5; - qalarm.deleteTimer("notanalog"); - if(mins > 0){ - qalarm.editTimer("notanalog", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } function feedback(){ diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 424571439..b9be6039d 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,3 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js deleted file mode 100644 index 6d186d190..000000000 --- a/apps/qalarm/lib.js +++ /dev/null @@ -1,108 +0,0 @@ -let alarms = require("Storage").readJSON("qalarm.json", 1) || []; - -/** - * LIBRARY - */ - -function getCurrentTime() { - let time = new Date(); - return ( - time.getHours() * 3600000 + - time.getMinutes() * 60000 + - time.getSeconds() * 1000 - ); -} - -function getAlarmIndex(idx){ - for(var i=0; i= 0 && alarmIndex < alarms.length; - return exists; -} - -function isAlarmStarted(idx){ - if(!alarmExists(idx)){ - return false; - } - - var alarmIndex = getAlarmIndex(idx); - var time = new Date(); - var t = getCurrentTime(); - a = alarms[alarmIndex]; - return a.on && - t <= a.t && - a.last != time.getDate() && - (a.timer || a.daysOfWeek[time.getDay()]); -} - -function getTimerMin(idx){ - if(!isAlarmStarted(idx)){ - return 0; - } - - var alarmIndex = getAlarmIndex(idx); - var a = alarms[alarmIndex] ; - var diff = a.t - getCurrentTime(); - // let hrs = Math.floor(t / 3600000); - var mins = Math.round((diff / 60000) % 60); - // return hrs + ":" + ("0" + mins).substr(-2); - return mins; -} - -function reloadQalarm(){ - require("Storage").write("qalarm.json", JSON.stringify(alarms)); - eval(require("Storage").read("qalarmcheck.js")); - if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); -} - -function editTimer(idx, hrs, mins, secs){ - var alarmIndex = getAlarmIndex(idx); - var a = { - idx: idx, - on: true, - rp: false, - as: false, - hard: false, - }; - a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - - if(alarmExists(idx)){ - alarms[alarmIndex] = a; - } else { - alarms.push(a) - alarmIndex = alarms.length-1; - } - - reloadQalarm(); -} - -function deleteAlarm(idx){ - var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(idx)){ - return; - } - - alarms.splice(alarmIndex, 1); - reloadQalarm(); -} - - -// Export functions -exports.alarmExists = alarmExists; -exports.isAlarmStarted = isAlarmStarted; -exports.deleteAlarm = deleteAlarm; - -exports.timerExists = alarmExists; -exports.isTimerStarted = isAlarmStarted; -exports.getTimerMin = getTimerMin; -exports.editTimer = editTimer; -exports.deleteTimer = deleteAlarm; diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 1ab4f4192..326ba33a7 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,12 +3,11 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.05", + "version": "0.04", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ - { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 4976afb6f..8dac43800 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,6 +2,7 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ +print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 754fbae5b..f7717a2fc 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const qalarm = require('qalarm'); +const alarm = require("alarm"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -19,6 +19,33 @@ var minutes = 5; var interval; //used for the 1 second interval timer +function isTimerEnabled(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; +} + +function getTimerMin(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); +} + +function setTimer(minutes){ + alarm.setAlarm(TIMER_IDX, { + // msg : "Simple Timer", + timer : minutes*60*1000, + }); + alarm.reload(); +} + +function deleteTimer(){ + alarm.setAlarm(TIMER_IDX, undefined); + alarm.reload(); +} + setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -32,10 +59,11 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = qalarm.isTimerStarted(TIMER_IDX); + + var started = isTimerEnabled(); var text = minutes + " min."; if(started){ - var min = qalarm.getTimerMin(TIMER_IDX); + var min = getTimerMin(); text = min + " min."; } @@ -65,7 +93,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = qalarm.isTimerStarted(TIMER_IDX); + var started = isTimerEnabled(); if(isRight && !started){ minutes += 1; @@ -81,9 +109,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - qalarm.editTimer(TIMER_IDX, 0, minutes, 0); + setTimer(minutes); } else { - qalarm.deleteTimer(TIMER_IDX); + deleteTimer(); } Bangle.buzz(80, 0.6); } diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 4f0d473b4..feb841819 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -3,10 +3,10 @@ "name": "Simple Timer", "shortName": "Simple Timer", "version": "0.01", - "description": "A simple app to set a timer.", + "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"qalarm":"app"}, + "dependencies": {"alarm":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 280d5d1a8892e137067242a0bd42455a5b211bd2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 12:24:41 +0200 Subject: [PATCH 108/197] Removed dependency to qalarm --- apps/lcars/metadata.json | 1 - apps/notanalog/metadata.json | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 2fb17b550..7155442f8 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,6 @@ "icon": "lcars.png", "version":"0.20", "readme": "README.md", - "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 25cfa706d..0a291b180 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,6 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ From 6b55faae979849359138854bc858c2c530eef37e Mon Sep 17 00:00:00 2001 From: xxpasixx <62435140+xxpasixx@users.noreply.github.com> Date: Sat, 2 Apr 2022 13:49:14 +0200 Subject: [PATCH 109/197] Add new Icons Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) --- apps/messages/ChangeLog | 1 + apps/messages/app.js | 44 ++++++++++++++++++++++++++++--------- apps/messages/metadata.json | 2 +- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index ec5a85a8b..092a38eb6 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -42,3 +42,4 @@ 0.27: Add 'mark all read' option to popup menu (fix #1624) 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) +0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) diff --git a/apps/messages/app.js b/apps/messages/app.js index 6d37b5192..821813108 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -82,31 +82,45 @@ function getNegImage() { return atob("FhaBADAAMeAB78AP/4B/fwP4/h/B/P4D//AH/4AP/AAf4AB/gAP/AB/+AP/8B/P4P4fx/A/v4B//AD94AHjAAMA="); } /* -* icons should be 24x24px with 1bpp colors and transparancy +* icons should be 24x24px with 1bpp colors and 'Transparency to Color' +* http://www.espruino.com/Image+Converter */ function getMessageImage(msg) { if (msg.img) return atob(msg.img); var s = (msg.src||"").toLowerCase(); - if (s=="alarm" || s =="alarmclockreceiver") return atob("GBjBAP////8AAAAAAAACAEAHAOAefng5/5wTgcgHAOAOGHAMGDAYGBgYGBgYGBgYGBgYDhgYBxgMATAOAHAHAOADgcAB/4AAfgAAAAAAAAA="); + if (s=="alarm" || s =="alarmclockreceiver") return atob("GBjBAP////8AAAAAAAACAEAHAOAefng5/5wTgcgHAOAOGHAMGDAYGBgYGBgYGBgYGBgYDhgYBxgMATAOAHAHAOADgcAB/4AAfgAAAAAAAAA="); + if (s=="bibel") return atob("GBgBAAAAA//wD//4D//4H//4H/f4H/f4H+P4H4D4H4D4H/f4H/f4H/f4H/f4H/f4H//4H//4H//4GAAAEAAAEAAACAAAB//4AAAA"); if (s=="calendar") return atob("GBiBAAAAAAAAAAAAAA//8B//+BgAGBgAGBgAGB//+B//+B//+B9m2B//+B//+Btm2B//+B//+Btm+B//+B//+A//8AAAAAAAAAAAAA=="); + if (s=="corona-warn") return atob("GBgBAAAAABwAAP+AAf/gA//wB/PwD/PgDzvAHzuAP8EAP8AAPAAAPMAAP8AAH8AAHzsADzuAB/PAB/PgA//wAP/gAH+AAAwAAAAA"); + if (s=="discord") return atob("GBgBAAAAAAAAAAAAAIEABwDgDP8wH//4H//4P//8P//8P//8Pjx8fhh+fzz+f//+f//+e//ePH48HwD4AgBAAAAAAAAAAAAAAAAA"); if (s=="facebook") return getFBIcon(); + if (s=="gmail") return getNotificationImage(); + if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); if (s=="hangouts") return atob("FBaBAAH4AH/gD/8B//g//8P//H5n58Y+fGPnxj5+d+fmfj//4//8H//B//gH/4A/8AA+AAHAABgAAAA="); if (s=="home assistant") return atob("FhaBAAAAAADAAAeAAD8AAf4AD/3AfP8D7fwft/D/P8ec572zbzbNsOEhw+AfD8D8P4fw/z/D/P8P8/w/z/AAAAA="); if (s=="instagram") return atob("GBiBAAAAAAAAAAAAAAAAAAP/wAYAYAwAMAgAkAh+EAjDEAiBEAiBEAiBEAiBEAjDEAh+EAgAEAwAMAYAYAP/wAAAAAAAAAAAAAAAAA=="); - if (s=="gmail") return getNotificationImage(); - if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); + if (s=="kalender") return atob("GBgBBgBgBQCgff++RQCiRgBiQAACf//+QAACQAACR//iRJkiRIEiR//iRNsiRIEiRJkiR//iRIEiRIEiR//iQAACQAACf//+AAAA"); + if (s=="lieferando") return atob("GBgBABgAAH5wAP9wAf/4A//4B//4D//4H//4P/88fV8+fV4//V4//Vw/HVw4HVw4HBg4HBg4HBg4HDg4Hjw4Hj84Hj44Hj44Hj44"); if (s=="mail") return getNotificationImage(); if (s=="messenger") return getFBIcon(); - if (s=="outlook mail") return getNotificationImage(); + if (s=="nina") return atob("GBgBAAAABAAQCAAICAAIEAAEEgAkJAgSJBwSKRxKSj4pUn8lVP+VVP+VUgAlSgApKQBKJAASJAASEgAkEAAECAAICAAIBAAQAAAA"); + if (s=="outlook mail") return atob("HBwBAAAAAAAAAAAIAAAfwAAP/gAB/+AAP/5/A//v/D/+/8P/7/g+Pv8Dye/gPd74w5znHDnOB8Oc4Pw8nv/Dwe/8Pj7/w//v/D/+/8P/7/gf/gAA/+AAAfwAAACAAAAAAAAAAAA="); if (s=="phone") return atob("FxeBABgAAPgAAfAAB/AAD+AAH+AAP8AAP4AAfgAA/AAA+AAA+AAA+AAB+AAB+AAB+OAB//AB//gB//gA//AA/8AAf4AAPAA="); + if (s=="post & dhl") return atob("GBgBAPgAE/5wMwZ8NgN8NgP4NgP4HgP4HgPwDwfgD//AB/+AAf8AAAAABs7AHcdgG4MwAAAAGESAFESAEkSAEnyAEkSAFESAGETw"); + if (s=="signal") return atob("GBgBAAAAAGwAAQGAAhggCP8QE//AB//oJ//kL//wD//0D//wT//wD//wL//0J//kB//oA//ICf8ABfxgBYBAADoABMAABAAAAAAA"); if (s=="skype") return atob("GhoBB8AAB//AA//+Af//wH//+D///w/8D+P8Afz/DD8/j4/H4fP5/A/+f4B/n/gP5//B+fj8fj4/H8+DB/PwA/x/A/8P///B///gP//4B//8AD/+AAA+AA=="); if (s=="slack") return atob("GBiBAAAAAAAAAABAAAHvAAHvAADvAAAPAB/PMB/veD/veB/mcAAAABzH8B3v+B3v+B3n8AHgAAHuAAHvAAHvAADGAAAAAAAAAAAAAA=="); if (s=="sms message") return getNotificationImage(); - if (s=="threema") return atob("GBjB/4Yx//8AAAAAAAAAAAAAfgAB/4AD/8AH/+AH/+AP//AP2/APw/APw/AHw+AH/+AH/8AH/4AH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="); - if (s=="twitter") return atob("GhYBAABgAAB+JgA/8cAf/ngH/5+B/8P8f+D///h///4f//+D///g///wD//8B//+AP//gD//wAP/8AB/+AB/+AH//AAf/AAAYAAA"); + if (s=="snapchat") return atob("GBgBAAAAAAAAAH4AAf+AAf+AA//AA//AA//AA//AA//AH//4D//wB//gA//AB//gD//wH//4f//+P//8D//wAf+AAH4AAAAAAAAA"); + if (s=="teams") return atob("GBgBAAAAAAAAAAQAAB4AAD8IAA8cP/M+f/scf/gIeDgAfvvefvvffvvffvvffvvff/vff/veP/PeAA/cAH/AAD+AAD8AAAQAAAAA"); if (s=="telegram") return atob("GBiBAAAAAAAAAAAAAAAAAwAAHwAA/wAD/wAf3gD/Pgf+fh/4/v/z/P/H/D8P/Acf/AM//AF/+AF/+AH/+ADz+ADh+ADAcAAAMAAAAA=="); + if (s=="threema") return atob("GBjB/4Yx//8AAAAAAAAAAAAAfgAB/4AD/8AH/+AH/+AP//AP2/APw/APw/AHw+AH/+AH/8AH/4AH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="); + if (s=="to do") return atob("GBgBAAAAAAAAAAAwAAB4AAD8AAH+AAP/DAf/Hg//Px/+f7/8///4///wf//gP//AH/+AD/8AB/4AA/wAAfgAAPAAAGAAAAAAAAAA"); + if (s=="twitch") return atob("GBgBH//+P//+P//+eAAGeAAGeAAGeDGGeDOGeDOGeDOGeDOGeDOGeDOGeAAOeAAOeAAcf4/4f5/wf7/gf//Af/+AA/AAA+AAAcAA"); + if (s=="twitter") return atob("GhYBAABgAAB+JgA/8cAf/ngH/5+B/8P8f+D///h///4f//+D///g///wD//8B//+AP//gD//wAP/8AB/+AB/+AH//AAf/AAAYAAA"); if (s=="whatsapp") return atob("GBiBAAB+AAP/wAf/4A//8B//+D///H9//n5//nw//vw///x///5///4///8e//+EP3/APn/wPn/+/j///H//+H//8H//4H//wMB+AA=="); if (s=="wordfeud") return atob("GBgCWqqqqqqlf//////9v//////+v/////++v/////++v8///Lu+v8///L++v8///P/+v8v//P/+v9v//P/+v+fx/P/+v+Pk+P/+v/PN+f/+v/POuv/+v/Ofdv/+v/NvM//+v/I/Y//+v/k/k//+v/i/w//+v/7/6//+v//////+v//////+f//////9Wqqqqqql"); + if (s=="youtube") return atob("GBgBAAAAAAAAAAAAAAAAAf8AH//4P//4P//8P//8P5/8P4/8f4P8f4P8P4/8P5/8P//8P//8P//4H//4Af8AAAAAAAAAAAAAAAAA"); if (msg.id=="music") return atob("FhaBAH//+/////////////h/+AH/4Af/gB/+H3/7/f/v9/+/3/7+f/vB/w8H+Dwf4PD/x/////////////3//+A="); if (msg.id=="back") return getBackImage(); return getNotificationImage(); @@ -115,28 +129,38 @@ function getMessageImageCol(msg,def) { return { // generic colors, using B2-safe colors "alarm": "#fff", - "calendar": "#f00", "mail": "#ff0", "music": "#f0f", "phone": "#0f0", "sms message": "#0ff", // brands, according to https://www.schemecolor.com/?s (picking one for multicolored logos) // all dithered on B2, but we only use the color for the icons. (Could maybe pick the closest 3-bit color for B2?) + "bibel": "#54342c", + "discord": "#738adb", "facebook": "#4267b2", "gmail": "#ea4335", "google home": "#fbbc05", - "home assistant": "#fff", // ha-blue is #41bdf5, but that's the background "hangouts": "#1ba261", + "home assistant": "#fff", // ha-blue is #41bdf5, but that's the background "instagram": "#dd2a7b", + "liferando": "#ee5c00", "messenger": "#0078ff", + "nina": "#e57004", "outlook mail": "#0072c6", + "post & dhl": "#f2c101", + "signal": "#00f", "skype": "#00aff0", "slack": "#e51670", - "threema": "#000", + "snapchat": "#ff0", + "teams": "#464eb8", "telegram": "#0088cc", + "threema": "#000", + "to do": "#3999e5", + "twitch": "#6441A4", "twitter": "#1da1f2", "whatsapp": "#4fce5d", "wordfeud": "#e7d3c7", + "youtube": "#f00", }[(msg.src||"").toLowerCase()]||(def !== undefined?def:g.theme.fg); } diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index edc072714..dfeedaef7 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.29", + "version": "0.30", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 5781d4a7166bab112b3eafbaf4525f5055283908 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 14:43:27 +0200 Subject: [PATCH 110/197] Minor design improvements --- apps/bwclk/app.js | 8 ++++---- apps/bwclk/screenshot.png | Bin 2575 -> 2889 bytes apps/bwclk/screenshot_2.png | Bin 2892 -> 3152 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 967231648..7437293ae 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -148,13 +148,13 @@ function draw() { g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - dateStr = ("0"+dateStr).substr(-2); - g.drawString(dateStr, W/2, y+3); + dateStr = ("0" + dateStr).substr(-2); + g.drawString(dateStr, W/2-2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - g.drawString(locale.dow(date, true), W/2 + 5, y-22); - g.drawString(locale.month(date, 1), W/2 + 5, y); + g.drawString(locale.dow(date, true), W/2 + 10, y-23); + g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time g.setColor("#fff"); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 51f632ed36cd05f851968b66b1ec80d71e93c184..5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae 100644 GIT binary patch literal 2889 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 S@%}mqI11Xr-n_vSOZX44)xbyq delta 2873 zcmaJ@c{G%b_kW(ph?z<#6E!sUElWzap&`SFELpRTLX<2eWa)XP%o|bCO4iqs5>d%g zXp|(fj5Nk5#+nzyL>NNf`Tuv$@BVY|x#xWDz2~0$x%c)+f5G0?g|}|8u{3vy_2uRc zMvs?^CEZSw&xUndZkFZO@6KEJ!7d(-Ia@;l<*Y@_=#4Wis7&A} zh77Dk8*3$SVf@sKW;Ac!cO_i)(vmXWadlb7r+Ibr#*dwU6a23`O48kF?70-k0>5b;d zH8g6+#qVcEo$_s=`B&>W9!4sURhLQ@%?r($Z!{&q?8$bF z=?eWxVfL&jkFU}?Pm?v_spvKP4~y#7isNxoU&?^}xn>2PwW<;g$wysnLmzJEFe=7P zkdckqiT#W9;ou8p1OiCB4K~t-lp};@!*sC$4j-HZiSE$ZZ;jPJuqqlmyOv3v! zKmCQ_^?f>{k|zd>ixao_Gee6BbH-Y4XmyiaS}o;gwbL}IuQa68(D4j5sIo1bneTMqtR4=}qbhi}LiI8ue@w=xwgene6Oc zk7`G&U+7<0u0_i1+6&ds5D?UEGL=Ilx|zk550@!sKs`Vh5(FP6>!Rr_W@kG z`@3^Z)@DrBH;Mzg3X6A%LLKU0k-bCW3sdAL$cU4I3d`oB%q5o=hpVU*M)u2HF-mt| z+a9|t$w5;THMWosJy}oNmRmPljF_c{BXb7ce191LbeMx7o^_>kN>UrT)casopSSUDWPqZaG zJx9{6QjDn<+E;_B^W**o;@?~suKOVJ-`R>BCay$yte*d>wX4Tf-$-qn8yfv zDgXH^kjg3#DARA8mWHNf@tNW$AWCX?U2eH!wnPuING|8peo0R z-SpnW@Tk~kbX<&=gt`^;{5H@Y!^^<3Y5F@_)3MifT?4ije3=Sk94H#gy^}`F6^;-v zuzV`O^s7vS<)^e;r650SFEvNj_Hggdt_AyxKd~0_+_MPde9~*@;SGxZ%!3in=f45l z-MWgKb4`*JAG5%!zEyEUiM_{bYp08*g#91GAwW}f_RKc@!Y+1q=N8u5RY?d}BbPue zq-Qe{=dqbVksFIrto024@%|pSwgGBl==&kLWM#jZ=wkPT-w8`$qvWPG0|^t|wEl#n zwoZ(4Lhc1Ck(w{}W%;kzPnYQ@N{^az2QH6vLJ{*`NwTb?txA5jF?&iR!TC_61P9OK zNnn%7FXCxCjasA7b}`&Qin8vZc2b^2Fx4EC<1Q-RnmOcI@$&fgs@>z{*dmiEEN6z_ z=5WsF4L*9VcyfXs)`CYUUBp~1<6cL*bp;)E+ z8Vxjwh{0~;!=GKT`t(n!ehCYVY|N}Phkq^>6`Q|_8+ZzU(HQbdqkzYaYZs$R1u%8| zj};9fvNGMx$i;|LN|C7HX8<_#?1*)Yz?}>ACJI(}Y~>~n{_%g%=^%gYv^{r+Y_4%{ z;$0{ZWNxk*D)vkbmlIh%)6^D1sNOVl(pQWU{;%FHRMxe_4oWH*t_Z$!@SxV_tHfg< z&Q(bZmq8-_Ea;TD`7Af}@Q(8dm5DM)(bnoWy6pAWt07}WoZv;`nAO027^sVj+`oFR z`9&I)SllU;A``MGjg&m>U$XRa!fAT2zn71FZ!YeXm$WulHc%xN3bI8RloD(+_dDjY2s3w)uuRTncaA9WbX@RK+<8Dn65 zK4(9r@Nxsh$rXMuG`9B}Y!n}vCpPco4mEHJh8EhLwGvR$+<{bXQ1p{wsRn>!@>yYW zx5VkllOO)k9Hi>=xZj0r@83Xl6#lt)hS`nQWl_(VOG+3hSh*2P8hV9hO-aeqO|S4N z$*C>3yNY7MOOzb1|D2HW)lyCg&m*uB&*YuL^K2GV`%3q;DH~V8eY6s2#jGEz0ag3T zNkl4wOm8obsPtuZp$MfG&)DHUsuz8~F-b_{qayu|1)Ogk)vh7S|8f_&7J(0P*m#uY zA-(6ky_!@0toXwz`V&^0MccAeJw!oU*!X?+dlp}u7>6iFTKmPgy(33vct`;GW8SAj z=&8nGmXo*;XIPH%lq}hH2QFs4TBbW0xg{Cu)17#M+I9gV%U5$wmNLG#L*?9@lc{&n zoUBi@p^qd4ZiPFn-byQ^nj?v4AI#F-I4_&;yci4Yn-YtJ8dkG7q4a*;R6p@(%X zkP_u0KEcz@fsj7`<6hBdTo*F9Ubx_NZy?a~r4YRDAam|oW2yKn%*@T1C2P*>DQ@A3 z5j&*$qc|D^ZGS^-+`cj=Or3+ z59TUh|2cC@&QJKvSG%u5`!7kS>+Rty5N9U#NV!9dvb$D_GtzQLpjjs!y1_yEz{tkN zmgg|9s7uDj&^EFVxW!aUH9L{6CKM4s)ss?{q>NjdLs0#5;;HhN>cUmE#4P&#$@>e9YK-u*4JWp zRjq2;$PKSav(FF_6SlnWlAO8ax@eUwGfx$4dQwQ`VP3SZNY^Z_@LLs}H1~jE)3k;> z^o#nV1xx(|a@f){T9KI-L;(1(n6{=J_Q?EIhN4r)H9&PsCa*m;1<+wz1pD`~J4&uR z76!4}qjTETL0o^dP7_Nsf}?KP@-cg2T}EeRaX&hOW5g5P!Tp#WRs8tB_3op~7p+jS z<{~u!?)4>kx`R7qf#f}Y#qF*5kfU)l=kurFj2=>J9Ok=VI35ON0k8wg@WP*nVj0=W zL-nwrIV8Y32N$vR*ZdttIvTKQw&dpZoMae@b8Je*Jy}ZeVf)s|J2^H#>5{kmFOUs% zJpUwfMcE@S2PHV@n9=edlGIGzf<3O!h0v`O{8op36Ro2&ijNI(u?EBBr~7VXMGO9) zmcnWXRTs6INzemTgi56F^pcKG<7izOwF&^#_Ayg&Kt2;ggg1r!#BQe~pUXW72*ieD KZ~5GUa`k^eCtXwk From 2aac234b42b827de1fb976a11dca3029ec65b9cb Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 2 Apr 2022 14:25:41 +0100 Subject: [PATCH 111/197] Daisy 0.06 changed Steps to STEPS, enahnced contrast when using light theme --- apps/daisy/ChangeLog | 1 + apps/daisy/README.md | 3 ++- apps/daisy/app.js | 25 ++++++++++++++++--------- apps/daisy/metadata.json | 4 ++-- apps/daisy/screenshot_daisy2.jpg | Bin 4775 -> 0 bytes apps/daisy/screenshot_daisy2.png | Bin 0 -> 1246 bytes apps/daisy/screenshot_daisy3.png | Bin 0 -> 3265 bytes 7 files changed, 21 insertions(+), 12 deletions(-) delete mode 100644 apps/daisy/screenshot_daisy2.jpg create mode 100644 apps/daisy/screenshot_daisy2.png create mode 100644 apps/daisy/screenshot_daisy3.png diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 26396b75c..d1778dde9 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -3,3 +3,4 @@ 0.03: fix metadata.json to allow setting as clock 0.04: added heart rate which is switched on when cycled to it through up/down touch on rhs 0.05: changed text to uppercase, just looks better, removed colons on text +0.06: better contrast for light theme, use fg color of dithered ring color diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 12a55ddfd..491ed697f 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -28,5 +28,6 @@ See [#1248](https://github.com/espruino/BangleApps/issues/1248) ## Screenshots ![](screenshot_daisy1.png) +![](screenshot_daisy3.png) -It is worth looking at the real thing though as the screenshot does not do it justice. +It is worth looking at the real thing though as the screenshots do not do it justice. diff --git a/apps/daisy/app.js b/apps/daisy/app.js index cf0287616..7c513726f 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -41,10 +41,17 @@ Graphics.prototype.setFontRoboto20 = function(scale) { }; function assignPalettes() { - // palette for 0-40% - pal1 = new Uint16Array([g.theme.bg, g.toColor(settings.gy), g.toColor(settings.fg), g.toColor("#00f")]); - // palette for 50-100% - pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.toColor(settings.gy), g.toColor("#00f")]); + if (g.theme.dark) { + // palette for 0-40% + pal1 = new Uint16Array([g.theme.bg, g.toColor(settings.gy), g.toColor(settings.fg), g.toColor("#00f")]); + // palette for 50-100% + pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.toColor(settings.gy), g.toColor("#00f")]); + } else { + // palette for 0-40% + pal1 = new Uint16Array([g.theme.bg, g.theme.fg, g.toColor(settings.fg), g.toColor("#00f")]); + // palette for 50-100% + pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.theme.fg, g.toColor("#00f")]); + } } function setSmallFont20() { @@ -109,10 +116,10 @@ function updateSunRiseSunSet(now, lat, lon, line){ const infoData = { ID_DATE: { calc: () => {var d = (new Date()).toString().split(" "); return d[2] + ' ' + d[1] + ' ' + d[3];} }, ID_DAY: { calc: () => {var d = require("locale").dow(new Date()).toLowerCase(); return d[0].toUpperCase() + d.substring(1);} }, - ID_SR: { calc: () => 'Sunrise ' + sunRise }, - ID_SS: { calc: () => 'Sunset ' + sunSet }, - ID_STEP: { calc: () => 'Steps ' + getSteps() }, - ID_BATT: { calc: () => 'Battery ' + E.getBattery() + '%' }, + ID_SR: { calc: () => 'SUNRISE ' + sunRise }, + ID_SS: { calc: () => 'SUNSET ' + sunSet }, + ID_STEP: { calc: () => 'STEPS ' + getSteps() }, + ID_BATT: { calc: () => 'BATTERY ' + E.getBattery() + '%' }, ID_HRM: { calc: () => hrmCurrent } }; @@ -225,7 +232,7 @@ function drawSteps() { setSmallFont(); g.setFontAlign(0,0); g.setColor(g.theme.fg); - g.drawString('Steps ' + getSteps(), w/2, (3*h/4) - 4); + g.drawString('STEPS ' + getSteps(), w/2, (3*h/4) - 4); drawingSteps = false; } diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 15a24592c..6225db055 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,13 +1,13 @@ { "id": "daisy", "name": "Daisy", - "version":"0.05", + "version":"0.06", "dependencies": {"mylocation":"app"}, "description": "A clock based on the Pastel clock with large ring guage for steps", "icon": "app.png", "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], - "screenshots": [{"url":"screenshot_daisy2.jpg"}], + "screenshots": [{"url":"screenshot_daisy2.png"}], "readme": "README.md", "storage": [ {"name":"daisy.app.js","url":"app.js"}, diff --git a/apps/daisy/screenshot_daisy2.jpg b/apps/daisy/screenshot_daisy2.jpg deleted file mode 100644 index fec6a4c7b82c9dd40f3993017eb3edaa1a457b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4775 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 diff --git a/apps/daisy/screenshot_daisy2.png b/apps/daisy/screenshot_daisy2.png new file mode 100644 index 0000000000000000000000000000000000000000..3636f376652628060fe0dedd8b4d631bfc44c7f5 GIT binary patch literal 1246 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 Date: Sat, 2 Apr 2022 14:43:10 +0100 Subject: [PATCH 112/197] Daisy 0.06 changed Steps to STEPS, enhanced contrast when using light theme --- apps/daisy/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 6225db055..85cefeaf2 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -7,7 +7,7 @@ "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], - "screenshots": [{"url":"screenshot_daisy2.png"}], + "screenshots": [{"url":"screenshot_daisy3.png"}], "readme": "README.md", "storage": [ {"name":"daisy.app.js","url":"app.js"}, From b28478f1d9f087f67923d731181994885f03f96d Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 2 Apr 2022 14:56:54 +0100 Subject: [PATCH 113/197] Daisy 0.06 changed Steps to STEPS, enhanced contrast when using light theme --- apps/daisy/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 85cefeaf2..5073db603 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -2,7 +2,7 @@ "name": "Daisy", "version":"0.06", "dependencies": {"mylocation":"app"}, - "description": "A clock based on the Pastel clock with large ring guage for steps", + "description": "A beautiful digital clock with large ring guage, idle timer and a cyclic information line that includes, day, date, steps, battery, sunrise and sunset times", "icon": "app.png", "type": "clock", "tags": "clock", From 79db8ba05d22c06746c1e1f0175e698c0fea77bd Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 15:59:44 +0200 Subject: [PATCH 114/197] V0.03 - Use theme of bangle. --- apps/bwclk/ChangeLog | 5 +++-- apps/bwclk/README.md | 14 +++++++++++--- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_3.png | Bin 0 -> 3005 bytes 5 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 apps/bwclk/screenshot_3.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 1e1f155bb..ce0443d4b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,2 +1,3 @@ -0.01: New App! -0.02: Use build in function for steps and other improvements. \ No newline at end of file +0.01: New App. +0.02: Use build in function for steps and other improvements. +0.03: Adapt colors based on the theme of the user. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 83e4e97dd..62df9a2d9 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,15 +2,23 @@ ![](screenshot.png) - +## Fullscreen mode In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) -Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "alarm" app, you can directly set a timer. Simply tab at + +## Custom theme +If you switch the light/dark theme on your bangle, the design changes accordingly: + +![](screenshot_3.png) + +## Other features +- Lock icon: Show lock icon in fullscreen mode +- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. + ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7437293ae..91eddc468 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -138,13 +138,13 @@ function draw() { var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#000"); + g.setColor(g.theme.fg); g.fillRect(0,y,W,H); // Draw date y -= settings.fullscreen ? 5 : 0; var date = new Date(); - g.setColor("#000"); + g.setColor(g.theme.fg); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); @@ -157,7 +157,7 @@ function draw() { g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time - g.setColor("#fff"); + g.setColor(g.theme.bg); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); @@ -174,7 +174,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor("#000"); + g.setColor(g.theme.bg); g.drawImage(imgLock, 2, 2); } @@ -189,7 +189,9 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); +var bgOrig = g.theme.bg +var fgOrig = g.theme.fg +g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); // draw immediately at first, queue update draw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 3fe04c4d5..366622eeb 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.02", + "version": "0.03", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_3.png b/apps/bwclk/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfb5efe87cbeb9cc01bff74ac63ec7794b98e45 GIT binary patch literal 3005 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 literal 0 HcmV?d00001 From 43a052374c4542019785e34fea17d66f45bd43bc Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 2 Apr 2022 15:00:27 +0100 Subject: [PATCH 115/197] Daisy 0.06 changed Steps to STEPS, enhanced contrast when using light theme --- apps/daisy/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index d1778dde9..d5844c62b 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -3,4 +3,4 @@ 0.03: fix metadata.json to allow setting as clock 0.04: added heart rate which is switched on when cycled to it through up/down touch on rhs 0.05: changed text to uppercase, just looks better, removed colons on text -0.06: better contrast for light theme, use fg color of dithered ring color +0.06: better contrast for light theme, use fg color instead of dithered for ring From 240a14c715138eb5723957d73696bcc424ee8542 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:19:47 +0200 Subject: [PATCH 116/197] Hide steps --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/README.md | 6 ++++++ apps/bwclk/app.js | 31 ++++++++++++++++++++++++------- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_4.png | Bin 0 -> 2958 bytes apps/bwclk/settings.js | 25 +++++++++++++++++-------- 6 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ce0443d4b..ba8fd775b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. -0.03: Adapt colors based on the theme of the user. \ No newline at end of file +0.03: Adapt colors based on the theme of the user. +0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 62df9a2d9..d2ad03c09 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -13,6 +13,12 @@ If you switch the light/dark theme on your bangle, the design changes accordingl ![](screenshot_3.png) +## Show / Hide steps +Optionally, you can hide the steps in the settings. + +![](screenshot_4.png) + + ## Other features - Lock icon: Show lock icon in fullscreen mode - Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 91eddc468..22dbdcf24 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,6 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, + showSteps: true, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -24,11 +25,19 @@ for (const key in saved_settings) { // Manrope font Graphics.prototype.setLargeFont = function(scale) { + // Actual height 49 (50 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAfwAAAAAAAAf/AAAAAAAAf/8AAAAAAAf//wAAAAAAP///AAAAAAP///8AAAAAP////wAAAAP////4AAAAP////8AAAAH////8AAAAH////8AAAAB////8AAAAAH///+AAAAAAf//+AAAAAAB//+AAAAAAAH/+AAAAAAAAf+AAAAAAAAB/AAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///gAAAAAD////4AAAAA/////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAA///////4AAD/4AAAH/wAAP+AAAAP/AAB/wAAAAf8AAH/AAAAA/4AAf4AAAAB/gAB/gAAAAH+AAP8AAAAAf4AA/wAAAAB/gAD/AAAAAH+AAP8AAAAAf4AAf4AAAAB/gAB/gAAAAH+AAH+AAAAA/4AAf8AAAAH/AAB/4AAAA/8AAD/4AAAH/wAAP/8AAH/+AAAf//////4AAA///////AAAB//////4AAAD//////AAAAH/////4AAAAP////+AAAAAP////gAAAAAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAB/wAAAAAAAAH/AAAAAAAAA/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAD/gAAAAAAAAP+AAAAAAAAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAfwAAAH8AAAD/AAAB/wAAAf8AAAP/AAAD/wAAB/8AAAf/AAAP/wAAD/8AAB//AAAf/wAAH/8AAD//AAA//gAAf/8AAD/wAAB//wAAf+AAAP//AAB/wAAB//8AAH+AAAP//wAAf4AAB///AAD/AAAP/v8AAP8AAB/8/wAA/wAAP/j/AAD/AAB/8P8AAH+AAH/g/wAAf4AA/8D/AAB/wAH/gP8AAH/AA/+A/wAAf/AP/wD/AAA//D/+AP8AAD////wA/wAAH///+AD/AAAP///wAP8AAAf//+AA/wAAA///wAD/AAAB//+AAP8AAAB//gAA/wAAAB/4AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAD+AAAAHwAAAf4AAAAfwAAB/gAAAB/gAAH+AAAAP/AAAf4AAAA/8AAB/gAAAD/4AAH+ADAAH/wAAf4AeAAP/AAB/gD+AAP8AAH+Af+AA/4AAf4D/4AB/gAB/gP/AAH+AAH+B/8AAf4AAf4P/wAB/gAB/h//AAH+AAH+P/8AAf4AAf5//wAB/gAB/v//gAP+AAH+//+AA/4AAf//f8AH/AAB//5/8B/8AAH//D////gAAf/4P///+AAB//Af///wAAH/4A///+AAAf/AB///wAAB/4AD//+AAAH/AAH//gAAAP4AAD/4AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAA/+AAAAAAAAP/4AAAAAAAH//gAAAAAAB//+AAAAAAAf//4AAAAAAH///gAAAAAB///+AAAAAAf///4AAAAAH//9/gAAAAD///H+AAAAA///wf4AAAAP//8B/gAAAD///AH+AAAA///wAf4AAAH//8AB/gAAAf//AAH+AAAB//gAAf4AAAH/4AAB/gAAAf+AAAH+AAAB/gAf///8AAH4AB////wAAeAAH////AABgAAf///8AAAAAB////wAAAAAH////AAAAAAf///8AAAAAB////wAAAAAH////AAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAeAAAAAf//AB+AAAH///+AP8AAAf///4A/4AAB////gD/wAAH////Af/gAAf///8B/+AAB////wB/8AAH///+AB/wAAf4Af4AD/gAB/gB/AAP+AAH+AP8AAf4AAf4A/wAB/gAB/gD+AAH+AAH+AP4AAf4AAf4A/gAB/gAB/gD/AAH+AAH+AP8AAf4AAf4A/wAD/gAB/gD/gAf8AAH+AH/AD/wAAf4Af/Af+AAB/gB////4AAH+AD////AAAf4AH///8AAB/gAP///gAAH+AA///8AAAAAAA///AAAAAAAB//4AAAAAAAB/+AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///gAAAAAB////4AAAAAf////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAAf//////4AAD/4D/wH/wAAP+AP8AP/AAB/wB/gAf8AAH/AH8AA/4AAf4A/wAB/gAB/gD/AAH+AAH8AP4AAf4AA/wA/gAB/gAD/AD+AAH+AAH8AP8AAf4AAf4A/wAB/gAB/gD/AAP+AAH+AP+AB/wAAf8Af8AP/AAA/4B/8B/8AAD/gH////gAAP8AP///8AAAfgAf///wAAA8AB///+AAADgAD///wAAAAAAD//+AAAAAAAH//gAAAAAAAH/4AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAH+AAAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAf4AAAAADgAB/gAAAAA+AAH+AAAAAf4AAf4AAAAH/gAB/gAAAD/+AAH+AAAA//4AAf4AAAf//gAB/gAAH//+AAH+AAD///wAAf4AA///8AAB/gAf//+AAAH+AH///gAAAf4D///wAAAB/g///8AAAAH+f//+AAAAAf////gAAAAB////wAAAAAH///8AAAAAAf//+AAAAAAB///gAAAAAAH//wAAAAAAAf/8AAAAAAAB/+AAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAB/wB//wAAAAf/wf//gAAAD//z///AAAAf/////+AAAD//////8AAAf//////4AAD///////gAAP////w//AAB/+f/8Af8AAH/Af/gA/4AAf4A/8AD/gAB/gB/wAH+AAP8AH+AAf4AA/wAf4AB/gAD/AB/gAH+AAP8AH+AAf4AA/wAf4AB/gAB/gB/wAH+AAH+AP/AAf4AAf8A/+AD/gAB/8f/8Af8AAD////4H/wAAP//////+AAAf//////4AAA///////AAAD//////8AAAH//z///gAAAH/+H//4AAAAH/gH//AAAAAAAAH/wAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAP/wAAAAAAAD//wAAAAAAAf//wAAAAAAH///gABgAAA////AAPAAAD///+AB+AAAf///4AP4AAD////wB/wAAP/AP/AH/AAB/4Af+AP+AAH/AA/4A/4AAf4AB/gB/gAB/gAH+AH+AAP8AAP4Af4AA/wAA/gB/gAD/AAD+AH+AAP8AAP4Af4AA/4AB/gB/gAB/gAH+AH+AAH+AAfwA/4AAf8AD/AH/AAB/4Af4A/8AAD/4H/gP/wAAP//////+AAAf//////wAAA///////AAAB//////4AAAD//////AAAAH/////wAAAAH////+AAAAAH////AAAAAAAf/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ExwqHCYlJyYoIicoFg=="), 64+(scale<<8)+(1<<16)); + return this; +}; + + +Graphics.prototype.setMediumFont = function(scale) { // Actual height 41 (42 - 2) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); return this; }; + Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -146,7 +155,7 @@ function draw() { var date = new Date(); g.setColor(g.theme.fg); g.setFontAlign(1,1); - g.setLargeFont(); + g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); g.drawString(dateStr, W/2-2, y+3); @@ -158,23 +167,31 @@ function draw() { // Draw time g.setColor(g.theme.bg); - g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; + + if(!isAlarmEnabled() && !settings.showSteps){ + y += 8; + g.setLargeFont(); + } else { + g.setMediumFont(); + } + g.drawString(timeStr, W/2, y); // Draw steps or timer y += H/5*2; - g.setSmallFont(); g.setFontAlign(0,0); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); - + if(isAlarmEnabled() || settings.showSteps){ + g.setSmallFont(); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + } // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor(g.theme.bg); + g.setColor(g.theme.fg); g.drawImage(imgLock, 2, 2); } diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 366622eeb..9c81bd5cc 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.03", + "version": "0.04", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..db36a2088c06f3665d1b512ac14d1d9c8a884562 GIT binary patch literal 2958 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 N (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + }, + 'Show Steps': { + value: settings.showSteps, + format: () => (settings.showSteps ? 'Yes' : 'No'), + onchange: () => { + settings.showSteps = !settings.showSteps; + save(); + }, + }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), @@ -27,14 +44,6 @@ settings.showLock = !settings.showLock; save(); }, - }, - 'Full Screen': { - value: settings.fullscreen, - format: () => (settings.fullscreen ? 'Yes' : 'No'), - onchange: () => { - settings.fullscreen = !settings.fullscreen; - save(); - }, } }); }) From 893e45805ed731b7f639c63bfcffe2295e574511 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:54:16 +0200 Subject: [PATCH 117/197] Circle through information --- apps/bwclk/README.md | 28 +++---------- apps/bwclk/app.js | 78 +++++++++++++++++++++++++++++++----- apps/bwclk/screenshot.png | Bin 2889 -> 2958 bytes apps/bwclk/screenshot_3.png | Bin 3005 -> 0 bytes apps/bwclk/screenshot_4.png | Bin 2958 -> 0 bytes apps/bwclk/settings.js | 9 ----- 6 files changed, 73 insertions(+), 42 deletions(-) delete mode 100644 apps/bwclk/screenshot_3.png delete mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index d2ad03c09..31cc60270 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,28 +2,12 @@ ![](screenshot.png) -## Fullscreen mode -In the settings, fullscreen mode can be enabled and disabled: - -![](screenshot_2.png) - - -## Custom theme -If you switch the light/dark theme on your bangle, the design changes accordingly: - -![](screenshot_3.png) - -## Show / Hide steps -Optionally, you can hide the steps in the settings. - -![](screenshot_4.png) - - -## Other features -- Lock icon: Show lock icon in fullscreen mode -- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at -top / bottom of the screen. - +## Features +- Fullscreen on/off +- The design is adapted to the theme of your bangle. +- Tab in middle of screen to show between different information. +- Enable / disable lock icon in the settings. +- If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 22dbdcf24..2714a6492 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,7 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, - showSteps: true, + showInfo: 0, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -85,6 +85,40 @@ function getSteps() { return 0; } + +function getWeather(){ + var weatherJson; + + try { + weatherJson = storage.readJSON('weather.json'); + var weather = weatherJson.weather; + + // Temperature + weather.temp = locale.temp(weather.temp-273.15); + + // Humidity + weather.hum = weather.hum + "%"; + + // Wind + const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); + weather.wind = Math.round(wind[1]) + " km/h"; + + return weather + + } catch(ex) { + // Return default + } + + return { + temp: "??? °C", + hum: "-", + txt: "-", + wind: "??? km/h", + wdir: "-", + wrose: "-" + }; +} + function isAlarmEnabled(){ try{ var alarm = require('alarm'); @@ -171,7 +205,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && !settings.showSteps){ + if(!isAlarmEnabled() && settings.showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -180,13 +214,32 @@ function draw() { g.drawString(timeStr, W/2, y); - // Draw steps or timer + // Draw info or timer y += H/5*2; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showSteps){ + if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); + + var infoStr = ""; + if(isAlarmEnabled()){ + infoStr = "T-" + getAlarmMinutes() + " min."; + } else if (settings.showInfo == 1){ + infoStr = E.getBattery() + "%"; + } else if (settings.showInfo == 2){ + infoStr = getSteps() + infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead + infoStr = infoStr + "k steps"; + } else if (settings.showInfo == 3){ + infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + } else if (settings.showInfo == 4){ + var weather = getWeather(); + infoStr = weather.temp; + } else if (settings.showInfo == 5){ + var weather = getWeather(); + infoStr = weather.wind; + } + + g.drawString(infoStr, W/2, y); } // Draw lock @@ -205,14 +258,12 @@ function draw() { Bangle.loadWidgets(); -// Clear the screen once, at startup +// Clear the screen once, at startup and set the correct theme. var bgOrig = g.theme.bg var fgOrig = g.theme.fg g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); -// draw immediately at first, queue update draw(); - // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -223,14 +274,12 @@ Bangle.on('lcdPower',on=>{ } }); - Bangle.on('lock', function(isLocked) { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); }); - Bangle.on('touch', function(btn, e){ var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; @@ -249,6 +298,13 @@ Bangle.on('touch', function(btn, e){ decreaseAlarm(); draw(true); } + + if(!is_lower && !is_upper){ + Bangle.buzz(40, 0.6); + settings.showInfo = (settings.showInfo+1) % 6; + storage.write(SETTINGS_FILE, settings); + draw(true); + } }); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae..db36a2088c06f3665d1b512ac14d1d9c8a884562 100644 GIT binary patch literal 2958 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 N3|)15gx^X$&E|DD}W`+J@%o*p=92^9$d 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 diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png deleted file mode 100644 index db36a2088c06f3665d1b512ac14d1d9c8a884562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2958 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 N (settings.showSteps ? 'Yes' : 'No'), - onchange: () => { - settings.showSteps = !settings.showSteps; - save(); - }, - }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), From bb310a15c2127236eda79c2af3670f2842a19332 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:56:28 +0200 Subject: [PATCH 118/197] Minor design improvement --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2714a6492..66b3476f6 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -215,7 +215,7 @@ function draw() { g.drawString(timeStr, W/2, y); // Draw info or timer - y += H/5*2; + y += H/5*2-5; g.setFontAlign(0,0); if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); From 42c02763551e3dbec5efe2c2ca341a4cdfcde08a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:59:58 +0200 Subject: [PATCH 119/197] Updated screenshots, icon etc. --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 2 +- apps/bwclk/app.png | Bin 1795 -> 2116 bytes apps/bwclk/screenshot.png | Bin 2958 -> 2946 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a90e091fd..1df0fa6a5 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 66b3476f6..2ceb7c359 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -245,7 +245,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ g.setColor(g.theme.fg); - g.drawImage(imgLock, 2, 2); + g.drawImage(imgLock, W-16, 2); } // Draw widgets if not fullscreen diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index c7c42effa88b07093d74b0322dc1446e2b148818..5073f0ed0ee9f9c74536e8120360af8caf25aa46 100644 GIT binary patch delta 2088 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 N Date: Sat, 2 Apr 2022 15:59:39 -0400 Subject: [PATCH 120/197] New app 'bee', add game statistics to 'bordle' app. --- apps/bee/README.md | 34 + apps/bee/app-icon.js | 1 + apps/bee/app.png | Bin 0 -> 2145 bytes apps/bee/bee.app.js | 192 + apps/bee/bee_lindex.json | 1 + apps/bee/bee_screenshot.png | Bin 0 -> 1338 bytes apps/bee/bee_words_2of12 | 74578 ++++++++++++++++++++++++++++++++++ apps/bee/metadata.json | 16 + apps/bordle/bordle.app.js | 46 +- 9 files changed, 74861 insertions(+), 7 deletions(-) create mode 100644 apps/bee/README.md create mode 100644 apps/bee/app-icon.js create mode 100644 apps/bee/app.png create mode 100644 apps/bee/bee.app.js create mode 100644 apps/bee/bee_lindex.json create mode 100644 apps/bee/bee_screenshot.png create mode 100644 apps/bee/bee_words_2of12 create mode 100644 apps/bee/metadata.json diff --git a/apps/bee/README.md b/apps/bee/README.md new file mode 100644 index 000000000..1beece1af --- /dev/null +++ b/apps/bee/README.md @@ -0,0 +1,34 @@ + +# Spelling bee game + +Word finding game inspired by the NYT spelling bee. Find as many words with 4 or more letters (must include the +letter at the center of the 'hive'). + + +Usage: + - tap on letters to type out word + - swipe left to delete last letter + - swipe right to enter; the word will turn blue while is being checked against the internal dictionary; once + checked, it will turn red if the word is invalid, does not contain the central letter or has been guessed before or + green if it is a valid word; in the latter case, points will be awarded + - swipe down to shuffle the 6 outer letters + - swipe up to view a list of already guessed words; tap on any of them to return to the regular game. + + +Scoring: +The number of correctly guessed words is displayed on the bottom left, the score on the bottom right. A single point +is awarded for a 4 letter word, or the number of letters if longer. A pangram is a word that contains all 7 letters at +least once and yields an additional 7 points. Each game contains at least one pangram. + + +Technical remarks: +The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words'). The dictionary is fairly +large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat +slow. Because of its size it cannot be compressed (heatshrink needs to hold the compressed/uncompressed data in memory). +In order to make checking for the validity of a guessed word faster, an index file ('bee_lindex.json') is installed with +the app that facilitates faster word lookups. This index file is specific to the dictionary file used. If one were to +replace the dictionary file with a different version (e.g. a different language) the index file has to be regenerated. The easiest +way to do so is to delete (via the Web IDE or the fileman app on the watch) the file 'bee_lindex.json' - it will be regenerated (and saved, +i.e. it only happens once) on app startup automatically, a process that takes roughly 30 seconds. + +![Screenshot](./bee_screenshot.png) diff --git a/apps/bee/app-icon.js b/apps/bee/app-icon.js new file mode 100644 index 000000000..f3bf5dbb2 --- /dev/null +++ b/apps/bee/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AE2JAAIKHnc7DyNPp4vRGAwuBGB4sBAAQvSGIovPFqYvHGAYvDGBYsGGhwvGGIQvEGBQnDMYhkNGBAvOvQABqyRTF5GJr4wLFwQACX6IwLsowJLYMrldVGAQvTsoADGBITD0YvDldPF6n+F4gyGGAdP5nMF4KKBGDJZDGI7EBcoOiGAK7DGAQvYRogxEr1Pp9VMAiSBBILBWeJIxCromBMAQwDAAZfTGBQyCxOCGAIvBGIV/F7AwMAAOIp95GAYACFqoyQMAIwGF7QADEQd5FgIADqvGF8DnEAAIvFGIWjF8CFE0QwHAAQudAAK0EGBQuecw3GqpemYIxiCGIa8cF4wwHdTwvJp9/F82jGA9VMQovf5jkHGIwvg4wvIAAgvg5miF9wwNF8QABF9QwF0YuoF4oxCqoulGBAAB42i0QvjGBPMF0gwIFswwHF1IA/AH4A/AH4AL")) diff --git a/apps/bee/app.png b/apps/bee/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ed16c44b17415aba02d261f0a2b607713201f147 GIT binary patch literal 2145 zcmV-n2%h(eP)Wa%1m3q4yG15t;Mn9*n%jcZND%+5bH=Cs(m=LHV;Hh0tzBfAWDSr2!Vt=xJm9g z_ng%aF-XGA&5gNEXFB=MoDXO3|61$6_C9CtwKoi77{eF_!0oTA`M-!Ou{xir32y*y z0A2`NzSTd!PTHgKO8yj@FD`#Z<(aa(lYW7Sepx|F=FRiBb~fFlDz_utBtw%;8DNNx^Hbwc-cdR{?~gkR7GCxTn!pPboq@NJ1K(|gB9JS!giYDM7AG0apI(9 zMQ#I*09B&;ftq|^y4Hs;R_tyWR005NYr3{7a(ygL#8q~kayfaf&*Gyr7{2h-ckW1U z?Q8SYlKYn;y0&k7IBfAr-QhOZ3QdS6xG!S=1Aw^3BS0h;$72Yy#+u}(8@)$F$ad|( zFZ=SJT)a3H(I=XkTlo7s?^3p{hPtCCP*wbXANiL~ZnR``*4pFmfFRtt2@p^L41)S1^Bml6i(En>g^sR_05myP>&=^uaX>mE!>~N+-aop}? zE=d-yA8!)$o;UY-A}znUr?{xhvgK`Hb#_|Q4*{|=(;1VMah}+4x{199Kk0cbT~)ep zL_!h(C@_-lye!>lEXXjN$!P|cBnzYbf+{qGTn;uX4IvlHffS!Gcf3hfP(U@5_2xr! zTqxOjVAOtqtkkm@;v&G+Gp3P~opnCWk@}NFA`U>hVSB%oump}k#5BZb7-9xILVA+H zxDshx#@b5N79?T+XLwJuRP&2iRPeZ386v!_1s~007f8m^EV> zb7sw8!nm243YkG+(kO!|874umaJ=2+=-Ro~wMjBU4%V+x3$%x43`sLg}x&~E2&VS_b z?b_ws2#oL7p+L|pqy>b4M`*WQ%(3~TU3xif`?eW7K2EBickSs+L(~|Tb&8pJ2T4zE zLshUMKJ3Wn<(crFVNklIYFB40O#|)&eewK0O}0YTdVxCzV`n=MX+FmORd+FCN^AMU zch{9f7bq9r5@bbOJqidZ%@zxOxksxq@V?G6o0&0TU|&T(66%>KZ`| zQvjT<5W63p2f!71t(D6b)Xj~mLHLo(4gc{gO&}T`xcTZke*ehcH6D+f)6@3i-*Weq z?MS~IF%Z*4BVW`U8L9UBEAFiwJ37sp*xQpXmm93##uGDPr>F%bMZa?*^7Qm6?I$u) zt<0YGsT0qQ-tvCdNylX*uG`C|Gi;9kXH}MW$No|8`8*sQHPW^NJ~dF@e(XhOXFPEe zG6Rcln7u?rp9Q!wzqR70chwbN*njv~u;sD!d0us8z>Nv$^tf*R3tM;8#}j+VGjMlt z(KvxO5xf8m&4ILe*PM=cJnHM=q@~z_{M?SS+xMhJ6bZ!kDC=LUta&xw_;K$8{X3AA z2*I9rRZ^eYIO)T_yn;#XV^%FaAQ_|Vz5RRBzb1{eA0ABnA$>yKXW8aPgp|HY?!Wcu zj=5Jh7e=$&eK4i=FO}I%#~PC|ElUg)4jQ7bOe(K=Z6&zTZ2H5H5_o*k^luzG8vIv3 z-JMJBtUGXZL2ImXz{U0CNJ*&S%W4?XC$wT=ZLZ(z9_^<)Y29mI%iml+W?RhoVn^N3 z;>C~>F#YbBTZ>Pf?w240H&=|ku5@id)rm8KBhfjM6SX}~4DBa&<=p&hPhFLk64@P# z*4XTuy?ou&am&|Tw!Qp=jOwni`9+bY8jN8&Acpi0Xr=FaAa9&$^`0($y1;Q&qTNtL zgY7Z&xXvvFE_Bd$#B=<-ajJ(_fA zV0!-;@=mOk{#sx%z~SQ~4nDqqa?o+4-*USTj&G=_9uIu!yVN0XWQd%f{z*BZ{I$#W zC8dsxRL5njtY-+~ArT2UyZ~4|uPMoq%yp%Ei|(0U|E_6h^p&R@Exv$p(Y?@Mk&t3e zEB(&{Kfb74vA2DcQN6irj5M|R^7Mk6W)JeCBqo9Kk(n6QN5CbqXs6EjKWhzn zyIR}Kvcd-&A528-gdJ$KJW!0GTL51y8n6a$_*XKAm}lL1kMM|4O0dcyv4Is)-$>VGLs!|7Z9w XLWm}&-3OsD00000NkvXXu0mjfj8ZL+ literal 0 HcmV?d00001 diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js new file mode 100644 index 000000000..4989296e0 --- /dev/null +++ b/apps/bee/bee.app.js @@ -0,0 +1,192 @@ + +const S = require("Storage"); +var letters = []; +var letterIdx = []; + +var centers = []; + +var word = ''; + +var foundWords = []; +var score = 0; + +var intervalID = -1; + +function prepareLetterIdx () { + "compile" + var li = [0]; + if (S.read("bee_lindex.json")!==undefined) li = S.readJSON("bee_lindex.json"); // check for cached index + else { + for (var i=1; i<26; ++i) { + var prefix = String.fromCharCode(97+i%26); + console.log(prefix); + li.push(words.indexOf("\n"+prefix, li[i-1])+1); + } + li.push(words.length); + S.writeJSON("bee_lindex.json", li); + } + for (var i=0; i<26; ++i) letterIdx[i] = S.read("bee.words", li[i], li[i+1]-li[i]); +} + +function findWord (w) { + "compile" + var ci = w.charCodeAt(0)-97; + var f = letterIdx[ci].indexOf(w); + if (f>=0 && letterIdx[ci][f+w.length]=="\n") return true; + return false; +} + +function isPangram(w) { + var ltrs = ''; + for (var i=0; i=0) return false; // already found + if (findWord(w)) { + foundWords.push(w); + if (w.length==4) score++; + else score += w.length; + if (isPangram(w)) score += 7; + return true; + } + return false; +} + +function getHexPoly(cx, cy, r, a) { + var p = []; + for (var i=0; i<6; ++i) p.push(cx+r*Math.sin((i+a)/3*Math.PI), cy+r*Math.cos((i+a)/3*Math.PI)); + return p; +} + +function drawHive() { + w = g.getWidth(); + h = g.getHeight(); + const R = w/3.3; + centers = getHexPoly(w/2, h/2+10, R, 0); + centers.push(w/2, h/2+10); + g.clear(); + g.setFont("Vector", w/7).setFontAlign(0, 0, 0); + g.setColor(g.theme.fg); + for (var i=0; i<6; ++i) { + g.drawPoly(getHexPoly(centers[2*i], centers[2*i+1], 0.9*R/Math.sqrt(3), 0.5), {closed:true}); + g.drawString(String.fromCharCode(65+letters[i+1]), centers[2*i]+2, centers[2*i+1]+2); + } + g.setColor(1, 1, 0).fillPoly(getHexPoly(w/2, h/2+10, 0.9*R/Math.sqrt(3), 0.5)); + g.setColor(0).drawString(String.fromCharCode(65+letters[0]), w/2+2, h/2+10+2); +} + +function shuffleLetters(qAll) { + for (var i=letters.length-1; i > 0; i--) { + var j = (1-qAll) + Math.floor(Math.random()*(i+qAll)); + var temp = letters[i]; + letters[i] = letters[j]; + letters[j] = temp; + } +} + +function pickLetters() { + var ltrs = ""; + while (ltrs.length!==7) { + ltrs = []; + var j = Math.floor(26*Math.random()); + var i = Math.floor((letterIdx[j].length-10)*Math.random()); + while (letterIdx[j][i]!="\n" && i0) { + word = word.slice(0, -1); + drawWord(g.theme.fg); + } + if (d==1 && word.length>=4) { + drawWord("#00f"); + drawWord((checkWord(word.toLowerCase()) ? "#0f0" : "#f00")); + if (intervalID===-1) intervalID = setInterval(wordFound, 800); + } + if (e===1) { + shuffleLetters(0); + drawHive(); + drawScore(); + drawWord(g.theme.fg); + } + if (e===-1 && foundWords.length>0) showWordList(); +} + +function showWordList() { + Bangle.removeListener("touch", touchHandler); + Bangle.removeListener("swipe", swipeHandler); + E.showScroller({ + h : 20, c : foundWords.length, + draw : (idx, r) => { + g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1); + g.setFont("6x8:2").drawString(foundWords[idx].toUpperCase(),r.x+10,r.y+4); + }, + select : (idx) => { + setInterval(()=> { + E.showScroller(); + drawHive(); + drawScore(); + Bangle.on("touch", touchHandler); + Bangle.on("swipe", swipeHandler); + clearInterval(); + }, 100); + } + }); +} + +prepareLetterIdx(); +pickLetters(); +drawHive(); +drawScore(); +Bangle.on("touch", touchHandler); +Bangle.on("swipe", swipeHandler); diff --git a/apps/bee/bee_lindex.json b/apps/bee/bee_lindex.json new file mode 100644 index 000000000..e4fa13037 --- /dev/null +++ b/apps/bee/bee_lindex.json @@ -0,0 +1 @@ +[0,41048,80445,152390,198606,228714,257919,279071,303726,337982,343582,348026,367246,404452,419780,438696,496250,499697,544600,624304,659085,680996,691270,708186,708341,709916,710883] \ No newline at end of file diff --git a/apps/bee/bee_screenshot.png b/apps/bee/bee_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..cd173b9978f4c906fb63e4957e41793a70da8350 GIT binary patch literal 1338 zcmV-A1;zS_P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 zP)t-s00030|NsC00A6}Z?f?J)0b)x>L;?Q-E#3eC00(qQO+^Rh1Of{l24Xi!e*gdk zE=fc|R9M5+nK7>1AP|OOWj9;7cEfy7MH_Z5 z=U_Dk|F3DbK8(yj&uTJI}*LlcS)t}I_#fTL;fk? zs7P=>ssZ%HsSeW>sSc-BB!y{qMGQ(vmi-<~8%e#IST=*5pZQ6h z!{{cguL!65;I*(XPjxu$g8{Z2UI?7J1zj~RWMbV?1deiqw*t(4Y7~aqf$)Oy2DFUu zQir+vIXp2q+m2lbD`Z$%XNFQa!c&A_qQ87aHfUGCbbJWhU2<;;-s>>&DGJwDev*4n@bd)5Wy+p&G zQ|>*%&u;Y9pM#fX_oa2?(u#CxtxK&)3e)V07$fU5eeA9LVNWq!yPfY#3|{NIRRQBZ zs6@FB76FxyzAWyJ8&l5Y+8u4+ZB)4(XWAXjYp_K-hubh zxjTd16k8kc!YT{!*m~H`@)kyfeQ9H*Bul^Iw2n$(+Lq&C0(`xRO*TytAhf z&Ee8FtO(Z_l}{wDBo-D)WxvgI30^XDJ_nzF5&I2s0{&02e=r6B001R)MObuXVRU6W zV{&C-bY%cCFfuYNFf=VNGE^}&Ix{djFg7hPG&(RaZ!PlY0000bbVXQnWMOn=I&E)c wX=Zr0 && b==2) inp = inp.slice(0,-1); + if (keyStateIdx==6 && b==5) { + wordle.drawStats(); + return; + } layout.input.label = inp; } layout = getKeyLayout(inp); @@ -82,6 +87,7 @@ class Wordle { this.word = this.words.slice(i, i+5).toUpperCase(); } console.log(this.word); + this.stats = require("Storage").readJSON("bordlestats.json") || {'1':0, '2':0, '3':0, '4':0, '5':0, '6':0, 'p':0, 'w':0, 's':0, 'ms':0}; } render(clear) { h = g.getHeight(); @@ -109,7 +115,7 @@ class Wordle { layout = getKeyLayout(""); wordle.render(true); }); - return 3; + return 1; } this.guesses.push(w); this.nGuesses++; @@ -130,13 +136,39 @@ class Wordle { this.guessColors[this.nGuesses].push(col); } if (correct==5) { - E.showAlert("The word is\n"+this.word, "You won in "+(this.nGuesses+1)+" guesses!").then(function(){load();}); - return 1; - } - if (this.nGuesses==5) { - E.showAlert("The word was\n"+this.word, "You lost!").then(function(){load();}); + E.showAlert("The word is\n"+this.word, "You won in "+(this.nGuesses+1)+" guesses!").then(function(){ + wordle.stats['p']++; wordle.stats['w']++; wordle.stats['s']++; wordle.stats[wordle.nGuesses+1]++; + if (wordle.stats['s']>wordle.stats['ms']) wordle.stats['ms'] = wordle.stats['s']; + require("Storage").writeJSON("bordlestats.json", wordle.stats); + wordle.drawStats(); + }); return 2; } + if (this.nGuesses==5) { + E.showAlert("The word was\n"+this.word, "You lost!").then(function(){ + wordle.stats['p']++; wordle.stats['s'] = 0; + require("Storage").writeJSON("bordlestats.json", wordle.stats); + wordle.drawStats(); + }); + return 3; + } + } + drawStats() { + E.showMessage(" ", "Statistics"); + var max = 1; + for (i=1; i<=6; ++i) if (max20 ? 25 : 25+tw, 52+(i-0.5)*(h-52)/6); + } + g.setFontVector((h-40)/9).setColor("#fff").drawString("P:"+this.stats["p"]+" W:"+this.stats["w"]+" S:"+this.stats["s"]+" M:"+this.stats["ms"], 4, 34); + Bangle.setUI(); + Bangle.on("touch", (e) => { load(); }); } } From 5b93e7f6e54f6c2154b63d08cc8b631cf8df77db Mon Sep 17 00:00:00 2001 From: marko Date: Sat, 2 Apr 2022 16:08:21 -0400 Subject: [PATCH 121/197] Edits of README.md, fix small filename bug in app. --- apps/bee/README.md | 12 +++++++----- apps/bee/bee.app.js | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/bee/README.md b/apps/bee/README.md index 1beece1af..f065d45a6 100644 --- a/apps/bee/README.md +++ b/apps/bee/README.md @@ -5,7 +5,8 @@ Word finding game inspired by the NYT spelling bee. Find as many words with 4 or letter at the center of the 'hive'). -Usage: +## Usage + - tap on letters to type out word - swipe left to delete last letter - swipe right to enter; the word will turn blue while is being checked against the internal dictionary; once @@ -15,15 +16,16 @@ Usage: - swipe up to view a list of already guessed words; tap on any of them to return to the regular game. -Scoring: +## Scoring + The number of correctly guessed words is displayed on the bottom left, the score on the bottom right. A single point is awarded for a 4 letter word, or the number of letters if longer. A pangram is a word that contains all 7 letters at least once and yields an additional 7 points. Each game contains at least one pangram. -Technical remarks: -The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words'). The dictionary is fairly -large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat +## Technical remarks +The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words', using the '2of12inf' word list). +The dictionary is fairly large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat slow. Because of its size it cannot be compressed (heatshrink needs to hold the compressed/uncompressed data in memory). In order to make checking for the validity of a guessed word faster, an index file ('bee_lindex.json') is installed with the app that facilitates faster word lookups. This index file is specific to the dictionary file used. If one were to diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index 4989296e0..7be7c83ce 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -22,7 +22,7 @@ function prepareLetterIdx () { console.log(prefix); li.push(words.indexOf("\n"+prefix, li[i-1])+1); } - li.push(words.length); + li.push(require("Storage").read('bee.words').length); S.writeJSON("bee_lindex.json", li); } for (var i=0; i<26; ++i) letterIdx[i] = S.read("bee.words", li[i], li[i+1]-li[i]); From c19b876820f0516e577843788910b73569c8ea12 Mon Sep 17 00:00:00 2001 From: marko Date: Sat, 2 Apr 2022 17:23:42 -0400 Subject: [PATCH 122/197] Fix some typos. --- apps/bee/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/bee/README.md b/apps/bee/README.md index f065d45a6..c6461fb8e 100644 --- a/apps/bee/README.md +++ b/apps/bee/README.md @@ -2,16 +2,16 @@ # Spelling bee game Word finding game inspired by the NYT spelling bee. Find as many words with 4 or more letters (must include the -letter at the center of the 'hive'). +letter at the center of the 'hive') as you can. ## Usage - tap on letters to type out word - swipe left to delete last letter - - swipe right to enter; the word will turn blue while is being checked against the internal dictionary; once + - swipe right to enter; the word will turn blue while it is being checked against the internal dictionary; once checked, it will turn red if the word is invalid, does not contain the central letter or has been guessed before or - green if it is a valid word; in the latter case, points will be awarded + will turn green if it is a valid word; in the latter case, points will be awarded - swipe down to shuffle the 6 outer letters - swipe up to view a list of already guessed words; tap on any of them to return to the regular game. @@ -27,7 +27,7 @@ least once and yields an additional 7 points. Each game contains at least one pa The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words', using the '2of12inf' word list). The dictionary is fairly large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat slow. Because of its size it cannot be compressed (heatshrink needs to hold the compressed/uncompressed data in memory). -In order to make checking for the validity of a guessed word faster, an index file ('bee_lindex.json') is installed with +In order to make checking the validity of a guessed word faster an index file ('bee_lindex.json') is installed with the app that facilitates faster word lookups. This index file is specific to the dictionary file used. If one were to replace the dictionary file with a different version (e.g. a different language) the index file has to be regenerated. The easiest way to do so is to delete (via the Web IDE or the fileman app on the watch) the file 'bee_lindex.json' - it will be regenerated (and saved, From 2d042ee380227e7dfe281170346a258e48e8d7a4 Mon Sep 17 00:00:00 2001 From: marko Date: Sat, 2 Apr 2022 17:34:18 -0400 Subject: [PATCH 123/197] Restore word display on return from word list view. --- apps/bee/bee.app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index 7be7c83ce..f0ae5badd 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -22,7 +22,7 @@ function prepareLetterIdx () { console.log(prefix); li.push(words.indexOf("\n"+prefix, li[i-1])+1); } - li.push(require("Storage").read('bee.words').length); + li.push(S.read('bee.words').length); S.writeJSON("bee_lindex.json", li); } for (var i=0; i<26; ++i) letterIdx[i] = S.read("bee.words", li[i], li[i+1]-li[i]); @@ -176,6 +176,7 @@ function showWordList() { E.showScroller(); drawHive(); drawScore(); + drawWord(g.theme.fg); Bangle.on("touch", touchHandler); Bangle.on("swipe", swipeHandler); clearInterval(); From fff5ddef67ace7522d9a9a2dc7ae9d53fb666837 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sat, 2 Apr 2022 20:54:23 -0500 Subject: [PATCH 124/197] Add maxbpm as a tracked stat in exstats. --- modules/exstats.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/exstats.js b/modules/exstats.js index 5d7cf0c2b..830398a51 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -15,6 +15,7 @@ print(ExStats.getList()); {name: "Distance", id:"dist"}, {name: "Steps", id:"step"}, {name: "Heart (BPM)", id:"bpm"}, + {name: "Max BPM", id:"maxbpm"}, {name: "Pace (avr)", id:"pacea"}, {name: "Pace (current)", id:"pacec"}, {name: "Cadence", id:"caden"}, @@ -72,6 +73,7 @@ var state = { // cadence // steps per minute adjusted if <1 minute // BPM // beats per minute // BPMage // how many seconds was BPM set? + // maxBPM // The highest BPM reached while active // Notifies: 0 for disabled, otherwise how often to notify in meters, seconds, or steps notify: { dist: { @@ -159,6 +161,10 @@ Bangle.on("HRM", function(h) { if (h.confidence>=60) { state.BPM = h.bpm; state.BPMage = 0; + if (state.maxBPM < h.bpm) { + state.maxBPM = h.bpm; + if (stats["maxbpm"]) stats["maxbpm"].emit("changed",stats["maxbpm"]); + } if (stats["bpm"]) stats["bpm"].emit("changed",stats["bpm"]); } }); @@ -170,6 +176,7 @@ exports.getList = function() { {name: "Distance", id:"dist"}, {name: "Steps", id:"step"}, {name: "Heart (BPM)", id:"bpm"}, + {name: "Max BPM", id:"maxbpm"}, {name: "Pace (avg)", id:"pacea"}, {name: "Pace (curr)", id:"pacec"}, {name: "Speed", id:"speed"}, @@ -230,6 +237,14 @@ exports.getStats = function(statIDs, options) { getString : function() { return state.BPM||"--" }, }; } + if (statIDs.includes("bpm")) { + needHRM = true; + stats["maxbpm"]={ + title : "Max BPM", + getValue : function() { return state.maxBPM; }, + getString : function() { return state.maxBPM||"--" }, + }; + } if (statIDs.includes("pacea")) { needGPS = true; stats["pacea"]={ @@ -299,6 +314,7 @@ exports.getStats = function(statIDs, options) { state.curSpeed = 0; state.BPM = 0; state.BPMage = 0; + state.maxBPM = 0; state.notify = options.notify; if (options.notify.dist.increment > 0) { state.notify.dist.next = state.distance + options.notify.dist.increment; From 9f10a3bdfecd63d8e36fc19d46dbb2b0c91ea899 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sat, 2 Apr 2022 20:58:49 -0500 Subject: [PATCH 125/197] Update run README for max BPM --- apps/run/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/run/README.md b/apps/run/README.md index 89750eb7d..7f645b518 100644 --- a/apps/run/README.md +++ b/apps/run/README.md @@ -14,7 +14,8 @@ the red `STOP` in the bottom right turns to a green `RUN`. shown will increase, even if you are standing still. * `TIME` - the elapsed time for your run * `PACE` - the number of minutes it takes you to run a given distance, configured in settings (default 1km) **based on your run so far** -* `HEART` - Your heart rate +* `HEART (BPM)` - Your current heart rate +* `Max BPM` - Your maximum heart rate reached during the run * `STEPS` - Steps since you started exercising * `CADENCE` - Steps per second based on your step rate *over the last minute* * `GPS` - this is green if you have a GPS lock. GPS is turned on automatically @@ -35,7 +36,7 @@ Under `Settings` -> `App` -> `Run` you can change settings for this app. record GPS/HRM/etc data every time you start a run? * `Pace` is the distance that pace should be shown over - 1km, 1 mile, 1/2 Marathon or 1 Marathon * `Boxes` leads to a submenu where you can configure what is shown in each of the 6 boxes on the display. - Available stats are "Time", "Distance", "Steps", "Heart (BPM)", "Pace (avg)", "Pace (curr)", "Speed", and "Cadence". + Available stats are "Time", "Distance", "Steps", "Heart (BPM)", "Max BPM", "Pace (avg)", "Pace (curr)", "Speed", and "Cadence". Any box set to "-" will display no information. * Box 1 is the top left (defaults to "Distance") * Box 2 is the top right (defaults to "Time") From 7322013f103bac0de4d219a6cafe5d6c07c5efb9 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sat, 2 Apr 2022 21:00:45 -0500 Subject: [PATCH 126/197] Fix for when to include maxbpm --- modules/exstats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/exstats.js b/modules/exstats.js index 830398a51..63d94ec7b 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -237,7 +237,7 @@ exports.getStats = function(statIDs, options) { getString : function() { return state.BPM||"--" }, }; } - if (statIDs.includes("bpm")) { + if (statIDs.includes("maxbpm")) { needHRM = true; stats["maxbpm"]={ title : "Max BPM", From 1815174fd6030cee9b2a9091f3272e226330acc3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:47:33 +0200 Subject: [PATCH 127/197] Included icons for data that is shown. --- apps/bwclk/ChangeLog | 3 +- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 80 +++++++++++++++++++++++++++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_2.png | Bin 3152 -> 2874 bytes 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ba8fd775b..05a22774f 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,4 +1,5 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. 0.03: Adapt colors based on the theme of the user. -0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file +0.04: Steps can be hidden now such that the time is even larger. +0.05: Included icons for information. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 31cc60270..64662f38b 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -10,7 +10,7 @@ - If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to -Lock icons created by Those Icons - Flaticon +Icons created by Flaticon ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2ceb7c359..7382c1f1a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,11 +1,19 @@ -const TIMER_IDX = "bwclk"; -const SETTINGS_FILE = "bwclk.setting.json"; +/* + * Includes + */ const locale = require('locale'); const storage = require('Storage'); +/* + * Statics + */ +const SETTINGS_FILE = "bwclk.setting.json"; +const TIMER_IDX = "bwclk"; +const W = g.getWidth(); +const H = g.getHeight(); /* - * Load settings + * Settings */ let settings = { fullscreen: false, @@ -37,7 +45,6 @@ Graphics.prototype.setMediumFont = function(scale) { return this; }; - Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -50,10 +57,47 @@ var imgLock = { buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) }; +var imgSteps = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) +}; +var imgBattery = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) +}; + +var imgBpm = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) +}; + +var imgTemperature = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) +}; + +var imgWind = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) +}; + +var imgTimer = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) +}; + + +/* + * Draw timeout + */ // timeout used to update every minute -var W = g.getWidth(); -var H = g.getHeight(); var drawTimeout; // schedule a draw for the next minute @@ -67,7 +111,7 @@ function queueDraw() { /* - * Handle alarm + * Helper */ function getSteps() { try{ @@ -173,6 +217,9 @@ function decreaseAlarm(){ } +/* + * D R A W + */ function draw() { // queue draw in one minute queueDraw(); @@ -221,25 +268,38 @@ function draw() { g.setSmallFont(); var infoStr = ""; + var infoImg; if(isAlarmEnabled()){ - infoStr = "T-" + getAlarmMinutes() + " min."; + infoStr = getAlarmMinutes() + " min."; + infoImg = imgTimer; } else if (settings.showInfo == 1){ infoStr = E.getBattery() + "%"; + infoImg = imgBattery; } else if (settings.showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead - infoStr = infoStr + "k steps"; + infoStr = infoStr + "k"; + infoImg = imgSteps; } else if (settings.showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + infoImg = imgBpm; } else if (settings.showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; + infoImg = imgTemperature; } else if (settings.showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; + infoImg = imgWind; } - g.drawString(infoStr, W/2, y); + var imgWidth = 0; + if(infoImg !== undefined){ + imgWidth = infoImg.width; + var strWidth = g.stringWidth(infoStr); + g.drawImage(infoImg, W/2 - strWidth/2 - infoImg.width/2 - 5, y - infoImg.height/2); + } + g.drawString(infoStr, W/2 + imgWidth/2, y+3); } // Draw lock diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 9c81bd5cc..babaa37bf 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.04", + "version": "0.05", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index c5ce87521668c01d77216eb0ba1a1547110b196e..2f31c8b3c918944ea151e5fc4c6c0045fbdf3416 100644 GIT binary patch literal 2874 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 QZObrl+WH*24uwzpA1k?5N&o-= delta 3135 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 Rdut@%FlY;V^9EBa;Xl+^z%~E? From 32e377941a56fdbba2a6ce3d46b2ac0827378396 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:48:19 +0200 Subject: [PATCH 128/197] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7382c1f1a..39065164e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-2, y+3); + g.drawString(dateStr, W/2-1, y+3); g.setSmallFont(); g.setFontAlign(-1,1); From 4c2b77a5fbce77ce4af58a222acedb52ae29c4c7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:57:05 +0200 Subject: [PATCH 129/197] Minor changes --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 64662f38b..0262ec7f7 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -5,7 +5,7 @@ ## Features - Fullscreen on/off - The design is adapted to the theme of your bangle. -- Tab in middle of screen to show between different information. +- Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. - If the "alarm" app is installed tab top / bottom of the screen to set the timer. diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39065164e..65db16a53 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -341,9 +341,13 @@ Bangle.on('lock', function(isLocked) { }); Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; + var is_left = e.x < left; + var is_right = e.x > right; var is_upper = e.y < upper; var is_lower = e.y > lower; @@ -359,9 +363,18 @@ Bangle.on('touch', function(btn, e){ draw(true); } - if(!is_lower && !is_upper){ + var maxInfo = 6; + if(is_right){ Bangle.buzz(40, 0.6); - settings.showInfo = (settings.showInfo+1) % 6; + settings.showInfo = (settings.showInfo+1) % maxInfo; + storage.write(SETTINGS_FILE, settings); + draw(true); + } + + if(is_left){ + Bangle.buzz(40, 0.6); + settings.showInfo = settings.showInfo-1; + settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); draw(true); } From d39174e792da14e6476f350861fa17d7d52ba6df Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:58:41 +0200 Subject: [PATCH 130/197] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 65db16a53..bee40f10d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-1, y+3); + g.drawString(dateStr, W/2-1, y+4); g.setSmallFont(); g.setFontAlign(-1,1); From 11d3c5c10e5c22bb34a4868ba86350062825a76d Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:59:14 +0200 Subject: [PATCH 131/197] Minor changes --- apps/bwclk/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index bee40f10d..420b7e24d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -154,10 +154,10 @@ function getWeather(){ } return { - temp: "??? °C", + temp: "? °C", hum: "-", txt: "-", - wind: "??? km/h", + wind: "? km/h", wdir: "-", wrose: "-" }; From eba8b17a54184ef11e974fa761b597fb9b1f7e54 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:33:54 +0200 Subject: [PATCH 132/197] Show charging icon. --- apps/bwclk/app.js | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 420b7e24d..8456f7a6b 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -93,6 +93,13 @@ var imgTimer = { buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) }; +var imgCharging = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) +}; + + /* * Draw timeout @@ -224,6 +231,17 @@ function draw() { // queue draw in one minute queueDraw(); + // Set info + var showInfo = settings.showInfo; + if(isAlarmEnabled()){ + showInfo = 100; + } + + if(Bangle.isCharging()){ + showInfo = 101; + } + + // Draw background var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; @@ -252,7 +270,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && settings.showInfo == 0){ + if(showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -264,30 +282,33 @@ function draw() { // Draw info or timer y += H/5*2-5; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showInfo > 0){ + if(showInfo > 0){ g.setSmallFont(); var infoStr = ""; var infoImg; - if(isAlarmEnabled()){ + if(showInfo == 100){ infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; - } else if (settings.showInfo == 1){ + } else if(showInfo == 101){ + infoStr = ""; + infoImg = imgCharging; + } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; infoImg = imgBattery; - } else if (settings.showInfo == 2){ + } else if (showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead infoStr = infoStr + "k"; infoImg = imgSteps; - } else if (settings.showInfo == 3){ + } else if (showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; infoImg = imgBpm; - } else if (settings.showInfo == 4){ + } else if (showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; infoImg = imgTemperature; - } else if (settings.showInfo == 5){ + } else if (showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; infoImg = imgWind; From 164683fce5e077af0482290f785becf5c4f57d8d Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 3 Apr 2022 15:51:01 +0200 Subject: [PATCH 133/197] v0.09 added settings menu, removed symbols button, added highscore reset, clockmode optional --- apps/game1024/ChangeLog | 3 +- apps/game1024/app.js | 69 ++++++++++++++++++------------------ apps/game1024/metadata.json | 3 +- apps/game1024/settings.js | 70 +++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 37 deletions(-) create mode 100644 apps/game1024/settings.js diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog index c917bb90c..29838413e 100644 --- a/apps/game1024/ChangeLog +++ b/apps/game1024/ChangeLog @@ -5,4 +5,5 @@ 0.05: Chevron marker on the randomly added square 0.06: Fixed issue 1609 added a message popup state handler to control unwanted screen redraw 0.07: Optimized the mover algorithm for efficiency (work in progress) -0.08: Bug fix at end of the game with victorious splash and glorious orchestra \ No newline at end of file +0.08: Bug fix at end of the game with victorious splash and glorious orchestra +0.09: Added settings menu, removed symbol selection button (*), added highscore reset \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 13430ff2d..a70db76c8 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,7 +1,21 @@ -const debugMode = 'off'; // valid values are: off, test, production, development +let settings = Object.assign({ + // default values + maxUndoLevels: 4, + charIndex: 0, + clockMode: true, + debugMode: false, +}, require('Storage').readJSON("game1024.settings.json", true) || {}); + +const clockMode = settings.clockMode!==undefined ? settings.clockMode : true; +const debugMode = settings.debugMode!==undefined ? settings.debugMode : false; // #settings -- valid values are: true or false +const maxUndoLevels = settings.maxUndoLevels!==undefined ? settings.maxUndoLevels : 4; // #settings +const charIndex = settings.charIndex!==undefined ? settings.charIndex : 0; // #settings -- plain numbers on the grid + +delete settings; // remove unneeded settings from memory + const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; -const rows = 4, cols = 4; -const borderWidth = 6; +const rows = 4, cols = 4; // #settings +const borderWidth = 6; const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; const cellColors = [{bg:'#00FFFF', fg: '#000000'}, {bg:'#FF00FF', fg: '#000000'}, {bg:'#808000', fg: '#FFFFFF'}, {bg:'#0000FF', fg: '#FFFFFF'}, {bg:'#008000', fg: '#FFFFFF'}, @@ -13,12 +27,8 @@ const cellChars = [ ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] ]; -// const numInitialCells = 2; -const maxUndoLevels = 4; -const noExceptions = true; -let charIndex = 0; // plain numbers on the grid -const themeBg = g.theme.bg; +const themeBg = g.theme.bg; const scores = { currentScore: 0, @@ -78,12 +88,12 @@ const snapshot = { updCounter: function() { this.counter = ++this.counter > this.interval ? 0 : this.counter; }, - dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0}, write: function() { require("Storage").writeJSON(this.snFileName, this.dump); }, read: function () { - let sn = require("Storage").readJSON(this.snFileName, noExceptions); + let sn = require("Storage").readJSON(this.snFileName, true); if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { require("Storage").writeJSON(this.snFileName, this.dump); return false; @@ -101,7 +111,6 @@ const snapshot = { }); this.dump.score = scores.currentScore; this.dump.highScore = scores.highScore; - this.dump.charIndex = charIndex; }, make: function () { this.updCounter(); @@ -118,7 +127,7 @@ const snapshot = { }); scores.currentScore = this.dump.score ? this.dump.score : 0; scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; - charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + if (this.dump.hasOwnProperty('charIndex')) delete this.dump.charIndex; // depricated in v0.09 } }, reset: function () { @@ -129,12 +138,11 @@ const snapshot = { } this.dump.score = 0; this.dump.highScore = scores.highScore; - this.dump.charIndex = charIndex; this.write(); debug(() => console.log("reset D U M P E D!", this.dump)); } }; -const btnAtribs = {x: 134, w: 42, h: 42, fg:'#C0C0C0', bg:'#800000'}; +const btnAtribs = {x: 134, w: 42, h: 50, fg:'#C0C0C0', bg:'#800000'}; const buttons = { all: [], draw: function () { @@ -314,7 +322,7 @@ class Cell { } drawBg() { debug(()=>console.log("Drawbg!!")); - if (this.isRndm == true) { + if (this.isRndm) { debug(()=>console.log('Random: (ax)', this.ax)); g.setColor(this.getColor(this.expVal).bg) .fillRect(this.x0, this.y0, this.x1, this.y1) @@ -365,7 +373,7 @@ class Cell { this.isRndm = true; } drawRndmIndicator(){ - if (this.isRndm == true) { + if (this.isRndm) { debug(()=>console.log('Random: (ax)', this.ax)); g.setColor(this.getColor(0).bg) .fillPoly(this.ax,this.ay,this.bx,this.by,this.cx,this.cy); @@ -374,8 +382,9 @@ class Cell { } function undoGame() { - g.clear(); + if (scores.lastScores.length > 0) { + g.clear(); allSquares.forEach(sq => { sq.popFromUndo(); sq.drawBg(); @@ -386,9 +395,9 @@ function undoGame() { buttons.draw(); updUndoLvlIndex(); snapshot.make(); - } - Bangle.loadWidgets(); + Bangle.loadWidgets(); Bangle.drawWidgets(); + } } function addToUndo() { allSquares.forEach(sq => { @@ -487,8 +496,8 @@ function initGame() { drawGrid(); scores.draw(); buttons.draw(); - // Clock mode allows short-press on button to exit - Bangle.setUI("clock"); + // #settings Clock mode allows short-press on button to exit + if(clockMode) Bangle.setUI("clock"); // Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -560,14 +569,8 @@ function resetGame() { * @param {function} func function to call like console.log() */ const debug = (func) => { - switch (debugMode) { - case "development": - if (typeof func === 'function') { - func(); - } - break; - case "off": - default: break; + if (debugMode) { + if (typeof func === 'function') func(); } }; @@ -690,13 +693,9 @@ function updUndoLvlIndex() { .drawString(scores.lastScores.length, x, y); } } -function incrCharIndex() { - charIndex++; - if (charIndex >= cellChars.length) charIndex = 0; - drawGrid(); -} + buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); -buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); + buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); initGame(); diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index dd350d2b9..e2c4bdb3e 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.08", + "version": "0.09", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", @@ -12,6 +12,7 @@ "supports" : ["BANGLEJS2"], "storage": [ {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.settings.js","url":"settings.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/game1024/settings.js b/apps/game1024/settings.js new file mode 100644 index 000000000..c8e393663 --- /dev/null +++ b/apps/game1024/settings.js @@ -0,0 +1,70 @@ +(function(back) { + var FILE = "game1024.settings.json"; + var scoreFile = "game1024.json"; + // Load settings + var settings = Object.assign({ + maxUndoLevels: 5, + charIndex: 0, + clockMode: true, + debugMode: false, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + var symbols = ["1 2 3 ...", "A B C ...", "I II III..."]; + var settingsMenu = { + "" : { "title" : "1024 Game" }, + "< Back" : () => back(), + "Symbols": { + value: 0|settings.charIndex, + min:0,max:symbols.length-1, + format: v=>symbols[v], + onchange: v=> { settings.charIndex=v; writeSettings();} + } + , + "Undo levels:": { + value: 0|settings.maxUndoLevels, // 0| converts undefined to 0 + min: 0, max: 9, + onchange: v => { + settings.maxUndoLevels = v; + writeSettings(); + } + }, + "Exit press:": { + value: !settings.debugMode, // ! converts undefined to true + format: v => v?"short":"long", + onchange: v => { + settings.debugMode = v; + writeSettings(); + }, + }, + "Debug mode:": { + value: !!settings.debugMode, // !! converts undefined to false + format: v => v?"On":"Off", + onchange: v => { + settings.debugMode = v; + writeSettings(); + } + }, + "Reset Highscore": () => { + E.showPrompt('Reset Highscore?').then((v) => { + let delay = 50; + if (v) { + delay = 500; + let sF = require("Storage").readJSON(scoreFile, true); + if (typeof sF !== "undefined") { + E.showMessage('Resetting'); + sF.highScore = 0; + require("Storage").writeJSON(scoreFile, sF); + } else { + E.showMessage('No highscore!'); + } + } + setTimeout(() => E.showMenu(settingsMenu), delay); + }); + } + } + // Show the menu + E.showMenu(settingsMenu); + }) \ No newline at end of file From d85017896c95904f1a6a9ebafe7e187882bbf219 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:59:20 +0200 Subject: [PATCH 134/197] Listen for oncharging event --- apps/bwclk/app.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 8456f7a6b..26cd3a2b5 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -361,6 +361,12 @@ Bangle.on('lock', function(isLocked) { draw(); }); +Bangle.on('charging',function(charging) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; From d0c9de691929cdb1182f9174d66f9e3a9ce046c1 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 3 Apr 2022 16:55:16 +0200 Subject: [PATCH 135/197] bug fix undoGame levels --- apps/game1024/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index a70db76c8..a82db4352 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -383,7 +383,7 @@ class Cell { function undoGame() { - if (scores.lastScores.length > 0) { + if (scores.lastScores.length) { g.clear(); allSquares.forEach(sq => { sq.popFromUndo(); @@ -396,7 +396,7 @@ function undoGame() { updUndoLvlIndex(); snapshot.make(); Bangle.loadWidgets(); - Bangle.drawWidgets(); + Bangle.drawWidgets(); } } function addToUndo() { @@ -516,8 +516,8 @@ function drawPopUp(message,cb) { rDims.x+10, rDims.y2-40 ]); buttons.all.forEach(btn => {btn.disable();}); - const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); - const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-88, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-88, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); btnYes.draw(); btnNo.draw(); g.setColor('#000000'); From f7d1fda5ff0145e4989686692cd5612e391dbfda Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 22:18:26 +0200 Subject: [PATCH 136/197] Minor fixes --- apps/bwclk/app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 26cd3a2b5..c3e13ee73 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -291,7 +291,7 @@ function draw() { infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; } else if(showInfo == 101){ - infoStr = ""; + infoStr = E.getBattery() + "%"; infoImg = imgCharging; } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; @@ -381,13 +381,13 @@ Bangle.on('touch', function(btn, e){ if(is_upper){ Bangle.buzz(40, 0.6); increaseAlarm(); - draw(true); + draw(); } if(is_lower){ Bangle.buzz(40, 0.6); decreaseAlarm(); - draw(true); + draw(); } var maxInfo = 6; @@ -395,7 +395,7 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.6); settings.showInfo = (settings.showInfo+1) % maxInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } if(is_left){ @@ -403,7 +403,7 @@ Bangle.on('touch', function(btn, e){ settings.showInfo = settings.showInfo-1; settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } }); From 84db9a14fd0d5a48d8954dfaa2586588c80bdd91 Mon Sep 17 00:00:00 2001 From: marko Date: Sun, 3 Apr 2022 21:40:58 -0400 Subject: [PATCH 137/197] Mark pangrams green in word list. --- apps/bee/bee.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index f0ae5badd..d06177ab3 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -168,8 +168,8 @@ function showWordList() { E.showScroller({ h : 20, c : foundWords.length, draw : (idx, r) => { - g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1); - g.setFont("6x8:2").drawString(foundWords[idx].toUpperCase(),r.x+10,r.y+4); + g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1).setFont("6x8:2"); + g.setColor(isPangram(foundWords[idx])?'#0f0':g.theme.fg).drawString(foundWords[idx].toUpperCase(),r.x+10,r.y+4); }, select : (idx) => { setInterval(()=> { From 96d77312568d9567230908a278eeedb3d5597411 Mon Sep 17 00:00:00 2001 From: marko Date: Sun, 3 Apr 2022 22:52:07 -0400 Subject: [PATCH 138/197] variable 'words' no longer defined --- apps/bee/bee.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index d06177ab3..a12ca7820 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -20,7 +20,7 @@ function prepareLetterIdx () { for (var i=1; i<26; ++i) { var prefix = String.fromCharCode(97+i%26); console.log(prefix); - li.push(words.indexOf("\n"+prefix, li[i-1])+1); + li.push(S.read('bee.words').indexOf("\n"+prefix, li[i-1])+1); } li.push(S.read('bee.words').length); S.writeJSON("bee_lindex.json", li); From 4d352b791504607801a743ec156c175706ba4ad0 Mon Sep 17 00:00:00 2001 From: Romek Date: Mon, 4 Apr 2022 09:43:48 +0200 Subject: [PATCH 139/197] Add README.md to metadata.json if exists --- apps/aclock/metadata.json | 1 + apps/berlinc/metadata.json | 1 + apps/calculator/metadata.json | 1 + apps/cliock/metadata.json | 1 + apps/ffcniftyb/metadata.json | 1 + apps/floralclk/metadata.json | 1 + apps/hcclock/metadata.json | 1 + apps/impwclock/metadata.json | 1 + apps/intclock/metadata.json | 1 + apps/intervals/metadata.json | 1 + apps/ios/metadata.json | 1 + apps/numerals/metadata.json | 1 + apps/pipboy/metadata.json | 1 + apps/promenu/metadata.json | 1 + apps/score/metadata.json | 1 + apps/showimg/metadata.json | 1 + apps/sunclock/metadata.json | 1 + apps/supmariodark/metadata.json | 1 + apps/touchmenu/metadata.json | 1 + apps/waveclk/metadata.json | 1 + 20 files changed, 20 insertions(+) diff --git a/apps/aclock/metadata.json b/apps/aclock/metadata.json index c483a4e8c..5e4b4b680 100644 --- a/apps/aclock/metadata.json +++ b/apps/aclock/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"aclock.app.js","url":"clock-analog.js"}, diff --git a/apps/berlinc/metadata.json b/apps/berlinc/metadata.json index 49601cbd3..85c42fc47 100644 --- a/apps/berlinc/metadata.json +++ b/apps/berlinc/metadata.json @@ -7,6 +7,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"berlin-clock-screenshot.png"}], "storage": [ diff --git a/apps/calculator/metadata.json b/apps/calculator/metadata.json index 3d1310859..e78e4d54f 100644 --- a/apps/calculator/metadata.json +++ b/apps/calculator/metadata.json @@ -8,6 +8,7 @@ "screenshots": [{"url":"screenshot_calculator.png"}], "tags": "app,tool", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"calculator.app.js","url":"app.js"}, {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} diff --git a/apps/cliock/metadata.json b/apps/cliock/metadata.json index c5d3fa49e..2df48892e 100644 --- a/apps/cliock/metadata.json +++ b/apps/cliock/metadata.json @@ -9,6 +9,7 @@ "type": "clock", "tags": "clock,cli,command,bash,shell", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"cliock.app.js","url":"app.js"}, diff --git a/apps/ffcniftyb/metadata.json b/apps/ffcniftyb/metadata.json index e4e099a51..73f93ed36 100644 --- a/apps/ffcniftyb/metadata.json +++ b/apps/ffcniftyb/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"ffcniftyb.app.js","url":"app.js"}, diff --git a/apps/floralclk/metadata.json b/apps/floralclk/metadata.json index d4848b0d8..33ab6b8ae 100644 --- a/apps/floralclk/metadata.json +++ b/apps/floralclk/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"floralclk.app.js","url":"app.js"}, diff --git a/apps/hcclock/metadata.json b/apps/hcclock/metadata.json index e372a0a2c..0d4cbe0cd 100644 --- a/apps/hcclock/metadata.json +++ b/apps/hcclock/metadata.json @@ -8,6 +8,7 @@ "tags": "clock", "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}], "supports": ["BANGLEJS"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"hcclock.app.js","url":"hcclock.app.js"}, diff --git a/apps/impwclock/metadata.json b/apps/impwclock/metadata.json index 120fbe795..733dbb957 100644 --- a/apps/impwclock/metadata.json +++ b/apps/impwclock/metadata.json @@ -7,6 +7,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}], "allow_emulator": true, "storage": [ diff --git a/apps/intclock/metadata.json b/apps/intclock/metadata.json index fff4c58b0..13f596392 100644 --- a/apps/intclock/metadata.json +++ b/apps/intclock/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"intclock.app.js","url":"app.js"}, diff --git a/apps/intervals/metadata.json b/apps/intervals/metadata.json index bc054a539..32c18ae70 100644 --- a/apps/intervals/metadata.json +++ b/apps/intervals/metadata.json @@ -7,6 +7,7 @@ "icon": "intervals.png", "tags": "", "supports": ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"intervals.app.js","url":"intervals.app.js"}, {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} diff --git a/apps/ios/metadata.json b/apps/ios/metadata.json index 0083c66b0..eb75a6dbc 100644 --- a/apps/ios/metadata.json +++ b/apps/ios/metadata.json @@ -7,6 +7,7 @@ "tags": "tool,system,ios,apple,messages,notifications", "dependencies": {"messages":"app"}, "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"ios.app.js","url":"app.js"}, {"name":"ios.img","url":"app-icon.js","evaluate":true}, diff --git a/apps/numerals/metadata.json b/apps/numerals/metadata.json index dcb86da9a..6ba850d86 100644 --- a/apps/numerals/metadata.json +++ b/apps/numerals/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "numerals,clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"bangle1-numerals-screenshot.png"}], "storage": [ diff --git a/apps/pipboy/metadata.json b/apps/pipboy/metadata.json index 34a6cb0ac..3dfb94c4a 100644 --- a/apps/pipboy/metadata.json +++ b/apps/pipboy/metadata.json @@ -7,6 +7,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS"], + "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}], "storage": [ diff --git a/apps/promenu/metadata.json b/apps/promenu/metadata.json index d70f36b0a..443809004 100644 --- a/apps/promenu/metadata.json +++ b/apps/promenu/metadata.json @@ -7,6 +7,7 @@ "type": "boot", "tags": "system", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "screenshots": [{"url":"pro-menu-screenshot.png"}], "storage": [ {"name":"promenu.boot.js","url":"boot.js","supports": ["BANGLEJS"]}, diff --git a/apps/score/metadata.json b/apps/score/metadata.json index fd72e197d..b593d7388 100644 --- a/apps/score/metadata.json +++ b/apps/score/metadata.json @@ -8,6 +8,7 @@ "type": "app", "tags": "", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"score.app.js","url":"score.app.js"}, {"name":"score.settings.js","url":"score.settings.js"}, diff --git a/apps/showimg/metadata.json b/apps/showimg/metadata.json index d5e44c0ee..e4dbc5738 100644 --- a/apps/showimg/metadata.json +++ b/apps/showimg/metadata.json @@ -7,6 +7,7 @@ "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} diff --git a/apps/sunclock/metadata.json b/apps/sunclock/metadata.json index a39343992..617d76821 100644 --- a/apps/sunclock/metadata.json +++ b/apps/sunclock/metadata.json @@ -7,6 +7,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"sunclock.app.js","url":"app.js"}, diff --git a/apps/supmariodark/metadata.json b/apps/supmariodark/metadata.json index b56b19735..e5d0861ae 100644 --- a/apps/supmariodark/metadata.json +++ b/apps/supmariodark/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"supmariodark.app.js","url":"supmariodark.js"}, {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, diff --git a/apps/touchmenu/metadata.json b/apps/touchmenu/metadata.json index 825989d99..5335e9fd6 100644 --- a/apps/touchmenu/metadata.json +++ b/apps/touchmenu/metadata.json @@ -8,6 +8,7 @@ "type": "bootloader", "tags": "tool", "supports": ["BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"touchmenu.boot.js","url":"touchmenu.boot.js"} ] diff --git a/apps/waveclk/metadata.json b/apps/waveclk/metadata.json index 9ba2798ff..0e9163157 100644 --- a/apps/waveclk/metadata.json +++ b/apps/waveclk/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "allow_emulator": true, "storage": [ {"name":"waveclk.app.js","url":"app.js"}, From dc1bb3ea35b1d76e4d3a50c086ba7ad90b1b9923 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 4 Apr 2022 09:37:12 +0100 Subject: [PATCH 140/197] bump app version --- apps/bordle/ChangeLog | 2 ++ apps/bordle/metadata.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 apps/bordle/ChangeLog diff --git a/apps/bordle/ChangeLog b/apps/bordle/ChangeLog new file mode 100644 index 000000000..f45509a34 --- /dev/null +++ b/apps/bordle/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App +0.02: app keeps track of statistics now diff --git a/apps/bordle/metadata.json b/apps/bordle/metadata.json index e70effed5..37ef5c855 100644 --- a/apps/bordle/metadata.json +++ b/apps/bordle/metadata.json @@ -2,7 +2,7 @@ "name": "Bordle", "shortName":"Bordle", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Bangle version of a popular word search game", "supports" : ["BANGLEJS2"], "readme": "README.md", From 1bc47eb3f17e85e3476d7827805f14024a6cadcd Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:49:52 +0100 Subject: [PATCH 141/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index ba1db294f..fdeda5c51 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; if (settings.language == 'System') { settings.language = require('locale').name; @@ -12,6 +12,15 @@ let fuzzy_string = fuzzy_strings[settings.language]; const h = g.getHeight(); const w = g.getWidth(); +let align_mode = 0; +let align_pos = w/2; +if (settings.alignment =='Left') { + align_mode = -1; + align_pos = 0; +} else if (settings.alignment == 'Right') { + align_mode = 1; + align_pos = w; +} function getTimeString(date) { let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); @@ -29,10 +38,10 @@ function draw() { let time_string = getTimeString(new Date()).replace('*', ''); // print(time_string); g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); - g.setFontAlign(0, 0); + g.setFontAlign(align_mode, 0); g.clearRect(0, 24, w, h-24); g.setColor(g.theme.fg); - g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); } g.clear(); From 4e3a3c36d5a6ebaa9cee46598f6e96c43e40f41a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:51:28 +0100 Subject: [PATCH 142/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index cb0d1117c..52526f6b6 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'align': align_options[1]}; + let s = {'language': language_options[0], 'alignment': align_options[1]}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -22,14 +22,14 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Clock' }, + '': { 'title': 'Fuzzy Word Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { - s.theme = language_options[v]; + s.language = language_options[v]; save(); } }, @@ -38,7 +38,7 @@ min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { - s.theme = align_options[v]; + s.alignment = align_options[v]; save(); } }, From 1ee8dfd3a7b008c506f1490ead81123f4f4bea96 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:52:02 +0100 Subject: [PATCH 143/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 52526f6b6..b316dc159 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -22,7 +22,7 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Word Clock' }, + '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), From 417a575d5149025f49355ebdb84f5ad26dca450e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:59:39 +0100 Subject: [PATCH 144/197] Update metadata.json --- apps/fuzzyw/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..0a8d0f4a9 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,8 +12,8 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, - {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.app.js","url":"app.js"}, + {"name":"fuzzyw.settings.js","url":"settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] From 195d279a747749394682a525d9fbbe5a93bd7668 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:01:18 +0100 Subject: [PATCH 145/197] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 0a8d0f4a9..a8db0d604 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"app.js"}, - {"name":"fuzzyw.settings.js","url":"settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"app.js","url":"fuzzyw.app.js"}, + {"name":"settings.js","url":"fuzzyw.settings.js"}, + {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From aab8df3bee340bd2c8a1a787d77b5869314273a1 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:02:41 +0100 Subject: [PATCH 146/197] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index a8db0d604..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"app.js","url":"fuzzyw.app.js"}, - {"name":"settings.js","url":"fuzzyw.settings.js"}, - {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From d9a3c0a44c490f09267a14114e2df555964818bc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:10:51 +0100 Subject: [PATCH 147/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index fdeda5c51..494e45124 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; if (settings.language == 'System') { settings.language = require('locale').name; From 1d122ef08ee1d23890e21a8dde3be03fc84ccd1b Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:12:48 +0100 Subject: [PATCH 148/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index b316dc159..32a8b9031 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "fuzzyw.json"; + const SETTINGS_FILE = "fuzzyw.settings.json"; var align_options = ['Left','Centre','Right']; var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; From a719435d5622ad1c359eaecbfb1dc37c8cd37024 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:31:29 +0100 Subject: [PATCH 149/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 32a8b9031..765c4f3e4 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'alignment': align_options[1]}; + let s = {'language': 'System', 'alignment': 'Centre'}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings From b27b6b0277902f8a93cfd9e338319cbb4cee6a50 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:57:01 +0100 Subject: [PATCH 150/197] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 765c4f3e4..00219accf 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -25,7 +25,7 @@ '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { - value: 0 | language_options.indexOf(s.theme), + value: 0 | language_options.indexOf(s.language), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { @@ -34,7 +34,7 @@ } }, 'Alignment': { - value: 0 | align_options.indexOf(s.theme), + value: 0 | align_options.indexOf(s.alignment), min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { From 84554868e6ff733034cf0e043e4004adab502c93 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:00:45 +0100 Subject: [PATCH 151/197] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..ebd20e49f 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -3,7 +3,7 @@ "name":"Fuzzy Text Clock", "shortName": "Fuzzy Text", "version": "0.01", - "description": "An inaccurate clock for when you're not in a rush", + "description": "An imprecise clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], From b496307227f6e774bfc77bb14f02b768fcd3060e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:01:36 +0100 Subject: [PATCH 152/197] Update README.md --- apps/fuzzyw/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 1b5f2b8e8..b1afeb961 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -1,12 +1,12 @@ # Fuzzy Text Clock -An inaccurate clock for when you're not in a rush. +An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! ## TODO -* Other languages (currently only uk style time, could tie into the Languages app) -* Bold hour word +* Bold hour word (as the pebble version has) +* Animation when changing time? ## References Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International From c7049589fe326d4963a49d5d3f182ebdfbd5850f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:04 +0100 Subject: [PATCH 153/197] Update README.md --- apps/fuzzyw/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index b1afeb961..9ad90bccd 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -4,6 +4,16 @@ An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! +By default it will use the language set on the watch, go to settings to pick: +* en_GB - English +* en_US - American +* es_ES - Spanish +* fr_FR - French +* no_NO - Norwegian +* sv_SE - Swedish +* de_DE - German +Most translations are taken from the original Fuzzy Text International code. + ## TODO * Bold hour word (as the pebble version has) * Animation when changing time? From aed0aa165909cea413cbfe14571f08fda5c3a19c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:23 +0100 Subject: [PATCH 154/197] Update README.md --- apps/fuzzyw/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 9ad90bccd..906eb167b 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -12,6 +12,7 @@ By default it will use the language set on the watch, go to settings to pick: * no_NO - Norwegian * sv_SE - Swedish * de_DE - German + Most translations are taken from the original Fuzzy Text International code. ## TODO From 5c84ec9e2cdace86854666d1cef23be61491e7d8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 4 Apr 2022 15:49:45 +0100 Subject: [PATCH 155/197] Refactored alarm into separate 'sched' library/app --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 80 +---------------------- apps/alarm/app.js | 6 +- apps/alarm/boot.js | 32 --------- apps/alarm/metadata.json | 13 ++-- apps/alarm/widget.js | 2 +- apps/sched/ChangeLog | 1 + apps/sched/README.md | 82 ++++++++++++++++++++++++ apps/sched/app-icon.js | 1 + apps/sched/app.png | Bin 0 -> 1223 bytes apps/sched/boot.js | 27 ++++++++ apps/{alarm => sched}/lib.js | 12 ++-- apps/sched/metadata.json | 18 ++++++ apps/{alarm/alarm.js => sched/sched.js} | 8 +-- 14 files changed, 151 insertions(+), 132 deletions(-) delete mode 100644 apps/alarm/boot.js create mode 100644 apps/sched/ChangeLog create mode 100644 apps/sched/README.md create mode 100644 apps/sched/app-icon.js create mode 100644 apps/sched/app.png create mode 100644 apps/sched/boot.js rename apps/{alarm => sched}/lib.js (77%) create mode 100644 apps/sched/metadata.json rename apps/{alarm/alarm.js => sched/sched.js} (90%) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index e07e748d4..0811f2166 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -15,3 +15,4 @@ 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system 0.16: Adding alarm library +0.17: Moving alarm internals to 'sched' library diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 7bc4b7155..42131a5a6 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -1,82 +1,6 @@ Default Alarm & Timer ====================== -This provides an app, widget, library and tools for alarms and timers. +This allows you to add/modify any running timers. -Other apps can use this to provide alarm functionality. - -App ---- - -The Alarm app allows you to add/modify any running timers. - - -Internals / Library -------------------- - -Alarms are stored in an array in `alarm.json`, and take the form: - -``` -{ - id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers - on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) - dow : 0b1111111, // Binary encoding for days of the week to run alarm on - // SUN = 1 - // MON = 2 - // TUE = 4 - // WED = 8 - // THU = 16 - // FRI = 32 - // SAT = 64 - msg : "Eat chocolate", // message to display - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - vibrate : "...", // pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) - as : false, // auto snooze - timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms - js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') - // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) - data : { ... } // OPTIONAL - your app can store custom data in here if needed -} -``` - -You app - -The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains -a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to -use too much RAM. - -It can be used as follows: - -``` -// add/update an existing alarm -require("alarm").setAlarm("mytimer", { - msg : "Wake up", - timer : 10*60*1000, // 10 Minutes -}); -// Ensure the widget and alarm timer updates to schedule the new alarm properly -require("alarm").reload(); - -// Get the time to the next alarm for us -var timeToNext = require("alarm").getTimeToAlarm(require("alarm").getAlarm("mytimer")); -// timeToNext===undefined if no alarm or alarm disabled - -// delete an alarm -require("alarm").setAlarm("mytimer", undefined); -// reload after deleting... -require("alarm").reload(); - -// Or add an alarm that runs your own code - in this case -// loading the settings app. The alarm will not be removed/stopped -// automatically. -require("alarm").setAlarm("customrunner", { - js : "load('setting.app.js')", - timer : 1*60*1000, // 1 Minute -}); -``` - - - -If your app requires alarms, you can specify that the alarms app needs to -be installed by adding `"dependencies": {"alarm":"app"},` to your metadata. +It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched) to handle the alarm scheduling in an efficient way that can work alongside other apps. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index e83e1c3d5..d5379f469 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,7 +1,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -var alarms = require("Storage").readJSON("alarm.json",1)||[]; +var alarms = require("Storage").readJSON("sched.json",1)||[]; // An array of alarm objects (see README.md) // time in ms -> { hrs, mins } @@ -31,8 +31,8 @@ function getCurrentTime() { } function saveAndReload() { - require("Storage").write("alarm.json",JSON.stringify(alarms)); - require("alarm").reload(); + require("Storage").write("sched.json",JSON.stringify(alarms)); + require("sched").reload(); } function showMainMenu() { diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js deleted file mode 100644 index cb3a82a7e..000000000 --- a/apps/alarm/boot.js +++ /dev/null @@ -1,32 +0,0 @@ -// check for alarms -(function() { - if (Bangle.ALARM) { - clearTimeout(Bangle.ALARM); - delete Bangle.ALARM; - } - var alarms = require('Storage').readJSON('alarm.json',1)||[]; - var time = new Date(); - var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1); - if (active.length) { - active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); - var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); - if (!require('Storage').read("alarm.js")) { - console.log("No alarm app!"); - require('Storage').write('alarm.json',"[]"); - } else { - var t = active[0].t-currentTime; - if (active[0].last == time.getDate() || t < -60000) t += 86400000; - if (t<1000) t=1000; // start alarm min 1 sec from now - /* execute alarm at the correct time. We avoid execing immediately - since this code will get called AGAIN when alarm.js is loaded. alarm.js - will then clearInterval() to get rid of this call so it can proceed - normally. - If active[0].js is defined, just run that code as-is and not alarm.js */ - Bangle.ALARM = setTimeout(active[0].js||'load("alarm.js")',t); - } - } else { // check for new alarms at midnight (so day of week works) - Bangle.ALARM = setTimeout(() => { - eval(require("Storage").read("alarm.boot.js")); - }, 86400000 - (Date.now()%86400000)); - } -})(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index c10f64a5c..726e2461c 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -1,20 +1,17 @@ { "id": "alarm", - "name": "Default Alarm & Timer", + "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.16", + "version": "0.17", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", + "dependencies": {"scheduler":"type"}, "storage": [ {"name":"alarm.app.js","url":"app.js"}, - {"name":"alarm.boot.js","url":"boot.js"}, - {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"}, - {"name":"alarm","url":"lib.js"} - ], - "data": [{"name":"alarm.json"}] + {"name":"alarm.wid.js","url":"widget.js"} + ] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index 54c17dc6d..052ac9ebd 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -2,7 +2,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); },reload:function() { // don't include library here as we're trying to use as little RAM as possible - WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; + WIDGETS["alarm"].width = (require('Storage').readJSON('sched.json',1)||[]).some(alarm=>alarm.on&&(alarm.hidden!==false)) ? 24 : 0; } }; WIDGETS["alarm"].reload(); diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/sched/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/sched/README.md b/apps/sched/README.md new file mode 100644 index 000000000..03d93c688 --- /dev/null +++ b/apps/sched/README.md @@ -0,0 +1,82 @@ +Sched: Scheduling library for alarms and timers +==================================== + +This provides boot code, a library and tools for alarms and timers. + +Other apps can use this to provide alarm functionality. + +App +--- + +The Alarm app allows you to add/modify any running timers. + + +Internals / Library +------------------- + +Alarms are stored in an array in `sched.json`, and take the form: + +``` +{ + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) + dow : 0b1111111, // Binary encoding for days of the week to run alarm on + // SUN = 1 + // MON = 2 + // TUE = 4 + // WED = 8 + // THU = 16 + // FRI = 32 + // SAT = 64 + + date : "2022-04-04", // OPTIONAL date for the alarm, in YYYY-MM-DD format + // eg (new Date()).toISOString().substr(0,10) + msg : "Eat food", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat the alarm every day? + vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) + hidden : false, // OPTIONAL if false, the widget should not show an icon for this alarm + as : false, // auto snooze + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'sched.js') + // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) + data : { ... } // OPTIONAL - your app can store custom data in here if needed +} +``` + +The [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched/lib.js) contains +a few helpful functions for getting/setting alarms and timers, but is intentionally sparse so as not to +use too much RAM. + +It can be used as follows: + +``` +// add/update an existing alarm +require("sched").setAlarm("mytimer", { + msg : "Wake up", + timer : 10*60*1000, // 10 Minutes +}); +// Ensure the widget and alarm timer updates to schedule the new alarm properly +require("sched").reload(); + +// Get the time to the next alarm for us +var timeToNext = require("sched").getTimeToAlarm(require("sched").getAlarm("mytimer")); +// timeToNext===undefined if no alarm or alarm disabled + +// delete an alarm +require("sched").setAlarm("mytimer", undefined); +// reload after deleting... +require("sched").reload(); + +// Or add an alarm that runs your own code - in this case +// loading the settings app. The alarm will not be removed/stopped +// automatically. +require("sched").setAlarm("customrunner", { + js : "load('setting.app.js')", + timer : 1*60*1000, // 1 Minute +}); +``` + +If your app requires alarms, you can specify that the alarms app needs to +be installed by adding `"dependencies": {"scheduler":"type"},` to your metadata. diff --git a/apps/sched/app-icon.js b/apps/sched/app-icon.js new file mode 100644 index 000000000..05515e859 --- /dev/null +++ b/apps/sched/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkGswAhiMRCCAREAo4eHBIQLEAgwYHsIJDiwHB5gACBpIhHCoYZEGA4gFCw4ABGA4HEjgXJ4IXGAwcUB4VEmf//8zogICoJIFAodMBoNDCoIADmgJB4gXIFwXDCwoABngwFC4guB4k/CQXwh4EC+YMCC44iBp4qDC4n/+gNBC41sEIJCEC4v/GAPGC4dhXYRdFC4xhCCYIXCdQRdDC5HzegQXCsxGHC45IDCwQXCUgwXHJAIXGRogXJSIIXcOw4XIPAYXcBwv/mEDBAwXOgtQC65QGC5vzoEAJAx3Nmk/mEABIiPN+dDAQIwFC4zXGFwKRCGAjvMFwQECGAgXI4YuGGAUvAgU8C4/EFwwGCAgdMC4p4EFwobFOwoXDJAIoEAApGBC4xIEABJGHGAapEAAqNBFwwXD4heI+YuBC5BIBVQhdHIw4wD5inFS4IKCCxFmigNCokzCoMzogICoIWIsMRjgPCAA3BiMWC48RBQIXJEgMRFxAJCCw4lEC44IECooOIBAaBJKwhgIAH4ACA==")) diff --git a/apps/sched/app.png b/apps/sched/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5784bde644cca9d42f2081e2a9d05872f7d82a GIT binary patch literal 1223 zcmV;&1UUPNP)yt~5>heLDBtbIv{Ickem(+#iGyMi?Ot;mye3`tA2XRuFvAAO+_-k8R4C zi)@4+UQnF}5R&Y<%K8f+q!11u*zif>(|s-(3`e|Cm=^8hn?Hp74uk^;HbOptsQCz& zAN(1BFDh5h82?vz>^urWeh0#3G}s8|K(G<=IWVsy6bSs%XQAm-4M@SuFYV*0wETJL z&ua%BB?q$7jJ*E*QuMk=BrYah=ZTFTVb8%`437;1U^d3F`^`N#R5Rah!3N>pR1{@t#t=A zfQCFQ$<5 zq=_4&XSwv-ZVvCgM1RjPSvk*e>buh@v5UDmewA_8D6UB-cPAXAm{t)JrKkB)J-tKc zJfBinS|>jeA=T_5e@%GEjm^g1JzISss0 z`YINSh1}d+PM$o8!C>&KJMJ2zzI{7R)!}h>TiurSucyldyb9eIJ*&~#D@rjN6KHE| zqoAMwtJO+TQ4wQfV}5lPM;lnby!bvtN}s9}uwLk+vXvy6ble`dYrKrassB}ay`I+A zRyJcxoVgf4T+iCN?Qkrk(07jTf(^YP6y# zoH%iU!ootVRx4Jk6;)L!FE5{ACqY>@eVB?D<`sZ<_c)hsQcO#;NHKFcMNz1(uBN19 z>SUPBW*>d8GV5~}1iTm0MaQ8!r;_lNW00lBv>Efo#l>`VbRdKvFE7tW|CVDwqXi6j z&j&mJ!=elv&c6Y$57~SI0LagOa06$*X47a1=e_3xUWMX~8#LPX$1x_<@j2@{RR^~I zrfD3pa2J^e@y2IatV;plwsV-~o_Zv+Uo{d*OHVy_oFf1T=p9NPY4Mf|cmNSZk(Ts^ zmduw2EF8VC@1Z;4R2>|>P{-wg4i8I8A>Z@YUeD>(^MBxj)))3msP>FwW6b2N*h)rX zwpLzm-uVankPTaZllJBBx%t3mZoyt;k==Pa)yyslvKkP#ox_~5H*&___%JoCorZS5 z0t>bS9@MlI6eGpQK>94Azar$j{yNaFrZ!U!Y8@h>Y%nWN0p7Wn`G002ovPDHLkV1nE7J?;Pi literal 0 HcmV?d00001 diff --git a/apps/sched/boot.js b/apps/sched/boot.js new file mode 100644 index 000000000..15c332ad7 --- /dev/null +++ b/apps/sched/boot.js @@ -0,0 +1,27 @@ +// check for alarms +(function() { + if (Bangle.ALARM) { + clearTimeout(Bangle.ALARM); + delete Bangle.ALARM; + } + var alarms = require('Storage').readJSON('sched.json',1)||[]; + var time = new Date(); + var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1 && (!a.date || a.date==time.toISOString().substr(0,10))); + if (active.length) { + active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var t = active[0].t-currentTime; + if (active[0].last == time.getDate() || t < -60000) t += 86400000; + if (t<1000) t=1000; // start alarm min 1 sec from now + /* execute alarm at the correct time. We avoid execing immediately + since this code will get called AGAIN when alarm.js is loaded. alarm.js + will then clearInterval() to get rid of this call so it can proceed + normally. + If active[0].js is defined, just run that code as-is and not alarm.js */ + Bangle.ALARM = setTimeout(active[0].js||'load("sched.js")',t); + } else { // check for new alarms at midnight (so day of week works) + Bangle.ALARM = setTimeout(() => { + eval(require("Storage").read("sched.boot.js")); + }, 86400000 - (Date.now()%86400000)); + } +})(); diff --git a/apps/alarm/lib.js b/apps/sched/lib.js similarity index 77% rename from apps/alarm/lib.js rename to apps/sched/lib.js index a0d8b3938..9d9744b1f 100644 --- a/apps/alarm/lib.js +++ b/apps/sched/lib.js @@ -1,15 +1,15 @@ // Return an array of all alarms exports.getAlarms = function() { - return require("Storage").readJSON("alarm.json",1)||[]; + return require("Storage").readJSON("sched.json",1)||[]; }; // Return an alarm object based on ID exports.getAlarm = function(id) { - var alarms = require("Storage").readJSON("alarm.json",1)||[]; + var alarms = require("Storage").readJSON("sched.json",1)||[]; return alarms.find(a=>a.id==id); }; // Set an alarm object based on ID. Leave 'alarm' undefined to remove it exports.setAlarm = function(id, alarm) { - var alarms = require("Storage").readJSON("alarm.json",1)||[]; + var alarms = require("Storage").readJSON("sched.json",1)||[]; alarms = alarms.filter(a=>a.id!=id); if (alarm !== undefined) { alarm.id = id; @@ -22,13 +22,13 @@ exports.setAlarm = function(id, alarm) { } } alarms.push(alarm); - require("Storage").writeJSON("alarm.json", alarms); + require("Storage").writeJSON("sched.json", alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future exports.getTimeToAlarm = function(alarm, time) { if (!alarm) return undefined; if (!time) time = new Date(); - var active = alarm.on && (alarm.dow>>time.getDay())&1; + var active = alarm.on && (alarm.dow>>time.getDay())&1 && (!alarm.date || alarm.date==time.toISOString().substr(0,10)); if (!active) return undefined; var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); var t = alarm.t-currentTime; @@ -37,7 +37,7 @@ exports.getTimeToAlarm = function(alarm, time) { }; /// Force a reload of the current alarms and widget exports.reload = function() { - eval(require("Storage").read("alarm.boot.js")); + eval(require("Storage").read("sched.boot.js")); if (WIDGETS["alarm"]) { WIDGETS["alarm"].reload(); Bangle.drawWidgets(); diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json new file mode 100644 index 000000000..60aa71d41 --- /dev/null +++ b/apps/sched/metadata.json @@ -0,0 +1,18 @@ +{ + "id": "sched", + "name": "Scheduler", + "version": "0.01", + "description": "Scheduling library for alarms and timers", + "icon": "app.png", + "type": "scheduler", + "tags": "tool,system,alarm", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"sched.boot.js","url":"boot.js"}, + {"name":"sched.js","url":"sched.js"}, + {"name":"sched.img","url":"app-icon.js","evaluate":true}, + {"name":"sched","url":"lib.js"} + ], + "data": [{"name":"sched.json"}] +} diff --git a/apps/alarm/alarm.js b/apps/sched/sched.js similarity index 90% rename from apps/alarm/alarm.js rename to apps/sched/sched.js index 7ec8d0b73..f42a15fc3 100644 --- a/apps/alarm/alarm.js +++ b/apps/sched/sched.js @@ -1,5 +1,5 @@ // Chances are boot0.js got run already and scheduled *another* -// 'load(alarm.js)' - so let's remove it first! +// 'load(sched.js)' - so let's remove it first! if (Bangle.ALARM) { clearInterval(Bangle.ALARM); delete Bangle.ALARM; @@ -54,7 +54,7 @@ function showAlarm(alarm) { } if (!alarm.rp) alarm.on = false; } - require("Storage").write("alarm.json",JSON.stringify(alarms)); + require("Storage").write("sched.json",JSON.stringify(alarms)); load(); }); function buzz() { @@ -74,8 +74,8 @@ function showAlarm(alarm) { // Check for alarms var day = (new Date()).getDate(); var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early -var alarms = require("Storage").readJSON("alarm.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.ta.on&&(a.ta.t-b.t); From 6948926572c5699cb47f2599866be5f8731ab19a Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 4 Apr 2022 17:45:06 +0200 Subject: [PATCH 156/197] v0.09 Updated the readme and screenshots --- apps/game1024/README.md | 24 +++++++++++++----- .../game1024_sc_dump_app_settings.png | Bin 0 -> 3623 bytes apps/game1024/game1024_sc_dump_dark.png | Bin 4404 -> 0 bytes apps/game1024/game1024_sc_dump_dark_v0.09.png | Bin 0 -> 3853 bytes apps/game1024/game1024_sc_dump_light.png | Bin 4054 -> 0 bytes .../game1024/game1024_sc_dump_light.v0.09.png | Bin 0 -> 3729 bytes apps/game1024/screenshot.png | Bin 6079 -> 3504 bytes 7 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 apps/game1024/game1024_sc_dump_app_settings.png delete mode 100644 apps/game1024/game1024_sc_dump_dark.png create mode 100644 apps/game1024/game1024_sc_dump_dark_v0.09.png delete mode 100644 apps/game1024/game1024_sc_dump_light.png create mode 100644 apps/game1024/game1024_sc_dump_light.v0.09.png diff --git a/apps/game1024/README.md b/apps/game1024/README.md index 500453145..f72a7ffef 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -1,7 +1,7 @@ # Play the game of 1024 -Move the tiles by swiping to the lefthand, righthand or up- and downward side of the watch. +Move the tiles by swiping left, righth, up- or downward over the watchface. When two tiles with the same number are squashed together they will add up as exponentials: @@ -21,16 +21,28 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. ## Buttons on the screen - - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels. The level is indicated with a small number in the lower righthand corner of the Undo button - - Button **\***: Change the text on the tile to number, capitals or Roman numbers - - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. + - Button **U**: Undo the last move. There are currently a maximum of 9 undo levels. The level is indicated with a small number in the lower righthand corner of the Undo button + - You can set the maximum undo level in the Apps settings menu. + + - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. + - The highscore value can be reset in the Apps settings menu. + + Apps setting: ![Screenshot of the apps settings menu](./game1024_sc_dump_app_settings.png) + + - Stuff you can change in de 1024 Game settings: + - Symbols on the cells: numerical, alphabetical or Roman + - Undo levels [0-9] + - Exit: how to exit the game: long or short press + - Debug mode: on or off. This will log all kinds of stuff in the console of the Web IDE + - Reset Highsccore: Tired of looking at the old highscore? Now you can set it to 0 again. ### Credits Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. In Dark theme with numbers: -![Screenshot from the Banglejs 2 watch with the game in dark theme](./game1024_sc_dump_dark.png) +![Screenshot from the Banglejs 2 watch with the game in dark theme](./game1024_sc_dump_dark_v0.09.png) In Light theme with characters: -![Screenshot from the Banglejs 2 watch with the game in light theme](./game1024_sc_dump_light.png) \ No newline at end of file +![Screenshot from the Banglejs 2 watch with the game in light theme](./game1024_sc_dump_light.v0.09.png) + diff --git a/apps/game1024/game1024_sc_dump_app_settings.png b/apps/game1024/game1024_sc_dump_app_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6c50898b371cda94ac6cab8edef79999b79d1d3b GIT binary patch literal 3623 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 literal 0 HcmV?d00001 diff --git a/apps/game1024/game1024_sc_dump_light.png b/apps/game1024/game1024_sc_dump_light.png deleted file mode 100644 index 06ada65ac44865e01178d2684c8212e40fd33aed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4054 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 literal 6079 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 From 0268fd3592c350e732490d7d05ddefed76e8e710 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 4 Apr 2022 17:51:11 +0200 Subject: [PATCH 157/197] Corrected a few typos --- apps/game1024/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/game1024/README.md b/apps/game1024/README.md index f72a7ffef..a25683b68 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -1,7 +1,7 @@ # Play the game of 1024 -Move the tiles by swiping left, righth, up- or downward over the watchface. +Move the tiles by swiping left, right, up- or downward over the watchface. When two tiles with the same number are squashed together they will add up as exponentials: @@ -24,7 +24,7 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. - Button **U**: Undo the last move. There are currently a maximum of 9 undo levels. The level is indicated with a small number in the lower righthand corner of the Undo button - You can set the maximum undo level in the Apps settings menu. - - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. + - Button **R**: Reset the game. The Highscore will be remembered. You will be prompted first. - The highscore value can be reset in the Apps settings menu. Apps setting: ![Screenshot of the apps settings menu](./game1024_sc_dump_app_settings.png) From 25aafe1ccf3efebb81b6406ed3a8e2e2f2b1465c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 4 Apr 2022 16:58:17 +0100 Subject: [PATCH 158/197] more refactoring to try and reduce code duplication --- apps/alarm/app.js | 6 +++--- apps/alarm/metadata.json | 2 +- apps/qalarm/metadata.json | 2 +- apps/sched/boot.js | 14 ++++++-------- apps/sched/lib.js | 19 ++++++++++++++----- apps/sched/sched.js | 37 +++++++++---------------------------- 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index d5379f469..45edd83f5 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,8 +1,8 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -var alarms = require("Storage").readJSON("sched.json",1)||[]; -// An array of alarm objects (see README.md) +var alarms = require("sched").getAlarms(); +// An array of alarm objects (see sched/README.md) // time in ms -> { hrs, mins } function decodeTime(t) { @@ -31,7 +31,7 @@ function getCurrentTime() { } function saveAndReload() { - require("Storage").write("sched.json",JSON.stringify(alarms)); + require("sched").setAlarms(alarms); require("sched").reload(); } diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 726e2461c..fe82e04c9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -3,7 +3,7 @@ "name": "Alarm & Timer", "shortName": "Alarms", "version": "0.17", - "description": "Set and respond to alarms and timers", + "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 326ba33a7..2039af4bf 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -4,7 +4,7 @@ "shortName": "Q Alarm", "icon": "app.png", "version": "0.04", - "description": "Alarm and timer app with days of week and 'hard' option.", + "description": "[Not recommended - use 'Alarm & Timer' app] Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ diff --git a/apps/sched/boot.js b/apps/sched/boot.js index 15c332ad7..c772a135e 100644 --- a/apps/sched/boot.js +++ b/apps/sched/boot.js @@ -1,8 +1,8 @@ // check for alarms -(function() { - if (Bangle.ALARM) { - clearTimeout(Bangle.ALARM); - delete Bangle.ALARM; +(function() { // run in closure to ensure allocated vars get removed + if (Bangle.SCHED) { + clearTimeout(Bangle.SCHED); + delete Bangle.SCHED; } var alarms = require('Storage').readJSON('sched.json',1)||[]; var time = new Date(); @@ -18,10 +18,8 @@ will then clearInterval() to get rid of this call so it can proceed normally. If active[0].js is defined, just run that code as-is and not alarm.js */ - Bangle.ALARM = setTimeout(active[0].js||'load("sched.js")',t); + Bangle.SCHED = setTimeout(active[0].js||'load("sched.js")',t); } else { // check for new alarms at midnight (so day of week works) - Bangle.ALARM = setTimeout(() => { - eval(require("Storage").read("sched.boot.js")); - }, 86400000 - (Date.now()%86400000)); + Bangle.SCHED = setTimeout('eval(require("Storage").read("sched.boot.js"))', 86400000 - (Date.now()%86400000)); } })(); diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 9d9744b1f..4b645aede 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -2,15 +2,24 @@ exports.getAlarms = function() { return require("Storage").readJSON("sched.json",1)||[]; }; +// Write a list of alarms back to storage +exports.setAlarms = function(alarms) { + return require("Storage").writeJSON("sched.json",alarms); +}; // Return an alarm object based on ID exports.getAlarm = function(id) { - var alarms = require("Storage").readJSON("sched.json",1)||[]; - return alarms.find(a=>a.id==id); + return exports.getAlarms().find(a=>a.id==id); }; +// Given a list of alarms from getAlarms, return a list of active alarms for the given time (or current time if time not specified) +exports.getActiveAlarms = function(alarms, time) { + if (!time) time = new Date(); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000) + +10000;// get current time - 10s in future to ensure we alarm if we've started the app a tad early + return alarms.filter(a=>a.on&&(a.ta.t-b.t); +} // Set an alarm object based on ID. Leave 'alarm' undefined to remove it exports.setAlarm = function(id, alarm) { - var alarms = require("Storage").readJSON("sched.json",1)||[]; - alarms = alarms.filter(a=>a.id!=id); + var alarms = exports.getAlarms().filter(a=>a.id!=id); if (alarm !== undefined) { alarm.id = id; if (alarm.dow===undefined) alarm.dow = 0b1111111; @@ -22,7 +31,7 @@ exports.setAlarm = function(id, alarm) { } } alarms.push(alarm); - require("Storage").writeJSON("sched.json", alarms); + exports.setAlarms(alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future exports.getTimeToAlarm = function(alarm, time) { diff --git a/apps/sched/sched.js b/apps/sched/sched.js index f42a15fc3..a19c85717 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -1,8 +1,8 @@ // Chances are boot0.js got run already and scheduled *another* // 'load(sched.js)' - so let's remove it first! -if (Bangle.ALARM) { - clearInterval(Bangle.ALARM); - delete Bangle.ALARM; +if (Bangle.SCHED) { + clearInterval(Bangle.SCHED); + delete Bangle.SCHED; } // time in ms -> { hrs, mins } @@ -12,25 +12,11 @@ function decodeTime(t) { return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; } -// time in { hrs, mins } -> ms -function encodeTime(o) { - return o.hrs*3600000 + o.mins*60000; -} - function formatTime(t) { var o = decodeTime(t); return o.hrs+":"+("0"+o.mins).substr(-2); } -function getCurrentTime() { - var time = new Date(); - return ( - time.getHours() * 3600000 + - time.getMinutes() * 60000 + - time.getSeconds() * 1000 - ); -} - function showAlarm(alarm) { var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); var buzzCount = 10; @@ -54,7 +40,8 @@ function showAlarm(alarm) { } if (!alarm.rp) alarm.on = false; } - require("Storage").write("sched.json",JSON.stringify(alarms)); + // alarm is still a member of 'alarms', so writing to array writes changes back directly + require("sched").setAlarms(alarms); load(); }); function buzz() { @@ -72,15 +59,9 @@ function showAlarm(alarm) { } // Check for alarms -var day = (new Date()).getDate(); -var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early -var alarms = require("Storage").readJSON("sched.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.ta.t-b.t); +var alarms = require("sched").getAlarms(); +var active = require("sched").getActiveAlarms(alarms); +if (active.length) // if there's an alarm, show it showAlarm(active[0]); -} else { - // otherwise just go back to default app +else // otherwise just go back to default app setTimeout(load, 100); -} From 530437750883703875475494cd28b5b2ff915fa0 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:32:30 +0200 Subject: [PATCH 159/197] Updated to "sched" library. --- apps/bwclk/app.js | 8 ++++---- apps/lcars/lcars.app.js | 8 ++++---- apps/notanalog/notanalog.app.js | 8 ++++---- apps/smpltmr/app.js | 2 +- apps/smpltmr/metadata.json | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index c3e13ee73..d4e6c50ab 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -172,7 +172,7 @@ function getWeather(){ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -189,7 +189,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -197,7 +197,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -210,7 +210,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 353cc62dd..577955d2e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function getWeather(){ */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -584,7 +584,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -592,7 +592,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -605,7 +605,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index b7c81837d..c3dc9308f 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,7 +394,7 @@ function queueDraw() { */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -411,7 +411,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -419,7 +419,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -432,7 +432,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index f7717a2fc..eb01e27d0 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require("alarm"); +const alarm = require("sched"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index feb841819..5a46ae546 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"alarm":"app"}, + "dependencies": {"sched":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 4d0389ba5c8fe6ff6b96da2d878273588f6536e5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:33:40 +0200 Subject: [PATCH 160/197] Updated readme --- apps/bwclk/README.md | 2 +- apps/lcars/README.md | 2 +- apps/notanalog/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 0262ec7f7..a5b66df71 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -7,7 +7,7 @@ - The design is adapted to the theme of your bangle. - Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. -- If the "alarm" app is installed tab top / bottom of the screen to set the timer. +- If the "sched" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Icons created by Flaticon diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f506f96c4..7024e8edf 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -4,7 +4,7 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected with Gadgetbride and the weather app must be installed. To use the timer -the "alarm" app must be installed on your device. +the "sched" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index f4cf19ed6..e368f75d2 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "sched" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. From 67facc692db64059d92bdc37b964396a267022e8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Apr 2022 10:59:13 +0100 Subject: [PATCH 161/197] fix https://github.com/espruino/BangleApps/issues/1555#issuecomment-1087784581 --- apps/sched/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 4b645aede..e517413c3 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -29,8 +29,8 @@ exports.setAlarm = function(id, alarm) { var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); alarm.t = currentTime + alarm.timer; } + alarms.push(alarm); } - alarms.push(alarm); exports.setAlarms(alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future From 10589f0dc896a533e127d934f6fd693d0bf133e1 Mon Sep 17 00:00:00 2001 From: marko Date: Tue, 5 Apr 2022 09:13:56 -0400 Subject: [PATCH 162/197] Correctly check word boundarie in dictionaries look ups; fix bug in index regeneration. --- apps/bee/ChangeLog | 2 ++ apps/bee/bee.app.js | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 apps/bee/ChangeLog diff --git a/apps/bee/ChangeLog b/apps/bee/ChangeLog new file mode 100644 index 000000000..df0907283 --- /dev/null +++ b/apps/bee/ChangeLog @@ -0,0 +1,2 @@ +0.01: New app! +0.02: Fix bug with regenerating index, fix bug in word lookups diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index a12ca7820..0059f5a08 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -31,8 +31,9 @@ function prepareLetterIdx () { function findWord (w) { "compile" var ci = w.charCodeAt(0)-97; - var f = letterIdx[ci].indexOf(w); - if (f>=0 && letterIdx[ci][f+w.length]=="\n") return true; + if (letterIdx[ci].substr(0, w.length)==w) return true; + var f = letterIdx[ci].indexOf("\n"+w+"\n"); + if (f>=0) return true; return false; } @@ -47,6 +48,7 @@ function checkWord (w) { if (foundWords.indexOf(w)>=0) return false; // already found if (findWord(w)) { foundWords.push(w); + foundWords.sort(); if (w.length==4) score++; else score += w.length; if (isPangram(w)) score += 7; From 4edfcc6d001cb3c8ede84a7cdc040e70cc31debf Mon Sep 17 00:00:00 2001 From: marko Date: Tue, 5 Apr 2022 10:18:42 -0400 Subject: [PATCH 163/197] Small most-likely branch optimization --- apps/bee/bee.app.js | 2 +- apps/bee/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index 0059f5a08..ef1582baa 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -31,9 +31,9 @@ function prepareLetterIdx () { function findWord (w) { "compile" var ci = w.charCodeAt(0)-97; - if (letterIdx[ci].substr(0, w.length)==w) return true; var f = letterIdx[ci].indexOf("\n"+w+"\n"); if (f>=0) return true; + if (letterIdx[ci].substr(0, w.length)==w) return true; return false; } diff --git a/apps/bee/metadata.json b/apps/bee/metadata.json index a89177d4e..a22e1800c 100644 --- a/apps/bee/metadata.json +++ b/apps/bee/metadata.json @@ -2,7 +2,7 @@ "name": "Bee", "shortName":"Bee", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Spelling bee", "supports" : ["BANGLEJS2"], "readme": "README.md", From d4d6d48471eba1e4a633ec0a91576f29e4e3c538 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Apr 2022 16:48:56 +0100 Subject: [PATCH 164/197] better example app --- apps/_example_app/app.js | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/apps/_example_app/app.js b/apps/_example_app/app.js index af367779a..06c254a36 100644 --- a/apps/_example_app/app.js +++ b/apps/_example_app/app.js @@ -1,12 +1,34 @@ // place your const, vars, functions or classes here -// special function to handle display switch on -Bangle.on('lcdPower', (on) => { - if (on) { - // call your app function here - // If you clear the screen, do Bangle.drawWidgets(); +// clear the screen +g.clear(); + +var n = 0; + +// redraw the screen +function draw() { + g.reset().clearRect(Bangle.appRect); + g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); + g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); +} + +// Respond to user input +Bangle.setUI({mode: "updown"}, function(dir) { + if (dir<0) { + n--; + draw(); + } else if (dir>0) { + n++; + draw(); + } else { + n = 0; + draw(); } }); -g.clear(); -// call your app function here +// First draw... +draw(); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); From 0d696558a633e13f7eacdfe49f3c378c3f1bffd5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Apr 2022 16:49:19 +0100 Subject: [PATCH 165/197] Adding apps for keyboards on bangle.js 2 --- apps/kbswipe/ChangeLog | 1 + apps/kbswipe/README.md | 36 ++++++++++ apps/kbswipe/app.png | Bin 0 -> 2042 bytes apps/kbswipe/lib.js | 110 ++++++++++++++++++++++++++++++ apps/kbswipe/metadata.json | 14 ++++ apps/kbswipe/screenshot.png | Bin 0 -> 3823 bytes apps/kbtouch/ChangeLog | 1 + apps/kbtouch/README.md | 37 ++++++++++ apps/kbtouch/app.png | Bin 0 -> 506 bytes apps/kbtouch/lib.js | 132 ++++++++++++++++++++++++++++++++++++ apps/kbtouch/metadata.json | 14 ++++ apps/kbtouch/screenshot.png | Bin 0 -> 3208 bytes 12 files changed, 345 insertions(+) create mode 100644 apps/kbswipe/ChangeLog create mode 100644 apps/kbswipe/README.md create mode 100644 apps/kbswipe/app.png create mode 100644 apps/kbswipe/lib.js create mode 100644 apps/kbswipe/metadata.json create mode 100644 apps/kbswipe/screenshot.png create mode 100644 apps/kbtouch/ChangeLog create mode 100644 apps/kbtouch/README.md create mode 100644 apps/kbtouch/app.png create mode 100644 apps/kbtouch/lib.js create mode 100644 apps/kbtouch/metadata.json create mode 100644 apps/kbtouch/screenshot.png diff --git a/apps/kbswipe/ChangeLog b/apps/kbswipe/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/kbswipe/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/kbswipe/README.md b/apps/kbswipe/README.md new file mode 100644 index 000000000..1a402a9f3 --- /dev/null +++ b/apps/kbswipe/README.md @@ -0,0 +1,36 @@ +# Swipe Keyboard + +A library that provides the ability to input text by swiping PalmOS Graffiti-style characters onto the screen. + +To get a legend of available characters, just tap the screen. + + +## Usage + +In your app's metadata, add: + +``` + "dependencies": {"textinput":"type"}, +``` + +From inside your app, call: + +``` +Bangle.loadWidgets(); +Bangle.drawWidgets(); +require("textinput").input({text:"Foo"}).then(result => { + console.log("Text input", E.toJS(result)); +}); +``` + +The first argument to `input` is an object containing the following: + +* `text` - initial text to edit + +(in the future, the ability to restrict usage of newline/etc may be added) + +## Make your own + +You can create your own keyboard input apps. Just ensure that they have +`"type":"textinput",` in their metadata and provide a library called `textinput` +that exports an `input` method. diff --git a/apps/kbswipe/app.png b/apps/kbswipe/app.png new file mode 100644 index 0000000000000000000000000000000000000000..9564a4068b6b7d0beb52a26a6aa48cfb72b18047 GIT binary patch literal 2042 zcmV1GM#J7}(A_PPt(XlbpFmbg(FzwXU zP?I`MGuCw4WYUh)m?n+Xshyg3G}9&-r!$>trjwc$h|0sDfUFN<6R{S71rc`_1kq?j z1s}YAw}0TSfQzsK``cK)f8F!D=bm$Z-{1Y+d(XXB&XRg~ILuqW$%U&dner859?swEvr2Lk$31tPL6a(2vl zdreiTuj27(4@g?JaQj394 zyt938F!YgM0Ui?MS4l}pCQl6jQ1TPJe)-;5Fn=B*-5oG6Fo1ap@$NbinK2aG-k=u& zf@}e<0e`Vtt(|vi_dd`*6vqLk-uwmx^x#ve{>dL^^m0^?m$3=hG*F|$yvz;225+62 zQ!VKz`u(-^K;K{B{|=)B=pBIG7$rdO0QANv0eT0ZH%1B2I{>{gN`T%0=#5bV^bWv< zu^}P11;s>P`Sn@aIS|6bL)~R1{B%i*<>cgCA1S|nL%_oMiG+uR;&9dj zj8*VQM7W^^VNS6$AshpaiK4R8plnYi&Z$aIPuGU(*KY_g8jZa5`Y(7h{db%@|7G9m zDJW8bR0S9{;qcLltLBuI<)EEVO3IW_-eznsFUihs@y4&;5C9N5V;bB4^aqL$mT=_r zQXI}YE?n&Qs9+qZMIehrx_5WSbOkDNip7Dbf1}C2o?H-@Gf*$_D*^z zO8{tTY2~!TiNjfsqplviy$)yn8QR*~JT(^}0woa$t4oene3q2_z2~f-e$vpNKffcO zFCKjG0TSZlNQjSfKhrdgvrXr*JDk{^bvT^$*d29u{5lGrFd4*}wEX)EtvNd`db02L z1bBkMU|{;RDNLU>g>OCiP51Nb*Kbg3cd*}jh&_9YP)Y$3Y0^601zzxI%SSQ$1R)_~ zh>v@e*M7E+pTF{Q&#JVg-%0bh)qY+or=n8uD0}Al0Sq}D_p|VDU*48 zUc&Ia!4NTM0=f*HW^UamNtheQ+82M|u8Rl{BO*M^Ei0w4JL<3=Dxs+OP_Om;jOkPP z&0D|3Wb%(S*r20OFxgd}J!|IOR1py(Bf^M`2;)aT;H$J%588o<5EC6mOmvj@(fI&_9*UKa4|D-k*s6JN`(J5jY`V4H{`z9j zJz#%sMx!~!vJF@dusb)O-MRS$1_m&F+B712zxLnyQ_VQL)E? zalk}wU3u$?n>X92wL92bSWL;0ql^g-COjz~QomBYH1*6`TeIrrjn#4zOfsJ7O2 z-CkpJ+G}i|+fUhct$BXc*7}BX`3M?FG!O{T+ORKvq!c9*)K1s<6vOhjs zn44iys2|dO5tG)|YrOIHW{w>{F=Bq3FJHbbi1K*%*rz#ZQC`-EqEr&l1klmZLHg!* zsH{3UBL2R*bh)Qk?@7n!NqNDZtWr~#=?Q@b=$^60LzO2z zU3Mk%^FMZqK`j9;09?6pmCakW(b?HGY(C0PRHA9_L!oo~axxsA^mN;n*_V@5jj)Pa z`9)>bNeYYa7^LqR$IHsyWr4l@>FK&JRhXM;Rl=`b^451hSS`bZ-8uQ&U3R-P{@Gs) zx+mt28r$LU=$JBtGVCbWlbJPei@_l#D&ey(>FPlEThX4(%;BX#GZdep0UsMA8{cdXhusI(wQihd5MGmCn4+Q9n zQ3CW1KyQo^pmzYG$>|ZZtyJwmI=WATix$LwRC2UjDI{)S?ZHD(6^rK2`A0$C-4~bt Y10aN}YH-iLtpET307*qoM6N<$f~{lh@Bjb+ literal 0 HcmV?d00001 diff --git a/apps/kbswipe/lib.js b/apps/kbswipe/lib.js new file mode 100644 index 000000000..51f92f510 --- /dev/null +++ b/apps/kbswipe/lib.js @@ -0,0 +1,110 @@ +/* To make your own strokes, type: + +Bangle.on('stroke',print) + +on the left of the IDE, then do a stroke and copy out the Uint8Array line +*/ +exports.getStrokes = function(cb) { + cb("a", new Uint8Array([58, 159, 58, 155, 62, 144, 69, 127, 77, 106, 86, 90, 94, 77, 101, 68, 108, 62, 114, 59, 121, 59, 133, 61, 146, 70, 158, 88, 169, 107, 176, 124, 180, 135, 183, 144, 185, 152])); + cb("b", new Uint8Array([51, 47, 51, 77, 56, 123, 60, 151, 65, 163, 68, 164, 68, 144, 67, 108, 67, 76, 72, 43, 104, 51, 121, 74, 110, 87, 109, 95, 131, 117, 131, 140, 109, 152, 88, 157])); + cb("c", new Uint8Array([153, 62, 150, 62, 145, 62, 136, 62, 123, 62, 106, 65, 85, 70, 65, 75, 50, 82, 42, 93, 37, 106, 36, 119, 36, 130, 40, 140, 49, 147, 61, 153, 72, 156, 85, 157, 106, 158, 116, 158])); + cb("d", new Uint8Array([57, 178, 57, 176, 55, 171, 52, 163, 50, 154, 49, 146, 47, 135, 45, 121, 44, 108, 44, 97, 44, 85, 44, 75, 44, 66, 44, 58, 44, 48, 44, 38, 46, 31, 48, 26, 58, 21, 75, 20, 99, 26, 120, 35, 136, 51, 144, 70, 144, 88, 137, 110, 124, 131, 106, 145, 88, 153])); + cb("e", new Uint8Array([150, 72, 141, 69, 114, 68, 79, 69, 48, 77, 32, 81, 31, 85, 46, 91, 73, 95, 107, 100, 114, 103, 83, 117, 58, 134, 66, 143, 105, 148, 133, 148, 144, 148])); + cb("f", new Uint8Array([157, 52, 155, 52, 148, 52, 137, 52, 124, 52, 110, 52, 96, 52, 83, 52, 74, 52, 67, 52, 61, 52, 57, 52, 55, 52, 52, 52, 52, 54, 52, 58, 52, 64, 54, 75, 58, 97, 59, 117, 60, 130])); + cb("g", new Uint8Array([160, 66, 153, 62, 129, 58, 90, 56, 58, 57, 38, 65, 31, 86, 43, 125, 69, 152, 116, 166, 145, 154, 146, 134, 112, 116, 85, 108, 97, 106, 140, 106, 164, 106])); + cb("h", new Uint8Array([58, 50, 58, 55, 58, 64, 58, 80, 58, 102, 58, 122, 58, 139, 58, 153, 58, 164, 58, 171, 58, 177, 58, 179, 58, 181, 58, 180, 58, 173, 58, 163, 59, 154, 61, 138, 64, 114, 68, 95, 72, 84, 80, 79, 91, 79, 107, 82, 123, 93, 137, 111, 145, 130, 149, 147, 150, 154, 150, 159])); + cb("i", new Uint8Array([89, 48, 89, 49, 89, 51, 89, 55, 89, 60, 89, 68, 89, 78, 89, 91, 89, 103, 89, 114, 89, 124, 89, 132, 89, 138, 89, 144, 89, 148, 89, 151, 89, 154, 89, 156, 89, 157, 89, 158])); + cb("j", new Uint8Array([130, 57, 130, 61, 130, 73, 130, 91, 130, 113, 130, 133, 130, 147, 130, 156, 130, 161, 130, 164, 130, 166, 129, 168, 127, 168, 120, 168, 110, 168, 91, 167, 81, 167, 68, 167])); + cb("k", new Uint8Array([149, 63, 147, 68, 143, 76, 136, 89, 126, 106, 114, 123, 100, 136, 86, 147, 72, 153, 57, 155, 45, 152, 36, 145, 29, 131, 26, 117, 26, 104, 27, 93, 30, 86, 35, 80, 45, 77, 62, 80, 88, 96, 113, 116, 130, 131, 140, 142, 145, 149, 148, 153])); + cb("l", new Uint8Array([42, 55, 42, 59, 42, 69, 44, 87, 44, 107, 44, 128, 44, 143, 44, 156, 44, 163, 44, 167, 44, 169, 45, 170, 49, 170, 59, 169, 76, 167, 100, 164, 119, 162, 139, 160, 163, 159])); + cb("m", new Uint8Array([49, 165, 48, 162, 46, 156, 44, 148, 42, 138, 42, 126, 42, 113, 43, 101, 45, 91, 47, 82, 49, 75, 51, 71, 54, 70, 57, 70, 61, 74, 69, 81, 75, 91, 84, 104, 94, 121, 101, 132, 103, 137, 106, 130, 110, 114, 116, 92, 125, 75, 134, 65, 139, 62, 144, 66, 148, 83, 151, 108, 155, 132, 157, 149])); + cb("n", new Uint8Array([50, 165, 50, 160, 50, 153, 50, 140, 50, 122, 50, 103, 50, 83, 50, 65, 50, 52, 50, 45, 50, 43, 52, 52, 57, 67, 66, 90, 78, 112, 93, 131, 104, 143, 116, 152, 127, 159, 135, 160, 141, 150, 148, 125, 154, 96, 158, 71, 161, 56, 162, 49])); + cb("o", new Uint8Array([107, 58, 104, 58, 97, 61, 87, 68, 75, 77, 65, 88, 58, 103, 54, 116, 53, 126, 55, 135, 61, 143, 75, 149, 91, 150, 106, 148, 119, 141, 137, 125, 143, 115, 146, 104, 146, 89, 142, 78, 130, 70, 116, 65, 104, 62])); + cb("p", new Uint8Array([52, 59, 52, 64, 54, 73, 58, 88, 61, 104, 65, 119, 67, 130, 69, 138, 71, 145, 71, 147, 71, 148, 71, 143, 70, 133, 68, 120, 67, 108, 67, 97, 67, 89, 68, 79, 72, 67, 83, 60, 99, 58, 118, 58, 136, 63, 146, 70, 148, 77, 145, 84, 136, 91, 121, 95, 106, 97, 93, 97, 82, 97])); + cb("q", new Uint8Array([95, 59, 93, 59, 88, 59, 79, 59, 68, 61, 57, 67, 50, 77, 48, 89, 48, 103, 50, 117, 55, 130, 65, 140, 76, 145, 85, 146, 94, 144, 101, 140, 105, 136, 106, 127, 106, 113, 100, 98, 92, 86, 86, 79, 84, 75, 84, 72, 91, 69, 106, 67, 126, 67, 144, 67, 158, 67, 168, 67, 173, 67, 177, 67])); + cb("r", new Uint8Array([53, 49, 53, 62, 53, 91, 53, 127, 53, 146, 53, 147, 53, 128, 53, 94, 53, 69, 62, 44, 82, 42, 94, 50, 92, 68, 82, 85, 77, 93, 80, 102, 95, 119, 114, 134, 129, 145, 137, 150])); + cb("s", new Uint8Array([159, 72, 157, 70, 155, 68, 151, 66, 145, 63, 134, 60, 121, 58, 108, 56, 96, 55, 83, 55, 73, 55, 64, 56, 57, 60, 52, 65, 49, 71, 49, 76, 50, 81, 55, 87, 71, 94, 94, 100, 116, 104, 131, 108, 141, 114, 145, 124, 142, 135, 124, 146, 97, 153, 70, 157, 52, 158])); + cb("t", new Uint8Array([45, 55, 48, 55, 55, 55, 72, 55, 96, 55, 120, 55, 136, 55, 147, 55, 152, 55, 155, 55, 157, 55, 158, 56, 158, 60, 156, 70, 154, 86, 151, 102, 150, 114, 148, 125, 148, 138, 148, 146])); + cb("u", new Uint8Array([35, 52, 35, 59, 35, 73, 35, 90, 36, 114, 38, 133, 42, 146, 49, 153, 60, 157, 73, 158, 86, 156, 100, 152, 112, 144, 121, 131, 127, 114, 132, 97, 134, 85, 135, 73, 136, 61, 136, 56])); + cb("v", new Uint8Array([36, 55, 37, 59, 40, 68, 45, 83, 51, 100, 58, 118, 64, 132, 69, 142, 71, 149, 73, 156, 76, 158, 77, 160, 77, 159, 80, 151, 82, 137, 84, 122, 86, 111, 90, 91, 91, 78, 91, 68, 91, 63, 92, 61, 97, 61, 111, 61, 132, 61, 150, 61, 162, 61])); + cb("w", new Uint8Array([33, 58, 34, 81, 39, 127, 44, 151, 48, 161, 52, 162, 57, 154, 61, 136, 65, 115, 70, 95, 76, 95, 93, 121, 110, 146, 119, 151, 130, 129, 138, 84, 140, 56, 140, 45])); + cb("x", new Uint8Array([56, 63, 56, 67, 57, 74, 60, 89, 66, 109, 74, 129, 85, 145, 96, 158, 107, 164, 117, 167, 128, 164, 141, 155, 151, 140, 159, 122, 166, 105, 168, 89, 170, 81, 170, 73, 169, 66, 161, 63, 141, 68, 110, 83, 77, 110, 55, 134, 47, 145])); + cb("y", new Uint8Array([42, 56, 42, 70, 48, 97, 62, 109, 85, 106, 109, 90, 126, 65, 134, 47, 137, 45, 137, 75, 127, 125, 98, 141, 70, 133, 65, 126, 92, 137, 132, 156, 149, 166])); + cb("z", new Uint8Array([29, 62, 35, 62, 43, 62, 63, 62, 87, 62, 110, 62, 125, 62, 134, 62, 138, 62, 136, 63, 122, 68, 103, 77, 85, 91, 70, 107, 59, 120, 50, 132, 47, 138, 43, 143, 41, 148, 42, 151, 53, 155, 80, 157, 116, 158, 146, 158, 163, 158])); + cb("\b", new Uint8Array([183, 103, 182, 103, 180, 103, 176, 103, 169, 103, 159, 103, 147, 103, 133, 103, 116, 103, 101, 103, 85, 103, 73, 103, 61, 103, 52, 103, 38, 103, 34, 103, 29, 103, 27, 103, 26, 103, 25, 103, 24, 103])); + cb(" ", new Uint8Array([39, 118, 40, 118, 41, 118, 44, 118, 47, 118, 52, 118, 58, 118, 66, 118, 74, 118, 84, 118, 94, 118, 104, 117, 114, 116, 123, 116, 130, 116, 144, 116, 149, 116, 154, 116, 158, 116, 161, 116, 163, 116])); +}; + +exports.input = function(options) { + options = options||{}; + var text = options.text; + if ("string"!=typeof text) text=""; + +Bangle.strokes = {}; +exports.getStrokes( (id,s) => Bangle.strokes[id] = Unistroke.new(s) ); + + var flashToggle = false; + const R = Bangle.appRect; + + function draw(noclear) { + g.reset(); + if (!noclear) g.clearRect(R); + var l = g.setFont("6x8:4").wrapString(text+(flashToggle?"_":" "), R.w-8); + if (l.length>4) l=l.slice(-4); + g.drawString(l.join("\n"),R.x+4,R.y+4); + } + + function show() { + g.reset(); + g.clearRect(R).setColor("#f00"); + var n=0; + exports.getStrokes((id,s) => { + var x = n%6; + var y = (n-x)/6; + s = g.transformVertices(s, {scale:0.16, x:R.x+x*30-4, y:R.y+y*30-4}); + g.fillRect(s[0]-1,s[1]-2,s[0]+1,s[1]+1); + g.drawPoly(s); + n++; + }); + + } + + function strokeHandler(o) { + //print(o); + if (!flashInterval) + flashInterval = setInterval(() => { + flashToggle = !flashToggle; + draw(); + }, 1000); + if (o.stroke!==undefined) { + var ch = o.stroke; + if (ch=="\b") text = text.slice(0,-1); + else text += ch; + } + flashToggle = true; + draw(); + } + Bangle.on('stroke',strokeHandler); + g.reset().clearRect(R); + show(); + draw(true); + var flashInterval; + + return new Promise((resolve,reject) => { + var l;//last event + Bangle.setUI({mode:"custom", drag:e=>{ + if (l) g.reset().setColor("#f00").drawLine(l.x,l.y,e.x,e.y); + l = e.b ? e : 0; + },touch:() => { + if (flashInterval) clearInterval(flashInterval); + flashInterval = undefined; + show(); + }, back:()=>{ + Bangle.removeListener("stroke", strokeHandler); + clearInterval(flashInterval); + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }}); + }); +}; diff --git a/apps/kbswipe/metadata.json b/apps/kbswipe/metadata.json new file mode 100644 index 000000000..635841e62 --- /dev/null +++ b/apps/kbswipe/metadata.json @@ -0,0 +1,14 @@ +{ "id": "kbswipe", + "name": "Swipe keyboard", + "version":"0.01", + "description": "A library for text input via PalmOS style swipe gestures (beta!)", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"} + ] +} diff --git a/apps/kbswipe/screenshot.png b/apps/kbswipe/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..11788ad8793bfd0b93113f038a1d08bcaa67860b GIT binary patch literal 3823 zcmai1X*|>m)c(&FL$*Yg>V{=j;bQ_^aEu^a&%A{(H3 zbl-&qWb`mh`qT1aW8&iCIF~swF=(?Bw%13(#kSe2X77?7a0(i>W5c-A+QxP+!2SY| zkrqXW#D{f?w2b@RMlpmN!7h#Pbxq0VJp1LJ5>p@j%bMb6g%fJx5k2$%#lCU|pxJ)P zhKM_|4G{`oQ|}4=;*~NNl)nE&xME!+cBtM+1TfG~8B#+wTCZ1$GKKzIhvw4w zf3)>kC?^AVmK2CGL1O4`vGakXzyzrF)|cE!ffs5IcqdhR%3~tz8+>e?()`D=LqRyC z@E2p>`GGv`nvjQ)Y7Z{dt>%Aq0>-T+hw`)&vN)auyyZ0m(?;LJFpuyPw8r$u6J}lv z4^4}I$e>%7$z76D?RkQ4!`9!6L_mXkxWu{XyMOe+RO94nXz^j|xevD%V@T1t3t-1q z60U&nyjssqi@LT{dk35Ei`ZJWGBXxW`L!-7ehrVZJwaNpyoQ|}w;|T@%z#lYPRzVZ zEZ1ab5o8a%w*T2N_hCi}h_y#6{jhsT{jsW~MrG3@VS#x<_E`^3*{}iuvpbpZM&WV` zddVRA_{M@$9z?%#BhzJRLo?Rp254t*wS~2}u)s&H`y&%VUs7A(oE^d|+Racd9qREW zVg{svajmp)%s1|7{k1FZGiORVa+59!SYZeY#>KRR5E&gTt-nKL2l}c>!=I2PT_J6b z5ZcTHwqrBzzZCUA(AWxt`I?5})YuMGgjjVgZCa#wyE9V##`C4bl!3HXN!mAdcAo9W z-g`B)0epz^$(m2YcN`#OdwxZou?vn1r8?qMcK!t!(7y*9+!xmbp7cA*o^(&2Qbi2e z_??-MUc+}10tcs`YesIRw5B9M#NdGVi12rRLTRxS&K|nsh8P8FG7!b6Y6-uu&!9N~ zetVr8K6a&Hqt>z1u1qkWprK78`wq~jr`Xtz-mPogL3jd#6ZbTyBHq97isOM?fN?Lh zhX|^^J1}VE%sp0drm_Y7zEIRKT@<_+u9nB+geOez0k>u*t1D@sc=^a%Zp7lE%2h+P z`F0}zkjpXpTvonIuf;|g6Vs)Sm5pt~cQXD`*!w}C{{xM9X?8;*S&c*;c)9|U9&fLr zER5t>?XUALkHIwJOGW6VIi7Q$4OKczhA*i6RBn}SZ!L-ev-p(mSo4y@rj;xD!~Xnf z+Zf5UH3#xe+iSIRHx*7Fsc?XoP9%N=ZA~td)hbj_VW&>}VAc+#5_$(2olwGWAFLZH z>@a+;?J8P9^fAiwxV)n9sXOW73cFj*rK69=$J^IGG2BnL9&`WMe;PsApWI_SYCs~q zp}%;7%L^hz_q;P|A&yslr|E<+PVM1!DtWrb!*_e>bOy!dpf=J1ate7L*es5x0 za$Oc=pPX&Gbwd`k@Aj$&A$^_9h4NIsp0!GWB0|ofy)wmoKxT?qkx5ajgtBBC>Jaj?!RHt?ymSYS6yGg zqh)3?t17A0sJquXML^&-5HI!!@sQTm0cK^^S)Ni+d?h8QtSe=a8|-y0@8=g8_t3D| zD0I4|C+SZvN7FSIP;)_pGv`~Rp>!d@r3>8Ik+kU>ZdULbRiT9smx&IYu(fuvx2TC* z)&~mOLDB~#Vqcfz8c4(KAv9(1;kuri z{l|u;*a2$uU?F|Fk<0WHIccr!H!(pNADUIjPRPSltQ-?ew z7E^k$PoG91!V)4#Z4GY&;A7P{&-b-D`gs8NqYjjv<}tPx%!qzCzq#xlQr+3zEJ}dK z=Yb7X8wt*1(M#idtH!>Sm7*QG*K1O_iSpQZb8-HW-k!mYl>{fw1FM6UVJd&q##I{p zmwu>d%Z{hF8>3jmlN4*0nTTUhhdoMS;w}i@N2G z)lnl(2AgvSaU%1V1kbu&>PZ&7)KwwU-T%zHutyxZZXiPEbywGeB`5co()Ho963+8@O?X|_ z4mbTwUTKO~wS9Ma^P&9yfZ>IcQZj_pRz}>PXzWS70(dfJh1=a6viO!NKEZ54``Okv z`*cK&XX!}BT|#-(v1GfgLO}F68Ieih5?wdNFmLSk*a35Qvg@Es^2Aql6h~^I2h{`V0}Bi2_q7firTIB9%c zbITi>)8alun)z3&$azd2th&589B7)BH)$N$s7_5Z07MBtq{%H>l{on!7XmvV8@ip@qHHRsfEpf0_K2M0>PQy3u0NxiofR&rr8g1+gomf5CAZ$ktF^t5$j6U|gg!UC^#blUT+0z!Z z&RN;ZdR%fQLU$OOUccbM=YpwV_^;u`kF&zFp0mEN6SJiwIh{(h_q1W2Gc>c8>Iv_p z-9Pp9XSdaCImB(c9=b%$bT@S5eX=AtAoe#?8yEK!;lW_?S$B|j@J1Ra+fD7XR1&uC zmCUuD+pBy23-xQM`wejR`lF@Uske2^n)&0mS`R)RcmtFbwpeCvJ=&MLkr~OVC|G2{ z1Ws&Y8}XZ*{1$HGP z1y~g^Se585+f18_bVg|?=$>OP*-hL&RSYQbk|er$JYQcWt2fI#V^@!(LP9>#YW98? zPO^jM+F)dGHmtj<#F3r*spXr2xcmL(5gt~|_FEn|&+t|7FI9U@5}BfqhiPKkp?ldA zbSG5?i5oPj*m@W@n(0^m-SgraD?)t-A**_~{vc{Capy{J(b+1TMjm&dT$$mLUiY~z z|5r}LuWL$>$*P^@-w1RW^Tc`d0rlb{4;lLMt9i2P{o}}EdTy03d|!Mv9qL8w<`7)J z=D0Ze&21hi>s*aKtApiKiE|c#TGmJ5S^iUci-FmL+x%_My$LjeX*q)jl3#etivXPmxYU_LdU$m5qMS&utt_%GFUya?bHqZV zopoX05d#BlDvFUuW?y?99rN~V2GDAr`;c-ZupP$i&BY2sFiX)(;;k`JiKf?{buW=; zal;X|4|p5!eB!&OifVYH?!H_Z#jY_X*b?Q$tM<~sbxbrN+BfJ7%!=uo45oDoZz$EBbrM1Nv6v6;a(F~ z_K0{x6Jt@o2|cw)n+T+CQy=8TuR-A~An5q7S0_yEFk4^GspM@7XXMUoEn>P-z2VYY zhw;n;((t@W5TSj!GerCN3!~?N9{0X~*MgU{^{hVb%||cIXMiLux-gK7F05_svSOnn zM)toQxNnrUpTv*2t6#i9{XuhiPQOizgk`7c|F^VUi#KJI0b|BgSu=e(3?bhpO8vYT z%|!UMd_a>$MAL_cQbM!K1U!pV`bf Q`d|Tb6RRr}WB2&~0e-$dDgXcg literal 0 HcmV?d00001 diff --git a/apps/kbtouch/ChangeLog b/apps/kbtouch/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/kbtouch/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/kbtouch/README.md b/apps/kbtouch/README.md new file mode 100644 index 000000000..513ba9239 --- /dev/null +++ b/apps/kbtouch/README.md @@ -0,0 +1,37 @@ +# Touch Keyboard + +A library that provides an on-screen keyboard for text input. + +## Usage + +In your app's metadata, add: + +``` + "dependencies": {"textinput":"type"}, +``` + +From inside your app, call: + +``` +Bangle.loadWidgets(); +Bangle.drawWidgets(); +require("textinput").input({text:"Foo"}).then(result => { + console.log("Text input", E.toJS(result)); +}); +``` + +The first argument to `input` is an object containing the following: + +* `text` - initial text to edit + +(in the future, the ability to restrict usage of newline/etc may be added) + +## Make your own + +You can create your own keyboard input apps. Just ensure that they have +`"type":"textinput",` in their metadata and provide a library called `textinput` +that exports an `input` method. + +## To-do + +Make this Bangle.js 1 compatible (use left/right touch and up/down buttons) diff --git a/apps/kbtouch/app.png b/apps/kbtouch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..19aec3c05b794809eae76077da580c604f981c42 GIT binary patch literal 506 zcmV&(fVX&)lQkODWP$9~zxmoIHO8{0cs!=+0aVFEEh#Mnrn((KgzLy9_SD2DG(jJL z3I|bZO2&XUKHDM4D1e5Nj#`(pC+T~t5!-mw=rtjwp?QeAhgX1$@V)Pie4-Gx(<@u9h&#<}y zF?fK0uBMk4iY^|k$Ef}R5M|re1l#|CCV=Os>T_EIY#V3*c&N&?T9lDwa%>^I;HB#ld_5-jY=EeDzG8vfqF+kTfoZ wlBVcqp}4rSP|^YlrR)v36mmEm4o6w@0yuf5j`FMk(f|Me07*qoM6N<$g18aoQvd(} literal 0 HcmV?d00001 diff --git a/apps/kbtouch/lib.js b/apps/kbtouch/lib.js new file mode 100644 index 000000000..3dfdce00c --- /dev/null +++ b/apps/kbtouch/lib.js @@ -0,0 +1,132 @@ +exports.input = function(options) { + options = options||{}; + var text = options.text; + if ("string"!=typeof text) text=""; + + // Key Maps for Keyboard +var KEYMAPLOWER = [ + "`1234567890-=\b", + "\2qwertyuiop[]\n", + "\2asdfghjkl;'#\n", + " \\zxcvbnm,./ ", + ]; +var KEYMAPUPPER = [ + "¬!\"£$%^&*()_+\b", + "\2QWERTYUIOP{}\n", + "\2ASDFGHJKL:@~\n", + " |ZXCVBNM<>? ", + ]; +var KEYIMGL = Graphics.createImage(` + + + # + ### + ##### + # + # + # + # + # + # + # + # + # + # + # + # + # +`);KEYIMGL.transparent=0; +var KEYIMGR = Graphics.createImage(` + + + # + ## +##### + ## + # + + + +### + # + # + # + # + # +##### + ### + # + +#`);KEYIMGR.transparent=0; +/* If a char in the keymap is >=128, +subtract 128 and look in this array for +multi-character key codes*/ +var KEYEXTRA = [ + String.fromCharCode(27,91,68), // 0x80 left + String.fromCharCode(27,91,67), // 0x81 right + String.fromCharCode(27,91,65), // 0x82 up + String.fromCharCode(27,91,66), // 0x83 down + String.fromCharCode(27,91,53,126), // 0x84 page up + String.fromCharCode(27,91,54,126), // 0x85 page down +]; +// state +const R = Bangle.appRect; +var kbx = 0, kby = 0, kbdx = 0, kbdy = 0, kbShift = false, flashToggle = false; +const PX=12, PY=16, DRAGSCALE=24; +var xoff = 3, yoff = g.getHeight()-PY*4; + +function draw() { + var map = kbShift ? KEYMAPUPPER : KEYMAPLOWER; + //g.drawImage(KEYIMG,0,yoff); + g.reset().setFont("6x8:2"); + g.clearRect(R); + if (kbx>=0) + g.setColor(g.theme.bgH).fillRect(xoff+kbx*PX,yoff+kby*PY, xoff+(kbx+1)*PX-1,yoff+(kby+1)*PY-1).setColor(g.theme.fg); + g.drawImage(KEYIMGL,xoff,yoff+PY,{scale:2}); + g.drawImage(KEYIMGR,xoff+PX*13,yoff,{scale:2}); + g.drawString(map[0],xoff,yoff); + g.drawString(map[1],xoff,yoff+PY); + g.drawString(map[2],xoff,yoff+PY*2); + g.drawString(map[3],xoff,yoff+PY*3); + var l = g.setFont("6x8:4").wrapString(text+(flashToggle?"_":" "), R.w-8); + if (l.length>2) l=l.slice(-2); + g.drawString(l.join("\n"),R.x+4,R.y+4); + + g.flip(); +} + g.reset().clearRect(R); + draw(); + var flashInterval = setInterval(() => { + flashToggle = !flashToggle; + draw(); + }, 1000); + + return new Promise((resolve,reject) => { + + Bangle.setUI({mode:"custom", drag:e=>{ + kbdx += e.dx; + kbdy += e.dy; + var dx = Math.round(kbdx/DRAGSCALE), dy = Math.round(kbdy/DRAGSCALE); + kbdx -= dx*DRAGSCALE; + kbdy -= dy*DRAGSCALE; + if (dx || dy) { + kbx = (kbx+dx+15)%15; + kby = (kby+dy+4)%4; + draw(); + } + },touch:()=>{ + var map = kbShift ? KEYMAPUPPER : KEYMAPLOWER; + var ch = map[kby][kbx]; + if (ch=="\2") kbShift=!kbShift; + else if (ch=="\b") text = text.slice(0,-1); + else text += ch; + Bangle.buzz(20); + draw(); + },back:()=>{ + clearInterval(flashInterval); + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }}); + }); +}; diff --git a/apps/kbtouch/metadata.json b/apps/kbtouch/metadata.json new file mode 100644 index 000000000..da8b6c3c6 --- /dev/null +++ b/apps/kbtouch/metadata.json @@ -0,0 +1,14 @@ +{ "id": "kbtouch", + "name": "Touch keyboard", + "version":"0.01", + "description": "A library for text input via onscreen keyboard", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"} + ] +} diff --git a/apps/kbtouch/screenshot.png b/apps/kbtouch/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa772ddaa2b3d21bb49a23cb3a4132c4eb23b6b GIT binary patch literal 3208 zcmeHK`!^E~8{fr-Z6a-%+vHo4TU2tN>zGv7Fmj2CFKNb1G}M`-C(`fngEM>VLa3X zws6>2vsj(oE;Bs4%im(iYeRe%kI&aVxOB ztI(QE>#vKX`5AGTn+~~3&v!NKnYS6@b&u~K`Te^tKMwMDd3g6&{$Ywne#SdwYOKH= z5)F6WEzoOyBJ$eX6Rs}D(M#DJU`ZxIbHXR_*(Qhd`vFQkSbR?9rVRwYW zpazNwb$_6Zqf(14jQf6X4|;+vqLk5s=W2}p1^TdUF{jG5twDCx>2kPsuFta>ofcYS z_JdyA+a1#>&4h6f|CwAhJz?&{2wWgK5B@EukhLrcZtHz5M(Y)=bzK`a2ez$hKgVjH z%jEurJtDcNbawYh|8SgC;YIz#N!SoLy5klCN>1AST_VS7r$A4!-9#p_r$&6pdwD&9aua`ypz`Z zz9msSW(lt)X~1f~UB8_UKrk?Y1&NquPg8#vpUurLwyllBHJq>`MQLZFwcfPL2p)Ke zk28>w&mCZ#=SPzAn-XYoQHc{d>lW$$q(IuwyOqF4#x>YebR+~3k#_rXWDW=_)*Z)& zr-7g*_73Kz$ARGZoMrooup|?E)5$891lU&{uGtYlb3u-}y+s*ts4{ckaFF&Lf*JUy z%|mThgwnliSM1{uY^1Dj!aq>-lRq(Sv6kFWgn?@(3ax%=z8Pr5ae=iB-q=ajmxch6R;Nlpg`liCe^D@v>7%nV7#rF9#z;u$d7=HD`?G9GJr1l(5`?_uib7O0+*Pe& zEst6ThSOvggVmUYs%ahE9cHl>N(-|>=B5WWGv6g$w!aI7HmzK_H_)Mc((4!637bQl zbQ5LH(4+5TDYR>PI71sL6L4D%YkPvxUNAH5nl`K@aV7d!P8kW;fGN&3Q(Mj*CKif5 zVv@=@{n8`|qg^o3G}$9p4hkqsvte4kFE(u_|q<{wXEWwnDS3-#0W>0j_S~sN-!2%|p-B#%Fa&KDUK=A0{ z-ehLlgE{?j*_II$TI-$#g|-UuFm^Si{U@fjRo~5e7~qI$un|-Q8q(iZalChJS&bs(J_IwJlis zD<2)!plxaP{b&BO-s7<-|7YPFE8l07YaFd!idgJYx%=Shl@%>k8?F zlbKLTHr}(`O-T+?mGb%_OTP&N4WyPDoV=hOn_bfsASzQ_o7QklhtqG!$MZ};!N`Cg zS0tLBbtrDyq0kyC^b~DG>zK^q#v8YV$3TaD8yR?=tQPgyCLHo0sNM59o}W^EZUI@T zhO}zQ*1?82*rz|bs^U#&N?X$^n)V@OXA}t*y7wzp(-huZvnFh;PMm`~w$9(l*(b4h zz<>)WhuhyI#4Quz8tc;6gMAM7TD|w=nY{nXvw(^(BY(zW%;A8ehwyJ+RU5-yf8cwk zC-fx@V4Y*6fJP8By7A?Tl?M>q7OLKdi3)WfeZo`9j-1UK{(?Je#DSuh&(R8TlS=Mo zmnO?UKgO23{94EQ`O@K@0&QzN@b+mnC>lchbPYcmFWS)(H_2fu$ac1CX05M%n^jO_ zHxEYl`&i_aqWCb!X%i!Ilh^CxBgB3q^ z&9sgutzHm?1Q%jtH14V5sVwEtMotKp0ATX>W+5V&22KaeDYT}f0Ed6Ck$Xqfr_XJ7 zVoJ{$A_2c6I3ROx0^t!CHUvv|)_1kQXV%9Mb+Fn7A&l*gfuz!qt6p;db5rpmMK)&I zW|hMPviOBgLqB&_MU$U|%=M)x^w<@N3D@x@I}gn7w5C|%Yut2%ofcYp$*~uVINfQr zlV73Y>;^Z0LpEzYdV%zTG*izrCVu0g&>mv0d8&6ApNbX$A0ih08m3g~VWz7@LzDn$ zRD9gk-lkwKNikvXz2ec64(vMbcY{&o{Q9E3>{C{y#QN;bt>JG@l}6?fQH7zI=@PLj zU(4ud!SMTvu6Nm4Se%u7z~xue<*F}tB^IY{;AkwNLt@cV5Vm;NGtm(pgFHuYW#I{- znYbd)Nx0bD^>>3@DS!5;kj$9{T3lH5`r}_y`}p1X7Hm3xBk{S(y6ZK-%?!NS!@f0c zqqW(gY(8KV13<8Pz9#B&$lb{jt~$71=Qjzpaa+n?iPSupO4Xjwp-M`n-|wsncMEsF zt;dK|J&CdUE-wf88QKDj1yB@7)phfqKC%nMHQYF#nS*73mW$8S&e2 z&?o4(3_OrO=V7i;=RXp^bn6T82ePPFaTwU=lrmr7m|tl=J!P?V!KFh>Vju?E91}U; zcGtnWb`09wFYnmgxx?(IxA-rnDWh*QG$;u&qx_!PATEx7>Mmd=cjvzaRQMb=2UC-f z9CFPr*^Ah8scHL_7r~3Yc{$#6GL5KBxXvj2$$IBs!5Nz{s){i8yCy&0r$82 zna5_N8|i{Z0Ap46K@klKBpto-w%JLa`iZ$JtC_7%m#8!D;>=rz+v~`PMQeydO=SQ3 zn*jTj~WPEmGV*ZVemvVaI*mR0aSLi zY@H!Z7XEgnachZjmTAd$>`)iS74=zr-K8t)Jz~Nej}7&#EGyI{!_nJRa2pY&fehnR zDrm6X5Jv5l=U&%9#Hzb3nM#kwchRv*eBBq!C9;HWLQQIuSn?yT W?Um+=5q0~u035S-##P$}T>USMPwCeH literal 0 HcmV?d00001 From 19a91003295c8bd5382b6843e12353a01daa88af Mon Sep 17 00:00:00 2001 From: Helge Berland <34238056+hberland@users.noreply.github.com> Date: Tue, 5 Apr 2022 22:10:17 +0200 Subject: [PATCH 166/197] Added norwegian locale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added norwegian locale to the list, and also listed our three special characters æ, ø and å in the fallback list. They are all in the codebook, but I'm unsure if they will be rendered correctly with the current code (the two last days of the weeks contains the ø). --- apps/locale/locales.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 073f4903f..282c808f3 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -39,11 +39,13 @@ these conversions */ const charFallbacks = { "ą":"a", "ā":"a", + "å":"a", "č":"c", "ć":"c", "ě":"e", "ę":"e", "ē":"e", + "æ":"e", "ģ":"g", "i":"ī", "ķ":"k", @@ -53,6 +55,7 @@ const charFallbacks = { "ņ":"n", "ő":"o", "ó":"o", + "ø":"o", "ř":"r", "ś":"s", "š":"s", @@ -681,6 +684,24 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, + "no_NB": { // Using charfallbacks + lang: "no_NB", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Ma,Ti,On,To,Fr,Lø,Sø", + day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } + }, /*, "he_IL": { // This won't work until we get a font - see https://github.com/espruino/BangleApps/issues/399 codePage : "ISO8859-8", From 333d4053424da271ec09edd5f64d0fc32c9c91b7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 09:13:35 +0100 Subject: [PATCH 167/197] sleep -> snooze, and add images for alarms/timers --- apps/sched/sched.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index a19c85717..4fdc82736 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -18,15 +18,22 @@ function formatTime(t) { } function showAlarm(alarm) { - var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); - var buzzCount = 10; - if (alarm.msg) + var msg = ""; + msg += alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); + if (alarm.msg) { msg += "\n"+alarm.msg; + } else { + if (alarm.timer) + msg = atob("ACQswgD//33vRcGHIQAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAAAP/wAAAAAAAAAP/wAAAAAAAAAqqoAPAAAAAAqqqqoP8AAAAKqqqqqv/AAACqqqqqqq/wAAKqqqlWqqvwAAqqqqlVaqrAACqqqqlVVqqAAKqqqqlVVaqgAKqaqqlVVWqgAqpWqqlVVVqoAqlWqqlVVVaoCqlV6qlVVVaqCqVVfqlVVVWqCqVVf6lVVVWqKpVVX/lVVVVqqpVVV/+VVVVqqpVVV//lVVVqqpVVVfr1VVVqqpVVVfr1VVVqqpVVVb/lVVVqqpVVVW+VVVVqqpVVVVVVVVVqiqVVVVVVVVWqCqVVVVVVVVWqCqlVVVVVVVaqAqlVVVVVVVaoAqpVVVVVVVqoAKqVVVVVVWqgAKqlVVVVVaqgACqpVVVVVqqAAAqqlVVVaqoAAAKqqVVWqqgAAACqqqqqqqAAAAAKqqqqqgAAAAAAqqqqoAAAAAAAAqqoAAAAA==")+" "+msg; + else + msg = atob("AC0swgF97///RcEpMlVVVVVVf9VVVVVVVVX/9VVf9VVf/1VVV///1Vf9VX///VVX///VWqqlV///1Vf//9aqqqqpf//9V///2qqqqqqn///V///6qqqqqqr///X//+qqoAAKqqv//3//6qoAAAAKqr//3//qqAAAAAAqq//3/+qoAADwAAKqv/3/+qgAADwAACqv/3/aqAAADwAAAqp/19qoAAADwAAAKqfV1qgAAADwAAACqXVWqgAAADwAAACqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAAOsAAAAKpVaoAAAAOsAAAAKpVaoAAAAL/AAAAKpVaoAAAAgPwAAAKpVaoAAACAD8AAAKpVWqAAAIAA/AAAqlVWqAAAgAAPwAAqlVWqAACAAADwAAqlVWqgAIAAAAAACqlVVqgAgAAAAAACqVVVqoAAAAAAAAKqVVVaqAAAAAAAAqpVVVWqgAAAAAACqlVVVWqoAAAAAAKqlVVVVqqAAAAAAqqVVVVVaqoAAAAKqpVVVVVeqqoAAKqqtVVVVV/6qqqqqqr/VVVVX/2qqqqqqn/1VVVf/VaqqqqpV/9VVVf9VVWqqlVVf9VVVf1VVVVVVVVX9VQ==")+" "+msg; + } Bangle.loadWidgets(); Bangle.drawWidgets(); + var buzzCount = 10; E.showPrompt(msg,{ title:alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", - buttons : {/*LANG*/"Sleep":true,/*LANG*/"Ok":false} // default is sleep so it'll come back in 10 mins + buttons : {/*LANG*/"Snooze":true,/*LANG*/"Ok":false} // default is sleep so it'll come back in 10 mins }).then(function(sleep) { buzzCount = 0; if (sleep) { From b2b4f2e29dd4c7b70c90db2983bdc9f01024c61c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 11:30:20 +0100 Subject: [PATCH 168/197] tweaks for last PR to get the tests passing --- apps/MegaDenti/app-icon.js | 1 - apps/MegaDenti/brush-teeth.png | Bin 42215 -> 0 bytes apps/MegaDenti/metadata.json | 14 -------------- apps/{MegaDenti => megadenti}/ChangeLog | 0 apps/{MegaDenti => megadenti}/README.md | 0 apps/megadenti/app-icon.js | 1 + apps/{MegaDenti => megadenti}/app.js | 2 +- apps/megadenti/brush-teeth.png | Bin 0 -> 11582 bytes apps/megadenti/metadata.json | 15 +++++++++++++++ 9 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 apps/MegaDenti/app-icon.js delete mode 100644 apps/MegaDenti/brush-teeth.png delete mode 100644 apps/MegaDenti/metadata.json rename apps/{MegaDenti => megadenti}/ChangeLog (100%) rename apps/{MegaDenti => megadenti}/README.md (100%) create mode 100644 apps/megadenti/app-icon.js rename apps/{MegaDenti => megadenti}/app.js (99%) create mode 100644 apps/megadenti/brush-teeth.png create mode 100644 apps/megadenti/metadata.json diff --git a/apps/MegaDenti/app-icon.js b/apps/MegaDenti/app-icon.js deleted file mode 100644 index 0b121d700..000000000 --- a/apps/MegaDenti/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("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")) diff --git a/apps/MegaDenti/brush-teeth.png b/apps/MegaDenti/brush-teeth.png deleted file mode 100644 index e1c8e2baf15f33b5483693e0e97203505861fe84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42215 zcmbsQg;!Kx-#-oyT~d+)Lx@PXbczUqba!_*NTZZWsI;^wEsb;wLkI)X(%s!P{PujV z@BRD(k83I8tiw6`?0D~2?e}Ub^7yz^xDW^gU*VOk1_Xi%KB7XfF~N^hzp-oZ1Km?b zK?@uF3BeU{UYiU=+_Mlc8n<1P?=KtS+&MSojP-U=lb5Mt&g?OZ>d|}Xb-}b+42xH`(FQOr4 zY@aZu_76oNvLcRek&hcL!9K+DZ9TldsU;{}PfWu_HUkf@A|u1}*0q^0?2$C@NdX74 zY1%;*_sbzC?8JV=hdcqx$Y1Wwge;Oe;Du6`2T3z~7I1^hqG$c+Bq;9FO-sVqY=TMt zyQ<;1UEq`(;v_A~gTdnT&zBK-9Zlb0k5qsuMd&@MPC_d)^0Bio@n}Mh+OBG;{l*dx zl#orXv+ge3wOvPD>~VagHgvS`4cSKsXP%*k%LTt5D0Jo-(*N}u4z7iGiZAlI9hx2l z#5XD!hJ3Uc-%uO!)$r|BdtD8{7xmfNJ;GTVyLgC9lYvk*`JfYU+3!0CrlGc8+Y3d^ z9ux$@wFL5(`|Rq%_scHu9pPb;JoV4WuRJ=ag`-cnw;SI4MES6D&q<8DEU0|t7O$ay zhg5Fb0{IfFYVM0{qFle{va3e6)v3up@{^<7K4}k|mZ3?di4+o@e^F+a!PZryn2L#OOX!J-qN+t)Ikw%QW(T3# zs<6X0h85`1d!IQx!#?9`LQ_iYjGX(=3FMft9;-p zl!-C`HQY_XWhg6@Xt{L~ZG|9|ijdInyg}^Vmz&$~*go}|>6ybfaU%jPK1(77kJtMU zY=(?Jx|IYE$+ho=T*HO#=cXGQu7SosMcpomjD*X@PoW$r%QR$M;cN|P^xPb?YbQ6qdez|7gdith@BB@nmi`;j zkoPEMo46#M#8xQa*^y7B<=03*Vq{U9-D-|=r_(Bm9K}^pA}v)>AtL zhrdejg7cUMmw_MrZndEa7Z(o3GtvpwFx5J=#fpLDPrjv5%!+T=KG2$6!j$_hwH){ z_@!b-32s8O;%HuBll}M1zm(D~<0eNBhks>WJ3;bQ1!+-)O;{Hl%{bM@V^AV0qL4!n zrvcsk$yBreIaHI9ZZCsY95J8K+&shhg~rdbAC0~A@V}8v#M!hHq17jGkSav>f#j&q zF5JYWJ)zxXkt`O$R` zYcIShcetUeSQ9#<@zlneKpP0<8_N7ppYmVR-ck2>I-PMz;M2Y>9#6FF?G1%X>cHKz zezmKZJrmt8#y;XkcK+reshXik_bAErsU{f8D%Yhc^|jR7tCN$v3-;&_+u`YPO%KnH zI#_-*6K;OI&E$OcMM??O@~hCg+9%$d54zuud6t<(i13elhIYI&eIhQNaWNl|je$q5 zsSTUMxgo>KhqR%bW%7m@Rk5~)qy5*mZG3t?ksoU2n`7ERf)G`4;Dwt7hEM;o;)hq$zx4GMPjFt*YczqHF8>+)gyIMA%S7`V4`X z^}Dyd>B#xni|-rrOwR$^ za1>h8`Z%E8hSfmHMV^2HAnPKICCgH9c}d9>;;knPXSpdUbX)2?J&@wjJ@EGQ%yXP9 zD>ZEkn{T;UTr$5#goe~Xbwb1$_w|uYpJFGnJV|Th8c{3!)QjbSo0?ThLNw=?H z>K%Ou;`RZxU<{d5Y5k5QDpuo&k1%as&L^U}PsrkB!Wh=s&-%P$SW*#;SGKBv0fMbq z;|DHO%;77ET3O&5n?IM4<*m10tE>m?2Wnqn#C+-e>!UX-gDe&STAlTGC#LnI_~b>o<6iG0Me!lMX}ucjCDyH?zdLsn`5I;4N~ppI;K? z1^xW$@L8=b_u9!xFqNunN7fM%JpDKa zFaHtXtHq5Uy!OC*h5ea?8+AM4`tGE|kg?4Z zW1gWzI6}j=v3w88jDuYmZYU(RCn4?^{J}m zSz1HB$0j>#|7+4aA zSEPFsA)%uMswc}I-}x=SKmXn1GMSZ~xwvR1iCEPn=g@nV#J267?2$_)H(*}yOo(Xx z%XkvevdiPJpPQEzJpMFer9Ww21adTAfALolU!b&+nf;*z?6Tg(vt{ zPbE{*`us4hy}CWchLGbAV*nUyUyF`SF;fGPA{FE4U=5MTQVvRfnujFg)gET|h`T>& zmRgjhIzRt${tScmSyU3~u*Pg|?td?^{q%`QH9wLoN@O+Conn!N$Z;a4(+D}|XBC8E zEG-;Lbtna?P{*<#AKvllUA^;>Ioo;?Zf=9vigoo#oViH?gqf~oW*E_jbs*&6m z@2{DSJUzO4WYt-zw+zhCP8+%;CLjc00VstF^+!O0D{ zphYLcv$#2zdZn!FefmjKT6>XNp76;ZCQu=MwCe$T}ktjyzCx{r~7 zaJAc1R|Z_TtPf?rOG%+1Ce~Kw+;gndi;j-Y@!TjgYVl8+Yx4cPHnosm)y^9ejJizA z@ZbHEJErc+^Nrq63R8NCbBBb`&`9NH(|} z=kKpksAm4JZby3L@yqE3ORULL*VIzQ~zcl<53i4#T3&k$wM#fNpej^j+ermXjd${QUe_`NF3tT8GXNOL<}M?eAsgRiP1$ zo#7|F0EwXRP}%*+(D;tse4MO)D?eV-SK%1tq2%Xhty6mW`S8$fd1a*`@T%&1cGqox zR%9KX4F?mv&_v=31d8!_zultJtlIi>^0}{k$6E}%zt>H+M4#=RWLa!M+&}C(b8lZ}5s|fI({e4=3|um{Dw{orad}jeb`9wn zPK+fQY%TeKy1shWf^}KHDH6BXog3g;W7Y+A!O-)T=pFe;0+NFF6ZhXEw zohKeC;j&Ap*X&0efk%;V(ap1WgEl)mi>$I~X?6Rf?AmPThRLyeGxuuHrvy{qs2*p$ z25WkD!2s1VQImt*&+!QK z2~B%UOiYy)-MGPsE8EUaHeyoJ?*dX1j0vadv}m)X9&2nIhQDNM-!3w=&*ndn5d#p= z{l3b=>6X1XV{BX9?q_a9;6Lw`DN~Ox9$NPZG{4Iw`Tc8w=g*&eZT*cH9#&gkwop*i zpqr#EP|38IZ*HIw^NHCWXFM8p_dxCK|Fin9cBk&nRi`A$a|2%KS@0L}L9?AE39^J- z63Ykyh@YZJ_vEDT`Nm$JWZoN3vlF?s)c@-DC5gCrRk@8*rCy;{(Zi9Exk^2b-`(A5 z(>@fSG?y7Sfs)fPI4D!=Fz)87ds8wU8Jn0W7SgGzpklr!`eP+2B^0iW8h(VJ@HayYW@8#rq3(s*KlL0;@)7}B1zIk!Ds2`Yl+KDIYIJg(~v+B{IVk5vJ(C3 zr+fcu;b%9mlR5gnD`fN94jHj&=9VWxtB7|G>y~Q8NEM zR7_6&r-ApG$X)l~U~C*ztjcH4KkH3Cp$_yTRLsiSy3%gs@mB%I{uI;Tv=!C;M~{3> zAx?9}fp6ihWbfS+{u{Kvw033xF_N1SIHuVk+f+$#$qXExo%_OcgeTV!10DTv!mvvZ zKqcjLLC;=FU(c&!Yq>a@p}cs>KX9r0#J$Oaf&~ONefxB^t$v$%=5``MF(&rLfBj0R zx@gR);5_quOYJOUOzYCW(VyV36OUW%`zvBjeP4}VP9m+h$LuykF}W7q9|)j3KIaDu z@C4QK9Qk-V@G%5d{<v}?lYZc>pxHYq+81Lop1f&^W4Bd^wFa_sh)b< z1KMD{qn0>Ur*Y!{w=U`4h6w?X??-jKrU@4b!fiFq$$D354j&wxZ5t}pVTX&4MxE^l z5kcpSuXbBoz?PmS>W!=XRs45`NcDZ)(Sgdwy|W-So$@994E|e@3W~gki+A6MhB5r8 z^&aeEaUsqc->Q=^kn6o2d9sB=-==Bfzzh>ABA2Ou%NH8E|EWaRrn0z6c8g(0%E{Im{Z8gUFRV$J7O z{zJ~sT<0?YKvrw?vX5G|wLRM&kD(HHnMKj;V>gpWyZ1NN6^cK{oPGHC`KKGb@$kt1Fas0@w$Ohw`}48m4nI^fv9_jo zKYXO%PM!A==I2k?s|=~I=)M5k_wm)nsMqc-mLKiPqsx{jqu~ zbxCLNKShd0`^uvzXWuT@*ro69L*q6!4q_unVB?;o)>c*(-a9(v+$OSSX3yEQ`Fuk{ zqoT09cP1Fw*ggQ%v^(E2Q&Z{5O19$E)Bty;DPZbh4$-Yg=<|@Hq`S*FW9VMu1NC4W z;zu|xAxZwxeW$I^p7T|_S+<=A+5j4UiuV@D@z1F$YaDVe!O z@973liVb)+zjvTmOvls{Uv6v+9rN9Icd~uT_-%5_;~we%y2Txh9HqPZrqfBl5ob>f zjN)f=nwuv7ml6XgD%p~Q&2LVGJyv-H949&_Cnv{_!2a;k%j+2f!;k4-&g?}+b>*uY zPhh-R+UWtwBfR3FNzx*=s;h#5pe`y%q^cmMqdQ=`LA!Q8c!szl93GfX zsQ;+ZZm+akO%H=a)cc~FjoA}wsQ6b=c-DR%jXvk6%t#nQYpRS&Zr{idL{NG5?ks2RMuu z55_@pjE0AKM^yAFYY$aZB`V&Y*|F=m*;!?s1$3yb(Z}<|&4^vOu zgD+1RfjXgCFa&CZnyx?-fFZk-p6h?s|Nf9I){Xx?GxIrO*@f)kLz&64Ibf8~3;KxJ z+uPgV-wE*am3GklAxw>!KW>fF!ni~yIX4D4H9DZ{L5yLP1DkG`?e&((xsc0)42e9N zlU~MnKKEsq>`QMCMg6(bQjTA)3qzocADx~)e*Cy|Y@%y_e}Al0Kfz`0o5JfR6&V>+ z!Sojg{mkZCy{|o1>7V*PTyc>zSwf@f3U7f_VM#|fmt*vdJQX0v3w+im40N(CQA#N} zksiSDlGt@M^Oe%>?+lELIDqb82Dnt>iD#Zsg9ng6GJ0aug{^PF3g)x;jU9Y{CnS%5 zM0KIlm8~ot1bvPGoqKi4PwF&*n*BFdZ+7;Tgn#(Qoe8(wlOiMK=ts$FL`Qy7yyk^ga{??Gc~VCTE*V^|W4%9q~#}OIL&EkciYm z^Bd1dLOO+4(f)bevwAK50*vwm8&j2*qLzdxOYH)gxhh(ed9!7IYlj90K7P2rU|_mA z?ed6flKNH35vQ8nIiJh@#asERjvH#ZPaq-29uEocoiTy)FtmuM`x0ETHKwuL>tA@($WC?`fTm-eu>&SN>fv_$VB3=y>k?|N%JcinYU$A zwkXc#Tsa~{KOZixuf2@@Aw@J+Icm%<2NuQgWT|qPKfZ8_8?9jN9ov4pD`kN{O;0nH zz6|ypE?QUZlb2FBS9paR8Ddx`wj~>o^5$c<;9!LB9aTt3h)KYnw@#Un@<(#cni$9U zoyl^3`@aRx94Ep7kQcq4zU6FgX%X>1jV`M{YnL%L=aRXa2R}=Z6g)Kf|g47pPB6cQ|EWtzqaz=(O1BYh*gVBPJ=SqKQ zIy;{|w+J@7hk--RH!*g;I5 zS%*x&XQeKfy+D<*Y7gBIaqp~@-vli0k(f_uS-rh*5o6{%R)H#(=@K|J`)VP!docD( zOSbkSs+<}JX&=B(W#>;BdN8F0ytie3if&g|PRD$cqH+oI-5d`4SL?WOeFs><=B6EB zZmQ)bEfw2(vr`>_`v+cmAc1!{4xNW`(2FT&03wsRqH3RgYC?Yi_V2feZ1-eN$u}@X zjC4WWM^s9BkX}|WfwNf5T0K6D<0j<4=+oHdH@HGm@>3P*fy3j0c&1sJ8c7fya&-ci zdL-dbx-%(OK=&N%e%x*1i3CtlJ4dlV#O<4}&)!6Tf5It$hJ{Arh2D@u8smA^@OO8X ztn})5ZM!9{udkHV>q3HKx*l~^7pFH4xIB+tk2+Z#i}x$f{kafDtUN2PK^Y3UM={_= zm}Sh|Z2zX?BubnB1^ZL{%X5Mc_xw)Cfux!qu_HUD~>qMEcs+U(y5obsT z3w!hb2twy-U&3D5o@@0qrGP_t*;lLu6sb*Y5A*kIuB||9-d|`^X~>3KkB9CeOKGzu zM^5lKmmw{!%TGz_Q2PW1<2y8~7XPz1tDofslvr#(kaPBfS!dbz#afY?z;mZRi9Lo+ zDp}{JK~><@F-@E6(Q-F{dM{z5e|h$w&g~EsHeX$CXjZOSR9X-8FN2TTk(h3N)XHEl z{wySpeLDPQtXyi-&Zhc~@Y1{5pFnQ#K7o1gK-}<$BH8+&VY@t?@)KduP2WKMJGHW zVx%R2@b>P6n7S#`3*T2@*ZuO40bJF+HChlIQyLZz|4BV5b!~_0IJu5UK2;vF@PcWU zPpw{~hQ+a=P)z>Jm2Sbj3{UPud<^?YJyE%mmNmu4uN{ez$5ip+02QgOOiq$e0>5hu zr%Ns@4&QB{HDa87+|%XD=g%Erq3PGyF@%L-6loQG`DN)Tvb41H9Prhx;atY|? z`Uo>Hgf)0pdPN@pUlw3vack@4c(L}q?t`t>K9UDir>1;k+XD+c*q1Nm)o9&l{cs`} z4}QfwP~pyq0*VZ}>_qcQwt}G!Ijlg*0>&@Vr%@i6MsN!2P)B;K|-2mTL-U7zg~>Qz4O=;($5k7#uuB|eHSIQ*&d*9zYQNr0uS zw=cm0vh0dHL&6A|7cW?iMH6#hL{$ON5PCGj%f+!S$my2#BnQ6-^Pf?*wUrwpYAwUK ziqg>L={^Ece{(6VL*93D;qH&1@sYUaU~aoogfWMNj<PAtX z(o+WThoweItVF{P>Z~-^=U7nq=mIqsb6m;B6sv?prfJAslJ!8cMvWaWz~W}xmswd^ zV?a>&z|7S?hT+J=XtF4lTI83O)~&yB6314C^% zB&hfe8vYF`E!Ez|smeS=ZEENZSq64lmX8h}Cui4Q{!NgFlVV67GnDevT56l#sQLmMO4% z)tHD4m&EAn+tw%00?Nd^{|@I@LFe_vqx;(vRiM!KMdI&d@*$v3m{cD3G&ch(Z_KEP z7I)v@4lw12_Sn1}?S(=Zj0S|I?{LXUA8@x}ib@izBGAw6MBeSIy?_6nL;sl5u+D|y z@i(>zTrxiITcCIz|0YpY`=N+lSvk`XIK6eVR~5?AeoHk_w)0r-%_56Y0co&kk7o#{ zGVLx>7&nrqJj4(U=E5S3ph@OxDM7n2|0@qfVp0E779?Lw_4^DEeOj_Vyw8MCccJbL^YBe*em4(*z*u=s#Epq(4|3KK-3bZ~xbGa|6nl`(& z6AqA*7_idU*9TmZ&vt0nuz&k&$J|_IZ||#b-$XxWWc(h=6sw$8YQYO3%fk%*lJ;($ zVJ1{l+A+hInVw`5?T^>rOXQ7T)}TbP7t}XVQ{UsF7sKtkMD?1bMS5VcD7a*LKd6)d ziOe>Q2=#B58P+8OMOLG^zQH=;?)KJhzPa1fI^yE1zRo4*qI@;xK;AEuBTA_N8{HJq zc=ePH*6dqXq)Rxo@m~GFG-$;%9TuAxQvA29Yjep!5P?r~i3)_qt+670?PA%Apc^^> zv|k3r`3MJ`bDXRXGBGe@fxaRpGTW!E$jPAxvqlCC%lnTX*NQFUH4!-C5l1+hvvagD zD(U#V2VU*uIT&1Sd@lfb6J9X$O0+wJW4Xpbxbe>rw(xLMA$Ax#78XAs6MlYvke-tx zU=dwjU6D{zzxHozfWru(qOwYVVt;iBD7lIm<;q}u%WGNz72C^7#vCm|Wd^y7msKBugNj4^q1}zkz)$X={@r zl)A-^rIPraCDA0}*)uyBDfExPb-wxi;bA{1r@`3Rk!ua~{P581#D;SY@i*+eT?A@= zQS>CHg+w#dk}@`2(JW+;hPr~7GE#laQN&Go;n~?I8EF||Rc|wPQSxQWo)@tO{k*%g zC@-)cF+)f}m9F&K@&!1F>4v*!s__qw{IXa*7)s}a{>^X@sC*}chHA*fN0#3m3Xa;&VZN|~Y&eF@C&ca5xfYKSG^ z6(jDjQmdrQ`V--lV&_n(Iz<>RCBFNz4avg<% zW+WCd$9&+IwYgbFF!TL#zv*CGl%O6jHJ|a-tm!IoDA77~q&v+kC)YRz}&lw2my?g{FEJ_a_(=G$W;T=KC|Q?resO!0F) zYU4RHI!v8y?1vW=Z_w$(8x$d)!|uN~8^Y9BjYJ|fnV0U4a+WMkJFrMtOk10;Gh8ex z^{@#E3mhk1^f-tpC~O^Oki`4p!-uK-wge_7^RlwCEGcBP!fp^)Jl!O3OLu6pGWs%t z5pYVL$)?b2`E!r8Gp$>+)MM7~1?(`S(rYtFGx3sZd(Gc`10gp z7nh<8tAg(ujW#%p8^aeu?v-JQe?xV>(BI!A0Lb4de#SF&S0dqGt+zOCu2!0Q9b<7H z`pA?GruS1PUnSE;5pTY|{cVlwLKcwkNa*Nb-5=M z_WlW6p9kqoR^MMh&Nc*>Tani2pCwF=-+t&h`Rx5KrLLbtcKQ>}AvtRplvGys0g$_paQ4m{>9(XoGH6hgI$ni`^`G0Sg7l0&ra zN2PXOxVMI(*@oF|d=BBzx0*#v=BVY$AV&ujG6&G7)Sy7anhxS@mpU=>_X+EB?MA*m zfL`N5MZKC=E<%o1alQ(<$~ia`$1!B1vlfY+ z%TMmk8c}I_?0#2cO<~b=u)x@rkg*UNZn_Ez=v+^u6vkWt8_aDD_jC(K!N2LRc9~Jy zQkT41!O%McPfs>U$*j+eQPqIV6vUYRG!Otn!*k%(x?Z_*H}iY~fM%Q0hFT5lge#Ri z2UiZO2{Ri01u}suWywMFzxWP}8n3w+c#SMdcm4HvISzkik%6WmXpQqs z@}z0VyXEfjY`>`iz&gFQ9`?ji4-{z@DA6rgR1O0*3TY3$eHSaRkj!bgIV*yjZt>na zhU$dSd@RlP31N^rv^Qn>w$Ub@7t021;Mta2ufLV8ht30@3u65=mPrce^8Ru=p3C0k|leHLY7D^ZEv5a`yE*lKKv4p-DxdE@jY@{_b09MZ1_dcY+kpS}a{)sGFE$uqk0X7wbZCC9vsl>JqJtCSA+VX0_zXajt=)7+RUf@B)VQ${T2pPP3Q% z$W($=A4nw_PK+J3G&lQg=0^GLR>FjRc3GkbpnL%3I%Aq>{W-)!5av1N>@xn)5L;XG8|ze8~At&@G+(eckp;(6`a(C$eOZ1hy@+jsNzb`ePMd(^rcU+F- zY&>XuVQpao!=jk_CsLQi*4-MKoQtjy;uaq-UM>fM!|Q*c8M22!M5fET_BE z)lop*PLK)-)`W2z)nluxt810&eZIUDHtr7e*rxA!IWQmVgwHFvM?NW;*E~pQY1-~i zKhfvu{siGY)1fDRux%C{M2Fh-X6;ZSPL-OO3w`yXl&5F74%#v-r-%D)H`7D$?0~< zw8zhGq@(?y2qoIiw>-7gB{9I1Oe+QniYfKOYX6aJuutkYU(OhE{c5|dO8d+xUu7HL zfESj&AprDlpz3?|UjlMuz1WV(kPI^L^?E8-ndK)oe z0ixtJYnMiP{w5|==PI{M0s=|nCAy$gXb3v#sTvr3{k7}lghq}y`{$cdjtAR}-Z=cy z`jSl`-zdSBRsF=hbl!Kt!i|+FA^Rf#)0gCrjEVNTOYk2RVwfrjR6)%+^VSdQ%{#4( zpp1Kzv**kkz(+|WZ&2U99k;Eq5K+1XTyAnQ1uQ@kQqshg3mRd!Q1v{y<5AV2Eg_^aGw|x06ZWrlRoq!l36StX4O06sPkUHWy-blBOv4J^E~ZRkf~b7g z=(ZvDE0svwfX*MU`_;KyPWiZ-53`M0e1XRm^N9cJizos%IHM49_o^^w1m@ttQ9xBy zm0qm_Q^M0AMI)mOG}{zM-7xO3_mpeSDJVaoyq~(4ei$r1-Q{K@j(dvMsxWMj({^3$ji8G+cSDv#?$*nPVPU@eKIvc;0{wSjwJ+Oa zG4$G!gv83+iKuix`mmFXN-b{#h90>+ZDe2FQ67@-cKS9lFF`l1Q}xBtFz#9Dj2NCQ zDl=3dwB)m8sLWJ3Y0u9P!nN;+`!HOQ`|tkp%yC^<2UGzN(pc&XuBD~(x#K$_aD2#N zqV(m)ka4}o8ZOvWJXR|k3_*Ydn2j(HsXIJB&sR(`9Kb!8s(crGmu1}(Q*K;|Gn}ax znjw|a$57%cS?n8<{k7%k5=mis_CNzn9f6k8sMIS;0TaI5uu&@~5tK4DQ|HI?I zGI!d}>enMVO2eh8#-1>n$# zxGh4MRSKWgRxg0rrq>oMu@H0tWnf?c3FgSeL{iDiMTy7FGn^9OIM?+-b1-7zqK8U{#K#hgObbP!0pk8%3gy4u_>}XMhL_1D3Rqx z+dp_*H|l|EI8UwWKZw%|s_V3&(7F!Twm`Zn1Blrr@GU_gJ`JRVz{C!kyZRE=xzJtg zX6tbR&Ue@Ur17gfS{P4s{u@Q58WhtMwX%a{J#98u_GE~8tN4liyL#3N`}%$5xBAlT zX0bzRx=(<^+AAUylc&FZ@hZJG6!t&AdF-amL*%A>P%eeb_)gNt+;vCeSP+nl<;(MD#Gh8zxS+powOP!%QQ9t z*QCBwJL)q?zIh0Dr1(qF{i{aYiy~{JbaZ($+2!TeG09w!-X%$vw|93S(jwX_x}Jz% zGOqZaicrZ2_@3oLYZKI)qEUbLr}*XUgMK01`#dM^lBS4nC^`h$s`4|*p8}b3|1i33 z2IR$s(qixy^Oa4KZGPCFlpFy;aEPD$YmEXIwZaPjp`-z#lURR(;VNr(Trv$;E4%o` z#bu?8OWu_n07 zY>Qb);!~wdn;I6EopRrdZru-v&nA7~EyMMGUS}GAL7G$uGCcQ~kMD0H3`GbG88GhO z$L*`w*gQQta<{S<{>y^UsXY-BAKu2WRb2`BfT1ViB^j%fc`p>O{_c}aMM!R$1j-tZ zBL6}Hya>53oVWfiY%0rl5ZIj41+L->tlj=j9w1w4;EJ1_?^1$5MxjA1+rH?&&g!Rv z0%pLimXBaF?#sX33241k1UdqgU$vCUN~Q&wV)5(GabEh>yNj#8_?(k|MH;z$W_A!* zVK3sYMw>@^B7qDW&lbr_vxG`)KLdSxR!Qj}KMWyx>N{TVP6F~9Dh(b4I})Dq z0HpuPxWXrS8raK(A4K4FOu(Y}xgrXiML#Wck>?mgw|$hGh;RW_ujQ`N+U8So#w!Dl z#|pOhPqt2jx#$-9BBVlAw)-TeXlD0@2DcRk)Y~-azkhuJQ+F3(N}wb8LZjvn$6UAw zmrB{fo`F0YAzoDk-TphXC3Gb4Wo)*T(mmBNgtcTS(%9Ta$mmtGgBQfd7ms=*bjm9sQ{{2iU%%!Wp=>~)w?!^9T zo^rc97Hw0$Tq$>ikMB)NX$pIooa8}5cT&uKUep(xFp=1yJB<;qvLTzX2TtK!<^{uB zT|?{^)I}okC~^)oKW$gU*@*|XV3gi?brYS-on<8+OEg1x2xCAwOf zzG?rneP!t*#eXOKqvh@vJ9RX(ha$E?}pon5J2XJ$c8CXjg3mec}0|RMNxJz`OH;3PI3s1in3DHLeJ~x1Oi^UX-%Q!T~{fda{z6{aOU(GT! z@%IaEy@-&<6fyIOTRGSp3ahq{!yzog7i)XV@k3sIzn$3ZW3osC1n@TZ5=t*ENQou| zGLP6}^R7<5^U4z#32uw+!4?)a?swPT$mB{_SBBvbkQ2pEl(@@`MrOz-+VtK~wbaC5 z84$E@Tbpo(hn#Q`$=c;*t#a!}cs2=ra+k1`cmUv}${d1Ux#Xz)W6F4E1AE$&9Z6!y zqBf+=ICRudI|0{|5Q>usI^=$g)=yca+aaP(?s;gWYWI##7avw&|2PW>vjOod6AX`9 zg&9LT_&0hLDUOv5vv<9M;q3 z1I@AbT%**`jCBbqdXp#a0@7K?h(mVp^?SvnPHbFUk6vMS_sZt;e+L&%pM(cMq{?@+-(ia%*sPNK4YZLV$N zP8=k6Clpncyy3Q9a06+Zg0nIpRM4f^1qgV z;ebOTKn^q89M)ykDNUW&kS$D>a0bd@PqRi_S8#ZEw7`5M5M%~i=KS@3u1k{qns(wast5Aq zS00coF=`7oe!bu5?O1DaOHE+FL2-Zc62T{zW+vc`vf)fH@`@a?9IT778SmaBl66oFZz4}5l$ zfo1>(z)+EOj2k-kk-U-B(;Y`wZNH^^f(7i7`UO(VMzh^ji3htFk{GmOU*=syv-t0i z+~o#CUV`IMfS4`s@2dbOBvphz(tb1_gldZ=<;9>9{)xeN*AJm{NfH6)t8A9z#Yun% z8x8~l=w~WG@coaoFSZ_vdJ$SMbQyjq)t+(p)JA8 zj+Y-?oP`FW&&i_Rh=yPG(^X`EyswYznszNLm<|Y^Pc^>*mZ^9@h$t~P9BZER!xG`0S!>O;hD^!ntAafoNpCgI}u_}D1nke0A%N{U;lFji@1FY!tE`?$>9)JR6x zJ_Vi=$1|Em;QDHQlYQS5tZZgR-xU=PbmA0^5*<#?m47S$FA0GRB5!0LAbM8@xCH{Q z>-78%8y@*xel@IBt55yX?+Xd!bwFLU2U5Wsb;vNmCHmAm^{f-m9QMUji#=b>dTcL^ zc|EIC0W_`>x*#_Fswa2X5-BU?@zK#{h}#Gxhys3l60B|#9JP3J+(&!5HJbh+%7ruN zRkMx%|78J?a&_?K64sh~zu>;|64o~RMznaDoAn{<_pci2Fs%#)a>!%u3X9!FD2h{O zVdohq4@CEpVfT*1kKL8+t)=`@6B7VffZ)Ba%k%`fBamVe1L+c2&hvLiN4({TJNy#e z@_g+Q@)+n1&=VEzZ_Yr>^GimCSBkFTyD3I9^IJWI-fT|Aad0LNRMY(_D5bjI zC!V*S?eKQD9Lb)y?E+f3Q9XmFR?6uQsIF&$WRxvWH+VN92s99oNd5x^$xUGRbiKYt z7y|!CGe1x+PY(YQOqbq2f2^jfe)Knx(LM^-ZSAD8VcEwC>tD-a-%O3l;EsdvxVQ-U z2AiO@Wo|@K=rJ@@ye&ZsxJ%XbC<453D?dB^;@VLC9u>-&G+o|Yc51>m`wSW>$A#sc?B5~7)uU;NjI9Qo}InObO24! zgF}vxY}mpF^-l#Da$#A`J6pCnImcWU^iKiibY(rU*ZUR~TFDp>Jl)8`!5ieYHQAk4AUHfx0ww^bE_`0ttj?_r( zW>i!sgiNVy@5v&fbn_i`Px}8Q0~%*PD!GyFYID?%Mwlw-;_|A&)ZLJ_A1_oq1WWoH zf=!ksErFP?*Tw5?8tkpMtON%Kmm0!)?sdEmA-9(;{sd~job3&FuCPz zhHfKqNF-PPGGV#=>;I7x-Rxc%HAc zl9^N0W7t>TjE&>|Z}|f$Yv(717w`W&ksK-OqX?WIAZXA(wIP2*701852vtk;$V6J>#>ltm>F%BOokeG=S2Tye%JK6iNI9J zTQ3lV|J2o?z*QGvl#k1|Qt*7uhSV(6_${aE-5D9>9;|>logWuc9r`6HQ}CBsLe|zI z%HPC``PEjQh>u|BaD(~zgshMROB`Q1|D-uO7v#G9EWl8OnaE{1KZUo^l{QL12X;CE zr}^eIAQI%6wrwbZk*F~5y0<+j?J6y9ltQFgMee(N+ULXWfS{0(1d)+3Vc?OWp`DN| zWKW@BYbd_LW|?E1o5SzoQM!m-pi3v#vRE$*+HbfRLWmO*9^iSl+V=gC2*_-iyygN_ z8&;^EcX>YJ`dgh~<{qxZ6_wH0=MKX||Dl1d1^6 z0*nYNeT7o%QB|$n>MhY;J@zw_?YsN;0eP!$&uq+w-FhF2$a_&8rOAarJ{Tm$D-g?n zj}*MJ@u*tD&SirZlUCN~!!&*=WIArA+wgA=3*ZU*Brt^rfX_%*K$TivuzNAXe7R2C z;LqZV=kwZ!ou4Ya&UXmW##ku}^genX|88u)9=mH;dAm8(c)9O< zGrv0#acI5mxD~pp?X^!p7*1&wN(k1BI+8L-Wp9Jw{a4SMDvE=J_z&h8(%!{7gLLgY zMWP!a2YQL3%psYeXqw#9ZR^?He?TXZ5EEHh04Q;z)lKo})dYi|fMW3yV9wR@Lxs%7 zfXFkBNYU00tXREu8eEr%Bk!u>dJ4pRz1>;g#7Urhrq&@JCjh=nQgbp##ncA$5+>fo zHM8uup`HWLJE(2A9ZswlpyvC@@bt2US#2}>f#0>4G~C0CWA37?yxaSUdIZ4H?0a-f_f0UKb}!fsIPh<#^xbR8bVM@H4q ze~d{lk?MRxFEeLT<@H8*5=2iW$THUx-TWK!j(x+N+`o+^m!LtRsJIx=sK5anteu=# z&La3ik$ zL4Mr&!ZJQwL~{%F5y$U&Rvci@JD$n^YqqNdkl{Ds#~m}}EWuJk0o0$M2L^?ET4&bo zJWm{JLK97NhehEkYT{c13fMV24+C`IAB5{6r=lsV0UkhobfPI$?}Fr$8W6PtzUyy{ z>bNrULBL(85SCi^^R{bc1azPu3~#qB%_Af9%DU$9|(xR zZAfh~$;*O-tOf(XBms}TRC2+$7gX{%GNTq3WLSi@ou6hw=pEguykY+>NoqYoq_?Dk z3GM`{IqS}+5e$g^G;+#!cdU6jEC zYt_5@yQUXRE;QRb91$>lV!|lS(oSo7>>AUnI-!wO9Zyr`+FcfiU2hN9CMf-8%oVAr zjuaWX7MUH<;{gE>9bsB}@P*-DHT|~^zR?2pT?P9G?daiKnIAt*mbDjJ-X*cZ2<>r? z=dVGlBsDat)D*~ghTa2hT-&Se>-kbq1oJQa#nXfO_UK=x3L=am6|srcAc!)0yvlPX z0<4WT??xP&na(?xZeddf3 znrBs`5adGqN$pLfaoeFQ%dpzKR`2HiTucA$X#t)~d=_L7L%D&y;SZS~*9!~`JXm?O z17Mrv;-6jU?LBL96tMZf0If`G7%}3z$By&yWJaA;-8@b4Cp%Uy2>o9^4mublp)vbm zxV?QdHd!>|b`T+800TBqlFuV8JSk6#if-d#ZB)a(?X!oN$(UTz*KeFJSlnuMVld(+ zoWv7)px67R%>N0m6ql5Q^L@H0v|qP;<92%(L!3Cc9RJ?j*zNAn zv_dMJ+`TsauE3(jVr2@YueEAPZ|xjP!Nn&myKV-0SLoKLhzn%$Zk|LbHX+q=AfGt%uHQ+FgseWLgq@C@ zv)S3pj{LKWuSuiT=J{!J`_-$IUm0_HL@9|p5FWx;*qM*03y)UC(gU24FfOakJ_p?c zrW<*KO8uDgGjnHLq$2+{KrzSi4KUf3>4wgC8_z4o;&y4JnFhaKWgP;n^XVD9m17r; z-vUqdspxvo!ddr8Rbg*)=cT9;-Mdgr&VE2>8F_i0|W#KIx;cI@tKI>^31tnCzL z?4e*P30N|0TBi1`!X-|~_UUEPXz}wdYdAF>dqL;3=o!l=HG1SE%|gEnqw2L}cyL4P zJHq1vcKQYPMXqk46~}`knxt1d)`~lzU&tgJzihM%r3n+e&hU&{2t7J&eA;M(y?|F; z-g>s8;i48XCvh$Mn(2mDI+NlRmvi`~#Q8#4qkuGEJ{4{rA^lL6$KL1ltd`6-^Tt^|bi4$aPtr5AD5 zoY;tZ!3(Eu`OWK<=rjbnXCpZHZcAf{Q;-m>k}Tx=|BM${Yk3+g%fKOOwh`R?OKllw6R`^PYhhhaWHWjSyQDCz`bhZ+;+4RK%}>LuFkrc2|;_+R^b@rr*-+iY%mKH~p?GiQ_q(-*EqO>Odz zi1Do7_tlPvRM=$@VmYroFp&}QOpX}9peC2Yh8>V5bxFTb|9T%DNY}g_bZc?RvoO?A zd-zSrBB0lOOD<&z{6qOr)fVPkLL_imVU(N~=y3S2tOJZUPjTjL*D)!>j~j~(_*>4s z(H?|0clTDBSC(?k)$~I!5)eDxmkK0|QHfTusL_VbZZ}d^o=$tYmuC=_Va76w#u+Gi z;hSQVR5gcpW1QH5?u$ZFAY$uK{v|?k-0*4}wzBPD@N0lsm-r0#8%|eo3=-=$mrdA~ z_soLnquQ)iiSIcHaJvt1x!q!#9|-yaO3+@n=t#t-!PT2@1@i7kNc|_E1qrRhLlyFx zsq}MkTicAFUR@E^d7TK@Bq!@h5fgh}JtT1@`e(R$&YYNV@xlYao1D@+o(D9-9~sOm z<_Q8hoMe5Ueh|R7sNSvZ(@_J_ja*owf6KTkz@7yP*i^u45YqqT*xVtGa6~F%+r1us zYazVWhaN3a&x8SkkYfY?Z>IU2toDJ#Co=C*JRAv?TFIS*QdE}QY5`NblSU00VJSyA zj@--*)HZ&4Q1XC*5nAO3v6^(R-{^oW)U{qjzZ{ZGpb#fD+#ZFYGPD#D6M1qGuzV(3>pB));?}5okul-(!{H$4p`I-j@*L3btvTDVj)_+t5cnhNI=Q6me>Y&7OOQN(k4IvJACCg;TY(udC8M9y$DfgAZ@vo< z!sq)3e=2`*^)gb9_|F_zu9f!jRQz3-!}_v1qzFOUe*;;RLDW(5_=+$a3_by|{>Me5 zxxGqPR-n165Go1;uXLl2W#S^Xlj{Lx8$1URUr#oiEO1DPv+`|Mlo63F?-Cqr2<7%M ze&V@?&n##Z&}GmFQ4!1NQL|do$8tqIH93nqSdsswM#akNB!ZV;7tOu8Wz>F^mY;3U zoItv~US=3jRHC$*|H4YDC-X9BNSn2&B7Ft_Q3KbJ@1*`30|kSM`41)4W#1-w6cnasKgnWLz+3Y)SDuZ&fM?Ks(xY$TP}y8PJbXXTLqkqChrGRsgl0Y>A$ zyRr;I9GN%&u7UgMKVb{-TXrCXF-W-TMq(o)8+Qew=oD zI=f=~q~Rt*<&QtisQB)xM4|*5ZjFrzak7%BwbE28Y@8#tTNBh>?Sf=4v7hT5!~H|I z3t{>YyY&95y>9V@|2p$lRe_1mK=aKGAW8^GWOIacW^eZ!JrAR&EyB)R-E1wdf0nyU z`whL_M=o}AwwYE`{+`tvB5~~43Og_Mk=dTAY#qw{NuXUk3xPfTFh7=fNk5e6rhUEZx&`)QmEk@!@c@vQYQ z2b0alnKoNc{kd=5}r5Dn5A7dtcxdhQXXgDCWd5l z!iou#%e)0{$)6yws2!U-Pu5L78wN9WSNK(u+YFt6bjJG>10JH0Zt=%+1-0NGX`=w% zGct16hs+!!_mTf% znG5VhK{}9^64{s9P-qQ8k}O+!LQ~3mm}>aaJu(Bw9p@d8&(y!<W30g$8761ta)ds?=RXDC(^Uy`$}cVprXE4TtO7_jhf5ZmqCL znz77p5eMx|R<~0wC|dC(;d{YN+snGIyRfvG0w=T2PxzKRf6wDY2m2hhk5wNlPmEhF z16?i=7wGWW1wc>8;`Ldtt$*GZ*L{PvM<*EGa1ebn8rmG^3Ew^6cEVgDi4_wSqa@b4 zu&IVj2tHb^0bS(wUjLZx1)%%1b8ic* zfZ=-I{cW==(4M(-9{Ol}xqly*+PjV$%NBslVtOhwZ+E$TQwTi3>>0D(3z#{}E&g}_ zbp&qb&H_^i=J!&#xomh?+h>-l(PSnsRY+8jSZebk4) zq~HT{_MvNI>6$O>UzjDOBMTqy6jH8R4fdZhc7S!EPCTuoa#w}t4ff3P2>D;?QIm^R zaG1S(YB4;{R^tzy_qsug+)&k`U3k$#LJ9cyll_$Swl%{mg&35b2UAU0k4m{c%d^oS z(EE{;4{iJ&oJ?ovjQrwjP}x*EyD>k~djjJTW7Bw>yU5wIBW}k-B7M7e@h8EFrRUds zZ`8UM5W!8T2aD9NV>Ox5FN%Z^VPPpC7}s*wwMvkqcU_#jutG6RSd!N+Mw<+Jc71~6 zKy7`wbUhJ_25DZHZ46V39JfF$)*n6m#4a_>X~?0M94`mDnZWVTtiZv8^L;*ET+(k> z_k<2Rf>m;DNJfCG%%+6d>{ooVCu$BeoL*=6>C$HlbZB%ll$xz+9 zlf_n*XCc71RX~rZmi+4?E_|daAM4-A5$ayw_9Vq)SPu%mf@wz3WtoZh5m5z72mpgA=)9TB6j^DosZHal|b-=Q-puhWmFVA`sG zB>_6BwQ6;yEugPHC~W{TFeDC*(cTkL5A{Qdl7glG!wWYfmHMzFeU-16=>_81UbHla zJ!-Rq`5=bG1;zB3)#r(djxP9~o>XV&iTYb_P4aizC#0!alzsRWJ09nKwyoE=P=|*B zwbLhal69r>WJ?@8m)#hm#^v6j@w2^=hUTSn!{0Xe2%WD8?)9CkbLWF0(=xo?-+1iY z?<%B$YlOvRn+{jPep{@`j#<7>$lCk~Te=6zbd7o%FYdoD!8n1t3jei6T=C7n@MIa5 zO$2lCWwR6G9+uMu>G54J#2sP@GStxhp(ZVxof{nw6Cif5^xA^Z-QB(7W9CeL`b6pO z-ZE@!pQ!yKEp5nOc|6mRW4}baXoV@LE z2?VtB*V%Z>%d0ap+}l%evh3T14whP1=(fgq4$sw^jZ+z10W{}(>hN7 zO!S@*9%X00wJLO~Cg@z~1L?a%(&gH$x*d$Z!9lh3%cI?mT(`+c+RN7p%Z3l;+Mar>u<=*eRG+1AqT0S!>=8 z7`+UO)sWg;vRQ?A^kcYR3@;?OG#BGOUO&ER`@1o!Jh8yy1@!Bhvp7s2l!#=1y=BQ_&bZiV=A9n$gS~>$jO~ zMd^fz%gw@0GR1*psG-$=*Vn9=X{A`X&(RI7wah)AZYg?ghs5smi5!G}AZu^R{?rKJZdT73^pVzxu&2&D+oC-D5Vuuz-e_u}82)#~wsPg`;Z4rHI&7 zXF;-$N1VJ~l9jODkgSrtpQ8K1GbLY)A0O>8zxBJv!Rmo&CR3P0!ose*TZ0}KWzz_~lWEC<>A9$8?}Kth6O6WN(dQ=vy__icEE4Jl zT(OFtuirg9h#Kp^iPz+XEHwF2u(rd_%Y$kIrun6+f~y2UuK`{q+N_Tf4jbvJK*?e0 z?mIt=e=8W#CE}4CU$x`5!)1UJZ3X=W;b0kdPJ-5EDIX#EgVZE-Na{yx=6jd35`~W@ zCAztSvt`XO7#$qmfyGr%xjvm@ z?4ShahswVO+n@gRL0ZXIsBkG&S42CtV_zeH2YR|cmC80! zStbi52$T?y7%>iiu<~^yrHdlmOxnBsTsw%|Sn+>a08>Q3g|&QD$c=nUI>c$ip$89; z8%}ISP!OY>`ys)9!c!Z6h267tycrVx9$`E|wYS|C`tjjXYba-rt)fOCK59m4R?f;( zc}2CIxVA{8z~&HS+_lifAVssnLd5|NPe8}v?@L~0|6UlhjwT_WwGGB)euRw`RZ1ZyR!H!GP;{I}H z3r}n?ZPxBsiyMZT)ElU1QW~B9sZ)h1FT++tzixlMajnxcb0sG9bmZ!Cc(&IRaaA05I8571E=Mf6GW!}7J}N7zq&IC zQY6Ae&Jr*%l*Vf|JEoYqSCbeo+}-Jqf1$KPwTB+j3o;s*vY>a+uLWv|zYNJ5r>#rAi(CeXGP+H(o~O+A3s zYvL{pcz*zJbE}v~Gx);}Tf9Dx{$&WFV+tjMt^vx}COG^Zacj9?cGA(Golc@yNBc%E zE#&0nV~KKRrN$~f<9@6K^1JdGA{0GI-;?Un4S$iVh=`3BXWtwNwJSNuGKx`A(e_H& z&axOVirm`jm~9Tlw6wq;<)OgT1BH{yQHBE|B#nChx_QmZmu<|A3H9z4_zAbzjcu1+ z>U;jE0YpKY?N@>Plbl{3b`Px4G^>Q6dNjXh*DB(3%@WnD#&x2D`sYQtnyFvFUej&0 zYfsZUSXL7Lut&|4N2*Y777eLX<}@MW|55Pf3%(@|H`nbXSo=9oomZx?3@UdCe*~kd zUX%R8vzmy%5_(pxJN+)HT`8{W!2UiA1E=;YHiJwIrS(1rStD3C?rCGWTaWC%qu5!- zkNEO;r~}%tc17N?*=oHC<_iNb&r&gyE0+7WUCoVf3!~cE62_WoZtj1>C#a=RG@8|= z%5%BlTkI|B=3|};Gzx1|Bz_8_*W#lCtDf;jr89*F1@~297C(n(1gls zG4p{Ja#y|8N(tDIqAeTotTQ?BTBfc6!6G3sLq0Cxjpl=%!cQ#?lUj^iWwIrI>&P9?47Hz)M~JxIr-NyjKn$+dqRa%_0c;0PaHd%a;p2lVe%;kUCX zIT@S_#t)yb>3^!eSy21Edp4`QyK4*#{wHZ?;~O^T2~O7d^A&lnQdcqn=8S2Zws8)-D5!&zm zm_OOKLnDn@pe?d;a;7^e#s_yVGSQE&tf{G91~9c&ixuQNJhSR>&y>Vud_ZYTXX}&b zT7_{NoM44@vhRvYd_}Lp7TgE$fKoW~J_?srNyDqN?4yzIps`Apw=BHVz&6q|l!k`p z@c|ZH#we8OY9Sv}qcaO?Du_-pvprc!9QyN-!}{x+cW;K$gv%yCe2ki;p!LwOO)gz5U>(W7z9{rFE`uv(nTWJ8ue1>L++ zLAWL*;*8WIriWsdpy$Eza&l%8Y!Ja{`c(5zf;f6m%gS_Wy1h-V5*wDRoRa0m#N>!x zwO;yO{{5P?ZpwnzC4Ek4r~~LH$Us?P!?Z?T73<~<7(Te&sau2QW-};m$jBgQ>mBZc zyO`uwIMiU^jcrdpu*QJz@iH0qUQ4~Iy=-%+?RrmCTzp5^4sdsE92a!x*zn{4(>Lz_ z^6Su9$7+(vs1A#4+2-)1-8c*>1&%VxWP`-TMQUY|+{T8tWmGmSTYA71&ny7F<=;!R z!{lt>nn|NiQEOqo=v#o*mN8(r*XO$#{HRTS&EM*&-sef)JuB|^mOzH}0h1B(=r&?s zp;y(vzCFp>c*xr^+3;$H1M1~Ga1f3fK~=ep2Z~RpI=qC167R8z3M2+p2ICDfyiQ8` z=ZnZh=$k+3^1`1`;31|dz}YpI!s9b}jsG44v2{LV9IOcQ@}_{MG7#!}k#!WfPBGHpL_h!YE0H>!?9VL;WsOO>W|x|2@#CY&jdpNi%G2Vt z7^EJrGOQDIvIVu%@9GqP`fDjRA69oNPy9#jcN&j_dvU8^2Q+Jptn_owvTG4k&PI=) z!tWDCn2%1}-FL}m?h?b%hAmNcWKhXvd13Dd^P#`KX-igq#9$}fcaWei9sb~#l>8r2 zDzU@?%R$tNjnjjr99xfMYfj)cEhopXUuo}M8vd27IFK2UU9`#6gZ^73{tZu5Y7_$u zQog~u#o=E5@Ah_*9w|+9)xUYM6k$|hC$8TgEE4XlYcABHCb1+OGaA89xkfy`52GVw zI9=%;Oz3g;S&cAVPpGqO+?fNV7r-n^e&wBMP*S+sA1`JikiaN0EJql38GlT7`aHxZ+eY4aorpNL*DkC-QQ1_ zzCItHH~nTgZ@W!%1;ewKS|2KA(fNznsvBqce3F)!^s-Y1oxz+Dlm`ckX8Qq!X#y6= z>$3|ZA82|xUpMgS{(?xy=0kd`%htb(^D0l$4L5#1=;}P+J(1lliguE6^tj&=Bfkde zi55uaXernW5RkAk0B@qW%$J#{Qc)3?sPZGlA|@7p>u4w9@oI`?IWQQm2q~A7P2{WP zE@fB)GX^8%SFiA+F`_LX%n&fGuEIaHQv$gSyq9Yjsvb&br_}tUv`ICJ79SJ6fBRD+ za1>);D>dI4u&T$A(OFEwD95}jG+P#l`c;xJsy&S#Af^e-Y*=V_&2+Qm53(c`c1pbL zRQxiVR!=J8hy#hlADV929d+?O!7kG-{buXaGRc89fNOMeiFLm|yR?05XvcGZ?-Awk znfeloU5T2qf$mD;K{G%L;? zOJV@AiEed{^CmaW|kwaOg^M1VO zG>>e3=tmTlJ2@B+er+!AM$(;8SGLmm4s8UB&MEmCW9^vYp0IDj_>KOuOOtI?VJ6X_ zT@T;T@qy0sdMKmEY-bDkW7&7{qtpBvF1|RP7x$5-7njVf}fk;77T)5i$GpRh)j5LMupiSvfbYHGyFsm z_o3VobH!xo*W0zEdwC&a7v&UGyRho(K1d}z7W z=&At7Tz;5YvcYbe$8l`=8+M;jQS^#mFRor=Tk1XH@Ti*mxyXkWBMBH2H;~hSCB!GN zPl+X0j?w>mnvie%>7Z!H~%YMu3eBJ=(6|35*fYP|^7+ZunI3h}?Ev+N_ycJW0g9>Or zv-wQ-#c)Y&ziVu;qXYiVr{&_iHh?sF3wh{C*2jV9Oq!$ts;P^CZNMM&#Rb5z$V{nq zG4KaFAwNT&FIb|!5>BA=+V!+cDW|NJ?A)2B@z_$Q4Ir}b)UwISCTb;m1H=Dmg`ZzY z5~O8ikw()75v%1(R68;bo@TffX=v?(JrKKSL5n$DEe-vx_i$vGZMglWXB19kz3C4! zj_GVQFb6>^+oFidIf(4*MbA+-Uz}R=4RQnFOEp@PWNG-H1cO8_vPq%8yD4y7mAQ+{ z{Mz~Pm?`;vacEZChei^=&xM3UL=E&(bgaaKUNAph=}6ZfITY{b^St$ipNpB0JH69~ z)Bw*zWft%T((7aO3deP&<>>1pLK8nbWcFu$5j6eS<4^jVirDti??IMcIZ0pBVdvC&TX_ndksZAd1e6vw8 zQTZxw$sV>BVNIVDKYX8TEB#Fd3RQq}g1La>e_8LjE~)h=d*Q}c&Ya0jjP$>$dq#Z@ zm=hJL_+1<>gh@*e_EphBEZZS&`F+Gezkd8OjW}^h&v|t+9&P zm#y5Ze!g5nD(GKeK7j{NeF~%wH)V1Q2AHI<2@yM$u?hZ_5D`GBI?*RAT9Ox8W+X8~ti# z){70WY#mpjO&jMAwj41NA(VIPxi8v6b|GlPN>{?cvR2m>E=MlXB zjB9s?9Bd8A0(4I}T8ti?d{s@Oa7j6RuFAbU?TDfeukCAG4J-d<4mmyV9+O!n$9^(k ze%D+5Yj}E|<5}A`)0E3kMdhTSp=$s1j7j?SHFR{uxG80qN#|!mLax+v_RB-h{C`+W zp-xDQU)f_3@AIhia+oomVcf+daricb3D!$EMCj?@^9$x#SjhDbe`J7%{pI**K~4s2 zSnkS|odg-KCj1BRZgV2u*PJ5sGq4+20Mh$#mgmpM3MUZ2nyj#bNWm!R@z(yrb!S;4 zb@oeEMa6P+tB~2C4NnzNnsJw?1bMlZs&xgzJ!evmY@!e-__`WXY^yk(tm}hli1@Fx;RKZAvN|@qmzOmMp1K<3a zDc{ZT;e^R^w{sc23KNnk@Q*4NWma#K zwLkw7G>L7p{-ITM8VZma6A@Nk1v6-L6IKg3 zeUx!!kwuY)aE+CpV^#Bu3>aw0`l5dvGx~|6M{y9jP%D5)EuL;fJU5#=>b}!lr()7B z)qj_G>wxM!R+&aY(|C6*9JVlxDd|A%s_nBMsjvUyuKvf4q{8igrJ-T_fz(zmF<|n5 zm=_k_a{_2%fwwmJJ?uGO7IcZ`c-5DoJ?}ZcRp2^)ZiA(?zvL1C5xz(B$&os&VaT!K zXdZjCO1Ucs{4v-jtGzpiWD^4-2db0=kVp#jcs!9!XYNe(TfX9<`peU>6)+w2i#sE^ z=_58oqr%<|#QKqlkxKi$2EkdoF~C0!n8p|NT0pTVN!rcX4ag?-gK4Ho!3Hr-=ELl! zD~$3&8*)RhDA?F13aNrn^qf zv0LUowl2S^s;+Y(TU@h5Qw;oXR6G_ z-_x~6viL$!c83?qB8eJ%KY>cEx9<6CAe{`L%z)T0zv8hDW_8HX85=u;5CN14jG;n$ zhc+*|!*Q$>r3du#=ZgPV&Wl_3XQ1@O{VOi6_#Qrkz`coXX9~epEv23`x6;-p0dR|T`;L;2@Zs!4+E&tF$%PF0hqT{YJOI8HTGdV?GJ^5!UfZg+lF_UM!fJl7><gkrOQ9-za+_2&>(y= z*9B~7h>p-xAMw-R8-OE}SNZEdfAlBF5A~PmjeJ5t@=X6@F3)*09ru~n5~1GK`aKJ;2Ypd_#+<~dA)rVS)!BuE$-duy!% zlhD{@B0euckyzrMLr%+63?}_VCjHPgq1NgAXWX5^?V6~%@og7fPOSH+=mMZExGrON zkg)hIbhtzpnSYH1z@`uGImOgoJnZ6O@!j$0Uy()IBv)cMKqC6YK<%hjf(sxnCJbb!cw1 z+V8i43G6?t^g5s#MAGzx&}~`q2r|a87x^ZpaE2D{$2;;zI!LOHqZvpk#SeML+X{^-VOa?Q2>rY ziFz~6Y`NC0%D7*YgN2?xtb?$2n_pBb=;b{)98P#P@20CqRXa#cN*w0pqcXs-!c2Uj zG-2NXO``biRV10}gnq*zB~=_Ho_$?2AEy{lod2@xr}c$3{Ma(D5C)of){de{P>#n6 zV@QEJ3}W}=qP6COje&vw=gtPGifIX-6?R*?<262V{#F9zv4zK7sK~>=(195d+bX3F zQ`h2ostooYIDn~FmH8g9xisnB8&t*MINx$$3LA9EhMNcmzH!+65L;AS9mV>P+Lw@W ztmBmq{D3#Wpk3+*yW&?YNDRSVFNYE3O9y}7M?#RmkdrvzbKHyOLtuv^h()tqhmH>e zp9F;>@EY2{{Yg+@&bafD`}=a8zk4xGWVd^_)F0A0iB7~l&>W=y6HckbTYJJ#vV!n@ zEov`r;V6k_?--2hmsc@dk0Z<-cuj8N0IUdS@{5%ts9Qo3^Ji@l)&!P`ZYD^wKinPU zBn3d83GoUXZ1Af0P(Cvk}% za_AxK4YpTdz;)}(<~%ZReJn0bM`AQ$EFr~M(%G#bQ}zcm?Q>8D@K(Q#=|64{0IniX z)vi$ggD3b<4Ok#sS~Sul5VwnCgOf}gAqWAutsq3qMnoeJjnJw1ugW1=3@@O#{exTw2PW%bO~-_$GRq{h+vx6 zSP2vggZp{2!x`1)9{O&!U4l zKf?M*#0+Et2(a;{t}vAAU@Tv4w*F)s2zA%9ULv_aN+jN|W64Y{-#4!Z5c=9ELXcGW z+K0O{&LC#=fPh(eNWXGqGWa_Mx3N5E4KXr8YbYtGwRIpLO!SHLqsy{>}f&wFzyjr;^H~({+?VQ zXG^AS3O)=I2;h#ozf7sgLHfU~mlkTxnN-Kr(OxEY*#3D7=LIi>^sRnv#f3O*ywx$T zdW&e5G0)4%1sL}MZgU;HS88=Z$gRM-2FSe7{FH6})FXEV&}?1%Pg>q&FJyw+kOtCk zQSl%$t%LdC`iFj_2_UXLr~+|fgRViAb*;lJxsn$RL0`7^;)PMqg2fDwk*gokKdewXZPn3mQ%# zd`pW^^QYE3ieK_gkndNrtfo3J6GR?*{}+ftU8^12|1S_d;L3H0MRYCQl5mB5VfRSZ zjB0#qJm;hRwGj3cZ9}73tc&r0LpCT=&OOmoDo7j#>-Pc(SW+;o(n&}u@nG$mAIg!B z9*P%wjdM#Vj{Z}y^qR9&)vj3K6(#M+FeQ6#8cIX@JCozT7d9BHKkQECE z&Kn0J1A2^JyKwL*iW4MO-G?&tp1#Xj;zT&YLIGXD8U~PejT(68GC5u9xaJ65{OuK4 z2Sp>&n;gAw>qVHcoS|v>wyF$t>v~@8OcMR*HW7MHKo2^6m&z{)s>A$oeTOYddr?YI zh}a^2IOPQJ$|>wXxq>LtD{6EUPvZ0D}RQ1>M#B;&7}4Wpeop3|336a_VmO7&XI_R_(wfy zxnwR=^QFpP$QmPODj^vC`#b*xO!MM43J*;7s^qzvcUVdikItD5dc;B9Oa-*Pn{M6) zZ(fECr`W&dApG>RdLX1VCD0IT6+nEnFi1)dxnfWRJ~{(uVjgT;F6)y#)Rhf%GY5y< z52B(;&ms-H(xB;3-4|K2vzYvtPEk| z4;}vKufZ_#r?nEV$%E_={=ba9vGd7rXlS?Ea5y%S#N(aVTOGwT$)|&o67+jkkYY1Y zkQiGY9Oe7>sWBw=gv=ypNq{4jlZ&ob^zUDjC@6|JeXh@b3v$PSm~1e))CsKm6)%C~ ze^5Ps9=vQ~&Hy#p zMOpO`l#J)mg?w7`@DPb9+e^ZJhpck@pDy(KM@egI4izvU*V?gML5%K$e#ZIi6A(F= z6ZSQ@p(`p05F&3-08FNSS*Kl;hwPm6j9xxjImHHiKwKT8t1nt4{?Fro8DZ~#0_Lac zay0znCl0^CaKf3;f6 z>?>0#SwPkKhMV zvQQRuVzJ@5E2|YdB53B5;TVcZ83vU|9@0h8s@T^c_kfRXh}fX7IeQ!)Bay$#9S2s& z|M!UXXD{oUE`QAX!KEW#5_{X|bboHPYWRYx;qJC)&o7?9jQ9y zu0fqiU?JjehzaOd`NIxF>?%%vX6oBRAsXAJyve@pn3V}V2THJn1Y7CNz4XU%R!$HGT0 z6Pn~z&GhGG{5StsNx6sHYHF|tK?$4opfM=xfHethas?MY`B9M-yepNxd=Pnba6x#L z+v73h0QV_q#SEIlxlRg8W8eO~=Z53G*J5i@Kqdz-1kk~C_ zJS*VcQta`1zlg=m@t&BWI6N^|!QK4&w9~WEnXK&oSb?IR-Lk}Qwhk(PAnJ9ijHDG(`kts9nRqklB{{TWeUt;z-8i7AKsEaJvXg1frY5!V=7r*h9^|TO zS>@ynC;2F2xFry83cj8a8r0%DMPE+_Z_hV0CN#V*i-WoNR< zfPKrmIra-S@mlZ;-erf+@9~a;gWrqBQBiA4v1!>hm%1%-VX~|YxG8klO%7B^BJ-cW znA@>?NN$C2CRy7rdP0DDdg+M0$7YBI5ZU1WC#cu5f8$SiMkK`^H$k`s&6rv3WY7FG zFvt;;7`h*L?CQ8`e>y5bW}oZw!Xlg;$@ru%13=`Ikvcr}pB2kc<4VhC|1^w*<6Igr z5+YP32*bq_H1sR^n3nGE0|$U(8zCMUKPfb1oGx!0UaO>49jav_dPGWqrU=jwfi4%D z>l}si-~b*v5f@RNiTP!A&*9faJ;!HbQk(fjCl^`}8!S(_77AhL|DeNzIVr8x;00@r zZA!wMx~`MsWJBYk)2Wn?qeXzo59Ajr?C_W-kKiR}qus-Jo|c~AR+|MU8vuuMdMJx*T!E2L%&;YYMZzS)rdUl1fSo489U{l> z-F=Fu6PrHe>^p)exoiW-F{%0Z8b`-JKHyyLt9&lXOv>seZhlmuHd=xreukMqGqhmx zeP&wse}6pxw+J0D+chLf@$WeHcd0^hfuqZM>;7JPUA+?ubO^C5H9rFI3Sjdw!O29^ zATi0dkW+uA`R@!YhHcIwsMTZH4-_6PM+mt^uY)?L+~0GJU~AAY5MLgG0N{eYNm~aJ zuS4l)z7$N2`AloXT#!xM%bl5w*q^3bm<_J7>PZJ=$Md<4 zdE?E$S0~ve|Cm4j>)U>^W7fL9%c($8Qg~x+#6pxqsi@l_%C8}-T0cf3oyn@Yt`aP zA+BAsbu`I?#)mHtgyqUT&Ld^P=tx)<+nuISW=kVV$`3QR|Uu6nE_CvI;tem97 zftM3YA7I?G#gYc{)pi{Mqa-M45lzt_k;bGB!@uB`U9Det)OXR69e^|w!<)!3#>Ufo zno~PB-T09Qv$NxU9vzB{e>$0nSkgmB&ivZ>UWYwC^^1*t5Y^Wz*|blD(UXId$7AbL z;^Cghi|uxBU9lsy#IWlr+;6^Ovlub%-6MN0{Md8x<=L1ZYlJ2nK`=)kzLU`q!RszW z|Iek*=Nhz7pOWoLyA1-9-xxKZ0*Z^wRWV@p9mEj`eK|9T4GM5Jb0uSCh1Z`#%-9Vw zgHbK{YTWb9pH_{b!TAjT?*5{KE|I!3wg$1gs7}=k#uhm*CQUrHf7xPQ5B?`VIA}Tc z7}@e?0XRgV+e?p0B__f@u$w(L>(HQ+rOb4hZ$xb&zn0&^VzZ`d9?tthdnp7JKyA|$ zoxV(M6NDXa#5g$6*Lw~B+4|dTG_)xyysm-`E2$hwPJu8ZkF1hBFnO$~V*G0%CT;s0q%jaMCzJ5Qi=Xss; zIOjZ{ugCNGJl3w;Ck5)jDXscfBP#;(wj=662DeWMnR7Q+sY``Hv`m;}FYfB=gna7G z(&r9{Peev0UV5vh8>X?O_HzPUs*t3gG_xkfl-l1kUO08@KR;DKjNy8}K66MUnZ_U% zpQH=HNA_kP-~q+9iBg&pq#^I3dWrAU-qvPkk#NuTZr^z7bl5ZmHZrLtJU|Dftp|n~ zk+Q^%hfxOex{%q<^Xkh8@WFXM{`sW)_%TbJBg!<1hU;D&H%K+~l5Q}g#B~A{K-sI++EeK;DH*IOINiGwONky&4t`z=u7PyA?cPY=LW-;;+>M{b;q4k=t>nxDun(val+v18{A4s+1U9O zqJYU;X|JWr^v}!ii#C~5k^8LG1~5_Nd?jZ~b7yX$(usZBx#0LH-J7+#XC>3qSXu4+ z*=S?-?sd)d1umKLn{0tFI&ZIVrdT60YiJB}JJ|*0W_(pQaI|U2fR$`qfP>Q+=*Als z;A|3+@4X#TFDNaY&WV_C!^vjbBlNyeHG89S#M<#GGU4IC)s%Ovo_FbuZV44@wT-as znWkh@MkDUtsr(Tqb6q_3r;B4kNdAO(Ih!2mVRf&j*x{Qcy>khGIkY5zx)Nxc72VjN z2P}z&jA;4BpdcxSTc~?uHvl47)B>L_sBmFy-q3#dy zB|$nCt0*l0lSNF)+hyOKZ@kEuWg!T@1e!P5XW)2-DFZ4_VfyNUfr4xFMy()8Ia1svCmgP7(c2B0Qcarzt5IiuXrVE}944K-r5L-} zC>H&ubl+rMdrnMABICq*XLh!~R(a=jWAmjBZ7pCSh6>bVz}>&R^)E?24x1#pVBRf! zzjUi}u#`HyRYOFw;w~6yNwSs}hHYx4)fO>^0E-v{@Rdr?dYA^QZJmS3M3*cYd~Oj` zp4$%%qBizJcG=y!o_;wxpD{zN%VzRG`r!l_dq>CwRN-t@Hc<&~Id%4w>EnMKVpoocoSQ(W${=Oy8#Tsjacg) zWfjQ0zo*Ocv{H&mBWlH^jI1GIMLSv23KU8=&2`H5h+2F?gsgzh+Tw!GmHny0?BiVt zncETfn7~Y@_|yE*S~jcZ`%id}&Uqhfj{gFf*vD%S#R+NaF9MQz<5x6NSW2*sIWO`) zvNijyx1qr!^e+NGIxMxVEVIJJ8&Z+9P^$qVdhpjI;9@`X%JZbRNT<>hg_&*WE^i%z zwpBl}TAr*nOzJwLZ@S7o&1rDJ;c2Dsn&DQYr*64K?)jHF<49JovqZ%FY!6EbvO&tQ zzm#A7)nWJK`*1oCeAY*07E%P)K+@O!bk>V#laFqSZIRrtP(Oehn4(ADENTgGC-n3K zqRt!RkNT3$x_nr3IHK9Ar`odDMQX{a0sK5N0_m2V#rBIhx;cwfFUCD6Y@!25mfvK4 zxl}x=5ifW(!hLB5q38d04)z#sE<( zou=Ae68|71S9}4q6~!rcUyrLcE9rfZEKia6J=#=%zDg}-K+35eIkk1M_Oa0xcgClG zV^Zecv-Dhmey^7AdeU9M^o*-zv9OFYZ*lC+48X};Go570u!Sg*fNaE%6l)yO?!lgt z9pqCOFS+^e#@0L4gT-px{e{gtN=a*r?>~Ill7g7(X-P_wsDQ$qa5nhWvKUhDBMjbu zga7@9i;Ssupvr1scvhX#;Awt0w7p$6MgV1pKHlkC__%%OoAu=06sMWaUy8(=gZb`p ze*dt$k$qy`pJGtJ)gxMx4NX6JC@GwATtQg|z@im_ec_NLB$S?`zk^#R9lAU#JHHD! z@d4V+TJVtb>B-?W>&vwwaZ6lMlXnY??2uU^%)f zFzmIatK1bv>~GML>ikqS-`{6YHv6kI+(3cX{B7NhndXE`sq@nI>x5j8MLl}9NEPoe9d8epvX}gk=wi=T>7i8N#RZ<<8U8~V>r1vC zCf}NOp0>Z)*TSzgCkhE;x3v!(_Gbe)XX5^+3nDs7-Z{Pk_!*!XnD*##)P<;oz;?SMw#z9xEUIV_MtIB^#sH{>bMur z-4qALUoVE+D(2shu{r^Y>1l<~SD8wh1K(#oj@@O8%3YgSkPAF6D>;SCG|Mtva z-@K9cQEKz~#AyyNn0*a+uj1I&arsBCq;qLa?VyTP=I# zEh?8NXT0;u68?;l;b=GO`mCHY97^``17M<_HzfB>NfbDh{bkN>7kkWq3Chlt&QLo4 zbQsRy-amcx^5u^mWpcf4*M?SQVp^CIpJ2AU9h(#7^SP2AWFjCz7SS8m3Ll@U%UW$% zoKvkz&IZ~w9Lr}E(=&$1tCccH$J#8B@Vl{S;Ti9P^o5xNV6xuQx{>IA6fo6lY=nZ6}0AW&XeKi%9l zQ=}W%`Qi=nEURA8_nlcd^?+^A&Urco6?{1XRTiduF*T{x{6oldJZZx-2d*0GvJV`W|N5vRROUm!N00i7iYo5< zDAdK1pS=+6*ve$OGVMn?(%iS8Pt!~`N>yUiS;x~-o5pFr;=wundu}S!?(%5e7j@7x zUiAUjVPsPS%NfT9*DEpc-~42Lw~7ZrF?hUnfJ$IGEtp!@+SXO-vDJgE7QLVIKLp%` zBm$4BYU<0Pr-Lpc`3a5rr}Ai_}q8)dh;nmV+5GEm_ zmrTnvEh*f;uBME;gjn_NN=w^B$C=U=z}X=#ZM#0ID~I#vUOx=W9k>QgVJb&QoOCD8 zRq)F?s(s&usyuT+c3@~VZ3YX7`Q<}4artXMJb!n5=$QiJfSl7+8b2tHKiKP>3q*P> zeB&f{_-|>&j5v3jM>t!a-TNV}X%vU~pDTp&yoyrko_)0kAg)*dRr)WQWJ;0FH?iFM z5qoy_^|v>XmNPugcxd|7Fuf$mYchc;3@zZxQ3s3Oqmii-VjzTEK5CMy`=7(})=LC% zzP_${;j`N~D9NFW>&g)P&*pBIIgUYm0uj0~?=A*nSRxjB!JlnOs~is(E(bce$e$=? zzrXBp+GRoObOu z1NE3Jzq(;GbSR@`nLTFP|MP zTW>UeerTnzL!swpPApRok3ZhqzyUpQlvskSfV>-YtEN9LdYj7|;o1du9#C30ensP? zvDpzC;!;`f7B~*oR+Jw<)NNUp4)m^~BcKL)@A0z~+9b z8B0)Nd3=3ph1S9l1&I=7izvmnE!<~zC9y^GWrP)dKQGfD+_V13A~)00;(}_mpjFQ@ zvL92-O%9|8z}LaMbk15;VXUC`_`}QVhWgZTMn};~hZ5-M?l81m{U(;GJ|$8XyuD4t zG9QL_`wHr&EPTPkK!GV2wx#&QVw79-BXHy)-zd% z2V;}?vh$qG1tKG9W;BO62Vb9k5xTxb*2`ihUFAkdbJ?H!?X8*zO+ds$E-Rp3a!P*G ziVVnPlVaLJPmunrk=l5}cm`zC9_0_6UkLVd`JWUxriji=5_5MZcgY#+r!PuofOH@# zZCH97bi_ZPv|?Nn3jfv;sWBT>EMypnQ=<LB1Iu;n9;cd08u<|C)zzKsM<^a(vktd2sV=K*X3)0fCWDC8iy+Ufj}_te{`IJ}J~swP=kp*qZh+9v$Gzofi8!Z}hd1Gmr<4HW-Z zWoc$M;|E`yEgzC1-BTJOU$s!Kp|+Dd%|cvg8sbN-_x9L5ZB_y(Txj<6{~D+D7h$HA ze$LJkDv4|xCr~1qi83=koGstiRv3u>te#^#xL2d`#ToW4GXL{ej-py%I;8Bc>@S|5 zt0cl5bDQv~Z*M`IHBavCErx`+Q0`b_pV$viY-RhJeL?hR!y}IF zsZ~U-aP5&ry=c76tUv&p>l^Fk8;o}gT|)6B{OL)hRbV!s4O1W*-Rx;_j>yCx-=XN? z_YXf0oV&MIG)XlD1cMXn{9rAUhOhJU`N?wZ_RI0R)TCJTSDZGB8brOUX+jxLNsZjj zMGuGJlv#=W@B*4t82s_wNR4HTCMBZ^cZxiW`v$Ba$tzBXFZp`jW}K)=T!{ME<*Cc; z1Jj-9R@&k~6sxA820LPA8K*XhS zuz!9U)#C-jI;N7`TMf*==bN5X-mj2r9^eUAf2sgguaWG;!fN5~Qu1zp-}r zI^;`h?z#?+I`tqnrJ;r7JmKinId1D_ba*&pD18+hX6kaUCRDp82lPut<}i?nkv`#8 zctNSKY3=$vXIs=L|B;M9hct~mkc{8>HBjugP!u4%nZxlX>>Y?Lrof25ZUHfiC8LOS zwvEm|BFL!CVAS~`;*b!N5{b3ob0<_9@FkCRcJp()&-0T-)Kkl8%j@|R%l z!l`DPK~8%mT=DsRBB~ewwg;ADpi<|UU3#_jD@_1#(#{pt!AV4RTpUOC<{^f)p4`xW z6BjvuJ@3En>5drR^)UX_Qx{8@#u5}t+c*E2Ze7ZXa6ezSb%Yz(`}rl_P>Y@t$bHkw z&Gx-%Zhn@zAy+mZ)09QvC^NtAzH5Dyniq2tyN@Ff9hTY9F#~gqWL1lM6%}q_))$T* z8$L(NG_Q7!Y~xZW^m3J|()nd4Lk>9-C9L+TfR^|2npFi^S4y`p{#(7WeT$ANHaVsR zdQq!AOU`QJgHGiw0l@DevD-;hj3kw-gG0WpljpTZb<$O}eIMB-RwA)bEucIOh2^dH zs}y0%hJY_UzRy#2e%%-3G*!T75?8ambb|RE_{X+RBC;Z^^Lto1z6x4%=tLg&kklhF zZg>ehO2)})20L@GQt|<(a!ZaT8mnHt5_4-LHE-!mSE`|N*l;3&I<0neP)t<3K~AYb zh>G;SGGUx`t!6NW+*tg$)qinDf7bqcac;1qQflGVrztAUMgA^A@r?L3 zJoKXn+w5kNJl)|YmP2FsqU7p*jNl4L%vgu>_V)VWFRLoOh(dzw_6%_jNR-Ck98DXP zk!II0TLF)3BDUi;rAaW#d)4n0iEq9XwL}%r$8s5Asd6mWBH-ZtrJU*C=+5n;QL&uDF?VAvgU4t9?xFb69iv{zxru7vEy7SVTf zbAB>P^k5EnkG`mTfK(G3bjY_7$WO+~Q#SBwQR3q$EgKD~K>C3#w1nmf#g7AdT_6Oi z%{QSB+O|QisC*aDL(mit?wHr^FSpV9=|V~9ErKHV6&TKArf?52+8_}3l&dKe*t#6NPsOubG{LLbR`O&trN9JDAZWhE)@ z6Y+hPaAi;p-^in%zl5C5$7H?mZJ0;6vTg&;7CqbmqgbQ4RC;0qa~VQBHfzn)_a8^%6M@&guZ2;l9yKgig-_HM6CoC6H^jP* zU!3}rK*CoY(i;;{>T2Xf=0P_%ogZ6lbr0Gu=>>oZ8R_`W<_C2xkL)Q){%S zLeBE_&`-j=h1%r@S(bTj7T-;b+&$@dKd^#P&*?oF1;+@EkdaY0o1x^$e z740Agz07Qey2hm-Fw)<07Pl##PJO$b?tJO);5&aV(!F)e-a7xgzYO84M$2x#%;2t& zz4G#n|7Uy0fXG^34B7G-^GD0kF8%x;yY`!ZPQqEY;~6ihn$Gvb!PrE`#@#MTq&Cs- zEdZJm>pk>pwj{(9`^btC(r5Q&N0SbRG%RoFT4x{}rIu}WWyZc}K?YF*lWQK0*o5Id z8_nimr5HRaVBvsb^urd-=n}`ApA+mP*W|p&A~yeQ>9`shyXb5G#Z|k+F6#F(q}Xh6 z8~$_4zivw<{hQ(GEgfd0YxL~b~g(PBBT_5pcGb)X&fqv7S ziFs&wBtBr3m^FI(7oooK<+EA0+C~&a^8G|Plja><8MHp-6SC=rQ9dE>94h=wE0$@} z3p_^20?ugVk-(kY6}L8tzqv}}3s&oia1s$*?e~Xk?7*Sofng!cV+Mg1KB5+K_apV*u7SR$#Penlk!RsIV!l0o=*751*_y(Dd4|ENO}EG@QQK2pH2&;) z7)DUAbaZg9E)#3`tje8V4j)?w*5sOuJXh6bUyWohoM0iI$xj`c@l@9I!*I>+w}b7 zHG7_IPWGyPVM&LbYj0Dc1_T9fUI@MxA@ENcqxpNZW{TPvIc^drRwL0EutjruC*RzX z!v28|`C0fq{r9dhY;z$Z(4t=Zsz=z{3+(7?5 zddWi53LVq^=pHy0b`*f7`vqk?g||Bnjrn&6R1!m$&z zb|&$`l@~l;yU$*PZQgCPkE>;VeY5c3sn}tg(YUF;@Z;m4^xz&TwrN^O(VrIPvdr27 zrj5}b5@}2Ocis%a)%H9;^cmJ-LH z<*DePRE>k~v4Bpx2#I|L1h;AmHX2J8;6J>sN+AhcX7vAg`qzjgB&rLdk3R_%fPlx? Mz+Aunj%&jI0i39MCjbBd diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json deleted file mode 100644 index 5e820a097..000000000 --- a/apps/MegaDenti/metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "MegaDenti", - "name": "Denti", - "shortName":"My Denti", - "icon": "brush-teeth.png", - "version":"0.01", - "description": "This is a description of my awesome teeths app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"MegaDenti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/MegaDenti/ChangeLog b/apps/megadenti/ChangeLog similarity index 100% rename from apps/MegaDenti/ChangeLog rename to apps/megadenti/ChangeLog diff --git a/apps/MegaDenti/README.md b/apps/megadenti/README.md similarity index 100% rename from apps/MegaDenti/README.md rename to apps/megadenti/README.md diff --git a/apps/megadenti/app-icon.js b/apps/megadenti/app-icon.js new file mode 100644 index 000000000..0690cb9bd --- /dev/null +++ b/apps/megadenti/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4kA///A4M79/6823gvb70/qvLrXrrXdqmyzl2gvTzn0glS4ttuZh9iMQCykBvsRC6vUC6sdppIUgMb2Ol+IYBGaBGB6Oll1xGKMRpsfi/FrQXRjtHutai/uC6EBunRj9SrB5DPppeBj/njVV0IICu1xUpscqvBvgSCC5qlCuN1kqnCI5xGB69VwP1qJ2QUoMR4tcuOBA4LXOUoOKi/lq8RgMd64YMUoXCr8XFgMXs1p6JeM7cRjVS0PZtN5s2Z3oXKiKlBivHjl4swACu4XJgIWB6mxv0l0MZC4eZ3YXHKgPdolLuMR+tXC4lmzq/GQQNEonduILBDwOWC4lmBgLRG3vREQcBFwoABtfRC4kXaIKyFjAHBjtmy4EBvoXFjtBNA0X13u0N5j/O5+BEwhGBDwZICgPykUil0RwUikfqC4kR3YGCgOGwIuBCwIAB+NSkXh/3xIwlIiEBC4MbDgMaCoMl8U+AQNajXhIwcUIwIXBI4ceC4UcmVXJoMfC4nUVooABjhGC0LEBJAM+C4alBew5HCGAPu8QEBC4bsB2IXLAAk+0KlHXwoXLUop1BgK/CmQXG9ynCjtHIwUB3ZLDgJaCC4qJBLwJGDC4zvCAAbvBBoUReYZHCMAcTCYWvGgMu95CDRo7AFl8RiqmCCZSQGqKtCRwYAMgLqB4JYBmXuwIXP4UiRIXj9xyDCpTDBuUuYoWDRwYAKWIUVl4SCjXnC5I5DjORCQMxCQUf8JdNZITMEAggAvA=")) diff --git a/apps/MegaDenti/app.js b/apps/megadenti/app.js similarity index 99% rename from apps/MegaDenti/app.js rename to apps/megadenti/app.js index 556a35ac1..72d517935 100644 --- a/apps/MegaDenti/app.js +++ b/apps/megadenti/app.js @@ -68,7 +68,7 @@ function countDown() { return; } - g.clear(); + g.clear(1); g.setFontAlign(0,0); // center font g.setFont("Vector",80); // vector font, 80px // draw the current counter value diff --git a/apps/megadenti/brush-teeth.png b/apps/megadenti/brush-teeth.png new file mode 100644 index 0000000000000000000000000000000000000000..4903c2d5116d0d164ef3ff7692583c6b7f0fd84e GIT binary patch literal 11582 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 wcPW$Atf6}X` Date: Wed, 6 Apr 2022 11:45:14 +0100 Subject: [PATCH 169/197] docs --- apps/sched/README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/sched/README.md b/apps/sched/README.md index 03d93c688..54c61679c 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -19,6 +19,7 @@ Alarms are stored in an array in `sched.json`, and take the form: ``` { id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + appid : "myappid", // optional app ID for alarms that you set/use for your app on : true, // is the alarm enabled? t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) dow : 0b1111111, // Binary encoding for days of the week to run alarm on @@ -32,7 +33,7 @@ Alarms are stored in an array in `sched.json`, and take the form: date : "2022-04-04", // OPTIONAL date for the alarm, in YYYY-MM-DD format // eg (new Date()).toISOString().substr(0,10) - msg : "Eat food", // message to display + msg : "Eat food", // message to display. last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat the alarm every day? vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) @@ -41,7 +42,7 @@ Alarms are stored in an array in `sched.json`, and take the form: timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'sched.js') // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) - data : { ... } // OPTIONAL - your app can store custom data in here if needed + data : { ... } // OPTIONAL - your app can store custom data in here if needed (don't store a lot of data here) } ``` @@ -73,10 +74,16 @@ require("sched").reload(); // loading the settings app. The alarm will not be removed/stopped // automatically. require("sched").setAlarm("customrunner", { + appid : "myapp", js : "load('setting.app.js')", timer : 1*60*1000, // 1 Minute }); + +// If you have been specifying `appid` you can also find any alarms that +// your app has created with the following: +require("sched").getAlarms().filter(a=>a.appid=="myapp"); ``` If your app requires alarms, you can specify that the alarms app needs to -be installed by adding `"dependencies": {"scheduler":"type"},` to your metadata. +be installed by adding `"dependencies": {"scheduler":"type"},` to your app's +metadata. From eb0d809a610945ac89efc30b8f942e6e51acfada Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:49:59 +0100 Subject: [PATCH 170/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 494e45124..e4fa71070 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -10,6 +10,18 @@ if (settings.language == 'System') { let fuzzy_string = fuzzy_strings[settings.language]; +let timeout = 2.5*60; +let drawTimeout; + +function queueDraw(seconds) { + let millisecs = seconds * 1000; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, millisecs - (Date.now() % millisecs)); +} + const h = g.getHeight(); const w = g.getWidth(); let align_mode = 0; @@ -42,11 +54,11 @@ function draw() { g.clearRect(0, 24, w, h-24); g.setColor(g.theme.fg); g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); + queueDraw(timeout); } g.clear(); draw(); -setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ From f0fce411b993d3416aa340d18ad4523666cfdb92 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:54:17 +0100 Subject: [PATCH 171/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index e4fa71070..37d497e20 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -62,11 +62,11 @@ draw(); // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; } }); From 575926b654bf6e1ed2ee68c1b9cf5c00dec06086 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:17:03 +0100 Subject: [PATCH 172/197] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 37d497e20..07b5c4068 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -35,7 +35,7 @@ if (settings.alignment =='Left') { } function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let segment = Math.round((date.getMinutes()*60 + date.getSeconds() + 1)/300); let hour = date.getHours() + Math.floor(segment/12); f_string = fuzzy_string.minutes[segment % 12]; if (f_string.includes('$1')) { From fb3dc7fe71ad1c49e2c2eccf64d5e7d0d820183d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:23:55 +0100 Subject: [PATCH 173/197] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 6b4b71419..8594ad554 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -91,7 +91,7 @@ ], "text_scale":3.5 }, - "no_NO":{ + "no_NB":{ "hours":[ "tolv", "ett", "to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni", "ti", "elleve", From c48a951f2d1705f1b57e14a84dd85ae61a82548e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 14:55:07 +0100 Subject: [PATCH 174/197] 0.06: Add button for force compass calibration (#1660) --- apps/compass/ChangeLog | 1 + apps/compass/compass.js | 7 ++++++- apps/compass/metadata.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/compass/ChangeLog b/apps/compass/ChangeLog index 4bb7838ac..d1adafc4c 100644 --- a/apps/compass/ChangeLog +++ b/apps/compass/ChangeLog @@ -3,3 +3,4 @@ 0.03: Eliminate flickering 0.04: Fix for Bangle.js 2 and themes 0.05: Fix bearing not clearing correctly (visible in single or double digit bearings) +0.06: Add button for force compass calibration diff --git a/apps/compass/compass.js b/apps/compass/compass.js index 65ad83c4f..ee0d3d8ba 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -64,7 +64,12 @@ Bangle.on('mag', function(m) { oldHeading = m.heading; }); -g.clear(); +g.clear(1); +g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + Bangle.resetCompass(); +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); + Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setCompassPower(1); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index 318d90c86..e24ca4adc 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -1,7 +1,7 @@ { "id": "compass", "name": "Compass", - "version": "0.05", + "version": "0.06", "description": "Simple compass that points North", "icon": "compass.png", "screenshots": [{"url":"screenshot_compass.png"}], From 459fb273f195957e59abdc0519ec19f730268cc0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:09:41 +0100 Subject: [PATCH 175/197] Add altimeter app --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app-icon.js | 1 + apps/altimeter/app.js | 34 ++++++++++++++++++++++++++++++++++ apps/altimeter/app.png | Bin 0 -> 1289 bytes apps/altimeter/metadata.json | 12 ++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 apps/altimeter/ChangeLog create mode 100644 apps/altimeter/app-icon.js create mode 100644 apps/altimeter/app.js create mode 100644 apps/altimeter/app.png create mode 100644 apps/altimeter/metadata.json diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/altimeter/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/altimeter/app-icon.js b/apps/altimeter/app-icon.js new file mode 100644 index 000000000..1f8dfb637 --- /dev/null +++ b/apps/altimeter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///t9TmuV3+GJf4AN+ALVgf8BasP/4LVn//4ALUWgJUJBZUDBYJUIBZcP3/nKhEOt/WBZE5r+VKg0KgEVr9V3wLHqtaqt9sALElWAqoABt1QBZNeBYuq0ILCrVUBYulBYVWBYkCBYgABBZ8K1WVBYlABZegKQWqBQlVqALKqWoKQWpBYtWBZeqKRAAB1WABZZSHAANq0ALLKQ6qC1ALLKQ5UEAH4AG")) diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js new file mode 100644 index 000000000..06c254a36 --- /dev/null +++ b/apps/altimeter/app.js @@ -0,0 +1,34 @@ +// place your const, vars, functions or classes here + +// clear the screen +g.clear(); + +var n = 0; + +// redraw the screen +function draw() { + g.reset().clearRect(Bangle.appRect); + g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); + g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); +} + +// Respond to user input +Bangle.setUI({mode: "updown"}, function(dir) { + if (dir<0) { + n--; + draw(); + } else if (dir>0) { + n++; + draw(); + } else { + n = 0; + draw(); + } +}); + +// First draw... +draw(); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/altimeter/app.png b/apps/altimeter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9d6907762d253ba62b9d3f954c9252c002969b GIT binary patch literal 1289 zcmV+k1@`)hP)85fi3beW{$s+Y+K7*&r}Q6lfXBAc0bT`a@f6drsSP zUN5$G{XKBxbTg*U)j7}ieed%=@B5w8?-a-(ha7VFU!#6R`tkkI@VRWor)&iV0JAlG zfE4Zq04CaN-kEn^d)&XWp ztvJ&=dh2AR17?f#5HXD)wLr|wyUh>h59_6sl@1Wo$qcaxM73%7f3KxyFaY?#D(+C& zFb0N@K~XkDl%1z4){X0-r+Wt!*-)D?c>rJtvS4^yFFjp5V73Ie5et6-Fs(2(Y>?&h zQxyeMYt_`b141oUP96aAWTS9G4@KQN&|u}Q5jivkqWt8sz=91*SVUoIS&U=mkWrSm zpWMBEb}hQPbs#KDwIIr09PEL#n8`#wb9s^ zdu$M_$N+%(D?dSz!*S}ACoa3{)}p;?17}(~y3Vw8bS3jOU!O0T?YnTmGyZ$*)hT(L zkd_=^MTUE9Fg7>r_rYbk61%teT?7fnm(9QWHfPm9Q)_!AfI|QdH8ywdj~|=+qxY!a zHc^_q#ye?&_nH-vz;Xib7`hBu3IYIvi#AN0`^x07^naXH1BycLMX!nY!{~L@;kSyw z{A#*2-bo8wmVp#rmV$5$T>=1@ita+l=f=WsJylP>ZZ6iEJg^D_O|9*fMA#Qc?TL1Q z*9k`fq!kvI90)Ah(#CX-4j{C=1k;91*9k^Zo)S8uF?Rq^`N_Y5C!TutTO!;a&k69Y(?3=$G;r!?G0%OrP_fs)sJG2(X{bX03}+) z;^CPX28X10YLiJ6s%>84ajZAM=hy zgd>sFoOx6cblQ`tEi4zjq9sN~1DUGN%$S{9(4wIgCl1!sq@1TRA+3SN=Fa_@tM7yq z()65ZMQI^zco6`YnVMQUyPH}%yO}xd!80w{*xb>R&HyuGaCj7=B&A!XC#E-w&awyh z9(;y~&jJ7uo_p>2r@u>{n9>2Yy}#&k-HPM^V4G+C<`;;R`Y6H7ADP?QQl7gM18RGJ z#y+oankq1maGDu6KOjI46ia!BQ|86rs8!$TUV@{DycY z!GK!zZT2~xQ(PG{$(n=`nS*b{Q!xW-)pvP3@CSq0$Wax6U=XgPE)db1UwqScPxL-! zAXD`Lz;+Aweln)*bKtm7Q2>QulMwsc(g3Je-|g|>Z@)jgS*pMv2*Bg@C6Y|lpEY-t z0XGc%SF0bz^lZxWmuDck9ssDRwY`#=eonX0Yv%pZ&lb;UXJ3TJL4%PqDKsB z)t{M7Ic(iF%-B=@J|brRCQa1;Lk(xU|hM!ENZ00000NkvXXu0mjf&Ua!E literal 0 HcmV?d00001 diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json new file mode 100644 index 000000000..137ceb8ba --- /dev/null +++ b/apps/altimeter/metadata.json @@ -0,0 +1,12 @@ +{ "id": "altimeter", + "name": "Altimeter", + "version":"0.01", + "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", + "icon": "app.png", + "tags": "tool,outdoors", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"altimeter.app.js","url":"app.js"}, + {"name":"altimeter.img","url":"app-icon.js","evaluate":true} + ] +} From cb6a393110535a565c77744800beea04d98ea357 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:44:46 +0100 Subject: [PATCH 176/197] alt 0.02: Actually upload correct code --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app.js | 54 +++++++++++++++++------------------- apps/altimeter/metadata.json | 4 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog index 5560f00bc..29388520e 100644 --- a/apps/altimeter/ChangeLog +++ b/apps/altimeter/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Actually upload correct code diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js index 06c254a36..cac4e80fd 100644 --- a/apps/altimeter/app.js +++ b/apps/altimeter/app.js @@ -1,34 +1,30 @@ -// place your const, vars, functions or classes here +Bangle.setBarometerPower(true, "app"); -// clear the screen -g.clear(); +g.clear(1); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +var zero = 0; +var R = Bangle.appRect; +var y = R.y + R.h/2; +var MEDIANLENGTH = 20; +var avr = [], median; +var value = 0; -var n = 0; - -// redraw the screen -function draw() { - g.reset().clearRect(Bangle.appRect); - g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); - g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); -} - -// Respond to user input -Bangle.setUI({mode: "updown"}, function(dir) { - if (dir<0) { - n--; - draw(); - } else if (dir>0) { - n++; - draw(); - } else { - n = 0; - draw(); +Bangle.on('pressure', function(e) { + while (avr.length>MEDIANLENGTH) avr.pop(); + avr.unshift(e.altitude); + median = avr.slice().sort(); + g.reset().clearRect(0,y-30,g.getWidth()-10,y+30); + if (median.length>10) { + var mid = median.length>>1; + value = E.sum(median.slice(mid-4,mid+5)) / 9; + g.setFont("Vector",50).setFontAlign(0,0).drawString((value-zero).toFixed(1), g.getWidth()/2, y); } }); -// First draw... -draw(); - -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); +g.reset(); +g.setFont("6x8").setFontAlign(0,0).drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"ZERO", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + zero = value; +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json index 137ceb8ba..8bdbf3022 100644 --- a/apps/altimeter/metadata.json +++ b/apps/altimeter/metadata.json @@ -1,10 +1,10 @@ { "id": "altimeter", "name": "Altimeter", - "version":"0.01", + "version":"0.02", "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", "icon": "app.png", "tags": "tool,outdoors", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"altimeter.app.js","url":"app.js"}, {"name":"altimeter.img","url":"app-icon.js","evaluate":true} From 0b7fa0494d6862cba796a1f95882c1fe57bf4c24 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 6 Apr 2022 17:34:56 +0200 Subject: [PATCH 177/197] use type of sched instead of app --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5a46ae546..5adf00921 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"app"}, + "dependencies": {"sched":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From dfd5461fd9ff58ea722f77446fa0d87ba86a44d2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 16:37:26 +0100 Subject: [PATCH 178/197] https://github.com/espruino/BangleApps/pull/1661#issuecomment-1090413428 --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5adf00921..06bad962d 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"type"}, + "dependencies": {"scheduler":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 3c28c0c9c9a625e663bfbf324b3a58a4fb53eb12 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 19:45:27 +0100 Subject: [PATCH 179/197] readme --- apps/compass/README.md | 29 +++++++++++++++++++++++++++++ apps/compass/compass.js | 4 ++-- apps/compass/metadata.json | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 apps/compass/README.md diff --git a/apps/compass/README.md b/apps/compass/README.md new file mode 100644 index 000000000..d60192f73 --- /dev/null +++ b/apps/compass/README.md @@ -0,0 +1,29 @@ +# Compass + +This app uses Bangle.js's built-in magnetometer as a compass. + +## Usage + +Hold your Bangle.js **face up** (so the display is parallel to the ground), +and the red arrow will point north, with the heading in degrees printed at +the top of the screen. + +This compass app does not include tilt compensation - so much like a real +compass you should always keep it face up when taking a reading. + +The first time you run the compass after your Bangle has booted (or if +you move to an area with a substantially different magnetic field) you will +need to recalibrate your compass (even if a heading is shown). + +## Calibration + +Press the button next to the `RESET` label on the screen. The North/South marker +will disappear and a message will appear asking you to rotate the watch 360 degrees. + +* Hold the watch face up, so the display is parallel to the ground +* Rotate it around slowly, all 360 degrees (with the display still parallel to the ground) +* The `Uncalibrated` message will disappear before you have finished rotating the full 360 degrees - but you should still complete the full rotation in order for the compass to work properly. + +Once you've rotated the full 360 degrees your compass should now work fine, +and calibration is stored between runs of the app. However if you go near +to a strong magnet you may still need to recalibrate. diff --git a/apps/compass/compass.js b/apps/compass/compass.js index ee0d3d8ba..4730111ac 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -38,7 +38,7 @@ Bangle.on('mag', function(m) { if (!wasUncalibrated) { g.clearRect(0,24,W,48); g.setFontAlign(0,-1).setFont("6x8"); - g.drawString("Uncalibrated\nturn 360° around",M,24+4); + g.drawString(/*LANG*/"Uncalibrated\nturn 360° around",M,24+4); wasUncalibrated = true; } } else { @@ -65,7 +65,7 @@ Bangle.on('mag', function(m) { }); g.clear(1); -g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"RESET", g.getWidth()-5, g.getHeight()/2); setWatch(function() { Bangle.resetCompass(); }, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index e24ca4adc..3e3b37f72 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -7,6 +7,7 @@ "screenshots": [{"url":"screenshot_compass.png"}], "tags": "tool,outdoors", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"compass.app.js","url":"compass.js"}, {"name":"compass.img","url":"compass-icon.js","evaluate":true} From a2002c48419b6b3b7c209b0e86fe6c75eed30373 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 6 Apr 2022 22:29:13 +0200 Subject: [PATCH 180/197] lightswitch: masking (espruino/Espruino#2151) + oversize Update ChangeLog and metadata.json Update README.md and settings.json - add oversize setting + description Update settings.js - add oversize setting Update widget.js - add oversize setting - add masking touch and drag input by adding own event listeners first and messing up the handler on a widget related event, using espruino/Espruino#2151 --- apps/lightswitch/ChangeLog | 1 + apps/lightswitch/README.md | 10 +++++++--- apps/lightswitch/metadata.json | 2 +- apps/lightswitch/settings.js | 16 +++++++++++++--- apps/lightswitch/settings.json | 8 ++++++-- apps/lightswitch/widget.js | 22 ++++++++++++++++------ 6 files changed, 44 insertions(+), 15 deletions(-) diff --git a/apps/lightswitch/ChangeLog b/apps/lightswitch/ChangeLog index 4210ccf03..2c6d2b5db 100644 --- a/apps/lightswitch/ChangeLog +++ b/apps/lightswitch/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Add the option to enable touching the widget only on clock and settings. 0.03: Settings page now uses built-in min/max/wrap (fix #1607) +0.04: Add masking widget input to other apps (using espruino/Espruino#2151), add a oversize option to increase the touch area. diff --git a/apps/lightswitch/README.md b/apps/lightswitch/README.md index d58de7ca4..67d070f5c 100644 --- a/apps/lightswitch/README.md +++ b/apps/lightswitch/README.md @@ -1,8 +1,11 @@ # Light Switch Widget -Whis this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. +With this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. In addition it shows the lock status with the option to personalize the lock icon with a tiny image. +All touch and drag inputs related to this widget are cached/masked to prevent actions in the active app. +(See [espruino/Espruino#2151](https://github.com/espruino/Espruino/issues/2151) for more information.) + --- ### Control --- @@ -39,6 +42,9 @@ In addition it shows the lock status with the option to personalize the lock ico * _clk+launch_ -> on all apps of the types _clock_ and _launch_ * _except apps_ -> on all apps of the types _clock_ and _launch_ and in the settings * _always on_ -> always enabled when the widget is displayed +* __Oversize__ + _0px_ / _1px_ / _..._ / __20px__ / _..._ / _50px_ + To make it easier to hit the widget, this value extends the touch area of the widget in all directions. * __Drag Delay__ _off_ / _50ms_ / _100ms_ / _..._ / __500ms__ / _..._ / _1000ms_ Change the maximum delay between first touch and re-touch/drag to change the brightness or disable changing the brightness completely. @@ -85,8 +91,6 @@ This images are stored in a seperate file _(lightswitch.images.json)_. ### Worth Mentioning --- #### To do list -* Catch the touch and draw input related to this widget to prevent actions in the active app. - _(For now I have no idea how to achieve this, help is appreciated)_ * Manage images for the lock icon through a _Customize and Upload App_ page. #### Requests, Bugs and Feedback diff --git a/apps/lightswitch/metadata.json b/apps/lightswitch/metadata.json index 9ac388eda..54dc8389f 100644 --- a/apps/lightswitch/metadata.json +++ b/apps/lightswitch/metadata.json @@ -2,7 +2,7 @@ "id": "lightswitch", "name": "Light Switch Widget", "shortName": "Light Switch", - "version": "0.03", + "version": "0.04", "description": "A fast way to switch LCD backlight on/off, change the brightness and show the lock status. All in one widget.", "icon": "images/app.png", "screenshots": [ diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index bebb16d15..a502324d9 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -7,6 +7,7 @@ colors: "011", image: "default", touchOn: "clock,launch", + oversize: 20, dragDelay: 500, minValue: 0.1, unlockSide: "", @@ -45,7 +46,7 @@ return { value: entry.value.indexOf(settings[key]), min : 0, - max : entry.value.length-1, + max : entry.value.length - 1, wrap : true, format: v => entry.title ? entry.title[v] : entry.value[v], onchange: function(v) { @@ -57,11 +58,11 @@ // return entry for numerical value return { value: settings[key] * entry.factor, - step: entry.step, - format: v => v > 0 ? v + entry.unit : "off", min : entry.min, max : entry.max, + step: entry.step, wrap : true, + format: v => v > 0 ? v + entry.unit : "off", onchange: function(v) { writeSetting(key, v / entry.factor, entry.drawWidgets); }, @@ -96,6 +97,14 @@ value: ["", "clock", "clock,setting.app.js", "clock,launch", "clock,setting.app.js,launch", "always"], drawWidgets: true }, + oversize: { + factor: 1, + unit: "px", + min: 0, + max: 50, + step: 1, + drawWidgets: true + }, dragDelay: { factor: 1, unit: "ms", @@ -142,6 +151,7 @@ "Image": getEntry("image"), "-- Control": 0, "Touch": getEntry("touchOn"), + "Oversize": getEntry("oversize"), "Drag Delay": getEntry("dragDelay"), "Min Value": getEntry("minValue"), "-- Unlock": 0, diff --git a/apps/lightswitch/settings.json b/apps/lightswitch/settings.json index 3d88e2282..176c3cea0 100644 --- a/apps/lightswitch/settings.json +++ b/apps/lightswitch/settings.json @@ -10,8 +10,8 @@ "101" -> magenta * image: string // - "default" -> - "random" -> + "default" -> image nearest to the default lock + "random" -> a random image from all available * touchOn: string // select when widget touch is active "" -> only on default clock @@ -19,6 +19,9 @@ "clock,launch" -> on all clocks and lanchers (default) "always" -> always + * oversize: int // extends the touch area of the widget in px in all directions + 0 to 50, 20 as default + * dragDelay: int // drag listener reset time in ms // time until a drag is needed to activate backlight changing mode 0 -> disabled @@ -59,6 +62,7 @@ "colors": "011", "image": "default", "touchOn": "clock,launch", + "oversize": 20, "dragDelay": 500, "minValue": 0.1, "unlockSide": "", diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 119a114fe..53f86ee9a 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -4,6 +4,7 @@ colors: "011", image: "default", touchOn: "clock,launch", + oversize: 20, dragDelay: 500, minValue: 0.1, unlockSide: "", @@ -162,6 +163,11 @@ // change brigthness value, skip write to storage while still touching w.changeValue(value, event.b); + // masks this drag event by messing up the event handler + // see https://github.com/espruino/Espruino/issues/2151 + Bangle.removeListener("drag", w.dragListener); + Bangle["#ondrag"] = [w.dragListener].concat(Bangle["#ondrag"]); + // on touch release remove drag listener and reset drag status to indicate stopped drag action if (!event.b) { Bangle.removeListener("drag", w.dragListener); @@ -184,14 +190,14 @@ if (w.dragStatus === "off") { // check if inside widget area - if (!(!w || cursor.x < w.x || cursor.x > w.x + w.width || - cursor.y < w.y || cursor.y > w.y + 23)) { + if (!(!w || cursor.x < w.x - w.oversize || cursor.x > w.x + w.width + w.oversize || + cursor.y < w.y - w.oversize || cursor.y > w.y + 23 + w.oversize)) { // first touch feedback Bangle.buzz(25); // check if drag is disabled if (w.dragDelay) { - // add drag listener - Bangle.on("drag", w.dragListener); + // add drag listener at first position + Bangle["#ondrag"] = [w.dragListener].concat(Bangle["#ondrag"]); // set drag timeout w.dragStatus = setTimeout((w) => { // remove drag listener @@ -204,6 +210,10 @@ } // switch backlight w.changeValue(); + // masks this touch event by messing up the event handler + // see https://github.com/espruino/Espruino/issues/2151 + Bangle.removeListener("touch", w.touchListener); + Bangle["#ontouch"] = [w.touchListener].concat(Bangle["#ontouch"]); } } @@ -236,11 +246,11 @@ // add lock listener Bangle.on("lock", w.draw); - // add touch listener to control the light depending on settings + // add touch listener to control the light depending on settings at first position if (w.touchOn === "always" || !global.__FILE__ || w.touchOn.includes(__FILE__) || w.touchOn.includes(require("Storage").readJSON(__FILE__.replace("app.js", "info")).type)) - Bangle.on("touch", w.touchListener); + Bangle["#ontouch"] = [w.touchListener].concat(Bangle["#ontouch"]); // add tap listener to unlock and/or flash backlight if (w.unlockSide || w.tapSide) Bangle.on("tap", require("lightswitch.js").tapListener); From f7b2ece533a7368f340bbe47bb200c89af59d892 Mon Sep 17 00:00:00 2001 From: marko Date: Wed, 6 Apr 2022 17:30:12 -0400 Subject: [PATCH 181/197] Reword word lookup algorith to use bisection, get rid of index file. --- apps/bee/ChangeLog | 1 + apps/bee/README.md | 7 +- apps/bee/bee.app.js | 48 +- apps/bee/bee_lindex.json | 1 - apps/bee/bee_words_2of12 | 74578 ------------------------------------- apps/bee/metadata.json | 3 +- 6 files changed, 21 insertions(+), 74617 deletions(-) delete mode 100644 apps/bee/bee_lindex.json delete mode 100644 apps/bee/bee_words_2of12 diff --git a/apps/bee/ChangeLog b/apps/bee/ChangeLog index df0907283..cfb44c8e9 100644 --- a/apps/bee/ChangeLog +++ b/apps/bee/ChangeLog @@ -1,2 +1,3 @@ 0.01: New app! 0.02: Fix bug with regenerating index, fix bug in word lookups +0.03: Improve word search performance diff --git a/apps/bee/README.md b/apps/bee/README.md index c6461fb8e..3d0a4c14a 100644 --- a/apps/bee/README.md +++ b/apps/bee/README.md @@ -27,10 +27,7 @@ least once and yields an additional 7 points. Each game contains at least one pa The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words', using the '2of12inf' word list). The dictionary is fairly large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat slow. Because of its size it cannot be compressed (heatshrink needs to hold the compressed/uncompressed data in memory). -In order to make checking the validity of a guessed word faster an index file ('bee_lindex.json') is installed with -the app that facilitates faster word lookups. This index file is specific to the dictionary file used. If one were to -replace the dictionary file with a different version (e.g. a different language) the index file has to be regenerated. The easiest -way to do so is to delete (via the Web IDE or the fileman app on the watch) the file 'bee_lindex.json' - it will be regenerated (and saved, -i.e. it only happens once) on app startup automatically, a process that takes roughly 30 seconds. +This file can be replaced with a custom dictionary, an ASCII file containing a newline-separated (single "\n", not DOS-style "\r\n") alphabetically +sorted (sorting is important for the word lookup algorithm) list of words. ![Screenshot](./bee_screenshot.png) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index ef1582baa..878e9763c 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -1,7 +1,7 @@ const S = require("Storage"); +const words = S.read("bee.words"); var letters = []; -var letterIdx = []; var centers = []; @@ -12,29 +12,17 @@ var score = 0; var intervalID = -1; -function prepareLetterIdx () { +function biSearch(w, ws, start, end, count) { "compile" - var li = [0]; - if (S.read("bee_lindex.json")!==undefined) li = S.readJSON("bee_lindex.json"); // check for cached index - else { - for (var i=1; i<26; ++i) { - var prefix = String.fromCharCode(97+i%26); - console.log(prefix); - li.push(S.read('bee.words').indexOf("\n"+prefix, li[i-1])+1); - } - li.push(S.read('bee.words').length); - S.writeJSON("bee_lindex.json", li); - } - for (var i=0; i<26; ++i) letterIdx[i] = S.read("bee.words", li[i], li[i+1]-li[i]); -} - -function findWord (w) { - "compile" - var ci = w.charCodeAt(0)-97; - var f = letterIdx[ci].indexOf("\n"+w+"\n"); - if (f>=0) return true; - if (letterIdx[ci].substr(0, w.length)==w) return true; - return false; + if (start>end-w.legnth || count--<=0) return ws.substr(start, end-start).indexOf("\n"+w+"\n"); + var mid = (end+start)>>1; + if (ws[mid-1]==="\n") --mid; + else while (midws[mid+i+1]) return biSearch(w, ws, mid+1, end, count); } function isPangram(w) { @@ -46,7 +34,7 @@ function isPangram(w) { function checkWord (w) { if (w.indexOf(String.fromCharCode(97+letters[0]))==-1) return false; // does it contain central letter? if (foundWords.indexOf(w)>=0) return false; // already found - if (findWord(w)) { + if (biSearch(w, words, 0, words.length, 20)>-1) { foundWords.push(w); foundWords.sort(); if (w.length==4) score++; @@ -93,13 +81,12 @@ function pickLetters() { var ltrs = ""; while (ltrs.length!==7) { ltrs = []; - var j = Math.floor(26*Math.random()); - var i = Math.floor((letterIdx[j].length-10)*Math.random()); - while (letterIdx[j][i]!="\n" && i Date: Wed, 6 Apr 2022 17:37:18 -0400 Subject: [PATCH 182/197] Restore accidentally deleted file. --- apps/bee/bee_words_2of12 | 74578 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74578 insertions(+) create mode 100644 apps/bee/bee_words_2of12 diff --git a/apps/bee/bee_words_2of12 b/apps/bee/bee_words_2of12 new file mode 100644 index 000000000..3bab44251 --- /dev/null +++ b/apps/bee/bee_words_2of12 @@ -0,0 +1,74578 @@ +aardvark +aardvarks +abaci +aback +abacus +abacuses +abaft +abalone +abalones +abandon +abandoned +abandoning +abandonment +abandons +abase +abased +abasement +abases +abash +abashed +abashedly +abashes +abashing +abashment +abasing +abate +abated +abatement +abates +abating +abattoir +abattoirs +abbe +abbes +abbess +abbesses +abbey +abbeys +abbot +abbots +abbreviate +abbreviated +abbreviates +abbreviating +abbreviation +abbreviations +abdicate +abdicated +abdicates +abdicating +abdication +abdications +abdomen +abdomens +abdominal +abdominals +abduct +abducted +abducting +abduction +abductions +abductor +abductors +abducts +abeam +abed +aberrant +aberration +aberrational +aberrations +abet +abets +abetted +abetter +abetters +abetting +abettor +abettors +abeyance +abhor +abhorred +abhorrence +abhorrent +abhorrently +abhorring +abhors +abidance +abide +abided +abides +abiding +abidingly +abilities +ability +abject +abjection +abjectly +abjectness +abjuration +abjurations +abjuratory +abjure +abjured +abjurer +abjurers +abjures +abjuring +ablate +ablated +ablates +ablating +ablation +ablations +ablative +ablatives +ablaze +able +abler +ablest +abloom +ablution +ablutions +ably +abnegate +abnegated +abnegates +abnegating +abnegation +abnormal +abnormalities +abnormality +abnormally +aboard +abode +abodes +abolish +abolished +abolishes +abolishing +abolition +abolitionism +abolitionist +abolitionists +abominable +abominably +abominate +abominated +abominates +abominating +abomination +abominations +aboriginal +aboriginals +aborigine +aborigines +aborning +abort +aborted +aborting +abortion +abortionist +abortionists +abortions +abortive +abortively +aborts +abound +abounded +abounding +abounds +about +above +aboveboard +abracadabra +abrade +abraded +abrades +abrading +abrasion +abrasions +abrasive +abrasively +abrasiveness +abrasives +abreast +abridge +abridged +abridgement +abridgements +abridges +abridging +abridgment +abridgments +abroad +abrogate +abrogated +abrogates +abrogating +abrogation +abrogations +abrogator +abrogators +abrupt +abrupter +abruptest +abruptly +abruptness +abscess +abscessed +abscesses +abscessing +abscissa +abscissae +abscissas +abscission +abscond +absconded +absconder +absconders +absconding +absconds +abseil +abseiled +abseiling +abseils +absence +absences +absent +absented +absentee +absenteeism +absentees +absenting +absently +absentminded +absentmindedly +absentmindedness +absents +absinth +absinthe +absolute +absolutely +absoluteness +absolutes +absolutest +absolution +absolutism +absolutist +absolutists +absolve +absolved +absolves +absolving +absorb +absorbed +absorbency +absorbent +absorbents +absorbing +absorbingly +absorbs +absorption +absorptive +abstain +abstained +abstainer +abstainers +abstaining +abstains +abstemious +abstemiously +abstemiousness +abstention +abstentions +abstinence +abstinent +abstract +abstracted +abstractedly +abstractedness +abstracting +abstraction +abstractions +abstractly +abstractness +abstracts +abstruse +abstrusely +abstruseness +absurd +absurder +absurdest +absurdities +absurdity +absurdly +absurdness +abundance +abundances +abundant +abundantly +abuse +abused +abuser +abusers +abuses +abusing +abusive +abusively +abusiveness +abut +abutment +abutments +abuts +abutted +abutting +abuzz +abysmal +abysmally +abyss +abyssal +abysses +acacia +acacias +academe +academia +academic +academically +academician +academicians +academics +academies +academy +acanthi +acanthus +acanthuses +accede +acceded +accedes +acceding +accelerate +accelerated +accelerates +accelerating +acceleration +accelerator +accelerators +accent +accented +accenting +accents +accentual +accentuate +accentuated +accentuates +accentuating +accentuation +accept +acceptability +acceptable +acceptableness +acceptably +acceptance +acceptances +acceptation +acceptations +accepted +accepting +accepts +access +accessed +accesses +accessibility +accessible +accessibly +accessing +accession +accessions +accessories +accessory +accident +accidental +accidentally +accidentals +accidents +acclaim +acclaimed +acclaiming +acclaims +acclamation +acclimate +acclimated +acclimates +acclimating +acclimation +acclimatization +acclimatize +acclimatized +acclimatizes +acclimatizing +acclivities +acclivity +accolade +accolades +accommodate +accommodated +accommodates +accommodating +accommodatingly +accommodation +accommodations +accompanied +accompanies +accompaniment +accompaniments +accompanist +accompanists +accompany +accompanying +accomplice +accomplices +accomplish +accomplished +accomplishes +accomplishing +accomplishment +accomplishments +accord +accordance +accordant +accorded +according +accordingly +accordion +accordionist +accordionists +accordions +accords +accost +accosted +accosting +accosts +account +accountability +accountable +accountancy +accountant +accountants +accounted +accounting +accounts +accouter +accoutered +accoutering +accouterments +accouters +accoutre +accoutred +accoutrements +accoutres +accoutring +accredit +accreditation +accredited +accrediting +accredits +accretion +accretions +accrual +accruals +accrue +accrued +accrues +accruing +acculturate +acculturated +acculturates +acculturating +acculturation +accumulate +accumulated +accumulates +accumulating +accumulation +accumulations +accumulative +accumulator +accumulators +accuracy +accurate +accurately +accurateness +accursed +accursedness +accurst +accusation +accusations +accusative +accusatives +accusatory +accuse +accused +accuser +accusers +accuses +accusing +accusingly +accustom +accustomed +accustoming +accustoms +aced +acerbate +acerbated +acerbates +acerbating +acerbic +acerbically +acerbity +aces +acetaminophen +acetate +acetates +acetic +acetone +acetonic +acetylene +ache +ached +achene +achenes +aches +achier +achiest +achievable +achieve +achieved +achievement +achievements +achiever +achievers +achieves +achieving +aching +achoo +achoos +achromatic +achy +acid +acidic +acidified +acidifies +acidify +acidifying +acidity +acidly +acidosis +acids +acidulous +acing +acknowledge +acknowledged +acknowledgement +acknowledgements +acknowledges +acknowledging +acknowledgment +acknowledgments +acme +acmes +acne +acolyte +acolytes +aconite +aconites +acorn +acorns +acoustic +acoustical +acoustically +acoustics +acquaint +acquaintance +acquaintances +acquaintanceship +acquainted +acquainting +acquaints +acquiesce +acquiesced +acquiescence +acquiescent +acquiescently +acquiesces +acquiescing +acquirable +acquire +acquired +acquirement +acquires +acquiring +acquisition +acquisitions +acquisitive +acquisitively +acquisitiveness +acquit +acquits +acquittal +acquittals +acquitted +acquitting +acre +acreage +acreages +acres +acrid +acrider +acridest +acridity +acridly +acridness +acrimonious +acrimoniously +acrimoniousness +acrimony +acrobat +acrobatic +acrobatically +acrobatics +acrobats +acronym +acronyms +acrophobia +acropolis +acropolises +across +acrostic +acrostics +acrylic +acrylics +acted +acting +actinium +action +actionable +actions +activate +activated +activates +activating +activation +activator +activators +active +actively +activeness +actives +activism +activist +activists +activities +activity +actor +actors +actress +actresses +acts +actual +actualities +actuality +actualization +actualize +actualized +actualizes +actualizing +actually +actuarial +actuaries +actuary +actuate +actuated +actuates +actuating +actuation +actuator +actuators +acuity +acumen +acupressure +acupuncture +acupuncturist +acupuncturists +acute +acutely +acuteness +acuter +acutes +acutest +acyclovir +adage +adages +adagio +adagios +adamant +adamantly +adapt +adaptability +adaptable +adaptation +adaptations +adapted +adapter +adapters +adapting +adaptive +adaptor +adaptors +adapts +addable +added +addend +addenda +addends +addendum +adder +adders +addible +addict +addicted +addicting +addiction +addictions +addictive +addicts +adding +addition +additional +additionally +additions +additive +additives +addle +addled +addles +addling +address +addressed +addressee +addressees +addresses +addressing +adds +adduce +adduced +adduces +adducing +adenine +adenoid +adenoidal +adenoids +adept +adeptly +adeptness +adepts +adequacy +adequate +adequately +adequateness +adhere +adhered +adherence +adherent +adherents +adheres +adhering +adhesion +adhesive +adhesiveness +adhesives +adieu +adieus +adieux +adios +adipose +adjacency +adjacent +adjacently +adjectival +adjectivally +adjective +adjectives +adjoin +adjoined +adjoining +adjoins +adjourn +adjourned +adjourning +adjournment +adjournments +adjourns +adjudge +adjudged +adjudges +adjudging +adjudicate +adjudicated +adjudicates +adjudicating +adjudication +adjudicative +adjudicator +adjudicators +adjudicatory +adjunct +adjuncts +adjuration +adjurations +adjure +adjured +adjures +adjuring +adjust +adjustable +adjusted +adjuster +adjusters +adjusting +adjustment +adjustments +adjustor +adjustors +adjusts +adjutant +adjutants +adman +admen +administer +administered +administering +administers +administrate +administrated +administrates +administrating +administration +administrations +administrative +administratively +administrator +administrators +admirable +admirably +admiral +admirals +admiralty +admiration +admire +admired +admirer +admirers +admires +admiring +admiringly +admissibility +admissible +admissibly +admission +admissions +admit +admits +admittance +admitted +admittedly +admitting +admix +admixed +admixes +admixing +admixture +admixtures +admonish +admonished +admonishes +admonishing +admonishment +admonishments +admonition +admonitions +admonitory +adobe +adobes +adolescence +adolescences +adolescent +adolescents +adopt +adoptable +adopted +adopter +adopters +adopting +adoption +adoptions +adoptive +adopts +adorable +adorableness +adorably +adoration +adore +adored +adorer +adorers +adores +adoring +adoringly +adorn +adorned +adorning +adornment +adornments +adorns +adrenal +adrenalin +adrenaline +adrenals +adrift +adroit +adroitly +adroitness +adsorb +adsorbed +adsorbent +adsorbents +adsorbing +adsorbs +adsorption +adsorptions +adulate +adulated +adulates +adulating +adulation +adulator +adulators +adulatory +adult +adulterant +adulterants +adulterate +adulterated +adulterates +adulterating +adulteration +adulterer +adulterers +adulteress +adulteresses +adulteries +adulterous +adultery +adulthood +adults +adumbrate +adumbrated +adumbrates +adumbrating +adumbration +advance +advanced +advancement +advancements +advances +advancing +advantage +advantaged +advantageous +advantageously +advantages +advantaging +advent +adventitious +adventitiously +advents +adventure +adventured +adventurer +adventurers +adventures +adventuresome +adventuress +adventuresses +adventuring +adventurous +adventurously +adventurousness +adverb +adverbial +adverbially +adverbials +adverbs +adversarial +adversaries +adversary +adverse +adversely +adverseness +adverser +adversest +adversities +adversity +advert +adverted +adverting +advertise +advertised +advertisement +advertisements +advertiser +advertisers +advertises +advertising +advertize +advertized +advertizement +advertizements +advertizes +advertizing +advertorial +advertorials +adverts +advice +advisability +advisable +advisably +advise +advised +advisedly +advisement +adviser +advisers +advises +advising +advisor +advisories +advisors +advisory +advocacy +advocate +advocated +advocates +advocating +adze +adzes +aegis +aeon +aeons +aerate +aerated +aerates +aerating +aeration +aerator +aerators +aerial +aerialist +aerialists +aerially +aerials +aerie +aeries +aerobatic +aerobatics +aerobic +aerobically +aerobics +aerodrome +aerodromes +aerodynamic +aerodynamically +aerodynamics +aeronautic +aeronautical +aeronautics +aeroplane +aeroplanes +aerosol +aerosols +aerospace +aery +aesthete +aesthetes +aesthetic +aesthetically +aestheticism +aesthetics +afar +affability +affable +affably +affair +affairs +affect +affectation +affectations +affected +affectedly +affecting +affectingly +affection +affectionate +affectionately +affections +affects +afferent +affiance +affianced +affiances +affiancing +affidavit +affidavits +affiliate +affiliated +affiliates +affiliating +affiliation +affiliations +affinities +affinity +affirm +affirmation +affirmations +affirmative +affirmatively +affirmatives +affirmed +affirming +affirms +affix +affixed +affixes +affixing +afflatus +afflict +afflicted +afflicting +affliction +afflictions +afflicts +affluence +affluent +affluently +afford +affordable +afforded +affording +affords +afforest +afforestation +afforested +afforesting +afforests +affray +affrays +affront +affronted +affronting +affronts +afghan +afghans +aficionado +aficionados +afield +afire +aflame +afloat +aflutter +afoot +aforementioned +aforesaid +aforethought +afoul +afraid +afresh +after +afterbirth +afterbirths +afterburner +afterburners +aftercare +aftereffect +aftereffects +afterglow +afterglows +afterimage +afterimages +afterlife +afterlives +aftermarket +aftermarkets +aftermath +aftermaths +afternoon +afternoons +aftershave +aftershaves +aftershock +aftershocks +aftertaste +aftertastes +afterthought +afterthoughts +afterward +afterwards +afterword +afterwords +again +against +agape +agar +agate +agates +agave +aged +ageing +ageism +ageist +ageists +ageless +agelessly +agelessness +agencies +agency +agenda +agendas +agent +agents +ageratum +ageratums +ages +agglomerate +agglomerated +agglomerates +agglomerating +agglomeration +agglomerations +agglutinate +agglutinated +agglutinates +agglutinating +agglutination +agglutinations +aggrandize +aggrandized +aggrandizement +aggrandizes +aggrandizing +aggravate +aggravated +aggravates +aggravating +aggravatingly +aggravation +aggravations +aggregate +aggregated +aggregates +aggregating +aggregation +aggregations +aggression +aggressive +aggressively +aggressiveness +aggressor +aggressors +aggrieve +aggrieved +aggrieves +aggrieving +aghast +agile +agilely +agility +aging +agitate +agitated +agitates +agitating +agitation +agitations +agitator +agitators +agitprop +agleam +aglitter +aglow +agnostic +agnosticism +agnostics +agog +agonies +agonize +agonized +agonizes +agonizing +agonizingly +agony +agoraphobia +agoraphobic +agoraphobics +agrarian +agrarianism +agrarians +agree +agreeable +agreeableness +agreeably +agreed +agreeing +agreement +agreements +agrees +agribusiness +agribusinesses +agricultural +agriculturalist +agriculturalists +agriculturally +agriculture +agriculturist +agriculturists +agronomic +agronomics +agronomist +agronomists +agronomy +aground +ague +ahead +ahem +ahoy +aide +aided +aides +aiding +aids +aigrette +aigrettes +ailed +aileron +ailerons +ailing +ailment +ailments +ails +aimed +aiming +aimless +aimlessly +aimlessness +aims +airbag +airbags +airbase +airbases +airborne +airbrush +airbrushed +airbrushes +airbrushing +airbus +airbuses +airbusses +aircraft +airdrop +airdropped +airdropping +airdrops +aired +airfare +airfares +airfield +airfields +airflow +airfoil +airfoils +airfreight +airhead +airheads +airier +airiest +airily +airiness +airing +airings +airless +airlessness +airlift +airlifted +airlifting +airlifts +airline +airliner +airliners +airlines +airlock +airlocks +airmail +airmailed +airmailing +airmails +airman +airmen +airplane +airplanes +airplay +airport +airports +airs +airship +airships +airsick +airsickness +airspace +airstrike +airstrikes +airstrip +airstrips +airtight +airtime +airwaves +airway +airways +airworthier +airworthiest +airworthiness +airworthy +airy +aisle +aisles +aitch +aitches +ajar +akimbo +akin +alabaster +alack +alacrity +alarm +alarmed +alarming +alarmingly +alarmist +alarmists +alarms +alas +albacore +albacores +albatross +albatrosses +albeit +albinism +albino +albinos +albs +album +albumen +albumin +albuminous +albums +alchemist +alchemists +alchemy +alcohol +alcoholic +alcoholically +alcoholics +alcoholism +alcohols +alcove +alcoves +alder +alderman +aldermen +alders +alderwoman +alderwomen +aleatory +alehouse +alehouses +alembic +alembics +alert +alerted +alerting +alertly +alertness +alerts +ales +alewife +alewives +alfalfa +alfresco +alga +algae +algal +algebra +algebraic +algebraically +algorithm +algorithmic +algorithms +alias +aliased +aliases +aliasing +alibi +alibied +alibiing +alibis +alien +alienable +alienate +alienated +alienates +alienating +alienation +alienist +alienists +aliens +alight +alighted +alighting +alights +align +aligned +aligner +aligners +aligning +alignment +alignments +aligns +alike +aliment +alimentary +alimented +alimenting +aliments +alimony +aline +alined +alinement +alinements +alines +alining +alit +alive +aliveness +aliyah +aliyahs +alkali +alkalies +alkaline +alkalinity +alkalis +alkalize +alkalized +alkalizes +alkalizing +alkaloid +alkaloids +alkyd +alkyds +allay +allayed +allaying +allays +allegation +allegations +allege +alleged +allegedly +alleges +allegiance +allegiances +alleging +allegoric +allegorical +allegorically +allegories +allegorist +allegorists +allegory +allegretto +allegrettos +allegro +allegros +allele +alleles +alleluia +alleluias +allergen +allergenic +allergens +allergic +allergically +allergies +allergist +allergists +allergy +alleviate +alleviated +alleviates +alleviating +alleviation +alley +alleys +alleyway +alleyways +alliance +alliances +allied +allies +alligator +alligators +alliterate +alliterated +alliterates +alliterating +alliteration +alliterations +alliterative +alliteratively +allocate +allocated +allocates +allocating +allocation +allocations +allot +allotment +allotments +allots +allotted +allotting +allover +allow +allowable +allowably +allowance +allowances +allowed +allowing +allows +alloy +alloyed +alloying +alloys +allspice +allude +alluded +alludes +alluding +allure +allured +allurement +allurements +allures +alluring +alluringly +allusion +allusions +allusive +allusively +allusiveness +alluvia +alluvial +alluvium +alluviums +ally +allying +almanac +almanacs +almighty +almond +almonds +almoner +almoners +almost +alms +almshouse +almshouses +aloe +aloes +aloft +aloha +alohas +alone +along +alongshore +alongside +aloof +aloofly +aloofness +aloud +alpaca +alpacas +alpha +alphabet +alphabetic +alphabetical +alphabetically +alphabetization +alphabetizations +alphabetize +alphabetized +alphabetizer +alphabetizers +alphabetizes +alphabetizing +alphabets +alphanumeric +alphanumerical +alphanumerically +alphas +alpine +alps +already +alright +also +altar +altarpiece +altarpieces +altars +alter +alterable +alteration +alterations +altercation +altercations +altered +altering +alternate +alternated +alternately +alternates +alternating +alternation +alternations +alternative +alternatively +alternatives +alternator +alternators +alters +altho +although +altimeter +altimeters +altitude +altitudes +alto +altogether +altos +altruism +altruist +altruistic +altruistically +altruists +alum +alumina +aluminium +aluminum +alumna +alumnae +alumni +alumnus +alums +always +amalgam +amalgamate +amalgamated +amalgamates +amalgamating +amalgamation +amalgamations +amalgams +amanuenses +amanuensis +amaranth +amaranths +amaretto +amaryllis +amaryllises +amass +amassed +amasses +amassing +amateur +amateurish +amateurishly +amateurishness +amateurism +amateurs +amatory +amaze +amazed +amazement +amazes +amazing +amazingly +amazon +amazonian +amazons +ambassador +ambassadorial +ambassadors +ambassadorship +ambassadorships +ambassadress +ambassadresses +amber +ambergris +ambiance +ambiances +ambidexterity +ambidextrous +ambidextrously +ambience +ambiences +ambient +ambiguities +ambiguity +ambiguous +ambiguously +ambition +ambitions +ambitious +ambitiously +ambitiousness +ambivalence +ambivalent +ambivalently +amble +ambled +ambler +amblers +ambles +ambling +ambrosia +ambrosial +ambulance +ambulances +ambulant +ambulate +ambulated +ambulates +ambulating +ambulation +ambulations +ambulatories +ambulatory +ambuscade +ambuscaded +ambuscades +ambuscading +ambush +ambushed +ambushes +ambushing +ameba +amebae +amebas +amebic +ameboid +ameliorate +ameliorated +ameliorates +ameliorating +amelioration +ameliorative +amen +amenability +amenable +amenably +amend +amendable +amended +amending +amendment +amendments +amends +amenities +amenity +amerce +amerced +amercement +amercements +amerces +amercing +americium +amethyst +amethysts +amiability +amiable +amiably +amicability +amicable +amicably +amid +amide +amides +amidship +amidships +amidst +amigo +amigos +amir +amirs +amiss +amity +ammeter +ammeters +ammo +ammonia +ammunition +amnesia +amnesiac +amnesiacs +amnesic +amnesics +amnestied +amnesties +amnesty +amnestying +amnia +amniocenteses +amniocentesis +amnion +amnions +amniotic +amoeba +amoebae +amoebas +amoebic +amok +among +amongst +amontillado +amontillados +amoral +amorality +amorally +amorous +amorously +amorousness +amorphous +amorphously +amorphousness +amortization +amortizations +amortize +amortized +amortizes +amortizing +amount +amounted +amounting +amounts +amour +amours +amperage +ampere +amperes +ampersand +ampersands +amphetamine +amphetamines +amphibian +amphibians +amphibious +amphibiously +amphitheater +amphitheaters +amphitheatre +amphitheatres +amphora +amphorae +amphoras +ample +ampler +amplest +amplification +amplifications +amplified +amplifier +amplifiers +amplifies +amplify +amplifying +amplitude +amplitudes +amply +ampoule +ampoules +amps +ampul +ampule +ampules +ampuls +amputate +amputated +amputates +amputating +amputation +amputations +amputee +amputees +amuck +amulet +amulets +amuse +amused +amusement +amusements +amuses +amusing +amusingly +amylase +anabolism +anachronism +anachronisms +anachronistic +anachronistically +anaconda +anacondas +anaemia +anaemic +anaerobe +anaerobes +anaerobic +anaerobically +anaesthesia +anaesthetic +anaesthetics +anaesthetist +anaesthetists +anaesthetize +anaesthetized +anaesthetizes +anaesthetizing +anagram +anagrams +anal +analgesia +analgesic +analgesics +anally +analog +analogical +analogically +analogies +analogize +analogized +analogizes +analogizing +analogous +analogously +analogousness +analogs +analogue +analogues +analogy +analysand +analysands +analyse +analysed +analyses +analysing +analysis +analyst +analysts +analytic +analytical +analytically +analyzable +analyze +analyzed +analyzer +analyzers +analyzes +analyzing +anapaest +anapaests +anapest +anapestic +anapestics +anapests +anarchic +anarchically +anarchism +anarchist +anarchistic +anarchists +anarchy +anathema +anathemas +anathematize +anathematized +anathematizes +anathematizing +anatomic +anatomical +anatomically +anatomies +anatomist +anatomists +anatomize +anatomized +anatomizes +anatomizing +anatomy +ancestor +ancestors +ancestral +ancestrally +ancestress +ancestresses +ancestries +ancestry +anchor +anchorage +anchorages +anchored +anchoring +anchorite +anchorites +anchorman +anchormen +anchorperson +anchorpersons +anchors +anchorwoman +anchorwomen +anchovies +anchovy +ancient +ancienter +ancientest +anciently +ancientness +ancients +ancillaries +ancillary +andante +andantes +andiron +andirons +androgen +androgenic +androgynous +androgyny +android +androids +anecdota +anecdotal +anecdote +anecdotes +anemia +anemic +anemically +anemometer +anemometers +anemone +anemones +anent +anesthesia +anesthesiologist +anesthesiologists +anesthesiology +anesthetic +anesthetics +anesthetist +anesthetists +anesthetization +anesthetize +anesthetized +anesthetizes +anesthetizing +aneurism +aneurisms +aneurysm +aneurysms +anew +angel +angelfish +angelfishes +angelic +angelica +angelical +angelically +angels +anger +angered +angering +angers +angina +angioplasties +angioplasty +angiosperm +angiosperms +angle +angled +angler +anglers +angles +angleworm +angleworms +anglicize +anglicized +anglicizes +anglicizing +angling +angora +angoras +angrier +angriest +angrily +angry +angst +angstrom +angstroms +anguish +anguished +anguishes +anguishing +angular +angularities +angularity +anhydrous +aniline +animadversion +animadversions +animadvert +animadverted +animadverting +animadverts +animal +animalcule +animalcules +animals +animate +animated +animatedly +animates +animating +animation +animations +animator +animators +animism +animist +animistic +animists +animosities +animosity +animus +anion +anionic +anions +anise +aniseed +anisette +ankh +ankhs +ankle +anklebone +anklebones +ankles +anklet +anklets +annalist +annalists +annals +anneal +annealed +annealing +anneals +annelid +annelids +annex +annexation +annexations +annexe +annexed +annexes +annexing +annihilate +annihilated +annihilates +annihilating +annihilation +annihilator +annihilators +anniversaries +anniversary +annotate +annotated +annotates +annotating +annotation +annotations +annotative +annotator +annotators +announce +announced +announcement +announcements +announcer +announcers +announces +announcing +annoy +annoyance +annoyances +annoyed +annoying +annoyingly +annoys +annual +annually +annuals +annuitant +annuitants +annuities +annuity +annul +annular +annulled +annulling +annulment +annulments +annuls +annunciation +annunciations +anode +anodes +anodize +anodized +anodizes +anodizing +anodyne +anodynes +anoint +anointed +anointing +anointment +anoints +anomalies +anomalous +anomalously +anomaly +anon +anonymity +anonymous +anonymously +anopheles +anorak +anoraks +anorectic +anorectics +anorexia +anorexic +anorexics +another +answer +answerable +answered +answering +answers +antacid +antacids +antagonism +antagonisms +antagonist +antagonistic +antagonistically +antagonists +antagonize +antagonized +antagonizes +antagonizing +antarctic +ante +anteater +anteaters +antebellum +antecedence +antecedent +antecedents +antechamber +antechambers +anted +antedate +antedated +antedates +antedating +antediluvian +anteed +anteing +antelope +antelopes +antenatal +antenna +antennae +antennas +anterior +anteroom +anterooms +antes +anthem +anthems +anther +anthers +anthill +anthills +anthologies +anthologist +anthologists +anthologize +anthologized +anthologizes +anthologizing +anthology +anthracite +anthrax +anthropocentric +anthropoid +anthropoids +anthropological +anthropologically +anthropologist +anthropologists +anthropology +anthropomorphic +anthropomorphically +anthropomorphism +anthropomorphous +anti +antiabortion +antiabortionist +antiabortionists +antiaircraft +antibacterial +antibacterials +antibiotic +antibiotics +antibodies +antibody +antic +anticancer +antichrist +antichrists +anticipate +anticipated +anticipates +anticipating +anticipation +anticipations +anticipatory +anticlerical +anticlimactic +anticlimactically +anticlimax +anticlimaxes +anticline +anticlines +anticlockwise +anticoagulant +anticoagulants +anticommunism +anticommunist +anticommunists +antics +anticyclone +anticyclones +anticyclonic +antidemocratic +antidepressant +antidepressants +antidote +antidotes +antifascist +antifascists +antifreeze +antigen +antigenic +antigenicity +antigens +antihero +antiheroes +antihistamine +antihistamines +antiknock +antilabor +antilogarithm +antilogarithms +antimacassar +antimacassars +antimalarial +antimalarials +antimatter +antimicrobial +antimissile +antimony +antinuclear +antioxidant +antioxidants +antiparticle +antiparticles +antipasti +antipasto +antipastos +antipathetic +antipathies +antipathy +antipersonnel +antiperspirant +antiperspirants +antiphon +antiphonal +antiphonally +antiphonals +antiphons +antipodal +antipodean +antipodeans +antipodes +antipollution +antipoverty +antiquarian +antiquarianism +antiquarians +antiquaries +antiquary +antiquate +antiquated +antiquates +antiquating +antique +antiqued +antiques +antiquing +antiquities +antiquity +antis +antisemitic +antisemitism +antisepsis +antiseptic +antiseptically +antiseptics +antisera +antiserum +antiserums +antislavery +antisocial +antisocially +antispasmodic +antispasmodics +antisubmarine +antitank +antitheses +antithesis +antithetic +antithetical +antithetically +antitoxin +antitoxins +antitrust +antivenin +antivenins +antiviral +antivirals +antivivisectionist +antivivisectionists +antiwar +antler +antlered +antlers +antonym +antonymous +antonyms +ants +antsier +antsiest +antsy +anus +anuses +anvil +anvils +anxieties +anxiety +anxious +anxiously +anxiousness +anybodies +anybody +anyhow +anymore +anyone +anyplace +anything +anytime +anyway +anywhere +anywise +aorta +aortae +aortas +aortic +apace +apart +apartheid +apartment +apartments +apathetic +apathetically +apathy +apatite +aped +apelike +aperitif +aperitifs +aperture +apertures +apes +apex +apexes +aphasia +aphasic +aphasics +aphelia +aphelion +aphelions +aphid +aphids +aphorism +aphorisms +aphoristic +aphoristically +aphrodisiac +aphrodisiacs +apiaries +apiarist +apiarists +apiary +apical +apically +apices +apiece +aping +apish +apishly +aplenty +aplomb +apocalypse +apocalypses +apocalyptic +apocrypha +apocryphal +apocryphally +apogee +apogees +apolitical +apolitically +apologetic +apologetically +apologia +apologias +apologies +apologist +apologists +apologize +apologized +apologizes +apologizing +apology +apoplectic +apoplexies +apoplexy +apostasies +apostasy +apostate +apostates +apostatize +apostatized +apostatizes +apostatizing +apostle +apostles +apostleship +apostolic +apostrophe +apostrophes +apothecaries +apothecary +apothegm +apothegms +apotheoses +apotheosis +appal +appall +appalled +appalling +appallingly +appalls +appaloosa +appaloosas +appals +apparatus +apparatuses +apparel +appareled +appareling +apparelled +apparelling +apparels +apparent +apparently +apparition +apparitions +appeal +appealed +appealing +appealingly +appeals +appear +appearance +appearances +appeared +appearing +appears +appease +appeased +appeasement +appeasements +appeaser +appeasers +appeases +appeasing +appellant +appellants +appellate +appellation +appellations +append +appendage +appendages +appendectomies +appendectomy +appended +appendices +appendicitis +appending +appendix +appendixes +appends +appertain +appertained +appertaining +appertains +appetite +appetites +appetizer +appetizers +appetizing +appetizingly +applaud +applauded +applauder +applauders +applauding +applauds +applause +apple +applejack +apples +applesauce +applet +applets +appliance +appliances +applicability +applicable +applicably +applicant +applicants +application +applications +applicator +applicators +applied +applier +appliers +applies +applique +appliqued +appliqueing +appliques +apply +applying +appoint +appointed +appointee +appointees +appointing +appointive +appointment +appointments +appoints +apportion +apportioned +apportioning +apportionment +apportions +appose +apposed +apposes +apposing +apposite +appositely +appositeness +apposition +appositive +appositives +appraisal +appraisals +appraise +appraised +appraiser +appraisers +appraises +appraising +appreciable +appreciably +appreciate +appreciated +appreciates +appreciating +appreciation +appreciations +appreciative +appreciatively +appreciator +appreciators +appreciatory +apprehend +apprehended +apprehending +apprehends +apprehension +apprehensions +apprehensive +apprehensively +apprehensiveness +apprentice +apprenticed +apprentices +apprenticeship +apprenticeships +apprenticing +apprise +apprised +apprises +apprising +apprize +apprized +apprizes +apprizing +approach +approachable +approached +approaches +approaching +approbation +approbations +appropriate +appropriated +appropriately +appropriateness +appropriates +appropriating +appropriation +appropriations +appropriator +appropriators +approval +approvals +approve +approved +approves +approving +approvingly +approximate +approximated +approximately +approximates +approximating +approximation +approximations +appurtenance +appurtenances +appurtenant +apricot +apricots +apron +aprons +apropos +apse +apses +apter +aptest +aptitude +aptitudes +aptly +aptness +aqua +aquaculture +aquae +aqualung +aqualungs +aquamarine +aquamarines +aquanaut +aquanauts +aquaplane +aquaplaned +aquaplanes +aquaplaning +aquaria +aquarium +aquariums +aquas +aquatic +aquatically +aquatics +aquavit +aqueduct +aqueducts +aqueous +aquiculture +aquifer +aquifers +aquiline +arabesque +arabesques +arability +arable +arachnid +arachnids +arbiter +arbiters +arbitrage +arbitraged +arbitrager +arbitragers +arbitrages +arbitrageur +arbitrageurs +arbitraging +arbitrament +arbitraments +arbitrarily +arbitrariness +arbitrary +arbitrate +arbitrated +arbitrates +arbitrating +arbitration +arbitrator +arbitrators +arbor +arboreal +arboreta +arboretum +arboretums +arbors +arborvitae +arborvitaes +arbour +arbours +arbutus +arbutuses +arcade +arcades +arcane +arced +arch +archaeological +archaeologically +archaeologist +archaeologists +archaeology +archaic +archaically +archaism +archaisms +archaist +archaists +archangel +archangels +archbishop +archbishopric +archbishoprics +archbishops +archdeacon +archdeacons +archdiocesan +archdiocese +archdioceses +archduchess +archduchesses +archduke +archdukes +arched +archenemies +archenemy +archeological +archeologist +archeologists +archeology +archer +archers +archery +arches +archest +archetypal +archetype +archetypes +archetypical +archfiend +archfiends +archiepiscopal +arching +archipelago +archipelagoes +archipelagos +architect +architectonic +architectonics +architects +architectural +architecturally +architecture +architectures +architrave +architraves +archival +archive +archived +archives +archiving +archivist +archivists +archly +archness +archway +archways +arcing +arcked +arcking +arcs +arctic +arctics +ardent +ardently +ardor +ardors +ardour +ardours +arduous +arduously +arduousness +area +areal +areas +arena +arenas +ares +argent +argon +argosies +argosy +argot +argots +arguable +arguably +argue +argued +arguer +arguers +argues +arguing +argument +argumentation +argumentative +argumentatively +argumentativeness +arguments +argyle +argyles +aria +arias +arid +aridity +aridly +aright +arise +arisen +arises +arising +aristocracies +aristocracy +aristocrat +aristocratic +aristocratically +aristocrats +arithmetic +arithmetical +arithmetically +arithmetician +arithmeticians +arks +armada +armadas +armadillo +armadillos +armament +armaments +armature +armatures +armband +armbands +armchair +armchairs +armed +armful +armfuls +armhole +armholes +armies +arming +armistice +armistices +armlet +armlets +armor +armored +armorer +armorers +armorial +armories +armoring +armors +armory +armour +armoured +armouries +armouring +armours +armoury +armpit +armpits +armrest +armrests +arms +armsful +army +aroma +aromas +aromatherapist +aromatherapists +aromatherapy +aromatic +aromatically +aromatics +arose +around +arousal +arouse +aroused +arouses +arousing +arpeggio +arpeggios +arraign +arraigned +arraigning +arraignment +arraignments +arraigns +arrange +arranged +arrangement +arrangements +arranger +arrangers +arranges +arranging +arrant +arras +arrases +array +arrayed +arraying +arrays +arrears +arrest +arrested +arresting +arrests +arrhythmia +arrhythmic +arrhythmical +arrival +arrivals +arrive +arrived +arrives +arriving +arrogance +arrogant +arrogantly +arrogate +arrogated +arrogates +arrogating +arrogation +arrow +arrowhead +arrowheads +arrowroot +arrows +arroyo +arroyos +arsenal +arsenals +arsenic +arson +arsonist +arsonists +artefact +artefacts +arterial +arteries +arteriole +arterioles +arteriosclerosis +artery +artful +artfully +artfulness +arthritic +arthritics +arthritis +arthropod +arthropods +arthroscope +arthroscopes +arthroscopic +artichoke +artichokes +article +articles +articular +articulate +articulated +articulately +articulateness +articulates +articulating +articulation +articulations +artier +artiest +artifact +artifacts +artifice +artificer +artificers +artifices +artificial +artificiality +artificially +artillery +artilleryman +artillerymen +artiness +artisan +artisans +artist +artiste +artistes +artistic +artistically +artistry +artists +artless +artlessly +artlessness +arts +artsier +artsiest +artsy +artwork +artworks +arty +arum +arums +asbestos +ascend +ascendance +ascendancy +ascendant +ascendants +ascended +ascendency +ascendent +ascendents +ascending +ascends +ascension +ascensions +ascent +ascents +ascertain +ascertainable +ascertained +ascertaining +ascertainment +ascertains +ascetic +ascetically +asceticism +ascetics +ascot +ascots +ascribable +ascribe +ascribed +ascribes +ascribing +ascription +aseptic +aseptically +asexual +asexuality +asexually +ashamed +ashamedly +ashcan +ashcans +ashen +ashes +ashier +ashiest +ashlar +ashlars +ashore +ashram +ashrams +ashtray +ashtrays +ashy +aside +asides +asinine +asininely +asininities +asininity +askance +asked +askew +asking +asks +aslant +asleep +asocial +asparagus +aspartame +aspect +aspects +aspen +aspens +asperities +asperity +aspersion +aspersions +asphalt +asphalted +asphalting +asphalts +asphodel +asphodels +asphyxia +asphyxiate +asphyxiated +asphyxiates +asphyxiating +asphyxiation +asphyxiations +aspic +aspics +aspidistra +aspidistras +aspirant +aspirants +aspirate +aspirated +aspirates +aspirating +aspiration +aspirations +aspirator +aspirators +aspire +aspired +aspires +aspirin +aspiring +aspirins +asps +assail +assailable +assailant +assailants +assailed +assailing +assails +assassin +assassinate +assassinated +assassinates +assassinating +assassination +assassinations +assassins +assault +assaulted +assaulting +assaults +assay +assayed +assayer +assayers +assaying +assays +assemblage +assemblages +assemble +assembled +assembler +assemblers +assembles +assemblies +assembling +assembly +assemblyman +assemblymen +assemblywoman +assemblywomen +assent +assented +assenting +assents +assert +asserted +asserting +assertion +assertions +assertive +assertively +assertiveness +asserts +asses +assess +assessed +assesses +assessing +assessment +assessments +assessor +assessors +asset +assets +asseverate +asseverated +asseverates +asseverating +asseveration +asshole +assholes +assiduity +assiduous +assiduously +assiduousness +assign +assignable +assignation +assignations +assigned +assigner +assigners +assigning +assignment +assignments +assignor +assignors +assigns +assimilate +assimilated +assimilates +assimilating +assimilation +assist +assistance +assistant +assistants +assisted +assisting +assists +assize +assizes +associate +associated +associates +associating +association +associations +associative +assonance +assonant +assonants +assort +assorted +assorting +assortment +assortments +assorts +assuage +assuaged +assuages +assuaging +assumable +assume +assumed +assumes +assuming +assumption +assumptions +assumptive +assurance +assurances +assure +assured +assuredly +assureds +assures +assuring +astatine +aster +asterisk +asterisked +asterisking +asterisks +astern +asteroid +asteroids +asters +asthma +asthmatic +asthmatics +astigmatic +astigmatism +astigmatisms +astir +astonish +astonished +astonishes +astonishing +astonishingly +astonishment +astound +astounded +astounding +astoundingly +astounds +astraddle +astrakhan +astral +astray +astride +astringency +astringent +astringently +astringents +astrolabe +astrolabes +astrologer +astrologers +astrological +astrologically +astrologist +astrologists +astrology +astronaut +astronautic +astronautical +astronautics +astronauts +astronomer +astronomers +astronomic +astronomical +astronomically +astronomy +astrophysical +astrophysicist +astrophysicists +astrophysics +astute +astutely +astuteness +astuter +astutest +asunder +asylum +asylums +asymmetric +asymmetrical +asymmetrically +asymmetry +asymptomatic +atavism +atavist +atavistic +atavists +ataxia +ataxic +ataxics +atelier +ateliers +atheism +atheist +atheistic +atheists +atherosclerosis +athirst +athlete +athletes +athletic +athletically +athletics +athwart +atilt +atlas +atlases +atmosphere +atmospheres +atmospheric +atmospherically +atmospherics +atoll +atolls +atom +atomic +atomically +atomize +atomized +atomizer +atomizers +atomizes +atomizing +atoms +atonal +atonality +atonally +atone +atoned +atonement +atones +atoning +atop +atria +atrial +atrium +atriums +atrocious +atrociously +atrociousness +atrocities +atrocity +atrophied +atrophies +atrophy +atrophying +atropine +attach +attachable +attache +attached +attaches +attaching +attachment +attachments +attack +attacked +attacker +attackers +attacking +attacks +attain +attainability +attainable +attainder +attained +attaining +attainment +attainments +attains +attar +attempt +attempted +attempting +attempts +attend +attendance +attendances +attendant +attendants +attended +attendee +attendees +attending +attends +attention +attentions +attentive +attentively +attentiveness +attenuate +attenuated +attenuates +attenuating +attenuation +attest +attestation +attestations +attested +attesting +attests +attic +attics +attire +attired +attires +attiring +attitude +attitudes +attitudinal +attitudinize +attitudinized +attitudinizes +attitudinizing +attorney +attorneys +attract +attractable +attractant +attractants +attracted +attracting +attraction +attractions +attractive +attractively +attractiveness +attracts +attributable +attribute +attributed +attributes +attributing +attribution +attributions +attributive +attributively +attributives +attrition +attune +attuned +attunes +attuning +atwitter +atypical +atypically +auburn +auction +auctioned +auctioneer +auctioneers +auctioning +auctions +audacious +audaciously +audaciousness +audacity +audibility +audible +audibles +audibly +audience +audiences +audio +audiobook +audiobooks +audiological +audiologist +audiologists +audiology +audiometer +audiometers +audiophile +audiophiles +audios +audiotape +audiotapes +audiovisual +audiovisuals +audit +audited +auditing +audition +auditioned +auditioning +auditions +auditor +auditoria +auditorium +auditoriums +auditors +auditory +audits +auger +augers +aught +aughts +augment +augmentation +augmentations +augmentative +augmented +augmenter +augmenters +augmenting +augments +augur +augured +auguries +auguring +augurs +augury +august +auguster +augustest +augustly +augustness +auks +aunt +auntie +aunties +aunts +aunty +aura +aurae +aural +aurally +auras +aureola +aureolas +aureole +aureoles +auricle +auricles +auricular +aurora +aurorae +auroras +auscultate +auscultated +auscultates +auscultating +auscultation +auscultations +auspice +auspices +auspicious +auspiciously +auspiciousness +austere +austerely +austerer +austerest +austerities +austerity +austral +authentic +authentically +authenticate +authenticated +authenticates +authenticating +authentication +authentications +authenticity +author +authored +authoress +authoresses +authoring +authoritarian +authoritarianism +authoritarians +authoritative +authoritatively +authoritativeness +authorities +authority +authorization +authorizations +authorize +authorized +authorizes +authorizing +authors +authorship +autism +autistic +auto +autobahn +autobahns +autobiographer +autobiographers +autobiographic +autobiographical +autobiographically +autobiographies +autobiography +autoclave +autoclaves +autocracies +autocracy +autocrat +autocratic +autocratically +autocrats +autodidact +autodidacts +autograph +autographed +autographing +autographs +autoimmune +autoimmunity +automaker +automakers +automata +automate +automated +automates +automatic +automatically +automatics +automating +automation +automatism +automatize +automatized +automatizes +automatizing +automaton +automatons +automobile +automobiles +automotive +autonomic +autonomous +autonomously +autonomy +autopilot +autopilots +autopsied +autopsies +autopsy +autopsying +autos +autoworker +autoworkers +autumn +autumnal +autumns +auxiliaries +auxiliary +auxin +avail +availability +available +availed +availing +avails +avalanche +avalanches +avarice +avaricious +avariciously +avast +avatar +avatars +avaunt +avenge +avenged +avenger +avengers +avenges +avenging +avenue +avenues +aver +average +averaged +averages +averaging +averred +averring +avers +averse +aversion +aversions +avert +averted +averting +averts +avian +aviaries +aviary +aviation +aviator +aviators +aviatrices +aviatrix +aviatrixes +avid +avidity +avidly +avionic +avionics +avitaminosis +avocado +avocadoes +avocados +avocation +avocational +avocations +avoid +avoidable +avoidably +avoidance +avoided +avoiding +avoids +avoirdupois +avouch +avouched +avouches +avouching +avow +avowal +avowals +avowed +avowedly +avowing +avows +avuncular +await +awaited +awaiting +awaits +awake +awaked +awaken +awakened +awakening +awakenings +awakens +awakes +awaking +award +awarded +awarding +awards +aware +awareness +awash +away +awed +aweigh +awes +awesome +awesomely +awesomeness +awestricken +awestruck +awful +awfuller +awfullest +awfully +awfulness +awhile +awing +awkward +awkwarder +awkwardest +awkwardly +awkwardness +awls +awning +awnings +awns +awoke +awoken +awol +awry +axed +axes +axial +axially +axing +axiom +axiomatic +axiomatically +axioms +axis +axle +axles +axletree +axletrees +axolotl +axolotls +axon +axons +ayah +ayahs +ayatollah +ayatollahs +ayes +azalea +azaleas +azimuth +azimuths +azure +baaed +baaing +baas +babble +babbled +babbler +babblers +babbles +babbling +babe +babel +babels +babes +babied +babier +babies +babiest +baboon +baboons +babushka +babushkas +baby +babyhood +babying +babyish +babysat +babysit +babysits +babysitter +babysitters +babysitting +baccalaureate +baccalaureates +baccarat +bacchanal +bacchanalia +bacchanalian +bacchanalians +bacchanalias +bacchanals +bachelor +bachelorhood +bachelors +bacillary +bacilli +bacillus +back +backache +backaches +backbencher +backbenchers +backbit +backbite +backbiter +backbiters +backbites +backbiting +backbitten +backboard +backboards +backbone +backbones +backbreaking +backdate +backdated +backdates +backdating +backdrop +backdrops +backed +backer +backers +backfield +backfields +backfire +backfired +backfires +backfiring +backgammon +background +backgrounder +backgrounders +backgrounds +backhand +backhanded +backhandedly +backhander +backhanders +backhanding +backhands +backhoe +backhoes +backing +backings +backlash +backlashes +backless +backlog +backlogged +backlogging +backlogs +backpack +backpacked +backpacker +backpackers +backpacking +backpacks +backpedal +backpedaled +backpedaling +backpedalled +backpedalling +backpedals +backrest +backrests +backroom +backs +backscratching +backseat +backseats +backside +backsides +backslapper +backslappers +backslapping +backslash +backslashes +backslid +backslidden +backslide +backslider +backsliders +backslides +backsliding +backspace +backspaced +backspaces +backspacing +backspin +backstabber +backstabbers +backstage +backstair +backstairs +backstop +backstopped +backstopping +backstops +backstretch +backstretches +backstroke +backstroked +backstrokes +backstroking +backtalk +backtrack +backtracked +backtracking +backtracks +backup +backups +backward +backwardly +backwardness +backwards +backwash +backwater +backwaters +backwoods +backwoodsman +backwoodsmen +backyard +backyards +bacon +bacteria +bacterial +bactericidal +bactericide +bactericides +bacteriologic +bacteriological +bacteriologist +bacteriologists +bacteriology +bacterium +badder +baddest +baddie +baddies +baddy +bade +badge +badger +badgered +badgering +badgers +badges +badinage +badlands +badly +badman +badmen +badminton +badmouth +badmouthed +badmouthing +badmouths +badness +baffle +baffled +bafflement +baffler +bafflers +baffles +baffling +bagatelle +bagatelles +bagel +bagels +bagful +bagfuls +baggage +bagged +baggie +baggier +baggies +baggiest +baggily +bagginess +bagging +baggy +bagpipe +bagpiper +bagpipers +bagpipes +bags +bagsful +baguette +baguettes +baht +bahts +bail +bailable +bailed +bailiff +bailiffs +bailing +bailiwick +bailiwicks +bailout +bailouts +bails +bailsman +bailsmen +bairn +bairns +bait +baited +baiting +baits +baize +bake +baked +baker +bakeries +bakers +bakery +bakes +bakeshop +bakeshops +baking +baklava +baksheesh +balaclava +balaclavas +balalaika +balalaikas +balance +balanced +balances +balancing +balboa +balboas +balconies +balcony +bald +balded +balder +balderdash +baldest +baldfaced +balding +baldly +baldness +baldric +baldrics +balds +bale +baled +baleen +baleful +balefully +balefulness +baler +balers +bales +baling +balk +balked +balkier +balkiest +balking +balks +balky +ball +ballad +balladeer +balladeers +balladry +ballads +ballast +ballasted +ballasting +ballasts +ballcock +ballcocks +balled +ballerina +ballerinas +ballet +balletic +ballets +ballgame +ballgames +balling +ballistic +ballistics +balloon +ballooned +ballooning +balloonist +balloonists +balloons +ballot +balloted +balloting +ballots +ballpark +ballparks +ballplayer +ballplayers +ballpoint +ballpoints +ballroom +ballrooms +balls +ballsier +ballsiest +ballsy +ballyhoo +ballyhooed +ballyhooing +ballyhoos +balm +balmier +balmiest +balminess +balms +balmy +baloney +balsa +balsam +balsamic +balsams +balsas +baluster +balusters +balustrade +balustrades +bamboo +bamboos +bamboozle +bamboozled +bamboozles +bamboozling +banal +banalities +banality +banally +banana +bananas +band +bandage +bandaged +bandages +bandaging +bandana +bandanas +bandanna +bandannas +bandbox +bandboxes +bandeau +bandeaux +banded +bandied +bandier +bandies +bandiest +banding +bandit +banditry +bandits +banditti +bandmaster +bandmasters +bandoleer +bandoleers +bandolier +bandoliers +bands +bandsman +bandsmen +bandstand +bandstands +bandwagon +bandwagons +bandy +bandying +bane +baneful +banes +bang +banged +banging +bangle +bangles +bangs +bani +banish +banished +banishes +banishing +banishment +banister +banisters +banjo +banjoes +banjoist +banjoists +banjos +bank +bankable +bankbook +bankbooks +bankcard +bankcards +banked +banker +bankers +banking +banknote +banknotes +bankroll +bankrolled +bankrolling +bankrolls +bankrupt +bankruptcies +bankruptcy +bankrupted +bankrupting +bankrupts +banks +banned +banner +banners +banning +bannister +bannisters +bannock +bannocks +banns +banquet +banqueted +banqueter +banqueters +banqueting +banquets +banquette +banquettes +bans +banshee +banshees +banshie +banshies +bantam +bantams +bantamweight +bantamweights +banter +bantered +bantering +banteringly +banters +banyan +banyans +banzai +banzais +baobab +baobabs +baptism +baptismal +baptisms +baptisteries +baptistery +baptistries +baptistry +baptize +baptized +baptizer +baptizers +baptizes +baptizing +barb +barbarian +barbarianism +barbarianisms +barbarians +barbaric +barbarically +barbarism +barbarisms +barbarities +barbarity +barbarize +barbarized +barbarizes +barbarizing +barbarous +barbarously +barbecue +barbecued +barbecues +barbecuing +barbed +barbel +barbell +barbells +barbels +barbeque +barbequed +barbeques +barbequing +barber +barbered +barbering +barberries +barberry +barbers +barbershop +barbershops +barbing +barbiturate +barbiturates +barbs +barbwire +barcarole +barcaroles +barcarolle +barcarolles +bard +bardic +bards +bare +bareback +barebacked +bared +barefaced +barefacedly +barefoot +barefooted +barehanded +bareheaded +barelegged +barely +bareness +barer +bares +barest +barf +barfed +barfing +barflies +barfly +barfs +bargain +bargained +bargainer +bargainers +bargaining +bargains +barge +barged +bargeman +bargemen +barges +barging +barhop +barhopped +barhopping +barhops +baring +baritone +baritones +barium +bark +barked +barkeep +barkeeper +barkeepers +barkeeps +barker +barkers +barking +barks +barley +barmaid +barmaids +barman +barmen +barn +barnacle +barnacled +barnacles +barns +barnstorm +barnstormed +barnstormer +barnstormers +barnstorming +barnstorms +barnyard +barnyards +barometer +barometers +barometric +barometrically +baron +baronage +baronages +baroness +baronesses +baronet +baronetcies +baronetcy +baronets +baronial +baronies +barons +barony +baroque +barque +barques +barrack +barracked +barracking +barracks +barracuda +barracudas +barrage +barraged +barrages +barraging +barre +barred +barrel +barreled +barreling +barrelled +barrelling +barrels +barren +barrener +barrenest +barrenness +barrens +barres +barrette +barrettes +barricade +barricaded +barricades +barricading +barrier +barriers +barring +barrio +barrios +barrister +barristers +barroom +barrooms +barrow +barrows +bars +bartender +bartenders +barter +bartered +barterer +barterers +bartering +barters +baryon +baryons +basal +basally +basalt +basaltic +base +baseball +baseballs +baseboard +baseboards +based +baseless +baseline +baselines +basely +baseman +basemen +basement +basements +baseness +baser +bases +basest +bash +bashed +bashes +bashful +bashfully +bashfulness +bashing +basic +basically +basics +basil +basilica +basilicas +basilisk +basilisks +basin +basinful +basinfuls +basing +basins +basis +bask +basked +basket +basketball +basketballs +basketry +baskets +basketwork +basking +basks +bass +basses +basset +bassets +bassi +bassinet +bassinets +bassist +bassists +basso +bassoon +bassoonist +bassoonists +bassoons +bassos +basswood +basswoods +bast +bastard +bastardization +bastardizations +bastardize +bastardized +bastardizes +bastardizing +bastards +bastardy +baste +basted +baster +basters +bastes +basting +bastion +bastions +batch +batched +batches +batching +bate +bated +bates +bath +bathe +bathed +bather +bathers +bathes +bathetic +bathhouse +bathhouses +bathing +bathmat +bathmats +bathos +bathrobe +bathrobes +bathroom +bathrooms +baths +bathtub +bathtubs +bathyscaph +bathyscaphe +bathyscaphes +bathyscaphs +bathysphere +bathyspheres +batik +batiks +bating +batiste +batman +batmen +baton +batons +bats +batsman +batsmen +battalion +battalions +batted +batten +battened +battening +battens +batter +battered +batterer +batterers +batteries +battering +batters +battery +battier +battiest +batting +battle +battleax +battleaxe +battleaxes +battled +battledore +battledores +battlefield +battlefields +battlefront +battlefronts +battleground +battlegrounds +battlement +battlements +battler +battlers +battles +battleship +battleships +battling +batty +bauble +baubles +baud +bauds +baulk +baulked +baulking +baulks +bauxite +bawd +bawdier +bawdiest +bawdily +bawdiness +bawds +bawdy +bawl +bawled +bawling +bawls +bayberries +bayberry +bayed +baying +bayonet +bayoneted +bayoneting +bayonets +bayonetted +bayonetting +bayou +bayous +bays +bazaar +bazaars +bazooka +bazookas +beach +beachcomber +beachcombers +beached +beaches +beachhead +beachheads +beaching +beachwear +beacon +beacons +bead +beaded +beadier +beadiest +beading +beadle +beadles +beads +beady +beagle +beagles +beak +beaked +beaker +beakers +beaks +beam +beamed +beaming +beams +bean +beanbag +beanbags +beaned +beanie +beanies +beaning +beanpole +beanpoles +beans +beanstalk +beanstalks +bear +bearable +bearably +beard +bearded +bearding +beardless +beards +bearer +bearers +bearing +bearings +bearish +bearishly +bearishness +bearlike +bears +bearskin +bearskins +beast +beastlier +beastliest +beastliness +beastly +beasts +beat +beatable +beaten +beater +beaters +beatific +beatifically +beatification +beatifications +beatified +beatifies +beatify +beatifying +beating +beatings +beatitude +beatitudes +beatnik +beatniks +beats +beau +beaus +beaut +beauteous +beauteously +beautician +beauticians +beauties +beautification +beautified +beautifier +beautifiers +beautifies +beautiful +beautifully +beautify +beautifying +beauts +beauty +beaux +beaver +beavered +beavering +beavers +bebop +becalm +becalmed +becalming +becalms +became +because +beck +beckon +beckoned +beckoning +beckons +becks +becloud +beclouded +beclouding +beclouds +become +becomes +becoming +becomingly +bedaub +bedaubed +bedaubing +bedaubs +bedazzle +bedazzled +bedazzlement +bedazzles +bedazzling +bedbug +bedbugs +bedclothes +bedded +bedding +bedeck +bedecked +bedecking +bedecks +bedevil +bedeviled +bedeviling +bedevilled +bedevilling +bedevilment +bedevils +bedfellow +bedfellows +bedim +bedimmed +bedimming +bedims +bedizen +bedizened +bedizening +bedizens +bedlam +bedlams +bedpan +bedpans +bedpost +bedposts +bedraggle +bedraggled +bedraggles +bedraggling +bedridden +bedrock +bedrocks +bedroll +bedrolls +bedroom +bedrooms +beds +bedside +bedsides +bedsore +bedsores +bedspread +bedspreads +bedstead +bedsteads +bedtime +bedtimes +beebread +beech +beeches +beechnut +beechnuts +beef +beefburger +beefburgers +beefcake +beefcakes +beefed +beefier +beefiest +beefiness +beefing +beefs +beefsteak +beefsteaks +beefy +beehive +beehives +beekeeper +beekeepers +beekeeping +beeline +beelines +been +beep +beeped +beeper +beepers +beeping +beeps +beer +beerier +beeriest +beers +beery +bees +beeswax +beet +beetle +beetled +beetles +beetling +beets +beeves +befall +befallen +befalling +befalls +befell +befit +befits +befitted +befitting +befittingly +befog +befogged +befogging +befogs +before +beforehand +befoul +befouled +befouling +befouls +befriend +befriended +befriending +befriends +befuddle +befuddled +befuddlement +befuddles +befuddling +began +begat +beget +begets +begetting +beggar +beggared +beggaring +beggarly +beggars +beggary +begged +begging +begin +beginner +beginners +beginning +beginnings +begins +begone +begonia +begonias +begot +begotten +begrime +begrimed +begrimes +begriming +begrudge +begrudged +begrudges +begrudging +begrudgingly +begs +beguile +beguiled +beguilement +beguiler +beguilers +beguiles +beguiling +beguilingly +beguine +beguines +begum +begums +begun +behalf +behalves +behave +behaved +behaves +behaving +behavior +behavioral +behaviorally +behaviorism +behaviorist +behaviorists +behaviour +behead +beheaded +beheading +beheads +beheld +behemoth +behemoths +behest +behests +behind +behindhand +behinds +behold +beholden +beholder +beholders +beholding +beholds +behoove +behooved +behooves +behooving +beige +being +beings +bejewel +bejeweled +bejeweling +bejewelled +bejewelling +bejewels +belabor +belabored +belaboring +belabors +belabour +belaboured +belabouring +belabours +belated +belatedly +belay +belayed +belaying +belays +belch +belched +belches +belching +beleaguer +beleaguered +beleaguering +beleaguers +belfries +belfry +belie +belied +belief +beliefs +belies +believable +believably +believe +believed +believer +believers +believes +believing +belittle +belittled +belittlement +belittles +belittling +bell +belladonna +bellboy +bellboys +belle +belled +belles +belletrist +belletristic +belletrists +bellhop +bellhops +bellicose +bellicosity +bellied +bellies +belligerence +belligerency +belligerent +belligerently +belligerents +belling +bellman +bellmen +bellow +bellowed +bellowing +bellows +bells +bellwether +bellwethers +belly +bellyache +bellyached +bellyaches +bellyaching +bellybutton +bellybuttons +bellyful +bellyfuls +bellying +belong +belonged +belonging +belongings +belongs +beloved +beloveds +below +belt +belted +belting +belts +beltway +beltways +beluga +belugas +belying +bemire +bemired +bemires +bemiring +bemoan +bemoaned +bemoaning +bemoans +bemuse +bemused +bemusedly +bemusement +bemuses +bemusing +bench +benched +benches +benching +benchmark +benchmarks +bend +bendable +bender +benders +bending +bends +beneath +benediction +benedictions +benedictory +benefaction +benefactions +benefactor +benefactors +benefactress +benefactresses +benefice +beneficence +beneficent +beneficently +benefices +beneficial +beneficially +beneficiaries +beneficiary +benefit +benefited +benefiting +benefits +benefitted +benefitting +benevolence +benevolences +benevolent +benevolently +benighted +benightedly +benign +benignant +benigner +benignest +benignity +benignly +bent +bents +bentwood +benumb +benumbed +benumbing +benumbs +benzene +benzine +bequeath +bequeathed +bequeathing +bequeaths +bequest +bequests +berate +berated +berates +berating +bereave +bereaved +bereavement +bereavements +bereaves +bereaving +bereft +beret +berets +berg +bergs +beriberi +berkelium +berm +berms +berried +berries +berry +berrying +berrylike +berserk +berth +berthed +berthing +berths +beryl +beryllium +beryls +beseech +beseeched +beseecher +beseechers +beseeches +beseeching +beseechingly +beseem +beseemed +beseeming +beseems +beset +besets +besetting +beside +besides +besiege +besieged +besieger +besiegers +besieges +besieging +besmear +besmeared +besmearing +besmears +besmirch +besmirched +besmirches +besmirching +besom +besoms +besot +besots +besotted +besotting +besought +bespangle +bespangled +bespangles +bespangling +bespatter +bespattered +bespattering +bespatters +bespeak +bespeaking +bespeaks +bespectacled +bespoke +bespoken +best +bested +bestial +bestiality +bestially +bestiaries +bestiary +besting +bestir +bestirred +bestirring +bestirs +bestow +bestowal +bestowals +bestowed +bestowing +bestows +bestrew +bestrewed +bestrewing +bestrewn +bestrews +bestrid +bestridden +bestride +bestrides +bestriding +bestrode +bests +bestseller +bestsellers +beta +betake +betaken +betakes +betaking +betas +betcha +betel +bethink +bethinking +bethinks +bethought +betide +betided +betides +betiding +betimes +betoken +betokened +betokening +betokens +betook +betray +betrayal +betrayals +betrayed +betrayer +betrayers +betraying +betrays +betroth +betrothal +betrothals +betrothed +betrothing +betroths +bets +betted +better +bettered +bettering +betterment +betters +betting +bettor +bettors +between +betwixt +bevel +beveled +beveling +bevelled +bevelling +bevels +beverage +beverages +bevies +bevy +bewail +bewailed +bewailing +bewails +beware +bewared +bewares +bewaring +bewhiskered +bewigged +bewilder +bewildered +bewildering +bewilderingly +bewilderment +bewilders +bewitch +bewitched +bewitches +bewitching +bewitchingly +bewitchment +beyond +beys +bezel +bezels +biannual +biannually +bias +biased +biases +biasing +biassed +biassing +biathlon +biathlons +bible +bibles +biblical +bibliographer +bibliographers +bibliographic +bibliographical +bibliographically +bibliographies +bibliography +bibliophile +bibliophiles +bibs +bibulous +bicameral +bicameralism +bicarb +bicarbonate +bicarbonates +bicarbs +bicentenaries +bicentenary +bicentennial +bicentennials +bicep +biceps +bicepses +bicker +bickered +bickerer +bickerers +bickering +bickers +biconcave +biconvex +bicuspid +bicuspids +bicycle +bicycled +bicycler +bicyclers +bicycles +bicycling +bicyclist +bicyclists +biddable +bidden +bidder +bidders +biddies +bidding +biddy +bide +bided +bides +bidet +bidets +biding +bidirectional +bidirectionally +bids +biennia +biennial +biennially +biennials +biennium +bienniums +bier +biers +bifocal +bifocals +bifurcate +bifurcated +bifurcates +bifurcating +bifurcation +bifurcations +bigamist +bigamists +bigamous +bigamy +bigger +biggest +biggie +biggies +biggish +bighead +bigheads +bighearted +bigheartedness +bighorn +bighorns +bight +bights +bigmouth +bigmouths +bigness +bigot +bigoted +bigotries +bigotry +bigots +bigwig +bigwigs +bijou +bijoux +bike +biked +biker +bikers +bikes +biking +bikini +bikinis +bilabial +bilabials +bilateral +bilaterally +bile +bilge +bilges +bilingual +bilingualism +bilingually +bilinguals +bilious +biliousness +bilk +bilked +bilker +bilkers +bilking +bilks +bill +billable +billboard +billboards +billed +billet +billeted +billeting +billets +billfold +billfolds +billiard +billiards +billies +billing +billings +billingsgate +billion +billionaire +billionaires +billions +billionth +billionths +billow +billowed +billowing +billows +billowy +bills +billy +bimbo +bimboes +bimbos +bimetallic +bimetallics +bimetallism +bimonthlies +bimonthly +binaries +binary +bind +binder +binderies +binders +bindery +binding +bindings +binds +bindweed +binge +binged +bingeing +binges +binging +bingo +binnacle +binnacles +binned +binning +binocular +binoculars +binomial +binomials +bins +biochemical +biochemically +biochemicals +biochemist +biochemistry +biochemists +biodegradability +biodegradable +biodegrade +biodegraded +biodegrades +biodegrading +biodiversity +bioethics +biofeedback +biographer +biographers +biographic +biographical +biographically +biographies +biography +biologic +biological +biologically +biologist +biologists +biology +biomass +bionic +bionically +bionics +biophysical +biophysicist +biophysicists +biophysics +biopic +biopics +biopsied +biopsies +biopsy +biopsying +biorhythm +biorhythms +bios +biosphere +biospheres +biotechnological +biotechnology +biotin +bipartisan +bipartisanship +bipartite +biped +bipedal +bipeds +biplane +biplanes +bipolar +bipolarity +biracial +birch +birched +birches +birching +bird +birdbath +birdbaths +birdbrain +birdbrained +birdbrains +birded +birder +birders +birdhouse +birdhouses +birdie +birdied +birdieing +birdies +birding +birdlime +birds +birdseed +birdwatcher +birdwatchers +biretta +birettas +birth +birthday +birthdays +birthed +birthing +birthmark +birthmarks +birthplace +birthplaces +birthrate +birthrates +birthright +birthrights +births +birthstone +birthstones +biscuit +biscuits +bisect +bisected +bisecting +bisection +bisections +bisector +bisectors +bisects +bisexual +bisexuality +bisexually +bisexuals +bishop +bishopric +bishoprics +bishops +bismuth +bison +bisons +bisque +bistro +bistros +bitch +bitched +bitches +bitchier +bitchiest +bitchily +bitchiness +bitching +bitchy +bite +biter +biters +bites +biting +bitingly +bits +bitten +bitter +bitterer +bitterest +bitterly +bittern +bitterness +bitterns +bitters +bittersweet +bittersweets +bittier +bittiest +bitty +bitumen +bituminous +bivalent +bivalve +bivalves +bivouac +bivouacked +bivouacking +bivouacs +biweeklies +biweekly +biyearly +bizarre +bizarrely +blab +blabbed +blabber +blabbered +blabbering +blabbermouth +blabbermouths +blabbers +blabbing +blabs +black +blackamoor +blackamoors +blackball +blackballed +blackballing +blackballs +blackberries +blackberry +blackbird +blackbirds +blackboard +blackboards +blacked +blacken +blackened +blackening +blackens +blacker +blackest +blackguard +blackguards +blackhead +blackheads +blacking +blackish +blackjack +blackjacked +blackjacking +blackjacks +blacklist +blacklisted +blacklisting +blacklists +blackly +blackmail +blackmailed +blackmailer +blackmailers +blackmailing +blackmails +blackness +blackout +blackouts +blacks +blacksmith +blacksmiths +blacksnake +blacksnakes +blackthorn +blackthorns +blacktop +blacktopped +blacktopping +blacktops +bladder +bladders +blade +bladed +blades +blah +blahs +blamable +blame +blameable +blamed +blameless +blamelessly +blamelessness +blames +blameworthiness +blameworthy +blaming +blanch +blanched +blanches +blanching +blancmange +blancmanges +bland +blander +blandest +blandish +blandished +blandishes +blandishing +blandishment +blandishments +blandly +blandness +blank +blanked +blanker +blankest +blanket +blanketed +blanketing +blankets +blanking +blankly +blankness +blanks +blare +blared +blares +blaring +blarney +blarneyed +blarneying +blarneys +blase +blaspheme +blasphemed +blasphemer +blasphemers +blasphemes +blasphemies +blaspheming +blasphemous +blasphemously +blasphemy +blast +blasted +blaster +blasters +blasting +blastoff +blastoffs +blasts +blatancies +blatancy +blatant +blatantly +blather +blathered +blathering +blathers +blaze +blazed +blazer +blazers +blazes +blazing +blazon +blazoned +blazoning +blazons +bleach +bleached +bleacher +bleachers +bleaches +bleaching +bleak +bleaker +bleakest +bleakly +bleakness +blear +blearier +bleariest +blearily +bleariness +bleary +bleat +bleated +bleating +bleats +bled +bleed +bleeder +bleeders +bleeding +bleeds +bleep +bleeped +bleeper +bleepers +bleeping +bleeps +blemish +blemished +blemishes +blemishing +blench +blenched +blenches +blenching +blend +blended +blender +blenders +blending +blends +blent +bless +blessed +blessedly +blessedness +blesses +blessing +blessings +blest +blew +blight +blighted +blighting +blights +blimey +blimp +blimps +blind +blinded +blinder +blinders +blindest +blindfold +blindfolded +blindfolding +blindfolds +blinding +blindingly +blindly +blindness +blinds +blindside +blindsided +blindsides +blindsiding +blini +blinis +blink +blinked +blinker +blinkered +blinkering +blinkers +blinking +blinks +blintz +blintze +blintzes +blip +blips +bliss +blissful +blissfully +blissfulness +blister +blistered +blistering +blisteringly +blisters +blistery +blithe +blithely +blitheness +blither +blithering +blithesome +blithest +blitz +blitzed +blitzes +blitzing +blitzkrieg +blitzkriegs +blizzard +blizzards +bloat +bloated +bloating +bloats +blob +blobbed +blobbing +blobs +bloc +block +blockade +blockaded +blockader +blockaders +blockades +blockading +blockage +blockages +blockbuster +blockbusters +blockbusting +blocked +blocker +blockers +blockhead +blockheads +blockhouse +blockhouses +blocking +blocks +blocs +bloke +blokes +blond +blonde +blonder +blondes +blondest +blondish +blondness +blonds +blood +bloodbath +bloodbaths +bloodcurdling +blooded +bloodhound +bloodhounds +bloodied +bloodier +bloodies +bloodiest +bloodiness +blooding +bloodless +bloodlessly +bloodlessness +bloodletting +bloodline +bloodlines +bloodmobile +bloodmobiles +bloods +bloodshed +bloodshot +bloodstain +bloodstained +bloodstains +bloodstock +bloodstream +bloodstreams +bloodsucker +bloodsuckers +bloodsucking +bloodthirstier +bloodthirstiest +bloodthirstily +bloodthirstiness +bloodthirsty +bloody +bloodying +bloom +bloomed +bloomer +bloomers +blooming +blooms +bloop +blooped +blooper +bloopers +blooping +bloops +blossom +blossomed +blossoming +blossoms +blossomy +blot +blotch +blotched +blotches +blotchier +blotchiest +blotching +blotchy +blots +blotted +blotter +blotters +blotting +blotto +blouse +bloused +blouses +blousing +blow +blower +blowers +blowflies +blowfly +blowgun +blowguns +blowhard +blowhards +blowier +blowiest +blowing +blown +blowout +blowouts +blowpipe +blowpipes +blows +blowsier +blowsiest +blowsy +blowtorch +blowtorched +blowtorches +blowtorching +blowup +blowups +blowy +blowzier +blowziest +blowzy +blubber +blubbered +blubbering +blubbers +blubbery +bludgeon +bludgeoned +bludgeoning +bludgeons +blue +bluebell +bluebells +blueberries +blueberry +bluebird +bluebirds +bluebonnet +bluebonnets +bluebottle +bluebottles +blued +bluefish +bluefishes +bluegill +bluegills +bluegrass +blueing +blueish +bluejacket +bluejackets +bluejay +bluejays +bluejeans +blueness +bluenose +bluenoses +bluepoint +bluepoints +blueprint +blueprinted +blueprinting +blueprints +bluer +blues +bluesier +bluesiest +bluest +bluestocking +bluestockings +bluesy +bluet +bluets +bluff +bluffed +bluffer +bluffers +bluffest +bluffing +bluffly +bluffness +bluffs +bluing +bluish +blunder +blunderbuss +blunderbusses +blundered +blunderer +blunderers +blundering +blunders +blunt +blunted +blunter +bluntest +blunting +bluntly +bluntness +blunts +blur +blurb +blurbs +blurred +blurrier +blurriest +blurriness +blurring +blurry +blurs +blurt +blurted +blurting +blurts +blush +blushed +blusher +blushers +blushes +blushing +bluster +blustered +blusterer +blusterers +blustering +blusterous +blusters +blustery +boar +board +boarded +boarder +boarders +boarding +boardinghouse +boardinghouses +boardroom +boardrooms +boards +boardwalk +boardwalks +boars +boas +boast +boasted +boaster +boasters +boastful +boastfully +boastfulness +boasting +boasts +boat +boated +boater +boaters +boathouse +boathouses +boating +boatman +boatmen +boats +boatswain +boatswains +bobbed +bobbies +bobbin +bobbing +bobbins +bobble +bobbled +bobbles +bobbling +bobby +bobbysoxer +bobbysoxers +bobcat +bobcats +bobolink +bobolinks +bobs +bobsled +bobsledded +bobsledder +bobsledders +bobsledding +bobsleds +bobsleigh +bobsleighed +bobsleighing +bobsleighs +bobtail +bobtails +bobwhite +bobwhites +bocce +bocci +boccie +bock +bodacious +bode +boded +bodega +bodegas +bodes +bodice +bodices +bodied +bodies +bodily +boding +bodkin +bodkins +bods +body +bodybuilder +bodybuilders +bodybuilding +bodyguard +bodyguards +bodysuit +bodysuits +bodywork +boffo +bogey +bogeyed +bogeying +bogeyman +bogeymen +bogeys +bogged +boggier +boggiest +bogging +boggle +boggled +boggles +boggling +boggy +bogie +bogied +bogieing +bogies +bogs +bogus +bogy +bogyman +bogymen +bohemian +bohemianism +bohemians +boil +boiled +boiler +boilermaker +boilermakers +boilerplate +boilers +boiling +boils +boisterous +boisterously +boisterousness +bola +bolas +bold +bolder +boldest +boldface +boldfaced +boldly +boldness +bole +bolero +boleros +boles +bolivar +bolivares +bolivars +boll +bollix +bollixed +bollixes +bollixing +bolls +bologna +boloney +bolshevik +bolsheviki +bolsheviks +bolster +bolstered +bolstering +bolsters +bolt +bolted +bolting +bolts +bolus +boluses +bomb +bombard +bombarded +bombardier +bombardiers +bombarding +bombardment +bombardments +bombards +bombast +bombastic +bombastically +bombed +bomber +bombers +bombing +bombproof +bombproofed +bombproofing +bombproofs +bombs +bombshell +bombshells +bonanza +bonanzas +bonbon +bonbons +bond +bondage +bonded +bondholder +bondholders +bonding +bondman +bondmen +bonds +bondsman +bondsmen +bondwoman +bondwomen +bone +boned +bonehead +boneheaded +boneheads +boneless +boner +boners +bones +boney +boneyer +boneyest +bonfire +bonfires +bong +bonged +bonging +bongo +bongoes +bongos +bongs +bonhomie +bonier +boniest +boniness +boning +bonito +bonitoes +bonitos +bonkers +bonnet +bonnets +bonnie +bonnier +bonniest +bonny +bonsai +bonus +bonuses +bony +boob +boobed +boobies +boobing +booboo +booboos +boobs +booby +boodle +boodles +booed +boogeyman +boogeymen +boogie +boogied +boogieing +boogieman +boogiemen +boogies +boohoo +boohooed +boohooing +boohoos +booing +book +bookbinder +bookbinderies +bookbinders +bookbindery +bookbinding +bookcase +bookcases +booked +bookend +bookended +bookending +bookends +bookie +bookies +booking +bookings +bookish +bookkeeper +bookkeepers +bookkeeping +booklet +booklets +bookmaker +bookmakers +bookmaking +bookmark +bookmarked +bookmarking +bookmarks +bookmobile +bookmobiles +bookplate +bookplates +books +bookseller +booksellers +bookshelf +bookshelves +bookshop +bookshops +bookstore +bookstores +bookworm +bookworms +boom +boombox +boomboxes +boomed +boomerang +boomeranged +boomeranging +boomerangs +booming +booms +boon +boondocks +boondoggle +boondoggled +boondoggler +boondogglers +boondoggles +boondoggling +boonies +boons +boor +boorish +boorishly +boorishness +boorishnesses +boors +boos +boost +boosted +booster +boosters +boosting +boosts +boot +bootblack +bootblacks +booted +bootee +bootees +booth +booths +bootie +booties +booting +bootleg +bootlegged +bootlegger +bootleggers +bootlegging +bootlegs +bootless +boots +bootstrap +bootstrapped +bootstrapping +bootstraps +booty +booze +boozed +boozer +boozers +boozes +boozier +booziest +boozing +boozy +bopped +bopping +bops +borax +bordello +bordellos +border +bordered +bordering +borderland +borderlands +borderline +borderlines +borders +bore +bored +boredom +borer +borers +bores +boring +born +borne +boron +borough +boroughs +borrow +borrowed +borrower +borrowers +borrowing +borrowings +borrows +borsch +borscht +borzoi +borzois +bosh +bosom +bosoms +bosomy +boss +bossed +bosses +bossier +bossiest +bossily +bossiness +bossing +bossism +bossy +bosun +bosuns +botanic +botanical +botanically +botanist +botanists +botany +botch +botched +botcher +botchers +botches +botching +both +bother +bothered +bothering +bothers +bothersome +bottle +bottled +bottleneck +bottlenecks +bottler +bottlers +bottles +bottling +bottom +bottomed +bottoming +bottomless +bottoms +botulism +boudoir +boudoirs +bouffant +bouffants +bougainvillea +bougainvilleas +bough +boughs +bought +bouillabaisse +bouillabaisses +bouillon +bouillons +boulder +boulders +boulevard +boulevards +bounce +bounced +bouncer +bouncers +bounces +bouncier +bounciest +bouncily +bounciness +bouncing +bouncy +bound +boundaries +boundary +bounded +bounden +bounder +bounders +bounding +boundless +boundlessly +boundlessness +bounds +bounteous +bounteously +bounteousness +bounties +bountiful +bountifully +bountifulness +bounty +bouquet +bouquets +bourbon +bourgeois +bourgeoisie +bout +boutique +boutiques +boutonniere +boutonnieres +bouts +bouzouki +bouzoukis +bovine +bovines +bowdlerization +bowdlerizations +bowdlerize +bowdlerized +bowdlerizes +bowdlerizing +bowed +bowel +bowels +bower +bowers +bowing +bowl +bowlder +bowlders +bowled +bowleg +bowlegged +bowlegs +bowler +bowlers +bowlful +bowlfuls +bowline +bowlines +bowling +bowls +bowman +bowmen +bows +bowsprit +bowsprits +bowstring +bowstrings +bowwow +bowwows +boxcar +boxcars +boxed +boxer +boxers +boxes +boxier +boxiest +boxing +boxlike +boxwood +boxy +boycott +boycotted +boycotting +boycotts +boyfriend +boyfriends +boyhood +boyhoods +boyish +boyishly +boyishness +boys +boysenberries +boysenberry +bozo +bozos +brace +braced +bracelet +bracelets +bracer +bracero +braceros +bracers +braces +bracing +bracken +bracket +bracketed +bracketing +brackets +brackish +brackishness +bract +bracts +brad +brads +brae +braes +brag +braggadocio +braggadocios +braggart +braggarts +bragged +bragger +braggers +bragging +brags +braid +braided +braiding +braids +braille +brain +brainchild +brainchildren +brained +brainier +brainiest +braininess +braining +brainless +brainlessly +brains +brainstorm +brainstormed +brainstorming +brainstorms +brainteaser +brainteasers +brainwash +brainwashed +brainwashes +brainwashing +brainy +braise +braised +braises +braising +brake +braked +brakeman +brakemen +brakes +braking +bramble +brambles +bramblier +brambliest +brambly +bran +branch +branched +branches +branching +branchlike +brand +branded +brander +branders +brandied +brandies +branding +brandish +brandished +brandishes +brandishing +brands +brandy +brandying +bras +brash +brasher +brashest +brashly +brashness +brass +brasserie +brasseries +brasses +brassier +brassiere +brassieres +brassiest +brassily +brassiness +brassy +brat +brats +brattier +brattiest +bratty +bratwurst +bratwursts +bravado +brave +braved +bravely +braveness +braver +bravery +braves +bravest +braving +bravo +bravos +bravura +bravuras +brawl +brawled +brawler +brawlers +brawling +brawls +brawn +brawnier +brawniest +brawniness +brawny +bray +brayed +braying +brays +braze +brazed +brazen +brazened +brazening +brazenly +brazenness +brazens +brazer +brazers +brazes +brazier +braziers +brazing +breach +breached +breaches +breaching +bread +breadbasket +breadbaskets +breadboard +breadboards +breadbox +breadboxes +breadcrumb +breadcrumbs +breaded +breadfruit +breadfruits +breading +breadline +breadlines +breads +breadth +breadths +breadwinner +breadwinners +break +breakable +breakables +breakage +breakages +breakaway +breakaways +breakdown +breakdowns +breaker +breakers +breakeven +breakfast +breakfasted +breakfasting +breakfasts +breakfront +breakfronts +breaking +breakneck +breakout +breakouts +breaks +breakthrough +breakthroughs +breakup +breakups +breakwater +breakwaters +bream +breams +breast +breastbone +breastbones +breasted +breasting +breastplate +breastplates +breasts +breaststroke +breaststrokes +breastwork +breastworks +breath +breathable +breathalyze +breathalyzed +breathalyzes +breathalyzing +breathe +breathed +breather +breathers +breathes +breathier +breathiest +breathing +breathless +breathlessly +breathlessness +breaths +breathtaking +breathtakingly +breathy +bred +breech +breeches +breed +breeder +breeders +breeding +breeds +breeze +breezed +breezes +breezeway +breezeways +breezier +breeziest +breezily +breeziness +breezing +breezy +brethren +breve +breves +brevet +breveted +breveting +brevets +brevetted +brevetting +breviaries +breviary +brevity +brew +brewed +brewer +breweries +brewers +brewery +brewing +brewpub +brewpubs +brews +briar +briars +bribe +bribed +briber +bribers +bribery +bribes +bribing +brick +brickbat +brickbats +bricked +bricking +bricklayer +bricklayers +bricklaying +bricks +brickwork +bridal +bridals +bride +bridegroom +bridegrooms +brides +bridesmaid +bridesmaids +bridge +bridgeable +bridged +bridgehead +bridgeheads +bridges +bridgework +bridging +bridle +bridled +bridles +bridling +brie +brief +briefcase +briefcases +briefed +briefer +briefest +briefing +briefings +briefly +briefness +briefs +brier +briers +brig +brigade +brigades +brigadier +brigadiers +brigand +brigandage +brigands +brigantine +brigantines +bright +brighten +brightened +brightener +brighteners +brightening +brightens +brighter +brightest +brightly +brightness +brights +brigs +brilliance +brilliancy +brilliant +brilliantine +brilliantly +brilliants +brim +brimful +brimfull +brimless +brimmed +brimming +brims +brimstone +brindle +brindled +brine +bring +bringer +bringers +bringing +brings +brinier +briniest +brininess +brink +brinkmanship +brinks +brinksmanship +briny +brioche +brioches +briquet +briquets +briquette +briquettes +brisk +brisked +brisker +briskest +brisket +briskets +brisking +briskly +briskness +brisks +bristle +bristled +bristles +bristlier +bristliest +bristling +bristly +britches +brittle +brittleness +brittler +brittlest +broach +broached +broaches +broaching +broad +broadband +broadcast +broadcasted +broadcaster +broadcasters +broadcasting +broadcasts +broadcloth +broaden +broadened +broadening +broadens +broader +broadest +broadloom +broadly +broadminded +broadness +broads +broadsheet +broadsheets +broadside +broadsided +broadsides +broadsiding +broadsword +broadswords +brocade +brocaded +brocades +brocading +broccoli +brochette +brochettes +brochure +brochures +brogan +brogans +brogue +brogues +broil +broiled +broiler +broilers +broiling +broils +broke +broken +brokenhearted +brokenheartedly +brokenly +brokenness +broker +brokerage +brokerages +brokered +brokering +brokers +bromide +bromides +bromidic +bromine +bronc +bronchi +bronchial +bronchitic +bronchitis +broncho +bronchos +bronchus +bronco +broncobuster +broncobusters +broncos +broncs +brontosaur +brontosauri +brontosaurs +brontosaurus +brontosauruses +bronze +bronzed +bronzes +bronzing +brooch +brooches +brood +brooded +brooder +brooders +broodier +broodiest +brooding +broodingly +broodmare +broodmares +broods +broody +brook +brooked +brooking +brooklet +brooklets +brooks +broom +brooms +broomstick +broomsticks +bros +broth +brothel +brothels +brother +brotherhood +brotherhoods +brotherliness +brotherly +brothers +broths +brougham +broughams +brought +brouhaha +brouhahas +brow +browbeat +browbeaten +browbeating +browbeats +brown +browned +browner +brownest +brownie +brownies +browning +brownish +brownness +brownout +brownouts +browns +brownstone +brownstones +brows +browse +browsed +browser +browsers +browses +browsing +bruin +bruins +bruise +bruised +bruiser +bruisers +bruises +bruising +bruit +bruited +bruiting +bruits +brunch +brunched +brunches +brunching +brunet +brunets +brunette +brunettes +brunt +brush +brushed +brushes +brushing +brushoff +brushoffs +brushwood +brushwork +brusk +brusker +bruskest +brusque +brusquely +brusqueness +brusquer +brusquest +brutal +brutalities +brutality +brutalization +brutalize +brutalized +brutalizes +brutalizing +brutally +brute +brutes +brutish +brutishly +brutishness +bubble +bubbled +bubblegum +bubbles +bubblier +bubbliest +bubbling +bubbly +bubo +buboes +bubs +buccaneer +buccaneers +buck +buckaroo +buckaroos +buckboard +buckboards +bucked +bucket +bucketed +bucketful +bucketfuls +bucketing +buckets +buckeye +buckeyes +bucking +buckle +buckled +buckler +bucklers +buckles +buckling +buckram +bucks +bucksaw +bucksaws +buckshot +buckskin +buckskins +buckteeth +bucktooth +bucktoothed +buckwheat +bucolic +bucolically +bucolics +budded +buddies +budding +buddy +budge +budged +budgerigar +budgerigars +budges +budget +budgetary +budgeted +budgeting +budgets +budgie +budgies +budging +buds +buff +buffalo +buffaloed +buffaloes +buffaloing +buffalos +buffed +buffer +buffered +buffering +buffers +buffet +buffeted +buffeting +buffets +buffing +buffoon +buffoonery +buffoonish +buffoons +buffs +bugaboo +bugaboos +bugbear +bugbears +bugged +bugger +buggered +buggering +buggers +buggier +buggies +buggiest +bugging +buggy +bugle +bugled +bugler +buglers +bugles +bugling +bugs +build +builder +builders +building +buildings +builds +buildup +buildups +built +bulb +bulbous +bulbs +bulge +bulged +bulges +bulgier +bulgiest +bulging +bulgy +bulimarexia +bulimia +bulimic +bulimics +bulk +bulked +bulkhead +bulkheads +bulkier +bulkiest +bulkiness +bulking +bulks +bulky +bull +bulldog +bulldogged +bulldogging +bulldogs +bulldoze +bulldozed +bulldozer +bulldozers +bulldozes +bulldozing +bulled +bullet +bulletin +bulletined +bulletining +bulletins +bulletproof +bulletproofed +bulletproofing +bulletproofs +bullets +bullfight +bullfighter +bullfighters +bullfighting +bullfights +bullfinch +bullfinches +bullfrog +bullfrogs +bullhead +bullheaded +bullheadedly +bullheadedness +bullheads +bullhorn +bullhorns +bullied +bullies +bulling +bullion +bullish +bullishly +bullishness +bullock +bullocks +bullpen +bullpens +bullring +bullrings +bulls +bullshit +bullshits +bullshitted +bullshitter +bullshitters +bullshitting +bully +bullying +bulrush +bulrushes +bulwark +bulwarks +bumble +bumblebee +bumblebees +bumbled +bumbler +bumblers +bumbles +bumbling +bummed +bummer +bummers +bummest +bumming +bump +bumped +bumper +bumpers +bumpier +bumpiest +bumpiness +bumping +bumpkin +bumpkins +bumps +bumptious +bumptiously +bumptiousness +bumpy +bums +bunch +bunched +bunches +bunchier +bunchiest +bunching +bunchy +bunco +buncoed +buncoing +buncombe +buncos +bundle +bundled +bundles +bundling +bung +bungalow +bungalows +bunged +bungee +bungees +bunghole +bungholes +bunging +bungle +bungled +bungler +bunglers +bungles +bungling +bungs +bunion +bunions +bunk +bunked +bunker +bunkers +bunkhouse +bunkhouses +bunking +bunko +bunkos +bunks +bunkum +bunnies +bunny +buns +bunt +bunted +bunting +buntings +bunts +buoy +buoyancy +buoyant +buoyantly +buoyed +buoying +buoys +burble +burbled +burbles +burbling +burbs +burden +burdened +burdening +burdens +burdensome +burdock +bureau +bureaucracies +bureaucracy +bureaucrat +bureaucratic +bureaucratically +bureaucratization +bureaucratize +bureaucratized +bureaucratizes +bureaucratizing +bureaucrats +bureaus +bureaux +burg +burgeon +burgeoned +burgeoning +burgeons +burger +burgers +burgh +burgher +burghers +burghs +burglar +burglaries +burglarize +burglarized +burglarizes +burglarizing +burglarproof +burglarproofed +burglarproofing +burglarproofs +burglars +burglary +burgle +burgled +burgles +burgling +burgomaster +burgomasters +burgs +burgundies +burgundy +burial +burials +buried +buries +burl +burlap +burled +burlesque +burlesqued +burlesques +burlesquing +burlier +burliest +burliness +burls +burly +burn +burnable +burnables +burned +burner +burners +burning +burnish +burnished +burnisher +burnishers +burnishes +burnishing +burnoose +burnooses +burnous +burnouses +burnout +burnouts +burns +burnt +burp +burped +burping +burps +burr +burred +burring +burrito +burritos +burro +burros +burrow +burrowed +burrower +burrowers +burrowing +burrows +burrs +burs +bursa +bursae +bursar +bursaries +bursars +bursary +bursas +bursitis +burst +bursted +bursting +bursts +bury +burying +busbies +busboy +busboys +busby +bused +buses +busgirl +busgirls +bush +bushed +bushel +busheled +busheling +bushelled +bushelling +bushels +bushes +bushier +bushiest +bushiness +bushing +bushings +bushman +bushmaster +bushmasters +bushmen +bushwhack +bushwhacked +bushwhacker +bushwhackers +bushwhacking +bushwhacks +bushy +busied +busier +busies +busiest +busily +business +businesses +businesslike +businessman +businessmen +businessperson +businesspersons +businesswoman +businesswomen +busing +buskin +buskins +buss +bussed +busses +bussing +bust +busted +buster +busters +bustier +bustiest +busting +bustle +bustled +bustles +bustling +busts +busty +busy +busybodies +busybody +busying +busyness +busywork +butane +butch +butcher +butchered +butcheries +butchering +butchers +butchery +butches +butler +butlers +buts +butt +butte +butted +butter +butterball +butterballs +buttercup +buttercups +buttered +butterfat +butterfingered +butterfingers +butterflied +butterflies +butterfly +butterflying +butterier +butteries +butteriest +buttering +buttermilk +butternut +butternuts +butters +butterscotch +buttery +buttes +butting +buttock +buttocks +button +buttoned +buttonhole +buttonholed +buttonholes +buttonholing +buttoning +buttons +buttonwood +buttonwoods +buttress +buttressed +buttresses +buttressing +butts +buxom +buyback +buybacks +buyer +buyers +buying +buyout +buyouts +buys +buzz +buzzard +buzzards +buzzed +buzzer +buzzers +buzzes +buzzing +buzzword +buzzwords +byelaw +byelaws +byes +bygone +bygones +bylaw +bylaws +byline +bylines +bypass +bypassed +bypasses +bypassing +bypast +bypath +bypaths +byplay +byproduct +byproducts +byroad +byroads +bystander +bystanders +byte +bytes +byway +byways +byword +bywords +byzantine +cabal +cabala +caballero +caballeros +cabals +cabana +cabanas +cabaret +cabarets +cabbage +cabbages +cabbed +cabbie +cabbies +cabbing +cabby +cabdriver +cabdrivers +cabin +cabinet +cabinetmaker +cabinetmakers +cabinetmaking +cabinetry +cabinets +cabinetwork +cabins +cable +cablecast +cablecasted +cablecasting +cablecasts +cabled +cablegram +cablegrams +cables +cabling +cabochon +cabochons +caboodle +caboose +cabooses +cabriolet +cabriolets +cabs +cabstand +cabstands +cacao +cacaos +cache +cached +cachepot +cachepots +caches +cachet +cachets +caching +cackle +cackled +cackler +cacklers +cackles +cackling +cacophonies +cacophonous +cacophony +cacti +cactus +cactuses +cadaver +cadaverous +cadavers +caddie +caddied +caddies +caddish +caddishly +caddishness +caddy +caddying +cadence +cadenced +cadences +cadenza +cadenzas +cadet +cadets +cadge +cadged +cadger +cadgers +cadges +cadging +cadmium +cadre +cadres +cads +caducei +caduceus +caesarean +caesareans +caesarian +caesarians +caesura +caesurae +caesuras +cafe +cafes +cafeteria +cafeterias +caffeine +caftan +caftans +cage +caged +cages +cagey +cagier +cagiest +cagily +caginess +caging +cagy +cahoot +cahoots +caiman +caimans +cairn +cairns +caisson +caissons +caitiff +caitiffs +cajole +cajoled +cajolement +cajoler +cajolers +cajolery +cajoles +cajoling +cake +caked +cakes +cakewalk +cakewalks +caking +calabash +calabashes +calaboose +calabooses +calamari +calamaris +calamine +calamities +calamitous +calamitously +calamity +calcareous +calciferous +calcification +calcified +calcifies +calcify +calcifying +calcimine +calcimined +calcimines +calcimining +calcine +calcined +calcines +calcining +calcite +calcium +calculable +calculate +calculated +calculatedly +calculates +calculating +calculatingly +calculation +calculations +calculative +calculator +calculators +calculi +calculus +calculuses +caldera +calderas +caldron +caldrons +calendar +calendared +calendaring +calendars +calender +calendered +calendering +calenders +calf +calfs +calfskin +caliber +calibers +calibrate +calibrated +calibrates +calibrating +calibration +calibrations +calibrator +calibrators +calibre +calibres +calico +calicoes +calicos +calif +californium +califs +caliper +calipered +calipering +calipers +caliph +caliphate +caliphates +caliphs +calisthenic +calisthenics +calk +calked +calking +calks +call +calla +callas +callback +callbacks +called +caller +callers +calligrapher +calligraphers +calligraphic +calligraphist +calligraphists +calligraphy +calling +callings +calliope +calliopes +calliper +callipered +callipering +callipers +callisthenics +callosities +callosity +callous +calloused +callouses +callousing +callously +callousness +callow +callower +callowest +callowness +calls +callus +callused +calluses +callusing +calm +calmed +calmer +calmest +calming +calmly +calmness +calms +caloric +calorie +calories +calorific +calumet +calumets +calumniate +calumniated +calumniates +calumniating +calumniation +calumniator +calumniators +calumnies +calumnious +calumny +calve +calved +calves +calving +calyces +calypso +calypsos +calyx +calyxes +camaraderie +camber +cambered +cambering +cambers +cambia +cambial +cambium +cambiums +cambric +camcorder +camcorders +came +camel +camelhair +camellia +camellias +camels +cameo +cameos +camera +cameraman +cameramen +cameras +camerawoman +camerawomen +camisole +camisoles +camomile +camomiles +camouflage +camouflaged +camouflager +camouflagers +camouflages +camouflaging +camp +campaign +campaigned +campaigner +campaigners +campaigning +campaigns +campanile +campaniles +campanili +campanologist +campanologists +campanology +camped +camper +campers +campfire +campfires +campground +campgrounds +camphor +campier +campiest +camping +camps +campsite +campsites +campus +campuses +campy +cams +camshaft +camshafts +canal +canalization +canalize +canalized +canalizes +canalizing +canals +canape +canapes +canard +canards +canaries +canary +canasta +cancan +cancans +cancel +canceled +canceler +cancelers +canceling +cancellation +cancellations +cancelled +canceller +cancellers +cancelling +cancels +cancer +cancerous +cancers +candelabra +candelabras +candelabrum +candelabrums +candid +candidacies +candidacy +candidate +candidates +candidature +candidatures +candidly +candidness +candied +candies +candle +candled +candlelight +candlepower +candler +candlers +candles +candlestick +candlesticks +candlewick +candlewicks +candling +candor +candour +candy +candying +cane +canebrake +canebrakes +caned +caner +caners +canes +canine +canines +caning +canister +canisters +canker +cankered +cankering +cankerous +cankers +cannabis +cannabises +canned +cannelloni +canneries +cannery +cannibal +cannibalism +cannibalistic +cannibalization +cannibalize +cannibalized +cannibalizes +cannibalizing +cannibals +cannier +canniest +cannily +canniness +canning +cannon +cannonade +cannonaded +cannonades +cannonading +cannonball +cannonballs +cannoned +cannoning +cannons +cannot +canny +canoe +canoed +canoeing +canoeist +canoeists +canoes +canola +canon +canonical +canonically +canonization +canonizations +canonize +canonized +canonizes +canonizing +canons +canopied +canopies +canopy +canopying +cans +canst +cant +cantabile +cantaloup +cantaloupe +cantaloupes +cantaloups +cantankerous +cantankerously +cantankerousness +cantata +cantatas +canted +canteen +canteens +canter +cantered +cantering +canters +canticle +canticles +cantilever +cantilevered +cantilevering +cantilevers +canting +canto +canton +cantonal +cantonment +cantonments +cantons +cantor +cantors +cantos +cants +canvas +canvasback +canvasbacks +canvased +canvases +canvasing +canvass +canvassed +canvasser +canvassers +canvasses +canvassing +canyon +canyons +capabilities +capability +capable +capably +capacious +capaciously +capaciousness +capacitance +capacities +capacitor +capacitors +capacity +caparison +caparisoned +caparisoning +caparisons +cape +caped +caper +capered +capering +capers +capes +capeskin +capillaries +capillarity +capillary +capital +capitalism +capitalist +capitalistic +capitalistically +capitalists +capitalization +capitalize +capitalized +capitalizes +capitalizing +capitally +capitals +capitation +capitations +capitol +capitols +capitulate +capitulated +capitulates +capitulating +capitulation +capitulations +caplet +caplets +capo +capon +capons +capos +capped +capping +cappuccino +cappuccinos +caprice +caprices +capricious +capriciously +capriciousness +caps +capsicum +capsicums +capsize +capsized +capsizes +capsizing +capstan +capstans +capstone +capstones +capsular +capsule +capsuled +capsules +capsuling +capsulize +capsulized +capsulizes +capsulizing +captain +captaincies +captaincy +captained +captaining +captains +caption +captioned +captioning +captions +captious +captiously +captiousness +captivate +captivated +captivates +captivating +captivation +captivator +captivators +captive +captives +captivities +captivity +captor +captors +capture +captured +captures +capturing +caracul +carafe +carafes +caramel +caramelize +caramelized +caramelizes +caramelizing +caramels +carapace +carapaces +carat +carats +caravan +caravans +caravansaries +caravansary +caravanserai +caravanserais +caravel +caravels +caraway +caraways +carbide +carbides +carbine +carbines +carbohydrate +carbohydrates +carbon +carbonaceous +carbonate +carbonated +carbonates +carbonating +carbonation +carboniferous +carbonize +carbonized +carbonizes +carbonizing +carbons +carborundum +carboy +carboys +carbuncle +carbuncles +carbuncular +carburetor +carburetors +carburetter +carburetters +carburettor +carburettors +carcass +carcasses +carcinogen +carcinogenic +carcinogenicity +carcinogenics +carcinogens +carcinoma +carcinomas +carcinomata +card +cardamom +cardamoms +cardboard +carded +carder +carders +cardiac +cardigan +cardigans +cardinal +cardinally +cardinals +carding +cardiogram +cardiograms +cardiograph +cardiographs +cardiologist +cardiologists +cardiology +cardiopulmonary +cardiovascular +cards +cardsharp +cardsharper +cardsharpers +cardsharps +care +cared +careen +careened +careening +careens +career +careered +careering +careerist +careerists +careers +carefree +careful +carefuller +carefullest +carefully +carefulness +caregiver +caregivers +careless +carelessly +carelessness +carer +carers +cares +caress +caressed +caresses +caressing +caret +caretaker +caretakers +carets +careworn +carfare +cargo +cargoes +cargos +carhop +carhops +caribou +caribous +caricature +caricatured +caricatures +caricaturing +caricaturist +caricaturists +caries +carillon +carillons +caring +carious +carjack +carjacked +carjacker +carjackers +carjacking +carjackings +carjacks +carload +carloads +carmine +carnage +carnal +carnality +carnally +carnation +carnations +carnelian +carnelians +carney +carneys +carnies +carnival +carnivals +carnivore +carnivores +carnivorous +carnivorously +carnivorousness +carny +carob +carol +caroled +caroler +carolers +caroling +carolled +caroller +carollers +carolling +carols +carom +caromed +caroming +caroms +carotene +carotid +carotids +carousal +carousals +carouse +caroused +carousel +carousels +carouser +carousers +carouses +carousing +carp +carpal +carpals +carped +carpel +carpels +carpenter +carpentered +carpentering +carpenters +carpentry +carper +carpers +carpet +carpetbag +carpetbagged +carpetbagger +carpetbaggers +carpetbagging +carpetbags +carpeted +carpeting +carpets +carpi +carping +carpool +carpooled +carpooling +carpools +carport +carports +carps +carpus +carrel +carrell +carrells +carrels +carriage +carriages +carried +carrier +carriers +carries +carrion +carrot +carrots +carroty +carrousel +carrousels +carry +carryall +carryalls +carrying +carryout +carryover +carryovers +cars +carsick +carsickness +cart +cartage +carted +cartel +cartels +carter +carters +carthorse +carthorses +cartilage +cartilages +cartilaginous +carting +cartload +cartloads +cartographer +cartographers +cartographic +cartography +carton +cartons +cartoon +cartooned +cartooning +cartoonist +cartoonists +cartoons +cartridge +cartridges +carts +cartwheel +cartwheeled +cartwheeling +cartwheels +carve +carved +carver +carvers +carves +carving +carvings +caryatid +caryatides +caryatids +casaba +casabas +cascade +cascaded +cascades +cascading +cascara +cascaras +case +cased +caseharden +casehardened +casehardening +casehardens +casein +caseload +caseloads +casement +casements +cases +casework +caseworker +caseworkers +cash +cashbook +cashbooks +cashed +cashes +cashew +cashews +cashier +cashiered +cashiering +cashiers +cashing +cashless +cashmere +casing +casings +casino +casinos +cask +casket +caskets +casks +cassava +cassavas +casserole +casseroled +casseroles +casseroling +cassette +cassettes +cassia +cassias +cassino +cassock +cassocks +cassowaries +cassowary +cast +castanet +castanets +castaway +castaways +caste +castellated +caster +casters +castes +castigate +castigated +castigates +castigating +castigation +castigator +castigators +casting +castings +castle +castled +castles +castling +castoff +castoffs +castor +castors +castrate +castrated +castrates +castrating +castration +castrations +casts +casual +casually +casualness +casuals +casualties +casualty +casuist +casuistic +casuistry +casuists +cataclysm +cataclysmal +cataclysmic +cataclysms +catacomb +catacombs +catafalque +catafalques +catalepsy +cataleptic +cataleptics +catalog +cataloged +cataloger +catalogers +cataloging +catalogs +catalogue +catalogued +cataloguer +cataloguers +catalogues +cataloguing +catalpa +catalpas +catalysis +catalyst +catalysts +catalytic +catalytics +catalyze +catalyzed +catalyzes +catalyzing +catamaran +catamarans +catapult +catapulted +catapulting +catapults +cataract +cataracts +catarrh +catastrophe +catastrophes +catastrophic +catastrophically +catatonia +catatonic +catatonics +catbird +catbirds +catboat +catboats +catcall +catcalled +catcalling +catcalls +catch +catchall +catchalls +catcher +catchers +catches +catchier +catchiest +catching +catchment +catchments +catchpenny +catchphrase +catchphrases +catchup +catchword +catchwords +catchy +catechism +catechisms +catechist +catechists +catechize +catechized +catechizes +catechizing +categorical +categorically +categories +categorization +categorizations +categorize +categorized +categorizes +categorizing +category +cater +catercorner +catered +caterer +caterers +catering +caterpillar +caterpillars +caters +caterwaul +caterwauled +caterwauling +caterwauls +catfish +catfishes +catgut +catharses +catharsis +cathartic +cathartics +cathedral +cathedrals +catheter +catheterize +catheterized +catheterizes +catheterizing +catheters +cathode +cathodes +cathodic +catholic +catholicity +cation +cations +catkin +catkins +catlike +catnap +catnapped +catnapping +catnaps +catnip +cats +catsup +cattail +cattails +cattier +cattiest +cattily +cattiness +cattle +cattleman +cattlemen +catty +catwalk +catwalks +caucus +caucused +caucuses +caucusing +caucussed +caucussing +caudal +caudally +caught +cauldron +cauldrons +cauliflower +cauliflowers +caulk +caulked +caulker +caulkers +caulking +caulks +causal +causalities +causality +causally +causation +causative +cause +caused +causeless +causer +causerie +causeries +causers +causes +causeway +causeways +causing +caustic +caustically +causticity +caustics +cauterization +cauterize +cauterized +cauterizes +cauterizing +caution +cautionary +cautioned +cautioning +cautions +cautious +cautiously +cautiousness +cavalcade +cavalcades +cavalier +cavalierly +cavaliers +cavalries +cavalry +cavalryman +cavalrymen +cave +caveat +caveats +caved +caveman +cavemen +cavern +cavernous +cavernously +caverns +caves +caviar +caviare +cavil +caviled +caviler +cavilers +caviling +cavilled +caviller +cavillers +cavilling +cavils +caving +cavities +cavity +cavort +cavorted +cavorting +cavorts +cawed +cawing +caws +cayenne +cayman +caymans +cays +cayuse +cayuses +cease +ceased +ceasefire +ceasefires +ceaseless +ceaselessly +ceaselessness +ceases +ceasing +ceca +cecal +cecum +cedar +cedars +cede +ceded +ceder +ceders +cedes +cedilla +cedillas +ceding +ceiling +ceilings +celandine +celebrant +celebrants +celebrate +celebrated +celebrates +celebrating +celebration +celebrations +celebrator +celebrators +celebratory +celebrities +celebrity +celerity +celery +celesta +celestas +celestial +celestially +celibacy +celibate +celibates +cell +cellar +cellars +celled +celli +cellist +cellists +cellmate +cellmates +cello +cellophane +cellos +cellphone +cellphones +cells +cellular +cellulite +celluloid +cellulose +cement +cemented +cementer +cementers +cementing +cements +cementum +cemeteries +cemetery +cenobite +cenobites +cenobitic +cenotaph +cenotaphs +censer +censers +censor +censored +censorial +censoring +censorious +censoriously +censoriousness +censors +censorship +censurable +censure +censured +censurer +censurers +censures +censuring +census +censused +censuses +censusing +cent +centaur +centaurs +centavo +centavos +centenarian +centenarians +centenaries +centenary +centennial +centennially +centennials +center +centerboard +centerboards +centered +centerfold +centerfolds +centering +centerpiece +centerpieces +centers +centigrade +centigram +centigramme +centigrammes +centigrams +centiliter +centiliters +centime +centimes +centimeter +centimeters +centimetre +centimetres +centipede +centipedes +central +centrality +centralization +centralize +centralized +centralizer +centralizers +centralizes +centralizing +centrally +centrals +centre +centred +centres +centrifugal +centrifugally +centrifuge +centrifuged +centrifuges +centrifuging +centring +centripetal +centripetally +centrism +centrist +centrists +cents +centuries +centurion +centurions +century +cephalic +ceramic +ceramicist +ceramicists +ceramics +ceramist +ceramists +cereal +cereals +cerebella +cerebellar +cerebellum +cerebellums +cerebra +cerebral +cerebrate +cerebrated +cerebrates +cerebrating +cerebration +cerebrum +cerebrums +cerement +cerements +ceremonial +ceremonially +ceremonials +ceremonies +ceremonious +ceremoniously +ceremoniousness +ceremony +cerise +cerium +cermet +certain +certainly +certainties +certainty +certifiable +certifiably +certificate +certificated +certificates +certificating +certification +certifications +certified +certifies +certify +certifying +certitude +cerulean +cervical +cervices +cervix +cervixes +cesarean +cesareans +cesium +cessation +cessations +cession +cessions +cesspool +cesspools +cetacean +cetaceans +chafe +chafed +chafes +chaff +chaffed +chaffinch +chaffinches +chaffing +chaffs +chafing +chagrin +chagrined +chagrining +chagrinned +chagrinning +chagrins +chain +chained +chaining +chains +chainsaw +chainsawed +chainsawing +chainsaws +chair +chaired +chairing +chairlift +chairlifts +chairman +chairmanship +chairmen +chairperson +chairpersons +chairs +chairwoman +chairwomen +chaise +chaises +chalcedony +chalet +chalets +chalice +chalices +chalk +chalkboard +chalkboards +chalked +chalkier +chalkiest +chalkiness +chalking +chalks +chalky +challenge +challenged +challenger +challengers +challenges +challenging +challis +chamber +chambered +chamberlain +chamberlains +chambermaid +chambermaids +chambers +chambray +chameleon +chameleons +chammies +chammy +chamois +chamoix +chamomile +chamomiles +champ +champagne +champagnes +champed +champing +champion +championed +championing +champions +championship +championships +champs +chance +chanced +chancel +chancelleries +chancellery +chancellor +chancellors +chancellorship +chancels +chanceries +chancery +chances +chancier +chanciest +chanciness +chancing +chancre +chancres +chancy +chandelier +chandeliers +chandler +chandlers +change +changeability +changeable +changeableness +changeably +changed +changeless +changelessly +changeling +changelings +changeover +changeovers +changer +changers +changes +changing +channel +channeled +channeling +channelization +channelize +channelized +channelizes +channelizing +channelled +channelling +channels +chanson +chansons +chant +chanted +chanter +chanters +chanteuse +chanteuses +chantey +chanteys +chanticleer +chanticleers +chanties +chanting +chants +chanty +chaos +chaotic +chaotically +chap +chaparral +chaparrals +chapbook +chapbooks +chapeau +chapeaus +chapeaux +chapel +chapels +chaperon +chaperonage +chaperone +chaperoned +chaperones +chaperoning +chaperons +chaplain +chaplaincies +chaplaincy +chaplains +chaplet +chaplets +chapped +chapping +chaps +chapt +chapter +chapters +char +charabanc +charabancs +character +characteristic +characteristically +characteristics +characterization +characterizations +characterize +characterized +characterizes +characterizing +characterless +characters +charade +charades +charbroil +charbroiled +charbroiling +charbroils +charcoal +charcoals +chard +chardonnay +chardonnays +charge +chargeable +charged +charger +chargers +charges +charging +charier +chariest +charily +chariness +chariot +charioteer +charioteers +chariots +charisma +charismatic +charismatics +charitable +charitableness +charitably +charities +charity +charlatan +charlatanism +charlatanry +charlatans +charm +charmed +charmer +charmers +charming +charmingly +charms +charred +charring +chars +chart +charted +charter +chartered +charterer +charterers +chartering +charters +charting +chartreuse +charts +charwoman +charwomen +chary +chase +chased +chaser +chasers +chases +chasing +chasm +chasms +chassis +chaste +chastely +chasten +chastened +chasteness +chastening +chastens +chaster +chastest +chastise +chastised +chastisement +chastisements +chastiser +chastisers +chastises +chastising +chastity +chasuble +chasubles +chat +chateau +chateaus +chateaux +chatelaine +chatelaines +chats +chatted +chattel +chattels +chatter +chatterbox +chatterboxes +chattered +chatterer +chatterers +chattering +chatters +chattier +chattiest +chattily +chattiness +chatting +chatty +chauffeur +chauffeured +chauffeuring +chauffeurs +chauvinism +chauvinist +chauvinistic +chauvinistically +chauvinists +cheap +cheapen +cheapened +cheapening +cheapens +cheaper +cheapest +cheaply +cheapness +cheapskate +cheapskates +cheat +cheated +cheater +cheaters +cheating +cheats +check +checkbook +checkbooks +checked +checker +checkerboard +checkerboards +checkered +checkering +checkers +checking +checklist +checklists +checkmate +checkmated +checkmates +checkmating +checkoff +checkoffs +checkout +checkouts +checkpoint +checkpoints +checkroom +checkrooms +checks +checkup +checkups +cheddar +cheek +cheekbone +cheekbones +cheeked +cheekier +cheekiest +cheekily +cheekiness +cheeking +cheeks +cheeky +cheep +cheeped +cheeping +cheeps +cheer +cheered +cheerer +cheerers +cheerful +cheerfuller +cheerfullest +cheerfully +cheerfulness +cheerier +cheeriest +cheerily +cheeriness +cheering +cheerio +cheerios +cheerleader +cheerleaders +cheerless +cheerlessly +cheerlessness +cheers +cheery +cheese +cheeseburger +cheeseburgers +cheesecake +cheesecakes +cheesecloth +cheeseparing +cheeses +cheesier +cheesiest +cheesiness +cheesy +cheetah +cheetahs +chef +chefs +chemical +chemically +chemicals +chemise +chemises +chemist +chemistry +chemists +chemo +chemotherapeutic +chemotherapy +chemurgy +chenille +cheque +chequer +chequers +cheques +cherish +cherished +cherishes +cherishing +cheroot +cheroots +cherries +cherry +chert +cherub +cherubic +cherubim +cherubims +cherubs +chervil +chess +chessboard +chessboards +chessman +chessmen +chest +chested +chesterfield +chesterfields +chestful +chestfuls +chestier +chestiest +chestnut +chestnuts +chests +chesty +chevalier +chevaliers +cheviot +chevron +chevrons +chew +chewed +chewer +chewers +chewier +chewiest +chewiness +chewing +chews +chewy +chiaroscuro +chic +chicane +chicaneries +chicanery +chicanes +chicer +chicest +chichi +chichis +chick +chickadee +chickadees +chicken +chickened +chickenfeed +chickenhearted +chickening +chickenpox +chickens +chickpea +chickpeas +chicks +chickweed +chicle +chicness +chicories +chicory +chid +chidden +chide +chided +chides +chiding +chidingly +chief +chiefdom +chiefer +chiefest +chiefly +chiefs +chieftain +chieftains +chieftainship +chieftainships +chiffon +chiffonier +chiffoniers +chigger +chiggers +chignon +chignons +chihuahua +chihuahuas +chilblain +chilblains +child +childbearing +childbirth +childbirths +childcare +childhood +childhoods +childish +childishly +childishness +childless +childlessness +childlike +childproof +childproofed +childproofing +childproofs +children +chile +chiles +chili +chilies +chill +chilled +chiller +chillers +chillest +chilli +chillier +chillies +chilliest +chilliness +chilling +chillingly +chillness +chills +chilly +chimaera +chimaeras +chime +chimed +chimer +chimera +chimeras +chimeric +chimerical +chimers +chimes +chiming +chimney +chimneys +chimp +chimpanzee +chimpanzees +chimps +chin +china +chinaware +chinchilla +chinchillas +chine +chines +chink +chinked +chinking +chinks +chinned +chinning +chino +chinos +chins +chinstrap +chinstraps +chintz +chintzier +chintziest +chintzy +chip +chipmunk +chipmunks +chipped +chipper +chippers +chipping +chips +chirography +chiropodist +chiropodists +chiropody +chiropractic +chiropractics +chiropractor +chiropractors +chirp +chirped +chirpier +chirpiest +chirping +chirps +chirpy +chirrup +chirruped +chirruping +chirrupped +chirrupping +chirrups +chis +chisel +chiseled +chiseler +chiselers +chiseling +chiselled +chiseller +chisellers +chiselling +chisels +chit +chitchat +chitchats +chitchatted +chitchatting +chitin +chitinous +chitlings +chitlins +chits +chitterlings +chivalrous +chivalrously +chivalrousness +chivalry +chive +chives +chlamydia +chlamydiae +chlamydias +chloral +chlordane +chloride +chlorides +chlorinate +chlorinated +chlorinates +chlorinating +chlorination +chlorine +chlorofluorocarbon +chlorofluorocarbons +chloroform +chloroformed +chloroforming +chloroforms +chlorophyl +chlorophyll +chloroplast +chloroplasts +chocaholic +chocaholics +chock +chockablock +chocked +chocking +chocks +chocoholic +chocoholics +chocolate +chocolates +chocolatey +chocolaty +choice +choicer +choices +choicest +choir +choirboy +choirboys +choirmaster +choirmasters +choirs +choke +chokecherries +chokecherry +choked +choker +chokers +chokes +choking +choler +cholera +choleric +cholesterol +chomp +chomped +chomping +chomps +choose +chooser +choosers +chooses +choosey +choosier +choosiest +choosiness +choosing +choosy +chop +chophouse +chophouses +chopped +chopper +choppered +choppering +choppers +choppier +choppiest +choppily +choppiness +chopping +choppy +chops +chopstick +chopsticks +choral +chorale +chorales +chorally +chorals +chord +chordal +chordate +chordates +chords +chore +chorea +choreograph +choreographed +choreographer +choreographers +choreographic +choreographically +choreographing +choreographs +choreography +chores +chorister +choristers +choroid +choroids +chortle +chortled +chortler +chortlers +chortles +chortling +chorus +chorused +choruses +chorusing +chorussed +chorussing +chose +chosen +chow +chowder +chowders +chowed +chowing +chows +chrism +christen +christened +christening +christenings +christens +chromatic +chromatically +chromatin +chrome +chromed +chromes +chroming +chromium +chromosomal +chromosome +chromosomes +chronic +chronically +chronicle +chronicled +chronicler +chroniclers +chronicles +chronicling +chronograph +chronographs +chronological +chronologically +chronologies +chronologist +chronologists +chronology +chronometer +chronometers +chrysalides +chrysalis +chrysalises +chrysanthemum +chrysanthemums +chub +chubbier +chubbiest +chubbiness +chubby +chubs +chuck +chucked +chuckhole +chuckholes +chucking +chuckle +chuckled +chuckles +chuckling +chucks +chug +chugged +chugging +chugs +chukka +chukkas +chum +chummed +chummier +chummiest +chummily +chumminess +chumming +chummy +chump +chumps +chums +chunk +chunkier +chunkiest +chunkiness +chunks +chunky +church +churches +churchgoer +churchgoers +churchgoing +churchman +churchmen +churchwarden +churchwardens +churchyard +churchyards +churl +churlish +churlishly +churlishness +churls +churn +churned +churner +churners +churning +churns +chute +chutes +chutney +chutzpa +chutzpah +chyme +ciao +cicada +cicadae +cicadas +cicatrice +cicatrices +cicatrix +cicatrixes +cicerone +cicerones +ciceroni +cider +ciders +cigar +cigaret +cigarets +cigarette +cigarettes +cigarillo +cigarillos +cigars +cilantro +cilia +cilium +cinch +cinched +cinches +cinching +cinchona +cinchonas +cincture +cinctures +cinder +cindered +cindering +cinders +cinema +cinemas +cinematic +cinematographer +cinematographers +cinematographic +cinematography +cinnabar +cinnamon +cipher +ciphered +ciphering +ciphers +circa +circadian +circle +circled +circles +circlet +circlets +circling +circuit +circuital +circuited +circuiting +circuitous +circuitously +circuitousness +circuitry +circuits +circuity +circular +circularity +circularize +circularized +circularizes +circularizing +circularly +circulars +circulate +circulated +circulates +circulating +circulation +circulations +circulatory +circumcise +circumcised +circumcises +circumcising +circumcision +circumcisions +circumference +circumferences +circumferential +circumflex +circumflexes +circumlocution +circumlocutions +circumnavigate +circumnavigated +circumnavigates +circumnavigating +circumnavigation +circumnavigations +circumpolar +circumscribe +circumscribed +circumscribes +circumscribing +circumscription +circumscriptions +circumspect +circumspection +circumspectly +circumstance +circumstanced +circumstances +circumstancing +circumstantial +circumstantially +circumvent +circumvented +circumventing +circumvention +circumvents +circus +circuses +cirque +cirques +cirrhosis +cirrhotic +cirrhotics +cirrus +cistern +cisterns +citadel +citadels +citation +citations +cite +cited +cites +cities +citified +citing +citizen +citizenry +citizens +citizenship +citric +citron +citronella +citrons +citrous +citrus +citruses +city +civet +civets +civic +civically +civics +civies +civil +civilian +civilians +civilisation +civilisations +civilise +civilised +civilises +civilising +civilities +civility +civilization +civilizations +civilize +civilized +civilizes +civilizing +civilly +civvies +clack +clacked +clacking +clacks +clad +cladding +claim +claimable +claimant +claimants +claimed +claimer +claimers +claiming +claims +clairvoyance +clairvoyant +clairvoyants +clam +clambake +clambakes +clamber +clambered +clamberer +clamberers +clambering +clambers +clammed +clammier +clammiest +clammily +clamminess +clamming +clammy +clamor +clamored +clamoring +clamorous +clamors +clamour +clamoured +clamouring +clamours +clamp +clampdown +clampdowns +clamped +clamping +clamps +clams +clan +clandestine +clandestinely +clang +clanged +clanging +clangor +clangorous +clangorously +clangour +clangs +clank +clanked +clanking +clanks +clannish +clannishness +clans +clansman +clansmen +clap +clapboard +clapboarded +clapboarding +clapboards +clapped +clapper +clappers +clapping +claps +claptrap +claque +claques +claret +clarets +clarification +clarifications +clarified +clarifies +clarify +clarifying +clarinet +clarinetist +clarinetists +clarinets +clarinettist +clarinettists +clarion +clarions +clarity +clash +clashed +clashes +clashing +clasp +clasped +clasping +clasps +class +classed +classes +classic +classical +classically +classicism +classicist +classicists +classics +classier +classiest +classifiable +classification +classifications +classified +classifieds +classifier +classifiers +classifies +classify +classifying +classiness +classing +classless +classmate +classmates +classroom +classrooms +classwork +classy +clatter +clattered +clattering +clatters +clausal +clause +clauses +claustrophobia +claustrophobic +clavichord +clavichords +clavicle +clavicles +clavier +claviers +claw +clawed +clawing +claws +clay +clayey +clayier +clayiest +clean +cleanable +cleaned +cleaner +cleaners +cleanest +cleaning +cleanings +cleanlier +cleanliest +cleanliness +cleanly +cleanness +cleans +cleanse +cleansed +cleanser +cleansers +cleanses +cleansing +cleanup +cleanups +clear +clearance +clearances +cleared +clearer +clearest +clearheaded +clearing +clearinghouse +clearinghouses +clearings +clearly +clearness +clears +cleat +cleats +cleavage +cleavages +cleave +cleaved +cleaver +cleavers +cleaves +cleaving +clef +clefs +cleft +clefts +clematis +clematises +clemency +clement +clemently +clench +clenched +clenches +clenching +clerestories +clerestory +clergies +clergy +clergyman +clergymen +clergywoman +clergywomen +cleric +clerical +clericalism +clerically +clerics +clerk +clerked +clerking +clerks +clerkship +clever +cleverer +cleverest +cleverly +cleverness +clevis +clevises +clew +clewed +clewing +clews +cliche +cliched +cliches +click +clicked +clicker +clickers +clicking +clicks +client +clientele +clienteles +clients +cliff +cliffhanger +cliffhangers +cliffs +climacteric +climactic +climate +climates +climatic +climatically +climatologist +climatologists +climatology +climax +climaxed +climaxes +climaxing +climb +climbable +climbed +climber +climbers +climbing +climbs +clime +climes +clinch +clinched +clincher +clinchers +clinches +clinching +cling +clinger +clingers +clingier +clingiest +clinging +clings +clingy +clinic +clinical +clinically +clinician +clinicians +clinics +clink +clinked +clinker +clinkers +clinking +clinks +cliometric +cliometrician +cliometricians +cliometrics +clip +clipboard +clipboards +clipped +clipper +clippers +clipping +clippings +clips +clipt +clique +cliques +cliquey +cliquier +cliquiest +cliquish +cliquishly +cliquishness +clitoral +clitorides +clitoris +clitorises +cloaca +cloacae +cloacas +cloak +cloaked +cloaking +cloakroom +cloakrooms +cloaks +clobber +clobbered +clobbering +clobbers +cloche +cloches +clock +clocked +clocking +clocks +clockwise +clockwork +clockworks +clod +cloddish +clodhopper +clodhoppers +clods +clog +clogged +clogging +clogs +cloisonne +cloister +cloistered +cloistering +cloisters +cloistral +clomp +clomped +clomping +clomps +clonal +clone +cloned +clones +cloning +clonk +clonked +clonking +clonks +clop +clopped +clopping +clops +close +closed +closefisted +closely +closemouthed +closeness +closeout +closeouts +closer +closes +closest +closet +closeted +closeting +closets +closeup +closeups +closing +closings +closure +closures +clot +cloth +clothe +clothed +clothes +clotheshorse +clotheshorses +clothesline +clotheslines +clothespin +clothespins +clothier +clothiers +clothing +cloths +clots +clotted +clotting +cloture +clotures +cloud +cloudburst +cloudbursts +clouded +cloudier +cloudiest +cloudiness +clouding +cloudless +clouds +cloudy +clout +clouted +clouting +clouts +clove +cloven +clover +cloverleaf +cloverleafs +cloverleaves +clovers +cloves +clown +clowned +clowning +clownish +clownishly +clownishness +clowns +cloy +cloyed +cloying +cloys +club +clubbed +clubbing +clubfeet +clubfoot +clubfooted +clubhouse +clubhouses +clubs +cluck +clucked +clucking +clucks +clue +clued +clueing +clueless +clues +cluing +clump +clumped +clumpier +clumpiest +clumping +clumps +clumpy +clumsier +clumsiest +clumsily +clumsiness +clumsy +clung +clunk +clunked +clunker +clunkers +clunkier +clunkiest +clunking +clunks +clunky +cluster +clustered +clustering +clusters +clutch +clutched +clutches +clutching +clutter +cluttered +cluttering +clutters +cnidarian +cnidarians +coach +coached +coaches +coaching +coachman +coachmen +coadjutor +coadjutors +coagulant +coagulants +coagulate +coagulated +coagulates +coagulating +coagulation +coagulator +coagulators +coal +coaled +coalesce +coalesced +coalescence +coalescent +coalesces +coalescing +coalface +coalfaces +coaling +coalition +coalitionist +coalitionists +coalitions +coals +coarse +coarsely +coarsen +coarsened +coarseness +coarsening +coarsens +coarser +coarsest +coast +coastal +coasted +coaster +coasters +coasting +coastline +coastlines +coasts +coat +coated +coating +coatings +coats +coattail +coattails +coauthor +coauthored +coauthoring +coauthors +coax +coaxed +coaxer +coaxers +coaxes +coaxial +coaxing +coaxingly +cobalt +cobble +cobbled +cobbler +cobblers +cobbles +cobblestone +cobblestones +cobbling +cobra +cobras +cobs +cobweb +cobwebbier +cobwebbiest +cobwebby +cobwebs +coca +cocain +cocaine +cocci +coccus +coccyges +coccyx +coccyxes +cochineal +cochlea +cochleae +cochlear +cochleas +cock +cockade +cockades +cockamamie +cockatoo +cockatoos +cockatrice +cockatrices +cockcrow +cockcrows +cocked +cockerel +cockerels +cockeyed +cockfight +cockfighting +cockfights +cockier +cockiest +cockily +cockiness +cocking +cockle +cockles +cockleshell +cockleshells +cockney +cockneys +cockpit +cockpits +cockroach +cockroaches +cocks +cockscomb +cockscombs +cocksucker +cocksuckers +cocksure +cocktail +cocktails +cocky +coco +cocoa +cocoanut +cocoanuts +cocoas +coconut +coconuts +cocoon +cocooned +cocooning +cocoons +cocos +coda +codas +coddle +coddled +coddles +coddling +code +coded +codeine +codependency +codependent +codependents +coder +coders +codes +codex +codfish +codfishes +codger +codgers +codices +codicil +codicils +codification +codifications +codified +codifier +codifiers +codifies +codify +codifying +coding +codpiece +codpieces +cods +coed +coeds +coeducation +coeducational +coefficient +coefficients +coelenterate +coelenterates +coequal +coequally +coequals +coerce +coerced +coercer +coercers +coerces +coercing +coercion +coercive +coeval +coevally +coevals +coexist +coexisted +coexistence +coexistent +coexisting +coexists +coextensive +coffee +coffeecake +coffeecakes +coffeehouse +coffeehouses +coffeemaker +coffeemakers +coffeepot +coffeepots +coffees +coffer +cofferdam +cofferdams +coffers +coffin +coffined +coffining +coffins +cogency +cogent +cogently +cogitate +cogitated +cogitates +cogitating +cogitation +cogitative +cogitator +cogitators +cognac +cognacs +cognate +cognates +cognition +cognitional +cognitive +cognitively +cognizable +cognizance +cognizant +cognomen +cognomens +cognomina +cognoscente +cognoscenti +cogs +cogwheel +cogwheels +cohabit +cohabitant +cohabitants +cohabitation +cohabited +cohabiting +cohabits +coheir +coheirs +cohere +cohered +coherence +coherency +coherent +coherently +coheres +cohering +cohesion +cohesive +cohesively +cohesiveness +coho +cohort +cohorts +cohos +coif +coifed +coiffed +coiffing +coiffure +coiffured +coiffures +coiffuring +coifing +coifs +coil +coiled +coiling +coils +coin +coinage +coinages +coincide +coincided +coincidence +coincidences +coincident +coincidental +coincidentally +coincides +coinciding +coined +coiner +coiners +coining +coins +coinsurance +coital +coitus +coke +coked +cokes +coking +cola +colander +colanders +colas +cold +coldblooded +colder +coldest +coldly +coldness +colds +coleslaw +coleus +coleuses +colic +colicky +coliseum +coliseums +colitis +collaborate +collaborated +collaborates +collaborating +collaboration +collaborations +collaborative +collaborator +collaborators +collage +collages +collapse +collapsed +collapses +collapsible +collapsing +collar +collarbone +collarbones +collard +collards +collared +collaring +collarless +collars +collate +collated +collateral +collateralize +collateralized +collateralizes +collateralizing +collaterally +collates +collating +collation +collations +collator +collators +colleague +colleagues +collect +collectable +collectables +collected +collectedly +collectible +collectibles +collecting +collection +collections +collective +collectively +collectives +collectivism +collectivist +collectivists +collectivization +collectivize +collectivized +collectivizes +collectivizing +collector +collectors +collects +colleen +colleens +college +colleges +collegiality +collegian +collegians +collegiate +collide +collided +collides +colliding +collie +collier +collieries +colliers +colliery +collies +collision +collisions +collocate +collocated +collocates +collocating +collocation +collocations +colloid +colloidal +colloids +colloquia +colloquial +colloquialism +colloquialisms +colloquially +colloquies +colloquium +colloquiums +colloquy +collude +colluded +colludes +colluding +collusion +collusive +cologne +colognes +colon +colonel +colonelcy +colonels +colones +colonial +colonialism +colonialist +colonialists +colonially +colonials +colonies +colonist +colonists +colonization +colonize +colonized +colonizer +colonizers +colonizes +colonizing +colonnade +colonnaded +colonnades +colons +colony +colophon +colophons +color +colorant +colorants +coloration +coloratura +coloraturas +colorblind +colorblindness +colored +coloreds +colorfast +colorfastness +colorful +colorfully +colorfulness +coloring +colorization +colorize +colorized +colorizes +colorizing +colorless +colorlessly +colorlessness +colors +colossal +colossally +colossi +colossus +colossuses +colostomies +colostomy +colostrum +colour +coloured +colouring +colours +colt +coltish +colts +columbine +columbines +column +columnar +columned +columnist +columnists +columns +coma +comaker +comakers +comas +comatose +comb +combat +combatant +combatants +combated +combating +combative +combativeness +combats +combatted +combatting +combed +comber +combers +combination +combinations +combine +combined +combiner +combiners +combines +combing +combings +combining +combo +combos +combs +combustibility +combustible +combustibles +combustion +combustive +come +comeback +comebacks +comedian +comedians +comedic +comedienne +comediennes +comedies +comedown +comedowns +comedy +comelier +comeliest +comeliness +comely +comer +comers +comes +comestible +comestibles +comet +comets +comeuppance +comeuppances +comfier +comfiest +comfit +comfits +comfort +comfortable +comfortableness +comfortably +comforted +comforter +comforters +comforting +comfortingly +comforts +comfy +comic +comical +comicality +comically +comics +coming +comings +comity +comma +command +commandant +commandants +commanded +commandeer +commandeered +commandeering +commandeers +commander +commanders +commanding +commandment +commandments +commando +commandoes +commandos +commands +commas +commemorate +commemorated +commemorates +commemorating +commemoration +commemorations +commemorative +commemorator +commemorators +commence +commenced +commencement +commencements +commences +commencing +commend +commendable +commendably +commendation +commendations +commendatory +commended +commending +commends +commensurable +commensurate +commensurately +comment +commentaries +commentary +commentate +commentated +commentates +commentating +commentator +commentators +commented +commenting +comments +commerce +commercial +commercialism +commercialization +commercialize +commercialized +commercializes +commercializing +commercially +commercials +commie +commies +commingle +commingled +commingles +commingling +commiserate +commiserated +commiserates +commiserating +commiseration +commiserations +commiserative +commissar +commissariat +commissariats +commissaries +commissars +commissary +commission +commissioned +commissioner +commissioners +commissioning +commissions +commit +commitment +commitments +commits +committal +committals +committed +committee +committeeman +committeemen +committees +committeewoman +committeewomen +committing +commode +commodes +commodious +commodiously +commodities +commodity +commodore +commodores +common +commonalty +commoner +commoners +commonest +commonly +commonness +commonplace +commonplaces +commons +commonsense +commonweal +commonwealth +commonwealths +commotion +commotions +communal +communally +commune +communed +communes +communicability +communicable +communicably +communicant +communicants +communicate +communicated +communicates +communicating +communication +communications +communicative +communicator +communicators +communing +communion +communions +communique +communiques +communism +communist +communistic +communists +communities +community +commutable +commutation +commutations +commutative +commutator +commutators +commute +commuted +commuter +commuters +commutes +commuting +comp +compact +compacted +compacter +compactest +compacting +compactly +compactness +compactor +compactors +compacts +companies +companion +companionable +companionably +companions +companionship +companionway +companionways +company +comparability +comparable +comparably +comparative +comparatively +comparatives +compare +compared +compares +comparing +comparison +comparisons +compartment +compartmental +compartmentalization +compartmentalize +compartmentalized +compartmentalizes +compartmentalizing +compartments +compass +compassed +compasses +compassing +compassion +compassionate +compassionately +compatibility +compatible +compatibles +compatibly +compatriot +compatriots +comped +compeer +compeers +compel +compelled +compelling +compellingly +compels +compendia +compendious +compendium +compendiums +compensate +compensated +compensates +compensating +compensation +compensations +compensatory +compete +competed +competence +competences +competencies +competency +competent +competently +competes +competing +competition +competitions +competitive +competitively +competitiveness +competitor +competitors +compilation +compilations +compile +compiled +compiler +compilers +compiles +compiling +comping +complacence +complacency +complacent +complacently +complain +complainant +complainants +complained +complainer +complainers +complaining +complains +complaint +complaints +complaisance +complaisant +complaisantly +complected +complement +complementary +complemented +complementing +complements +complete +completed +completely +completeness +completer +completes +completest +completing +completion +complex +complexes +complexion +complexional +complexioned +complexions +complexities +complexity +complexly +compliance +compliant +compliantly +complicate +complicated +complicatedly +complicates +complicating +complication +complications +complicit +complicity +complied +complies +compliment +complimentary +complimented +complimenting +compliments +comply +complying +component +components +comport +comported +comporting +comportment +comports +compose +composed +composedly +composer +composers +composes +composing +composite +compositely +composites +composition +compositions +compositor +compositors +compost +composted +composting +composts +composure +compote +compotes +compound +compoundable +compounded +compounding +compounds +comprehend +comprehended +comprehending +comprehends +comprehensibility +comprehensible +comprehensibly +comprehension +comprehensions +comprehensive +comprehensively +comprehensiveness +comprehensives +compress +compressed +compresses +compressible +compressing +compression +compressor +compressors +comprise +comprised +comprises +comprising +compromise +compromised +compromises +compromising +comps +comptroller +comptrollers +compulsion +compulsions +compulsive +compulsively +compulsiveness +compulsories +compulsorily +compulsory +compunction +compunctions +computation +computational +computations +compute +computed +computer +computerization +computerize +computerized +computerizes +computerizing +computers +computes +computing +comrade +comradely +comrades +comradeship +concatenate +concatenated +concatenates +concatenating +concatenation +concatenations +concave +concavely +concaveness +concavities +concavity +conceal +concealable +concealed +concealer +concealers +concealing +concealment +conceals +concede +conceded +concedes +conceding +conceit +conceited +conceitedly +conceitedness +conceits +conceivable +conceivably +conceive +conceived +conceives +conceiving +concentrate +concentrated +concentrates +concentrating +concentration +concentrations +concentric +concentrically +concept +conception +conceptional +conceptions +concepts +conceptual +conceptualization +conceptualizations +conceptualize +conceptualized +conceptualizes +conceptualizing +conceptually +concern +concerned +concerning +concerns +concert +concerted +concertedly +concerti +concertina +concertinaed +concertinaing +concertinas +concerting +concertize +concertized +concertizes +concertizing +concertmaster +concertmasters +concerto +concertos +concerts +concession +concessionaire +concessionaires +concessional +concessionary +concessions +conch +conches +conchs +concierge +concierges +conciliate +conciliated +conciliates +conciliating +conciliation +conciliator +conciliators +conciliatory +concise +concisely +conciseness +conciser +concisest +concision +conclave +conclaves +conclude +concluded +concludes +concluding +conclusion +conclusions +conclusive +conclusively +conclusiveness +concoct +concocted +concocting +concoction +concoctions +concocts +concomitant +concomitantly +concomitants +concord +concordance +concordances +concordant +concordat +concordats +concourse +concourses +concrete +concreted +concretely +concreteness +concretes +concreting +concretion +concretions +concubinage +concubine +concubines +concupiscence +concupiscent +concur +concurred +concurrence +concurrences +concurrent +concurrently +concurring +concurs +concuss +concussed +concusses +concussing +concussion +concussions +concussive +condemn +condemnation +condemnations +condemnatory +condemned +condemner +condemners +condemning +condemns +condensate +condensates +condensation +condensations +condense +condensed +condenser +condensers +condenses +condensing +condescend +condescended +condescending +condescendingly +condescends +condescension +condign +condiment +condiments +condition +conditional +conditionally +conditionals +conditioned +conditioner +conditioners +conditioning +conditions +condo +condoes +condole +condoled +condolence +condolences +condoles +condoling +condom +condominium +condominiums +condoms +condone +condoned +condones +condoning +condor +condors +condos +conduce +conduced +conduces +conducing +conducive +conduct +conductance +conducted +conductibility +conductible +conducting +conduction +conductive +conductivity +conductor +conductors +conductress +conductresses +conducts +conduit +conduits +cone +cones +coney +coneys +confab +confabbed +confabbing +confabs +confabulate +confabulated +confabulates +confabulating +confabulation +confabulations +confection +confectioner +confectioneries +confectioners +confectionery +confections +confederacies +confederacy +confederate +confederated +confederates +confederating +confederation +confederations +confer +conferee +conferees +conference +conferences +conferment +conferments +conferrable +conferral +conferred +conferrer +conferrers +conferring +confers +confess +confessed +confessedly +confesses +confessing +confession +confessional +confessionals +confessions +confessor +confessors +confetti +confidant +confidante +confidantes +confidants +confide +confided +confidence +confidences +confident +confidential +confidentiality +confidentially +confidently +confider +confiders +confides +confiding +configuration +configurations +configure +configured +configures +configuring +confine +confined +confinement +confinements +confines +confining +confirm +confirmation +confirmations +confirmed +confirming +confirms +confiscate +confiscated +confiscates +confiscating +confiscation +confiscations +confiscator +confiscators +confiscatory +conflagration +conflagrations +conflate +conflated +conflates +conflating +conflation +conflations +conflict +conflicted +conflicting +conflicts +confluence +confluences +confluent +conform +conformable +conformance +conformation +conformations +conformed +conformer +conformers +conforming +conformism +conformist +conformists +conformity +conforms +confound +confounded +confounding +confounds +confraternities +confraternity +confrere +confreres +confront +confrontation +confrontational +confrontations +confronted +confronting +confronts +confuse +confused +confusedly +confuses +confusing +confusingly +confusion +confutation +confute +confuted +confutes +confuting +conga +congaed +congaing +congas +congeal +congealed +congealing +congealment +congeals +congenial +congeniality +congenially +congenital +congenitally +conger +congeries +congers +congest +congested +congesting +congestion +congestive +congests +conglomerate +conglomerated +conglomerates +conglomerating +conglomeration +conglomerations +congrats +congratulate +congratulated +congratulates +congratulating +congratulation +congratulations +congratulatory +congregant +congregants +congregate +congregated +congregates +congregating +congregation +congregational +congregationalism +congregationalist +congregationalists +congregations +congress +congresses +congressional +congressman +congressmen +congressperson +congresspersons +congresswoman +congresswomen +congruence +congruent +congruently +congruities +congruity +congruous +conic +conical +conically +conics +conies +conifer +coniferous +conifers +conjectural +conjecture +conjectured +conjectures +conjecturing +conjoin +conjoined +conjoiner +conjoiners +conjoining +conjoins +conjoint +conjointly +conjugal +conjugally +conjugate +conjugated +conjugates +conjugating +conjugation +conjugations +conjunct +conjunction +conjunctions +conjunctiva +conjunctivae +conjunctivas +conjunctive +conjunctives +conjunctivitis +conjuncts +conjuncture +conjunctures +conjuration +conjurations +conjure +conjured +conjurer +conjurers +conjures +conjuring +conjuror +conjurors +conk +conked +conking +conks +conman +conmen +connect +connectable +connected +connecter +connecters +connectible +connecting +connection +connections +connective +connectives +connectivity +connector +connectors +connects +conned +connexion +connexions +conning +conniption +conniptions +connivance +connive +connived +conniver +connivers +connives +conniving +connoisseur +connoisseurs +connotation +connotations +connotative +connote +connoted +connotes +connoting +connubial +conquer +conquerable +conquered +conquering +conqueror +conquerors +conquers +conquest +conquests +conquistador +conquistadores +conquistadors +cons +consanguineous +consanguinity +conscience +conscienceless +consciences +conscientious +conscientiously +conscientiousness +conscious +consciously +consciousness +consciousnesses +conscript +conscripted +conscripting +conscription +conscripts +consecrate +consecrated +consecrates +consecrating +consecration +consecrations +consecutive +consecutively +consensual +consensus +consensuses +consent +consented +consenting +consents +consequence +consequences +consequent +consequential +consequentially +consequently +conservancies +conservancy +conservation +conservationism +conservationist +conservationists +conservatism +conservative +conservatively +conservatives +conservator +conservatories +conservators +conservatory +conserve +conserved +conserves +conserving +consider +considerable +considerably +considerate +considerately +considerateness +consideration +considerations +considered +considering +considers +consign +consigned +consignee +consignees +consigning +consignment +consignments +consignor +consignors +consigns +consist +consisted +consistence +consistences +consistencies +consistency +consistent +consistently +consisting +consistories +consistory +consists +consolable +consolation +consolations +consolatory +console +consoled +consoles +consolidate +consolidated +consolidates +consolidating +consolidation +consolidations +consolidator +consolidators +consoling +consolingly +consomme +consonance +consonances +consonant +consonantly +consonants +consort +consorted +consortia +consorting +consortium +consortiums +consorts +conspectus +conspectuses +conspicuous +conspicuously +conspicuousness +conspiracies +conspiracy +conspirator +conspiratorial +conspiratorially +conspirators +conspire +conspired +conspires +conspiring +constable +constables +constabularies +constabulary +constancy +constant +constantly +constants +constellation +constellations +consternation +constipate +constipated +constipates +constipating +constipation +constituencies +constituency +constituent +constituents +constitute +constituted +constitutes +constituting +constitution +constitutional +constitutionality +constitutionally +constitutionals +constitutions +constitutive +constrain +constrained +constraining +constrains +constraint +constraints +constrict +constricted +constricting +constriction +constrictions +constrictive +constrictor +constrictors +constricts +construable +construct +constructed +constructing +construction +constructional +constructionist +constructionists +constructions +constructive +constructively +constructiveness +constructor +constructors +constructs +construe +construed +construes +construing +consubstantiation +consul +consular +consulate +consulates +consuls +consulship +consult +consultancies +consultancy +consultant +consultants +consultation +consultations +consultative +consulted +consulting +consults +consumable +consumables +consume +consumed +consumer +consumerism +consumerist +consumerists +consumers +consumes +consuming +consummate +consummated +consummately +consummates +consummating +consummation +consummations +consumption +consumptive +consumptives +contact +contacted +contacting +contacts +contagion +contagions +contagious +contagiously +contagiousness +contain +containable +contained +container +containerization +containerize +containerized +containerizes +containerizing +containers +containing +containment +contains +contaminant +contaminants +contaminate +contaminated +contaminates +contaminating +contamination +contaminator +contaminators +contemn +contemned +contemning +contemns +contemplate +contemplated +contemplates +contemplating +contemplation +contemplative +contemplatives +contemporaneity +contemporaneous +contemporaneously +contemporaries +contemporary +contempt +contemptible +contemptibly +contemptuous +contemptuously +contemptuousness +contend +contended +contender +contenders +contending +contends +content +contented +contentedly +contentedness +contenting +contention +contentions +contentious +contentiously +contentiousness +contently +contentment +contents +conterminous +conterminously +contest +contestable +contestant +contestants +contested +contesting +contests +context +contexts +contextual +contextualize +contextualized +contextualizes +contextualizing +contextually +contiguity +contiguous +contiguously +continence +continent +continental +continentals +continents +contingencies +contingency +contingent +contingently +contingents +continua +continual +continually +continuance +continuances +continuation +continuations +continue +continued +continues +continuing +continuity +continuous +continuously +continuum +continuums +contort +contorted +contorting +contortion +contortionist +contortionists +contortions +contorts +contour +contoured +contouring +contours +contraband +contraception +contraceptive +contraceptives +contract +contracted +contractible +contractile +contracting +contraction +contractions +contractor +contractors +contracts +contractual +contractually +contradict +contradicted +contradicting +contradiction +contradictions +contradictory +contradicts +contradistinction +contradistinctions +contrail +contrails +contraindicate +contraindicated +contraindicates +contraindicating +contraindication +contraindications +contralto +contraltos +contraption +contraptions +contrapuntal +contrapuntally +contraries +contrariety +contrarily +contrariness +contrariwise +contrary +contrast +contrasted +contrasting +contrasts +contravene +contravened +contravenes +contravening +contravention +contraventions +contretemps +contribute +contributed +contributes +contributing +contribution +contributions +contributor +contributors +contributory +contrite +contritely +contriteness +contrition +contrivance +contrivances +contrive +contrived +contriver +contrivers +contrives +contriving +control +controllable +controlled +controller +controllers +controlling +controls +controversial +controversially +controversies +controversy +controvert +controverted +controvertible +controverting +controverts +contumacious +contumaciously +contumacy +contumelies +contumelious +contumely +contuse +contused +contuses +contusing +contusion +contusions +conundrum +conundrums +conurbation +conurbations +convalesce +convalesced +convalescence +convalescences +convalescent +convalescents +convalesces +convalescing +convection +convectional +convective +convene +convened +convener +conveners +convenes +convenience +conveniences +convenient +conveniently +convening +convent +conventicle +conventicles +convention +conventional +conventionality +conventionalize +conventionalized +conventionalizes +conventionalizing +conventionally +conventions +convents +converge +converged +convergence +convergences +convergent +converges +converging +conversant +conversation +conversational +conversationalist +conversationalists +conversationally +conversations +converse +conversed +conversely +converses +conversing +conversion +conversions +convert +converted +converter +converters +convertibility +convertible +convertibles +converting +convertor +convertors +converts +convex +convexity +convexly +convey +conveyable +conveyance +conveyances +conveyed +conveyer +conveyers +conveying +conveyor +conveyors +conveys +convict +convicted +convicting +conviction +convictions +convicts +convince +convinced +convinces +convincing +convincingly +convivial +conviviality +convivially +convocation +convocations +convoke +convoked +convokes +convoking +convoluted +convolution +convolutions +convoy +convoyed +convoying +convoys +convulse +convulsed +convulses +convulsing +convulsion +convulsions +convulsive +convulsively +cony +cooed +cooing +cook +cookbook +cookbooks +cooked +cooker +cookeries +cookers +cookery +cookie +cookies +cooking +cookout +cookouts +cooks +cookware +cookwares +cooky +cool +coolant +coolants +cooled +cooler +coolers +coolest +coolie +coolies +cooling +coolly +coolness +cools +coon +coons +coonskin +coonskins +coop +cooped +cooper +cooperage +cooperate +cooperated +cooperates +cooperating +cooperation +cooperative +cooperatively +cooperativeness +cooperatives +cooperator +cooperators +coopered +coopering +coopers +cooping +coops +coordinate +coordinated +coordinately +coordinates +coordinating +coordination +coordinator +coordinators +coos +coot +cootie +cooties +coots +copacetic +copay +cope +coped +copes +copied +copier +copiers +copies +copilot +copilots +coping +copings +copious +copiously +copiousness +copped +copper +copperhead +copperheads +copperplate +coppers +coppery +coppice +coppices +copping +copra +cops +copse +copses +copter +copters +copula +copulae +copulas +copulate +copulated +copulates +copulating +copulation +copulative +copulatives +copy +copybook +copybooks +copycat +copycats +copycatted +copycatting +copying +copyist +copyists +copyright +copyrighted +copyrighting +copyrights +copywriter +copywriters +coquetries +coquetry +coquette +coquetted +coquettes +coquetting +coquettish +coquettishly +coracle +coracles +coral +corals +corbel +corbels +cord +cordage +corded +cordial +cordiality +cordially +cordials +cordillera +cordilleras +cording +cordite +cordless +cordon +cordoned +cordoning +cordons +cordovan +cords +corduroy +corduroys +core +cored +corer +corers +cores +corespondent +corespondents +corgi +corgis +coriander +coring +cork +corked +corker +corkers +corking +corks +corkscrew +corkscrewed +corkscrewing +corkscrews +corm +cormorant +cormorants +corms +corn +cornball +cornballs +cornbread +corncob +corncobs +cornea +corneal +corneas +corned +corner +cornered +cornering +corners +cornerstone +cornerstones +cornet +cornets +cornflakes +cornflower +cornflowers +cornice +cornices +cornier +corniest +cornily +corniness +corning +cornmeal +cornrow +cornrowed +cornrowing +cornrows +corns +cornstalk +cornstalks +cornstarch +cornucopia +cornucopias +corny +corolla +corollaries +corollary +corollas +corona +coronae +coronal +coronals +coronaries +coronary +coronas +coronation +coronations +coroner +coroners +coronet +coronets +corpora +corporal +corporals +corporate +corporately +corporation +corporations +corporeal +corporeality +corporeally +corps +corpse +corpses +corpsman +corpsmen +corpulence +corpulent +corpus +corpuscle +corpuscles +corpuscular +corpuses +corral +corralled +corralling +corrals +correct +correctable +corrected +correcter +correctest +correcting +correction +correctional +corrections +corrective +correctives +correctly +correctness +corrects +correlate +correlated +correlates +correlating +correlation +correlations +correlative +correlatives +correspond +corresponded +correspondence +correspondences +correspondent +correspondents +corresponding +correspondingly +corresponds +corridor +corridors +corroborate +corroborated +corroborates +corroborating +corroboration +corroborations +corroborative +corroborator +corroborators +corroboratory +corrode +corroded +corrodes +corroding +corrosion +corrosive +corrosively +corrosives +corrugate +corrugated +corrugates +corrugating +corrugation +corrugations +corrupt +corrupted +corrupter +corruptest +corruptibility +corruptible +corrupting +corruption +corruptions +corruptly +corruptness +corrupts +corsage +corsages +corsair +corsairs +corset +corseted +corseting +corsets +cortege +corteges +cortex +cortexes +cortical +cortices +cortisone +corundum +coruscate +coruscated +coruscates +coruscating +coruscation +corvette +corvettes +cosier +cosies +cosiest +cosign +cosignatories +cosignatory +cosigned +cosigner +cosigners +cosigning +cosigns +cosily +cosine +cosines +cosiness +cosmetic +cosmetically +cosmetician +cosmeticians +cosmetics +cosmetologist +cosmetologists +cosmetology +cosmic +cosmically +cosmogonies +cosmogonist +cosmogonists +cosmogony +cosmological +cosmologies +cosmologist +cosmologists +cosmology +cosmonaut +cosmonauts +cosmopolitan +cosmopolitanism +cosmopolitans +cosmos +cosmoses +cosponsor +cosponsored +cosponsoring +cosponsors +cosset +cosseted +cosseting +cossets +cost +costar +costarred +costarring +costars +costed +costing +costlier +costliest +costliness +costly +costs +costume +costumed +costumer +costumers +costumes +costuming +cosy +cotangent +cotangents +cote +coterie +coteries +coterminous +cotes +cotillion +cotillions +cots +cottage +cottager +cottagers +cottages +cottar +cottars +cotter +cotters +cotton +cottoned +cottoning +cottonmouth +cottonmouths +cottons +cottonseed +cottonseeds +cottontail +cottontails +cottonwood +cottonwoods +cottony +cotyledon +cotyledons +couch +couched +couches +couching +cougar +cougars +cough +coughed +coughing +coughs +could +coulee +coulees +coulomb +coulombs +council +councillor +councillors +councilman +councilmen +councilor +councilors +councilperson +councilpersons +councils +councilwoman +councilwomen +counsel +counseled +counseling +counselled +counselling +counsellor +counsellors +counselor +counselors +counsels +count +countable +countdown +countdowns +counted +countenance +countenanced +countenances +countenancing +counter +counteract +counteracted +counteracting +counteraction +counteractions +counteractive +counteracts +counterattack +counterattacked +counterattacking +counterattacks +counterbalance +counterbalanced +counterbalances +counterbalancing +counterclaim +counterclaimed +counterclaiming +counterclaims +counterclockwise +counterculture +countered +counterespionage +counterfeit +counterfeited +counterfeiter +counterfeiters +counterfeiting +counterfeits +counterfoil +counterfoils +countering +counterinsurgencies +counterinsurgency +counterintelligence +counterman +countermand +countermanded +countermanding +countermands +countermeasure +countermeasures +countermen +counteroffensive +counteroffensives +counteroffer +counteroffered +counteroffering +counteroffers +counterpane +counterpanes +counterpart +counterparts +counterpoint +counterpoints +counterpoise +counterpoised +counterpoises +counterpoising +counterproductive +counterrevolution +counterrevolutionaries +counterrevolutionary +counterrevolutions +counters +countersank +countersign +countersignature +countersignatures +countersigned +countersigning +countersigns +countersink +countersinking +countersinks +counterspies +counterspy +countersunk +countertenor +countertenors +countervail +countervailed +countervailing +countervails +counterweight +counterweights +countess +countesses +counties +counting +countless +countries +countrified +country +countryman +countrymen +countryside +countrysides +countrywoman +countrywomen +counts +county +coup +coupe +coupes +couple +coupled +couples +couplet +couplets +coupling +couplings +coupon +coupons +coups +courage +courageous +courageously +courageousness +courier +couriered +couriering +couriers +course +coursed +courser +coursers +courses +coursing +court +courted +courteous +courteously +courteousness +courtesan +courtesans +courtesies +courtesy +courthouse +courthouses +courtier +courtiers +courting +courtlier +courtliest +courtliness +courtly +courtroom +courtrooms +courts +courtship +courtships +courtyard +courtyards +couscous +cousin +cousins +couture +couturier +couturiers +cove +coven +covenant +covenanted +covenanting +covenants +covens +cover +coverage +coverall +coveralls +covered +covering +coverings +coverlet +coverlets +covers +covert +covertly +covertness +coverts +coverup +coverups +coves +covet +coveted +coveting +covetous +covetously +covetousness +covets +covey +coveys +coward +cowardice +cowardliness +cowardly +cowards +cowbell +cowbells +cowbird +cowbirds +cowboy +cowboys +cowcatcher +cowcatchers +cowed +cower +cowered +cowering +cowers +cowgirl +cowgirls +cowhand +cowhands +cowherd +cowherds +cowhide +cowhides +cowing +cowl +cowlick +cowlicks +cowling +cowlings +cowls +cowman +cowmen +coworker +coworkers +cowpoke +cowpokes +cowpox +cowpuncher +cowpunchers +cowrie +cowries +cows +cowslip +cowslips +coxcomb +coxcombs +coxswain +coxswains +coyer +coyest +coyly +coyness +coyote +coyotes +coypu +coypus +cozen +cozenage +cozened +cozening +cozens +cozier +cozies +coziest +cozily +coziness +cozy +crab +crabbed +crabber +crabbers +crabbier +crabbiest +crabbily +crabbiness +crabbing +crabby +crabgrass +crablike +crabs +crack +crackdown +crackdowns +cracked +cracker +crackerjack +crackerjacks +crackers +crackhead +crackheads +cracking +crackle +crackled +crackles +crackling +cracklings +crackly +crackpot +crackpots +cracks +crackup +crackups +cradle +cradled +cradles +cradling +craft +crafted +craftier +craftiest +craftily +craftiness +crafting +crafts +craftsman +craftsmanship +craftsmen +craftswoman +craftswomen +crafty +crag +craggier +craggiest +cragginess +craggy +crags +cram +crammed +cramming +cramp +cramped +cramping +crampon +crampons +cramps +crams +cranberries +cranberry +crane +craned +cranes +crania +cranial +craning +cranium +craniums +crank +crankcase +crankcases +cranked +crankier +crankiest +crankily +crankiness +cranking +cranks +crankshaft +crankshafts +cranky +crannied +crannies +cranny +crap +crape +crapes +crapped +crappie +crappier +crappies +crappiest +crapping +crappy +craps +crapshooter +crapshooters +crash +crashed +crashes +crashing +crass +crasser +crassest +crassly +crassness +crate +crated +crater +cratered +cratering +craters +crates +crating +cravat +cravats +crave +craved +craven +cravenly +cravenness +cravens +craves +craving +cravings +craw +crawdad +crawdads +crawfish +crawfishes +crawl +crawled +crawler +crawlers +crawlier +crawlies +crawliest +crawling +crawls +crawlspace +crawlspaces +crawly +craws +crayfish +crayfishes +crayon +crayoned +crayoning +crayons +craze +crazed +crazes +crazier +crazies +craziest +crazily +craziness +crazing +crazy +creak +creaked +creakier +creakiest +creakily +creakiness +creaking +creaks +creaky +cream +creamed +creamer +creameries +creamers +creamery +creamier +creamiest +creamily +creaminess +creaming +creams +creamy +crease +creased +creases +creasing +create +created +creates +creating +creation +creationism +creationist +creationists +creations +creative +creatively +creativeness +creatives +creativity +creator +creators +creature +creatures +creche +creches +credence +credential +credentials +credenza +credenzas +credibility +credible +credibly +credit +creditable +creditably +credited +crediting +creditor +creditors +credits +credo +credos +credulity +credulous +credulously +credulousness +creed +creeds +creek +creeks +creel +creels +creep +creeped +creeper +creepers +creepier +creepiest +creepily +creepiness +creeping +creeps +creepy +cremains +cremate +cremated +cremates +cremating +cremation +cremations +crematoria +crematories +crematorium +crematoriums +crematory +creme +cremes +crenelate +crenelated +crenelates +crenelating +crenelation +crenelations +crenellate +crenellated +crenellates +crenellating +crenellation +crenellations +creole +creoles +creosote +creosoted +creosotes +creosoting +crepe +crepes +crept +crescendi +crescendo +crescendos +crescent +crescents +cress +crest +crested +crestfallen +cresting +crestless +crests +cretaceous +cretin +cretinism +cretinous +cretins +cretonne +crevasse +crevasses +crevice +crevices +crew +crewed +crewel +crewelwork +crewing +crewman +crewmen +crews +crib +cribbage +cribbed +cribber +cribbers +cribbing +cribs +crick +cricked +cricket +cricketer +cricketers +crickets +cricking +cricks +cried +crier +criers +cries +crime +crimes +criminal +criminality +criminally +criminals +criminologist +criminologists +criminology +crimp +crimped +crimping +crimps +crimson +crimsoned +crimsoning +crimsons +cringe +cringed +cringes +cringing +crinkle +crinkled +crinkles +crinklier +crinkliest +crinkling +crinkly +crinoline +crinolines +cripple +crippled +crippler +cripplers +cripples +crippling +crises +crisis +crisp +crisped +crisper +crispest +crispier +crispiest +crispiness +crisping +crisply +crispness +crisps +crispy +crisscross +crisscrossed +crisscrosses +crisscrossing +criteria +criterion +criterions +critic +critical +critically +criticism +criticisms +criticize +criticized +criticizer +criticizers +criticizes +criticizing +critics +critique +critiqued +critiques +critiquing +critter +critters +croak +croaked +croakier +croakiest +croaking +croaks +croaky +crochet +crocheted +crocheter +crocheters +crocheting +crochets +croci +crock +crocked +crockery +crocks +crocodile +crocodiles +crocus +crocuses +croissant +croissants +crone +crones +cronies +crony +cronyism +crook +crooked +crookeder +crookedest +crookedly +crookedness +crooking +crookneck +crooknecks +crooks +croon +crooned +crooner +crooners +crooning +croons +crop +cropland +croplands +cropped +cropper +croppers +cropping +crops +croquet +croquette +croquettes +crosier +crosiers +cross +crossbar +crossbars +crossbeam +crossbeams +crossbones +crossbow +crossbowman +crossbowmen +crossbows +crossbred +crossbreed +crossbreeding +crossbreeds +crosscheck +crosschecked +crosschecking +crosschecks +crosscurrent +crosscurrents +crosscut +crosscuts +crosscutting +crossed +crosser +crosses +crossest +crossfire +crossfires +crosshatch +crosshatched +crosshatches +crosshatching +crossing +crossings +crossly +crossness +crossover +crossovers +crosspatch +crosspatches +crosspiece +crosspieces +crossroad +crossroads +crosstown +crosswalk +crosswalks +crossways +crosswind +crosswinds +crosswise +crossword +crosswords +crotch +crotches +crotchet +crotchets +crotchety +crouch +crouched +crouches +crouching +croup +croupier +croupiers +croupiest +croupy +crouton +croutons +crow +crowbar +crowbars +crowd +crowded +crowding +crowds +crowed +crowfeet +crowfoot +crowfoots +crowing +crown +crowned +crowning +crowns +crows +crozier +croziers +cruces +crucial +crucially +crucible +crucibles +crucified +crucifies +crucifix +crucifixes +crucifixion +crucifixions +cruciform +cruciforms +crucify +crucifying +crud +cruddier +cruddiest +cruddy +crude +crudely +crudeness +cruder +crudest +crudites +crudities +crudity +cruel +crueler +cruelest +crueller +cruellest +cruelly +cruelness +cruelties +cruelty +cruet +cruets +cruise +cruised +cruiser +cruisers +cruises +cruising +cruller +crullers +crumb +crumbed +crumbier +crumbiest +crumbing +crumble +crumbled +crumbles +crumblier +crumbliest +crumbliness +crumbling +crumbly +crumbs +crumby +crummier +crummiest +crumminess +crummy +crumpet +crumpets +crumple +crumpled +crumples +crumpling +crunch +crunched +crunches +crunchier +crunchiest +crunchiness +crunching +crunchy +crupper +cruppers +crusade +crusaded +crusader +crusaders +crusades +crusading +cruse +cruses +crush +crushed +crusher +crushers +crushes +crushing +crust +crustacean +crustaceans +crustal +crusted +crustier +crustiest +crustily +crustiness +crusting +crusts +crusty +crutch +crutches +crux +cruxes +crybabies +crybaby +crying +cryogenic +cryogenics +cryosurgery +crypt +cryptic +cryptically +cryptogram +cryptograms +cryptographer +cryptographers +cryptography +crypts +crystal +crystalline +crystallization +crystallize +crystallized +crystallizes +crystallizing +crystals +cubbyhole +cubbyholes +cube +cubed +cuber +cubers +cubes +cubic +cubical +cubicle +cubicles +cubing +cubism +cubist +cubists +cubit +cubits +cubs +cuckold +cuckolded +cuckolding +cuckoldry +cuckolds +cuckoo +cuckoos +cucumber +cucumbers +cuddle +cuddled +cuddles +cuddlier +cuddliest +cuddling +cuddly +cudgel +cudgeled +cudgeling +cudgelled +cudgelling +cudgels +cuds +cued +cueing +cues +cuff +cuffed +cuffing +cufflink +cufflinks +cuffs +cuing +cuisine +cuisines +culinary +cull +culled +cullender +cullenders +culling +culls +culminate +culminated +culminates +culminating +culmination +culminations +culotte +culottes +culpability +culpable +culpably +culprit +culprits +cult +cultism +cultist +cultists +cultivable +cultivatable +cultivate +cultivated +cultivates +cultivating +cultivation +cultivator +cultivators +cults +cultural +culturally +culture +cultured +cultures +culturing +culvert +culverts +cumber +cumbered +cumbering +cumbers +cumbersome +cumbersomeness +cumbrous +cumin +cummed +cummerbund +cummerbunds +cumming +cumquat +cumquats +cums +cumulative +cumulatively +cumuli +cumulonimbi +cumulonimbus +cumulonimbuses +cumulus +cuneiform +cunnilingus +cunning +cunninger +cunningest +cunningly +cunt +cunts +cupboard +cupboards +cupcake +cupcakes +cupful +cupfuls +cupid +cupidity +cupids +cupola +cupolaed +cupolas +cupped +cupping +cupric +cups +cupsful +curability +curable +curacies +curacy +curare +curate +curated +curates +curating +curative +curatives +curator +curatorial +curators +curb +curbed +curbing +curbs +curbstone +curbstones +curd +curdle +curdled +curdles +curdling +curds +cure +cured +curer +curers +cures +curettage +curfew +curfews +curia +curiae +curie +curies +curing +curio +curios +curiosities +curiosity +curious +curiously +curiousness +curium +curl +curled +curler +curlers +curlew +curlews +curlicue +curlicued +curlicues +curlicuing +curlier +curliest +curliness +curling +curls +curly +curlycue +curlycues +curmudgeon +curmudgeonly +curmudgeons +currant +currants +currencies +currency +current +currently +currents +curricula +curricular +curriculum +curriculums +curried +curries +curry +currycomb +currycombed +currycombing +currycombs +currying +curs +curse +cursed +cursedly +curses +cursing +cursive +cursively +cursor +cursorily +cursoriness +cursors +cursory +curst +curt +curtail +curtailed +curtailing +curtailment +curtailments +curtails +curtain +curtained +curtaining +curtains +curter +curtest +curtly +curtness +curtsey +curtseyed +curtseying +curtseys +curtsied +curtsies +curtsy +curtsying +curvaceous +curvaceousness +curvacious +curvature +curvatures +curve +curved +curves +curvier +curviest +curving +curvy +cushier +cushiest +cushion +cushioned +cushioning +cushions +cushy +cusp +cuspid +cuspidor +cuspidors +cuspids +cusps +cuss +cussed +cusses +cussing +custard +custards +custodial +custodian +custodians +custodianship +custody +custom +customarily +customary +customer +customers +customhouse +customhouses +customization +customize +customized +customizes +customizing +customs +cutaneous +cutaway +cutaways +cutback +cutbacks +cute +cutely +cuteness +cuter +cutesie +cutesier +cutesiest +cutest +cutesy +cuticle +cuticles +cutie +cuties +cutlas +cutlases +cutlass +cutlasses +cutler +cutlers +cutlery +cutlet +cutlets +cutoff +cutoffs +cutout +cutouts +cuts +cutter +cutters +cutthroat +cutthroats +cutting +cuttingly +cuttings +cuttlefish +cuttlefishes +cutup +cutups +cutworm +cutworms +cyan +cyanide +cybernetic +cybernetics +cyberpunk +cyberpunks +cyberspace +cyborg +cyborgs +cyclamen +cyclamens +cycle +cycled +cycles +cyclic +cyclical +cyclically +cycling +cyclist +cyclists +cyclometer +cyclometers +cyclone +cyclones +cyclonic +cyclopaedia +cyclopaedias +cyclopedia +cyclopedias +cyclopes +cyclops +cyclotron +cyclotrons +cyder +cyders +cygnet +cygnets +cylinder +cylinders +cylindrical +cymbal +cymbalist +cymbalists +cymbals +cynic +cynical +cynically +cynicism +cynics +cynosure +cynosures +cypher +cyphered +cyphering +cyphers +cypress +cypresses +cyst +cystic +cysts +cytologist +cytologists +cytology +cytoplasm +cytoplasmic +cytosine +czar +czarina +czarinas +czarist +czarists +czars +dabbed +dabber +dabbers +dabbing +dabble +dabbled +dabbler +dabblers +dabbles +dabbling +dabs +dace +daces +dacha +dachas +dachshund +dachshunds +dactyl +dactylic +dactylics +dactyls +dadaism +dadaist +dadaists +daddies +daddy +dado +dadoes +dados +dads +daemon +daemonic +daemons +daffier +daffiest +daffiness +daffodil +daffodils +daffy +daft +dafter +daftest +daftly +daftness +dagger +daggers +daguerreotype +daguerreotyped +daguerreotypes +daguerreotyping +dahlia +dahlias +dailies +dailiness +daily +daintier +dainties +daintiest +daintily +daintiness +dainty +daiquiri +daiquiris +dairies +dairy +dairying +dairymaid +dairymaids +dairyman +dairymen +dairywoman +dairywomen +dais +daises +daisies +daisy +dale +dales +dalliance +dalliances +dallied +dallier +dalliers +dallies +dally +dallying +dalmatian +dalmatians +damage +damageable +damaged +damages +damaging +damask +damasked +damasking +damasks +dame +dames +dammed +damming +dammit +damn +damnable +damnably +damnation +damndest +damned +damnedest +damning +damns +damp +damped +dampen +dampened +dampener +dampeners +dampening +dampens +damper +dampers +dampest +damping +damply +dampness +damps +dams +damsel +damselflies +damselfly +damsels +damson +damsons +dance +danced +dancer +dancers +dances +dancing +dandelion +dandelions +dander +dandier +dandies +dandiest +dandified +dandifies +dandify +dandifying +dandle +dandled +dandles +dandling +dandruff +dandy +dang +danged +danger +dangerous +dangerously +dangers +danging +dangle +dangled +dangler +danglers +dangles +dangling +dangs +danish +danishes +dank +danker +dankest +dankly +dankness +danseuse +danseuses +dapper +dapperer +dapperest +dapple +dappled +dapples +dappling +dare +dared +daredevil +daredevilry +daredevils +darer +darers +dares +daresay +daring +daringly +dark +darken +darkened +darkener +darkeners +darkening +darkens +darker +darkest +darkly +darkness +darkroom +darkrooms +darling +darlingest +darlings +darn +darned +darneder +darnedest +darner +darners +darning +darns +dart +dartboard +dartboards +darted +darter +darters +darting +darts +dash +dashboard +dashboards +dashed +dasher +dashers +dashes +dashiki +dashikis +dashing +dashingly +dastard +dastardliness +dastardly +dastards +data +databank +databanks +database +databases +date +dated +dateless +dateline +datelined +datelines +datelining +dater +daters +dates +dating +dative +datives +datum +daub +daubed +dauber +daubers +daubing +daubs +daughter +daughterly +daughters +daunt +daunted +daunting +dauntingly +dauntless +dauntlessly +dauntlessness +daunts +dauphin +dauphins +davenport +davenports +davit +davits +dawdle +dawdled +dawdler +dawdlers +dawdles +dawdling +dawn +dawned +dawning +dawns +daybed +daybeds +daybreak +daycare +daydream +daydreamed +daydreamer +daydreamers +daydreaming +daydreams +daydreamt +daylight +daylights +days +daytime +daze +dazed +dazedly +dazes +dazing +dazzle +dazzled +dazzler +dazzlers +dazzles +dazzling +dazzlingly +deacon +deaconess +deaconesses +deacons +deactivate +deactivated +deactivates +deactivating +deactivation +dead +deadbeat +deadbeats +deadbolt +deadbolts +deaden +deadened +deadening +deadens +deader +deadest +deadlier +deadliest +deadline +deadlines +deadliness +deadlock +deadlocked +deadlocking +deadlocks +deadly +deadpan +deadpanned +deadpanning +deadpans +deadweight +deadweights +deadwood +deaf +deafen +deafened +deafening +deafeningly +deafens +deafer +deafest +deafness +deal +dealer +dealers +dealership +dealerships +dealing +dealings +deals +dealt +dean +deaneries +deanery +deans +deanship +dear +dearer +dearest +dearie +dearies +dearly +dearness +dears +dearth +dearths +deary +death +deathbed +deathbeds +deathblow +deathblows +deathless +deathlessly +deathlike +deathly +deaths +deathtrap +deathtraps +deathwatch +deathwatches +debacle +debacles +debar +debark +debarkation +debarked +debarking +debarks +debarment +debarred +debarring +debars +debase +debased +debasement +debasements +debases +debasing +debatable +debate +debated +debater +debaters +debates +debating +debauch +debauched +debauchee +debauchees +debaucheries +debauchery +debauches +debauching +debenture +debentures +debilitate +debilitated +debilitates +debilitating +debilitation +debilities +debility +debit +debited +debiting +debits +debonair +debonaire +debonairly +debonairness +debouch +debouched +debouches +debouching +debrief +debriefed +debriefing +debriefings +debriefs +debris +debs +debt +debtor +debtors +debts +debug +debugged +debugging +debugs +debunk +debunked +debunking +debunks +debut +debutante +debutantes +debuted +debuting +debuts +decade +decadence +decadency +decadent +decadently +decadents +decades +decaf +decaffeinate +decaffeinated +decaffeinates +decaffeinating +decagon +decagons +decal +decals +decamp +decamped +decamping +decampment +decamps +decant +decanted +decanter +decanters +decanting +decants +decapitate +decapitated +decapitates +decapitating +decapitation +decapitations +decapitator +decapitators +decathlon +decathlons +decay +decayed +decaying +decays +decease +deceased +deceases +deceasing +decedent +decedents +deceit +deceitful +deceitfully +deceitfulness +deceits +deceive +deceived +deceiver +deceivers +deceives +deceiving +deceivingly +decelerate +decelerated +decelerates +decelerating +deceleration +decelerator +decelerators +decencies +decency +decennial +decennials +decent +decently +decentralization +decentralize +decentralized +decentralizes +decentralizing +deception +deceptions +deceptive +deceptively +deceptiveness +decibel +decibels +decidable +decide +decided +decidedly +decides +deciding +deciduous +deciliter +deciliters +decimal +decimals +decimate +decimated +decimates +decimating +decimation +decimeter +decimeters +decipher +decipherable +deciphered +deciphering +deciphers +decision +decisions +decisive +decisively +decisiveness +deck +decked +deckhand +deckhands +decking +decks +declaim +declaimed +declaimer +declaimers +declaiming +declaims +declamation +declamations +declamatory +declarable +declaration +declarations +declarative +declaratory +declare +declared +declarer +declarers +declares +declaring +declassification +declassified +declassifies +declassify +declassifying +declension +declensions +declination +decline +declined +decliner +decliners +declines +declining +declivities +declivity +decode +decoded +decoder +decoders +decodes +decoding +decolletage +decolletages +decollete +decolonization +decolonize +decolonized +decolonizes +decolonizing +decommission +decommissioned +decommissioning +decommissions +decompose +decomposed +decomposes +decomposing +decomposition +decompress +decompressed +decompresses +decompressing +decompression +decongestant +decongestants +deconstruction +deconstructions +decontaminate +decontaminated +decontaminates +decontaminating +decontamination +decontrol +decontrolled +decontrolling +decontrols +decor +decorate +decorated +decorates +decorating +decoration +decorations +decorative +decoratively +decorator +decorators +decorous +decorously +decorousness +decors +decorum +decoupage +decoupaged +decoupages +decoupaging +decoy +decoyed +decoying +decoys +decrease +decreased +decreases +decreasing +decreasingly +decree +decreed +decreeing +decrees +decrepit +decrepitude +decrescendi +decrescendo +decrescendos +decried +decries +decriminalization +decriminalize +decriminalized +decriminalizes +decriminalizing +decry +decrying +dedicate +dedicated +dedicates +dedicating +dedication +dedications +dedicator +dedicators +dedicatory +deduce +deduced +deduces +deducible +deducing +deduct +deducted +deductible +deductibles +deducting +deduction +deductions +deductive +deductively +deducts +deed +deeded +deeding +deeds +deejay +deejays +deem +deemed +deeming +deems +deep +deepen +deepened +deepening +deepens +deeper +deepest +deeply +deepness +deeps +deer +deers +deerskin +deescalate +deescalated +deescalates +deescalating +deescalation +deface +defaced +defacement +defacer +defacers +defaces +defacing +defalcate +defalcated +defalcates +defalcating +defalcation +defalcations +defamation +defamatory +defame +defamed +defamer +defamers +defames +defaming +default +defaulted +defaulter +defaulters +defaulting +defaults +defeat +defeated +defeater +defeaters +defeating +defeatism +defeatist +defeatists +defeats +defecate +defecated +defecates +defecating +defecation +defect +defected +defecting +defection +defections +defective +defectively +defectiveness +defectives +defector +defectors +defects +defence +defences +defend +defendant +defendants +defended +defender +defenders +defending +defends +defense +defensed +defenseless +defenselessly +defenselessness +defenses +defensible +defensibly +defensing +defensive +defensively +defensiveness +defer +deference +deferential +deferentially +deferment +deferments +deferral +deferrals +deferred +deferring +defers +deffer +deffest +defiance +defiant +defiantly +deficiencies +deficiency +deficient +deficit +deficits +defied +defies +defile +defiled +defilement +defiler +defilers +defiles +defiling +definable +define +defined +definer +definers +defines +defining +definite +definitely +definiteness +definition +definitions +definitive +definitively +deflate +deflated +deflates +deflating +deflation +deflationary +deflect +deflected +deflecting +deflection +deflections +deflective +deflector +deflectors +deflects +deflower +deflowered +deflowering +deflowers +defog +defogged +defogger +defoggers +defogging +defogs +defoliant +defoliants +defoliate +defoliated +defoliates +defoliating +defoliation +defoliator +defoliators +deforest +deforestation +deforested +deforesting +deforests +deform +deformation +deformations +deformed +deforming +deformities +deformity +deforms +defraud +defrauded +defrauder +defrauders +defrauding +defrauds +defray +defrayal +defrayed +defraying +defrays +defrock +defrocked +defrocking +defrocks +defrost +defrosted +defroster +defrosters +defrosting +defrosts +deft +defter +deftest +deftly +deftness +defunct +defuse +defused +defuses +defusing +defy +defying +degas +degases +degassed +degassing +degeneracy +degenerate +degenerated +degenerates +degenerating +degeneration +degenerative +degradable +degradation +degrade +degraded +degrades +degrading +degree +degrees +dehumanization +dehumanize +dehumanized +dehumanizes +dehumanizing +dehumidified +dehumidifier +dehumidifiers +dehumidifies +dehumidify +dehumidifying +dehydrate +dehydrated +dehydrates +dehydrating +dehydration +dehydrator +dehydrators +dehydrogenate +dehydrogenated +dehydrogenates +dehydrogenating +deice +deiced +deicer +deicers +deices +deicing +deification +deified +deifies +deify +deifying +deign +deigned +deigning +deigns +deism +deist +deistic +deists +deities +deity +deject +dejected +dejectedly +dejecting +dejection +dejects +delay +delayed +delayer +delayers +delaying +delays +delectable +delectably +delectation +delegate +delegated +delegates +delegating +delegation +delegations +delete +deleted +deleterious +deletes +deleting +deletion +deletions +delft +delftware +deli +deliberate +deliberated +deliberately +deliberateness +deliberates +deliberating +deliberation +deliberations +deliberative +delicacies +delicacy +delicate +delicately +delicateness +delicatessen +delicatessens +delicious +deliciously +deliciousness +delight +delighted +delightedly +delightful +delightfully +delighting +delights +delimit +delimitation +delimited +delimiting +delimits +delineate +delineated +delineates +delineating +delineation +delineations +delinquencies +delinquency +delinquent +delinquently +delinquents +deliquesce +deliquesced +deliquescent +deliquesces +deliquescing +deliria +delirious +deliriously +deliriousness +delirium +deliriums +delis +deliver +deliverance +delivered +deliverer +deliverers +deliveries +delivering +delivers +delivery +deliveryman +deliverymen +dell +dells +delouse +deloused +delouses +delousing +delphinia +delphinium +delphiniums +delta +deltas +delude +deluded +deludes +deluding +deluge +deluged +deluges +deluging +delusion +delusional +delusions +delusive +delusively +deluxe +delve +delved +delver +delvers +delves +delving +demagnetization +demagnetize +demagnetized +demagnetizes +demagnetizing +demagog +demagogic +demagogs +demagogue +demagoguery +demagogues +demagogy +demand +demanded +demanding +demands +demarcate +demarcated +demarcates +demarcating +demarcation +demean +demeaned +demeaning +demeanor +demeanour +demeans +demented +dementedly +dementia +demerit +demerits +demesne +demesnes +demigod +demigoddess +demigoddesses +demigods +demijohn +demijohns +demilitarization +demilitarize +demilitarized +demilitarizes +demilitarizing +demimondaine +demimondaines +demimonde +demise +demised +demises +demising +demitasse +demitasses +demo +demobilization +demobilize +demobilized +demobilizes +demobilizing +democracies +democracy +democrat +democratic +democratically +democratization +democratize +democratized +democratizes +democratizing +democrats +demode +demodulate +demodulated +demodulates +demodulating +demodulation +demographer +demographers +demographic +demographically +demographics +demography +demolish +demolished +demolishes +demolishing +demolition +demolitions +demon +demonetization +demonetize +demonetized +demonetizes +demonetizing +demoniac +demoniacal +demoniacally +demonic +demonologies +demonology +demons +demonstrable +demonstrably +demonstrate +demonstrated +demonstrates +demonstrating +demonstration +demonstrations +demonstrative +demonstratively +demonstrativeness +demonstratives +demonstrator +demonstrators +demoralization +demoralize +demoralized +demoralizes +demoralizing +demos +demote +demoted +demotes +demotic +demoting +demotion +demotions +demulcent +demulcents +demur +demure +demurely +demureness +demurer +demurest +demurral +demurrals +demurred +demurrer +demurrers +demurring +demurs +demystification +demystified +demystifies +demystify +demystifying +denationalize +denationalized +denationalizes +denationalizing +denature +denatured +denatures +denaturing +dendrite +dendrites +dengue +deniable +denial +denials +denied +denier +deniers +denies +denigrate +denigrated +denigrates +denigrating +denigration +denim +denims +denizen +denizens +denominate +denominated +denominates +denominating +denomination +denominational +denominations +denominator +denominators +denotation +denotations +denotative +denote +denoted +denotes +denoting +denouement +denouements +denounce +denounced +denouncement +denouncements +denounces +denouncing +dens +dense +densely +denseness +denser +densest +densities +density +dent +dental +dentally +dented +dentifrice +dentifrices +dentin +dentine +denting +dentist +dentistry +dentists +dentition +dents +denture +dentures +denuclearize +denuclearized +denuclearizes +denuclearizing +denudation +denude +denuded +denudes +denuding +denunciation +denunciations +deny +denying +deodorant +deodorants +deodorization +deodorize +deodorized +deodorizer +deodorizers +deodorizes +deodorizing +depart +departed +departing +department +departmental +departmentalization +departmentalize +departmentalized +departmentalizes +departmentalizing +departmentally +departments +departs +departure +departures +depend +dependability +dependable +dependably +dependance +dependant +dependants +depended +dependence +dependencies +dependency +dependent +dependently +dependents +depending +depends +depersonalize +depersonalized +depersonalizes +depersonalizing +depict +depicted +depicting +depiction +depictions +depicts +depilatories +depilatory +deplane +deplaned +deplanes +deplaning +deplete +depleted +depletes +depleting +depletion +deplorable +deplorably +deplore +deplored +deplores +deploring +deploy +deployed +deploying +deployment +deployments +deploys +depolarization +depolarize +depolarized +depolarizes +depolarizing +depoliticize +depoliticized +depoliticizes +depoliticizing +deponent +deponents +depopulate +depopulated +depopulates +depopulating +depopulation +deport +deportation +deportations +deported +deportee +deportees +deporting +deportment +deports +depose +deposed +deposes +deposing +deposit +deposited +depositing +deposition +depositions +depositor +depositories +depositors +depository +deposits +depot +depots +deprave +depraved +depraves +depraving +depravities +depravity +deprecate +deprecated +deprecates +deprecating +deprecation +deprecatory +depreciate +depreciated +depreciates +depreciating +depreciation +depredation +depredations +depress +depressant +depressants +depressed +depresses +depressing +depressingly +depression +depressions +depressive +depressives +depressor +depressors +depressurize +depressurized +depressurizes +depressurizing +deprivation +deprivations +deprive +deprived +deprives +depriving +deprogram +deprogramed +deprograming +deprogrammed +deprogramming +deprograms +depth +depths +deputation +deputations +depute +deputed +deputes +deputies +deputing +deputize +deputized +deputizes +deputizing +deputy +derail +derailed +derailing +derailleur +derailleurs +derailment +derailments +derails +derange +deranged +derangement +deranges +deranging +derbies +derby +deregulate +deregulated +deregulates +deregulating +deregulation +derelict +dereliction +derelicts +deride +derided +derides +deriding +derision +derisive +derisively +derisiveness +derisory +derivation +derivations +derivative +derivatives +derive +derived +derives +deriving +dermal +dermatitis +dermatological +dermatologist +dermatologists +dermatology +dermis +derogate +derogated +derogates +derogating +derogation +derogatorily +derogatory +derrick +derricks +derriere +derrieres +derringer +derringers +dervish +dervishes +desalinate +desalinated +desalinates +desalinating +desalination +desalinization +desalinize +desalinized +desalinizes +desalinizing +desalt +desalted +desalting +desalts +descant +descanted +descanting +descants +descend +descendant +descendants +descended +descendent +descendents +descending +descends +descent +descents +describable +describe +described +describer +describers +describes +describing +descried +descries +description +descriptions +descriptive +descriptively +descriptiveness +descry +descrying +desecrate +desecrated +desecrates +desecrating +desecration +desegregate +desegregated +desegregates +desegregating +desegregation +desensitization +desensitize +desensitized +desensitizes +desensitizing +desert +deserted +deserter +deserters +deserting +desertion +desertions +deserts +deserve +deserved +deservedly +deserves +deserving +deshabille +desiccant +desiccants +desiccate +desiccated +desiccates +desiccating +desiccation +desiccator +desiccators +desiderata +desideratum +design +designate +designated +designates +designating +designation +designations +designed +designer +designers +designing +designs +desirability +desirable +desirableness +desirably +desire +desired +desires +desiring +desirous +desist +desisted +desisting +desists +desk +desks +desktop +desktops +desolate +desolated +desolately +desolateness +desolates +desolating +desolation +despair +despaired +despairing +despairingly +despairs +despatch +despatched +despatches +despatching +desperado +desperadoes +desperados +desperate +desperately +desperateness +desperation +despicable +despicably +despise +despised +despises +despising +despite +despoil +despoiled +despoiler +despoilers +despoiling +despoilment +despoils +despoliation +despondence +despondency +despondent +despondently +despot +despotic +despotically +despotism +despots +dessert +desserts +destabilization +destabilize +destabilized +destabilizes +destabilizing +destination +destinations +destine +destined +destines +destinies +destining +destiny +destitute +destitution +destroy +destroyed +destroyer +destroyers +destroying +destroys +destruct +destructed +destructibility +destructible +destructing +destruction +destructive +destructively +destructiveness +destructs +desuetude +desultorily +desultory +detach +detachable +detached +detaches +detaching +detachment +detachments +detail +detailed +detailing +details +detain +detained +detainee +detainees +detaining +detainment +detains +detect +detectable +detected +detectible +detecting +detection +detective +detectives +detector +detectors +detects +detente +detentes +detention +detentions +deter +detergent +detergents +deteriorate +deteriorated +deteriorates +deteriorating +deterioration +determent +determinable +determinant +determinants +determinate +determination +determinations +determine +determined +determinedly +determiner +determiners +determines +determining +determinism +deterred +deterrence +deterrent +deterrents +deterring +deters +detest +detestable +detestably +detestation +detested +detesting +detests +dethrone +dethroned +dethronement +dethrones +dethroning +detonate +detonated +detonates +detonating +detonation +detonations +detonator +detonators +detour +detoured +detouring +detours +detox +detoxed +detoxes +detoxification +detoxified +detoxifies +detoxify +detoxifying +detoxing +detract +detracted +detracting +detraction +detractor +detractors +detracts +detriment +detrimental +detrimentally +detriments +detritus +deuce +deuces +deuterium +devaluation +devaluations +devalue +devalued +devalues +devaluing +devastate +devastated +devastates +devastating +devastatingly +devastation +devastator +devastators +develop +developed +developer +developers +developing +development +developmental +developmentally +developments +develops +deviance +deviancy +deviant +deviants +deviate +deviated +deviates +deviating +deviation +deviations +device +devices +devil +deviled +deviling +devilish +devilishly +devilishness +devilled +devilling +devilment +devilries +devilry +devils +deviltries +deviltry +devious +deviously +deviousness +devise +devised +devises +devising +devitalize +devitalized +devitalizes +devitalizing +devoid +devolution +devolve +devolved +devolves +devolving +devote +devoted +devotedly +devotee +devotees +devotes +devoting +devotion +devotional +devotionals +devotions +devour +devoured +devouring +devours +devout +devouter +devoutest +devoutly +devoutness +dewberries +dewberry +dewclaw +dewclaws +dewdrop +dewdrops +dewier +dewiest +dewiness +dewlap +dewlaps +dewy +dexterity +dexterous +dexterously +dexterousness +dextrose +dextrous +dhoti +dhotis +dhow +dhows +diabetes +diabetic +diabetics +diabolic +diabolical +diabolically +diacritic +diacritical +diacritics +diadem +diadems +diaereses +diaeresis +diagnose +diagnosed +diagnoses +diagnosing +diagnosis +diagnostic +diagnostically +diagnostician +diagnosticians +diagnostics +diagonal +diagonally +diagonals +diagram +diagramed +diagraming +diagrammatic +diagrammatically +diagrammed +diagramming +diagrams +dial +dialect +dialectal +dialectic +dialectical +dialectics +dialects +dialed +dialing +dialled +dialling +dialog +dialogs +dialogue +dialogues +dials +dialyses +dialysis +diameter +diameters +diametric +diametrical +diametrically +diamond +diamondback +diamondbacks +diamonds +diapason +diapasons +diaper +diapered +diapering +diapers +diaphanous +diaphragm +diaphragmatic +diaphragms +diaries +diarist +diarists +diarrhea +diarrhoea +diary +diaspora +diasporas +diastase +diastole +diastolic +diathermy +diatom +diatomic +diatoms +diatonic +diatribe +diatribes +dibble +dibbled +dibbles +dibbling +dibs +dice +diced +dices +dicey +dichotomies +dichotomous +dichotomy +dicier +diciest +dicing +dick +dicker +dickered +dickering +dickers +dickey +dickeys +dickies +dicks +dicky +dicotyledon +dicotyledonous +dicotyledons +dicta +dictate +dictated +dictates +dictating +dictation +dictations +dictator +dictatorial +dictatorially +dictators +dictatorship +dictatorships +diction +dictionaries +dictionary +dictum +dictums +didactic +didactically +diddle +diddled +diddler +diddlers +diddles +diddling +dido +didoes +didos +didst +died +diehard +diehards +dielectric +dielectrics +diereses +dieresis +dies +diesel +dieseled +dieseling +diesels +diet +dietaries +dietary +dieted +dieter +dieters +dietetic +dietetics +dietician +dieticians +dieting +dietitian +dietitians +diets +differ +differed +difference +differences +different +differential +differentials +differentiate +differentiated +differentiates +differentiating +differentiation +differently +differing +differs +difficult +difficulties +difficultly +difficulty +diffidence +diffident +diffidently +diffraction +diffuse +diffused +diffusely +diffuseness +diffuses +diffusing +diffusion +diffusive +digerati +digest +digested +digestibility +digestible +digesting +digestion +digestions +digestive +digests +digger +diggers +digging +diggings +digit +digital +digitalis +digitally +digitize +digitized +digitizes +digitizing +digits +dignified +dignifies +dignify +dignifying +dignitaries +dignitary +dignities +dignity +digraph +digraphs +digress +digressed +digresses +digressing +digression +digressions +digressive +digs +dike +diked +dikes +diking +dilapidated +dilapidation +dilatation +dilate +dilated +dilates +dilating +dilation +dilator +dilators +dilatory +dilemma +dilemmas +dilettante +dilettantes +dilettanti +dilettantish +dilettantism +diligence +diligent +diligently +dill +dillies +dills +dilly +dillydallied +dillydallies +dillydally +dillydallying +dilute +diluted +dilutes +diluting +dilution +dime +dimension +dimensional +dimensions +dimes +diminish +diminished +diminishes +diminishing +diminuendo +diminuendoes +diminuendos +diminution +diminutions +diminutive +diminutives +dimity +dimly +dimmed +dimmer +dimmers +dimmest +dimming +dimness +dimple +dimpled +dimples +dimpling +dimply +dims +dimwit +dimwits +dimwitted +dinar +dinars +dine +dined +diner +diners +dines +dinette +dinettes +ding +dingbat +dingbats +dingdong +dinged +dinghies +dinghy +dingier +dingiest +dingily +dinginess +dinging +dingle +dingles +dingo +dingoes +dings +dingus +dinguses +dingy +dining +dinkier +dinkies +dinkiest +dinky +dinned +dinner +dinnered +dinnering +dinners +dinnertime +dinnerware +dinning +dinosaur +dinosaurs +dins +dint +diocesan +diocesans +diocese +dioceses +diode +diodes +diorama +dioramas +dioxide +dioxides +dioxin +dioxins +diphtheria +diphthong +diphthongs +diploid +diploids +diploma +diplomacy +diplomas +diplomat +diplomata +diplomatic +diplomatically +diplomatist +diplomatists +diplomats +dipole +dipoles +dipped +dipper +dippers +dippier +dippiest +dipping +dippy +dips +dipsomania +dipsomaniac +dipsomaniacs +dipstick +dipsticks +dipterous +diptych +diptychs +dire +direct +directed +directer +directest +directing +direction +directional +directions +directive +directives +directly +directness +director +directorate +directorates +directorial +directories +directors +directorship +directorships +directory +directs +direful +direly +direr +direst +dirge +dirges +dirigible +dirigibles +dirk +dirks +dirndl +dirndls +dirt +dirtied +dirtier +dirties +dirtiest +dirtily +dirtiness +dirty +dirtying +disabilities +disability +disable +disabled +disablement +disables +disabling +disabuse +disabused +disabuses +disabusing +disadvantage +disadvantaged +disadvantageous +disadvantageously +disadvantages +disadvantaging +disaffect +disaffected +disaffecting +disaffection +disaffects +disaffiliate +disaffiliated +disaffiliates +disaffiliating +disaffiliation +disagree +disagreeable +disagreeableness +disagreeably +disagreed +disagreeing +disagreement +disagreements +disagrees +disallow +disallowed +disallowing +disallows +disappear +disappearance +disappearances +disappeared +disappearing +disappears +disappoint +disappointed +disappointing +disappointingly +disappointment +disappointments +disappoints +disapprobation +disapproval +disapprove +disapproved +disapproves +disapproving +disapprovingly +disarm +disarmament +disarmed +disarming +disarmingly +disarms +disarrange +disarranged +disarrangement +disarranges +disarranging +disarray +disarrayed +disarraying +disarrays +disassemble +disassembled +disassembles +disassembling +disassociate +disassociated +disassociates +disassociating +disassociation +disaster +disasters +disastrous +disastrously +disavow +disavowal +disavowals +disavowed +disavowing +disavows +disband +disbanded +disbanding +disbandment +disbands +disbar +disbarment +disbarred +disbarring +disbars +disbelief +disbelieve +disbelieved +disbeliever +disbelievers +disbelieves +disbelieving +disbelievingly +disbursal +disburse +disbursed +disbursement +disbursements +disburses +disbursing +disc +discard +discarded +discarding +discards +discern +discerned +discernible +discernibly +discerning +discerningly +discernment +discerns +discharge +discharged +discharges +discharging +disciple +disciples +discipleship +disciplinarian +disciplinarians +disciplinary +discipline +disciplined +disciplines +disciplining +disclaim +disclaimed +disclaimer +disclaimers +disclaiming +disclaims +disclose +disclosed +discloses +disclosing +disclosure +disclosures +disco +discoed +discographies +discography +discoing +discolor +discoloration +discolorations +discolored +discoloring +discolors +discolour +discoloured +discolouring +discolours +discombobulate +discombobulated +discombobulates +discombobulating +discombobulation +discomfit +discomfited +discomfiting +discomfits +discomfiture +discomfort +discomforted +discomforting +discomforts +discommode +discommoded +discommodes +discommoding +discompose +discomposed +discomposes +discomposing +discomposure +disconcert +disconcerted +disconcerting +disconcertingly +disconcerts +disconnect +disconnected +disconnectedly +disconnectedness +disconnecting +disconnection +disconnections +disconnects +disconsolate +disconsolately +discontent +discontented +discontentedly +discontenting +discontentment +discontents +discontinuance +discontinuances +discontinuation +discontinuations +discontinue +discontinued +discontinues +discontinuing +discontinuities +discontinuity +discontinuous +discontinuously +discord +discordance +discordant +discordantly +discorded +discording +discords +discos +discotheque +discotheques +discount +discounted +discountenance +discountenanced +discountenances +discountenancing +discounter +discounters +discounting +discounts +discourage +discouraged +discouragement +discouragements +discourages +discouraging +discouragingly +discourse +discoursed +discourses +discoursing +discourteous +discourteously +discourtesies +discourtesy +discover +discovered +discoverer +discoverers +discoveries +discovering +discovers +discovery +discredit +discreditable +discreditably +discredited +discrediting +discredits +discreet +discreeter +discreetest +discreetly +discreetness +discrepancies +discrepancy +discrepant +discrete +discretely +discreteness +discretion +discretionary +discriminate +discriminated +discriminates +discriminating +discrimination +discriminator +discriminators +discriminatory +discs +discursive +discursively +discursiveness +discus +discuses +discuss +discussant +discussants +discussed +discusses +discussing +discussion +discussions +disdain +disdained +disdainful +disdainfully +disdaining +disdains +disease +diseased +diseases +disembark +disembarkation +disembarked +disembarking +disembarks +disembodied +disembodies +disembodiment +disembody +disembodying +disembowel +disemboweled +disemboweling +disembowelled +disembowelling +disembowelment +disembowels +disenchant +disenchanted +disenchanting +disenchantment +disenchants +disencumber +disencumbered +disencumbering +disencumbers +disenfranchise +disenfranchised +disenfranchisement +disenfranchises +disenfranchising +disengage +disengaged +disengagement +disengagements +disengages +disengaging +disentangle +disentangled +disentanglement +disentangles +disentangling +disequilibrium +disestablish +disestablished +disestablishes +disestablishing +disestablishment +disesteem +disesteemed +disesteeming +disesteems +disfavor +disfavored +disfavoring +disfavors +disfavour +disfavours +disfigure +disfigured +disfigurement +disfigurements +disfigures +disfiguring +disfranchise +disfranchised +disfranchisement +disfranchises +disfranchising +disgorge +disgorged +disgorgement +disgorges +disgorging +disgrace +disgraced +disgraceful +disgracefully +disgracefulness +disgraces +disgracing +disgruntle +disgruntled +disgruntlement +disgruntles +disgruntling +disguise +disguised +disguises +disguising +disgust +disgusted +disgustedly +disgusting +disgustingly +disgusts +dish +dishabille +disharmonious +disharmony +dishcloth +dishcloths +dishearten +disheartened +disheartening +dishearteningly +disheartens +dished +dishes +dishevel +disheveled +disheveling +dishevelled +dishevelling +dishevelment +dishevels +dishing +dishonest +dishonestly +dishonesty +dishonor +dishonorable +dishonorably +dishonored +dishonoring +dishonors +dishpan +dishpans +dishrag +dishrags +dishtowel +dishtowels +dishware +dishwasher +dishwashers +dishwater +disillusion +disillusioned +disillusioning +disillusionment +disillusions +disinclination +disincline +disinclined +disinclines +disinclining +disinfect +disinfectant +disinfectants +disinfected +disinfecting +disinfection +disinfects +disinflation +disinformation +disingenuous +disingenuously +disinherit +disinheritance +disinherited +disinheriting +disinherits +disintegrate +disintegrated +disintegrates +disintegrating +disintegration +disinter +disinterest +disinterested +disinterestedly +disinterestedness +disinterests +disinterment +disinterred +disinterring +disinters +disinvestment +disjoint +disjointed +disjointedly +disjointedness +disjointing +disjoints +disjunctive +disk +diskette +diskettes +disks +dislike +disliked +dislikes +disliking +dislocate +dislocated +dislocates +dislocating +dislocation +dislocations +dislodge +dislodged +dislodges +dislodging +disloyal +disloyally +disloyalty +dismal +dismally +dismantle +dismantled +dismantlement +dismantles +dismantling +dismay +dismayed +dismaying +dismays +dismember +dismembered +dismembering +dismemberment +dismembers +dismiss +dismissal +dismissals +dismissed +dismisses +dismissing +dismissive +dismissively +dismount +dismounted +dismounting +dismounts +disobedience +disobedient +disobediently +disobey +disobeyed +disobeying +disobeys +disoblige +disobliged +disobliges +disobliging +disorder +disordered +disordering +disorderliness +disorderly +disorders +disorganization +disorganize +disorganized +disorganizes +disorganizing +disorient +disorientate +disorientated +disorientates +disorientating +disorientation +disoriented +disorienting +disorients +disown +disowned +disowning +disowns +disparage +disparaged +disparagement +disparages +disparaging +disparagingly +disparate +disparately +disparities +disparity +dispassion +dispassionate +dispassionately +dispatch +dispatched +dispatcher +dispatchers +dispatches +dispatching +dispel +dispelled +dispelling +dispels +dispensable +dispensaries +dispensary +dispensation +dispensations +dispense +dispensed +dispenser +dispensers +dispenses +dispensing +dispersal +disperse +dispersed +disperses +dispersing +dispersion +dispirit +dispirited +dispiriting +dispirits +displace +displaced +displacement +displacements +displaces +displacing +display +displayed +displaying +displays +displease +displeased +displeases +displeasing +displeasure +disport +disported +disporting +disports +disposable +disposables +disposal +disposals +dispose +disposed +disposer +disposers +disposes +disposing +disposition +dispositions +dispossess +dispossessed +dispossesses +dispossessing +dispossession +dispraise +dispraised +dispraises +dispraising +disproof +disproofs +disproportion +disproportional +disproportionate +disproportionately +disproportions +disprovable +disprove +disproved +disproven +disproves +disproving +disputable +disputably +disputant +disputants +disputation +disputations +disputatious +disputatiously +dispute +disputed +disputer +disputers +disputes +disputing +disqualification +disqualifications +disqualified +disqualifies +disqualify +disqualifying +disquiet +disquieted +disquieting +disquiets +disquietude +disquisition +disquisitions +disregard +disregarded +disregardful +disregarding +disregards +disrepair +disreputable +disreputably +disrepute +disrespect +disrespected +disrespectful +disrespectfully +disrespecting +disrespects +disrobe +disrobed +disrobes +disrobing +disrupt +disrupted +disrupting +disruption +disruptions +disruptive +disruptively +disrupts +diss +dissatisfaction +dissatisfied +dissatisfies +dissatisfy +dissatisfying +dissect +dissected +dissecting +dissection +dissections +dissector +dissectors +dissects +dissed +dissemblance +dissemble +dissembled +dissembler +dissemblers +dissembles +dissembling +disseminate +disseminated +disseminates +disseminating +dissemination +dissension +dissensions +dissent +dissented +dissenter +dissenters +dissenting +dissents +dissertation +dissertations +disservice +disservices +disses +dissever +dissevered +dissevering +dissevers +dissidence +dissident +dissidents +dissimilar +dissimilarities +dissimilarity +dissimilitude +dissimilitudes +dissimulate +dissimulated +dissimulates +dissimulating +dissimulation +dissimulator +dissimulators +dissing +dissipate +dissipated +dissipates +dissipating +dissipation +dissociate +dissociated +dissociates +dissociating +dissociation +dissoluble +dissolute +dissolutely +dissoluteness +dissolution +dissolve +dissolved +dissolves +dissolving +dissonance +dissonances +dissonant +dissuade +dissuaded +dissuades +dissuading +dissuasion +dissuasive +distaff +distaffs +distal +distally +distance +distanced +distances +distancing +distant +distantly +distaste +distasteful +distastefully +distastefulness +distastes +distemper +distend +distended +distending +distends +distension +distensions +distention +distentions +distil +distill +distillate +distillates +distillation +distillations +distilled +distiller +distilleries +distillers +distillery +distilling +distills +distils +distinct +distincter +distinctest +distinction +distinctions +distinctive +distinctively +distinctiveness +distinctly +distinctness +distinguish +distinguishable +distinguished +distinguishes +distinguishing +distort +distorted +distorting +distortion +distortions +distorts +distract +distracted +distractedly +distracting +distraction +distractions +distracts +distrait +distraught +distress +distressed +distresses +distressful +distressing +distressingly +distribute +distributed +distributes +distributing +distribution +distributions +distributive +distributively +distributor +distributors +district +districts +distrust +distrusted +distrustful +distrustfully +distrusting +distrusts +disturb +disturbance +disturbances +disturbed +disturber +disturbers +disturbing +disturbs +disunion +disunite +disunited +disunites +disuniting +disunity +disuse +disused +disuses +disusing +ditch +ditched +ditches +ditching +dither +dithered +ditherer +ditherers +dithering +dithers +ditsier +ditsiest +ditsy +ditties +ditto +dittoed +dittoes +dittoing +dittos +ditty +ditz +ditzes +ditzier +ditziest +ditzy +diuretic +diuretics +diurnal +diurnally +diva +divalent +divan +divans +divas +dive +dived +diver +diverge +diverged +divergence +divergences +divergent +diverges +diverging +divers +diverse +diversely +diverseness +diversification +diversified +diversifies +diversify +diversifying +diversion +diversionary +diversions +diversities +diversity +divert +diverted +diverticulitis +diverting +diverts +dives +divest +divested +divesting +divestiture +divestitures +divestment +divests +dividable +divide +divided +dividend +dividends +divider +dividers +divides +dividing +divination +divine +divined +divinely +diviner +diviners +divines +divinest +diving +divining +divinities +divinity +divisibility +divisible +division +divisional +divisions +divisive +divisively +divisiveness +divisor +divisors +divorce +divorced +divorcee +divorcees +divorcement +divorcements +divorces +divorcing +divot +divots +divulge +divulged +divulges +divulging +divvied +divvies +divvy +divvying +dixieland +dizzied +dizzier +dizzies +dizziest +dizzily +dizziness +dizzy +dizzying +djellaba +djellabah +djellabahs +djellabas +djinn +djinns +doable +dobbin +dobbins +doberman +dobermans +docent +docents +docile +docilely +docility +dock +docked +docket +docketed +docketing +dockets +docking +docks +dockworker +dockworkers +dockyard +dockyards +docs +doctor +doctoral +doctorate +doctorates +doctored +doctoring +doctors +doctrinaire +doctrinaires +doctrinal +doctrine +doctrines +docudrama +docudramas +document +documentaries +documentary +documentation +documented +documenting +documents +dodder +doddered +doddering +dodders +dodge +dodged +dodger +dodgers +dodges +dodging +dodo +dodoes +dodos +doer +doers +does +doeskin +doeskins +doff +doffed +doffing +doffs +dogcart +dogcarts +dogcatcher +dogcatchers +doge +dogear +dogeared +dogearing +dogears +doges +dogfight +dogfights +dogfish +dogfishes +dogged +doggedly +doggedness +doggerel +doggie +doggier +doggies +doggiest +dogging +doggone +doggoned +doggoneder +doggonedest +doggoner +doggones +doggonest +doggoning +doggy +doghouse +doghouses +dogie +dogies +dogleg +doglegged +doglegging +doglegs +dogma +dogmas +dogmata +dogmatic +dogmatically +dogmatism +dogmatist +dogmatists +dogs +dogtrot +dogtrots +dogtrotted +dogtrotting +dogwood +dogwoods +dogy +doilies +doily +doing +doings +doldrums +dole +doled +doleful +dolefully +dolefulness +doles +doling +doll +dollar +dollars +dolled +dollhouse +dollhouses +dollies +dolling +dollop +dolloped +dolloping +dollops +dolls +dolly +dolmen +dolmens +dolomite +dolor +dolorous +dolorously +dolphin +dolphins +dolt +doltish +doltishly +doltishness +dolts +domain +domains +dome +domed +domes +domestic +domestically +domesticate +domesticated +domesticates +domesticating +domestication +domesticity +domestics +domicile +domiciled +domiciles +domiciliary +domiciling +dominance +dominant +dominantly +dominants +dominate +dominated +dominates +dominating +domination +dominatrices +dominatrix +dominatrixes +domineer +domineered +domineering +domineeringly +domineers +doming +dominion +dominions +domino +dominoes +dominos +dona +donas +donate +donated +donates +donating +donation +donations +done +dong +dongle +dongles +dongs +donkey +donkeys +donned +donning +donnybrook +donnybrooks +donor +donors +dons +donut +donuts +doodad +doodads +doodle +doodlebug +doodlebugs +doodled +doodler +doodlers +doodles +doodling +doohickey +doohickeys +doom +doomed +dooming +dooms +doomsayer +doomsayers +doomsday +door +doorbell +doorbells +doorkeeper +doorkeepers +doorknob +doorknobs +doorman +doormat +doormats +doormen +doorplate +doorplates +doors +doorstep +doorstepped +doorstepping +doorsteps +doorstop +doorstops +doorway +doorways +dooryard +dooryards +dopa +dope +doped +doper +dopers +dopes +dopey +dopier +dopiest +dopiness +doping +dopy +dories +dork +dorkier +dorkiest +dorks +dorky +dorm +dormancy +dormant +dormer +dormers +dormice +dormitories +dormitory +dormouse +dorms +dorsal +dorsally +dory +dosage +dosages +dose +dosed +doses +dosimeter +dosimeters +dosing +dossier +dossiers +dost +dotage +dotard +dotards +dote +doted +doter +doters +dotes +doth +doting +dotingly +dots +dotted +dottier +dottiest +dotting +dotty +double +doubled +doubleheader +doubleheaders +doubles +doublespeak +doublet +doublets +doubling +doubloon +doubloons +doubly +doubt +doubted +doubter +doubters +doubtful +doubtfuller +doubtfullest +doubtfully +doubtfulness +doubting +doubtingly +doubtless +doubtlessly +doubts +douche +douched +douches +douching +dough +doughier +doughiest +doughnut +doughnuts +doughtier +doughtiest +doughty +doughy +dour +dourer +dourest +dourly +dourness +douse +doused +douses +dousing +dove +dovecote +dovecotes +doves +dovetail +dovetailed +dovetailing +dovetails +dovish +dowager +dowagers +dowdier +dowdiest +dowdily +dowdiness +dowdy +dowel +doweled +doweling +dowelled +dowelling +dowels +dower +dowered +dowering +dowers +down +downbeat +downbeats +downcast +downdraft +downdrafts +downed +downer +downers +downfall +downfallen +downfalls +downgrade +downgraded +downgrades +downgrading +downhearted +downheartedly +downheartedness +downhill +downhills +downier +downiest +downing +download +downloaded +downloading +downloads +downplay +downplayed +downplaying +downplays +downpour +downpours +downrange +downright +downriver +downs +downscale +downscaled +downscales +downscaling +downshift +downshifted +downshifting +downshifts +downside +downsides +downsize +downsized +downsizes +downsizing +downspout +downspouts +downstage +downstairs +downstate +downstream +downswing +downswings +downtime +downtown +downtrend +downtrends +downtrodden +downturn +downturns +downward +downwards +downwind +downy +dowries +dowry +dowse +dowsed +dowser +dowsers +dowses +dowsing +doxologies +doxology +doyen +doyenne +doyennes +doyens +doze +dozed +dozen +dozens +dozenth +dozes +dozing +drab +drabber +drabbest +drably +drabness +drabs +drachma +drachmae +drachmai +drachmas +draconian +draft +drafted +draftee +draftees +drafter +drafters +draftier +draftiest +draftily +draftiness +drafting +drafts +draftsman +draftsmanship +draftsmen +draftswoman +draftswomen +drafty +drag +dragged +draggier +draggiest +dragging +draggy +dragnet +dragnets +dragon +dragonflies +dragonfly +dragons +dragoon +dragooned +dragooning +dragoons +drags +drain +drainage +drainboard +drainboards +drained +drainer +drainers +draining +drainpipe +drainpipes +drains +drake +drakes +dram +drama +dramas +dramatic +dramatically +dramatics +dramatist +dramatists +dramatization +dramatizations +dramatize +dramatized +dramatizes +dramatizing +drams +drank +drape +draped +draper +draperies +drapers +drapery +drapes +draping +drastic +drastically +drat +draught +draughted +draughtier +draughtiest +draughting +draughts +draughtsman +draughtsmen +draughty +draw +drawback +drawbacks +drawbridge +drawbridges +drawer +drawers +drawing +drawings +drawl +drawled +drawling +drawls +drawn +draws +drawstring +drawstrings +dray +drays +dread +dreaded +dreadful +dreadfully +dreadfulness +dreading +dreadlocks +dreadnaught +dreadnaughts +dreadnought +dreadnoughts +dreads +dream +dreamboat +dreamboats +dreamed +dreamer +dreamers +dreamier +dreamiest +dreamily +dreaminess +dreaming +dreamland +dreamless +dreamlike +dreams +dreamt +dreamworld +dreamworlds +dreamy +drear +drearier +dreariest +drearily +dreariness +dreary +dredge +dredged +dredger +dredgers +dredges +dredging +dregs +drench +drenched +drenches +drenching +dress +dressage +dressed +dresser +dressers +dresses +dressier +dressiest +dressiness +dressing +dressings +dressmaker +dressmakers +dressmaking +dressy +drest +drew +dribble +dribbled +dribbler +dribblers +dribbles +dribbling +driblet +driblets +dried +drier +driers +dries +driest +drift +drifted +drifter +drifters +drifting +drifts +driftwood +drill +drilled +driller +drillers +drilling +drillmaster +drillmasters +drills +drily +drink +drinkable +drinker +drinkers +drinking +drinks +drip +dripped +drippier +drippiest +dripping +drippings +drippy +drips +dript +drive +drivel +driveled +driveler +drivelers +driveling +drivelled +drivelling +drivels +driven +driver +drivers +drives +driveway +driveways +driving +drizzle +drizzled +drizzles +drizzlier +drizzliest +drizzling +drizzly +drogue +drogues +droll +droller +drolleries +drollery +drollest +drollness +drolly +dromedaries +dromedary +drone +droned +drones +droning +drool +drooled +drooling +drools +droop +drooped +droopier +droopiest +droopiness +drooping +droops +droopy +drop +dropkick +dropkicks +droplet +droplets +dropout +dropouts +dropped +dropper +droppers +dropping +droppings +drops +dropsical +dropsy +dross +drought +droughts +drouth +drouths +drove +drover +drovers +droves +drown +drowned +drowning +drownings +drowns +drowse +drowsed +drowses +drowsier +drowsiest +drowsily +drowsiness +drowsing +drowsy +drub +drubbed +drubber +drubbers +drubbing +drubbings +drubs +drudge +drudged +drudgery +drudges +drudging +drug +drugged +druggie +druggies +drugging +druggist +druggists +druggy +drugs +drugstore +drugstores +druid +druidism +druids +drum +drumbeat +drumbeats +drumlin +drumlins +drummed +drummer +drummers +drumming +drums +drumstick +drumsticks +drunk +drunkard +drunkards +drunken +drunkenly +drunkenness +drunker +drunkest +drunks +drupe +drupes +druthers +dryad +dryads +dryer +dryers +drying +dryly +dryness +drys +drywall +dual +dualism +duality +dubbed +dubber +dubbers +dubbin +dubbing +dubiety +dubious +dubiously +dubiousness +dubs +ducal +ducat +ducats +duchess +duchesses +duchies +duchy +duck +duckbill +duckbills +ducked +duckier +duckies +duckiest +ducking +duckling +ducklings +duckpins +ducks +duckweed +ducky +duct +ductile +ductility +ductless +ducts +dude +duded +dudes +dudgeon +duding +duds +duel +dueled +dueler +duelers +dueling +duelist +duelists +duelled +duelling +duellist +duellists +duels +duenna +duennas +dues +duet +duets +duff +duffer +duffers +duffs +dugout +dugouts +duke +dukedom +dukedoms +dukes +dulcet +dulcimer +dulcimers +dull +dullard +dullards +dulled +duller +dullest +dulling +dullness +dulls +dully +dulness +duly +dumb +dumbbell +dumbbells +dumber +dumbest +dumbfound +dumbfounded +dumbfounding +dumbfounds +dumbly +dumbness +dumbstruck +dumbwaiter +dumbwaiters +dumdum +dumdums +dumfound +dumfounded +dumfounding +dumfounds +dummies +dummy +dump +dumped +dumpier +dumpiest +dumpiness +dumping +dumpling +dumplings +dumps +dumpster +dumpsters +dumpy +dunce +dunces +dunderhead +dunderheads +dune +dunes +dung +dungaree +dungarees +dunged +dungeon +dungeons +dunghill +dunghills +dunging +dungs +dunk +dunked +dunking +dunks +dunned +dunner +dunnest +dunning +dunno +duns +duodecimal +duodena +duodenal +duodenum +duodenums +duos +dupe +duped +duper +dupers +dupes +duping +duple +duplex +duplexes +duplicate +duplicated +duplicates +duplicating +duplication +duplicator +duplicators +duplicitous +duplicity +durability +durable +durably +durance +duration +duress +during +durst +durum +dusk +duskier +duskiest +duskiness +dusky +dust +dusted +duster +dusters +dustier +dustiest +dustiness +dusting +dustless +dustpan +dustpans +dusts +dusty +dutch +duteous +duteously +dutiable +duties +dutiful +dutifully +dutifulness +duty +duvet +duvets +dwarf +dwarfed +dwarfing +dwarfish +dwarfism +dwarfs +dwarves +dweeb +dweebs +dwell +dwelled +dweller +dwellers +dwelling +dwellings +dwells +dwelt +dwindle +dwindled +dwindles +dwindling +dybbuk +dybbukim +dybbuks +dyed +dyeing +dyer +dyers +dyes +dyestuff +dying +dyke +dykes +dynamic +dynamical +dynamically +dynamics +dynamism +dynamite +dynamited +dynamiter +dynamiters +dynamites +dynamiting +dynamo +dynamos +dynastic +dynasties +dynasty +dysentery +dysfunction +dysfunctional +dysfunctions +dyslectic +dyslectics +dyslexia +dyslexic +dyslexics +dyspepsia +dyspeptic +dyspeptics +dysprosium +each +eager +eagerer +eagerest +eagerly +eagerness +eagle +eagles +eaglet +eaglets +earache +earaches +eardrum +eardrums +eared +earful +earfuls +earl +earldom +earldoms +earlier +earliest +earliness +earlobe +earlobes +earls +early +earmark +earmarked +earmarking +earmarks +earmuff +earmuffs +earn +earned +earner +earners +earnest +earnestly +earnestness +earnests +earning +earnings +earns +earphone +earphones +earplug +earplugs +earring +earrings +ears +earshot +earsplitting +earth +earthbound +earthed +earthen +earthenware +earthier +earthiest +earthiness +earthing +earthlier +earthliest +earthling +earthlings +earthly +earthquake +earthquakes +earths +earthshaking +earthward +earthwards +earthwork +earthworks +earthworm +earthworms +earthy +earwax +earwig +earwigs +ease +eased +easel +easels +easement +easements +eases +easier +easiest +easily +easiness +easing +east +eastbound +easterlies +easterly +eastern +easterner +easterners +easternmost +eastward +eastwards +easy +easygoing +eatable +eatables +eaten +eater +eateries +eaters +eatery +eating +eats +eave +eaves +eavesdrop +eavesdropped +eavesdropper +eavesdroppers +eavesdropping +eavesdrops +ebbed +ebbing +ebbs +ebonies +ebony +ebullience +ebullient +ebulliently +ebullition +eccentric +eccentrically +eccentricities +eccentricity +eccentrics +ecclesiastic +ecclesiastical +ecclesiastically +ecclesiastics +echelon +echelons +echinoderm +echinoderms +echo +echoed +echoes +echoic +echoing +echolocation +echos +eclair +eclairs +eclat +eclectic +eclectically +eclecticism +eclectics +eclipse +eclipsed +eclipses +eclipsing +ecliptic +eclogue +eclogues +ecocide +ecologic +ecological +ecologically +ecologist +ecologists +ecology +economic +economical +economically +economics +economies +economist +economists +economize +economized +economizer +economizers +economizes +economizing +economy +ecosystem +ecosystems +ecru +ecstasies +ecstasy +ecstatic +ecstatically +ecumenical +ecumenically +ecumenicism +ecumenism +eczema +eddied +eddies +eddy +eddying +edelweiss +edema +edge +edged +edger +edgers +edges +edgeways +edgewise +edgier +edgiest +edgily +edginess +edging +edgings +edgy +edibility +edible +edibleness +edibles +edict +edicts +edification +edifice +edifices +edified +edifier +edifiers +edifies +edify +edifying +edit +edited +editing +edition +editions +editor +editorial +editorialize +editorialized +editorializes +editorializing +editorially +editorials +editors +editorship +edits +educability +educable +educate +educated +educates +educating +education +educational +educationally +educations +educator +educators +educe +educed +educes +educing +edutainment +eels +eerie +eerier +eeriest +eerily +eeriness +eery +efface +effaced +effacement +effaces +effacing +effect +effected +effecting +effective +effectively +effectiveness +effects +effectual +effectually +effectuate +effectuated +effectuates +effectuating +effeminacy +effeminate +effeminately +effendi +effendis +efferent +effervesce +effervesced +effervescence +effervescent +effervescently +effervesces +effervescing +effete +effetely +effeteness +efficacious +efficaciously +efficacy +efficiencies +efficiency +efficient +efficiently +effigies +effigy +efflorescence +efflorescent +effluence +effluent +effluents +effluvia +effluvium +effluviums +effort +effortless +effortlessly +effortlessness +efforts +effrontery +effulgence +effulgent +effuse +effused +effuses +effusing +effusion +effusions +effusive +effusively +effusiveness +egad +egalitarian +egalitarianism +egalitarians +eggbeater +eggbeaters +eggcup +eggcups +egged +egghead +eggheads +egging +eggnog +eggplant +eggplants +eggs +eggshell +eggshells +egis +eglantine +eglantines +egocentric +egocentrically +egocentricity +egocentrics +egoism +egoist +egoistic +egoistical +egoistically +egoists +egomania +egomaniac +egomaniacs +egos +egotism +egotist +egotistic +egotistical +egotistically +egotists +egregious +egregiously +egregiousness +egress +egresses +egret +egrets +eider +eiderdown +eiderdowns +eiders +eight +eighteen +eighteens +eighteenth +eighteenths +eighth +eighths +eighties +eightieth +eightieths +eights +eighty +einsteinium +either +ejaculate +ejaculated +ejaculates +ejaculating +ejaculation +ejaculations +ejaculatory +eject +ejected +ejecting +ejection +ejections +ejector +ejectors +ejects +eked +ekes +eking +elaborate +elaborated +elaborately +elaborateness +elaborates +elaborating +elaboration +elaborations +elan +eland +elands +elapse +elapsed +elapses +elapsing +elastic +elastically +elasticity +elasticize +elasticized +elasticizes +elasticizing +elastics +elate +elated +elatedly +elates +elating +elation +elbow +elbowed +elbowing +elbowroom +elbows +elder +elderberries +elderberry +elderly +elders +eldest +elect +electable +elected +electing +election +electioneer +electioneered +electioneering +electioneers +elections +elective +electives +elector +electoral +electorate +electorates +electors +electric +electrical +electrically +electrician +electricians +electricity +electrification +electrified +electrifier +electrifiers +electrifies +electrify +electrifying +electrocardiogram +electrocardiograms +electrocardiograph +electrocardiographs +electrocardiography +electrocute +electrocuted +electrocutes +electrocuting +electrocution +electrocutions +electrode +electrodes +electroencephalogram +electroencephalograms +electroencephalograph +electroencephalographic +electroencephalographs +electroencephalography +electrologist +electrologists +electrolysis +electrolyte +electrolytes +electrolytic +electromagnet +electromagnetic +electromagnetically +electromagnetism +electromagnets +electromotive +electron +electronic +electronically +electronics +electrons +electroplate +electroplated +electroplates +electroplating +electroscope +electroscopes +electroscopic +electroshock +electrostatics +electrotype +electrotypes +elects +eleemosynary +elegance +elegant +elegantly +elegiac +elegiacal +elegiacs +elegies +elegy +element +elemental +elementally +elementary +elements +elephant +elephantiasis +elephantine +elephants +elevate +elevated +elevates +elevating +elevation +elevations +elevator +elevators +eleven +elevens +eleventh +elevenths +elfin +elfish +elicit +elicitation +elicited +eliciting +elicits +elide +elided +elides +eliding +eligibility +eligible +eliminate +eliminated +eliminates +eliminating +elimination +eliminations +elision +elisions +elite +elites +elitism +elitist +elitists +elixir +elixirs +elks +ellipse +ellipses +ellipsis +ellipsoid +ellipsoidal +ellipsoids +elliptic +elliptical +elliptically +ells +elms +elocution +elocutionary +elocutionist +elocutionists +elodea +elodeas +elongate +elongated +elongates +elongating +elongation +elongations +elope +eloped +elopement +elopements +elopes +eloping +eloquence +eloquent +eloquently +else +elsewhere +elucidate +elucidated +elucidates +elucidating +elucidation +elucidations +elude +eluded +eludes +eluding +elusive +elusively +elusiveness +elver +elvers +elves +emaciate +emaciated +emaciates +emaciating +emaciation +email +emailed +emailing +emails +emanate +emanated +emanates +emanating +emanation +emanations +emancipate +emancipated +emancipates +emancipating +emancipation +emancipator +emancipators +emasculate +emasculated +emasculates +emasculating +emasculation +embalm +embalmed +embalmer +embalmers +embalming +embalms +embank +embanked +embanking +embankment +embankments +embanks +embargo +embargoed +embargoes +embargoing +embark +embarkation +embarkations +embarked +embarking +embarks +embarrass +embarrassed +embarrasses +embarrassing +embarrassingly +embarrassment +embarrassments +embassies +embassy +embattled +embed +embedded +embedding +embeds +embellish +embellished +embellishes +embellishing +embellishment +embellishments +ember +embers +embezzle +embezzled +embezzlement +embezzler +embezzlers +embezzles +embezzling +embitter +embittered +embittering +embitterment +embitters +emblazon +emblazoned +emblazoning +emblazonment +emblazons +emblem +emblematic +emblems +embodied +embodies +embodiment +embody +embodying +embolden +emboldened +emboldening +emboldens +embolism +embolisms +emboss +embossed +embosser +embossers +embosses +embossing +embouchure +embower +embowered +embowering +embowers +embrace +embraceable +embraced +embraces +embracing +embrasure +embrasures +embrocation +embrocations +embroider +embroidered +embroiderer +embroiderers +embroideries +embroidering +embroiders +embroidery +embroil +embroiled +embroiling +embroilment +embroils +embryo +embryologist +embryologists +embryology +embryonic +embryos +emcee +emceed +emceeing +emcees +emend +emendation +emendations +emended +emending +emends +emerald +emeralds +emerge +emerged +emergence +emergencies +emergency +emergent +emerges +emerging +emerita +emeritus +emery +emetic +emetics +emigrant +emigrants +emigrate +emigrated +emigrates +emigrating +emigration +emigrations +emigre +emigres +eminence +eminences +eminent +eminently +emir +emirate +emirates +emirs +emissaries +emissary +emission +emissions +emit +emits +emitted +emitter +emitters +emitting +emollient +emollients +emolument +emoluments +emote +emoted +emotes +emoticon +emoticons +emoting +emotion +emotional +emotionalism +emotionalize +emotionalized +emotionalizes +emotionalizing +emotionally +emotions +emotive +empanel +empaneled +empaneling +empanelled +empanelling +empanels +empathetic +empathize +empathized +empathizes +empathizing +empathy +emperor +emperors +emphases +emphasis +emphasize +emphasized +emphasizes +emphasizing +emphatic +emphatically +emphysema +empire +empires +empiric +empirical +empirically +empiricism +empiricist +empiricists +emplacement +emplacements +employ +employable +employe +employed +employee +employees +employer +employers +employes +employing +employment +employments +employs +emporia +emporium +emporiums +empower +empowered +empowering +empowerment +empowers +empress +empresses +emptied +emptier +empties +emptiest +emptily +emptiness +empty +emptying +empyrean +emulate +emulated +emulates +emulating +emulation +emulations +emulative +emulator +emulators +emulsification +emulsified +emulsifier +emulsifiers +emulsifies +emulsify +emulsifying +emulsion +emulsions +emus +enable +enabled +enabler +enablers +enables +enabling +enact +enacted +enacting +enactment +enactments +enacts +enamel +enameled +enameler +enamelers +enameling +enamelled +enamelling +enamels +enamelware +enamor +enamored +enamoring +enamors +enamour +enamoured +enamouring +enamours +encamp +encamped +encamping +encampment +encampments +encamps +encapsulate +encapsulated +encapsulates +encapsulating +encapsulation +encapsulations +encase +encased +encasement +encases +encasing +encephalitic +encephalitis +enchain +enchained +enchaining +enchains +enchant +enchanted +enchanter +enchanters +enchanting +enchantingly +enchantment +enchantments +enchantress +enchantresses +enchants +enchilada +enchiladas +encipher +enciphered +enciphering +enciphers +encircle +encircled +encirclement +encircles +encircling +enclave +enclaves +enclose +enclosed +encloses +enclosing +enclosure +enclosures +encode +encoded +encoder +encoders +encodes +encoding +encomia +encomium +encomiums +encompass +encompassed +encompasses +encompassing +encore +encored +encores +encoring +encounter +encountered +encountering +encounters +encourage +encouraged +encouragement +encouragements +encourages +encouraging +encouragingly +encroach +encroached +encroaches +encroaching +encroachment +encroachments +encrust +encrustation +encrustations +encrusted +encrusting +encrusts +encumber +encumbered +encumbering +encumbers +encumbrance +encumbrances +encyclical +encyclicals +encyclopaedia +encyclopaedias +encyclopaedic +encyclopedia +encyclopedias +encyclopedic +encyst +encysted +encysting +encystment +encysts +endanger +endangered +endangering +endangerment +endangers +endear +endeared +endearing +endearingly +endearment +endearments +endears +endeavor +endeavored +endeavoring +endeavors +endeavour +endeavoured +endeavouring +endeavours +ended +endemic +endemically +endemics +ending +endings +endive +endives +endless +endlessly +endlessness +endmost +endocrine +endocrines +endocrinologist +endocrinologists +endocrinology +endogenous +endogenously +endorphin +endorphins +endorse +endorsed +endorsement +endorsements +endorser +endorsers +endorses +endorsing +endoscope +endoscopes +endoscopic +endoscopy +endothermic +endow +endowed +endowing +endowment +endowments +endows +endpoint +endpoints +ends +endue +endued +endues +enduing +endurable +endurance +endure +endured +endures +enduring +endways +endwise +enema +enemas +enemata +enemies +enemy +energetic +energetically +energies +energize +energized +energizer +energizers +energizes +energizing +energy +enervate +enervated +enervates +enervating +enervation +enfeeble +enfeebled +enfeeblement +enfeebles +enfeebling +enfilade +enfiladed +enfilades +enfilading +enfold +enfolded +enfolding +enfolds +enforce +enforceable +enforced +enforcement +enforcer +enforcers +enforces +enforcing +enfranchise +enfranchised +enfranchisement +enfranchises +enfranchising +engage +engaged +engagement +engagements +engages +engaging +engagingly +engender +engendered +engendering +engenders +engine +engineer +engineered +engineering +engineers +engines +engorge +engorged +engorgement +engorges +engorging +engram +engrams +engrave +engraved +engraver +engravers +engraves +engraving +engravings +engross +engrossed +engrosses +engrossing +engrossment +engulf +engulfed +engulfing +engulfment +engulfs +enhance +enhanced +enhancement +enhancements +enhances +enhancing +enigma +enigmas +enigmatic +enigmatically +enjambement +enjambements +enjambment +enjambments +enjoin +enjoined +enjoining +enjoins +enjoy +enjoyable +enjoyably +enjoyed +enjoying +enjoyment +enjoyments +enjoys +enlarge +enlargeable +enlarged +enlargement +enlargements +enlarger +enlargers +enlarges +enlarging +enlighten +enlightened +enlightening +enlightenment +enlightens +enlist +enlisted +enlistee +enlistees +enlisting +enlistment +enlistments +enlists +enliven +enlivened +enlivening +enlivenment +enlivens +enmesh +enmeshed +enmeshes +enmeshing +enmeshment +enmities +enmity +ennoble +ennobled +ennoblement +ennobles +ennobling +ennui +enormities +enormity +enormous +enormously +enormousness +enough +enplane +enplaned +enplanes +enplaning +enquire +enquired +enquires +enquiries +enquiring +enquiry +enrage +enraged +enrages +enraging +enrapture +enraptured +enraptures +enrapturing +enrich +enriched +enriches +enriching +enrichment +enrol +enroll +enrolled +enrolling +enrollment +enrollments +enrolls +enrolment +enrolments +enrols +ensconce +ensconced +ensconces +ensconcing +ensemble +ensembles +enshrine +enshrined +enshrinement +enshrines +enshrining +enshroud +enshrouded +enshrouding +enshrouds +ensign +ensigns +ensilage +enslave +enslaved +enslavement +enslaves +enslaving +ensnare +ensnared +ensnarement +ensnares +ensnaring +ensue +ensued +ensues +ensuing +ensure +ensured +ensurer +ensurers +ensures +ensuring +entail +entailed +entailing +entailment +entails +entangle +entangled +entanglement +entanglements +entangles +entangling +entente +ententes +enter +entered +entering +enteritis +enterprise +enterprises +enterprising +enterprisingly +enters +entertain +entertained +entertainer +entertainers +entertaining +entertainingly +entertainment +entertainments +entertains +enthral +enthrall +enthralled +enthralling +enthrallment +enthralls +enthrals +enthrone +enthroned +enthronement +enthronements +enthrones +enthroning +enthuse +enthused +enthuses +enthusiasm +enthusiasms +enthusiast +enthusiastic +enthusiastically +enthusiasts +enthusing +entice +enticed +enticement +enticements +entices +enticing +enticingly +entire +entirely +entirety +entities +entitle +entitled +entitlement +entitlements +entitles +entitling +entity +entomb +entombed +entombing +entombment +entombs +entomological +entomologist +entomologists +entomology +entourage +entourages +entrails +entrance +entranced +entrancement +entrances +entrancing +entrancingly +entrant +entrants +entrap +entrapment +entrapped +entrapping +entraps +entreat +entreated +entreaties +entreating +entreatingly +entreats +entreaty +entree +entrees +entrench +entrenched +entrenches +entrenching +entrenchment +entrenchments +entrepreneur +entrepreneurial +entrepreneurs +entries +entropy +entrust +entrusted +entrusting +entrusts +entry +entryway +entryways +entwine +entwined +entwines +entwining +enumerable +enumerate +enumerated +enumerates +enumerating +enumeration +enumerations +enumerator +enumerators +enunciate +enunciated +enunciates +enunciating +enunciation +enure +enured +enures +enuresis +enuring +envelop +envelope +enveloped +enveloper +envelopers +envelopes +enveloping +envelopment +envelops +envenom +envenomed +envenoming +envenoms +enviable +enviably +envied +envies +envious +enviously +enviousness +environment +environmental +environmentalism +environmentalist +environmentalists +environmentally +environments +environs +envisage +envisaged +envisages +envisaging +envision +envisioned +envisioning +envisions +envoy +envoys +envy +envying +envyingly +enzymatic +enzyme +enzymes +eolian +eons +epaulet +epaulets +epaulette +epaulettes +epee +epees +ephedrine +ephemera +ephemeral +ephemerally +epic +epicenter +epicenters +epicentre +epicentres +epics +epicure +epicurean +epicureans +epicures +epidemic +epidemically +epidemics +epidemiologist +epidemiologists +epidemiology +epidermal +epidermic +epidermis +epidermises +epiglottides +epiglottis +epiglottises +epigram +epigrammatic +epigrams +epigraph +epigraphs +epigraphy +epilepsy +epileptic +epileptics +epilog +epilogs +epilogue +epilogues +epinephrin +epinephrine +epiphanies +epiphany +episcopacy +episcopal +episcopate +episode +episodes +episodic +episodically +epistle +epistles +epistolary +epitaph +epitaphs +epithelial +epithelium +epithet +epithets +epitome +epitomes +epitomize +epitomized +epitomizes +epitomizing +epoch +epochal +epochs +epoxied +epoxies +epoxy +epoxyed +epoxying +epsilon +epsilons +equability +equable +equably +equal +equaled +equaling +equality +equalization +equalize +equalized +equalizer +equalizers +equalizes +equalizing +equalled +equalling +equally +equals +equanimity +equatable +equate +equated +equates +equating +equation +equations +equator +equatorial +equators +equerries +equerry +equestrian +equestrianism +equestrians +equestrienne +equestriennes +equidistant +equidistantly +equilateral +equilaterals +equilibrium +equine +equines +equinoctial +equinox +equinoxes +equip +equipage +equipages +equipment +equipoise +equipped +equipping +equips +equitable +equitably +equitation +equities +equity +equivalence +equivalences +equivalencies +equivalency +equivalent +equivalently +equivalents +equivocal +equivocally +equivocalness +equivocate +equivocated +equivocates +equivocating +equivocation +equivocations +equivocator +equivocators +eradicable +eradicate +eradicated +eradicates +eradicating +eradication +eradicator +eradicators +eras +erasable +erase +erased +eraser +erasers +erases +erasing +erasure +erasures +erbium +erect +erected +erectile +erecting +erection +erections +erectly +erectness +erector +erectors +erects +erelong +eremite +eremites +ergo +ergonomic +ergonomically +ergonomics +ergosterol +ergot +ergs +ermine +ermines +erode +eroded +erodes +erodible +eroding +erogenous +erosion +erosive +erotic +erotica +erotically +eroticism +errand +errands +errant +errata +erratas +erratic +erratically +erratum +erred +erring +erroneous +erroneously +error +errors +errs +ersatz +ersatzes +erst +erstwhile +eruct +eructation +eructations +eructed +eructing +eructs +erudite +eruditely +erudition +erupt +erupted +erupting +eruption +eruptions +eruptive +erupts +erysipelas +erythrocyte +erythrocytes +escalate +escalated +escalates +escalating +escalation +escalations +escalator +escalators +escallop +escalloped +escalloping +escallops +escalop +escalops +escapade +escapades +escape +escaped +escapee +escapees +escapement +escapements +escapes +escaping +escapism +escapist +escapists +escargot +escargots +escarole +escaroles +escarpment +escarpments +eschew +eschewed +eschewing +eschews +escort +escorted +escorting +escorts +escritoire +escritoires +escrow +escrows +escudo +escudos +escutcheon +escutcheons +esophageal +esophagi +esophagus +esoteric +esoterically +espadrille +espadrilles +espalier +espaliered +espaliering +espaliers +especial +especially +espied +espies +espionage +esplanade +esplanades +espousal +espouse +espoused +espouses +espousing +espresso +espressos +esprit +espy +espying +esquire +esquires +essay +essayed +essayer +essayers +essaying +essayist +essayists +essays +essence +essences +essential +essentially +essentials +establish +established +establishes +establishing +establishment +establishments +estate +estates +esteem +esteemed +esteeming +esteems +ester +esters +esthete +esthetes +esthetic +esthetically +esthetics +estimable +estimate +estimated +estimates +estimating +estimation +estimations +estimator +estimators +estrange +estranged +estrangement +estrangements +estranges +estranging +estrogen +estrous +estrus +estruses +estuaries +estuary +etas +etch +etched +etcher +etchers +etches +etching +etchings +eternal +eternally +eternalness +eternities +eternity +ethane +ethanol +ether +ethereal +ethereally +ethic +ethical +ethically +ethics +ethnic +ethnically +ethnicity +ethnics +ethnocentric +ethnocentrism +ethnological +ethnologist +ethnologists +ethnology +ethological +ethologist +ethologists +ethology +ethos +ethyl +ethylene +etiologic +etiological +etiologies +etiology +etiquette +etude +etudes +etymological +etymologically +etymologies +etymologist +etymologists +etymology +eucalypti +eucalyptus +eucalyptuses +euchre +euchred +euchres +euchring +euclidean +eugenic +eugenically +eugenicist +eugenicists +eugenics +eulogies +eulogist +eulogistic +eulogists +eulogize +eulogized +eulogizer +eulogizers +eulogizes +eulogizing +eulogy +eunuch +eunuchs +euphemism +euphemisms +euphemistic +euphemistically +euphonious +euphoniously +euphony +euphoria +euphoric +euphorically +eureka +euro +europium +euros +euthanasia +euthanize +euthanized +euthanizes +euthanizing +euthenics +evacuate +evacuated +evacuates +evacuating +evacuation +evacuations +evacuee +evacuees +evade +evaded +evader +evaders +evades +evading +evaluate +evaluated +evaluates +evaluating +evaluation +evaluations +evanescence +evanescent +evangelic +evangelical +evangelicalism +evangelically +evangelicals +evangelism +evangelist +evangelistic +evangelists +evangelize +evangelized +evangelizes +evangelizing +evaporate +evaporated +evaporates +evaporating +evaporation +evaporator +evaporators +evasion +evasions +evasive +evasively +evasiveness +even +evened +evener +evenest +evenhanded +evenhandedly +evening +evenings +evenly +evenness +evens +evensong +event +eventful +eventfully +eventfulness +eventide +events +eventual +eventualities +eventuality +eventually +eventuate +eventuated +eventuates +eventuating +ever +everglade +everglades +evergreen +evergreens +everlasting +everlastingly +everlastings +evermore +every +everybody +everyday +everyone +everyplace +everything +everywhere +eves +evict +evicted +evicting +eviction +evictions +evicts +evidence +evidenced +evidences +evidencing +evident +evidently +evil +evildoer +evildoers +evildoing +eviler +evilest +eviller +evillest +evilly +evilness +evils +evince +evinced +evinces +evincing +eviscerate +eviscerated +eviscerates +eviscerating +evisceration +evocation +evocations +evocative +evocatively +evoke +evoked +evokes +evoking +evolution +evolutionary +evolutionist +evolutionists +evolve +evolved +evolves +evolving +ewer +ewers +ewes +exacerbate +exacerbated +exacerbates +exacerbating +exacerbation +exact +exacted +exacter +exactest +exacting +exactingly +exaction +exactitude +exactly +exactness +exacts +exaggerate +exaggerated +exaggeratedly +exaggerates +exaggerating +exaggeration +exaggerations +exaggerator +exaggerators +exalt +exaltation +exalted +exalting +exalts +exam +examination +examinations +examine +examined +examiner +examiners +examines +examining +example +exampled +examples +exampling +exams +exasperate +exasperated +exasperates +exasperating +exasperation +excavate +excavated +excavates +excavating +excavation +excavations +excavator +excavators +exceed +exceeded +exceeding +exceedingly +exceeds +excel +excelled +excellence +excellencies +excellency +excellent +excellently +excelling +excels +excelsior +except +excepted +excepting +exception +exceptionable +exceptional +exceptionally +exceptions +excepts +excerpt +excerpted +excerpting +excerpts +excess +excesses +excessive +excessively +exchange +exchangeable +exchanged +exchanges +exchanging +exchequer +exchequers +excise +excised +excises +excising +excision +excisions +excitability +excitable +excitably +excitation +excite +excited +excitedly +excitement +excitements +exciter +exciters +excites +exciting +excitingly +exclaim +exclaimed +exclaiming +exclaims +exclamation +exclamations +exclamatory +exclude +excluded +excludes +excluding +exclusion +exclusive +exclusively +exclusiveness +exclusives +exclusivity +excommunicate +excommunicated +excommunicates +excommunicating +excommunication +excommunications +excoriate +excoriated +excoriates +excoriating +excoriation +excoriations +excrement +excremental +excrescence +excrescences +excrescent +excreta +excrete +excreted +excretes +excreting +excretion +excretions +excretory +excruciating +excruciatingly +exculpate +exculpated +exculpates +exculpating +exculpation +exculpatory +excursion +excursionist +excursionists +excursions +excursive +excursively +excursiveness +excusable +excusably +excuse +excused +excuses +excusing +exec +execrable +execrably +execrate +execrated +execrates +execrating +execration +execs +execute +executed +executes +executing +execution +executioner +executioners +executions +executive +executives +executor +executors +executrices +executrix +executrixes +exegeses +exegesis +exegetic +exegetical +exemplar +exemplars +exemplary +exemplification +exemplifications +exemplified +exemplifies +exemplify +exemplifying +exempt +exempted +exempting +exemption +exemptions +exempts +exercise +exercised +exerciser +exercisers +exercises +exercising +exert +exerted +exerting +exertion +exertions +exerts +exes +exhalation +exhalations +exhale +exhaled +exhales +exhaling +exhaust +exhausted +exhaustible +exhausting +exhaustion +exhaustive +exhaustively +exhaustiveness +exhausts +exhibit +exhibited +exhibiting +exhibition +exhibitionism +exhibitionist +exhibitionists +exhibitions +exhibitor +exhibitors +exhibits +exhilarate +exhilarated +exhilarates +exhilarating +exhilaration +exhort +exhortation +exhortations +exhorted +exhorting +exhorts +exhumation +exhumations +exhume +exhumed +exhumes +exhuming +exigence +exigences +exigencies +exigency +exigent +exiguity +exiguous +exile +exiled +exiles +exiling +exist +existed +existence +existences +existent +existential +existentialism +existentialist +existentialists +existentially +existing +exists +exit +exited +exiting +exits +exobiology +exodus +exoduses +exogenous +exonerate +exonerated +exonerates +exonerating +exoneration +exorbitance +exorbitant +exorbitantly +exorcise +exorcised +exorcises +exorcising +exorcism +exorcisms +exorcist +exorcists +exorcize +exorcized +exorcizes +exorcizing +exoskeleton +exoskeletons +exosphere +exospheres +exothermic +exotic +exotically +exoticism +exotics +expand +expandable +expanded +expanding +expands +expanse +expanses +expansible +expansion +expansionary +expansionism +expansionist +expansionists +expansions +expansive +expansively +expansiveness +expatiate +expatiated +expatiates +expatiating +expatiation +expatriate +expatriated +expatriates +expatriating +expatriation +expect +expectancy +expectant +expectantly +expectation +expectations +expected +expecting +expectorant +expectorants +expectorate +expectorated +expectorates +expectorating +expectoration +expects +expedience +expediences +expediencies +expediency +expedient +expediently +expedients +expedite +expedited +expediter +expediters +expedites +expediting +expedition +expeditionary +expeditions +expeditious +expeditiously +expeditiousness +expeditor +expeditors +expel +expelled +expelling +expels +expend +expendable +expendables +expended +expending +expenditure +expenditures +expends +expense +expenses +expensive +expensively +expensiveness +experience +experienced +experiences +experiencing +experiment +experimental +experimentally +experimentation +experimented +experimenter +experimenters +experimenting +experiments +expert +expertise +expertly +expertness +experts +expiate +expiated +expiates +expiating +expiation +expiatory +expiration +expire +expired +expires +expiring +expiry +explain +explainable +explained +explaining +explains +explanation +explanations +explanatory +expletive +expletives +explicable +explicate +explicated +explicates +explicating +explication +explications +explicit +explicitly +explicitness +explode +exploded +explodes +exploding +exploit +exploitable +exploitation +exploitative +exploited +exploiter +exploiters +exploiting +exploits +exploration +explorations +exploratory +explore +explored +explorer +explorers +explores +exploring +explosion +explosions +explosive +explosively +explosiveness +explosives +expo +exponent +exponential +exponentially +exponents +export +exportable +exportation +exported +exporter +exporters +exporting +exports +expos +expose +exposed +exposes +exposing +exposition +expositions +expositor +expositors +expository +expostulate +expostulated +expostulates +expostulating +expostulation +expostulations +exposure +exposures +expound +expounded +expounder +expounders +expounding +expounds +express +expressed +expresses +expressible +expressing +expression +expressionism +expressionist +expressionistic +expressionists +expressionless +expressions +expressive +expressively +expressiveness +expressly +expressway +expressways +expropriate +expropriated +expropriates +expropriating +expropriation +expropriations +expropriator +expropriators +expulsion +expulsions +expunge +expunged +expunges +expunging +expurgate +expurgated +expurgates +expurgating +expurgation +expurgations +exquisite +exquisitely +exquisiteness +extant +extemporaneous +extemporaneously +extemporaneousness +extempore +extemporization +extemporize +extemporized +extemporizes +extemporizing +extend +extendable +extended +extender +extenders +extendible +extending +extends +extensible +extension +extensions +extensive +extensively +extensiveness +extent +extents +extenuate +extenuated +extenuates +extenuating +extenuation +exterior +exteriors +exterminate +exterminated +exterminates +exterminating +extermination +exterminations +exterminator +exterminators +external +externalization +externalizations +externalize +externalized +externalizes +externalizing +externally +externals +extinct +extincted +extincting +extinction +extinctions +extincts +extinguish +extinguishable +extinguished +extinguisher +extinguishers +extinguishes +extinguishing +extirpate +extirpated +extirpates +extirpating +extirpation +extol +extoll +extolled +extolling +extolls +extols +extort +extorted +extorting +extortion +extortionate +extortionately +extortioner +extortioners +extortionist +extortionists +extorts +extra +extract +extracted +extracting +extraction +extractions +extractor +extractors +extracts +extracurricular +extraditable +extradite +extradited +extradites +extraditing +extradition +extraditions +extralegal +extramarital +extramural +extraneous +extraneously +extraordinarily +extraordinary +extrapolate +extrapolated +extrapolates +extrapolating +extrapolation +extrapolations +extras +extrasensory +extraterrestrial +extraterrestrials +extraterritorial +extraterritoriality +extravagance +extravagances +extravagant +extravagantly +extravaganza +extravaganzas +extravehicular +extravert +extraverts +extreme +extremely +extremeness +extremer +extremes +extremest +extremism +extremist +extremists +extremities +extremity +extricable +extricate +extricated +extricates +extricating +extrication +extrinsic +extrinsically +extroversion +extrovert +extroverted +extroverts +extrude +extruded +extrudes +extruding +extrusion +extrusions +extrusive +exuberance +exuberant +exuberantly +exudation +exude +exuded +exudes +exuding +exult +exultant +exultantly +exultation +exulted +exulting +exults +exurb +exurban +exurbanite +exurbanites +exurbia +exurbs +eyeball +eyeballed +eyeballing +eyeballs +eyebrow +eyebrows +eyed +eyedropper +eyedroppers +eyeful +eyefuls +eyeglass +eyeglasses +eyeing +eyelash +eyelashes +eyeless +eyelet +eyelets +eyelid +eyelids +eyeliner +eyeliners +eyeopener +eyeopeners +eyeopening +eyepiece +eyepieces +eyes +eyesight +eyesore +eyesores +eyestrain +eyeteeth +eyetooth +eyewash +eyewitness +eyewitnesses +eying +eyrie +eyries +eyry +fable +fabled +fables +fabric +fabricate +fabricated +fabricates +fabricating +fabrication +fabrications +fabricator +fabricators +fabrics +fabulous +fabulously +facade +facades +face +facecloth +facecloths +faced +faceless +facelift +facelifts +faces +facet +faceted +faceting +facetious +facetiously +facetiousness +facets +facetted +facetting +facial +facially +facials +facile +facilely +facilitate +facilitated +facilitates +facilitating +facilitation +facilitator +facilitators +facilities +facility +facing +facings +facsimile +facsimiled +facsimileing +facsimiles +fact +faction +factional +factionalism +factions +factious +factitious +factoid +factoids +factor +factored +factorial +factorials +factories +factoring +factors +factory +factotum +factotums +facts +factual +factually +faculties +faculty +faddish +faddist +faddists +fade +faded +fades +fading +fads +faecal +faeces +faerie +faeries +faery +fagged +fagging +faggot +faggoting +faggots +fagot +fagoting +fagots +fags +faience +fail +failed +failing +failings +faille +fails +failure +failures +fain +fainer +fainest +faint +fainted +fainter +faintest +fainthearted +fainting +faintly +faintness +faints +fair +fairer +fairest +fairground +fairgrounds +fairies +fairing +fairings +fairly +fairness +fairs +fairway +fairways +fairy +fairyland +fairylands +faith +faithful +faithfully +faithfulness +faithfuls +faithless +faithlessly +faithlessness +faiths +fajita +fajitas +fake +faked +faker +fakers +fakes +faking +fakir +fakirs +falcon +falconer +falconers +falconry +falcons +fall +fallacies +fallacious +fallaciously +fallacy +fallen +fallibility +fallible +fallibleness +fallibly +falling +falloff +falloffs +fallout +fallow +fallowed +fallowing +fallows +falls +false +falsehood +falsehoods +falsely +falseness +falser +falsest +falsetto +falsettos +falsie +falsies +falsification +falsifications +falsified +falsifier +falsifiers +falsifies +falsify +falsifying +falsities +falsity +falter +faltered +faltering +falteringly +falters +fame +famed +familial +familiar +familiarity +familiarization +familiarize +familiarized +familiarizes +familiarizing +familiarly +familiars +families +family +famine +famines +famish +famished +famishes +famishing +famous +famously +fanatic +fanatical +fanatically +fanaticism +fanatics +fancied +fancier +fanciers +fancies +fanciest +fanciful +fancifully +fancifulness +fancily +fanciness +fancy +fancying +fancywork +fandango +fandangoes +fandangos +fanfare +fanfares +fang +fanged +fangs +fanlight +fanlights +fanned +fannies +fanning +fanny +fans +fantail +fantails +fantasia +fantasias +fantasied +fantasies +fantasize +fantasized +fantasizes +fantasizing +fantastic +fantastical +fantastically +fantasy +fantasying +fanzine +fanzines +farad +farads +faraway +farce +farces +farcical +farcically +fare +fared +fares +farewell +farewells +farfetched +farina +farinaceous +faring +farm +farmed +farmer +farmers +farmhand +farmhands +farmhouse +farmhouses +farming +farmland +farms +farmstead +farmsteads +farmyard +farmyards +faro +farrago +farragoes +farragos +farrier +farriers +farrow +farrowed +farrowing +farrows +farseeing +farsighted +farsightedness +fart +farted +farther +farthermost +farthest +farthing +farthings +farting +farts +fascia +fasciae +fascias +fascicle +fascicles +fascinate +fascinated +fascinates +fascinating +fascinatingly +fascination +fascinations +fascism +fascist +fascistic +fascists +fashion +fashionable +fashionably +fashioned +fashioner +fashioners +fashioning +fashions +fast +fastback +fastbacks +fastball +fastballs +fasted +fasten +fastened +fastener +fasteners +fastening +fastenings +fastens +faster +fastest +fastidious +fastidiously +fastidiousness +fasting +fastness +fastnesses +fasts +fatal +fatalism +fatalist +fatalistic +fatalistically +fatalists +fatalities +fatality +fatally +fatback +fate +fated +fateful +fatefully +fatefulness +fates +fathead +fatheaded +fatheads +father +fathered +fatherhood +fathering +fatherland +fatherlands +fatherless +fatherly +fathers +fathom +fathomable +fathomed +fathoming +fathomless +fathoms +fatigue +fatigued +fatigues +fatiguing +fating +fatness +fats +fatten +fattened +fattening +fattens +fatter +fattest +fattier +fatties +fattiest +fattiness +fatty +fatuity +fatuous +fatuously +fatuousness +fatwa +fatwas +faucet +faucets +fault +faulted +faultfinder +faultfinders +faultfinding +faultier +faultiest +faultily +faultiness +faulting +faultless +faultlessly +faultlessness +faults +faulty +faun +fauna +faunae +faunas +fauns +fauvism +fauvist +fauvists +favor +favorable +favorably +favored +favoring +favorite +favorites +favoritism +favors +favour +favoured +favouring +favours +fawn +fawned +fawner +fawners +fawnest +fawning +fawns +faxed +faxes +faxing +fayer +fayest +fays +faze +fazed +fazes +fazing +fealty +fear +feared +fearful +fearfully +fearfulness +fearing +fearless +fearlessly +fearlessness +fears +fearsome +feasibility +feasible +feasibly +feast +feasted +feaster +feasters +feasting +feasts +feat +feather +featherbedding +feathered +featherier +featheriest +feathering +featherless +feathers +featherweight +featherweights +feathery +feats +feature +featured +featureless +features +featuring +febrile +fecal +feces +feckless +fecklessly +fecund +fecundate +fecundated +fecundates +fecundating +fecundation +fecundity +federal +federalism +federalist +federalists +federalization +federalize +federalized +federalizes +federalizing +federally +federals +federate +federated +federates +federating +federation +federations +fedora +fedoras +feds +feeble +feebleness +feebler +feeblest +feebly +feed +feedback +feedbag +feedbags +feeder +feeders +feeding +feedings +feedlot +feedlots +feeds +feel +feeler +feelers +feeling +feelingly +feelings +feels +fees +feet +feign +feigned +feigning +feigns +feint +feinted +feinting +feints +feistier +feistiest +feisty +feldspar +felicitate +felicitated +felicitates +felicitating +felicitation +felicitations +felicities +felicitous +felicitously +felicity +feline +felines +fell +fellatio +felled +feller +fellest +felling +fellow +fellowman +fellowmen +fellows +fellowship +fellowships +fells +felon +felonies +felonious +felons +felony +felt +felted +felting +felts +female +femaleness +females +feminine +femininely +feminines +femininity +feminism +feminist +feminists +femora +femoral +femur +femurs +fence +fenced +fencer +fencers +fences +fencing +fend +fended +fender +fenders +fending +fends +fenestration +fennel +fens +feral +ferment +fermentation +fermented +fermenting +ferments +fermium +fern +fernier +ferniest +ferns +ferny +ferocious +ferociously +ferociousness +ferocity +ferret +ferreted +ferreting +ferrets +ferric +ferried +ferries +ferromagnetic +ferrous +ferrule +ferrules +ferry +ferryboat +ferryboats +ferrying +ferryman +ferrymen +fertile +fertility +fertilization +fertilize +fertilized +fertilizer +fertilizers +fertilizes +fertilizing +ferule +ferules +fervency +fervent +fervently +fervid +fervidly +fervor +fervour +fess +fessed +fesses +fessing +fest +festal +fester +festered +festering +festers +festival +festivals +festive +festively +festiveness +festivities +festivity +festoon +festooned +festooning +festoons +fests +feta +fetal +fetch +fetched +fetcher +fetchers +fetches +fetching +fetchingly +fete +feted +fetes +fetich +fetiches +fetid +fetidness +feting +fetish +fetishes +fetishism +fetishist +fetishistic +fetishists +fetlock +fetlocks +fetter +fettered +fettering +fetters +fettle +fettuccine +fetus +fetuses +feud +feudal +feudalism +feudalistic +feuded +feuding +feuds +fever +fevered +feverish +feverishly +feverishness +fevers +fewer +fewest +fewness +fezes +fezzes +fiance +fiancee +fiancees +fiances +fiasco +fiascoes +fiascos +fiat +fiats +fibbed +fibber +fibbers +fibbing +fiber +fiberboard +fiberfill +fiberglass +fibers +fibre +fibres +fibril +fibrillate +fibrillated +fibrillates +fibrillating +fibrillation +fibrils +fibrin +fibroid +fibrosis +fibrous +fibs +fibula +fibulae +fibular +fibulas +fiche +fiches +fichu +fichus +fickle +fickleness +fickler +ficklest +fiction +fictional +fictionalization +fictionalizations +fictionalize +fictionalized +fictionalizes +fictionalizing +fictionally +fictions +fictitious +fictitiously +fictive +ficus +fiddle +fiddled +fiddler +fiddlers +fiddles +fiddlesticks +fiddling +fidelity +fidget +fidgeted +fidgeting +fidgets +fidgety +fiduciaries +fiduciary +fief +fiefdom +fiefdoms +fiefs +field +fielded +fielder +fielders +fielding +fields +fieldwork +fieldworker +fieldworkers +fiend +fiendish +fiendishly +fiends +fierce +fiercely +fierceness +fiercer +fiercest +fierier +fieriest +fieriness +fiery +fiesta +fiestas +fife +fifer +fifers +fifes +fifteen +fifteens +fifteenth +fifteenths +fifth +fifthly +fifths +fifties +fiftieth +fiftieths +fifty +fight +fighter +fighters +fighting +fights +figment +figments +figs +figuration +figurative +figuratively +figure +figured +figurehead +figureheads +figures +figurine +figurines +figuring +filament +filamentous +filaments +filbert +filberts +filch +filched +filches +filching +file +filed +filer +filers +files +filet +fileted +fileting +filets +filial +filibuster +filibustered +filibusterer +filibusterers +filibustering +filibusters +filigree +filigreed +filigreeing +filigrees +filing +filings +fill +filled +filler +fillers +fillet +filleted +filleting +fillets +fillies +filling +fillings +fillip +filliped +filliping +fillips +fills +filly +film +filmed +filmier +filmiest +filminess +filming +filmmaker +filmmakers +films +filmstrip +filmstrips +filmy +filter +filterable +filtered +filterer +filterers +filtering +filters +filth +filthier +filthiest +filthily +filthiness +filthy +filtrable +filtrate +filtrated +filtrates +filtrating +filtration +finagle +finagled +finagler +finaglers +finagles +finagling +final +finale +finales +finalist +finalists +finality +finalization +finalize +finalized +finalizes +finalizing +finally +finals +finance +financed +finances +financial +financially +financier +financiers +financing +finch +finches +find +finder +finders +finding +findings +finds +fine +fined +finely +fineness +finer +finery +fines +finespun +finesse +finessed +finesses +finessing +finest +finger +fingerboard +fingerboards +fingered +fingering +fingerings +fingerling +fingerlings +fingernail +fingernails +fingerprint +fingerprinted +fingerprinting +fingerprints +fingers +fingertip +fingertips +finial +finials +finical +finickier +finickiest +finickiness +finicky +fining +finis +finises +finish +finished +finisher +finishers +finishes +finishing +finite +finitely +fink +finked +finking +finks +finned +finnier +finniest +finny +fins +fiord +fiords +fire +firearm +firearms +fireball +fireballs +firebomb +firebombed +firebombing +firebombs +firebox +fireboxes +firebrand +firebrands +firebreak +firebreaks +firebrick +firebricks +firebug +firebugs +firecracker +firecrackers +fired +firedamp +firefight +firefighter +firefighters +firefighting +firefights +fireflies +firefly +firehouse +firehouses +firelight +fireman +firemen +fireplace +fireplaces +fireplug +fireplugs +firepower +fireproof +fireproofed +fireproofing +fireproofs +firer +firers +fires +fireside +firesides +firestorm +firestorms +firetrap +firetraps +firetruck +firetrucks +firewall +firewalls +firewater +firewood +firework +fireworks +firing +firm +firmament +firmaments +firmed +firmer +firmest +firming +firmly +firmness +firms +firmware +firs +first +firstborn +firstborns +firsthand +firstly +firsts +firth +firths +fiscal +fiscally +fiscals +fish +fishbowl +fishbowls +fishcake +fishcakes +fished +fisher +fisheries +fisherman +fishermen +fishers +fishery +fishes +fishhook +fishhooks +fishier +fishiest +fishily +fishiness +fishing +fishmonger +fishmongers +fishnet +fishnets +fishpond +fishponds +fishtail +fishtailed +fishtailing +fishtails +fishwife +fishwives +fishy +fissile +fission +fissionable +fissure +fissures +fist +fistfight +fistfights +fistful +fistfuls +fisticuffs +fists +fistula +fistulae +fistulas +fistulous +fitful +fitfully +fitfulness +fitly +fitness +fits +fitted +fitter +fitters +fittest +fitting +fittingly +fittings +five +fives +fixable +fixate +fixated +fixates +fixating +fixation +fixations +fixative +fixatives +fixed +fixedly +fixer +fixers +fixes +fixing +fixings +fixity +fixture +fixtures +fizz +fizzed +fizzes +fizzier +fizziest +fizzing +fizzle +fizzled +fizzles +fizzling +fizzy +fjord +fjords +flab +flabbergast +flabbergasted +flabbergasting +flabbergasts +flabbier +flabbiest +flabbily +flabbiness +flabby +flaccid +flaccidity +flaccidly +flack +flacks +flag +flagella +flagellate +flagellated +flagellates +flagellating +flagellation +flagellum +flagellums +flagged +flagging +flagman +flagmen +flagon +flagons +flagpole +flagpoles +flagrance +flagrancy +flagrant +flagrantly +flags +flagship +flagships +flagstaff +flagstaffs +flagstone +flagstones +flail +flailed +flailing +flails +flair +flairs +flak +flake +flaked +flakes +flakier +flakiest +flakiness +flaking +flaky +flambe +flambeed +flambeing +flambes +flamboyance +flamboyancy +flamboyant +flamboyantly +flame +flamed +flamenco +flamencos +flameproof +flameproofed +flameproofing +flameproofs +flames +flamethrower +flamethrowers +flaming +flamingo +flamingoes +flamingos +flammability +flammable +flammables +flan +flange +flanges +flank +flanked +flanker +flankers +flanking +flanks +flannel +flanneled +flannelet +flannelette +flanneling +flannelled +flannelling +flannels +flans +flap +flapjack +flapjacks +flapped +flapper +flappers +flapping +flaps +flare +flared +flares +flareup +flareups +flaring +flash +flashback +flashbacks +flashbulb +flashbulbs +flashcard +flashcards +flashcube +flashcubes +flashed +flasher +flashers +flashes +flashest +flashgun +flashguns +flashier +flashiest +flashily +flashiness +flashing +flashlight +flashlights +flashpoint +flashpoints +flashy +flask +flasks +flat +flatbed +flatbeds +flatboat +flatboats +flatcar +flatcars +flatfeet +flatfish +flatfishes +flatfoot +flatfooted +flatfoots +flatiron +flatirons +flatland +flatly +flatness +flats +flatted +flatten +flattened +flattening +flattens +flatter +flattered +flatterer +flatterers +flattering +flatteringly +flatters +flattery +flattest +flatting +flattish +flattop +flattops +flatulence +flatulent +flatus +flatware +flatworm +flatworms +flaunt +flaunted +flaunting +flauntingly +flaunts +flautist +flautists +flavor +flavored +flavorful +flavoring +flavorings +flavorless +flavors +flavorsome +flavour +flavoured +flavouring +flavours +flaw +flawed +flawing +flawless +flawlessly +flawlessness +flaws +flax +flaxen +flay +flayed +flaying +flays +flea +fleabag +fleabags +fleas +fleck +flecked +flecking +flecks +fled +fledgeling +fledgelings +fledgling +fledglings +flee +fleece +fleeced +fleecer +fleecers +fleeces +fleecier +fleeciest +fleeciness +fleecing +fleecy +fleeing +flees +fleet +fleeted +fleeter +fleetest +fleeting +fleetingly +fleetingness +fleetly +fleetness +fleets +flesh +fleshed +fleshes +fleshier +fleshiest +fleshing +fleshlier +fleshliest +fleshly +fleshpot +fleshpots +fleshy +flew +flex +flexed +flexes +flexibility +flexible +flexibly +flexing +flexitime +flextime +flibbertigibbet +flibbertigibbets +flick +flicked +flicker +flickered +flickering +flickers +flicking +flicks +flied +flier +fliers +flies +fliest +flight +flightier +flightiest +flightiness +flightless +flights +flighty +flimflam +flimflammed +flimflamming +flimflams +flimsier +flimsiest +flimsily +flimsiness +flimsy +flinch +flinched +flinches +flinching +fling +flinging +flings +flint +flintier +flintiest +flintlock +flintlocks +flints +flinty +flip +flippancy +flippant +flippantly +flipped +flipper +flippers +flippest +flipping +flips +flirt +flirtation +flirtations +flirtatious +flirtatiously +flirtatiousness +flirted +flirting +flirts +flit +flits +flitted +flitting +float +floated +floater +floaters +floating +floats +flock +flocked +flocking +flocks +floe +floes +flog +flogged +flogger +floggers +flogging +floggings +flogs +flood +flooded +floodgate +floodgates +flooding +floodlight +floodlighted +floodlighting +floodlights +floodlit +floodplain +floodplains +floods +floodwater +floor +floorboard +floorboards +floored +flooring +floors +floorwalker +floorwalkers +floozie +floozies +floozy +flop +flophouse +flophouses +flopped +floppier +floppies +floppiest +floppily +floppiness +flopping +floppy +flops +flora +florae +floral +floras +florescence +florescent +floret +florets +florid +florider +floridest +floridly +floridness +florin +florins +florist +florists +floss +flossed +flosses +flossier +flossiest +flossing +flossy +flotation +flotations +flotilla +flotillas +flotsam +flounce +flounced +flounces +flouncier +flounciest +flouncing +flouncy +flounder +floundered +floundering +flounders +flour +floured +flouring +flourish +flourished +flourishes +flourishing +flours +floury +flout +flouted +flouter +flouters +flouting +flouts +flow +flowchart +flowcharts +flowed +flower +flowerbed +flowerbeds +flowered +flowerier +floweriest +floweriness +flowering +flowerless +flowerpot +flowerpots +flowers +flowery +flowing +flown +flows +flub +flubbed +flubbing +flubs +fluctuate +fluctuated +fluctuates +fluctuating +fluctuation +fluctuations +flue +fluency +fluent +fluently +flues +fluff +fluffed +fluffier +fluffiest +fluffiness +fluffing +fluffs +fluffy +fluid +fluidity +fluidly +fluids +fluke +flukes +flukey +flukier +flukiest +fluky +flume +flumes +flummox +flummoxed +flummoxes +flummoxing +flung +flunk +flunked +flunkey +flunkeys +flunkies +flunking +flunks +flunky +fluoresce +fluoresced +fluorescence +fluorescent +fluoresces +fluorescing +fluoridate +fluoridated +fluoridates +fluoridating +fluoridation +fluoride +fluorides +fluorine +fluorite +fluorocarbon +fluorocarbons +fluoroscope +fluoroscopes +fluoroscopic +flurried +flurries +flurry +flurrying +flush +flushed +flusher +flushes +flushest +flushing +fluster +flustered +flustering +flusters +flute +fluted +flutes +fluting +flutist +flutists +flutter +fluttered +fluttering +flutters +fluttery +flux +fluxed +fluxes +fluxing +flyable +flyblown +flyby +flybys +flycatcher +flycatchers +flyer +flyers +flying +flyleaf +flyleaves +flypaper +flypapers +flyspeck +flyspecked +flyspecking +flyspecks +flyswatter +flyswatters +flyway +flyways +flyweight +flyweights +flywheel +flywheels +foal +foaled +foaling +foals +foam +foamed +foamier +foamiest +foaminess +foaming +foams +foamy +fobbed +fobbing +fobs +focal +focally +foci +focus +focused +focuses +focusing +focussed +focusses +focussing +fodder +fodders +foes +foetal +foetus +foetuses +fogbound +fogey +fogeys +fogged +foggier +foggiest +foggily +fogginess +fogging +foggy +foghorn +foghorns +fogies +fogs +fogy +fogyish +foible +foibles +foil +foiled +foiling +foils +foist +foisted +foisting +foists +fold +foldaway +folded +folder +folders +folding +foldout +foldouts +folds +foliage +folio +folios +folk +folklore +folkloric +folklorist +folklorists +folks +folksier +folksiest +folksiness +folksinger +folksingers +folksinging +folksy +folktale +folktales +folkway +folkways +follicle +follicles +follies +follow +followed +follower +followers +following +followings +follows +folly +foment +fomentation +fomented +fomenting +foments +fond +fondant +fondants +fonder +fondest +fondle +fondled +fondles +fondling +fondly +fondness +fondu +fondue +fondues +font +fontanel +fontanelle +fontanelles +fontanels +fonts +food +foodie +foodies +foods +foodstuff +foodstuffs +fool +fooled +fooleries +foolery +foolhardier +foolhardiest +foolhardily +foolhardiness +foolhardy +fooling +foolish +foolishly +foolishness +foolproof +fools +foolscap +foot +footage +football +footballer +footballers +footballs +footbridge +footbridges +footed +footfall +footfalls +foothill +foothills +foothold +footholds +footing +footings +footless +footlights +footling +footlings +footlocker +footlockers +footloose +footman +footmen +footnote +footnoted +footnotes +footnoting +footpath +footpaths +footprint +footprints +footrace +footraces +footrest +footrests +foots +footsie +footsies +footsore +footstep +footsteps +footstool +footstools +footwear +footwork +foppery +foppish +foppishness +fops +fora +forage +foraged +forager +foragers +forages +foraging +foray +forayed +foraying +forays +forbad +forbade +forbear +forbearance +forbearing +forbears +forbid +forbidden +forbidding +forbiddingly +forbids +forbore +forborne +force +forced +forceful +forcefully +forcefulness +forceps +forces +forcible +forcibly +forcing +ford +fordable +forded +fording +fords +fore +forearm +forearmed +forearming +forearms +forebear +forebears +forebode +foreboded +forebodes +foreboding +forebodings +forecast +forecasted +forecaster +forecasters +forecasting +forecastle +forecastles +forecasts +foreclose +foreclosed +forecloses +foreclosing +foreclosure +foreclosures +forecourt +forecourts +foredoom +foredoomed +foredooming +foredooms +forefather +forefathers +forefeet +forefinger +forefingers +forefoot +forefront +forefronts +foregather +foregathered +foregathering +foregathers +forego +foregoes +foregoing +foregone +foreground +foregrounded +foregrounding +foregrounds +forehand +forehands +forehead +foreheads +foreign +foreigner +foreigners +foreignness +foreknew +foreknow +foreknowing +foreknowledge +foreknown +foreknows +foreleg +forelegs +forelimb +forelimbs +forelock +forelocks +foreman +foremast +foremasts +foremen +foremost +forename +forenamed +forenames +forenoon +forenoons +forensic +forensically +forensics +foreordain +foreordained +foreordaining +foreordains +forepart +foreparts +foreperson +forepersons +foreplay +forequarter +forequarters +forerunner +forerunners +fores +foresail +foresails +foresaw +foresee +foreseeable +foreseeing +foreseen +foreseer +foreseers +foresees +foreshadow +foreshadowed +foreshadowing +foreshadows +foreshorten +foreshortened +foreshortening +foreshortens +foresight +foresighted +foresightedness +foreskin +foreskins +forest +forestall +forestalled +forestalling +forestalls +forestation +forested +forester +foresters +foresting +forestland +forestry +forests +foreswear +foreswearing +foreswears +foreswore +foresworn +foretaste +foretasted +foretastes +foretasting +foretell +foretelling +foretells +forethought +foretold +forever +forevermore +forewarn +forewarned +forewarning +forewarns +forewent +forewoman +forewomen +foreword +forewords +forfeit +forfeited +forfeiting +forfeits +forfeiture +forgather +forgathered +forgathering +forgathers +forgave +forge +forged +forger +forgeries +forgers +forgery +forges +forget +forgetful +forgetfully +forgetfulness +forgets +forgettable +forgetting +forging +forgings +forgivable +forgive +forgiven +forgiveness +forgiver +forgivers +forgives +forgiving +forgo +forgoer +forgoers +forgoes +forgoing +forgone +forgot +forgotten +fork +forked +forkful +forkfuls +forking +forklift +forklifts +forks +forlorn +forlornly +form +formal +formaldehyde +formalism +formalist +formalists +formalities +formality +formalization +formalize +formalized +formalizes +formalizing +formally +formals +format +formated +formating +formation +formations +formative +formats +formatted +formatting +formed +former +formerly +formfitting +formic +formidable +formidably +forming +formless +formlessly +formlessness +forms +formula +formulae +formulaic +formulas +formulate +formulated +formulates +formulating +formulation +formulations +formulator +formulators +fornicate +fornicated +fornicates +fornicating +fornication +fornicator +fornicators +forsake +forsaken +forsakes +forsaking +forsook +forsooth +forswear +forswearing +forswears +forswore +forsworn +forsythia +forsythias +fort +forte +fortes +forth +forthcoming +forthright +forthrightly +forthrightness +forthwith +forties +fortieth +fortieths +fortification +fortifications +fortified +fortifier +fortifiers +fortifies +fortify +fortifying +fortissimo +fortitude +fortnight +fortnightly +fortnights +fortress +fortresses +forts +fortuitous +fortuitously +fortuitousness +fortuity +fortunate +fortunately +fortune +fortunes +fortuneteller +fortunetellers +fortunetelling +forty +forum +forums +forward +forwarded +forwarder +forwarders +forwardest +forwarding +forwardly +forwardness +forwards +forwent +fossil +fossilization +fossilize +fossilized +fossilizes +fossilizing +fossils +foster +fostered +fostering +fosters +fought +foul +foulard +fouled +fouler +foulest +fouling +foully +foulmouthed +foulness +fouls +found +foundation +foundations +founded +founder +foundered +foundering +founders +founding +foundling +foundlings +foundries +foundry +founds +fount +fountain +fountainhead +fountainheads +fountains +founts +four +fourfold +fourposter +fourposters +fours +fourscore +foursome +foursomes +foursquare +fourteen +fourteens +fourteenth +fourteenths +fourth +fourthly +fourths +fowl +fowled +fowling +fowls +foxed +foxes +foxfire +foxglove +foxgloves +foxhole +foxholes +foxhound +foxhounds +foxier +foxiest +foxily +foxiness +foxing +foxtrot +foxtrots +foxtrotted +foxtrotting +foxy +foyer +foyers +fracas +fracases +fractal +fractals +fraction +fractional +fractionally +fractions +fractious +fractiously +fractiousness +fracture +fractured +fractures +fracturing +fragile +fragility +fragment +fragmentary +fragmentation +fragmented +fragmenting +fragments +fragrance +fragrances +fragrant +fragrantly +frail +frailer +frailest +frailly +frailness +frailties +frailty +frame +framed +framer +framers +frames +framework +frameworks +framing +franc +franchise +franchised +franchisee +franchisees +franchiser +franchisers +franchises +franchising +franchisor +franchisors +francium +francs +frangibility +frangible +frank +franked +franker +frankest +frankfurter +frankfurters +frankincense +franking +frankly +frankness +franks +frantic +frantically +frappe +frappes +frat +fraternal +fraternally +fraternities +fraternity +fraternization +fraternize +fraternized +fraternizer +fraternizers +fraternizes +fraternizing +fratricidal +fratricide +fratricides +frats +fraud +frauds +fraudulence +fraudulent +fraudulently +fraught +fray +frayed +fraying +frays +frazzle +frazzled +frazzles +frazzling +freak +freaked +freakier +freakiest +freaking +freakish +freakishly +freakishness +freakout +freakouts +freaks +freaky +freckle +freckled +freckles +frecklier +freckliest +freckling +freckly +free +freebase +freebased +freebases +freebasing +freebee +freebees +freebie +freebies +freebooter +freebooters +freeborn +freed +freedman +freedmen +freedom +freedoms +freehand +freehold +freeholder +freeholders +freeholds +freeing +freelance +freelanced +freelancer +freelancers +freelances +freelancing +freeload +freeloaded +freeloader +freeloaders +freeloading +freeloads +freely +freeman +freemen +freer +frees +freest +freestanding +freestone +freestones +freestyle +freestyles +freethinker +freethinkers +freethinking +freeware +freeway +freeways +freewheel +freewheeled +freewheeling +freewheels +freewill +freezable +freeze +freezer +freezers +freezes +freezing +freight +freighted +freighter +freighters +freighting +freights +frenetic +frenetically +frenzied +frenziedly +frenzies +frenzy +frequencies +frequency +frequent +frequented +frequenter +frequenters +frequentest +frequenting +frequently +frequents +fresco +frescoes +frescos +fresh +freshen +freshened +freshener +fresheners +freshening +freshens +fresher +freshest +freshet +freshets +freshly +freshman +freshmen +freshness +freshwater +fret +fretful +fretfully +fretfulness +frets +fretsaw +fretsaws +fretted +fretting +fretwork +friable +friar +friaries +friars +friary +fricassee +fricasseed +fricasseeing +fricassees +fricative +fricatives +friction +frictional +fridge +fridges +fried +friedcake +friedcakes +friend +friendless +friendlier +friendlies +friendliest +friendliness +friendly +friends +friendship +friendships +frier +friers +fries +frieze +friezes +frig +frigate +frigates +frigged +frigging +fright +frighted +frighten +frightened +frightening +frighteningly +frightens +frightful +frightfully +frightfulness +frighting +frights +frigid +frigidity +frigidly +frigidness +frigs +frill +frillier +frilliest +frills +frilly +fringe +fringed +fringes +fringing +fripperies +frippery +frisk +frisked +friskier +friskiest +friskily +friskiness +frisking +frisks +frisky +fritter +frittered +frittering +fritters +fritz +frivolities +frivolity +frivolous +frivolously +frivolousness +friz +frizz +frizzed +frizzes +frizzier +frizziest +frizzing +frizzle +frizzled +frizzles +frizzlier +frizzliest +frizzling +frizzly +frizzy +frock +frocks +frog +frogman +frogmen +frogs +frolic +frolicked +frolicker +frolickers +frolicking +frolics +frolicsome +from +frond +fronds +front +frontage +frontages +frontal +frontally +fronted +frontier +frontiers +frontiersman +frontiersmen +fronting +frontispiece +frontispieces +frontrunner +frontrunners +fronts +frontward +frontwards +frosh +frost +frostbit +frostbite +frostbites +frostbiting +frostbitten +frosted +frostier +frostiest +frostily +frostiness +frosting +frostings +frosts +frosty +froth +frothed +frothier +frothiest +frothiness +frothing +froths +frothy +froufrou +froward +frowardness +frown +frowned +frowning +frowns +frowsier +frowsiest +frowsy +frowzier +frowziest +frowzily +frowziness +frowzy +froze +frozen +fructified +fructifies +fructify +fructifying +fructose +frugal +frugality +frugally +fruit +fruitcake +fruitcakes +fruited +fruitful +fruitfully +fruitfulness +fruitier +fruitiest +fruitiness +fruiting +fruition +fruitless +fruitlessly +fruitlessness +fruits +fruity +frump +frumpier +frumpiest +frumpish +frumps +frumpy +frusta +frustrate +frustrated +frustrates +frustrating +frustratingly +frustration +frustrations +frustum +frustums +fryer +fryers +frying +fuchsia +fuchsias +fuck +fucked +fucker +fuckers +fucking +fucks +fuddle +fuddled +fuddles +fuddling +fudge +fudged +fudges +fudging +fuehrer +fuehrers +fuel +fueled +fueling +fuelled +fuelling +fuels +fugal +fugitive +fugitives +fugue +fugues +fuhrer +fuhrers +fulcra +fulcrum +fulcrums +fulfil +fulfill +fulfilled +fulfilling +fulfillment +fulfills +fulfilment +fulfils +full +fullback +fullbacks +fulled +fuller +fullers +fullest +fulling +fullness +fulls +fully +fulminate +fulminated +fulminates +fulminating +fulmination +fulminations +fulness +fulsome +fulsomely +fulsomeness +fumble +fumbled +fumbler +fumblers +fumbles +fumbling +fumblingly +fume +fumed +fumes +fumier +fumiest +fumigant +fumigants +fumigate +fumigated +fumigates +fumigating +fumigation +fumigator +fumigators +fuming +fumy +function +functional +functionally +functionaries +functionary +functioned +functioning +functions +fund +fundamental +fundamentalism +fundamentalist +fundamentalists +fundamentally +fundamentals +funded +funding +fundraiser +fundraisers +funds +funeral +funerals +funerary +funereal +funereally +fungal +fungi +fungible +fungibles +fungicidal +fungicide +fungicides +fungoid +fungous +fungus +funguses +funicular +funiculars +funk +funked +funkier +funkiest +funkiness +funking +funks +funky +funnel +funneled +funneling +funnelled +funnelling +funnels +funner +funnest +funnier +funnies +funniest +funnily +funniness +funny +funnyman +funnymen +furbelow +furbish +furbished +furbishes +furbishing +furies +furious +furiously +furl +furled +furling +furlong +furlongs +furlough +furloughed +furloughing +furloughs +furls +furnace +furnaces +furnish +furnished +furnishes +furnishing +furnishings +furniture +furor +furore +furores +furors +furred +furrier +furriers +furriest +furriness +furring +furrow +furrowed +furrowing +furrows +furry +furs +further +furtherance +furthered +furthering +furthermore +furthermost +furthers +furthest +furtive +furtively +furtiveness +fury +furze +fuse +fused +fusee +fusees +fuselage +fuselages +fuses +fusibility +fusible +fusileer +fusileers +fusilier +fusiliers +fusillade +fusillades +fusing +fusion +fuss +fussbudget +fussbudgets +fussed +fusses +fussier +fussiest +fussily +fussiness +fussing +fusspot +fusspots +fussy +fustian +fustier +fustiest +fustiness +fusty +futile +futilely +futility +futon +futons +future +futures +futurism +futurist +futuristic +futurists +futurities +futurity +futurologist +futurologists +futurology +futz +futzed +futzes +futzing +fuze +fuzed +fuzes +fuzing +fuzz +fuzzed +fuzzes +fuzzier +fuzziest +fuzzily +fuzziness +fuzzing +fuzzy +gabardine +gabardines +gabbed +gabbier +gabbiest +gabbiness +gabbing +gabble +gabbled +gabbles +gabbling +gabby +gaberdine +gaberdines +gabfest +gabfests +gable +gabled +gables +gabs +gadabout +gadabouts +gadded +gadder +gadders +gadding +gadflies +gadfly +gadget +gadgetry +gadgets +gadolinium +gads +gaff +gaffe +gaffed +gaffer +gaffers +gaffes +gaffing +gaffs +gaga +gage +gaged +gages +gagged +gagging +gaggle +gaggles +gaging +gags +gaiety +gaily +gain +gained +gainer +gainers +gainful +gainfully +gaining +gains +gainsaid +gainsay +gainsayer +gainsayers +gainsaying +gainsays +gait +gaiter +gaiters +gaits +gala +galactic +galas +galaxies +galaxy +gale +galena +gales +gall +gallant +gallanter +gallantest +gallantly +gallantry +gallants +gallbladder +gallbladders +galled +galleon +galleons +galleria +gallerias +galleries +gallery +galley +galleys +gallimaufries +gallimaufry +galling +gallium +gallivant +gallivanted +gallivanting +gallivants +gallon +gallons +gallop +galloped +galloping +gallops +gallows +gallowses +galls +gallstone +gallstones +galoot +galoots +galore +galosh +galoshe +galoshes +gals +galumph +galumphed +galumphing +galumphs +galvanic +galvanise +galvanised +galvanises +galvanising +galvanism +galvanization +galvanize +galvanized +galvanizes +galvanizing +galvanometer +galvanometers +gambit +gambits +gamble +gambled +gambler +gamblers +gambles +gambling +gambol +gamboled +gamboling +gambolled +gambolling +gambols +game +gamecock +gamecocks +gamed +gamekeeper +gamekeepers +gamely +gameness +gamer +games +gamesmanship +gamest +gamester +gamesters +gamete +gametes +gametic +gamey +gamier +gamiest +gamin +gamine +gamines +gaminess +gaming +gamins +gamma +gammas +gammon +gamut +gamuts +gamy +gander +ganders +gang +gangbusters +ganged +ganging +gangland +ganglia +ganglier +gangliest +gangling +ganglion +ganglionic +ganglions +gangly +gangplank +gangplanks +gangrene +gangrened +gangrenes +gangrening +gangrenous +gangs +gangster +gangsters +gangway +gangways +gannet +gannets +gantlet +gantlets +gantries +gantry +gaol +gaoled +gaoler +gaolers +gaoling +gaols +gape +gaped +gapes +gaping +gaps +garage +garaged +garages +garaging +garb +garbage +garbanzo +garbanzos +garbed +garbing +garble +garbled +garbles +garbling +garbs +garcon +garcons +garden +gardened +gardener +gardeners +gardenia +gardenias +gardening +gardens +garfish +garfishes +gargantuan +gargle +gargled +gargles +gargling +gargoyle +gargoyles +garish +garishly +garishness +garland +garlanded +garlanding +garlands +garlic +garlicky +garment +garments +garner +garnered +garnering +garners +garnet +garnets +garnish +garnished +garnishee +garnisheed +garnisheeing +garnishees +garnishes +garnishing +garnishment +garnishments +garote +garoted +garotes +garoting +garotte +garotted +garottes +garotting +garret +garrets +garrison +garrisoned +garrisoning +garrisons +garrote +garroted +garroter +garroters +garrotes +garroting +garrotte +garrotted +garrottes +garrotting +garrulity +garrulous +garrulously +garrulousness +gars +garter +garters +gasbag +gasbags +gaseous +gases +gash +gashed +gashes +gashing +gasket +gaskets +gaslight +gaslights +gasohol +gasolene +gasoline +gasp +gasped +gasping +gasps +gassed +gasses +gassier +gassiest +gassing +gassy +gastric +gastritis +gastroenteritis +gastrointestinal +gastronomic +gastronomical +gastronomically +gastronomy +gastropod +gastropods +gasworks +gate +gatecrash +gatecrashed +gatecrasher +gatecrashers +gatecrashes +gatecrashing +gated +gatehouse +gatehouses +gatekeeper +gatekeepers +gatepost +gateposts +gates +gateway +gateways +gather +gathered +gatherer +gatherers +gathering +gatherings +gathers +gating +gator +gators +gauche +gauchely +gaucheness +gaucher +gaucherie +gauchest +gaucho +gauchos +gaudier +gaudiest +gaudily +gaudiness +gaudy +gauge +gauged +gauges +gauging +gaunt +gaunter +gauntest +gauntlet +gauntlets +gauntness +gauze +gauzier +gauziest +gauziness +gauzy +gave +gavel +gavels +gavotte +gavottes +gawk +gawked +gawkier +gawkiest +gawkily +gawkiness +gawking +gawks +gawky +gayer +gayest +gayety +gayly +gayness +gays +gaze +gazebo +gazeboes +gazebos +gazed +gazelle +gazelles +gazer +gazers +gazes +gazette +gazetted +gazetteer +gazetteers +gazettes +gazetting +gazing +gazpacho +gear +gearbox +gearboxes +geared +gearing +gears +gearshift +gearshifts +gearwheel +gearwheels +gecko +geckoes +geckos +geed +geegaw +geegaws +geeing +geek +geekier +geekiest +geeks +geeky +gees +geese +geez +geezer +geezers +geisha +geishas +gelatin +gelatine +gelatinous +gelcap +gelcaps +geld +gelded +gelding +geldings +gelds +gelid +gelignite +gelled +gelling +gels +gelt +gemmology +gemological +gemologist +gemologists +gemology +gems +gemstone +gemstones +gendarme +gendarmes +gender +genders +gene +genealogical +genealogically +genealogies +genealogist +genealogists +genealogy +genera +general +generalissimo +generalissimos +generalist +generalists +generalities +generality +generalization +generalizations +generalize +generalized +generalizes +generalizing +generally +generals +generalship +generate +generated +generates +generating +generation +generational +generations +generative +generator +generators +generic +generically +generics +generosities +generosity +generous +generously +generousness +genes +geneses +genesis +genetic +genetically +geneticist +geneticists +genetics +genial +geniality +genially +genie +genies +genii +genital +genitalia +genitally +genitals +genitive +genitives +genitourinary +genius +geniuses +genocidal +genocide +genome +genomes +genre +genres +gent +genteel +genteelly +genteelness +gentian +gentians +gentile +gentiles +gentility +gentle +gentled +gentlefolk +gentlefolks +gentleman +gentlemanly +gentlemen +gentleness +gentler +gentles +gentlest +gentlewoman +gentlewomen +gentling +gently +gentries +gentrification +gentrified +gentrifies +gentrify +gentrifying +gentry +gents +genuflect +genuflected +genuflecting +genuflection +genuflections +genuflects +genuine +genuinely +genuineness +genus +genuses +geocentric +geocentrically +geochemistry +geode +geodes +geodesic +geodesics +geodesy +geodetic +geographer +geographers +geographic +geographical +geographically +geographies +geography +geologic +geological +geologically +geologies +geologist +geologists +geology +geomagnetic +geomagnetism +geometric +geometrical +geometrically +geometries +geometry +geophysical +geophysicist +geophysicists +geophysics +geopolitical +geopolitics +geostationary +geosynchronous +geosyncline +geosynclines +geothermal +geothermic +geranium +geraniums +gerbil +gerbils +geriatric +geriatrics +germ +germane +germanium +germicidal +germicide +germicides +germinal +germinate +germinated +germinates +germinating +germination +germs +gerontological +gerontologist +gerontologists +gerontology +gerrymander +gerrymandered +gerrymandering +gerrymanders +gerund +gerunds +gestapo +gestapos +gestate +gestated +gestates +gestating +gestation +gestational +gesticulate +gesticulated +gesticulates +gesticulating +gesticulation +gesticulations +gestural +gesture +gestured +gestures +gesturing +gesundheit +getaway +getaways +gets +getting +getup +gewgaw +gewgaws +geyser +geysered +geysering +geysers +ghastlier +ghastliest +ghastliness +ghastly +ghat +ghats +gherkin +gherkins +ghetto +ghettoes +ghettoize +ghettoized +ghettoizes +ghettoizing +ghettos +ghost +ghosted +ghosting +ghostlier +ghostliest +ghostliness +ghostly +ghosts +ghostwrite +ghostwriter +ghostwriters +ghostwrites +ghostwriting +ghostwritten +ghostwrote +ghoul +ghoulish +ghoulishly +ghoulishness +ghouls +giant +giantess +giantesses +giants +gibber +gibbered +gibbering +gibberish +gibbers +gibbet +gibbeted +gibbeting +gibbets +gibbon +gibbons +gibbous +gibe +gibed +gibes +gibing +giblet +giblets +giddier +giddiest +giddily +giddiness +giddy +gift +gifted +gifting +gifts +gigabyte +gigabytes +gigahertz +gigantic +gigantically +gigged +gigging +giggle +giggled +giggler +gigglers +giggles +gigglier +giggliest +giggling +giggly +gigolo +gigolos +gigs +gild +gilded +gilder +gilders +gilding +gilds +gill +gills +gilt +gilts +gimbals +gimcrack +gimcrackery +gimcracks +gimlet +gimleted +gimleting +gimlets +gimme +gimmes +gimmick +gimmickry +gimmicks +gimmicky +gimp +gimped +gimpier +gimpiest +gimping +gimps +gimpy +ginger +gingerbread +gingerly +gingersnap +gingersnaps +gingery +gingham +gingivitis +gingko +gingkoes +gingkos +ginkgo +ginkgoes +ginkgos +ginned +ginning +gins +ginseng +gipsies +gipsy +giraffe +giraffes +gird +girded +girder +girders +girding +girdle +girdled +girdles +girdling +girds +girl +girlfriend +girlfriends +girlhood +girlhoods +girlish +girlishly +girlishness +girls +girly +girt +girted +girth +girths +girting +girts +gismo +gismos +gist +give +giveaway +giveaways +giveback +givebacks +given +givens +giver +givers +gives +giving +gizmo +gizmos +gizzard +gizzards +glace +glaceed +glaceing +glaces +glacial +glacially +glaciate +glaciated +glaciates +glaciating +glaciation +glaciations +glacier +glaciers +glad +gladden +gladdened +gladdening +gladdens +gladder +gladdest +glade +glades +gladiator +gladiatorial +gladiators +gladiola +gladiolas +gladioli +gladiolus +gladioluses +gladly +gladness +glads +gladsome +glamor +glamorization +glamorize +glamorized +glamorizes +glamorizing +glamorous +glamorously +glamour +glamourize +glamourized +glamourizes +glamourizing +glamourous +glance +glanced +glances +glancing +gland +glandes +glands +glandular +glans +glare +glared +glares +glaring +glaringly +glasnost +glass +glassblower +glassblowers +glassblowing +glassed +glasses +glassful +glassfuls +glassier +glassiest +glassily +glassiness +glassing +glassware +glassy +glaucoma +glaze +glazed +glazes +glazier +glaziers +glazing +gleam +gleamed +gleaming +gleams +glean +gleaned +gleaner +gleaners +gleaning +gleanings +gleans +glee +gleeful +gleefully +gleefulness +glen +glens +glib +glibber +glibbest +glibly +glibness +glide +glided +glider +gliders +glides +gliding +glimmer +glimmered +glimmering +glimmerings +glimmers +glimpse +glimpsed +glimpses +glimpsing +glint +glinted +glinting +glints +glissandi +glissando +glissandos +glisten +glistened +glistening +glistens +glister +glistered +glistering +glisters +glitch +glitches +glitter +glittered +glittering +glitters +glittery +glitz +glitzier +glitziest +glitzy +gloaming +gloamings +gloat +gloated +gloating +gloatingly +gloats +glob +global +globalism +globalist +globalists +globalization +globalize +globalized +globalizes +globalizing +globally +globe +globes +globetrotter +globetrotters +globs +globular +globule +globules +globulin +glockenspiel +glockenspiels +gloom +gloomier +gloomiest +gloomily +gloominess +gloomy +glop +gloppier +gloppiest +gloppy +gloried +glories +glorification +glorified +glorifies +glorify +glorifying +glorious +gloriously +glory +glorying +gloss +glossaries +glossary +glossed +glosses +glossier +glossies +glossiest +glossily +glossiness +glossing +glossolalia +glossy +glottal +glottides +glottis +glottises +glove +gloved +gloves +gloving +glow +glowed +glower +glowered +glowering +glowers +glowing +glowingly +glows +glowworm +glowworms +glucose +glue +glued +glueing +glues +gluey +gluier +gluiest +gluing +glum +glumly +glummer +glummest +glumness +glut +gluten +glutenous +glutinous +glutinously +gluts +glutted +glutting +glutton +gluttonous +gluttonously +gluttons +gluttony +glycerin +glycerine +glycerol +glycogen +gnarl +gnarled +gnarling +gnarls +gnash +gnashed +gnashes +gnashing +gnat +gnats +gnaw +gnawed +gnawing +gnawn +gnaws +gneiss +gnome +gnomes +gnomic +gnomish +gnus +goad +goaded +goading +goads +goal +goalie +goalies +goalkeeper +goalkeepers +goalkeeping +goalpost +goalposts +goals +goaltender +goaltenders +goat +goatee +goatees +goatherd +goatherds +goats +goatskin +goatskins +gobbed +gobbet +gobbets +gobbing +gobble +gobbled +gobbledegook +gobbledygook +gobbler +gobblers +gobbles +gobbling +goblet +goblets +goblin +goblins +gobs +godchild +godchildren +goddammit +goddamn +goddamned +goddaughter +goddaughters +goddess +goddesses +godfather +godfathers +godforsaken +godhead +godhood +godless +godlessness +godlier +godliest +godlike +godliness +godly +godmother +godmothers +godparent +godparents +gods +godsend +godsends +godson +godsons +goer +goers +goes +gofer +gofers +goggle +goggled +goggles +goggling +going +goings +goiter +goiters +goitre +goitres +gold +goldbrick +goldbricked +goldbricker +goldbrickers +goldbricking +goldbricks +golden +goldener +goldenest +goldenrod +goldfinch +goldfinches +goldfish +goldfishes +goldmine +goldmines +golds +goldsmith +goldsmiths +golf +golfed +golfer +golfers +golfing +golfs +gollies +golly +gonad +gonadal +gonads +gondola +gondolas +gondolier +gondoliers +gone +goner +goners +gong +gonged +gonging +gongs +gonna +gonorrhea +gonorrheal +gonorrhoea +goober +goobers +good +goodby +goodbye +goodbyes +goodbys +goodhearted +goodie +goodies +goodish +goodlier +goodliest +goodly +goodness +goods +goodwill +goody +gooey +goof +goofball +goofballs +goofed +goofier +goofiest +goofiness +goofing +goofs +goofy +gooier +gooiest +gook +gooks +goon +goons +goop +goose +gooseberries +gooseberry +goosebumps +goosed +gooseflesh +gooses +goosing +gopher +gophers +gore +gored +gores +gorge +gorged +gorgeous +gorgeously +gorgeousness +gorges +gorging +gorgon +gorgons +gorier +goriest +gorilla +gorillas +gorily +goriness +goring +gormandize +gormandized +gormandizer +gormandizers +gormandizes +gormandizing +gorp +gorse +gory +gosh +goshawk +goshawks +gosling +goslings +gospel +gospels +gossamer +gossip +gossiped +gossiper +gossipers +gossiping +gossipped +gossipping +gossips +gossipy +gotcha +gotta +gotten +gouge +gouged +gouger +gougers +gouges +gouging +goulash +goulashes +gourd +gourde +gourdes +gourds +gourmand +gourmands +gourmet +gourmets +gout +goutier +goutiest +gouty +govern +governable +governance +governed +governess +governesses +governing +government +governmental +governments +governor +governors +governorship +governs +gown +gowned +gowning +gowns +grab +grabbed +grabber +grabbers +grabbier +grabbiest +grabbing +grabby +grabs +grace +graced +graceful +gracefully +gracefulness +graceless +gracelessly +gracelessness +graces +gracing +gracious +graciously +graciousness +grackle +grackles +grad +gradate +gradated +gradates +gradating +gradation +gradations +grade +graded +grader +graders +grades +gradient +gradients +grading +grads +gradual +gradualism +gradually +gradualness +graduate +graduated +graduates +graduating +graduation +graduations +graffiti +graffito +graft +grafted +grafter +grafters +grafting +grafts +graham +grain +grained +grainier +grainiest +graininess +grains +grainy +gram +grammar +grammarian +grammarians +grammars +grammatical +grammatically +gramme +grammes +gramophone +gramophones +grampus +grampuses +grams +granaries +granary +grand +grandam +grandams +grandaunt +grandaunts +grandchild +grandchildren +granddad +granddaddies +granddaddy +granddads +granddaughter +granddaughters +grandee +grandees +grander +grandest +grandeur +grandfather +grandfathered +grandfathering +grandfatherly +grandfathers +grandiloquence +grandiloquent +grandiose +grandiosely +grandiosity +grandly +grandma +grandmas +grandmother +grandmotherly +grandmothers +grandnephew +grandnephews +grandness +grandniece +grandnieces +grandpa +grandparent +grandparents +grandpas +grands +grandson +grandsons +grandstand +grandstanded +grandstanding +grandstands +granduncle +granduncles +grange +granges +granite +granitic +grannie +grannies +granny +granola +grant +granted +grantee +grantees +granter +granters +granting +grantor +grantors +grants +grantsmanship +granular +granularity +granulate +granulated +granulates +granulating +granulation +granule +granules +grape +grapefruit +grapefruits +grapes +grapeshot +grapevine +grapevines +graph +graphed +graphic +graphical +graphically +graphics +graphing +graphite +graphologist +graphologists +graphology +graphs +grapnel +grapnels +grapple +grappled +grapples +grappling +grasp +graspable +grasped +grasping +grasps +grass +grassed +grasses +grasshopper +grasshoppers +grassier +grassiest +grassing +grassland +grassy +grate +grated +grateful +gratefully +gratefulness +grater +graters +grates +gratification +gratifications +gratified +gratifies +gratify +gratifying +grating +gratingly +gratings +gratis +gratitude +gratuities +gratuitous +gratuitously +gratuitousness +gratuity +gravamen +gravamens +gravamina +grave +graved +gravedigger +gravediggers +gravel +graveled +graveling +gravelled +gravelling +gravelly +gravels +gravely +graven +graveness +graver +graves +graveside +gravesides +gravest +gravestone +gravestones +graveyard +graveyards +gravid +gravies +gravimeter +gravimeters +graving +gravitate +gravitated +gravitates +gravitating +gravitation +gravitational +gravity +gravy +gray +graybeard +graybeards +grayed +grayer +grayest +graying +grayish +grayness +grays +graze +grazed +grazer +grazers +grazes +grazing +grease +greased +greasepaint +greases +greasier +greasiest +greasily +greasiness +greasing +greasy +great +greatcoat +greatcoats +greater +greatest +greathearted +greatly +greatness +greats +grebe +grebes +greed +greedier +greediest +greedily +greediness +greedy +green +greenback +greenbacks +greenbelt +greenbelts +greened +greener +greenery +greenest +greengage +greengages +greengrocer +greengrocers +greenhorn +greenhorns +greenhouse +greenhouses +greening +greenish +greenly +greenmail +greenness +greenroom +greenrooms +greens +greensward +greenwood +greet +greeted +greeter +greeters +greeting +greetings +greets +gregarious +gregariously +gregariousness +gremlin +gremlins +grenade +grenades +grenadier +grenadiers +grenadine +grew +grey +greyed +greyer +greyest +greyhound +greyhounds +greying +greys +grid +griddle +griddlecake +griddlecakes +griddles +gridiron +gridirons +gridlock +gridlocked +gridlocks +grids +grief +griefs +grievance +grievances +grieve +grieved +griever +grievers +grieves +grieving +grievous +grievously +grievousness +griffin +griffins +griffon +griffons +grill +grille +grilled +grilles +grilling +grills +grim +grimace +grimaced +grimaces +grimacing +grime +grimed +grimes +grimier +grimiest +griminess +griming +grimly +grimmer +grimmest +grimness +grimy +grin +grind +grinder +grinders +grinding +grinds +grindstone +grindstones +gringo +gringos +grinned +grinning +grins +grip +gripe +griped +griper +gripers +gripes +griping +grippe +gripped +gripper +grippers +gripping +grips +gript +grislier +grisliest +grisliness +grisly +grist +gristle +gristlier +gristliest +gristly +gristmill +gristmills +grit +grits +gritted +gritter +gritters +grittier +grittiest +grittiness +gritting +gritty +grizzled +grizzlier +grizzlies +grizzliest +grizzly +groan +groaned +groaning +groans +groat +groats +grocer +groceries +grocers +grocery +grog +groggier +groggiest +groggily +grogginess +groggy +groin +groins +grommet +grommets +groom +groomed +groomer +groomers +grooming +grooms +groomsman +groomsmen +groove +grooved +grooves +groovier +grooviest +grooving +groovy +grope +groped +groper +gropers +gropes +groping +grosbeak +grosbeaks +grosgrain +gross +grossed +grosser +grosses +grossest +grossing +grossly +grossness +grotesque +grotesquely +grotesqueness +grotesques +grotto +grottoes +grottos +grouch +grouched +grouches +grouchier +grouchiest +grouchily +grouchiness +grouching +grouchy +ground +groundbreaking +groundbreakings +grounded +grounder +grounders +groundhog +groundhogs +grounding +groundings +groundless +groundlessly +groundnut +groundnuts +grounds +groundswell +groundswells +groundwater +groundwork +group +grouped +grouper +groupers +groupie +groupies +grouping +groupings +groups +groupware +grouse +groused +grouser +grousers +grouses +grousing +grout +grouted +grouting +grouts +grove +grovel +groveled +groveler +grovelers +groveling +grovelled +groveller +grovellers +grovelling +grovels +groves +grow +grower +growers +growing +growl +growled +growler +growlers +growling +growls +grown +grownup +grownups +grows +growth +growths +grub +grubbed +grubber +grubbers +grubbier +grubbiest +grubbily +grubbiness +grubbing +grubby +grubs +grubstake +grudge +grudged +grudges +grudging +grudgingly +gruel +grueling +gruelling +gruesome +gruesomely +gruesomeness +gruesomer +gruesomest +gruff +gruffer +gruffest +gruffly +gruffness +grumble +grumbled +grumbler +grumblers +grumbles +grumbling +grump +grumpier +grumpiest +grumpily +grumpiness +grumps +grumpy +grunge +grungier +grungiest +grungy +grunion +grunions +grunt +grunted +grunting +grunts +gryphon +gryphons +guacamole +guanine +guano +guarani +guaranies +guaranis +guarantee +guaranteed +guaranteeing +guarantees +guarantied +guaranties +guarantor +guarantors +guaranty +guarantying +guard +guarded +guardedly +guarder +guarders +guardhouse +guardhouses +guardian +guardians +guardianship +guarding +guardrail +guardrails +guardroom +guardrooms +guards +guardsman +guardsmen +guava +guavas +gubernatorial +guerilla +guerillas +guerrilla +guerrillas +guess +guessed +guesser +guessers +guesses +guessing +guesstimate +guesstimated +guesstimates +guesstimating +guesswork +guest +guested +guesting +guests +guff +guffaw +guffawed +guffawing +guffaws +guidance +guide +guidebook +guidebooks +guided +guideline +guidelines +guidepost +guideposts +guider +guiders +guides +guiding +guild +guilder +guilders +guildhall +guildhalls +guilds +guile +guileful +guileless +guilelessly +guilelessness +guillotine +guillotined +guillotines +guillotining +guilt +guilted +guiltier +guiltiest +guiltily +guiltiness +guilting +guiltless +guilts +guilty +guinea +guineas +guise +guises +guitar +guitarist +guitarists +guitars +gulag +gulags +gulch +gulches +gulden +guldens +gulf +gulfs +gull +gulled +gullet +gullets +gulley +gulleys +gullibility +gullible +gullies +gulling +gulls +gully +gulp +gulped +gulper +gulpers +gulping +gulps +gumbo +gumboil +gumboils +gumbos +gumdrop +gumdrops +gummed +gummier +gummiest +gumming +gummy +gumption +gums +gumshoe +gumshoed +gumshoeing +gumshoes +gunboat +gunboats +gunfight +gunfighter +gunfighters +gunfights +gunfire +gunk +gunkier +gunkiest +gunky +gunman +gunmen +gunmetal +gunned +gunnel +gunnels +gunner +gunners +gunnery +gunning +gunny +gunnysack +gunnysacks +gunpoint +gunpowder +gunrunner +gunrunners +gunrunning +guns +gunship +gunships +gunshot +gunshots +gunslinger +gunslingers +gunsmith +gunsmiths +gunwale +gunwales +guppies +guppy +gurgle +gurgled +gurgles +gurgling +gurney +gurneys +guru +gurus +gush +gushed +gusher +gushers +gushes +gushier +gushiest +gushing +gushy +gusset +gusseted +gusseting +gussets +gussied +gussies +gussy +gussying +gust +gustatory +gusted +gustier +gustiest +gustily +gusting +gusto +gusts +gusty +gutless +gutlessness +guts +gutsier +gutsiest +gutsy +gutted +gutter +guttered +guttering +gutters +guttersnipe +guttersnipes +guttier +guttiest +gutting +guttural +gutturals +gutty +guyed +guying +guys +guzzle +guzzled +guzzler +guzzlers +guzzles +guzzling +gymkhana +gymkhanas +gymnasia +gymnasium +gymnasiums +gymnast +gymnastic +gymnastically +gymnastics +gymnasts +gymnosperm +gymnosperms +gyms +gynaecology +gynecologic +gynecological +gynecologist +gynecologists +gynecology +gypped +gypper +gyppers +gypping +gyps +gypsies +gypster +gypsters +gypsum +gypsy +gyrate +gyrated +gyrates +gyrating +gyration +gyrations +gyrator +gyrators +gyrfalcon +gyrfalcons +gyro +gyros +gyroscope +gyroscopes +gyroscopic +gyve +gyved +gyves +gyving +haberdasher +haberdasheries +haberdashers +haberdashery +habiliment +habiliments +habit +habitability +habitable +habitat +habitation +habitations +habitats +habits +habitual +habitually +habitualness +habituate +habituated +habituates +habituating +habituation +habitue +habitues +hacienda +haciendas +hack +hacked +hacker +hackers +hacking +hackle +hackles +hackney +hackneyed +hackneying +hackneys +hacks +hacksaw +hacksaws +hackwork +haddock +haddocks +hadj +hadjes +hadji +hadjis +hadst +haemoglobin +haemophilia +haemorrhage +haemorrhaged +haemorrhages +haemorrhaging +haemorrhoids +hafnium +haft +hafts +haggard +haggardly +haggardness +haggis +haggises +haggish +haggle +haggled +haggler +hagglers +haggles +haggling +hagiographer +hagiographers +hagiographies +hagiography +hags +hahnium +haiku +hail +hailed +hailing +hails +hailstone +hailstones +hailstorm +hailstorms +hair +hairball +hairballs +hairbreadth +hairbreadths +hairbrush +hairbrushes +haircloth +haircut +haircuts +hairdo +hairdos +hairdresser +hairdressers +hairdressing +hairdryer +hairdryers +haired +hairier +hairiest +hairiness +hairless +hairlike +hairline +hairlines +hairnet +hairnets +hairpiece +hairpieces +hairpin +hairpins +hairs +hairsbreadth +hairsbreadths +hairsplitter +hairsplitters +hairsplitting +hairspring +hairsprings +hairstyle +hairstyles +hairstylist +hairstylists +hairy +hajj +hajjes +hajji +hajjis +hake +hakes +halal +halberd +halberds +halcyon +hale +haled +haler +hales +halest +half +halfback +halfbacks +halfhearted +halfheartedly +halfheartedness +halfpence +halfpennies +halfpenny +halftime +halftimes +halftone +halftones +halfway +halfwit +halfwits +halibut +halibuts +haling +halite +halitosis +hall +halleluiah +halleluiahs +hallelujah +hallelujahs +halliard +halliards +hallmark +hallmarked +hallmarking +hallmarks +hallo +halloo +hallooed +hallooing +halloos +hallos +hallow +hallowed +hallowing +hallows +halls +hallucinate +hallucinated +hallucinates +hallucinating +hallucination +hallucinations +hallucinatory +hallucinogen +hallucinogenic +hallucinogenics +hallucinogens +hallway +hallways +halo +haloed +haloes +halogen +halogens +haloing +halos +halt +halted +halter +haltered +haltering +halters +halting +haltingly +halts +halve +halved +halves +halving +halyard +halyards +hamburg +hamburger +hamburgers +hamburgs +hamlet +hamlets +hammed +hammer +hammered +hammerer +hammerers +hammerhead +hammerheads +hammering +hammerlock +hammerlocks +hammers +hammertoe +hammertoes +hammier +hammiest +hamming +hammock +hammocks +hammy +hamper +hampered +hampering +hampers +hams +hamster +hamsters +hamstring +hamstringing +hamstrings +hamstrung +hand +handbag +handbags +handball +handballs +handbarrow +handbarrows +handbill +handbills +handbook +handbooks +handcar +handcars +handcart +handcarts +handclasp +handclasps +handcraft +handcrafted +handcrafting +handcrafts +handcuff +handcuffed +handcuffing +handcuffs +handed +handful +handfuls +handgun +handguns +handhold +handholds +handicap +handicapped +handicapper +handicappers +handicapping +handicaps +handicraft +handicrafts +handier +handiest +handily +handiness +handing +handiwork +handkerchief +handkerchiefs +handkerchieves +handle +handlebar +handlebars +handled +handler +handlers +handles +handling +handmade +handmaid +handmaiden +handmaidens +handmaids +handout +handouts +handpick +handpicked +handpicking +handpicks +handrail +handrails +hands +handsaw +handsaws +handset +handsets +handsful +handshake +handshakes +handsome +handsomely +handsomeness +handsomer +handsomest +handspring +handsprings +handstand +handstands +handwork +handwoven +handwriting +handwritten +handy +handyman +handymen +hang +hangar +hangars +hangdog +hanged +hanger +hangers +hanging +hangings +hangman +hangmen +hangnail +hangnails +hangout +hangouts +hangover +hangovers +hangs +hangup +hangups +hank +hanker +hankered +hankering +hankerings +hankers +hankie +hankies +hanks +hanky +hansom +hansoms +haphazard +haphazardly +haphazardness +hapless +haplessly +haplessness +haploid +haploids +haply +happen +happened +happening +happenings +happens +happenstance +happenstances +happier +happiest +happily +happiness +happy +harangue +harangued +harangues +haranguing +harass +harassed +harasser +harassers +harasses +harassing +harassment +harbinger +harbingers +harbor +harbored +harboring +harbors +harbour +harboured +harbouring +harbours +hard +hardback +hardbacks +hardball +hardboard +hardbound +hardcore +hardcover +hardcovers +harden +hardened +hardener +hardeners +hardening +hardens +harder +hardest +hardhat +hardhats +hardheaded +hardheadedly +hardheadedness +hardhearted +hardheartedly +hardheartedness +hardier +hardiest +hardihood +hardily +hardiness +hardline +hardliner +hardliners +hardly +hardness +hardscrabble +hardship +hardships +hardstand +hardstands +hardtack +hardtop +hardtops +hardware +hardwood +hardwoods +hardworking +hardy +hare +harebell +harebells +harebrained +hared +harelip +harelipped +harelips +harem +harems +hares +haring +hark +harked +harken +harkened +harkening +harkens +harking +harks +harlequin +harlequins +harlot +harlotry +harlots +harm +harmed +harmful +harmfully +harmfulness +harming +harmless +harmlessly +harmlessness +harmonic +harmonica +harmonically +harmonicas +harmonics +harmonies +harmonious +harmoniously +harmoniousness +harmonium +harmoniums +harmonization +harmonize +harmonized +harmonizer +harmonizers +harmonizes +harmonizing +harmony +harms +harness +harnessed +harnesses +harnessing +harp +harped +harpies +harping +harpist +harpists +harpoon +harpooned +harpooner +harpooners +harpooning +harpoons +harps +harpsichord +harpsichordist +harpsichordists +harpsichords +harpy +harridan +harridans +harried +harrier +harriers +harries +harrow +harrowed +harrowing +harrows +harry +harrying +harsh +harsher +harshest +harshly +harshness +hart +harts +harvest +harvested +harvester +harvesters +harvesting +harvests +hash +hashed +hasheesh +hashes +hashing +hashish +hasp +hasps +hassle +hassled +hassles +hassling +hassock +hassocks +hast +haste +hasted +hasten +hastened +hastening +hastens +hastes +hastier +hastiest +hastily +hastiness +hasting +hasty +hatbox +hatboxes +hatch +hatchback +hatchbacks +hatcheck +hatchecks +hatched +hatcheries +hatchery +hatches +hatchet +hatchets +hatching +hatchway +hatchways +hate +hated +hateful +hatefully +hatefulness +hatemonger +hatemongers +hater +haters +hates +hath +hating +hatred +hatreds +hats +hatted +hatter +hatters +hatting +hauberk +hauberks +haughtier +haughtiest +haughtily +haughtiness +haughty +haul +haulage +hauled +hauler +haulers +hauling +hauls +haunch +haunches +haunt +haunted +haunter +haunters +haunting +hauntingly +haunts +hauteur +have +haven +havens +haversack +haversacks +haves +having +havoc +hawed +hawing +hawk +hawked +hawker +hawkers +hawking +hawkish +hawkishness +hawks +haws +hawser +hawsers +hawthorn +hawthorns +haycock +haycocks +hayed +haying +hayloft +haylofts +haymow +haymows +hayrick +hayricks +hayride +hayrides +hays +hayseed +hayseeds +haystack +haystacks +haywire +hazard +hazarded +hazarding +hazardous +hazardously +hazards +haze +hazed +hazel +hazelnut +hazelnuts +hazels +hazer +hazers +hazes +hazier +haziest +hazily +haziness +hazing +hazings +hazy +head +headache +headaches +headband +headbands +headboard +headboards +headdress +headdresses +headed +header +headers +headfirst +headgear +headhunt +headhunted +headhunter +headhunters +headhunting +headhunts +headier +headiest +headily +headiness +heading +headings +headlamp +headlamps +headland +headlands +headless +headlight +headlights +headline +headlined +headliner +headliners +headlines +headlining +headlock +headlocks +headlong +headman +headmaster +headmasters +headmen +headmistress +headmistresses +headphone +headphones +headpiece +headpieces +headpin +headpins +headquarter +headquartered +headquartering +headquarters +headrest +headrests +headroom +heads +headset +headsets +headship +headships +headshrinker +headshrinkers +headsman +headsmen +headstall +headstalls +headstand +headstands +headstone +headstones +headstrong +headwaiter +headwaiters +headwaters +headway +headwind +headwinds +headword +headwords +heady +heal +healed +healer +healers +healing +heals +health +healthcare +healthful +healthfully +healthfulness +healthier +healthiest +healthily +healthiness +healthy +heap +heaped +heaping +heaps +hear +heard +hearer +hearers +hearing +hearings +hearken +hearkened +hearkening +hearkens +hears +hearsay +hearse +hearses +heart +heartache +heartaches +heartbeat +heartbeats +heartbreak +heartbreaking +heartbreaks +heartbroken +heartburn +hearten +heartened +heartening +heartens +heartfelt +hearth +hearths +hearthstone +hearthstones +heartier +hearties +heartiest +heartily +heartiness +heartland +heartlands +heartless +heartlessly +heartlessness +heartrending +heartrendingly +hearts +heartsick +heartsickness +heartstrings +heartthrob +heartthrobs +heartwarming +heartwood +hearty +heat +heated +heatedly +heater +heaters +heath +heathen +heathendom +heathenish +heathenism +heathens +heather +heaths +heating +heatproof +heatproofed +heatproofing +heatproofs +heats +heatstroke +heave +heaved +heaven +heavenlier +heavenliest +heavenly +heavens +heavenward +heavenwards +heaver +heavers +heaves +heavier +heavies +heaviest +heavily +heaviness +heaving +heavy +heavyhearted +heavyset +heavyweight +heavyweights +heck +heckle +heckled +heckler +hecklers +heckles +heckling +hectare +hectares +hectic +hectically +hectogram +hectograms +hectometer +hectometers +hector +hectored +hectoring +hectors +hedge +hedged +hedgehog +hedgehogs +hedgehop +hedgehopped +hedgehopping +hedgehops +hedger +hedgerow +hedgerows +hedgers +hedges +hedging +hedonism +hedonist +hedonistic +hedonists +heed +heeded +heedful +heedfully +heeding +heedless +heedlessly +heedlessness +heeds +heehaw +heehawed +heehawing +heehaws +heel +heeled +heeling +heelless +heels +heft +hefted +heftier +heftiest +heftily +heftiness +hefting +hefts +hefty +hegemony +hegira +hegiras +heifer +heifers +height +heighten +heightened +heightening +heightens +heights +heinous +heinously +heinousness +heir +heiress +heiresses +heirloom +heirlooms +heirs +heist +heisted +heisting +heists +held +helical +helices +helicopter +helicoptered +helicoptering +helicopters +heliocentric +heliotrope +heliotropes +heliport +heliports +helium +helix +helixes +hell +hellbent +hellcat +hellcats +hellebore +hellhole +hellholes +hellion +hellions +hellish +hellishly +hellishness +hello +hellos +helluva +helm +helmet +helmeted +helmets +helms +helmsman +helmsmen +helot +helots +help +helped +helper +helpers +helpful +helpfully +helpfulness +helping +helpings +helpless +helplessly +helplessness +helpmate +helpmates +helpmeet +helpmeets +helps +helve +helves +hematite +hematologic +hematological +hematologist +hematologists +hematology +heme +hemisphere +hemispheres +hemispheric +hemispherical +hemline +hemlines +hemlock +hemlocks +hemmed +hemmer +hemmers +hemming +hemoglobin +hemophilia +hemophiliac +hemophiliacs +hemorrhage +hemorrhaged +hemorrhages +hemorrhagic +hemorrhaging +hemorrhoid +hemorrhoids +hemostat +hemostats +hemp +hempen +hems +hemstitch +hemstitched +hemstitches +hemstitching +hence +henceforth +henceforward +henchman +henchmen +henna +hennaed +hennaing +hennas +henpeck +henpecked +henpecking +henpecks +hens +heparin +hepatic +hepatitis +hepper +heppest +heptagon +heptagonal +heptagons +heptathlon +heptathlons +herald +heralded +heraldic +heralding +heraldry +heralds +herb +herbaceous +herbage +herbal +herbalist +herbalists +herbicidal +herbicide +herbicides +herbivore +herbivores +herbivorous +herbs +herculean +herd +herded +herder +herders +herding +herds +herdsman +herdsmen +here +hereabout +hereabouts +hereafter +hereafters +hereby +hereditary +heredity +herein +hereof +hereon +heresies +heresy +heretic +heretical +heretics +hereto +heretofore +hereunto +hereupon +herewith +heritable +heritage +heritages +hermaphrodite +hermaphrodites +hermaphroditic +hermetic +hermetical +hermetically +hermit +hermitage +hermitages +hermits +hernia +herniae +hernial +hernias +herniate +herniated +herniates +herniating +herniation +hero +heroes +heroic +heroically +heroics +heroin +heroine +heroines +heroism +heron +herons +heros +herpes +herpetologist +herpetologists +herpetology +herring +herringbone +herrings +hers +herself +hertz +hertzes +hesitance +hesitancy +hesitant +hesitantly +hesitate +hesitated +hesitates +hesitating +hesitatingly +hesitation +hesitations +hetero +heterodox +heterodoxy +heterogeneity +heterogeneous +heterogeneously +heteros +heterosexual +heterosexuality +heterosexuals +heuristic +heuristically +heuristics +hewed +hewer +hewers +hewing +hewn +hews +hexadecimal +hexagon +hexagonal +hexagons +hexagram +hexagrams +hexameter +hexameters +hexed +hexes +hexing +heyday +heydays +hiatus +hiatuses +hibachi +hibachis +hibernate +hibernated +hibernates +hibernating +hibernation +hibernator +hibernators +hibiscus +hibiscuses +hiccough +hiccoughed +hiccoughing +hiccoughs +hiccup +hiccuped +hiccuping +hiccupped +hiccupping +hiccups +hick +hickey +hickeys +hickies +hickories +hickory +hicks +hidden +hide +hideaway +hideaways +hidebound +hided +hideous +hideously +hideousness +hideout +hideouts +hider +hiders +hides +hiding +hied +hieing +hierarchic +hierarchical +hierarchically +hierarchies +hierarchy +hieroglyph +hieroglyphic +hieroglyphics +hieroglyphs +hies +high +highball +highballs +highborn +highboy +highboys +highbrow +highbrows +highchair +highchairs +higher +highest +highfalutin +highfaluting +highhanded +highhandedly +highhandedness +highjack +highjacked +highjacking +highjacks +highland +highlander +highlanders +highlands +highlight +highlighted +highlighter +highlighters +highlighting +highlights +highly +highness +highrise +highrises +highroad +highroads +highs +hightail +hightailed +hightailing +hightails +highway +highwayman +highwaymen +highways +hijack +hijacked +hijacker +hijackers +hijacking +hijackings +hijacks +hike +hiked +hiker +hikers +hikes +hiking +hilarious +hilariously +hilariousness +hilarity +hill +hillbillies +hillbilly +hillier +hilliest +hilliness +hillock +hillocks +hills +hillside +hillsides +hilltop +hilltops +hilly +hilt +hilts +hims +himself +hind +hinder +hindered +hindering +hinders +hindmost +hindquarter +hindquarters +hindrance +hindrances +hinds +hindsight +hinge +hinged +hinges +hinging +hint +hinted +hinter +hinterland +hinterlands +hinters +hinting +hints +hipbone +hipbones +hipness +hipped +hipper +hippest +hippie +hippies +hipping +hippo +hippodrome +hippodromes +hippopotami +hippopotamus +hippopotamuses +hippos +hippy +hips +hipster +hipsters +hire +hired +hireling +hirelings +hires +hiring +hirsute +hirsuteness +hiss +hissed +hisses +hissing +hist +histamine +histamines +histogram +histograms +histologist +histologists +histology +historian +historians +historic +historical +historically +historicity +histories +historiographer +historiographers +historiography +history +histrionic +histrionically +histrionics +hitch +hitched +hitcher +hitchers +hitches +hitchhike +hitchhiked +hitchhiker +hitchhikers +hitchhikes +hitchhiking +hitching +hither +hitherto +hits +hitter +hitters +hitting +hive +hived +hives +hiving +hoagie +hoagies +hoagy +hoard +hoarded +hoarder +hoarders +hoarding +hoardings +hoards +hoarfrost +hoarier +hoariest +hoariness +hoarse +hoarsely +hoarseness +hoarser +hoarsest +hoary +hoax +hoaxed +hoaxer +hoaxers +hoaxes +hoaxing +hobbies +hobble +hobbled +hobbler +hobblers +hobbles +hobbling +hobby +hobbyhorse +hobbyhorses +hobbyist +hobbyists +hobgoblin +hobgoblins +hobnail +hobnailed +hobnailing +hobnails +hobnob +hobnobbed +hobnobbing +hobnobs +hobo +hoboes +hobos +hobs +hock +hocked +hockey +hocking +hocks +hockshop +hockshops +hodgepodge +hodgepodges +hods +hoecake +hoecakes +hoed +hoedown +hoedowns +hoeing +hoer +hoers +hoes +hogan +hogans +hogback +hogbacks +hogged +hogging +hoggish +hoggishly +hogs +hogshead +hogsheads +hogtie +hogtied +hogtieing +hogties +hogtying +hogwash +hoist +hoisted +hoisting +hoists +hoke +hoked +hokes +hokey +hokier +hokiest +hoking +hokum +hold +holder +holders +holding +holdings +holdout +holdouts +holdover +holdovers +holds +holdup +holdups +hole +holed +holes +holey +holiday +holidayed +holidaying +holidays +holier +holiest +holiness +holing +holistic +holistically +holler +hollered +hollering +hollers +hollies +hollow +hollowed +hollower +hollowest +hollowing +hollowly +hollowness +hollows +holly +hollyhock +hollyhocks +holmium +holocaust +holocausts +hologram +holograms +holograph +holographic +holographs +holography +holster +holstered +holstering +holsters +holy +homage +homages +hombre +hombres +homburg +homburgs +home +homebodies +homebody +homeboy +homeboys +homecoming +homecomings +homed +homegrown +homeland +homelands +homeless +homelessness +homelier +homeliest +homelike +homeliness +homely +homemade +homemaker +homemakers +homemaking +homeopath +homeopathic +homeopaths +homeopathy +homeostasis +homeostatic +homeowner +homeowners +homepage +homepages +homer +homered +homering +homeroom +homerooms +homers +homes +homeschooling +homesick +homesickness +homespun +homestead +homesteaded +homesteader +homesteaders +homesteading +homesteads +homestretch +homestretches +hometown +hometowns +homeward +homewards +homework +homey +homeyness +homeys +homicidal +homicide +homicides +homier +homiest +homiletic +homilies +homily +hominess +homing +hominid +hominids +hominy +homo +homogeneity +homogeneous +homogeneously +homogenization +homogenize +homogenized +homogenizes +homogenizing +homograph +homographs +homologous +homonym +homonyms +homophobia +homophobic +homophone +homophones +homos +homosexual +homosexuality +homosexuals +homy +honcho +honchos +hone +honed +honer +honers +hones +honest +honester +honestest +honestly +honesty +honey +honeybee +honeybees +honeycomb +honeycombed +honeycombing +honeycombs +honeydew +honeydews +honeyed +honeying +honeylocust +honeylocusts +honeymoon +honeymooned +honeymooner +honeymooners +honeymooning +honeymoons +honeys +honeysuckle +honeysuckles +honied +honing +honk +honked +honker +honkers +honkie +honkies +honking +honks +honky +honor +honorable +honorableness +honorably +honoraria +honorarily +honorarium +honorariums +honorary +honored +honoree +honorees +honorer +honorers +honorific +honorifics +honoring +honors +honour +honourable +honoured +honouring +honours +hons +hooch +hood +hooded +hooding +hoodlum +hoodlums +hoodoo +hoodooed +hoodooing +hoodoos +hoods +hoodwink +hoodwinked +hoodwinking +hoodwinks +hooey +hoof +hoofed +hoofing +hoofs +hook +hooka +hookah +hookahs +hookas +hooked +hooker +hookers +hookey +hooking +hooks +hookup +hookups +hookworm +hookworms +hooky +hooligan +hooliganism +hooligans +hoop +hooped +hooping +hoopla +hoops +hooray +hoorayed +hooraying +hoorays +hoosegow +hoosegows +hoot +hootch +hooted +hootenannies +hootenanny +hooter +hooters +hooting +hoots +hooves +hope +hoped +hopeful +hopefully +hopefulness +hopefuls +hopeless +hopelessly +hopelessness +hopes +hoping +hopped +hopper +hoppers +hopping +hops +hopscotch +hopscotched +hopscotches +hopscotching +hora +horas +horde +horded +hordes +hording +horehound +horehounds +horizon +horizons +horizontal +horizontally +horizontals +hormonal +hormone +hormones +horn +hornblende +horned +hornet +hornets +hornier +horniest +hornless +hornlike +hornpipe +hornpipes +horns +horny +horologic +horological +horologist +horologists +horology +horoscope +horoscopes +horrendous +horrendously +horrible +horribleness +horribly +horrid +horrider +horridest +horridly +horrific +horrifically +horrified +horrifies +horrify +horrifying +horror +horrors +horse +horseback +horsed +horseflesh +horseflies +horsefly +horsehair +horsehide +horselaugh +horselaughs +horseless +horseman +horsemanship +horsemen +horseplay +horsepower +horseradish +horseradishes +horses +horseshoe +horseshoed +horseshoeing +horseshoes +horsetail +horsetails +horsewhip +horsewhipped +horsewhipping +horsewhips +horsewoman +horsewomen +horsey +horsier +horsiest +horsing +horsy +hortatory +horticultural +horticulture +horticulturist +horticulturists +hosanna +hosannas +hose +hosed +hoses +hosier +hosiers +hosiery +hosing +hospice +hospices +hospitable +hospitably +hospital +hospitality +hospitalization +hospitalizations +hospitalize +hospitalized +hospitalizes +hospitalizing +hospitals +host +hostage +hostages +hosted +hostel +hosteled +hosteler +hostelers +hosteling +hostelled +hostelling +hostelries +hostelry +hostels +hostess +hostessed +hostesses +hostessing +hostile +hostilely +hostiles +hostilities +hostility +hosting +hostler +hostlers +hosts +hotbed +hotbeds +hotblooded +hotbox +hotboxes +hotcake +hotcakes +hotdog +hotdogged +hotdogging +hotdogs +hotel +hotelier +hoteliers +hotels +hotfoot +hotfooted +hotfooting +hotfoots +hothead +hotheaded +hotheadedly +hotheadedness +hotheads +hothouse +hothouses +hotline +hotlines +hotly +hotness +hotplate +hotplates +hots +hotshot +hotshots +hotspot +hotspots +hotter +hottest +hound +hounded +hounding +hounds +hour +hourglass +hourglasses +houri +houris +hourly +hours +house +houseboat +houseboats +housebound +houseboy +houseboys +housebreak +housebreaker +housebreakers +housebreaking +housebreaks +housebroke +housebroken +houseclean +housecleaned +housecleaning +housecleans +housecoat +housecoats +housed +houseflies +housefly +houseful +housefuls +household +householder +householders +households +househusband +househusbands +housekeeper +housekeepers +housekeeping +houselights +housemaid +housemaids +houseman +housemen +housemother +housemothers +houseparent +houseparents +houseplant +houseplants +houses +housetop +housetops +housewares +housewarming +housewarmings +housewife +housewifely +housewives +housework +housing +housings +hove +hovel +hovels +hover +hovercraft +hovercrafts +hovered +hovering +hovers +howbeit +howdah +howdahs +howdy +however +howitzer +howitzers +howl +howled +howler +howlers +howling +howls +hows +howsoever +hoyden +hoydenish +hoydens +huarache +huaraches +hubbies +hubbub +hubbubs +hubby +hubcap +hubcaps +hubris +hubs +huckleberries +huckleberry +huckster +huckstered +huckstering +hucksterism +hucksters +huddle +huddled +huddles +huddling +hued +hues +huff +huffed +huffier +huffiest +huffily +huffiness +huffing +huffs +huffy +huge +hugely +hugeness +huger +hugest +hugged +hugging +hugs +hula +hulas +hulk +hulking +hulks +hull +hullabaloo +hullabaloos +hulled +huller +hullers +hulling +hullo +hullos +hulls +human +humane +humanely +humaneness +humaner +humanest +humanism +humanist +humanistic +humanists +humanitarian +humanitarianism +humanitarians +humanities +humanity +humanization +humanize +humanized +humanizer +humanizers +humanizes +humanizing +humankind +humanly +humanness +humanoid +humanoids +humans +humble +humbled +humbleness +humbler +humblers +humbles +humblest +humbling +humbly +humbug +humbugged +humbugging +humbugs +humdinger +humdingers +humdrum +humeral +humeri +humerus +humid +humider +humidest +humidification +humidified +humidifier +humidifiers +humidifies +humidify +humidifying +humidity +humidly +humidor +humidors +humiliate +humiliated +humiliates +humiliating +humiliatingly +humiliation +humiliations +humility +hummed +hummer +hummers +humming +hummingbird +hummingbirds +hummock +hummocks +hummocky +hummus +humongous +humor +humored +humoring +humorist +humorists +humorless +humorlessly +humorlessness +humorous +humorously +humorousness +humors +humour +humoured +humouring +humours +hump +humpback +humpbacked +humpbacks +humped +humph +humphed +humphing +humphs +humping +humps +hums +humungous +humus +hunch +hunchback +hunchbacked +hunchbacks +hunched +hunches +hunching +hundred +hundredfold +hundreds +hundredth +hundredths +hundredweight +hundredweights +hung +hunger +hungered +hungering +hungers +hungover +hungrier +hungriest +hungrily +hungriness +hungry +hunk +hunker +hunkered +hunkering +hunkers +hunkier +hunkiest +hunks +hunky +hunt +hunted +hunter +hunters +hunting +huntress +huntresses +hunts +huntsman +huntsmen +hurdle +hurdled +hurdler +hurdlers +hurdles +hurdling +hurl +hurled +hurler +hurlers +hurling +hurls +hurrah +hurrahed +hurrahing +hurrahs +hurray +hurrayed +hurraying +hurrays +hurricane +hurricanes +hurried +hurriedly +hurries +hurry +hurrying +hurt +hurtful +hurtfully +hurtfulness +hurting +hurtle +hurtled +hurtles +hurtling +hurts +husband +husbanded +husbanding +husbandman +husbandmen +husbandry +husbands +hush +hushed +hushes +hushing +husk +husked +husker +huskers +huskier +huskies +huskiest +huskily +huskiness +husking +husks +husky +hussar +hussars +hussies +hussy +hustings +hustle +hustled +hustler +hustlers +hustles +hustling +hutch +hutches +huts +hutzpa +hutzpah +huzza +huzzaed +huzzah +huzzahed +huzzahing +huzzahs +huzzaing +huzzas +hyacinth +hyacinths +hyaena +hyaenas +hybrid +hybridism +hybridization +hybridize +hybridized +hybridizes +hybridizing +hybrids +hydra +hydrae +hydrangea +hydrangeas +hydrant +hydrants +hydras +hydrate +hydrated +hydrates +hydrating +hydration +hydraulic +hydraulically +hydraulics +hydro +hydrocarbon +hydrocarbons +hydrocephalus +hydrocephaly +hydrodynamic +hydrodynamics +hydroelectric +hydroelectrically +hydroelectricity +hydrofoil +hydrofoils +hydrogen +hydrogenate +hydrogenated +hydrogenates +hydrogenating +hydrogenation +hydrogenous +hydrologist +hydrologists +hydrology +hydrolysis +hydrolyze +hydrolyzed +hydrolyzes +hydrolyzing +hydrometer +hydrometers +hydrometry +hydrophobia +hydrophobic +hydrophone +hydrophones +hydroplane +hydroplaned +hydroplanes +hydroplaning +hydroponic +hydroponically +hydroponics +hydrosphere +hydrotherapy +hydrous +hydroxide +hydroxides +hyena +hyenas +hygiene +hygienic +hygienically +hygienist +hygienists +hygrometer +hygrometers +hying +hymen +hymeneal +hymens +hymn +hymnal +hymnals +hymnbook +hymnbooks +hymned +hymning +hymns +hype +hyped +hyper +hyperactive +hyperactivity +hyperbola +hyperbolae +hyperbolas +hyperbole +hyperbolic +hypercritical +hypercritically +hyperglycemia +hyperlink +hyperlinks +hypermedia +hypersensitive +hypersensitiveness +hypersensitivities +hypersensitivity +hypertension +hypertensive +hypertensives +hypertext +hyperthyroid +hyperthyroidism +hypertrophied +hypertrophies +hypertrophy +hypertrophying +hyperventilate +hyperventilated +hyperventilates +hyperventilating +hyperventilation +hypes +hyphen +hyphenate +hyphenated +hyphenates +hyphenating +hyphenation +hyphened +hyphening +hyphens +hyping +hypnosis +hypnotherapy +hypnotic +hypnotically +hypnotics +hypnotism +hypnotist +hypnotists +hypnotize +hypnotized +hypnotizes +hypnotizing +hypo +hypoallergenic +hypochondria +hypochondriac +hypochondriacs +hypocrisies +hypocrisy +hypocrite +hypocrites +hypocritical +hypocritically +hypodermic +hypodermics +hypoglycemia +hypoglycemic +hypoglycemics +hypos +hypotenuse +hypotenuses +hypothalami +hypothalamus +hypothermia +hypotheses +hypothesis +hypothesize +hypothesized +hypothesizes +hypothesizing +hypothetical +hypothetically +hypothyroid +hypothyroidism +hyssop +hysterectomies +hysterectomy +hysteria +hysteric +hysterical +hysterically +hysterics +iamb +iambi +iambic +iambics +iambs +iambus +iambuses +ibex +ibexes +ibices +ibidem +ibis +ibises +ibuprofen +iceberg +icebergs +iceboat +iceboats +icebound +icebox +iceboxes +icebreaker +icebreakers +icecap +icecaps +iced +iceman +icemen +ices +ichthyologist +ichthyologists +ichthyology +icicle +icicles +icier +iciest +icily +iciness +icing +icings +ickier +ickiest +icky +icon +iconic +iconoclasm +iconoclast +iconoclastic +iconoclasts +iconography +icons +ictus +idea +ideal +idealism +idealist +idealistic +idealistically +idealists +idealization +idealize +idealized +idealizes +idealizing +ideally +ideals +ideas +idem +identical +identically +identifiable +identification +identified +identifies +identify +identifying +identities +identity +ideogram +ideograms +ideograph +ideographs +ideological +ideologically +ideologies +ideologist +ideologists +ideologue +ideologues +ideology +ides +idiocies +idiocy +idiom +idiomatic +idiomatically +idioms +idiopathic +idiosyncrasies +idiosyncrasy +idiosyncratic +idiosyncratically +idiot +idiotic +idiotically +idiots +idle +idled +idleness +idler +idlers +idles +idlest +idling +idly +idol +idolater +idolaters +idolatress +idolatresses +idolatrous +idolatry +idolization +idolize +idolized +idolizes +idolizing +idols +idyl +idyll +idyllic +idyllically +idylls +idyls +iffier +iffiest +iffiness +iffy +igloo +igloos +igneous +ignitable +ignite +ignited +ignites +ignitible +igniting +ignition +ignitions +ignoble +ignobler +ignoblest +ignobly +ignominies +ignominious +ignominiously +ignominy +ignoramus +ignoramuses +ignorance +ignorant +ignorantly +ignore +ignored +ignores +ignoring +iguana +iguanas +ikon +ikons +ilea +ileitis +ileum +ilia +ilium +ilks +illegal +illegalities +illegality +illegally +illegals +illegibility +illegible +illegibly +illegitimacy +illegitimate +illegitimately +illiberal +illiberality +illiberally +illicit +illicitly +illicitness +illimitable +illiteracy +illiterate +illiterately +illiterates +illness +illnesses +illogical +illogicality +illogically +ills +illuminable +illuminate +illuminated +illuminates +illuminating +illuminatingly +illumination +illuminations +illumine +illumined +illumines +illumining +illusion +illusionist +illusionists +illusions +illusive +illusory +illustrate +illustrated +illustrates +illustrating +illustration +illustrations +illustrative +illustratively +illustrator +illustrators +illustrious +illustriously +illustriousness +image +imaged +imagery +images +imaginable +imaginably +imaginary +imagination +imaginations +imaginative +imaginatively +imagine +imagined +imagines +imaging +imagining +imago +imagoes +imam +imams +imbalance +imbalances +imbecile +imbeciles +imbecilic +imbecilities +imbecility +imbed +imbedded +imbedding +imbeds +imbibe +imbibed +imbiber +imbibers +imbibes +imbibing +imbrication +imbroglio +imbroglios +imbue +imbued +imbues +imbuing +imitable +imitate +imitated +imitates +imitating +imitation +imitations +imitative +imitatively +imitativeness +imitator +imitators +immaculate +immaculately +immaculateness +immanence +immanency +immanent +immanently +immaterial +immateriality +immaterially +immaterialness +immature +immaturely +immaturity +immeasurable +immeasurably +immediacies +immediacy +immediate +immediately +immediateness +immemorial +immemorially +immense +immensely +immensities +immensity +immerse +immersed +immerses +immersible +immersing +immersion +immersions +immigrant +immigrants +immigrate +immigrated +immigrates +immigrating +immigration +imminence +imminent +imminently +immobile +immobility +immobilization +immobilize +immobilized +immobilizes +immobilizing +immoderate +immoderately +immodest +immodestly +immodesty +immolate +immolated +immolates +immolating +immolation +immoral +immoralities +immorality +immorally +immortal +immortality +immortalize +immortalized +immortalizes +immortalizing +immortally +immortals +immovability +immovable +immovably +immune +immunity +immunization +immunizations +immunize +immunized +immunizes +immunizing +immunodeficiency +immunodeficient +immunologic +immunological +immunologist +immunologists +immunology +immure +immured +immures +immuring +immutability +immutable +immutably +impact +impacted +impacting +impacts +impair +impaired +impairing +impairment +impairments +impairs +impala +impalas +impale +impaled +impalement +impales +impaling +impalpable +impalpably +impanel +impaneled +impaneling +impanelled +impanelling +impanels +impart +imparted +impartial +impartiality +impartially +imparting +imparts +impassable +impassably +impasse +impasses +impassibility +impassible +impassibly +impassioned +impassive +impassively +impassiveness +impassivity +impasto +impatience +impatiences +impatiens +impatient +impatiently +impeach +impeachable +impeached +impeacher +impeachers +impeaches +impeaching +impeachment +impeachments +impeccability +impeccable +impeccably +impecunious +impecuniously +impecuniousness +impedance +impede +impeded +impedes +impediment +impedimenta +impediments +impeding +impel +impelled +impeller +impellers +impelling +impels +impend +impended +impending +impends +impenetrability +impenetrable +impenetrably +impenitence +impenitent +impenitently +imperative +imperatively +imperatives +imperceptibility +imperceptible +imperceptibly +imperceptive +imperfect +imperfection +imperfections +imperfectly +imperfectness +imperfects +imperial +imperialism +imperialist +imperialistic +imperialistically +imperialists +imperially +imperials +imperil +imperiled +imperiling +imperilled +imperilling +imperilment +imperils +imperious +imperiously +imperiousness +imperishable +imperishably +impermanence +impermanent +impermanently +impermeability +impermeable +impermeably +impermissible +impersonal +impersonally +impersonate +impersonated +impersonates +impersonating +impersonation +impersonations +impersonator +impersonators +impertinence +impertinent +impertinently +imperturbability +imperturbable +imperturbably +impervious +imperviously +impetigo +impetuosity +impetuous +impetuously +impetuousness +impetus +impetuses +impieties +impiety +impinge +impinged +impingement +impinges +impinging +impious +impiously +impiousness +impish +impishly +impishness +implacability +implacable +implacably +implant +implantable +implantation +implanted +implanting +implants +implausibilities +implausibility +implausible +implausibly +implement +implementation +implementations +implemented +implementing +implements +implicate +implicated +implicates +implicating +implication +implications +implicit +implicitly +implicitness +implied +implies +implode +imploded +implodes +imploding +implore +implored +implores +imploring +imploringly +implosion +implosions +implosive +imply +implying +impolite +impolitely +impoliteness +impolitenesses +impolitic +imponderable +imponderables +import +importable +importance +important +importantly +importation +importations +imported +importer +importers +importing +imports +importunate +importunately +importune +importuned +importunes +importuning +importunity +impose +imposed +imposer +imposers +imposes +imposing +imposingly +imposition +impositions +impossibilities +impossibility +impossible +impossibly +impost +imposter +imposters +impostor +impostors +imposts +imposture +impostures +impotence +impotency +impotent +impotently +impound +impounded +impounding +impounds +impoverish +impoverished +impoverishes +impoverishing +impoverishment +impracticable +impracticably +impractical +impracticality +impractically +imprecate +imprecated +imprecates +imprecating +imprecation +imprecations +imprecise +imprecisely +impreciseness +imprecision +impregnability +impregnable +impregnably +impregnate +impregnated +impregnates +impregnating +impregnation +impresario +impresarios +impress +impressed +impresses +impressibility +impressible +impressing +impression +impressionability +impressionable +impressionism +impressionist +impressionistic +impressionists +impressions +impressive +impressively +impressiveness +imprimatur +imprimaturs +imprint +imprinted +imprinter +imprinters +imprinting +imprints +imprison +imprisoned +imprisoning +imprisonment +imprisonments +imprisons +improbabilities +improbability +improbable +improbably +impromptu +impromptus +improper +improperly +improprieties +impropriety +improvable +improve +improved +improvement +improvements +improves +improvidence +improvident +improvidently +improving +improvisation +improvisational +improvisations +improvise +improvised +improviser +improvisers +improvises +improvising +improvisor +improvisors +imprudence +imprudent +imprudently +imps +impudence +impudent +impudently +impugn +impugned +impugner +impugners +impugning +impugns +impulse +impulsed +impulses +impulsing +impulsion +impulsive +impulsively +impulsiveness +impunity +impure +impurely +impurer +impurest +impurities +impurity +imputable +imputation +imputations +impute +imputed +imputes +imputing +inabilities +inability +inaccessibility +inaccessible +inaccessibly +inaccuracies +inaccuracy +inaccurate +inaccurately +inaction +inactivate +inactivated +inactivates +inactivating +inactivation +inactive +inactively +inactivity +inadequacies +inadequacy +inadequate +inadequately +inadmissibility +inadmissible +inadvertence +inadvertent +inadvertently +inadvisability +inadvisable +inalienability +inalienable +inalienably +inamorata +inamoratas +inane +inanely +inaner +inanest +inanimate +inanimately +inanimateness +inanities +inanity +inapplicable +inappreciable +inappreciably +inapproachable +inappropriate +inappropriately +inappropriateness +inapt +inaptly +inaptness +inarguable +inarticulate +inarticulately +inarticulateness +inartistic +inattention +inattentive +inattentively +inattentiveness +inaudibility +inaudible +inaudibly +inaugural +inaugurals +inaugurate +inaugurated +inaugurates +inaugurating +inauguration +inaugurations +inauspicious +inauspiciously +inauthentic +inboard +inboards +inborn +inbound +inbounded +inbounding +inbounds +inbred +inbreed +inbreeding +inbreeds +incalculable +incalculably +incandescence +incandescent +incandescently +incantation +incantations +incapability +incapable +incapably +incapacitate +incapacitated +incapacitates +incapacitating +incapacity +incarcerate +incarcerated +incarcerates +incarcerating +incarceration +incarcerations +incarnadine +incarnadined +incarnadines +incarnadining +incarnate +incarnated +incarnates +incarnating +incarnation +incarnations +incautious +incendiaries +incendiary +incense +incensed +incenses +incensing +incentive +incentives +inception +inceptions +incertitude +incessant +incessantly +incest +incestuous +incestuously +incestuousness +inch +inched +inches +inching +inchoate +inchworm +inchworms +incidence +incidences +incident +incidental +incidentally +incidentals +incidents +incinerate +incinerated +incinerates +incinerating +incineration +incinerator +incinerators +incipience +incipient +incipiently +incise +incised +incises +incising +incision +incisions +incisive +incisively +incisiveness +incisor +incisors +incite +incited +incitement +incitements +inciter +inciters +incites +inciting +incivilities +incivility +inclemency +inclement +inclination +inclinations +incline +inclined +inclines +inclining +inclose +inclosed +incloses +inclosing +inclosure +inclosures +include +included +includes +including +inclusion +inclusions +inclusive +inclusively +inclusiveness +incognito +incognitos +incoherence +incoherent +incoherently +incombustible +income +incomes +incoming +incommensurate +incommensurately +incommode +incommoded +incommodes +incommoding +incommodious +incommunicable +incommunicado +incomparable +incomparably +incompatibilities +incompatibility +incompatible +incompatibles +incompatibly +incompetence +incompetency +incompetent +incompetently +incompetents +incomplete +incompletely +incompleteness +incompletes +incomprehensibility +incomprehensible +incomprehensibly +incomprehension +inconceivability +inconceivable +inconceivably +inconclusive +inconclusively +inconclusiveness +incongruities +incongruity +incongruous +incongruously +incongruousness +inconsequential +inconsequentially +inconsiderable +inconsiderate +inconsiderately +inconsiderateness +inconsideration +inconsistencies +inconsistency +inconsistent +inconsistently +inconsolable +inconsolably +inconspicuous +inconspicuously +inconspicuousness +inconstancy +inconstant +inconstantly +incontestability +incontestable +incontestably +incontinence +incontinent +incontrovertible +incontrovertibly +inconvenience +inconvenienced +inconveniences +inconveniencing +inconvenient +inconveniently +incorporate +incorporated +incorporates +incorporating +incorporation +incorporeal +incorrect +incorrectly +incorrectness +incorrigibility +incorrigible +incorrigibly +incorruptibility +incorruptible +incorruptibly +increase +increased +increases +increasing +increasingly +incredibility +incredible +incredibly +incredulity +incredulous +incredulously +increment +incremental +increments +incriminate +incriminated +incriminates +incriminating +incrimination +incriminatory +incrust +incrustation +incrustations +incrusted +incrusting +incrusts +incubate +incubated +incubates +incubating +incubation +incubator +incubators +incubi +incubus +incubuses +inculcate +inculcated +inculcates +inculcating +inculcation +inculpable +inculpate +inculpated +inculpates +inculpating +incumbencies +incumbency +incumbent +incumbents +incumber +incumbered +incumbering +incumbers +incunabula +incunabulum +incur +incurable +incurables +incurably +incurious +incurred +incurring +incurs +incursion +incursions +indebted +indebtedness +indecencies +indecency +indecent +indecently +indecipherable +indecision +indecisive +indecisively +indecisiveness +indecorous +indecorously +indeed +indefatigable +indefatigably +indefeasible +indefeasibly +indefensible +indefensibly +indefinable +indefinably +indefinite +indefinitely +indefiniteness +indelible +indelibly +indelicacies +indelicacy +indelicate +indelicately +indemnification +indemnifications +indemnified +indemnifies +indemnify +indemnifying +indemnities +indemnity +indemonstrable +indent +indentation +indentations +indented +indenting +indention +indents +indenture +indentured +indentures +indenturing +independence +independent +independently +independents +indescribable +indescribably +indestructibility +indestructible +indestructibly +indeterminable +indeterminably +indeterminacy +indeterminate +indeterminately +index +indexation +indexations +indexed +indexer +indexers +indexes +indexing +indicate +indicated +indicates +indicating +indication +indications +indicative +indicatively +indicatives +indicator +indicators +indices +indict +indictable +indicted +indicting +indictment +indictments +indicts +indifference +indifferent +indifferently +indigence +indigenous +indigent +indigently +indigents +indigestible +indigestion +indignant +indignantly +indignation +indignities +indignity +indigo +indirect +indirected +indirecting +indirection +indirectly +indirectness +indirects +indiscernible +indiscreet +indiscreetly +indiscretion +indiscretions +indiscriminate +indiscriminately +indispensability +indispensable +indispensables +indispensably +indisposed +indisposition +indispositions +indisputable +indisputably +indissoluble +indissolubly +indistinct +indistinctly +indistinctness +indistinguishable +indistinguishably +indite +indited +indites +inditing +indium +individual +individualism +individualist +individualistic +individualistically +individualists +individuality +individualization +individualize +individualized +individualizes +individualizing +individually +individuals +individuate +individuated +individuates +individuating +individuation +indivisibility +indivisible +indivisibly +indoctrinate +indoctrinated +indoctrinates +indoctrinating +indoctrination +indolence +indolent +indolently +indomitable +indomitably +indoor +indoors +indorse +indorsed +indorses +indorsing +indubitable +indubitably +induce +induced +inducement +inducements +inducer +inducers +induces +inducing +induct +inductance +inducted +inductee +inductees +inducting +induction +inductions +inductive +inducts +indue +indued +indues +induing +indulge +indulged +indulgence +indulgences +indulgent +indulgently +indulges +indulging +industrial +industrialism +industrialist +industrialists +industrialization +industrialize +industrialized +industrializes +industrializing +industrially +industries +industrious +industriously +industriousness +industry +indwell +indwelled +indwelling +indwells +indwelt +inebriate +inebriated +inebriates +inebriating +inebriation +inedible +ineducable +ineffability +ineffable +ineffably +ineffective +ineffectively +ineffectiveness +ineffectual +ineffectually +inefficacy +inefficiencies +inefficiency +inefficient +inefficiently +inelastic +inelegance +inelegant +inelegantly +ineligibility +ineligible +ineligibles +ineligibly +ineluctable +ineluctably +inept +inepter +ineptest +ineptitude +ineptly +ineptness +inequalities +inequality +inequitable +inequitably +inequities +inequity +ineradicable +inerrant +inert +inertia +inertial +inertly +inertness +inescapable +inescapably +inessential +inessentials +inestimable +inestimably +inevitability +inevitable +inevitables +inevitably +inexact +inexactly +inexactness +inexcusable +inexcusably +inexhaustible +inexhaustibly +inexorable +inexorably +inexpedience +inexpediency +inexpedient +inexpensive +inexpensively +inexpensiveness +inexperience +inexperienced +inexpert +inexpertly +inexpiable +inexplicable +inexplicably +inexpressible +inexpressibly +inexpressive +inextinguishable +inextricable +inextricably +infallibility +infallible +infallibly +infamies +infamous +infamously +infamy +infancy +infant +infanticide +infanticides +infantile +infantries +infantry +infantryman +infantrymen +infants +infarct +infarction +infarcts +infatuate +infatuated +infatuates +infatuating +infatuation +infatuations +infect +infected +infecting +infection +infections +infectious +infectiously +infectiousness +infects +infelicities +infelicitous +infelicity +infer +inference +inferences +inferential +inferior +inferiority +inferiors +infernal +infernally +inferno +infernos +inferred +inferring +infers +infertile +infertility +infest +infestation +infestations +infested +infesting +infests +infidel +infidelities +infidelity +infidels +infield +infielder +infielders +infields +infighter +infighters +infighting +infiltrate +infiltrated +infiltrates +infiltrating +infiltration +infiltrator +infiltrators +infinite +infinitely +infinitesimal +infinitesimally +infinitesimals +infinities +infinitival +infinitive +infinitives +infinitude +infinity +infirm +infirmaries +infirmary +infirmities +infirmity +inflame +inflamed +inflames +inflaming +inflammability +inflammable +inflammation +inflammations +inflammatory +inflatable +inflatables +inflate +inflated +inflates +inflating +inflation +inflationary +inflect +inflected +inflecting +inflection +inflectional +inflections +inflects +inflexibility +inflexible +inflexibly +inflexion +inflexions +inflict +inflicted +inflicting +infliction +inflictive +inflicts +inflight +inflorescence +inflorescent +inflow +inflows +influence +influenced +influences +influencing +influential +influentially +influenza +influx +influxes +info +infold +infolded +infolding +infolds +infomercial +infomercials +inform +informal +informality +informally +informant +informants +information +informational +informative +informatively +informativeness +informed +informer +informers +informing +informs +infotainment +infra +infraction +infractions +infrared +infrasonic +infrastructure +infrastructures +infrequence +infrequency +infrequent +infrequently +infringe +infringed +infringement +infringements +infringes +infringing +infuriate +infuriated +infuriates +infuriating +infuriatingly +infuse +infused +infuser +infusers +infuses +infusing +infusion +infusions +ingenious +ingeniously +ingeniousness +ingenue +ingenues +ingenuity +ingenuous +ingenuously +ingenuousness +ingest +ingested +ingesting +ingestion +ingests +inglenook +inglenooks +inglorious +ingloriously +ingot +ingots +ingrain +ingrained +ingraining +ingrains +ingrate +ingrates +ingratiate +ingratiated +ingratiates +ingratiating +ingratiatingly +ingratiation +ingratitude +ingredient +ingredients +ingress +ingresses +ingrowing +ingrown +inguinal +inhabit +inhabitable +inhabitant +inhabitants +inhabited +inhabiting +inhabits +inhalant +inhalants +inhalation +inhalations +inhalator +inhalators +inhale +inhaled +inhaler +inhalers +inhales +inhaling +inharmonious +inhere +inhered +inherent +inherently +inheres +inhering +inherit +inheritable +inheritance +inheritances +inherited +inheriting +inheritor +inheritors +inherits +inhibit +inhibited +inhibiting +inhibition +inhibitions +inhibitor +inhibitors +inhibitory +inhibits +inhospitable +inhospitably +inhuman +inhumane +inhumanely +inhumanities +inhumanity +inhumanly +inimical +inimically +inimitable +inimitably +iniquities +iniquitous +iniquitously +iniquity +initial +initialed +initialing +initialize +initialized +initializes +initializing +initialled +initialling +initially +initials +initiate +initiated +initiates +initiating +initiation +initiations +initiative +initiatives +initiator +initiators +initiatory +inject +injected +injecting +injection +injections +injector +injectors +injects +injudicious +injudiciously +injudiciousness +injunction +injunctions +injure +injured +injurer +injurers +injures +injuries +injuring +injurious +injury +injustice +injustices +inkblot +inkblots +inked +inkier +inkiest +inkiness +inking +inkling +inklings +inks +inkstand +inkstands +inkwell +inkwells +inky +inlaid +inland +inlay +inlaying +inlays +inlet +inlets +inmate +inmates +inmost +innards +innate +innately +innateness +inner +innermost +innersole +innersoles +innerspring +innervate +innervated +innervates +innervating +innervation +inning +innings +innkeeper +innkeepers +innocence +innocent +innocently +innocents +innocuous +innocuously +innocuousness +innovate +innovated +innovates +innovating +innovation +innovations +innovative +innovator +innovators +inns +innuendo +innuendoes +innuendos +innumerable +innumerably +innumeracy +innumerate +inoculate +inoculated +inoculates +inoculating +inoculation +inoculations +inoffensive +inoffensively +inoffensiveness +inoperable +inoperative +inopportune +inopportunely +inordinate +inordinately +inorganic +inorganically +inpatient +inpatients +input +inputs +inputted +inputting +inquest +inquests +inquietude +inquire +inquired +inquirer +inquirers +inquires +inquiries +inquiring +inquiringly +inquiry +inquisition +inquisitional +inquisitions +inquisitive +inquisitively +inquisitiveness +inquisitor +inquisitorial +inquisitors +inroad +inroads +inrush +inrushes +insalubrious +insane +insanely +insaner +insanest +insanitary +insanity +insatiability +insatiable +insatiably +inscribe +inscribed +inscriber +inscribers +inscribes +inscribing +inscription +inscriptions +inscrutability +inscrutable +inscrutableness +inscrutably +inseam +inseams +insect +insecticidal +insecticide +insecticides +insectivore +insectivores +insectivorous +insects +insecure +insecurely +insecurities +insecurity +inseminate +inseminated +inseminates +inseminating +insemination +insensate +insensibility +insensible +insensibly +insensitive +insensitively +insensitivity +insentience +insentient +inseparability +inseparable +inseparables +inseparably +insert +inserted +inserting +insertion +insertions +inserts +inset +insets +insetted +insetting +inshore +inside +insider +insiders +insides +insidious +insidiously +insidiousness +insight +insightful +insights +insigne +insignia +insignias +insignificance +insignificant +insignificantly +insincere +insincerely +insincerity +insinuate +insinuated +insinuates +insinuating +insinuation +insinuations +insinuative +insinuator +insinuators +insipid +insipidity +insipidly +insist +insisted +insistence +insistent +insistently +insisting +insistingly +insists +insobriety +insofar +insole +insolence +insolent +insolently +insoles +insolubility +insoluble +insolubly +insolvable +insolvency +insolvent +insolvents +insomnia +insomniac +insomniacs +insomuch +insouciance +insouciant +inspect +inspected +inspecting +inspection +inspections +inspector +inspectorate +inspectorates +inspectors +inspects +inspiration +inspirational +inspirations +inspire +inspired +inspires +inspiring +inspirit +inspirited +inspiriting +inspirits +instability +instal +install +installation +installations +installed +installer +installers +installing +installment +installments +installs +instalment +instalments +instals +instance +instanced +instances +instancing +instant +instantaneous +instantaneously +instanter +instantiate +instantiated +instantiates +instantiating +instantly +instants +instate +instated +instates +instating +instead +instep +insteps +instigate +instigated +instigates +instigating +instigation +instigator +instigators +instil +instill +instillation +instilled +instilling +instills +instils +instinct +instinctive +instinctively +instincts +instinctual +institute +instituted +instituter +instituters +institutes +instituting +institution +institutional +institutionalization +institutionalize +institutionalized +institutionalizes +institutionalizing +institutionally +institutions +institutor +institutors +instruct +instructed +instructing +instruction +instructional +instructions +instructive +instructively +instructor +instructors +instructs +instrument +instrumental +instrumentalist +instrumentalists +instrumentality +instrumentally +instrumentals +instrumentation +instrumented +instrumenting +instruments +insubordinate +insubordination +insubstantial +insubstantially +insufferable +insufferably +insufficiency +insufficient +insufficiently +insular +insularity +insulate +insulated +insulates +insulating +insulation +insulator +insulators +insulin +insult +insulted +insulting +insultingly +insults +insuperable +insuperably +insupportable +insurable +insurance +insurances +insure +insured +insureds +insurer +insurers +insures +insurgence +insurgences +insurgencies +insurgency +insurgent +insurgents +insuring +insurmountable +insurmountably +insurrection +insurrectionist +insurrectionists +insurrections +insusceptible +intact +intagli +intaglio +intaglios +intake +intakes +intangibility +intangible +intangibles +intangibly +integer +integers +integral +integrally +integrals +integrate +integrated +integrates +integrating +integration +integrative +integrity +integument +integuments +intellect +intellects +intellectual +intellectualism +intellectualize +intellectualized +intellectualizes +intellectualizing +intellectually +intellectuals +intelligence +intelligent +intelligently +intelligentsia +intelligibility +intelligible +intelligibly +intemperance +intemperate +intemperately +intend +intended +intendeds +intending +intends +intense +intensely +intenser +intensest +intensification +intensified +intensifier +intensifiers +intensifies +intensify +intensifying +intensities +intensity +intensive +intensively +intensiveness +intensives +intent +intention +intentional +intentionally +intentions +intently +intentness +intents +inter +interact +interacted +interacting +interaction +interactions +interactive +interactively +interacts +interbred +interbreed +interbreeding +interbreeds +intercede +interceded +intercedes +interceding +intercept +intercepted +intercepting +interception +interceptions +interceptor +interceptors +intercepts +intercession +intercessions +intercessor +intercessors +intercessory +interchange +interchangeable +interchangeably +interchanged +interchanges +interchanging +intercollegiate +intercom +intercommunicate +intercommunicated +intercommunicates +intercommunicating +intercommunication +intercoms +interconnect +interconnected +interconnecting +interconnection +interconnections +interconnects +intercontinental +intercourse +intercultural +interdenominational +interdepartmental +interdependence +interdependent +interdependently +interdict +interdicted +interdicting +interdiction +interdicts +interdisciplinary +interest +interested +interesting +interestingly +interests +interface +interfaced +interfaces +interfacing +interfaith +interfere +interfered +interference +interferes +interfering +interferon +interfile +interfiled +interfiles +interfiling +intergalactic +intergovernmental +interim +interior +interiors +interject +interjected +interjecting +interjection +interjections +interjects +interlace +interlaced +interlaces +interlacing +interlard +interlarded +interlarding +interlards +interleave +interleaved +interleaves +interleaving +interleukin +interline +interlinear +interlined +interlines +interlining +interlinings +interlink +interlinked +interlinking +interlinks +interlock +interlocked +interlocking +interlocks +interlocutor +interlocutors +interlocutory +interlope +interloped +interloper +interlopers +interlopes +interloping +interlude +interludes +intermarriage +intermarriages +intermarried +intermarries +intermarry +intermarrying +intermediaries +intermediary +intermediate +intermediately +intermediates +interment +interments +intermezzi +intermezzo +intermezzos +interminable +interminably +intermingle +intermingled +intermingles +intermingling +intermission +intermissions +intermittent +intermittently +intermix +intermixed +intermixes +intermixing +intern +internal +internalization +internalize +internalized +internalizes +internalizing +internally +international +internationalise +internationalised +internationalises +internationalising +internationalism +internationalist +internationalists +internationalize +internationalized +internationalizes +internationalizing +internationally +internationals +interne +internecine +interned +internee +internees +internes +interning +internist +internists +internment +interns +internship +internships +interoffice +interpersonal +interplanetary +interplay +interpolate +interpolated +interpolates +interpolating +interpolation +interpolations +interpose +interposed +interposes +interposing +interposition +interpret +interpretation +interpretations +interpretative +interpreted +interpreter +interpreters +interpreting +interpretive +interprets +interracial +interred +interregna +interregnum +interregnums +interrelate +interrelated +interrelates +interrelating +interrelation +interrelations +interrelationship +interrelationships +interring +interrogate +interrogated +interrogates +interrogating +interrogation +interrogations +interrogative +interrogatively +interrogatives +interrogator +interrogatories +interrogators +interrogatory +interrupt +interrupted +interrupter +interrupters +interrupting +interruption +interruptions +interrupts +inters +interscholastic +intersect +intersected +intersecting +intersection +intersections +intersects +intersession +intersessions +intersperse +interspersed +intersperses +interspersing +interspersion +interstate +interstates +interstellar +interstice +interstices +interstitial +intertwine +intertwined +intertwines +intertwining +interurban +interval +intervals +intervene +intervened +intervenes +intervening +intervention +interventionism +interventionist +interventionists +interventions +interview +interviewed +interviewee +interviewees +interviewer +interviewers +interviewing +interviews +intervocalic +interweave +interweaved +interweaves +interweaving +interwove +interwoven +intestacy +intestate +intestinal +intestine +intestines +intimacies +intimacy +intimate +intimated +intimately +intimates +intimating +intimation +intimations +intimidate +intimidated +intimidates +intimidating +intimidatingly +intimidation +into +intolerable +intolerably +intolerance +intolerant +intolerantly +intonation +intonations +intone +intoned +intoner +intoners +intones +intoning +intoxicant +intoxicants +intoxicate +intoxicated +intoxicates +intoxicating +intoxication +intractability +intractable +intractably +intramural +intramuscular +intransigence +intransigent +intransigently +intransigents +intransitive +intransitively +intransitives +intrastate +intrauterine +intravenous +intravenouses +intravenously +intrench +intrenched +intrenches +intrenching +intrepid +intrepidity +intrepidly +intricacies +intricacy +intricate +intricately +intrigue +intrigued +intriguer +intriguers +intrigues +intriguing +intriguingly +intrinsic +intrinsically +intro +introduce +introduced +introduces +introducing +introduction +introductions +introductory +introit +introits +intros +introspect +introspected +introspecting +introspection +introspective +introspectively +introspects +introversion +introvert +introverted +introverts +intrude +intruded +intruder +intruders +intrudes +intruding +intrusion +intrusions +intrusive +intrusively +intrusiveness +intrust +intrusted +intrusting +intrusts +intuit +intuited +intuiting +intuition +intuitions +intuitive +intuitively +intuitiveness +intuits +inundate +inundated +inundates +inundating +inundation +inundations +inure +inured +inures +inuring +invade +invaded +invader +invaders +invades +invading +invalid +invalidate +invalidated +invalidates +invalidating +invalidation +invalided +invaliding +invalidism +invalidity +invalidly +invalids +invaluable +invaluably +invariability +invariable +invariables +invariably +invasion +invasions +invasive +invective +inveigh +inveighed +inveighing +inveighs +inveigle +inveigled +inveigler +inveiglers +inveigles +inveigling +invent +invented +inventing +invention +inventions +inventive +inventively +inventiveness +inventor +inventoried +inventories +inventors +inventory +inventorying +invents +inverse +inversely +inverses +inversion +inversions +invert +invertebrate +invertebrates +inverted +inverting +inverts +invest +invested +investigate +investigated +investigates +investigating +investigation +investigations +investigative +investigator +investigators +investigatory +investing +investiture +investitures +investment +investments +investor +investors +invests +inveteracy +inveterate +invidious +invidiously +invidiousness +invigorate +invigorated +invigorates +invigorating +invigoratingly +invigoration +invincibility +invincible +invincibly +inviolability +inviolable +inviolably +inviolate +invisibility +invisible +invisibly +invitation +invitational +invitationals +invitations +invite +invited +invitee +invitees +invites +inviting +invitingly +invocation +invocations +invoice +invoiced +invoices +invoicing +invoke +invoked +invokes +invoking +involuntarily +involuntariness +involuntary +involution +involve +involved +involvement +involvements +involves +involving +invulnerability +invulnerable +invulnerably +inward +inwardly +inwards +iodide +iodides +iodine +iodize +iodized +iodizes +iodizing +ionic +ionization +ionize +ionized +ionizer +ionizers +ionizes +ionizing +ionosphere +ionospheres +ionospheric +ions +iota +iotas +ipecac +ipecacs +irascibility +irascible +irascibly +irate +irately +irateness +ireful +irenic +irides +iridescence +iridescent +iridescently +iridium +iris +irises +irked +irking +irks +irksome +irksomely +irksomeness +iron +ironclad +ironclads +ironed +ironic +ironical +ironically +ironies +ironing +irons +ironstone +ironware +ironwood +ironwoods +ironwork +irony +irradiate +irradiated +irradiates +irradiating +irradiation +irrational +irrationality +irrationally +irrationals +irreclaimable +irreconcilability +irreconcilable +irreconcilably +irrecoverable +irrecoverably +irredeemable +irredeemably +irreducible +irreducibly +irrefutable +irrefutably +irregardless +irregular +irregularities +irregularity +irregularly +irregulars +irrelevance +irrelevances +irrelevancies +irrelevancy +irrelevant +irrelevantly +irreligious +irremediable +irremediably +irremovable +irreparable +irreparably +irreplaceable +irrepressible +irrepressibly +irreproachable +irreproachably +irresistible +irresistibly +irresolute +irresolutely +irresoluteness +irresolution +irrespective +irresponsibility +irresponsible +irresponsibly +irretrievable +irretrievably +irreverence +irreverent +irreverently +irreversible +irreversibly +irrevocable +irrevocably +irrigable +irrigate +irrigated +irrigates +irrigating +irrigation +irritability +irritable +irritably +irritant +irritants +irritate +irritated +irritates +irritating +irritatingly +irritation +irritations +irrupt +irrupted +irrupting +irruption +irruptions +irruptive +irrupts +isinglass +island +islander +islanders +islands +isle +isles +islet +islets +isms +isobar +isobaric +isobars +isolate +isolated +isolates +isolating +isolation +isolationism +isolationist +isolationists +isomer +isomeric +isomerism +isomers +isometric +isometrically +isometrics +isosceles +isotherm +isotherms +isotope +isotopes +isotopic +issuance +issue +issued +issuer +issuers +issues +issuing +isthmi +isthmian +isthmus +isthmuses +italic +italicization +italicize +italicized +italicizes +italicizing +italics +itch +itched +itches +itchier +itchiest +itchiness +itching +itchy +item +itemization +itemize +itemized +itemizes +itemizing +items +iterate +iterated +iterates +iterating +iteration +iterations +iterative +itinerant +itinerants +itineraries +itinerary +itself +ivied +ivies +ivories +ivory +jabbed +jabber +jabbered +jabberer +jabberers +jabbering +jabbers +jabbing +jabot +jabots +jabs +jacaranda +jacarandas +jack +jackal +jackals +jackass +jackasses +jackboot +jackboots +jackdaw +jackdaws +jacked +jacket +jacketed +jackets +jackhammer +jackhammers +jacking +jackknife +jackknifed +jackknifes +jackknifing +jackknives +jackpot +jackpots +jackrabbit +jackrabbits +jacks +jackstraw +jackstraws +jacquard +jade +jaded +jadedly +jadedness +jadeite +jades +jading +jagged +jaggeder +jaggedest +jaggedly +jaggedness +jags +jaguar +jaguars +jail +jailbird +jailbirds +jailbreak +jailbreaks +jailed +jailer +jailers +jailing +jailor +jailors +jails +jalapeno +jalapenos +jalopies +jalopy +jalousie +jalousies +jamb +jambalaya +jamboree +jamborees +jambs +jammed +jamming +jams +jangle +jangled +jangler +janglers +jangles +jangling +janitor +janitorial +janitors +japan +japanned +japanning +japans +jape +japed +japes +japing +jardiniere +jardinieres +jarful +jarfuls +jargon +jarred +jarring +jarringly +jars +jasmine +jasmines +jasper +jato +jatos +jaundice +jaundiced +jaundices +jaundicing +jaunt +jaunted +jauntier +jauntiest +jauntily +jauntiness +jaunting +jaunts +jaunty +java +javelin +javelins +jawbone +jawboned +jawbones +jawboning +jawbreaker +jawbreakers +jawed +jawing +jaws +jaybird +jaybirds +jays +jaywalk +jaywalked +jaywalker +jaywalkers +jaywalking +jaywalks +jazz +jazzed +jazzes +jazzier +jazziest +jazzing +jazzy +jealous +jealousies +jealously +jealousy +jean +jeans +jeep +jeeps +jeer +jeered +jeering +jeeringly +jeers +jeez +jehad +jehads +jejuna +jejune +jejunum +jejunums +jell +jelled +jellied +jellies +jelling +jello +jells +jelly +jellybean +jellybeans +jellyfish +jellyfishes +jellying +jellylike +jellyroll +jellyrolls +jennet +jennets +jennies +jenny +jeopardize +jeopardized +jeopardizes +jeopardizing +jeopardy +jeremiad +jeremiads +jerk +jerked +jerkier +jerkiest +jerkily +jerkin +jerkiness +jerking +jerkins +jerks +jerkwater +jerky +jerrybuilt +jersey +jerseys +jessamine +jessamines +jest +jested +jester +jesters +jesting +jestingly +jests +jetliner +jetliners +jetport +jetports +jets +jetsam +jetted +jetties +jetting +jettison +jettisoned +jettisoning +jettisons +jetty +jewed +jewel +jeweled +jeweler +jewelers +jeweling +jewelled +jeweller +jewelleries +jewellers +jewellery +jewelling +jewelries +jewelry +jewels +jewing +jews +jibbed +jibbing +jibe +jibed +jibes +jibing +jibs +jiff +jiffies +jiffs +jiffy +jigged +jigger +jiggered +jiggering +jiggers +jigging +jiggle +jiggled +jiggles +jigglier +jiggliest +jiggling +jiggly +jigs +jigsaw +jigsawed +jigsawing +jigsawn +jigsaws +jihad +jihads +jilt +jilted +jilting +jilts +jimmied +jimmies +jimmy +jimmying +jimsonweed +jingle +jingled +jingles +jinglier +jingliest +jingling +jingly +jingoism +jingoist +jingoistic +jingoists +jinn +jinni +jinnis +jinns +jinricksha +jinrickshas +jinrikisha +jinrikishas +jinriksha +jinrikshas +jinx +jinxed +jinxes +jinxing +jitney +jitneys +jitterbug +jitterbugged +jitterbugger +jitterbuggers +jitterbugging +jitterbugs +jitterier +jitteriest +jitters +jittery +jiujitsu +jive +jived +jives +jiving +jobbed +jobber +jobbers +jobbing +jobholder +jobholders +jobless +joblessness +jobs +jock +jockey +jockeyed +jockeying +jockeys +jocks +jockstrap +jockstraps +jocose +jocosely +jocoseness +jocosity +jocular +jocularity +jocularly +jocund +jocundity +jocundly +jodhpurs +jogged +jogger +joggers +jogging +joggle +joggled +joggles +joggling +jogs +john +johnnies +johnny +johnnycake +johnnycakes +johns +join +joined +joiner +joiners +joinery +joining +joins +joint +jointed +jointing +jointly +joints +joist +joists +joke +joked +joker +jokers +jokes +jokey +jokier +jokiest +joking +jokingly +joky +jollied +jollier +jollies +jolliest +jollification +jollifications +jollily +jolliness +jollity +jolly +jollying +jolt +jolted +jolter +jolters +jolting +jolts +jonquil +jonquils +josh +joshed +josher +joshers +joshes +joshing +jostle +jostled +jostles +jostling +jots +jotted +jotter +jotters +jotting +jottings +joule +joules +jounce +jounced +jounces +jouncier +jounciest +jouncing +jouncy +journal +journalese +journalism +journalist +journalistic +journalists +journals +journey +journeyed +journeyer +journeyers +journeying +journeyman +journeymen +journeys +joust +jousted +jouster +jousters +jousting +jousts +jovial +joviality +jovially +jowl +jowlier +jowliest +jowls +jowly +joyed +joyful +joyfuller +joyfullest +joyfully +joyfulness +joying +joyless +joylessly +joylessness +joyous +joyously +joyousness +joyridden +joyride +joyrider +joyriders +joyrides +joyriding +joyrode +joys +joystick +joysticks +jubilant +jubilantly +jubilation +jubilee +jubilees +judge +judged +judgement +judgements +judges +judgeship +judging +judgment +judgmental +judgmentally +judgments +judicatories +judicatory +judicature +judicial +judicially +judiciaries +judiciary +judicious +judiciously +judiciousness +judo +jugful +jugfuls +jugged +juggernaut +juggernauts +jugging +juggle +juggled +juggler +jugglers +jugglery +juggles +juggling +jugs +jugular +jugulars +juice +juiced +juicer +juicers +juices +juicier +juiciest +juicily +juiciness +juicing +juicy +jujitsu +jujube +jujubes +jujutsu +jukebox +jukeboxes +julep +juleps +julienne +julienned +juliennes +julienning +jumble +jumbled +jumbles +jumbling +jumbo +jumbos +jump +jumped +jumper +jumpers +jumpier +jumpiest +jumpily +jumpiness +jumping +jumps +jumpsuit +jumpsuits +jumpy +junco +juncoes +juncos +junction +junctions +juncture +junctures +jungle +jungles +junior +juniors +juniper +junipers +junk +junked +junker +junkers +junket +junketed +junketeer +junketeers +junketer +junketers +junketing +junkets +junkie +junkier +junkies +junkiest +junking +junks +junky +junkyard +junkyards +junta +juntas +juridic +juridical +juridically +juries +jurisdiction +jurisdictional +jurisprudence +jurist +juristic +jurists +juror +jurors +jury +juryman +jurymen +jurywoman +jurywomen +just +juster +justest +justice +justices +justifiable +justifiably +justification +justifications +justified +justifies +justify +justifying +justly +justness +jute +juts +jutted +jutting +juvenile +juveniles +juxtapose +juxtaposed +juxtaposes +juxtaposing +juxtaposition +juxtapositions +kabob +kabobs +kabuki +kaddish +kaddishes +kaffeeklatch +kaffeeklatches +kaffeeklatsch +kaffeeklatsches +kaftan +kaftans +kaiser +kaisers +kale +kaleidoscope +kaleidoscopes +kaleidoscopic +kaleidoscopically +kamikaze +kamikazes +kangaroo +kangaroos +kaolin +kapok +kappa +kappas +kaput +karakul +karaoke +karaokes +karat +karate +karats +karma +karmic +kart +karts +katydid +katydids +kayak +kayaked +kayaking +kayaks +kayo +kayoed +kayoing +kayos +kazoo +kazoos +kebab +kebabs +kebob +kebobs +keel +keeled +keelhaul +keelhauled +keelhauling +keelhauls +keeling +keels +keen +keened +keener +keenest +keening +keenly +keenness +keens +keep +keeper +keepers +keeping +keeps +keepsake +keepsakes +kegs +kelp +kelvin +kelvins +kenned +kennel +kenneled +kenneling +kennelled +kennelling +kennels +kenning +keno +kens +kent +kepi +kepis +kept +keratin +kerb +kerbs +kerchief +kerchiefs +kerchieves +kernel +kernels +kerosene +kerosine +kestrel +kestrels +ketch +ketches +ketchup +kettle +kettledrum +kettledrums +kettles +keyboard +keyboarded +keyboarder +keyboarders +keyboarding +keyboardist +keyboardists +keyboards +keyed +keyhole +keyholes +keying +keynote +keynoted +keynoter +keynoters +keynotes +keynoting +keypad +keypads +keypunch +keypunched +keypuncher +keypunchers +keypunches +keypunching +keys +keystone +keystones +keystroke +keystrokes +keyword +keywords +khaki +khakis +khan +khans +kibble +kibbled +kibbles +kibbling +kibbutz +kibbutzim +kibitz +kibitzed +kibitzer +kibitzers +kibitzes +kibitzing +kibosh +kick +kickback +kickbacks +kickball +kicked +kicker +kickers +kickier +kickiest +kicking +kickoff +kickoffs +kicks +kickstand +kickstands +kicky +kidded +kidder +kidders +kiddie +kiddies +kidding +kiddish +kiddo +kiddoes +kiddos +kiddy +kidnap +kidnaped +kidnaper +kidnapers +kidnaping +kidnapped +kidnapper +kidnappers +kidnapping +kidnappings +kidnaps +kidney +kidneys +kids +kidskin +kielbasa +kielbasas +kielbasi +kielbasy +kill +killdeer +killdeers +killed +killer +killers +killing +killings +killjoy +killjoys +kills +kiln +kilned +kilning +kilns +kilo +kilobyte +kilobytes +kilocycle +kilocycles +kilogram +kilograms +kilohertz +kilohertzes +kiloliter +kiloliters +kilometer +kilometers +kilometre +kilometres +kilos +kiloton +kilotons +kilowatt +kilowatts +kilt +kilter +kilts +kimono +kimonos +kind +kinda +kinder +kindergarten +kindergartener +kindergarteners +kindergartens +kindergartner +kindergartners +kindest +kindhearted +kindheartedly +kindheartedness +kindle +kindled +kindles +kindlier +kindliest +kindliness +kindling +kindly +kindness +kindnesses +kindred +kinds +kine +kinematic +kinematics +kinetic +kinetically +kinetics +kinfolk +kinfolks +king +kingdom +kingdoms +kingfisher +kingfishers +kinglier +kingliest +kingly +kingpin +kingpins +kings +kingship +kink +kinked +kinkier +kinkiest +kinkily +kinkiness +kinking +kinks +kinky +kinsfolk +kinsfolks +kinship +kinsman +kinsmen +kinswoman +kinswomen +kiosk +kiosks +kipped +kipper +kippered +kippering +kippers +kipping +kips +kirk +kirks +kirsch +kismet +kiss +kissable +kissed +kisser +kissers +kisses +kissing +kissoff +kissoffs +kitbag +kitbags +kitchen +kitchenette +kitchenettes +kitchens +kitchenware +kite +kited +kites +kith +kiting +kits +kitsch +kitschier +kitschiest +kitschy +kitten +kittenish +kittens +kitties +kitty +kiwi +kiwifruit +kiwifruits +kiwis +kleptomania +kleptomaniac +kleptomaniacs +klutz +klutzes +klutzier +klutziest +klutziness +klutzy +knack +knacks +knackwurst +knackwursts +knapsack +knapsacks +knave +knavery +knaves +knavish +knavishly +knead +kneaded +kneader +kneaders +kneading +kneads +knee +kneecap +kneecapped +kneecapping +kneecaps +kneed +kneeing +kneel +kneeled +kneeling +kneels +knees +knell +knelled +knelling +knells +knelt +knew +knickerbockers +knickers +knickknack +knickknacks +knife +knifed +knifes +knifing +knight +knighted +knighthood +knighthoods +knighting +knightlier +knightliest +knightliness +knightly +knights +knish +knishes +knit +knits +knitted +knitter +knitters +knitting +knitwear +knives +knob +knobbier +knobbiest +knobby +knobs +knock +knockdown +knockdowns +knocked +knocker +knockers +knocking +knockoff +knockoffs +knockout +knockouts +knocks +knockwurst +knockwursts +knoll +knolls +knot +knothole +knotholes +knots +knotted +knottier +knottiest +knotting +knotty +know +knowable +knowing +knowingly +knowledge +knowledgeable +knowledgeably +known +knows +knuckle +knuckled +knucklehead +knuckleheads +knuckles +knuckling +knurl +knurled +knurling +knurls +koala +koalas +kohlrabi +kohlrabies +kola +kolas +kook +kookaburra +kookaburras +kookie +kookier +kookiest +kookiness +kooks +kooky +kopeck +kopecks +kopek +kopeks +kosher +koshered +koshering +koshers +kowtow +kowtowed +kowtowing +kowtows +kraal +kraals +kraut +krauts +krill +krona +krone +kroner +kronor +kronur +krypton +kuchen +kuchens +kudos +kudzu +kudzus +kumquat +kumquats +kvetch +kvetched +kvetcher +kvetchers +kvetches +kvetching +label +labeled +labeling +labelled +labelling +labels +labia +labial +labials +labile +labium +labor +laboratories +laboratory +labored +laborer +laborers +laboring +laborious +laboriously +laboriousness +labors +laborsaving +labour +laboured +labouring +labours +labs +laburnum +laburnums +labyrinth +labyrinthine +labyrinths +lace +laced +lacerate +lacerated +lacerates +lacerating +laceration +lacerations +laces +lacewing +lacewings +lacework +lachrymal +lachrymose +lacier +laciest +lacing +lack +lackadaisical +lackadaisically +lacked +lackey +lackeys +lacking +lackluster +lacklustre +lacks +laconic +laconically +lacquer +lacquered +lacquering +lacquers +lacrimal +lacrosse +lactate +lactated +lactates +lactating +lactation +lacteal +lactic +lactose +lacuna +lacunae +lacunas +lacy +ladder +laddered +laddering +ladders +laddie +laddies +lade +laded +laden +lades +ladies +lading +ladings +ladle +ladled +ladles +ladling +lads +lady +ladybird +ladybirds +ladybug +ladybugs +ladyfinger +ladyfingers +ladylike +ladylove +ladyloves +ladyship +laetrile +lager +lagers +laggard +laggardly +laggards +lagged +lagging +lagnappe +lagnappes +lagniappe +lagniappes +lagoon +lagoons +lags +laid +lain +lair +laird +lairds +lairs +laity +lake +lakefront +lakes +lallygag +lallygagged +lallygagging +lallygags +lama +lamas +lamaseries +lamasery +lamb +lambada +lambadas +lambast +lambaste +lambasted +lambastes +lambasting +lambasts +lambda +lambdas +lambed +lambency +lambent +lambently +lambing +lambkin +lambkins +lambs +lambskin +lambskins +lame +lamebrain +lamebrained +lamebrains +lamed +lamely +lameness +lament +lamentable +lamentably +lamentation +lamentations +lamented +lamenting +laments +lamer +lames +lamest +lamina +laminae +laminar +laminas +laminate +laminated +laminates +laminating +lamination +laming +lammed +lamming +lamp +lampblack +lamplight +lamplighter +lamplighters +lampoon +lampooned +lampooning +lampoons +lamppost +lampposts +lamprey +lampreys +lamps +lampshade +lampshades +lams +lanai +lanais +lance +lanced +lancer +lancers +lances +lancet +lancets +lancing +land +landau +landaus +landed +landfall +landfalls +landfill +landfills +landholder +landholders +landholding +landing +landings +landladies +landlady +landless +landlocked +landlord +landlords +landlubber +landlubbers +landmark +landmarks +landmass +landmasses +landowner +landowners +landowning +lands +landscape +landscaped +landscaper +landscapers +landscapes +landscaping +landslid +landslidden +landslide +landslides +landsliding +landsman +landsmen +landward +landwards +lane +lanes +language +languages +languid +languidly +languidness +languish +languished +languishes +languishing +languor +languorous +languorously +lank +lanker +lankest +lankier +lankiest +lankiness +lankly +lankness +lanky +lanolin +lantern +lanterns +lanthanum +lanyard +lanyards +lapboard +lapboards +lapdog +lapdogs +lapel +lapels +lapidaries +lapidary +lapin +lapins +lapped +lappet +lappets +lapping +laps +lapse +lapsed +lapses +lapsing +laptop +laptops +lapwing +lapwings +larboard +larboards +larcenies +larcenist +larcenists +larcenous +larceny +larch +larches +lard +larded +larder +larders +lardier +lardiest +larding +lards +lardy +large +largehearted +largely +largeness +larger +larges +largess +largesse +largest +largish +largo +largos +lariat +lariats +lark +larked +larking +larks +larkspur +larkspurs +larva +larvae +larval +larvas +laryngeal +larynges +laryngitis +larynx +larynxes +lasagna +lasagnas +lasagne +lasagnes +lascivious +lasciviously +lasciviousness +laser +lasers +lash +lashed +lashes +lashing +lashings +lass +lasses +lassie +lassies +lassitude +lasso +lassoed +lassoes +lassoing +lassos +last +lasted +lasting +lastingly +lastly +lasts +latch +latched +latches +latching +latchkey +latchkeys +late +latecomer +latecomers +lately +latency +lateness +latent +later +lateral +lateraled +lateraling +lateralled +lateralling +laterally +laterals +latest +latex +lath +lathe +lathed +lather +lathered +lathering +lathers +lathery +lathes +lathing +laths +latish +latitude +latitudes +latitudinal +latitudinarian +latitudinarians +latrine +latrines +latte +latter +latterly +lattes +lattice +latticed +lattices +latticework +latticeworks +laud +laudable +laudably +laudanum +laudatory +lauded +lauding +lauds +laugh +laughable +laughably +laughed +laughing +laughingly +laughingstock +laughingstocks +laughs +laughter +launch +launched +launcher +launchers +launches +launching +launchpad +launchpads +launder +laundered +launderer +launderers +launderette +launderettes +laundering +launders +laundress +laundresses +laundrette +laundrettes +laundries +laundromat +laundromats +laundry +laundryman +laundrymen +laundrywoman +laundrywomen +laureate +laureates +laureateship +laurel +laurels +lava +lavage +lavalier +lavaliere +lavalieres +lavaliers +lavatories +lavatory +lave +laved +lavender +lavenders +laves +laving +lavish +lavished +lavisher +lavishes +lavishest +lavishing +lavishly +lavishness +lawbreaker +lawbreakers +lawbreaking +lawful +lawfully +lawfulness +lawgiver +lawgivers +lawless +lawlessly +lawlessness +lawmaker +lawmakers +lawmaking +lawman +lawmen +lawn +lawnmower +lawnmowers +lawns +lawrencium +laws +lawsuit +lawsuits +lawyer +lawyers +laxative +laxatives +laxer +laxest +laxity +laxly +laxness +layaway +layer +layered +layering +layers +layette +layettes +laying +layman +laymen +layoff +layoffs +layout +layouts +layover +layovers +laypeople +layperson +laypersons +lays +layup +layups +laywoman +laywomen +laze +lazed +lazes +lazied +lazier +lazies +laziest +lazily +laziness +lazing +lazy +lazybones +lazying +leach +leached +leaches +leaching +lead +leaded +leaden +leader +leaderless +leaders +leadership +leading +leads +leaf +leafage +leafed +leafier +leafiest +leafing +leafless +leaflet +leafleted +leafleting +leaflets +leafletted +leafletting +leafs +leafstalk +leafstalks +leafy +league +leagued +leagues +leaguing +leak +leakage +leakages +leaked +leakier +leakiest +leakiness +leaking +leaks +leaky +lean +leaned +leaner +leanest +leaning +leanings +leanness +leans +leant +leap +leaped +leaper +leapers +leapfrog +leapfrogged +leapfrogging +leapfrogs +leaping +leaps +leapt +learn +learned +learnedly +learner +learners +learning +learns +learnt +leas +lease +leaseback +leasebacks +leased +leasehold +leaseholder +leaseholders +leaseholds +leaser +leasers +leases +leash +leashed +leashes +leashing +leasing +least +leastways +leastwise +leather +leatherette +leatherneck +leathernecks +leathery +leave +leaved +leaven +leavened +leavening +leavens +leaver +leavers +leaves +leaving +leavings +lech +lecher +lecherous +lecherously +lecherousness +lechers +lechery +leches +lecithin +lectern +lecterns +lecture +lectured +lecturer +lecturers +lectures +lectureship +lectureships +lecturing +ledge +ledger +ledgers +ledges +leech +leeched +leeches +leeching +leek +leeks +leer +leered +leerier +leeriest +leeriness +leering +leers +leery +lees +leeward +leewards +leeway +left +lefter +leftest +leftie +lefties +leftism +leftist +leftists +leftmost +leftover +leftovers +lefts +leftward +leftwards +lefty +legacies +legacy +legal +legalese +legalism +legalisms +legalistic +legality +legalization +legalize +legalized +legalizes +legalizing +legally +legals +legate +legatee +legatees +legates +legation +legations +legato +legatos +legend +legendarily +legendary +legends +legerdemain +legged +leggier +leggiest +leggin +legginess +legging +leggings +leggins +leggy +leghorn +leghorns +legibility +legible +legibly +legion +legionaries +legionary +legionnaire +legionnaires +legions +legislate +legislated +legislates +legislating +legislation +legislative +legislatively +legislator +legislators +legislature +legislatures +legit +legitimacy +legitimate +legitimated +legitimately +legitimates +legitimating +legitimatize +legitimatized +legitimatizes +legitimatizing +legitimization +legitimize +legitimized +legitimizes +legitimizing +legless +legman +legmen +legroom +legrooms +legs +legume +legumes +leguminous +legwork +leis +leisure +leisured +leisureliness +leisurely +leisurewear +leitmotif +leitmotifs +leitmotiv +leitmotivs +lemming +lemmings +lemon +lemonade +lemons +lemony +lemur +lemurs +lend +lender +lenders +lending +lends +length +lengthen +lengthened +lengthening +lengthens +lengthier +lengthiest +lengthily +lengthiness +lengths +lengthways +lengthwise +lengthy +lenience +leniency +lenient +leniently +lenitive +lens +lenses +lent +lenten +lentil +lentils +lento +leonine +leopard +leopardess +leopardesses +leopards +leotard +leotards +leper +lepers +leprechaun +leprechauns +leprosy +leprous +lept +lepta +lepton +leptons +lesbian +lesbianism +lesbians +lesion +lesions +less +lessee +lessees +lessen +lessened +lessening +lessens +lesser +lesson +lessons +lessor +lessors +lest +letdown +letdowns +lethal +lethally +lethargic +lethargically +lethargy +lets +letter +lettered +letterer +letterers +letterhead +letterheads +lettering +letterpress +letters +letting +lettuce +lettuces +letup +letups +leukaemia +leukemia +leukemic +leukemics +leukocyte +leukocytes +levee +levees +level +leveled +leveler +levelers +levelheaded +levelheadedness +leveling +levelled +leveller +levellers +levelling +levelly +levelness +levels +lever +leverage +leveraged +leverages +leveraging +levered +levering +levers +leviathan +leviathans +levied +levier +leviers +levies +levitate +levitated +levitates +levitating +levitation +levity +levy +levying +lewd +lewder +lewdest +lewdly +lewdness +lexica +lexical +lexicographer +lexicographers +lexicographic +lexicographical +lexicography +lexicon +lexicons +liabilities +liability +liable +liaise +liaised +liaises +liaising +liaison +liaisons +liar +liars +libation +libations +libber +libbers +libel +libeled +libeler +libelers +libeling +libelled +libeller +libellers +libelling +libellous +libelous +libels +liberal +liberalism +liberality +liberalization +liberalizations +liberalize +liberalized +liberalizes +liberalizing +liberally +liberalness +liberals +liberate +liberated +liberates +liberating +liberation +liberator +liberators +libertarian +libertarians +liberties +libertine +libertines +liberty +libidinal +libidinous +libido +libidos +librarian +librarians +libraries +library +libretti +librettist +librettists +libretto +librettos +lice +licence +licenced +licences +licencing +license +licensed +licensee +licensees +licenses +licensing +licentiate +licentiates +licentious +licentiously +licentiousness +lichee +lichees +lichen +lichens +licit +licitly +lick +licked +licking +lickings +licks +licorice +licorices +lidded +lidless +lido +lidos +lids +lied +lieder +lief +liefer +liefest +liege +lieges +lien +liens +lies +lieu +lieutenancy +lieutenant +lieutenants +life +lifeblood +lifeboat +lifeboats +lifebuoy +lifebuoys +lifeguard +lifeguards +lifeless +lifelessly +lifelessness +lifelike +lifeline +lifelines +lifelong +lifer +lifers +lifesaver +lifesavers +lifesaving +lifestyle +lifestyles +lifetime +lifetimes +lifework +lifeworks +lift +lifted +lifter +lifters +lifting +liftoff +liftoffs +lifts +ligament +ligaments +ligate +ligated +ligates +ligating +ligation +ligature +ligatured +ligatures +ligaturing +light +lighted +lighten +lightened +lightener +lighteners +lightening +lightens +lighter +lighters +lightest +lightface +lightfaced +lightheaded +lighthearted +lightheartedly +lightheartedness +lighthouse +lighthouses +lighting +lightly +lightness +lightning +lightninged +lightnings +lightproof +lights +lightship +lightships +lightweight +lightweights +ligneous +lignite +likability +likable +likableness +like +likeable +liked +likelier +likeliest +likelihood +likelihoods +likeliness +likely +liken +likened +likeness +likenesses +likening +likens +liker +likes +likest +likewise +liking +lilac +lilacs +lilies +lilliputian +lilt +lilted +lilting +lilts +lily +limb +limber +limbered +limbering +limberness +limbers +limbless +limbo +limbos +limbs +lime +limeade +limeades +limed +limelight +limerick +limericks +limes +limestone +limier +limiest +liming +limit +limitation +limitations +limited +limiter +limiters +limiting +limitless +limitlessness +limits +limn +limned +limning +limns +limo +limos +limousine +limousines +limp +limped +limper +limpest +limpet +limpets +limpid +limpidity +limpidly +limpidness +limping +limply +limpness +limps +limy +linage +linchpin +linchpins +linden +lindens +line +lineage +lineages +lineal +lineally +lineament +lineaments +linear +linearity +linearly +linebacker +linebackers +lined +lineman +linemen +linen +linens +liner +liners +lines +linesman +linesmen +lineup +lineups +ling +linger +lingered +lingerer +lingerers +lingerie +lingering +lingeringly +lingers +lingo +lingoes +lingos +lings +lingual +linguine +linguini +linguist +linguistic +linguistically +linguistics +linguists +liniment +liniments +lining +linings +link +linkage +linkages +linked +linking +links +linkup +linkups +linnet +linnets +linoleum +linseed +lint +lintel +lintels +lintier +lintiest +linty +lion +lioness +lionesses +lionhearted +lionization +lionize +lionized +lionizes +lionizing +lions +lipid +lipids +liposuction +lipped +lippier +lippiest +lippy +lipread +lipreader +lipreaders +lipreading +lipreads +lips +lipstick +lipsticks +liquefaction +liquefied +liquefies +liquefy +liquefying +liqueur +liqueurs +liquid +liquidate +liquidated +liquidates +liquidating +liquidation +liquidations +liquidator +liquidators +liquidity +liquidize +liquidized +liquidizer +liquidizers +liquidizes +liquidizing +liquids +liquified +liquifies +liquify +liquifying +liquor +liquored +liquorice +liquorices +liquoring +liquors +lira +liras +lire +lisle +lisp +lisped +lisper +lispers +lisping +lisps +lissom +lissome +list +listed +listen +listened +listener +listeners +listening +listens +listing +listings +listless +listlessly +listlessness +lists +litanies +litany +litchi +litchis +lite +liter +literacy +literal +literally +literalness +literals +literariness +literary +literate +literately +literates +literati +literature +liters +lithe +lithely +litheness +lither +lithesome +lithest +lithium +lithograph +lithographed +lithographer +lithographers +lithographic +lithographically +lithographing +lithographs +lithography +lithosphere +lithospheres +litigant +litigants +litigate +litigated +litigates +litigating +litigation +litigator +litigators +litigious +litigiousness +litmus +litotes +litre +litres +litter +litterateur +litterateurs +litterbug +litterbugs +littered +litterer +litterers +littering +litters +little +littleness +littler +littlest +littoral +littorals +liturgical +liturgically +liturgies +liturgist +liturgists +liturgy +livability +livable +live +liveable +lived +livelier +liveliest +livelihood +livelihoods +liveliness +livelong +lively +liven +livened +livening +livens +liver +liveried +liveries +liverish +livers +liverwort +liverworts +liverwurst +livery +liveryman +liverymen +lives +livest +livestock +livid +lividly +living +livings +lizard +lizards +llama +llamas +llano +llanos +load +loaded +loader +loaders +loading +loads +loadstar +loadstars +loadstone +loadstones +loaf +loafed +loafer +loafers +loafing +loafs +loam +loamier +loamiest +loamy +loan +loaned +loaner +loaners +loaning +loans +loansharking +loanword +loanwords +loath +loathe +loathed +loather +loathers +loathes +loathing +loathings +loathsome +loathsomely +loathsomeness +loaves +lobar +lobbed +lobber +lobbers +lobbied +lobbies +lobbing +lobby +lobbying +lobbyist +lobbyists +lobe +lobed +lobes +lobotomies +lobotomize +lobotomized +lobotomizes +lobotomizing +lobotomy +lobs +lobster +lobsters +local +locale +locales +localities +locality +localization +localize +localized +localizes +localizing +locally +locals +locate +located +locates +locating +location +locations +locator +locators +loch +lochs +loci +lock +locked +locker +lockers +locket +lockets +locking +lockjaw +lockout +lockouts +locks +locksmith +locksmiths +lockstep +lockup +lockups +loco +locomotion +locomotive +locomotives +locoweed +locoweeds +locus +locust +locusts +locution +locutions +lode +lodes +lodestar +lodestars +lodestone +lodestones +lodge +lodged +lodger +lodgers +lodges +lodging +lodgings +loft +lofted +loftier +loftiest +loftily +loftiness +lofting +lofts +lofty +loganberries +loganberry +logarithm +logarithmic +logarithms +logbook +logbooks +loge +loges +logged +logger +loggerhead +loggerheads +loggers +loggia +loggias +logging +logic +logical +logicality +logically +logician +logicians +logier +logiest +logistic +logistical +logistically +logistics +logjam +logjams +logo +logos +logotype +logotypes +logrolling +logs +logy +loin +loincloth +loincloths +loins +loiter +loitered +loiterer +loiterers +loitering +loiters +loll +lolled +lolling +lollipop +lollipops +lolls +lollygag +lollygagged +lollygagging +lollygags +lollypop +lollypops +lone +lonelier +loneliest +loneliness +lonely +loner +loners +lonesome +lonesomely +lonesomeness +long +longboat +longboats +longbow +longbows +longed +longer +longest +longevity +longhair +longhairs +longhand +longhorn +longhorns +longing +longingly +longings +longish +longitude +longitudes +longitudinal +longitudinally +longs +longshoreman +longshoremen +longsighted +longstanding +longtime +longueur +longueurs +longways +loofah +loofahs +look +lookalike +lookalikes +looked +looker +lookers +looking +lookout +lookouts +looks +loom +loomed +looming +looms +loon +looney +looneys +loonier +loonies +looniest +loons +loony +loop +looped +loophole +loopholes +loopier +loopiest +looping +loops +loopy +loose +loosed +loosely +loosen +loosened +looseness +loosening +loosens +looser +looses +loosest +loosing +loot +looted +looter +looters +looting +loots +lope +loped +lopes +loping +lopped +lopping +lops +lopsided +lopsidedly +lopsidedness +loquacious +loquaciousness +loquacity +lord +lorded +lording +lordlier +lordliest +lordliness +lordly +lords +lordship +lordships +lore +lorgnette +lorgnettes +loris +lorises +lorn +lorries +lorry +lose +loser +losers +loses +losing +losings +loss +losses +lost +loth +lotion +lotions +lots +lotteries +lottery +lotto +lotus +lotuses +loud +louder +loudest +loudhailer +loudhailers +loudly +loudmouth +loudmouthed +loudmouths +loudness +loudspeaker +loudspeakers +lounge +lounged +lounger +loungers +lounges +lounging +lour +loured +louring +lours +louse +louses +lousier +lousiest +lousily +lousiness +lousy +lout +loutish +loutishly +louts +louver +louvered +louvers +louvre +louvred +louvres +lovable +lovableness +lovably +love +loveable +lovebird +lovebirds +lovechild +lovechildren +loved +loveless +lovelier +lovelies +loveliest +loveliness +lovelorn +lovely +lovemaking +lover +lovers +loves +loveseat +loveseats +lovesick +loving +lovingly +lowborn +lowboy +lowboys +lowbrow +lowbrows +lowdown +lowed +lower +lowercase +lowered +lowering +lowermost +lowers +lowest +lowing +lowland +lowlander +lowlanders +lowlands +lowlier +lowliest +lowlife +lowlifes +lowliness +lowlives +lowly +lowness +lows +loyal +loyaler +loyalest +loyalism +loyalist +loyalists +loyaller +loyallest +loyally +loyalties +loyalty +lozenge +lozenges +luau +luaus +lubber +lubberly +lubbers +lube +lubed +lubes +lubing +lubricant +lubricants +lubricate +lubricated +lubricates +lubricating +lubrication +lubricator +lubricators +lubricious +lubricity +lucid +lucider +lucidest +lucidity +lucidly +lucidness +luck +lucked +luckier +luckiest +luckily +luckiness +lucking +luckless +lucks +lucky +lucrative +lucratively +lucrativeness +lucre +lucubrate +lucubrated +lucubrates +lucubrating +lucubration +ludicrous +ludicrously +ludicrousness +luff +luffed +luffing +luffs +luggage +lugged +lugger +luggers +lugging +lugs +lugsail +lugsails +lugubrious +lugubriously +lugubriousness +lukewarm +lukewarmly +lukewarmness +lull +lullabies +lullaby +lulled +lulling +lulls +lumbago +lumbar +lumber +lumbered +lumberer +lumberers +lumbering +lumberjack +lumberjacks +lumberman +lumbermen +lumbers +lumberyard +lumberyards +luminaries +luminary +luminescence +luminescent +luminosity +luminous +luminously +lummox +lummoxes +lump +lumped +lumpier +lumpiest +lumpiness +lumping +lumpish +lumps +lumpy +lunacies +lunacy +lunar +lunatic +lunatics +lunch +lunched +luncheon +luncheonette +luncheonettes +luncheons +lunches +lunching +lunchroom +lunchrooms +lunchtime +lunchtimes +lung +lunge +lunged +lunges +lungfish +lungfishes +lunging +lungs +lunkhead +lunkheads +lupin +lupine +lupines +lupins +lupus +lurch +lurched +lurches +lurching +lure +lured +lures +lurid +luridly +luridness +luring +lurk +lurked +lurking +lurks +luscious +lusciously +lusciousness +lush +lusher +lushes +lushest +lushly +lushness +lust +lusted +luster +lusterless +lustful +lustfully +lustier +lustiest +lustily +lustiness +lusting +lustre +lustrous +lustrously +lusts +lusty +lutanist +lutanists +lute +lutenist +lutenists +lutes +lutetium +luxuriance +luxuriant +luxuriantly +luxuriate +luxuriated +luxuriates +luxuriating +luxuriation +luxuries +luxurious +luxuriously +luxuriousness +luxury +lyceum +lyceums +lychee +lychees +lying +lymph +lymphatic +lymphatics +lymphocyte +lymphocytes +lymphoid +lymphoma +lymphomas +lymphomata +lynch +lynched +lyncher +lynchers +lynches +lynching +lynchings +lynchpin +lynchpins +lynx +lynxes +lyre +lyrebird +lyrebirds +lyres +lyric +lyrical +lyrically +lyricism +lyricist +lyricists +lyrics +macabre +macadam +macadamia +macadamias +macadamize +macadamized +macadamizes +macadamizing +macaque +macaques +macaroni +macaronies +macaronis +macaroon +macaroons +macaw +macaws +mace +maced +macerate +macerated +macerates +macerating +maceration +maces +mach +machete +machetes +machinate +machinated +machinates +machinating +machination +machinations +machine +machined +machinery +machines +machining +machinist +machinists +machismo +macho +macing +macintosh +macintoshes +mackerel +mackerels +mackinaw +mackinaws +mackintosh +mackintoshes +macrame +macro +macrobiotic +macrobiotics +macrocosm +macrocosms +macroeconomics +macron +macrons +macros +macroscopic +macs +madam +madame +madams +madcap +madcaps +madden +maddened +maddening +maddeningly +maddens +madder +madders +maddest +madding +made +mademoiselle +mademoiselles +madhouse +madhouses +madly +madman +madmen +madness +madras +madrases +madrigal +madrigals +mads +madwoman +madwomen +maelstrom +maelstroms +maestri +maestro +maestros +mafia +mafias +mafiosi +mafioso +mafiosos +magazine +magazines +magenta +maggot +maggots +maggoty +magi +magic +magical +magically +magician +magicians +magisterial +magisterially +magistracy +magistrate +magistrates +magma +magnanimity +magnanimous +magnanimously +magnate +magnates +magnesia +magnesium +magnet +magnetic +magnetically +magnetise +magnetised +magnetises +magnetising +magnetism +magnetite +magnetizable +magnetization +magnetize +magnetized +magnetizes +magnetizing +magneto +magnetometer +magnetometers +magnetos +magnets +magnification +magnifications +magnificence +magnificent +magnificently +magnified +magnifier +magnifiers +magnifies +magnify +magnifying +magniloquence +magniloquent +magnitude +magnitudes +magnolia +magnolias +magnum +magnums +magpie +magpies +mags +magus +maharaja +maharajah +maharajahs +maharajas +maharanee +maharanees +maharani +maharanis +maharishi +maharishis +mahatma +mahatmas +mahjong +mahoganies +mahogany +mahout +mahouts +maid +maiden +maidenhair +maidenhead +maidenheads +maidenhood +maidenly +maidens +maids +maidservant +maidservants +mail +mailbag +mailbags +mailbox +mailboxes +mailed +mailer +mailers +mailing +mailings +maillot +maillots +mailman +mailmen +mails +maim +maimed +maiming +maims +main +mainframe +mainframes +mainland +mainlands +mainline +mainlined +mainlines +mainlining +mainly +mainmast +mainmasts +mains +mainsail +mainsails +mainspring +mainsprings +mainstay +mainstays +mainstream +mainstreamed +mainstreaming +mainstreams +maintain +maintainable +maintained +maintaining +maintains +maintenance +maintop +maintops +maiolica +maisonette +maisonettes +maize +majestic +majestically +majesties +majesty +majolica +major +majordomo +majordomos +majored +majorette +majorettes +majoring +majorities +majority +majors +make +makeover +makeovers +maker +makers +makes +makeshift +makeshifts +makeup +makeups +making +makings +malachite +maladies +maladjusted +maladjustment +maladroit +maladroitly +maladroitness +malady +malaise +malamute +malamutes +malapropism +malapropisms +malaria +malarial +malarkey +malathion +malcontent +malcontents +male +malediction +maledictions +malefaction +malefactor +malefactors +malefic +maleficence +maleficent +maleness +males +malevolence +malevolent +malevolently +malfeasance +malformation +malformations +malformed +malfunction +malfunctioned +malfunctioning +malfunctions +malice +malicious +maliciously +maliciousness +malign +malignancies +malignancy +malignant +malignantly +maligned +maligning +malignity +maligns +malinger +malingered +malingerer +malingerers +malingering +malingers +mall +mallard +mallards +malleability +malleable +mallet +mallets +mallow +mallows +malls +malnourished +malnutrition +malocclusion +malodorous +malpractice +malpractices +malt +malted +malteds +maltier +maltiest +malting +maltose +maltreat +maltreated +maltreating +maltreatment +maltreats +malts +malty +mama +mamas +mamba +mambas +mambo +mamboed +mamboing +mambos +mamma +mammal +mammalian +mammalians +mammals +mammary +mammas +mammies +mammogram +mammograms +mammography +mammon +mammoth +mammoths +mammy +manacle +manacled +manacles +manacling +manage +manageability +manageable +managed +management +manager +managerial +managers +manages +managing +manana +mananas +manatee +manatees +mandala +mandalas +mandamus +mandamuses +mandarin +mandarins +mandate +mandated +mandates +mandating +mandatory +mandible +mandibles +mandibular +mandolin +mandolins +mandrake +mandrakes +mandrel +mandrels +mandril +mandrill +mandrills +mandrils +mane +maned +manege +manes +maneuver +maneuverability +maneuverable +maneuvered +maneuvering +maneuvers +manful +manfully +manganese +mange +manger +mangers +mangier +mangiest +manginess +mangle +mangled +mangles +mangling +mango +mangoes +mangos +mangrove +mangroves +mangy +manhandle +manhandled +manhandles +manhandling +manhole +manholes +manhood +manhunt +manhunts +mania +maniac +maniacal +maniacally +maniacs +manias +manic +manically +manics +manicure +manicured +manicures +manicuring +manicurist +manicurists +manifest +manifestation +manifestations +manifested +manifesting +manifestly +manifesto +manifestoes +manifestos +manifests +manifold +manifolded +manifolding +manifolds +manikin +manikins +manila +manilla +manioc +maniocs +manipulable +manipulate +manipulated +manipulates +manipulating +manipulation +manipulations +manipulative +manipulatively +manipulator +manipulators +mankind +manlier +manliest +manlike +manliness +manly +manna +manned +mannequin +mannequins +manner +mannered +mannerism +mannerisms +mannerly +manners +mannikin +mannikins +manning +mannish +mannishly +mannishness +manoeuvre +manoeuvred +manoeuvres +manoeuvring +manometer +manometers +manor +manorial +manors +manpower +manque +mans +mansard +mansards +manse +manservant +manses +mansion +mansions +manslaughter +manta +mantas +mantel +mantelpiece +mantelpieces +mantels +mantes +mantilla +mantillas +mantis +mantises +mantissa +mantissas +mantle +mantled +mantles +mantling +mantra +mantras +manual +manually +manuals +manufacture +manufactured +manufacturer +manufacturers +manufactures +manufacturing +manumission +manumissions +manumit +manumits +manumitted +manumitting +manure +manured +manures +manuring +manuscript +manuscripts +many +maple +maples +mapmaker +mapmakers +mapped +mapper +mappers +mapping +maps +marabou +marabous +marabout +marabouts +maraca +maracas +maraschino +maraschinos +marathon +marathoner +marathoners +marathons +maraud +marauded +marauder +marauders +marauding +marauds +marble +marbled +marbleize +marbleized +marbleizes +marbleizing +marbles +marbling +march +marched +marcher +marchers +marches +marching +marchioness +marchionesses +mare +mares +margarine +margarita +margaritas +margin +marginal +marginalia +marginalization +marginalize +marginalized +marginalizes +marginalizing +marginally +margins +maria +mariachi +mariachis +marigold +marigolds +marihuana +marijuana +marimba +marimbas +marina +marinade +marinaded +marinades +marinading +marinara +marinas +marinate +marinated +marinates +marinating +marination +marine +mariner +mariners +marines +marionette +marionettes +marital +maritally +maritime +marjoram +mark +markdown +markdowns +marked +markedly +marker +markers +market +marketability +marketable +marketed +marketeer +marketeers +marketer +marketers +marketing +marketplace +marketplaces +markets +marking +markings +markka +markkaa +markkas +marks +marksman +marksmanship +marksmen +markup +markups +marl +marlin +marlinespike +marlinespikes +marlins +marlinspike +marlinspikes +marmalade +marmoreal +marmoset +marmosets +marmot +marmots +maroon +marooned +marooning +maroons +marque +marquee +marquees +marques +marquess +marquesses +marquetry +marquis +marquise +marquises +marquisette +marred +marriage +marriageability +marriageable +marriages +married +marrieds +marries +marring +marrow +marrows +marry +marrying +mars +marsh +marshal +marshaled +marshaling +marshalled +marshalling +marshals +marshes +marshier +marshiest +marshland +marshmallow +marshmallows +marshy +marsupial +marsupials +mart +marten +martens +martial +martially +martin +martinet +martinets +martingale +martingales +martini +martinis +martins +marts +martyr +martyrdom +martyred +martyring +martyrs +marvel +marveled +marveling +marvelled +marvelling +marvellous +marvellously +marvelous +marvelously +marvels +marzipan +mascara +mascaraed +mascaraing +mascaras +mascot +mascots +masculine +masculines +masculinity +maser +masers +mash +mashed +masher +mashers +mashes +mashing +mask +masked +masker +maskers +masking +masks +masochism +masochist +masochistic +masochistically +masochists +mason +masonry +masons +masque +masquerade +masqueraded +masquerader +masqueraders +masquerades +masquerading +masques +mass +massacre +massacred +massacres +massacring +massage +massaged +massages +massaging +massed +masses +masseur +masseurs +masseuse +masseuses +massif +massifs +massing +massive +massively +massiveness +mast +mastectomies +mastectomy +masted +master +mastered +masterful +masterfully +mastering +masterly +mastermind +masterminded +masterminding +masterminds +masterpiece +masterpieces +masters +masterstroke +masterstrokes +masterwork +masterworks +mastery +masthead +mastheads +mastic +masticate +masticated +masticates +masticating +mastication +mastiff +mastiffs +mastodon +mastodons +mastoid +mastoids +masts +masturbate +masturbated +masturbates +masturbating +masturbation +masturbatory +matador +matadors +match +matchbook +matchbooks +matchbox +matchboxes +matched +matches +matching +matchless +matchlock +matchlocks +matchmaker +matchmakers +matchmaking +matchstick +matchsticks +matchwood +mate +mated +material +materialise +materialised +materialises +materialising +materialism +materialist +materialistic +materialistically +materialists +materialization +materialize +materialized +materializes +materializing +materially +materials +materiel +maternal +maternally +maternity +mates +math +mathematical +mathematically +mathematician +mathematicians +mathematics +matinee +matinees +mating +matins +matriarch +matriarchal +matriarchies +matriarchs +matriarchy +matrices +matricidal +matricide +matricides +matriculate +matriculated +matriculates +matriculating +matriculation +matrimonial +matrimony +matrix +matrixes +matron +matronly +matrons +mats +matt +matte +matted +matter +mattered +mattering +matters +mattes +matting +mattins +mattock +mattocks +mattress +mattresses +matts +maturate +maturated +maturates +maturating +maturation +mature +matured +maturely +maturer +matures +maturest +maturing +maturities +maturity +matzo +matzoh +matzohs +matzos +matzot +matzoth +maudlin +maul +mauled +mauler +maulers +mauling +mauls +maunder +maundered +maundering +maunders +mausolea +mausoleum +mausoleums +mauve +mauver +mauvest +maven +mavens +maverick +mavericks +mavin +mavins +mawkish +mawkishly +mawkishness +maws +maxed +maxes +maxi +maxilla +maxillae +maxillary +maxillas +maxim +maxima +maximal +maximally +maximization +maximize +maximized +maximizes +maximizing +maxims +maximum +maximums +maxing +maxis +maybe +maybes +mayday +maydays +mayflies +mayflower +mayflowers +mayfly +mayhem +mayo +mayonnaise +mayor +mayoral +mayoralty +mayoress +mayoresses +mayors +maypole +maypoles +mayst +maze +mazes +mazourka +mazourkas +mazurka +mazurkas +mead +meadow +meadowlark +meadowlarks +meadows +meager +meagerer +meagerest +meagerly +meagerness +meagre +meagrer +meagrest +meal +mealier +mealiest +mealiness +meals +mealtime +mealtimes +mealy +mealybug +mealybugs +mealymouthed +mean +meander +meandered +meandering +meanderings +meanders +meaner +meanest +meanie +meanies +meaning +meaningful +meaningfully +meaningfulness +meaningless +meaninglessly +meaninglessness +meanings +meanly +meanness +means +meant +meantime +meanwhile +meany +measles +measlier +measliest +measly +measurable +measurably +measure +measured +measureless +measurement +measurements +measures +measuring +meat +meatball +meatballs +meatier +meatiest +meatiness +meatless +meatloaf +meatloaves +meatpacking +meats +meaty +mecca +meccas +mechanic +mechanical +mechanically +mechanics +mechanism +mechanisms +mechanistic +mechanistically +mechanization +mechanize +mechanized +mechanizes +mechanizing +medal +medalist +medalists +medallion +medallions +medallist +medallists +medals +meddle +meddled +meddler +meddlers +meddles +meddlesome +meddling +media +mediaeval +medial +medially +median +medians +medias +mediate +mediated +mediates +mediating +mediation +mediator +mediators +medic +medicaid +medical +medically +medicals +medicament +medicare +medicate +medicated +medicates +medicating +medication +medications +medicinal +medicinally +medicine +medicines +medico +medicos +medics +medieval +medievalist +medievalists +mediocre +mediocrities +mediocrity +meditate +meditated +meditates +meditating +meditation +meditations +meditative +meditatively +medium +mediums +medley +medleys +meds +medulla +medullae +medullas +meed +meek +meeker +meekest +meekly +meekness +meerschaum +meerschaums +meet +meeting +meetinghouse +meetinghouses +meetings +meets +mega +megabit +megabits +megabucks +megabyte +megabytes +megacycle +megacycles +megadeath +megadeaths +megahertz +megahertzes +megalith +megalithic +megaliths +megalomania +megalomaniac +megalomaniacs +megalopolis +megalopolises +megaphone +megaphoned +megaphones +megaphoning +megaton +megatons +megawatt +megawatts +meiosis +meiotic +melamine +melancholia +melancholic +melancholy +melange +melanges +melanin +melanoma +melanomas +melanomata +meld +melded +melding +melds +melee +melees +meliorate +meliorated +meliorates +meliorating +melioration +meliorative +mellifluous +mellifluously +mellifluousness +mellow +mellowed +mellower +mellowest +mellowing +mellowly +mellowness +mellows +melodic +melodically +melodies +melodious +melodiously +melodiousness +melodrama +melodramas +melodramatic +melodramatically +melodramatics +melody +melon +melons +melt +meltdown +meltdowns +melted +melting +melts +member +members +membership +memberships +membrane +membranes +membranous +memento +mementoes +mementos +memo +memoir +memoirs +memorabilia +memorability +memorable +memorably +memoranda +memorandum +memorandums +memorial +memorialize +memorialized +memorializes +memorializing +memorials +memories +memorization +memorize +memorized +memorizes +memorizing +memory +memos +menace +menaced +menaces +menacing +menacingly +menage +menagerie +menageries +menages +mend +mendacious +mendaciously +mendacity +mended +mendelevium +mender +menders +mendicancy +mendicant +mendicants +mending +mends +menfolk +menfolks +menhaden +menhadens +menial +menially +menials +meningeal +meninges +meningitis +meninx +menisci +meniscus +meniscuses +menopausal +menopause +menorah +menorahs +mensch +mensches +menservants +menses +menstrual +menstruate +menstruated +menstruates +menstruating +menstruation +mensurable +mensuration +menswear +mental +mentalist +mentalists +mentalities +mentality +mentally +menthol +mentholated +mention +mentioned +mentioning +mentions +mentor +mentored +mentoring +mentors +menu +menus +meow +meowed +meowing +meows +mercantile +mercantilism +mercenaries +mercenary +mercer +mercerize +mercerized +mercerizes +mercerizing +mercers +merchandise +merchandised +merchandiser +merchandisers +merchandises +merchandising +merchandize +merchandized +merchandizes +merchandizing +merchant +merchantable +merchantman +merchantmen +merchants +mercies +merciful +mercifully +merciless +mercilessly +mercilessness +mercurial +mercurially +mercuric +mercury +mercy +mere +merely +meres +merest +meretricious +meretriciously +meretriciousness +merganser +mergansers +merge +merged +merger +mergers +merges +merging +meridian +meridians +meringue +meringues +merino +merinos +merit +merited +meriting +meritocracies +meritocracy +meritorious +meritoriously +meritoriousness +merits +mermaid +mermaids +merman +mermen +merrier +merriest +merrily +merriment +merriness +merry +merrymaker +merrymakers +merrymaking +mesa +mesas +mescal +mescaline +mescals +mesdames +mesdemoiselles +mesh +meshed +meshes +meshing +mesmerism +mesmerize +mesmerized +mesmerizer +mesmerizers +mesmerizes +mesmerizing +mesomorph +mesomorphs +meson +mesons +mesosphere +mesospheres +mesquit +mesquite +mesquites +mesquits +mess +message +messaged +messages +messaging +messed +messeigneurs +messenger +messengers +messes +messiah +messiahs +messianic +messier +messiest +messieurs +messily +messiness +messing +messmate +messmates +messy +mestizo +mestizoes +mestizos +metabolic +metabolically +metabolism +metabolisms +metabolite +metabolites +metabolize +metabolized +metabolizes +metabolizing +metacarpal +metacarpals +metacarpi +metacarpus +metal +metalanguage +metalanguages +metallic +metallurgic +metallurgical +metallurgist +metallurgists +metallurgy +metals +metalwork +metalworker +metalworkers +metalworking +metamorphic +metamorphism +metamorphose +metamorphosed +metamorphoses +metamorphosing +metamorphosis +metaphor +metaphoric +metaphorical +metaphorically +metaphors +metaphysical +metaphysically +metaphysics +metastases +metastasis +metastasize +metastasized +metastasizes +metastasizing +metastatic +metatarsal +metatarsals +metatarsi +metatarsus +metatheses +metathesis +mete +meted +metempsychosis +meteor +meteoric +meteorically +meteorite +meteorites +meteoroid +meteoroids +meteorologic +meteorological +meteorologist +meteorologists +meteorology +meteors +meter +metered +metering +meters +metes +methadon +methadone +methamphetamine +methane +methanol +methinks +method +methodical +methodically +methodicalness +methodological +methodologically +methodologies +methodology +methods +methought +methyl +meticulous +meticulously +meticulousness +metier +metiers +meting +metre +metres +metric +metrical +metrically +metricate +metricated +metricates +metricating +metrication +metricize +metricized +metricizes +metricizing +metro +metronome +metronomes +metropolis +metropolises +metropolitan +metros +mettle +mettlesome +mewed +mewing +mewl +mewled +mewling +mewls +mews +mezzanine +mezzanines +mezzo +mezzos +miasma +miasmas +miasmata +mica +mice +mickey +mickeys +micra +micro +microbe +microbes +microbial +microbiological +microbiologist +microbiologists +microbiology +microbreweries +microbrewery +microchip +microchips +microcircuit +microcircuits +microcomputer +microcomputers +microcosm +microcosmic +microcosms +microdot +microdots +microeconomics +microelectronic +microelectronics +microfiber +microfibers +microfiche +microfiches +microfilm +microfilmed +microfilming +microfilms +microgroove +microgrooves +microlight +microlights +micromanage +micromanaged +micromanagement +micromanages +micromanaging +micrometeorite +micrometeorites +micrometer +micrometers +micron +microns +microorganism +microorganisms +microphone +microphones +microprocessor +microprocessors +micros +microscope +microscopes +microscopic +microscopical +microscopically +microscopy +microsecond +microseconds +microsurgery +microwavable +microwave +microwaveable +microwaved +microwaves +microwaving +midair +midday +midden +middens +middies +middle +middlebrow +middlebrows +middleman +middlemen +middlemost +middles +middleweight +middleweights +middling +middy +midge +midges +midget +midgets +midi +midis +midland +midlands +midlife +midmost +midnight +midpoint +midpoints +midrib +midribs +midriff +midriffs +midsection +midsections +midshipman +midshipmen +midships +midsize +midst +midstream +midsummer +midterm +midterms +midtown +midway +midways +midweek +midweeks +midwife +midwifed +midwiferies +midwifery +midwifes +midwifing +midwinter +midwived +midwives +midwiving +midyear +midyears +mien +miens +miff +miffed +miffing +miffs +might +mightier +mightiest +mightily +mightiness +mighty +mignonette +mignonettes +migraine +migraines +migrant +migrants +migrate +migrated +migrates +migrating +migration +migrations +migratory +mikado +mikados +mike +miked +mikes +miking +miladies +milady +milch +mild +milder +mildest +mildew +mildewed +mildewing +mildews +mildly +mildness +mile +mileage +mileages +milepost +mileposts +miler +milers +miles +milestone +milestones +milieu +milieus +milieux +militancy +militant +militantly +militants +militaries +militarily +militarism +militarist +militaristic +militarists +militarization +militarize +militarized +militarizes +militarizing +military +militate +militated +militates +militating +militia +militiaman +militiamen +militias +milk +milked +milker +milkers +milkier +milkiest +milkiness +milking +milkmaid +milkmaids +milkman +milkmen +milks +milkshake +milkshakes +milksop +milksops +milkweed +milkweeds +milky +mill +millage +milled +millennia +millennial +millennium +millenniums +millepede +millepedes +miller +millers +millet +milliard +milliards +millibar +millibars +milligram +milligrams +milliliter +milliliters +millilitre +millilitres +millimeter +millimeters +millimetre +millimetres +milliner +milliners +millinery +milling +millings +million +millionaire +millionaires +millionnaire +millionnaires +millions +millionth +millionths +millipede +millipedes +millisecond +milliseconds +millpond +millponds +millrace +millraces +mills +millstone +millstones +millstream +millstreams +millwright +millwrights +milquetoast +milquetoasts +mils +milt +milted +milting +milts +mime +mimed +mimeograph +mimeographed +mimeographing +mimeographs +mimes +mimetic +mimic +mimicked +mimicker +mimickers +mimicking +mimicries +mimicry +mimics +miming +mimosa +mimosas +minaret +minarets +minatory +mince +minced +mincemeat +mincer +mincers +minces +mincing +mind +minded +mindful +mindfully +mindfulness +minding +mindless +mindlessly +mindlessness +minds +mindset +mindsets +mine +mined +minefield +minefields +miner +mineral +mineralogical +mineralogist +mineralogists +mineralogy +minerals +miners +mines +minestrone +minesweeper +minesweepers +mingle +mingled +mingles +mingling +mini +miniature +miniatures +miniaturist +miniaturists +miniaturization +miniaturize +miniaturized +miniaturizes +miniaturizing +minibike +minibikes +minibus +minibuses +minibusses +minicam +minicams +minicomputer +minicomputers +minim +minima +minimal +minimalism +minimalist +minimalists +minimally +minimization +minimize +minimized +minimizes +minimizing +minims +minimum +minimums +mining +minion +minions +minis +miniscule +miniscules +miniseries +miniskirt +miniskirts +minister +ministered +ministerial +ministering +ministers +ministrant +ministrants +ministration +ministrations +ministries +ministry +minivan +minivans +mink +minks +minnesinger +minnesingers +minnow +minnows +minor +minored +minoring +minorities +minority +minors +minoxidil +minster +minsters +minstrel +minstrels +minstrelsy +mint +mintage +minted +minter +minters +mintier +mintiest +minting +mints +minty +minuend +minuends +minuet +minuets +minus +minuscule +minuscules +minuses +minute +minuted +minutely +minuteman +minutemen +minuteness +minuter +minutes +minutest +minutia +minutiae +minuting +minx +minxes +miracle +miracles +miraculous +miraculously +mirage +mirages +mire +mired +mires +mirier +miriest +miring +mirror +mirrored +mirroring +mirrors +mirth +mirthful +mirthfully +mirthfulness +mirthless +mirthlessly +miry +misaddress +misaddressed +misaddresses +misaddressing +misadventure +misadventures +misaligned +misalignment +misalliance +misalliances +misanthrope +misanthropes +misanthropic +misanthropically +misanthropist +misanthropists +misanthropy +misapplication +misapplied +misapplies +misapply +misapplying +misapprehend +misapprehended +misapprehending +misapprehends +misapprehension +misapprehensions +misappropriate +misappropriated +misappropriates +misappropriating +misappropriation +misappropriations +misbegotten +misbehave +misbehaved +misbehaves +misbehaving +misbehavior +miscalculate +miscalculated +miscalculates +miscalculating +miscalculation +miscalculations +miscall +miscalled +miscalling +miscalls +miscarriage +miscarriages +miscarried +miscarries +miscarry +miscarrying +miscast +miscasting +miscasts +miscegenation +miscellaneous +miscellaneously +miscellanies +miscellany +mischance +mischances +mischief +mischievous +mischievously +mischievousness +miscibility +miscible +misconceive +misconceived +misconceives +misconceiving +misconception +misconceptions +misconduct +misconducted +misconducting +misconducts +misconstruction +misconstructions +misconstrue +misconstrued +misconstrues +misconstruing +miscount +miscounted +miscounting +miscounts +miscreant +miscreants +miscue +miscued +miscues +miscuing +misdeal +misdealing +misdeals +misdealt +misdeed +misdeeds +misdemeanor +misdemeanors +misdemeanour +misdemeanours +misdiagnose +misdiagnosed +misdiagnoses +misdiagnosing +misdiagnosis +misdid +misdirect +misdirected +misdirecting +misdirection +misdirects +misdo +misdoes +misdoing +misdoings +misdone +miser +miserable +miserableness +miserably +miseries +miserliness +miserly +misers +misery +misfeasance +misfile +misfiled +misfiles +misfiling +misfire +misfired +misfires +misfiring +misfit +misfits +misfitted +misfitting +misfortune +misfortunes +misgiving +misgivings +misgovern +misgoverned +misgoverning +misgovernment +misgoverns +misguidance +misguide +misguided +misguidedly +misguides +misguiding +mishandle +mishandled +mishandles +mishandling +mishap +mishaps +mishear +misheard +mishearing +mishears +mishmash +mishmashes +misidentified +misidentifies +misidentify +misidentifying +misinform +misinformation +misinformed +misinforming +misinforms +misinterpret +misinterpretation +misinterpretations +misinterpreted +misinterpreting +misinterprets +misjudge +misjudged +misjudges +misjudging +misjudgment +misjudgments +mislabel +mislabeled +mislabeling +mislabelled +mislabelling +mislabels +mislaid +mislay +mislaying +mislays +mislead +misleading +misleadingly +misleads +misled +mismanage +mismanaged +mismanagement +mismanages +mismanaging +mismatch +mismatched +mismatches +mismatching +misname +misnamed +misnames +misnaming +misnomer +misnomers +misogamist +misogamists +misogamy +misogynist +misogynistic +misogynists +misogynous +misogyny +misplace +misplaced +misplacement +misplaces +misplacing +misplay +misplayed +misplaying +misplays +misprint +misprinted +misprinting +misprints +misprision +mispronounce +mispronounced +mispronounces +mispronouncing +mispronunciation +mispronunciations +misquotation +misquotations +misquote +misquoted +misquotes +misquoting +misread +misreading +misreadings +misreads +misreport +misreported +misreporting +misreports +misrepresent +misrepresentation +misrepresentations +misrepresented +misrepresenting +misrepresents +misrule +misruled +misrules +misruling +miss +missal +missals +missed +misses +misshape +misshaped +misshapen +misshapes +misshaping +missile +missilery +missiles +missilry +missing +mission +missionaries +missionary +missioner +missioners +missions +missis +missises +missive +missives +misspeak +misspeaking +misspeaks +misspell +misspelled +misspelling +misspellings +misspells +misspelt +misspend +misspending +misspends +misspent +misspoke +misspoken +misstate +misstated +misstatement +misstatements +misstates +misstating +misstep +missteps +missus +missuses +mist +mistakable +mistake +mistaken +mistakenly +mistakes +mistaking +misted +mister +misters +mistier +mistiest +mistily +mistime +mistimed +mistimes +mistiming +mistiness +misting +mistletoe +mistook +mistral +mistrals +mistreat +mistreated +mistreating +mistreatment +mistreats +mistress +mistresses +mistrial +mistrials +mistrust +mistrusted +mistrustful +mistrustfully +mistrusting +mistrusts +mists +misty +misunderstand +misunderstanding +misunderstandings +misunderstands +misunderstood +misuse +misused +misuses +misusing +mite +miter +mitered +mitering +miters +mites +mitigate +mitigated +mitigates +mitigating +mitigation +mitosis +mitotic +mitre +mitred +mitres +mitring +mitt +mitten +mittens +mitts +mixable +mixed +mixer +mixers +mixes +mixing +mixt +mixture +mixtures +mizzen +mizzenmast +mizzenmasts +mizzens +mnemonic +mnemonically +mnemonics +moan +moaned +moaner +moaners +moaning +moans +moat +moats +mobbed +mobbing +mobile +mobiles +mobility +mobilization +mobilizations +mobilize +mobilized +mobilizer +mobilizers +mobilizes +mobilizing +mobs +mobster +mobsters +moccasin +moccasins +mocha +mochas +mock +mocked +mocker +mockeries +mockers +mockery +mocking +mockingbird +mockingbirds +mockingly +mocks +mockup +mockups +modal +modals +mode +model +modeled +modeler +modelers +modeling +modelled +modelling +models +modem +modems +moderate +moderated +moderately +moderateness +moderates +moderating +moderation +moderator +moderators +modern +modernism +modernist +modernistic +modernists +modernity +modernization +modernize +modernized +modernizer +modernizers +modernizes +modernizing +modernly +modernness +moderns +modes +modest +modestly +modesty +modicum +modicums +modification +modifications +modified +modifier +modifiers +modifies +modify +modifying +modish +modishly +modishness +mods +modular +modulate +modulated +modulates +modulating +modulation +modulations +modulator +modulators +module +modules +mogul +moguls +mohair +moieties +moiety +moil +moiled +moiling +moils +moire +moires +moist +moisten +moistened +moistener +moisteners +moistening +moistens +moister +moistest +moistly +moistness +moisture +moisturize +moisturized +moisturizer +moisturizers +moisturizes +moisturizing +molar +molars +molasses +mold +moldboard +moldboards +molded +molder +moldered +moldering +molders +moldier +moldiest +moldiness +molding +moldings +molds +moldy +mole +molecular +molecularity +molecule +molecules +molehill +molehills +moles +moleskin +molest +molestation +molested +molester +molesters +molesting +molests +moll +mollies +mollification +mollified +mollifies +mollify +mollifying +molls +mollusc +molluscan +molluscans +molluscs +mollusk +molluskan +molluskans +mollusks +molly +mollycoddle +mollycoddled +mollycoddles +mollycoddling +molt +molted +molten +molter +molters +molting +molts +molybdenum +moment +momentarily +momentariness +momentary +momentous +momentously +momentousness +moments +momentum +momma +mommas +mommie +mommies +mommy +moms +monarch +monarchic +monarchical +monarchies +monarchism +monarchist +monarchistic +monarchists +monarchs +monarchy +monasteries +monastery +monastic +monastical +monastically +monasticism +monastics +monaural +monetarily +monetarism +monetarist +monetarists +monetary +monetize +monetized +monetizes +monetizing +money +moneybag +moneybags +moneyed +moneygrubber +moneygrubbers +moneygrubbing +moneylender +moneylenders +moneymaker +moneymakers +moneymaking +mongeese +monger +mongered +mongering +mongers +mongolism +mongoloid +mongoloids +mongoose +mongooses +mongrel +mongrels +monicker +monickers +monied +moniker +monikers +monism +monist +monists +monition +monitions +monitor +monitored +monitoring +monitors +monitory +monk +monkey +monkeyed +monkeying +monkeys +monkeyshine +monkeyshines +monkish +monks +monkshood +monkshoods +mono +monochromatic +monochrome +monochromes +monocle +monocled +monocles +monoclonal +monocotyledon +monocotyledonous +monocotyledons +monocular +monodic +monodies +monodist +monodists +monody +monogamist +monogamists +monogamous +monogamously +monogamy +monogram +monogrammed +monogramming +monograms +monograph +monographs +monolingual +monolinguals +monolith +monolithic +monoliths +monolog +monologist +monologists +monologs +monologue +monologues +monologuist +monologuists +monomania +monomaniac +monomaniacal +monomaniacs +monomer +monomers +mononucleosis +monophonic +monoplane +monoplanes +monopolies +monopolist +monopolistic +monopolists +monopolization +monopolize +monopolized +monopolizer +monopolizers +monopolizes +monopolizing +monopoly +monorail +monorails +monosyllabic +monosyllable +monosyllables +monotheism +monotheist +monotheistic +monotheists +monotone +monotones +monotonous +monotonously +monotonousness +monotony +monounsaturated +monoxide +monoxides +monseigneur +monsieur +monsignor +monsignori +monsignors +monsoon +monsoonal +monsoons +monster +monsters +monstrance +monstrances +monstrosities +monstrosity +monstrous +monstrously +montage +montages +month +monthlies +monthly +months +monument +monumental +monumentally +monuments +mooch +mooched +moocher +moochers +mooches +mooching +mood +moodier +moodiest +moodily +moodiness +moods +moody +mooed +mooing +moon +moonbeam +moonbeams +mooned +mooning +moonless +moonlight +moonlighted +moonlighter +moonlighters +moonlighting +moonlights +moonlit +moons +moonscape +moonscapes +moonshine +moonshiner +moonshiners +moonshot +moonshots +moonstone +moonstones +moonstruck +moonwalk +moonwalks +moor +moored +mooring +moorings +moorland +moors +moos +moose +moot +mooted +mooting +moots +mope +moped +mopeds +moper +mopers +mopes +mopey +mopier +mopiest +moping +mopish +mopped +moppet +moppets +mopping +mops +mopy +moraine +moraines +moral +morale +moralist +moralistic +moralistically +moralists +moralities +morality +moralization +moralize +moralized +moralizer +moralizers +moralizes +moralizing +morally +morals +morass +morasses +moratoria +moratorium +moratoriums +moray +morays +morbid +morbidity +morbidly +morbidness +mordancy +mordant +mordantly +mordants +more +morel +morels +moreover +mores +morgue +morgues +moribund +morn +morning +mornings +morns +morocco +moron +moronic +moronically +morons +morose +morosely +moroseness +morph +morphed +morpheme +morphemes +morphemic +morphia +morphine +morphing +morphological +morphology +morphs +morrow +morrows +morsel +morsels +mortal +mortality +mortally +mortals +mortar +mortarboard +mortarboards +mortared +mortaring +mortars +mortgage +mortgaged +mortgagee +mortgagees +mortgager +mortgagers +mortgages +mortgaging +mortgagor +mortgagors +mortice +morticed +mortices +mortician +morticians +morticing +mortification +mortified +mortifies +mortify +mortifying +mortise +mortised +mortises +mortising +mortuaries +mortuary +mosaic +mosaics +mosey +moseyed +moseying +moseys +mosh +moshed +moshes +moshing +mosque +mosques +mosquito +mosquitoes +mosquitos +moss +mossback +mossbacks +mosses +mossier +mossiest +mossy +most +mostly +mote +motel +motels +motes +motet +motets +moth +mothball +mothballed +mothballing +mothballs +mother +motherboard +motherboards +mothered +motherfucker +motherfuckers +motherfucking +motherhood +mothering +motherland +motherlands +motherless +motherliness +motherly +mothers +moths +motif +motifs +motile +motility +motion +motioned +motioning +motionless +motionlessly +motionlessness +motions +motivate +motivated +motivates +motivating +motivation +motivational +motivations +motivator +motivators +motive +motiveless +motives +motley +motlier +motliest +motocross +motocrosses +motor +motorbike +motorbiked +motorbikes +motorbiking +motorboat +motorboated +motorboating +motorboats +motorcade +motorcades +motorcar +motorcars +motorcycle +motorcycled +motorcycles +motorcycling +motorcyclist +motorcyclists +motored +motoring +motorist +motorists +motorization +motorize +motorized +motorizes +motorizing +motorman +motormen +motormouth +motormouths +motors +mots +mottle +mottled +mottles +mottling +motto +mottoes +mottos +moue +moues +mould +moulded +moulder +mouldered +mouldering +moulders +mouldier +mouldiest +moulding +mouldings +moulds +mouldy +moult +moulted +moulting +moults +mound +mounded +mounding +mounds +mount +mountable +mountain +mountaineer +mountaineered +mountaineering +mountaineers +mountainous +mountains +mountainside +mountainsides +mountaintop +mountaintops +mountebank +mountebanks +mounted +mounter +mounters +mounting +mountings +mounts +mourn +mourned +mourner +mourners +mournful +mournfully +mournfulness +mourning +mourns +mouse +moused +mouser +mousers +mouses +mousetrap +mousetrapped +mousetrapping +mousetraps +mousey +mousier +mousiest +mousiness +mousing +mousse +moussed +mousses +moussing +moustache +moustaches +mousy +mouth +mouthed +mouthful +mouthfuls +mouthier +mouthiest +mouthiness +mouthing +mouthpiece +mouthpieces +mouths +mouthwash +mouthwashes +mouthwatering +mouthy +mouton +movable +movables +move +moveable +moveables +moved +movement +movements +mover +movers +moves +movie +moviegoer +moviegoers +movies +moving +movingly +mowed +mower +mowers +mowing +mown +mows +moxie +mozzarella +much +mucilage +mucilaginous +muck +mucked +muckier +muckiest +mucking +muckrake +muckraked +muckraker +muckrakers +muckrakes +muckraking +mucks +mucky +mucous +mucus +muddied +muddier +muddies +muddiest +muddily +muddiness +muddle +muddled +muddleheaded +muddles +muddling +muddy +muddying +mudflat +mudflats +mudguard +mudguards +mudroom +mudrooms +mudslide +mudslides +mudslinger +mudslingers +mudslinging +muenster +muezzin +muezzins +muff +muffed +muffin +muffing +muffins +muffle +muffled +muffler +mufflers +muffles +muffling +muffs +mufti +muftis +mugful +mugfuls +mugged +mugger +muggers +muggier +muggiest +mugginess +mugging +muggings +muggy +mugs +mugshot +mugshots +mugwump +mugwumps +mujahedin +mukluk +mukluks +mulatto +mulattoes +mulattos +mulberries +mulberry +mulch +mulched +mulches +mulching +mulct +mulcted +mulcting +mulcts +mule +mules +muleskinner +muleskinners +muleteer +muleteers +mulish +mulishly +mulishness +mull +mullah +mullahs +mulled +mullein +mullet +mullets +mulligan +mulligans +mulligatawny +mulling +mullion +mullioned +mullions +mulls +multicolored +multicultural +multiculturalism +multidimensional +multidisciplinary +multifaceted +multifamily +multifarious +multifariously +multifariousness +multiform +multilateral +multilaterally +multilevel +multilingual +multilingualism +multimedia +multimillionaire +multimillionaires +multinational +multinationals +multiple +multiples +multiplex +multiplexed +multiplexer +multiplexers +multiplexes +multiplexing +multiplexor +multiplexors +multiplicand +multiplicands +multiplication +multiplications +multiplicities +multiplicity +multiplied +multiplier +multipliers +multiplies +multiply +multiplying +multiprocessor +multiprocessors +multipurpose +multiracial +multistage +multistory +multitasking +multitude +multitudes +multitudinous +multivitamin +multivitamins +mumble +mumbled +mumbler +mumblers +mumbles +mumbletypeg +mumbling +mummer +mummers +mummery +mummies +mummification +mummified +mummifies +mummify +mummifying +mummy +mumps +mums +munch +munched +munches +munchies +munching +munchkin +munchkins +mundane +mundanely +municipal +municipalities +municipality +municipally +municipals +munificence +munificent +munificently +munition +munitioned +munitioning +munitions +mural +muralist +muralists +murals +murder +murdered +murderer +murderers +murderess +murderesses +murdering +murderous +murderously +murders +murk +murkier +murkiest +murkily +murkiness +murky +murmur +murmured +murmurer +murmurers +murmuring +murmurings +murmurous +murmurs +murrain +muscat +muscatel +muscatels +muscats +muscle +musclebound +muscled +muscles +muscling +muscular +muscularity +muscularly +musculature +muse +mused +muses +musette +musettes +museum +museums +mush +mushed +mushes +mushier +mushiest +mushiness +mushing +mushroom +mushroomed +mushrooming +mushrooms +mushy +music +musical +musicale +musicales +musicality +musically +musicals +musician +musicianly +musicians +musicianship +musicological +musicologist +musicologists +musicology +musing +musingly +musings +musk +muskeg +muskegs +muskellunge +muskellunges +musket +musketeer +musketeers +musketry +muskets +muskie +muskier +muskies +muskiest +muskiness +muskmelon +muskmelons +muskox +muskoxen +muskrat +muskrats +musky +muslin +muss +mussed +mussel +mussels +musses +mussier +mussiest +mussing +mussy +must +mustache +mustached +mustaches +mustachio +mustachios +mustang +mustangs +mustard +muster +mustered +mustering +musters +mustier +mustiest +mustily +mustiness +musts +musty +mutability +mutable +mutably +mutagen +mutagens +mutant +mutants +mutate +mutated +mutates +mutating +mutation +mutational +mutations +mutative +mute +muted +mutely +muteness +muter +mutes +mutest +mutilate +mutilated +mutilates +mutilating +mutilation +mutilations +mutilator +mutilators +mutineer +mutineers +muting +mutinied +mutinies +mutinous +mutinously +mutiny +mutinying +mutt +mutter +muttered +mutterer +mutterers +muttering +mutterings +mutters +mutton +muttonchops +muttony +mutts +mutual +mutuality +mutually +muumuu +muumuus +muzzle +muzzled +muzzles +muzzling +mycologist +mycologists +mycology +myelitis +myna +mynah +mynahs +mynas +myopia +myopic +myopically +myriad +myriads +myrmidon +myrmidons +myrrh +myrtle +myrtles +myself +mysteries +mysterious +mysteriously +mysteriousness +mystery +mystic +mystical +mystically +mysticism +mystics +mystification +mystified +mystifies +mystify +mystifying +mystique +myth +mythic +mythical +mythological +mythologies +mythologist +mythologists +mythologize +mythologized +mythologizes +mythologizing +mythology +myths +nabbed +nabbing +nabob +nabobs +nabs +nacelle +nacelles +nacho +nachos +nacre +nacreous +nadir +nadirs +nagged +nagger +naggers +nagging +nags +naiad +naiades +naiads +naif +naifs +nail +nailbrush +nailbrushes +nailed +nailing +nails +naive +naively +naiver +naivest +naivete +naivety +naked +nakedly +nakedness +name +nameable +named +namedrop +namedropped +namedropping +namedrops +nameless +namelessly +namely +nameplate +nameplates +names +namesake +namesakes +naming +nannies +nanny +nanosecond +nanoseconds +napalm +napalmed +napalming +napalms +nape +napes +naphtha +naphthalene +napkin +napkins +napless +napoleon +napoleons +napped +napper +nappers +nappier +nappies +nappiest +napping +nappy +naps +narc +narcissi +narcissism +narcissist +narcissistic +narcissists +narcissus +narcissuses +narcolepsy +narcosis +narcotic +narcotics +narcotization +narcotize +narcotized +narcotizes +narcotizing +narcs +nark +narks +narrate +narrated +narrates +narrating +narration +narrations +narrative +narratives +narrator +narrators +narrow +narrowed +narrower +narrowest +narrowing +narrowly +narrowness +narrows +narwhal +narwhals +nary +nasal +nasality +nasalization +nasalize +nasalized +nasalizes +nasalizing +nasally +nasals +nascence +nascent +nastier +nastiest +nastily +nastiness +nasturtium +nasturtiums +nasty +natal +natch +nation +national +nationalism +nationalist +nationalistic +nationalistically +nationalists +nationalities +nationality +nationalization +nationalizations +nationalize +nationalized +nationalizes +nationalizing +nationally +nationals +nationhood +nations +nationwide +native +natives +nativities +nativity +natter +nattered +nattering +natters +nattier +nattiest +nattily +nattiness +natty +natural +naturalism +naturalist +naturalistic +naturalists +naturalization +naturalize +naturalized +naturalizes +naturalizing +naturally +naturalness +naturals +nature +natures +naught +naughtier +naughtiest +naughtily +naughtiness +naughts +naughty +nausea +nauseate +nauseated +nauseates +nauseating +nauseatingly +nauseous +nauseously +nauseousness +nautical +nautically +nautili +nautilus +nautiluses +naval +nave +navel +navels +naves +navies +navigability +navigable +navigate +navigated +navigates +navigating +navigation +navigational +navigator +navigators +navy +nays +naysayer +naysayers +neanderthal +neanderthals +neap +neaps +near +nearby +neared +nearer +nearest +nearing +nearly +nearness +nears +nearsighted +nearsightedly +nearsightedness +neat +neaten +neatened +neatening +neatens +neater +neatest +neath +neatly +neatness +nebula +nebulae +nebular +nebulas +nebulous +nebulously +nebulousness +necessaries +necessarily +necessary +necessitate +necessitated +necessitates +necessitating +necessities +necessitous +necessity +neck +necked +neckerchief +neckerchiefs +neckerchieves +necking +necklace +necklaces +neckline +necklines +necks +necktie +neckties +necrology +necromancer +necromancers +necromancy +necropoleis +necropoles +necropoli +necropolis +necropolises +necrosis +necrotic +nectar +nectarine +nectarines +need +needed +needful +needfully +needier +neediest +neediness +needing +needle +needled +needlepoint +needles +needless +needlessly +needlessness +needlewoman +needlewomen +needlework +needling +needs +needy +nefarious +nefariously +nefariousness +negate +negated +negates +negating +negation +negations +negative +negatived +negatively +negativeness +negatives +negativing +negativism +negativity +neglect +neglected +neglectful +neglectfully +neglectfulness +neglecting +neglects +neglige +negligee +negligees +negligence +negligent +negligently +negliges +negligible +negligibly +negotiability +negotiable +negotiate +negotiated +negotiates +negotiating +negotiation +negotiations +negotiator +negotiators +negritude +neigh +neighbor +neighbored +neighborhood +neighborhoods +neighboring +neighborliness +neighborly +neighbors +neighbour +neighboured +neighbouring +neighbours +neighed +neighing +neighs +neither +nelson +nelsons +nematode +nematodes +nemeses +nemesis +neoclassic +neoclassical +neoclassicism +neocolonialism +neocolonialist +neocolonialists +neoconservative +neoconservatives +neodymium +neolithic +neologism +neologisms +neon +neonatal +neonate +neonates +neophyte +neophytes +neoplasm +neoplasms +neoplastic +neoprene +nepenthe +nephew +nephews +nephrite +nephritic +nephritis +nepotism +nepotist +nepotists +neptunium +nerd +nerdier +nerdiest +nerds +nerdy +nerve +nerved +nerveless +nervelessly +nervelessness +nerves +nervier +nerviest +nerviness +nerving +nervous +nervously +nervousness +nervy +nest +nested +nesting +nestle +nestled +nestles +nestling +nestlings +nests +nether +nethermost +netherworld +nets +nett +netted +netting +nettle +nettled +nettles +nettlesome +nettling +netts +network +networked +networking +networks +neural +neuralgia +neuralgic +neurally +neurasthenia +neurasthenic +neurasthenics +neuritic +neuritics +neuritis +neurological +neurologically +neurologist +neurologists +neurology +neuron +neuronal +neurons +neuroses +neurosis +neurosurgeon +neurosurgeons +neurosurgery +neurotic +neurotically +neurotics +neurotransmitter +neurotransmitters +neuter +neutered +neutering +neuters +neutral +neutralism +neutralist +neutralists +neutrality +neutralization +neutralize +neutralized +neutralizer +neutralizers +neutralizes +neutralizing +neutrally +neutrals +neutrino +neutrinos +neutron +neutrons +never +nevermore +nevertheless +nevi +nevus +newbie +newbies +newborn +newborns +newcomer +newcomers +newel +newels +newer +newest +newfangled +newly +newlywed +newlyweds +newness +news +newsboy +newsboys +newscast +newscaster +newscasters +newscasts +newsdealer +newsdealers +newsgirl +newsgirls +newsgroup +newsgroups +newsier +newsiest +newsletter +newsletters +newsman +newsmen +newspaper +newspaperman +newspapermen +newspapers +newspaperwoman +newspaperwomen +newsprint +newsreel +newsreels +newsroom +newsrooms +newsstand +newsstands +newsweeklies +newsweekly +newswoman +newswomen +newsworthiness +newsworthy +newsy +newt +newton +newtons +newts +next +nexus +nexuses +niacin +nibble +nibbled +nibbler +nibblers +nibbles +nibbling +nibs +nice +nicely +niceness +nicer +nicest +niceties +nicety +niche +niches +nick +nicked +nickel +nickelodeon +nickelodeons +nickels +nicker +nickered +nickering +nickers +nicking +nicknack +nicknacks +nickname +nicknamed +nicknames +nicknaming +nicks +nicotine +niece +nieces +niftier +niftiest +nifty +niggard +niggardliness +niggardly +niggards +nigger +niggers +niggle +niggled +niggler +nigglers +niggles +niggling +nigh +nigher +nighest +night +nightcap +nightcaps +nightclothes +nightclub +nightclubbed +nightclubbing +nightclubs +nightdress +nightdresses +nightfall +nightgown +nightgowns +nighthawk +nighthawks +nightie +nighties +nightingale +nightingales +nightlife +nightlong +nightly +nightmare +nightmares +nightmarish +nights +nightshade +nightshades +nightshirt +nightshirts +nightspot +nightspots +nightstand +nightstands +nightstick +nightsticks +nighttime +nightwear +nighty +nihilism +nihilist +nihilistic +nihilists +nimbi +nimble +nimbleness +nimbler +nimblest +nimbly +nimbus +nimbuses +nimrod +nimrods +nincompoop +nincompoops +nine +ninepin +ninepins +nines +nineteen +nineteens +nineteenth +nineteenths +nineties +ninetieth +ninetieths +ninety +ninja +ninjas +ninnies +ninny +ninth +ninths +niobium +nipped +nipper +nippers +nippier +nippiest +nippiness +nipping +nipple +nipples +nippy +nips +nirvana +nisei +niseis +nite +niter +nites +nitpick +nitpicked +nitpicker +nitpickers +nitpicking +nitpicks +nitrate +nitrated +nitrates +nitrating +nitration +nitre +nitrification +nitrite +nitrites +nitrocellulose +nitrogen +nitrogenous +nitroglycerin +nitroglycerine +nits +nitwit +nitwits +nixed +nixes +nixing +nobelium +nobility +noble +nobleman +noblemen +nobleness +nobler +nobles +noblest +noblewoman +noblewomen +nobly +nobodies +nobody +nocturnal +nocturnally +nocturne +nocturnes +nodal +nodded +nodding +noddle +noddles +node +nodes +nods +nodular +nodule +nodules +noel +noels +noes +noggin +noggins +nohow +noise +noised +noiseless +noiselessly +noiselessness +noisemaker +noisemakers +noises +noisier +noisiest +noisily +noisiness +noising +noisome +noisy +nomad +nomadic +nomads +nomenclature +nomenclatures +nominal +nominally +nominate +nominated +nominates +nominating +nomination +nominations +nominative +nominatives +nominator +nominators +nominee +nominees +nonabrasive +nonabsorbent +nonabsorbents +nonacademic +nonacceptance +nonacid +nonactive +nonactives +nonaddictive +nonadhesive +nonadjacent +nonadjustable +nonadministrative +nonage +nonagenarian +nonagenarians +nonages +nonaggression +nonalcoholic +nonaligned +nonalignment +nonallergic +nonappearance +nonappearances +nonassignable +nonathletic +nonattendance +nonautomotive +nonavailability +nonbasic +nonbeliever +nonbelievers +nonbelligerent +nonbelligerents +nonbinding +nonbreakable +nonburnable +noncaloric +noncancerous +nonce +nonchalance +nonchalant +nonchalantly +nonchargeable +nonclerical +nonclericals +nonclinical +noncollectable +noncom +noncombat +noncombatant +noncombatants +noncombustible +noncommercial +noncommercials +noncommittal +noncommittally +noncommunicable +noncompeting +noncompetitive +noncompliance +noncomplying +noncomprehending +noncoms +nonconducting +nonconductor +nonconductors +nonconforming +nonconformist +nonconformists +nonconformity +nonconsecutive +nonconstructive +noncontagious +noncontinuous +noncontributing +noncontributory +noncontroversial +nonconvertible +noncooperation +noncorroding +noncorrosive +noncredit +noncriminal +noncriminals +noncritical +noncrystalline +noncumulative +noncustodial +nondairy +nondeductible +nondeliveries +nondelivery +nondemocratic +nondenominational +nondepartmental +nondepreciating +nondescript +nondestructive +nondetachable +nondisciplinary +nondisclosure +nondiscrimination +nondiscriminatory +nondramatic +nondrinker +nondrinkers +nondrying +none +noneducational +noneffective +nonelastic +nonelectric +nonelectrical +nonenforceable +nonentities +nonentity +nonequivalent +nonequivalents +nonessential +nonesuch +nonesuches +nonetheless +nonevent +nonevents +nonexchangeable +nonexclusive +nonexempt +nonexempts +nonexistence +nonexistent +nonexplosive +nonexplosives +nonfactual +nonfading +nonfat +nonfatal +nonfattening +nonferrous +nonfiction +nonfictional +nonflammable +nonflowering +nonfluctuating +nonflying +nonfood +nonfoods +nonfreezing +nonfunctional +nongovernmental +nongranular +nonhazardous +nonhereditary +nonhuman +nonidentical +noninclusive +nonindependent +nonindustrial +noninfectious +noninflammatory +noninflationary +noninflected +nonintellectual +nonintellectuals +noninterchangeable +noninterference +nonintervention +nonintoxicating +noninvasive +nonirritating +nonjudgmental +nonjudicial +nonlegal +nonlethal +nonlinear +nonliterary +nonliving +nonmagnetic +nonmalignant +nonmember +nonmembers +nonmetal +nonmetallic +nonmetals +nonmigratory +nonmilitant +nonmilitary +nonnarcotic +nonnarcotics +nonnative +nonnatives +nonnegotiable +nonnuclear +nonnumerical +nonobjective +nonobligatory +nonobservance +nonobservant +nonoccupational +nonoccurrence +nonofficial +nonoperational +nonoperative +nonparallel +nonparallels +nonpareil +nonpareils +nonparticipant +nonparticipants +nonparticipating +nonpartisan +nonpartisans +nonpaying +nonpayment +nonpayments +nonperformance +nonperforming +nonperishable +nonperson +nonpersons +nonphysical +nonphysically +nonplus +nonplused +nonpluses +nonplusing +nonplussed +nonplusses +nonplussing +nonpoisonous +nonpolitical +nonpolluting +nonporous +nonpracticing +nonprejudicial +nonprescription +nonproductive +nonprofessional +nonprofessionals +nonprofit +nonprofitable +nonprofits +nonproliferation +nonpublic +nonpunishable +nonracial +nonradioactive +nonrandom +nonreactive +nonreciprocal +nonreciprocals +nonreciprocating +nonrecognition +nonrecoverable +nonrecurring +nonredeemable +nonrefillable +nonrefundable +nonreligious +nonrenewable +nonrepresentational +nonresident +nonresidential +nonresidents +nonresidual +nonresiduals +nonresistance +nonresistant +nonrestrictive +nonreturnable +nonreturnables +nonrhythmic +nonrigid +nonsalaried +nonscheduled +nonscientific +nonscoring +nonseasonal +nonsectarian +nonsecular +nonsegregated +nonsense +nonsensical +nonsensically +nonsensitive +nonsexist +nonsexual +nonskid +nonslip +nonsmoker +nonsmokers +nonsmoking +nonsocial +nonspeaking +nonspecialist +nonspecialists +nonspecializing +nonspecific +nonspiritual +nonspirituals +nonstaining +nonstandard +nonstarter +nonstarters +nonstick +nonstop +nonstrategic +nonstriking +nonstructural +nonsuccessive +nonsupport +nonsupporting +nonsurgical +nonsustaining +nonsympathizer +nonsympathizers +nontarnishable +nontaxable +nontechnical +nontenured +nontheatrical +nonthinking +nonthreatening +nontoxic +nontraditional +nontransferable +nontransparent +nontropical +nonuniform +nonunion +nonuser +nonusers +nonvenomous +nonverbal +nonviable +nonviolence +nonviolent +nonviolently +nonvirulent +nonvocal +nonvocational +nonvolatile +nonvoter +nonvoters +nonvoting +nonwhite +nonwhites +nonworking +nonyielding +noodle +noodled +noodles +noodling +nook +nooks +noon +noonday +noontide +noontime +noose +nooses +nope +norm +normal +normalcy +normality +normalization +normalize +normalized +normalizes +normalizing +normally +normative +norms +north +northbound +northeast +northeaster +northeasterly +northeastern +northeasters +northeastward +northeastwards +norther +northerlies +northerly +northern +northerner +northerners +northernmost +northers +northward +northwards +northwest +northwester +northwesterly +northwestern +northwesters +northwestward +northwestwards +nose +nosebleed +nosebleeds +nosecone +nosecones +nosed +nosedive +nosedived +nosedives +nosediving +nosedove +nosegay +nosegays +noses +nosey +nosh +noshed +nosher +noshers +noshes +noshing +nosier +nosiest +nosily +nosiness +nosing +nostalgia +nostalgic +nostalgically +nostril +nostrils +nostrum +nostrums +nosy +notabilities +notability +notable +notables +notably +notarial +notaries +notarization +notarize +notarized +notarizes +notarizing +notary +notate +notated +notates +notating +notation +notations +notch +notched +notches +notching +note +notebook +notebooks +noted +notepaper +notes +noteworthier +noteworthiest +noteworthiness +noteworthy +nothing +nothingness +nothings +notice +noticeable +noticeably +noticed +notices +noticing +notification +notifications +notified +notifier +notifiers +notifies +notify +notifying +noting +notion +notional +notions +notoriety +notorious +notoriously +notwithstanding +nougat +nougats +nought +noughts +noun +nouns +nourish +nourished +nourishes +nourishing +nourishment +nova +novae +novas +novel +novelette +novelettes +novelist +novelists +novelization +novelizations +novelize +novelized +novelizes +novelizing +novella +novellas +novelle +novels +novelties +novelty +novena +novenae +novenas +novice +novices +novitiate +novitiates +nowadays +noway +noways +nowhere +nowise +noxious +nozzle +nozzles +nuance +nuanced +nuances +nubbier +nubbiest +nubbin +nubbins +nubby +nubile +nubs +nuclear +nucleate +nucleated +nucleates +nucleating +nucleation +nuclei +nucleoli +nucleolus +nucleon +nucleons +nucleus +nucleuses +nude +nuder +nudes +nudest +nudge +nudged +nudges +nudging +nudism +nudist +nudists +nudity +nugatory +nugget +nuggets +nuisance +nuisances +nuke +nuked +nukes +nuking +null +nullification +nullified +nullifies +nullify +nullifying +nullity +numb +numbed +number +numbered +numbering +numberless +numbers +numbest +numbing +numbly +numbness +numbs +numbskull +numbskulls +numerable +numeracy +numeral +numerals +numerate +numerated +numerates +numerating +numeration +numerations +numerator +numerators +numeric +numerical +numerically +numerologist +numerologists +numerology +numerous +numerously +numinous +numismatic +numismatics +numismatist +numismatists +numskull +numskulls +nuncio +nuncios +nunneries +nunnery +nuns +nuptial +nuptials +nurse +nursed +nurseling +nurselings +nursemaid +nursemaids +nurser +nurseries +nursers +nursery +nurseryman +nurserymen +nurses +nursing +nursling +nurslings +nurture +nurtured +nurturer +nurturers +nurtures +nurturing +nutcracker +nutcrackers +nuthatch +nuthatches +nutmeat +nutmeats +nutmeg +nutmegs +nutpick +nutpicks +nutria +nutrias +nutrient +nutrients +nutriment +nutriments +nutrition +nutritional +nutritionally +nutritionist +nutritionists +nutritious +nutritiously +nutritiousness +nutritive +nuts +nutshell +nutshells +nutted +nuttier +nuttiest +nuttiness +nutting +nutty +nuzzle +nuzzled +nuzzler +nuzzlers +nuzzles +nuzzling +nylon +nylons +nymph +nymphet +nymphets +nymphomania +nymphomaniac +nymphomaniacs +nymphs +oafish +oafishly +oafishness +oafs +oaken +oaks +oakum +oared +oaring +oarlock +oarlocks +oars +oarsman +oarsmen +oarswoman +oarswomen +oases +oasis +oatcake +oatcakes +oaten +oath +oaths +oatmeal +oats +obbligati +obbligato +obbligatos +obduracy +obdurate +obdurately +obdurateness +obedience +obedient +obediently +obeisance +obeisances +obeisant +obelisk +obelisks +obese +obesity +obey +obeyed +obeying +obeys +obfuscate +obfuscated +obfuscates +obfuscating +obfuscation +obis +obit +obits +obituaries +obituary +object +objected +objectified +objectifies +objectify +objectifying +objecting +objection +objectionable +objectionably +objections +objective +objectively +objectiveness +objectives +objectivity +objector +objectors +objects +objurgate +objurgated +objurgates +objurgating +objurgation +objurgations +oblate +oblation +oblations +obligate +obligated +obligates +obligating +obligation +obligations +obligatorily +obligatory +oblige +obliged +obliges +obliging +obligingly +oblique +obliquely +obliqueness +obliques +obliquity +obliterate +obliterated +obliterates +obliterating +obliteration +oblivion +oblivious +obliviously +obliviousness +oblong +oblongs +obloquy +obnoxious +obnoxiously +obnoxiousness +oboe +oboes +oboist +oboists +obscene +obscenely +obscener +obscenest +obscenities +obscenity +obscurantism +obscurantist +obscurantists +obscure +obscured +obscurely +obscurer +obscures +obscurest +obscuring +obscurities +obscurity +obsequies +obsequious +obsequiously +obsequiousness +obsequy +observable +observably +observance +observances +observant +observantly +observation +observational +observations +observatories +observatory +observe +observed +observer +observers +observes +observing +obsess +obsessed +obsesses +obsessing +obsession +obsessional +obsessions +obsessive +obsessively +obsessiveness +obsessives +obsidian +obsolesce +obsolesced +obsolescence +obsolescent +obsolesces +obsolescing +obsolete +obsoleted +obsoletes +obsoleting +obstacle +obstacles +obstetric +obstetrical +obstetrician +obstetricians +obstetrics +obstinacy +obstinate +obstinately +obstreperous +obstreperously +obstreperousness +obstruct +obstructed +obstructing +obstruction +obstructionism +obstructionist +obstructionists +obstructions +obstructive +obstructively +obstructiveness +obstructs +obtain +obtainable +obtained +obtaining +obtainment +obtains +obtrude +obtruded +obtrudes +obtruding +obtrusion +obtrusive +obtrusively +obtrusiveness +obtuse +obtusely +obtuseness +obtuser +obtusest +obverse +obverses +obviate +obviated +obviates +obviating +obviation +obvious +obviously +obviousness +ocarina +ocarinas +occasion +occasional +occasionally +occasioned +occasioning +occasions +occidental +occidentals +occlude +occluded +occludes +occluding +occlusion +occlusions +occlusive +occult +occultism +occultist +occultists +occupancy +occupant +occupants +occupation +occupational +occupationally +occupations +occupied +occupier +occupiers +occupies +occupy +occupying +occur +occurred +occurrence +occurrences +occurring +occurs +ocean +oceanfront +oceanfronts +oceangoing +oceanic +oceanographer +oceanographers +oceanographic +oceanography +oceanology +oceans +ocelot +ocelots +ocher +ochre +octagon +octagonal +octagons +octane +octave +octaves +octavo +octavos +octet +octets +octette +octettes +octogenarian +octogenarians +octopi +octopus +octopuses +ocular +oculars +oculist +oculists +odalisque +odalisques +oddball +oddballs +odder +oddest +oddities +oddity +oddly +oddment +oddments +oddness +odds +odes +odious +odiously +odiousness +odium +odometer +odometers +odor +odored +odoriferous +odorless +odorous +odors +odour +odours +odyssey +odysseys +oedipal +oenology +oenophile +oenophiles +oesophagi +oesophagus +oeuvre +oeuvres +offal +offbeat +offbeats +offed +offence +offences +offend +offended +offender +offenders +offending +offends +offense +offenses +offensive +offensively +offensiveness +offensives +offer +offered +offering +offerings +offers +offertories +offertory +offhand +offhanded +offhandedly +offhandedness +office +officeholder +officeholders +officer +officers +offices +official +officialdom +officialism +officially +officials +officiant +officiants +officiate +officiated +officiates +officiating +officiator +officiators +officious +officiously +officiousness +offing +offings +offish +offline +offload +offloaded +offloading +offloads +offprint +offprints +offs +offset +offsets +offsetting +offshoot +offshoots +offshore +offside +offspring +offsprings +offstage +offtrack +often +oftener +oftenest +oftentimes +ofttimes +ogle +ogled +ogler +oglers +ogles +ogling +ogre +ogreish +ogres +ogress +ogresses +ohmmeter +ohmmeters +ohms +oilcloth +oilcloths +oiled +oilier +oiliest +oiliness +oiling +oils +oilskin +oilskins +oily +oink +oinked +oinking +oinks +ointment +ointments +okapi +okapis +okay +okayed +okaying +okays +okra +okras +olden +older +oldest +oldie +oldies +oldish +oldness +oldster +oldsters +oleaginous +oleander +oleanders +oleo +oleomargarin +oleomargarine +oles +olfactories +olfactory +oligarch +oligarchic +oligarchical +oligarchies +oligarchs +oligarchy +oligopolies +oligopoly +olive +olives +ombudsman +ombudsmen +omega +omegas +omelet +omelets +omelette +omelettes +omen +omens +omicron +omicrons +ominous +ominously +ominousness +omission +omissions +omit +omits +omitted +omitting +omnibus +omnibuses +omnibusses +omnipotence +omnipotent +omnipresence +omnipresent +omniscience +omniscient +omnivore +omnivores +omnivorous +omnivorously +omnivorousness +once +oncogene +oncogenes +oncologist +oncologists +oncology +oncoming +oneness +onerous +onerously +onerousness +ones +oneself +onetime +ongoing +onion +onions +onionskin +online +onlooker +onlookers +onlooking +only +onomatopoeia +onomatopoeic +onomatopoetic +onrush +onrushes +onrushing +onscreen +onset +onsets +onshore +onside +onslaught +onslaughts +onstage +onto +ontogeny +ontological +ontology +onus +onuses +onward +onwards +onyx +onyxes +oodles +oohed +oohing +oohs +oops +ooze +oozed +oozes +oozier +ooziest +oozing +oozy +opacity +opal +opalescence +opalescent +opals +opaque +opaqued +opaquely +opaqueness +opaquer +opaques +opaquest +opaquing +oped +open +opened +opener +openers +openest +openhanded +openhandedness +openhearted +opening +openings +openly +openness +opens +openwork +opera +operable +operas +operate +operated +operates +operatic +operatically +operating +operation +operational +operationally +operations +operative +operatives +operator +operators +operetta +operettas +opes +ophthalmic +ophthalmologist +ophthalmologists +ophthalmology +opiate +opiates +opine +opined +opines +oping +opining +opinion +opinionated +opinions +opium +opossum +opossums +opponent +opponents +opportune +opportunely +opportunism +opportunist +opportunistic +opportunistically +opportunists +opportunities +opportunity +oppose +opposed +opposes +opposing +opposite +oppositely +opposites +opposition +oppress +oppressed +oppresses +oppressing +oppression +oppressive +oppressively +oppressiveness +oppressor +oppressors +opprobrious +opprobriously +opprobrium +opted +optic +optical +optically +optician +opticians +optics +optima +optimal +optimally +optimism +optimist +optimistic +optimistically +optimists +optimization +optimize +optimized +optimizes +optimizing +optimum +optimums +opting +option +optional +optionally +optioned +optioning +options +optometrist +optometrists +optometry +opts +opulence +opulent +opulently +opus +opuses +oracle +oracles +oracular +oral +orally +orals +orange +orangeade +orangeades +oranger +orangeries +orangery +oranges +orangest +orangutan +orangutang +orangutangs +orangutans +orate +orated +orates +orating +oration +orations +orator +oratorical +oratorically +oratories +oratorio +oratorios +orators +oratory +orbicular +orbit +orbital +orbitals +orbited +orbiter +orbiters +orbiting +orbits +orbs +orchard +orchards +orchestra +orchestral +orchestras +orchestrate +orchestrated +orchestrates +orchestrating +orchestration +orchestrations +orchid +orchids +ordain +ordained +ordaining +ordainment +ordains +ordeal +ordeals +order +ordered +ordering +orderlies +orderliness +orderly +orders +ordinal +ordinals +ordinance +ordinances +ordinarily +ordinariness +ordinary +ordinate +ordinates +ordination +ordinations +ordnance +ordure +oregano +ores +organ +organdie +organdy +organelle +organelles +organic +organically +organics +organism +organismic +organisms +organist +organists +organization +organizational +organizationally +organizations +organize +organized +organizer +organizers +organizes +organizing +organs +organza +orgasm +orgasmic +orgasms +orgiastic +orgies +orgy +oriel +oriels +orient +oriental +orientals +orientate +orientated +orientates +orientating +orientation +orientations +oriented +orienting +orients +orifice +orifices +origami +origin +original +originality +originally +originals +originate +originated +originates +originating +origination +originator +originators +origins +oriole +orioles +orison +orisons +ormolu +ornament +ornamental +ornamentation +ornamented +ornamenting +ornaments +ornate +ornately +ornateness +ornerier +orneriest +orneriness +ornery +ornithological +ornithologist +ornithologists +ornithology +orotund +orotundities +orotundity +orphan +orphanage +orphanages +orphaned +orphaning +orphans +orris +orrises +orthodontia +orthodontic +orthodontics +orthodontist +orthodontists +orthodox +orthodoxies +orthodoxy +orthographic +orthographically +orthographies +orthography +orthopaedic +orthopaedics +orthopaedist +orthopaedists +orthopedic +orthopedics +orthopedist +orthopedists +orzo +oscillate +oscillated +oscillates +oscillating +oscillation +oscillations +oscillator +oscillators +oscillatory +oscilloscope +oscilloscopes +osculate +osculated +osculates +osculating +osculation +osculations +osier +osiers +osmium +osmosis +osmotic +osprey +ospreys +ossification +ossified +ossifies +ossify +ossifying +ostensible +ostensibly +ostentation +ostentatious +ostentatiously +osteoarthritis +osteopath +osteopathic +osteopaths +osteopathy +osteoporosis +ostracism +ostracize +ostracized +ostracizes +ostracizing +ostrich +ostriches +other +others +otherwise +otherworldly +otiose +otter +otters +ottoman +ottomans +oubliette +oubliettes +ouch +ought +ounce +ounces +ours +ourselves +oust +ousted +ouster +ousters +ousting +ousts +outage +outages +outargue +outargued +outargues +outarguing +outback +outbacks +outbalance +outbalanced +outbalances +outbalancing +outbid +outbidding +outbids +outboard +outboards +outboast +outboasted +outboasting +outboasts +outbound +outbox +outboxed +outboxes +outboxing +outbreak +outbreaks +outbuilding +outbuildings +outburst +outbursts +outcast +outcasts +outclass +outclassed +outclasses +outclassing +outcome +outcomes +outcries +outcrop +outcropped +outcropping +outcroppings +outcrops +outcry +outdated +outdid +outdistance +outdistanced +outdistances +outdistancing +outdo +outdoes +outdoing +outdone +outdoor +outdoors +outdoorsy +outdraw +outdrawing +outdrawn +outdraws +outdrew +outed +outer +outermost +outerwear +outface +outfaced +outfaces +outfacing +outfield +outfielder +outfielders +outfields +outfight +outfighting +outfights +outfit +outfits +outfitted +outfitter +outfitters +outfitting +outflank +outflanked +outflanking +outflanks +outflow +outflows +outfought +outfox +outfoxed +outfoxes +outfoxing +outgo +outgoes +outgoing +outgrew +outgrow +outgrowing +outgrown +outgrows +outgrowth +outgrowths +outguess +outguessed +outguesses +outguessing +outgun +outgunned +outgunning +outguns +outhit +outhits +outhitting +outhouse +outhouses +outing +outings +outlaid +outlandish +outlandishly +outlandishness +outlast +outlasted +outlasting +outlasts +outlaw +outlawed +outlawing +outlaws +outlay +outlaying +outlays +outlet +outlets +outline +outlined +outlines +outlining +outlive +outlived +outlives +outliving +outlook +outlooks +outlying +outmaneuver +outmaneuvered +outmaneuvering +outmaneuvers +outmanoeuvre +outmanoeuvred +outmanoeuvres +outmanoeuvring +outmatch +outmatched +outmatches +outmatching +outmoded +outnumber +outnumbered +outnumbering +outnumbers +outpatient +outpatients +outperform +outperformed +outperforming +outperforms +outplace +outplaced +outplacement +outplaces +outplacing +outplay +outplayed +outplaying +outplays +outpoint +outpointed +outpointing +outpoints +outpost +outposts +outpouring +outpourings +outproduce +outproduced +outproduces +outproducing +output +outputs +outputted +outputting +outrace +outraced +outraces +outracing +outrage +outraged +outrageous +outrageously +outrages +outraging +outran +outrank +outranked +outranking +outranks +outre +outreach +outreached +outreaches +outreaching +outrider +outriders +outrigger +outriggers +outright +outrun +outrunning +outruns +outs +outscore +outscored +outscores +outscoring +outsell +outselling +outsells +outset +outsets +outshine +outshined +outshines +outshining +outshone +outshout +outshouted +outshouting +outshouts +outside +outsider +outsiders +outsides +outsize +outsized +outsizes +outskirt +outskirts +outsmart +outsmarted +outsmarting +outsmarts +outsold +outsource +outsourced +outsources +outsourcing +outspend +outspending +outspends +outspent +outspoken +outspokenly +outspokenness +outspread +outspreading +outspreads +outstanding +outstandingly +outstation +outstations +outstay +outstayed +outstaying +outstays +outstretch +outstretched +outstretches +outstretching +outstrip +outstripped +outstripping +outstrips +outstript +outtake +outtakes +outvote +outvoted +outvotes +outvoting +outward +outwardly +outwards +outwear +outwearing +outwears +outweigh +outweighed +outweighing +outweighs +outwit +outwits +outwitted +outwitting +outwore +outwork +outworked +outworking +outworks +outworn +ouzo +oval +ovals +ovarian +ovaries +ovary +ovate +ovation +ovations +oven +ovenbird +ovenbirds +ovens +over +overabundance +overabundant +overachieve +overachieved +overachiever +overachievers +overachieves +overachieving +overact +overacted +overacting +overactive +overacts +overage +overages +overaggressive +overall +overalls +overambitious +overanxious +overarm +overarmed +overarming +overarms +overate +overattentive +overawe +overawed +overawes +overawing +overbalance +overbalanced +overbalances +overbalancing +overbear +overbearing +overbearingly +overbears +overbid +overbidding +overbids +overbite +overbites +overblown +overboard +overbold +overbook +overbooked +overbooking +overbooks +overbore +overborne +overbought +overbuild +overbuilding +overbuilds +overbuilt +overburden +overburdened +overburdening +overburdens +overbuy +overbuying +overbuys +overcame +overcapacity +overcapitalize +overcapitalized +overcapitalizes +overcapitalizing +overcareful +overcast +overcasting +overcasts +overcautious +overcharge +overcharged +overcharges +overcharging +overcloud +overclouded +overclouding +overclouds +overcoat +overcoats +overcome +overcomes +overcoming +overcompensate +overcompensated +overcompensates +overcompensating +overcompensation +overconfidence +overconfident +overconscientious +overcook +overcooked +overcooking +overcooks +overcritical +overcrowd +overcrowded +overcrowding +overcrowds +overdecorate +overdecorated +overdecorates +overdecorating +overdependent +overdevelop +overdeveloped +overdeveloping +overdevelops +overdid +overdo +overdoes +overdoing +overdone +overdose +overdosed +overdoses +overdosing +overdraft +overdrafts +overdraw +overdrawing +overdrawn +overdraws +overdress +overdressed +overdresses +overdressing +overdrew +overdrive +overdub +overdubbed +overdubbing +overdubs +overdue +overeager +overeat +overeaten +overeating +overeats +overemotional +overemphasis +overemphasize +overemphasized +overemphasizes +overemphasizing +overenthusiastic +overestimate +overestimated +overestimates +overestimating +overestimation +overexcite +overexcited +overexcites +overexciting +overexercise +overexercised +overexercises +overexercising +overexert +overexerted +overexerting +overexertion +overexerts +overexpose +overexposed +overexposes +overexposing +overexposure +overextend +overextended +overextending +overextends +overfed +overfeed +overfeeding +overfeeds +overfill +overfilled +overfilling +overfills +overflew +overflies +overflight +overflights +overflow +overflowed +overflowing +overflown +overflows +overfly +overflying +overfond +overfull +overgeneralize +overgeneralized +overgeneralizes +overgeneralizing +overgenerous +overgraze +overgrazed +overgrazes +overgrazing +overgrew +overgrow +overgrowing +overgrown +overgrows +overgrowth +overhand +overhanded +overhands +overhang +overhanging +overhangs +overhasty +overhaul +overhauled +overhauling +overhauls +overhead +overheads +overhear +overheard +overhearing +overhears +overheat +overheated +overheating +overheats +overhung +overindulge +overindulged +overindulgence +overindulgent +overindulges +overindulging +overjoy +overjoyed +overjoying +overjoys +overkill +overladen +overlaid +overlain +overland +overlap +overlapped +overlapping +overlaps +overlarge +overlay +overlaying +overlays +overleaf +overlie +overlies +overload +overloaded +overloading +overloads +overlong +overlook +overlooked +overlooking +overlooks +overlord +overlords +overly +overlying +overmaster +overmastered +overmastering +overmasters +overmodest +overmuch +overnice +overnight +overnights +overoptimism +overoptimistic +overpaid +overparticular +overpass +overpasses +overpay +overpaying +overpays +overplay +overplayed +overplaying +overplays +overpopulate +overpopulated +overpopulates +overpopulating +overpopulation +overpower +overpowered +overpowering +overpoweringly +overpowers +overpraise +overpraised +overpraises +overpraising +overprecise +overprice +overpriced +overprices +overpricing +overprint +overprinted +overprinting +overprints +overproduce +overproduced +overproduces +overproducing +overproduction +overprotect +overprotected +overprotecting +overprotective +overprotects +overqualified +overran +overrate +overrated +overrates +overrating +overreach +overreached +overreaches +overreaching +overreact +overreacted +overreacting +overreaction +overreactions +overreacts +overrefined +overridden +override +overrides +overriding +overripe +overrode +overrule +overruled +overrules +overruling +overrun +overrunning +overruns +overs +oversaw +oversea +overseas +oversee +overseeing +overseen +overseer +overseers +oversees +oversell +overselling +oversells +oversensitive +oversensitiveness +oversexed +overshadow +overshadowed +overshadowing +overshadows +overshoe +overshoes +overshoot +overshooting +overshoots +overshot +oversight +oversights +oversimple +oversimplification +oversimplifications +oversimplified +oversimplifies +oversimplify +oversimplifying +oversize +oversized +oversleep +oversleeping +oversleeps +overslept +oversold +overspecialization +overspecialize +overspecialized +overspecializes +overspecializing +overspend +overspending +overspends +overspent +overspill +overspilled +overspilling +overspills +overspilt +overspread +overspreading +overspreads +overstate +overstated +overstatement +overstatements +overstates +overstating +overstay +overstayed +overstaying +overstays +overstep +overstepped +overstepping +oversteps +overstimulate +overstimulated +overstimulates +overstimulating +overstock +overstocked +overstocking +overstocks +overstrict +overstrung +overstuffed +oversubscribe +oversubscribed +oversubscribes +oversubscribing +oversubtle +oversupplied +oversupplies +oversupply +oversupplying +oversuspicious +overt +overtake +overtaken +overtakes +overtaking +overtax +overtaxed +overtaxes +overtaxing +overthrew +overthrow +overthrowing +overthrown +overthrows +overtime +overtimes +overtire +overtired +overtires +overtiring +overtly +overtone +overtones +overtook +overture +overtures +overturn +overturned +overturning +overturns +overuse +overused +overuses +overusing +overvalue +overvalued +overvalues +overvaluing +overview +overviews +overweening +overweight +overwhelm +overwhelmed +overwhelming +overwhelmingly +overwhelms +overwinter +overwintered +overwintering +overwinters +overwork +overworked +overworking +overworks +overwrought +overzealous +oviduct +oviducts +oviparous +ovoid +ovoids +ovular +ovulate +ovulated +ovulates +ovulating +ovulation +ovule +ovules +ovum +owed +owes +owing +owlet +owlets +owlish +owlishly +owls +owned +owner +owners +ownership +owning +owns +oxblood +oxbow +oxbows +oxcart +oxcarts +oxen +oxford +oxfords +oxidant +oxidants +oxidation +oxide +oxides +oxidization +oxidize +oxidized +oxidizer +oxidizers +oxidizes +oxidizing +oxyacetylene +oxygen +oxygenate +oxygenated +oxygenates +oxygenating +oxygenation +oxymora +oxymoron +oxymorons +oyster +oysters +ozone +pablum +pabulum +pace +paced +pacemaker +pacemakers +pacer +pacers +paces +pacesetter +pacesetters +pachyderm +pachyderms +pachysandra +pachysandras +pacific +pacifically +pacification +pacified +pacifier +pacifiers +pacifies +pacifism +pacifist +pacifistic +pacifists +pacify +pacifying +pacing +pack +package +packaged +packager +packagers +packages +packaging +packed +packer +packers +packet +packets +packing +packinghouse +packinghouses +packs +packsaddle +packsaddles +pact +pacts +padded +paddies +padding +paddle +paddled +paddler +paddlers +paddles +paddling +paddock +paddocked +paddocking +paddocks +paddy +padlock +padlocked +padlocking +padlocks +padre +padres +pads +paean +paeans +paediatric +paediatrician +paediatricians +paediatrics +paella +pagan +paganism +pagans +page +pageant +pageantry +pageants +pageboy +pageboys +paged +pager +pagers +pages +paginate +paginated +paginates +paginating +pagination +paging +pagoda +pagodas +paid +pail +pailful +pailfuls +pails +pailsful +pain +pained +painful +painfuller +painfullest +painfully +painfulness +paining +painkiller +painkillers +painkilling +painless +painlessly +painlessness +pains +painstaking +painstakingly +paint +paintbox +paintboxes +paintbrush +paintbrushes +painted +painter +painters +painting +paintings +paints +pair +paired +pairing +pairs +paisley +paisleys +pajama +pajamas +palace +palaces +paladin +paladins +palanquin +palanquins +palatable +palatal +palatalization +palatalize +palatalized +palatalizes +palatalizing +palatals +palate +palates +palatial +palatially +palatinate +palatinates +palatine +palatines +palaver +palavered +palavering +palavers +pale +paled +paleface +palefaces +palely +paleness +paleographer +paleographers +paleography +paleolithic +paleontologist +paleontologists +paleontology +paler +pales +palest +palette +palettes +palfrey +palfreys +palimony +palimpsest +palimpsests +palindrome +palindromes +paling +palings +palisade +palisades +palish +pall +palladium +pallbearer +pallbearers +palled +pallet +pallets +palliate +palliated +palliates +palliating +palliation +palliative +palliatives +pallid +pallider +pallidest +pallidly +pallidness +palling +pallor +palls +palm +palmate +palmed +palmetto +palmettoes +palmettos +palmier +palmiest +palming +palmist +palmistry +palmists +palms +palmtop +palmtops +palmy +palomino +palominos +palpable +palpably +palpate +palpated +palpates +palpating +palpation +palpitate +palpitated +palpitates +palpitating +palpitation +palpitations +pals +palsied +palsies +palsy +palsying +paltrier +paltriest +paltriness +paltry +pampas +pamper +pampered +pampering +pampers +pamphlet +pamphleted +pamphleteer +pamphleteers +pamphleting +pamphlets +panacea +panaceas +panache +panama +panamas +pancake +pancaked +pancakes +pancaking +panchromatic +pancreas +pancreases +pancreatic +panda +pandas +pandemic +pandemics +pandemonium +pander +pandered +panderer +panderers +pandering +panders +pane +panegyric +panegyrics +panel +paneled +paneling +panelist +panelists +panelled +panelling +panels +panes +pang +pangs +panhandle +panhandled +panhandler +panhandlers +panhandles +panhandling +panic +panicked +panicking +panicky +panics +panier +paniers +panned +pannier +panniers +panning +panoplies +panoply +panorama +panoramas +panoramic +panpipes +pans +pansies +pansy +pant +pantaloons +panted +pantheism +pantheist +pantheistic +pantheists +pantheon +pantheons +panther +panthers +pantie +panties +panting +pantomime +pantomimed +pantomimes +pantomimic +pantomiming +pantomimist +pantomimists +pantries +pantry +pants +pantsuit +pantsuits +panty +pantyhose +pantyliner +pantyliners +pantywaist +pantywaists +papa +papacies +papacy +papal +paparazzi +papas +papaw +papaws +papaya +papayas +paper +paperback +paperbacks +paperboard +paperboy +paperboys +papered +paperer +paperers +papergirl +papergirls +paperhanger +paperhangers +paperhanging +papering +papers +paperweight +paperweights +paperwork +papery +papilla +papillae +papillary +papist +papists +papoose +papooses +pappies +pappy +paprika +paps +papyri +papyrus +papyruses +para +parable +parables +parabola +parabolas +parabolic +parachute +parachuted +parachutes +parachuting +parachutist +parachutists +parade +paraded +parader +paraders +parades +paradigm +paradigmatic +paradigms +parading +paradisaical +paradise +paradises +paradox +paradoxes +paradoxical +paradoxically +paraffin +paragon +paragons +paragraph +paragraphed +paragraphing +paragraphs +parakeet +parakeets +paralegal +paralegals +parallax +parallaxes +parallel +paralleled +paralleling +parallelism +parallelisms +parallelled +parallelling +parallelogram +parallelograms +parallels +paralyse +paralysed +paralyses +paralysing +paralysis +paralytic +paralytics +paralyze +paralyzed +paralyzes +paralyzing +paralyzingly +paramecia +paramecium +parameciums +paramedic +paramedical +paramedicals +paramedics +parameter +parameters +parametric +paramilitaries +paramilitary +paramount +paramour +paramours +paranoia +paranoiac +paranoiacs +paranoid +paranoids +paranormal +parapet +parapets +paraphernalia +paraphrase +paraphrased +paraphrases +paraphrasing +paraplegia +paraplegic +paraplegics +paraprofessional +paraprofessionals +parapsychologist +parapsychologists +parapsychology +paraquat +paras +parasite +parasites +parasitic +parasitically +parasitism +parasol +parasols +parasympathetic +parathion +parathyroid +parathyroids +paratrooper +paratroopers +paratroops +paratyphoid +parboil +parboiled +parboiling +parboils +parcel +parceled +parceling +parcelled +parcelling +parcels +parch +parched +parches +parching +parchment +parchments +pardon +pardonable +pardonably +pardoned +pardoner +pardoners +pardoning +pardons +pare +pared +paregoric +parent +parentage +parental +parented +parentheses +parenthesis +parenthesize +parenthesized +parenthesizes +parenthesizing +parenthetic +parenthetical +parenthetically +parenthood +parenting +parents +parer +parers +pares +paresis +parfait +parfaits +pariah +pariahs +parietal +parimutuel +parimutuels +paring +parings +parish +parishes +parishioner +parishioners +parity +park +parka +parkas +parked +parking +parks +parkway +parkways +parlance +parlay +parlayed +parlaying +parlays +parley +parleyed +parleying +parleys +parliament +parliamentarian +parliamentarians +parliamentary +parliaments +parlor +parlors +parlour +parlours +parlous +parmigiana +parmigiano +parochial +parochialism +parochially +parodied +parodies +parodist +parodists +parody +parodying +parole +paroled +parolee +parolees +paroles +paroling +paroxysm +paroxysmal +paroxysms +parquet +parqueted +parqueting +parquetry +parquets +parrakeet +parrakeets +parred +parricidal +parricide +parricides +parried +parries +parring +parrot +parroted +parroting +parrots +parry +parrying +pars +parse +parsec +parsecs +parsed +parses +parsimonious +parsimoniously +parsimony +parsing +parsley +parsnip +parsnips +parson +parsonage +parsonages +parsons +part +partake +partaken +partaker +partakers +partakes +partaking +parted +parterre +parterres +parthenogenesis +partial +partiality +partially +partials +participant +participants +participate +participated +participates +participating +participation +participator +participators +participatory +participial +participle +participles +particle +particleboard +particles +particular +particularities +particularity +particularization +particularize +particularized +particularizes +particularizing +particularly +particulars +particulate +particulates +partied +parties +parting +partings +partisan +partisans +partisanship +partition +partitioned +partitioning +partitions +partitive +partitives +partizan +partizans +partly +partner +partnered +partnering +partners +partnership +partnerships +partook +partridge +partridges +parts +parturition +partway +party +partying +parvenu +parvenus +pascal +pascals +paschal +pasha +pashas +pass +passable +passably +passage +passages +passageway +passageways +passbook +passbooks +passe +passed +passel +passels +passenger +passengers +passer +passerby +passers +passersby +passes +passim +passing +passingly +passion +passionate +passionately +passionflower +passionflowers +passionless +passions +passive +passively +passiveness +passives +passivity +passkey +passkeys +passport +passports +password +passwords +past +pasta +pastas +paste +pasteboard +pasted +pastel +pastels +pastern +pasterns +pastes +pasteurization +pasteurize +pasteurized +pasteurizer +pasteurizers +pasteurizes +pasteurizing +pastiche +pastiches +pastier +pasties +pastiest +pastille +pastilles +pastime +pastimes +pastiness +pasting +pastor +pastoral +pastorals +pastorate +pastorates +pastors +pastrami +pastries +pastry +pasts +pasturage +pasture +pastured +pastureland +pastures +pasturing +pasty +patch +patched +patches +patchier +patchiest +patchily +patchiness +patching +patchwork +patchworks +patchy +pate +patella +patellae +patellas +patent +patented +patenting +patently +patents +paterfamilias +paterfamiliases +paternal +paternalism +paternalistic +paternally +paternity +paternoster +paternosters +pates +path +pathetic +pathetically +pathfinder +pathfinders +pathless +pathogen +pathogenic +pathogens +pathological +pathologically +pathologies +pathologist +pathologists +pathology +pathos +paths +pathway +pathways +patience +patient +patienter +patientest +patiently +patients +patina +patinae +patinas +patio +patios +patois +patresfamilias +patriarch +patriarchal +patriarchate +patriarchates +patriarchies +patriarchs +patriarchy +patrician +patricians +patricide +patricides +patrimonial +patrimonies +patrimony +patriot +patriotic +patriotically +patriotism +patriots +patrol +patrolled +patrolling +patrolman +patrolmen +patrols +patrolwoman +patrolwomen +patron +patronage +patroness +patronesses +patronize +patronized +patronizer +patronizers +patronizes +patronizing +patronizingly +patrons +patronymic +patronymically +patronymics +patroon +patroons +pats +patsies +patsy +patted +patter +pattered +pattering +pattern +patterned +patterning +patterns +patters +patties +patting +patty +paucity +paunch +paunches +paunchier +paunchiest +paunchy +pauper +pauperism +pauperize +pauperized +pauperizes +pauperizing +paupers +pause +paused +pauses +pausing +pave +paved +pavement +pavements +paves +pavilion +pavilions +paving +pavings +pawed +pawing +pawl +pawls +pawn +pawnbroker +pawnbrokers +pawnbroking +pawned +pawning +pawns +pawnshop +pawnshops +pawpaw +pawpaws +paws +payable +payback +paybacks +paycheck +paychecks +payday +paydays +payed +payee +payees +payer +payers +paying +payload +payloads +paymaster +paymasters +payment +payments +payoff +payoffs +payola +payout +payouts +payroll +payrolls +pays +payslip +payslips +peace +peaceable +peaceably +peaceful +peacefully +peacefulness +peacekeeper +peacekeepers +peacekeeping +peacemaker +peacemakers +peacemaking +peaces +peacetime +peach +peaches +peachier +peachiest +peachy +peacock +peacocks +peafowl +peafowls +peahen +peahens +peak +peaked +peaking +peaks +peal +pealed +pealing +peals +peanut +peanuts +pear +pearl +pearled +pearlier +pearliest +pearling +pearls +pearly +pears +peas +peasant +peasantry +peasants +pease +peashooter +peashooters +peat +peatier +peatiest +peaty +pebble +pebbled +pebbles +pebblier +pebbliest +pebbling +pebbly +pecan +pecans +peccadillo +peccadilloes +peccadillos +peccaries +peccary +peck +pecked +pecking +pecks +pectic +pectin +pectoral +pectorals +peculate +peculated +peculates +peculating +peculation +peculator +peculators +peculiar +peculiarities +peculiarity +peculiarly +pecuniary +pedagog +pedagogic +pedagogical +pedagogs +pedagogue +pedagogues +pedagogy +pedal +pedaled +pedaling +pedalled +pedalling +pedals +pedant +pedantic +pedantically +pedantry +pedants +peddle +peddled +peddler +peddlers +peddles +peddling +pederast +pederasts +pederasty +pedestal +pedestals +pedestrian +pedestrianize +pedestrianized +pedestrianizes +pedestrianizing +pedestrians +pediatric +pediatrician +pediatricians +pediatrics +pedicab +pedicabs +pedicure +pedicured +pedicures +pedicuring +pedicurist +pedicurists +pedigree +pedigreed +pedigrees +pediment +pediments +pedlar +pedlars +pedometer +pedometers +peduncle +peduncles +peed +peeing +peek +peekaboo +peeked +peeking +peeks +peel +peeled +peeler +peelers +peeling +peelings +peels +peen +peens +peep +peeped +peeper +peepers +peephole +peepholes +peeping +peeps +peepshow +peepshows +peer +peerage +peerages +peered +peeress +peeresses +peering +peerless +peers +pees +peeve +peeved +peeves +peeving +peevish +peevishly +peevishness +peewee +peewees +pegboard +pegboards +pegged +pegging +pegs +peignoir +peignoirs +pejoration +pejorative +pejoratively +pejoratives +peke +pekes +pekinese +pekingese +pekoe +pelagic +pelf +pelican +pelicans +pellagra +pellet +pelleted +pelleting +pellets +pellmell +pellucid +pelt +pelted +pelting +pelts +pelves +pelvic +pelvis +pelvises +pemmican +penal +penalization +penalize +penalized +penalizes +penalizing +penalties +penalty +penance +penances +pence +penchant +penchants +pencil +penciled +penciling +pencilled +pencilling +pencils +pend +pendant +pendants +pended +pendent +pendents +pending +pends +pendulous +pendulum +pendulums +penes +penetrability +penetrable +penetrate +penetrated +penetrates +penetrating +penetratingly +penetration +penetrations +penetrative +penguin +penguins +penicillin +penile +peninsula +peninsular +peninsulas +penis +penises +penitence +penitent +penitential +penitentiaries +penitentiary +penitently +penitents +penknife +penknives +penlight +penlights +penlite +penlites +penman +penmanship +penmen +pennant +pennants +penned +pennies +penniless +penning +pennon +pennons +penny +pennyweight +pennyweights +penologist +penologists +penology +pens +pension +pensionable +pensioned +pensioner +pensioners +pensioning +pensions +pensive +pensively +pensiveness +pent +pentacle +pentacles +pentagon +pentagonal +pentagons +pentagram +pentagrams +pentameter +pentameters +pentathlete +pentathletes +pentathlon +pentathlons +penthouse +penthouses +penuche +penultimate +penultimates +penumbra +penumbrae +penumbras +penurious +penuriously +penuriousness +penury +peon +peonage +peonies +peons +peony +people +peopled +peoples +peopling +pepped +pepper +peppercorn +peppercorns +peppered +peppering +peppermint +peppermints +pepperoni +pepperonis +peppers +peppery +peppier +peppiest +peppiness +pepping +peppy +peps +pepsin +peptic +peptics +peradventure +perambulate +perambulated +perambulates +perambulating +perambulation +perambulations +perambulator +perambulators +percale +percales +perceivable +perceive +perceived +perceives +perceiving +percent +percentage +percentages +percentile +percentiles +percents +perceptible +perceptibly +perception +perceptional +perceptions +perceptive +perceptively +perceptiveness +perceptual +perceptually +perch +perchance +perched +perches +perching +percipience +percipient +percolate +percolated +percolates +percolating +percolation +percolator +percolators +percussion +percussionist +percussionists +perdition +perdurable +peregrinate +peregrinated +peregrinates +peregrinating +peregrination +peregrinations +peregrine +peregrines +peremptorily +peremptory +perennial +perennially +perennials +perestroika +perfect +perfecta +perfectas +perfected +perfecter +perfectest +perfectibility +perfectible +perfecting +perfection +perfectionism +perfectionist +perfectionists +perfections +perfectly +perfectness +perfects +perfidies +perfidious +perfidiously +perfidy +perforate +perforated +perforates +perforating +perforation +perforations +perforce +perform +performance +performances +performed +performer +performers +performing +performs +perfume +perfumed +perfumer +perfumeries +perfumers +perfumery +perfumes +perfuming +perfunctorily +perfunctory +pergola +pergolas +perhaps +pericardia +pericardium +pericardiums +perigee +perigees +perihelia +perihelion +perihelions +peril +periled +periling +perilled +perilling +perilous +perilously +perils +perimeter +perimeters +perinea +perineum +period +periodic +periodical +periodically +periodicals +periodicity +periodontal +periodontics +periodontist +periodontists +periods +peripatetic +peripatetics +peripheral +peripherally +peripherals +peripheries +periphery +periphrases +periphrasis +periphrastic +periscope +periscopes +perish +perishable +perishables +perished +perishes +perishing +peristalsis +peristaltic +peristyle +peristyles +peritonea +peritoneal +peritoneum +peritoneums +peritonitis +periwig +periwigs +periwinkle +periwinkles +perjure +perjured +perjurer +perjurers +perjures +perjuries +perjuring +perjury +perk +perked +perkier +perkiest +perkily +perkiness +perking +perks +perky +perm +permafrost +permanence +permanency +permanent +permanently +permanents +permeability +permeable +permeate +permeated +permeates +permeating +permeation +permed +perming +permissible +permissibly +permission +permissive +permissively +permissiveness +permit +permits +permitted +permitting +perms +permutation +permutations +permute +permuted +permutes +permuting +pernicious +perniciously +perniciousness +pernickety +peroration +perorations +peroxide +peroxided +peroxides +peroxiding +perpendicular +perpendicularity +perpendicularly +perpendiculars +perpetrate +perpetrated +perpetrates +perpetrating +perpetration +perpetrator +perpetrators +perpetual +perpetually +perpetuals +perpetuate +perpetuated +perpetuates +perpetuating +perpetuation +perpetuity +perplex +perplexed +perplexedly +perplexes +perplexing +perplexities +perplexity +perquisite +perquisites +persecute +persecuted +persecutes +persecuting +persecution +persecutions +persecutor +persecutors +perseverance +persevere +persevered +perseveres +persevering +persiflage +persimmon +persimmons +persist +persisted +persistence +persistent +persistently +persisting +persists +persnickety +person +persona +personable +personae +personage +personages +personal +personalities +personality +personalize +personalized +personalizes +personalizing +personally +personals +personalty +personas +personification +personifications +personified +personifies +personify +personifying +personnel +persons +perspective +perspectives +perspicacious +perspicaciously +perspicacity +perspicuity +perspicuous +perspiration +perspire +perspired +perspires +perspiring +persuadable +persuade +persuaded +persuader +persuaders +persuades +persuading +persuasion +persuasions +persuasive +persuasively +persuasiveness +pert +pertain +pertained +pertaining +pertains +perter +pertest +pertinacious +pertinaciously +pertinacity +pertinence +pertinent +pertinently +pertly +pertness +perturb +perturbation +perturbations +perturbed +perturbing +perturbs +pertussis +peruke +perukes +perusal +perusals +peruse +perused +peruses +perusing +pervade +pervaded +pervades +pervading +pervasive +pervasively +pervasiveness +perverse +perversely +perverseness +perversion +perversions +perversity +pervert +perverted +perverting +perverts +peseta +pesetas +peskier +peskiest +peskily +peskiness +pesky +peso +pesos +pessimism +pessimist +pessimistic +pessimistically +pessimists +pest +pester +pestered +pestering +pesters +pesticide +pesticides +pestiferous +pestilence +pestilences +pestilent +pestilential +pestle +pestled +pestles +pestling +pesto +pests +petal +petaled +petals +petard +petards +petcock +petcocks +peter +petered +petering +peters +petiole +petioles +petite +petites +petition +petitioned +petitioner +petitioners +petitioning +petitions +petrel +petrels +petrifaction +petrified +petrifies +petrify +petrifying +petrochemical +petrochemicals +petrodollar +petrodollars +petrol +petrolatum +petroleum +petrologist +petrologists +petrology +pets +petted +petticoat +petticoats +pettier +pettiest +pettifog +pettifogged +pettifogger +pettifoggers +pettifoggery +pettifogging +pettifogs +pettily +pettiness +petting +pettish +pettishly +petty +petulance +petulant +petulantly +petunia +petunias +pewee +pewees +pewit +pewits +pews +pewter +pewters +peyote +pfennig +pfennige +pfennigs +phaeton +phaetons +phagocyte +phagocytes +phalanger +phalangers +phalanges +phalanx +phalanxes +phalli +phallic +phallus +phalluses +phantasied +phantasies +phantasm +phantasmagoria +phantasmagorias +phantasmal +phantasms +phantasy +phantasying +phantom +phantoms +pharaoh +pharaohs +pharisaic +pharisee +pharisees +pharmaceutic +pharmaceutical +pharmaceuticals +pharmaceutics +pharmacies +pharmacist +pharmacists +pharmacological +pharmacologist +pharmacologists +pharmacology +pharmacopeia +pharmacopeias +pharmacopoeia +pharmacopoeias +pharmacy +pharyngeal +pharynges +pharyngitis +pharynx +pharynxes +phase +phased +phaseout +phaseouts +phases +phasing +phat +phatter +phattest +pheasant +pheasants +phenacetin +phenobarbital +phenol +phenom +phenomena +phenomenal +phenomenally +phenomenon +phenomenons +phenoms +pheromone +pheromones +phew +phial +phials +philander +philandered +philanderer +philanderers +philandering +philanders +philanthropic +philanthropically +philanthropies +philanthropist +philanthropists +philanthropy +philatelic +philatelist +philatelists +philately +philharmonic +philharmonics +philippic +philippics +philistine +philistines +philistinism +philodendra +philodendron +philodendrons +philological +philologist +philologists +philology +philosopher +philosophers +philosophic +philosophical +philosophically +philosophies +philosophize +philosophized +philosophizer +philosophizers +philosophizes +philosophizing +philosophy +philter +philters +philtre +philtres +phis +phlebitis +phlegm +phlegmatic +phlegmatically +phloem +phlox +phloxes +phobia +phobias +phobic +phobics +phoebe +phoebes +phoenix +phoenixes +phone +phoned +phoneme +phonemes +phonemic +phonemically +phones +phonetic +phonetically +phonetician +phoneticians +phonetics +phoney +phoneyed +phoneying +phoneys +phonic +phonically +phonics +phonied +phonier +phonies +phoniest +phoniness +phoning +phonograph +phonographic +phonographs +phonological +phonologically +phonologist +phonologists +phonology +phony +phonying +phooey +phosphate +phosphates +phosphor +phosphorescence +phosphorescent +phosphorescently +phosphoric +phosphorous +phosphors +phosphorus +photo +photocell +photocells +photocopied +photocopier +photocopiers +photocopies +photocopy +photocopying +photoed +photoelectric +photoelectrically +photoengrave +photoengraved +photoengraver +photoengravers +photoengraves +photoengraving +photoengravings +photofinishing +photogenic +photogenically +photograph +photographed +photographer +photographers +photographic +photographically +photographing +photographs +photography +photoing +photojournalism +photojournalist +photojournalists +photometer +photometers +photon +photons +photos +photosensitive +photostat +photostated +photostatic +photostating +photostats +photostatted +photostatting +photosynthesis +photosynthesize +photosynthesized +photosynthesizes +photosynthesizing +photosynthetic +phrasal +phrase +phrased +phraseology +phrases +phrasing +phrasings +phrenetic +phrenologist +phrenologists +phrenology +phyla +phylacteries +phylactery +phylogeny +phylum +physic +physical +physically +physicals +physician +physicians +physicist +physicists +physicked +physicking +physics +physiognomies +physiognomy +physiography +physiologic +physiological +physiologically +physiologist +physiologists +physiology +physiotherapist +physiotherapists +physiotherapy +physique +physiques +pianissimi +pianissimo +pianissimos +pianist +pianists +piano +pianoforte +pianofortes +pianos +piaster +piasters +piastre +piastres +piazza +piazzas +piazze +pibroch +pibrochs +pica +picador +picadors +picaresque +picayune +piccalilli +piccolo +piccolos +pick +pickaback +pickabacked +pickabacking +pickabacks +pickax +pickaxe +pickaxed +pickaxes +pickaxing +picked +picker +pickerel +pickerels +pickers +picket +picketed +picketing +pickets +pickier +pickiest +picking +pickings +pickle +pickled +pickles +pickling +pickpocket +pickpockets +picks +pickup +pickups +picky +picnic +picnicked +picnicker +picnickers +picnicking +picnics +picot +picots +pics +pictograph +pictographs +pictorial +pictorially +pictorials +picture +pictured +pictures +picturesque +picturesquely +picturesqueness +picturing +piddle +piddled +piddles +piddling +piddly +pidgin +pidgins +piebald +piebalds +piece +pieced +piecemeal +pieces +piecework +pieceworker +pieceworkers +piecing +pied +pieing +pier +pierce +pierced +pierces +piercing +piercingly +piercings +piers +pies +piety +piffle +piffling +pigeon +pigeonhole +pigeonholed +pigeonholes +pigeonholing +pigeons +pigged +piggier +piggies +piggiest +pigging +piggish +piggishly +piggishness +piggy +piggyback +piggybacked +piggybacking +piggybacks +pigheaded +pigheadedly +pigheadedness +piglet +piglets +pigment +pigmentation +pigments +pigmies +pigmy +pigpen +pigpens +pigs +pigskin +pigskins +pigsties +pigsty +pigtail +pigtails +piing +pike +piked +piker +pikers +pikes +pikestaff +pikestaffs +pikestaves +piking +pilaf +pilaff +pilaffs +pilafs +pilaster +pilasters +pilau +pilaus +pilchard +pilchards +pile +piled +piles +pileup +pileups +pilfer +pilferage +pilfered +pilferer +pilferers +pilfering +pilfers +pilgrim +pilgrimage +pilgrimages +pilgrims +piling +pilings +pill +pillage +pillaged +pillager +pillagers +pillages +pillaging +pillar +pillars +pillbox +pillboxes +pilled +pilling +pillion +pillions +pilloried +pillories +pillory +pillorying +pillow +pillowcase +pillowcases +pillowed +pillowing +pillows +pillowslip +pillowslips +pills +pilot +piloted +pilothouse +pilothouses +piloting +pilots +pimento +pimentos +pimiento +pimientos +pimp +pimped +pimpernel +pimpernels +pimping +pimple +pimpled +pimples +pimplier +pimpliest +pimply +pimps +pinafore +pinafores +pinata +pinatas +pinball +pincer +pincers +pinch +pinched +pinches +pinching +pincushion +pincushions +pine +pineapple +pineapples +pined +pines +piney +pinfeather +pinfeathers +ping +pinged +pinging +pings +pinhead +pinheads +pinhole +pinholes +pinier +piniest +pining +pinion +pinioned +pinioning +pinions +pink +pinked +pinker +pinkest +pinkeye +pinkie +pinkies +pinking +pinkish +pinkness +pinko +pinkoes +pinkos +pinks +pinky +pinnacle +pinnacles +pinnate +pinned +pinning +pinochle +pinocle +pinon +pinones +pinons +pinpoint +pinpointed +pinpointing +pinpoints +pinprick +pinpricks +pins +pinsetter +pinsetters +pinstripe +pinstriped +pinstripes +pint +pinto +pintoes +pintos +pints +pinup +pinups +pinwheel +pinwheeled +pinwheeling +pinwheels +piny +pinyin +pinyon +pinyons +pioneer +pioneered +pioneering +pioneers +pious +piously +piousness +pipe +piped +pipeline +pipelines +piper +pipers +pipes +pipette +pipettes +piping +pipit +pipits +pipped +pippin +pipping +pippins +pips +pipsqueak +pipsqueaks +piquancy +piquant +piquantly +pique +piqued +piques +piquing +piracy +piranha +piranhas +pirate +pirated +pirates +piratical +piratically +pirating +pirogi +piroshki +pirouette +pirouetted +pirouettes +pirouetting +piscatorial +pismire +pismires +piss +pissed +pisses +pissing +pistachio +pistachios +pistil +pistillate +pistils +pistol +pistols +piston +pistons +pita +pitapat +pitapats +pitch +pitchblende +pitched +pitcher +pitchers +pitches +pitchfork +pitchforked +pitchforking +pitchforks +pitching +pitchman +pitchmen +piteous +piteously +piteousness +pitfall +pitfalls +pith +pithier +pithiest +pithily +pithiness +pithy +pitiable +pitiably +pitied +pities +pitiful +pitifully +pitiless +pitilessly +pitilessness +piton +pitons +pits +pittance +pittances +pitted +pitting +pituitaries +pituitary +pity +pitying +pivot +pivotal +pivoted +pivoting +pivots +pixel +pixels +pixie +pixies +pixy +pizazz +pizza +pizzas +pizzazz +pizzeria +pizzerias +pizzicati +pizzicato +placard +placarded +placarding +placards +placate +placated +placates +placating +placation +placatory +place +placebo +placeboes +placebos +placed +placeholder +placeholders +placekick +placekicked +placekicker +placekickers +placekicking +placekicks +placement +placements +placenta +placentae +placental +placentas +placer +placers +places +placid +placidity +placidly +placing +placket +plackets +plagiarism +plagiarisms +plagiarist +plagiarists +plagiarize +plagiarized +plagiarizer +plagiarizers +plagiarizes +plagiarizing +plagiary +plague +plagued +plagues +plaguing +plaid +plaids +plain +plainclothes +plainclothesman +plainclothesmen +plainer +plainest +plainly +plainness +plains +plainsman +plainsmen +plainsong +plainspoken +plaint +plaintiff +plaintiffs +plaintive +plaintively +plaints +plait +plaited +plaiting +plaits +plan +plane +planed +planeload +planeloads +planer +planers +planes +planet +planetaria +planetarium +planetariums +planetary +planets +plangency +plangent +planing +plank +planked +planking +planks +plankton +planned +planner +planners +planning +plans +plant +plantain +plantains +plantar +plantation +plantations +planted +planter +planters +planting +plantings +plantlike +plants +plaque +plaques +plash +plashed +plashes +plashing +plasma +plaster +plasterboard +plastered +plasterer +plasterers +plastering +plasters +plastic +plasticity +plasticize +plasticized +plasticizes +plasticizing +plastics +plat +plate +plateau +plateaued +plateauing +plateaus +plateaux +plated +plateful +platefuls +platelet +platelets +platen +platens +plates +platform +platformed +platforming +platforms +platies +plating +platinum +platitude +platitudes +platitudinous +platonic +platoon +platooned +platooning +platoons +plats +platted +platter +platters +platting +platy +platypi +platypus +platypuses +platys +plaudit +plaudits +plausibility +plausible +plausibly +play +playable +playact +playacted +playacting +playacts +playback +playbacks +playbill +playbills +playbook +playbooks +playboy +playboys +played +player +players +playfellow +playfellows +playful +playfully +playfulness +playgirl +playgirls +playgoer +playgoers +playground +playgrounds +playhouse +playhouses +playing +playmate +playmates +playoff +playoffs +playpen +playpens +playroom +playrooms +plays +plaything +playthings +playtime +playwright +playwrights +plaza +plazas +plea +plead +pleaded +pleader +pleaders +pleading +pleadings +pleads +pleas +pleasant +pleasanter +pleasantest +pleasantly +pleasantness +pleasantries +pleasantry +please +pleased +pleases +pleasing +pleasingly +pleasurable +pleasurably +pleasure +pleasured +pleasureful +pleasures +pleasuring +pleat +pleated +pleating +pleats +plebe +plebeian +plebeians +plebes +plebiscite +plebiscites +plectra +plectrum +plectrums +pled +pledge +pledged +pledges +pledging +plenaries +plenary +plenipotentiaries +plenipotentiary +plenitude +plenitudes +plenteous +plentiful +plentifully +plenty +pleonasm +pleonasms +plethora +pleura +pleurae +pleurisy +plexiglass +plexus +plexuses +pliability +pliable +pliancy +pliant +plied +pliers +plies +plight +plighted +plighting +plights +plinth +plinths +plod +plodded +plodder +plodders +plodding +plods +plop +plopped +plopping +plops +plot +plots +plotted +plotter +plotters +plotting +plough +ploughed +ploughing +ploughs +plover +plovers +plow +plowed +plowing +plowman +plowmen +plows +plowshare +plowshares +ploy +ploys +pluck +plucked +pluckier +pluckiest +pluckily +pluckiness +plucking +plucks +plucky +plug +plugged +plugging +plugs +plum +plumage +plumb +plumbed +plumber +plumbers +plumbing +plumbs +plume +plumed +plumes +plumier +plumiest +pluming +plummet +plummeted +plummeting +plummets +plump +plumped +plumper +plumpest +plumping +plumply +plumpness +plumps +plums +plumy +plunder +plundered +plunderer +plunderers +plundering +plunders +plunge +plunged +plunger +plungers +plunges +plunging +plunk +plunked +plunking +plunks +pluperfect +pluperfects +plural +pluralism +pluralist +pluralistic +pluralists +pluralities +plurality +pluralization +pluralize +pluralized +pluralizes +pluralizing +plurals +plus +pluses +plush +plusher +plushest +plushier +plushiest +plushly +plushness +plushy +plusses +plutocracies +plutocracy +plutocrat +plutocratic +plutocrats +plutonium +pluvial +plying +plywood +pneumatic +pneumatically +pneumonia +poach +poached +poacher +poachers +poaches +poaching +pock +pocked +pocket +pocketbook +pocketbooks +pocketed +pocketful +pocketfuls +pocketing +pocketknife +pocketknives +pockets +pocketsful +pockmark +pockmarked +pockmarking +pockmarks +pocks +podded +podding +podia +podiatrist +podiatrists +podiatry +podium +podiums +pods +poem +poems +poesy +poet +poetaster +poetasters +poetess +poetesses +poetic +poetical +poetically +poetry +poets +pogrom +pogroms +poignancy +poignant +poignantly +poinciana +poincianas +poinsettia +poinsettias +point +pointblank +pointed +pointedly +pointer +pointers +pointier +pointiest +pointillism +pointillist +pointillists +pointing +pointless +pointlessly +pointlessness +points +pointy +poise +poised +poises +poising +poison +poisoned +poisoner +poisoners +poisoning +poisonings +poisonous +poisonously +poisons +poke +poked +poker +pokers +pokes +pokey +pokeys +pokier +pokiest +poking +poky +polar +polarities +polarity +polarization +polarize +polarized +polarizes +polarizing +pole +polecat +polecats +poled +polemic +polemical +polemically +polemicist +polemicists +polemics +poles +polestar +polestars +police +policed +policeman +policemen +polices +policewoman +policewomen +policies +policing +policy +policyholder +policyholders +poling +polio +poliomyelitis +polish +polished +polisher +polishers +polishes +polishing +politburo +politburos +polite +politely +politeness +politer +politesse +politest +politic +political +politically +politician +politicians +politicization +politicize +politicized +politicizes +politicizing +politicking +politico +politicoes +politicos +politics +polities +polity +polka +polkaed +polkaing +polkas +poll +pollack +pollacks +polled +pollen +pollinate +pollinated +pollinates +pollinating +pollination +pollinator +pollinators +polling +polliwog +polliwogs +pollock +pollocks +polls +pollster +pollsters +pollutant +pollutants +pollute +polluted +polluter +polluters +pollutes +polluting +pollution +pollywog +pollywogs +polo +polonaise +polonaises +polonium +pols +poltergeist +poltergeists +poltroon +poltroons +polyandrous +polyandry +polyclinic +polyclinics +polyester +polyesters +polyethylene +polygamist +polygamists +polygamous +polygamy +polyglot +polyglots +polygon +polygonal +polygons +polygraph +polygraphed +polygraphing +polygraphs +polyhedra +polyhedral +polyhedron +polyhedrons +polymath +polymaths +polymer +polymeric +polymerization +polymerize +polymerized +polymerizes +polymerizing +polymers +polynomial +polynomials +polyp +polyphonic +polyphony +polypropylene +polyps +polystyrene +polysyllabic +polysyllable +polysyllables +polytechnic +polytechnics +polytheism +polytheist +polytheistic +polytheists +polyunsaturated +polyurethane +polyurethanes +polyvinyl +pomade +pomaded +pomades +pomading +pomander +pomanders +pomegranate +pomegranates +pommel +pommeled +pommeling +pommelled +pommelling +pommels +pomp +pompadour +pompadours +pompano +pompanos +pompom +pompoms +pompon +pompons +pomposity +pompous +pompously +pompousness +poncho +ponchos +pond +ponder +pondered +ponderer +ponderers +pondering +ponderous +ponderously +ponderousness +ponders +ponds +pone +pones +pongee +poniard +poniards +ponies +pontiff +pontiffs +pontifical +pontifically +pontificate +pontificated +pontificates +pontificating +pontoon +pontoons +pony +ponytail +ponytails +pooch +pooches +poodle +poodles +poof +poofs +pooh +poohed +poohing +poohs +pool +pooled +pooling +poolroom +poolrooms +pools +poop +pooped +pooping +poops +poor +poorboy +poorboys +poorer +poorest +poorhouse +poorhouses +poorly +poorness +popcorn +pope +popes +popgun +popguns +popinjay +popinjays +poplar +poplars +poplin +popover +popovers +poppa +poppas +popped +popper +poppers +poppies +popping +poppy +poppycock +pops +populace +populaces +popular +popularity +popularization +popularize +popularized +popularizes +popularizing +popularly +populate +populated +populates +populating +population +populations +populism +populist +populists +populous +populousness +porcelain +porch +porches +porcine +porcupine +porcupines +pore +pored +pores +porgies +porgy +poring +pork +porker +porkers +porkier +porkies +porkiest +porky +porn +porno +pornographer +pornographers +pornographic +pornographically +pornography +porosity +porous +porousness +porphyritic +porphyry +porpoise +porpoised +porpoises +porpoising +porridge +porringer +porringers +port +portability +portable +portables +portage +portaged +portages +portaging +portal +portals +portcullis +portcullises +ported +portend +portended +portending +portends +portent +portentous +portentously +portents +porter +porterhouse +porterhouses +porters +portfolio +portfolios +porthole +portholes +portico +porticoes +porticos +portiere +portieres +porting +portion +portioned +portioning +portions +portlier +portliest +portliness +portly +portmanteau +portmanteaus +portmanteaux +portrait +portraitist +portraitists +portraits +portraiture +portray +portrayal +portrayals +portrayed +portraying +portrays +ports +portulaca +pose +posed +poser +posers +poses +poseur +poseurs +posh +posher +poshest +posies +posing +posit +posited +positing +position +positioned +positioning +positions +positive +positively +positiveness +positives +positron +positrons +posits +posse +posses +possess +possessed +possesses +possessing +possession +possessions +possessive +possessively +possessiveness +possessives +possessor +possessors +possibilities +possibility +possible +possibles +possibly +possum +possums +post +postage +postal +postcard +postcards +postconsonantal +postdate +postdated +postdates +postdating +postdoctoral +posted +poster +posterior +posteriors +posterity +posters +postgraduate +postgraduates +posthaste +posthumous +posthumously +posthypnotic +postilion +postilions +postillion +postillions +postindustrial +posting +postings +postlude +postludes +postman +postmark +postmarked +postmarking +postmarks +postmaster +postmasters +postmen +postmenopausal +postmeridian +postmistress +postmistresses +postmodern +postmodernism +postmodernist +postmodernists +postmortem +postmortems +postnasal +postnatal +postoperative +postpaid +postpartum +postpone +postponed +postponement +postponements +postpones +postponing +postprandial +posts +postscript +postscripts +postseason +postseasons +postulate +postulated +postulates +postulating +postulation +postulations +posture +postured +postures +posturing +posturings +postwar +posy +potability +potable +potables +potash +potassium +potato +potatoes +potbellied +potbellies +potbelly +potboiler +potboilers +potency +potent +potentate +potentates +potential +potentialities +potentiality +potentially +potently +potful +potfuls +pothead +potheads +pother +potherb +potherbs +pothered +pothering +pothers +potholder +potholders +pothole +potholed +potholes +potholing +pothook +pothooks +potion +potions +potluck +potlucks +potpie +potpies +potpourri +potpourris +pots +potsherd +potsherds +potshot +potshots +pottage +potted +potter +pottered +potteries +pottering +potters +pottery +pottier +potties +pottiest +potting +potty +pouch +pouched +pouches +pouching +poulterer +poulterers +poultice +poulticed +poultices +poulticing +poultry +pounce +pounced +pounces +pouncing +pound +poundage +pounded +pounding +poundings +pounds +pour +poured +pouring +pours +pout +pouted +pouter +pouters +pouting +pouts +poverty +powder +powdered +powdering +powders +powdery +power +powerboat +powerboats +powered +powerful +powerfully +powerhouse +powerhouses +powering +powerless +powerlessly +powerlessness +powers +powwow +powwowed +powwowing +powwows +poxes +practicability +practicable +practicably +practical +practicalities +practicality +practically +practicals +practice +practiced +practices +practicing +practicum +practicums +practise +practised +practises +practising +practitioner +practitioners +praetor +praetorian +praetors +pragmatic +pragmatical +pragmatically +pragmatics +pragmatism +pragmatist +pragmatists +prairie +prairies +praise +praised +praises +praiseworthier +praiseworthiest +praiseworthiness +praiseworthy +praising +praline +pralines +pram +prams +prance +pranced +prancer +prancers +prances +prancing +prancingly +prank +pranks +prankster +pranksters +praseodymium +prate +prated +prater +praters +prates +pratfall +pratfalls +prating +prattle +prattled +prattler +prattlers +prattles +prattling +prawn +prawned +prawning +prawns +pray +prayed +prayer +prayerful +prayerfully +prayers +praying +prays +preach +preached +preacher +preachers +preaches +preachier +preachiest +preaching +preachment +preachy +preadolescence +preadolescences +preamble +preambles +prearrange +prearranged +prearrangement +prearranges +prearranging +preassigned +precancel +precanceled +precanceling +precancelled +precancelling +precancels +precancerous +precarious +precariously +precariousness +precaution +precautionary +precautions +precede +preceded +precedence +precedent +precedents +precedes +preceding +precept +preceptor +preceptors +precepts +precinct +precincts +preciosity +precious +preciously +preciousness +precipice +precipices +precipitant +precipitants +precipitate +precipitated +precipitately +precipitates +precipitating +precipitation +precipitations +precipitous +precipitously +precis +precise +precised +precisely +preciseness +preciser +precises +precisest +precising +precision +preclude +precluded +precludes +precluding +preclusion +precocious +precociously +precociousness +precocity +precognition +precognitive +precolonial +preconceive +preconceived +preconceives +preconceiving +preconception +preconceptions +precondition +preconditioned +preconditioning +preconditions +precook +precooked +precooking +precooks +precursor +precursors +precursory +predate +predated +predates +predating +predator +predators +predatory +predawn +predecease +predeceased +predeceases +predeceasing +predecessor +predecessors +predesignate +predesignated +predesignates +predesignating +predestination +predestine +predestined +predestines +predestining +predetermination +predetermine +predetermined +predeterminer +predeterminers +predetermines +predetermining +predicable +predicament +predicaments +predicate +predicated +predicates +predicating +predication +predicative +predict +predictability +predictable +predictably +predicted +predicting +prediction +predictions +predictive +predictor +predictors +predicts +predigest +predigested +predigesting +predigests +predilection +predilections +predispose +predisposed +predisposes +predisposing +predisposition +predispositions +predominance +predominant +predominantly +predominate +predominated +predominates +predominating +preemie +preemies +preeminence +preeminent +preeminently +preempt +preempted +preempting +preemption +preemptive +preempts +preen +preened +preening +preens +preexist +preexisted +preexistence +preexisting +preexists +prefab +prefabbed +prefabbing +prefabricate +prefabricated +prefabricates +prefabricating +prefabrication +prefabs +preface +prefaced +prefaces +prefacing +prefatory +prefect +prefects +prefecture +prefectures +prefer +preferable +preferably +preference +preferences +preferential +preferentially +preferment +preferred +preferring +prefers +prefigure +prefigured +prefigures +prefiguring +prefix +prefixed +prefixes +prefixing +preform +preformed +preforming +preforms +pregame +pregames +pregnancies +pregnancy +pregnant +preheat +preheated +preheating +preheats +prehensile +prehistoric +prehistorical +prehistorically +prehistory +prejudge +prejudged +prejudges +prejudging +prejudgment +prejudgments +prejudice +prejudiced +prejudices +prejudicial +prejudicing +prekindergarten +prekindergartens +prelacy +prelate +prelates +prelim +preliminaries +preliminary +prelims +preliterate +prelude +preludes +premarital +premature +prematurely +premed +premedical +premeditate +premeditated +premeditates +premeditating +premeditation +premeds +premenstrual +premier +premiere +premiered +premieres +premiering +premiers +premiership +premierships +premise +premised +premises +premising +premiss +premisses +premium +premiums +premix +premixed +premixes +premixing +premolar +premolars +premonition +premonitions +premonitory +prenatal +prenatally +prenuptial +preoccupation +preoccupations +preoccupied +preoccupies +preoccupy +preoccupying +preoperative +preordain +preordained +preordaining +preordains +prep +prepackage +prepackaged +prepackages +prepackaging +prepaid +preparation +preparations +preparatory +prepare +prepared +preparedness +prepares +preparing +prepay +prepaying +prepayment +prepayments +prepays +preponderance +preponderances +preponderant +preponderantly +preponderate +preponderated +preponderates +preponderating +preposition +prepositional +prepositionally +prepositions +prepossess +prepossessed +prepossesses +prepossessing +prepossession +prepossessions +preposterous +preposterously +prepped +preppie +preppier +preppies +preppiest +prepping +preppy +preps +prepubescence +prepubescent +prepubescents +prepuce +prepuces +prequel +prequels +prerecord +prerecorded +prerecording +prerecords +preregister +preregistered +preregistering +preregisters +preregistration +prerequisite +prerequisites +prerogative +prerogatives +presage +presaged +presages +presaging +presbyopia +presbyter +presbyteries +presbyters +presbytery +preschool +preschooler +preschoolers +preschools +prescience +prescient +presciently +prescribe +prescribed +prescribes +prescribing +prescript +prescription +prescriptions +prescriptive +prescriptively +prescripts +preseason +preseasons +presence +presences +present +presentable +presentably +presentation +presentations +presented +presenter +presenters +presentiment +presentiments +presenting +presently +presentment +presentments +presents +preservable +preservation +preservationist +preservationists +preservative +preservatives +preserve +preserved +preserver +preservers +preserves +preserving +preset +presets +presetting +preshrank +preshrink +preshrinking +preshrinks +preshrunk +preshrunken +preside +presided +presidencies +presidency +president +presidential +presidents +presides +presidia +presiding +presidium +presidiums +presort +presorted +presorting +presorts +press +pressed +presser +pressers +presses +pressing +pressingly +pressings +pressman +pressmen +pressure +pressured +pressures +pressuring +pressurization +pressurize +pressurized +pressurizer +pressurizers +pressurizes +pressurizing +prestidigitation +prestige +prestigious +presto +prestos +presumable +presumably +presume +presumed +presumes +presuming +presumption +presumptions +presumptive +presumptuous +presumptuously +presumptuousness +presuppose +presupposed +presupposes +presupposing +presupposition +presuppositions +pretax +preteen +preteens +pretence +pretences +pretend +pretended +pretender +pretenders +pretending +pretends +pretense +pretenses +pretension +pretensions +pretentious +pretentiously +pretentiousness +preterit +preterite +preterites +preterits +preterm +preternatural +preternaturally +pretest +pretested +pretesting +pretests +pretext +pretexts +pretrial +prettied +prettier +pretties +prettiest +prettified +prettifies +prettify +prettifying +prettily +prettiness +pretty +prettying +pretzel +pretzels +prevail +prevailed +prevailing +prevails +prevalence +prevalent +prevaricate +prevaricated +prevaricates +prevaricating +prevarication +prevarications +prevaricator +prevaricators +prevent +preventable +preventative +preventatives +prevented +preventible +preventing +prevention +preventive +preventives +prevents +preview +previewed +previewing +previews +previous +previously +prevision +previsions +prevue +prevues +prewar +prey +preyed +preying +preys +priapic +price +priced +priceless +prices +pricey +pricier +priciest +pricing +prick +pricked +pricker +prickers +pricking +prickle +prickled +prickles +pricklier +prickliest +prickliness +prickling +prickly +pricks +pricy +pride +prided +prideful +pridefully +prides +priding +pried +prier +priers +pries +priest +priestess +priestesses +priesthood +priesthoods +priestlier +priestliest +priestliness +priestly +priests +prig +priggish +priggishness +prigs +prim +primacy +primaeval +primal +primaries +primarily +primary +primate +primates +prime +primed +primer +primers +primes +primeval +priming +primitive +primitively +primitiveness +primitives +primly +primmer +primmest +primness +primogenitor +primogenitors +primogeniture +primordial +primordially +primp +primped +primping +primps +primrose +primroses +prince +princedom +princedoms +princelier +princeliest +princeliness +princely +princes +princess +princesses +principal +principalities +principality +principally +principals +principle +principled +principles +print +printable +printed +printer +printers +printing +printings +printout +printouts +prints +prior +prioress +prioresses +priories +priorities +prioritize +prioritized +prioritizes +prioritizing +priority +priors +priory +prise +prised +prises +prising +prism +prismatic +prisms +prison +prisoner +prisoners +prisons +prissier +prissiest +prissily +prissiness +prissy +pristine +prithee +privacy +private +privateer +privateers +privately +privater +privates +privatest +privation +privations +privatization +privatizations +privatize +privatized +privatizes +privatizing +privet +privets +privier +privies +priviest +privilege +privileged +privileges +privileging +privily +privy +prize +prized +prizefight +prizefighter +prizefighters +prizefighting +prizefights +prizes +prizewinner +prizewinners +prizewinning +prizing +proactive +probabilities +probability +probable +probables +probably +probate +probated +probates +probating +probation +probational +probationary +probationer +probationers +probe +probed +probes +probing +probity +problem +problematic +problematical +problematically +problems +proboscides +proboscis +proboscises +procaine +procedural +procedure +procedures +proceed +proceeded +proceeding +proceedings +proceeds +process +processed +processes +processing +procession +processional +processionals +processioned +processioning +processions +processor +processors +proclaim +proclaimed +proclaiming +proclaims +proclamation +proclamations +proclivities +proclivity +proconsul +proconsular +proconsuls +procrastinate +procrastinated +procrastinates +procrastinating +procrastination +procrastinator +procrastinators +procreate +procreated +procreates +procreating +procreation +procreative +proctor +proctored +proctoring +proctors +procurable +procurator +procurators +procure +procured +procurement +procurer +procurers +procures +procuring +prod +prodded +prodding +prodigal +prodigality +prodigals +prodigies +prodigious +prodigiously +prodigy +prods +produce +produced +producer +producers +produces +producible +producing +product +production +productions +productive +productively +productiveness +productivity +products +prof +profanation +profanations +profane +profaned +profanely +profaneness +profanes +profaning +profanities +profanity +profess +professed +professedly +professes +professing +profession +professional +professionalism +professionalize +professionalized +professionalizes +professionalizing +professionally +professionals +professions +professor +professorial +professorially +professors +professorship +professorships +proffer +proffered +proffering +proffers +proficiency +proficient +proficiently +proficients +profile +profiled +profiles +profiling +profit +profitability +profitable +profitably +profited +profiteer +profiteered +profiteering +profiteers +profiterole +profiteroles +profiting +profitless +profits +profligacy +profligate +profligately +profligates +profound +profounder +profoundest +profoundly +profoundness +profs +profundities +profundity +profuse +profusely +profuseness +profuser +profusest +profusion +profusions +progenitor +progenitors +progeny +progesterone +prognathous +prognoses +prognosis +prognostic +prognosticate +prognosticated +prognosticates +prognosticating +prognostication +prognostications +prognosticator +prognosticators +prognostics +program +programed +programer +programers +programing +programmable +programmables +programmatic +programme +programmed +programmer +programmers +programmes +programming +programs +progress +progressed +progresses +progressing +progression +progressions +progressive +progressively +progressiveness +progressives +prohibit +prohibited +prohibiting +prohibition +prohibitionist +prohibitionists +prohibitions +prohibitive +prohibitively +prohibitory +prohibits +project +projected +projectile +projectiles +projecting +projection +projectionist +projectionists +projections +projector +projectors +projects +prolapse +prolapsed +prolapses +prolapsing +proletarian +proletarians +proletariat +proliferate +proliferated +proliferates +proliferating +proliferation +prolific +prolifically +prolix +prolixity +prolixly +prolog +prologs +prologue +prologues +prolong +prolongation +prolongations +prolonged +prolonging +prolongs +prom +promenade +promenaded +promenades +promenading +promethium +prominence +prominent +prominently +promiscuity +promiscuous +promiscuously +promise +promised +promises +promising +promisingly +promissory +promo +promoed +promoing +promontories +promontory +promos +promote +promoted +promoter +promoters +promotes +promoting +promotion +promotional +promotions +prompt +prompted +prompter +prompters +promptest +prompting +promptings +promptitude +promptly +promptness +prompts +proms +promulgate +promulgated +promulgates +promulgating +promulgation +promulgator +promulgators +prone +proneness +proner +pronest +prong +pronged +pronghorn +pronghorns +prongs +pronominal +pronominals +pronoun +pronounce +pronounceable +pronounced +pronouncement +pronouncements +pronounces +pronouncing +pronouns +pronto +pronuclear +pronunciation +pronunciations +proof +proofed +proofing +proofread +proofreader +proofreaders +proofreading +proofreads +proofs +prop +propaganda +propagandist +propagandists +propagandize +propagandized +propagandizes +propagandizing +propagate +propagated +propagates +propagating +propagation +propagator +propagators +propane +propel +propellant +propellants +propelled +propellent +propellents +propeller +propellers +propelling +propels +propensities +propensity +proper +properer +properest +properly +propertied +properties +property +prophecies +prophecy +prophesied +prophesier +prophesiers +prophesies +prophesy +prophesying +prophet +prophetess +prophetesses +prophetic +prophetical +prophetically +prophets +prophylactic +prophylactics +prophylaxis +propinquity +propitiate +propitiated +propitiates +propitiating +propitiation +propitiatory +propitious +propitiously +proponent +proponents +proportion +proportional +proportionally +proportionate +proportionately +proportioned +proportioning +proportions +proposal +proposals +propose +proposed +proposer +proposers +proposes +proposing +proposition +propositional +propositioned +propositioning +propositions +propound +propounded +propounding +propounds +propped +propping +proprietaries +proprietary +proprieties +proprietor +proprietorial +proprietors +proprietorship +proprietress +proprietresses +propriety +props +propulsion +propulsive +prorate +prorated +prorates +prorating +prorogation +prorogue +prorogued +prorogues +proroguing +pros +prosaic +prosaically +proscenia +proscenium +prosceniums +prosciutto +proscribe +proscribed +proscribes +proscribing +proscription +proscriptions +prose +prosecute +prosecuted +prosecutes +prosecuting +prosecution +prosecutions +prosecutor +prosecutors +proselyte +proselyted +proselytes +proselyting +proselytism +proselytize +proselytized +proselytizer +proselytizers +proselytizes +proselytizing +prosier +prosiest +prosodies +prosody +prospect +prospected +prospecting +prospective +prospectively +prospector +prospectors +prospects +prospectus +prospectuses +prosper +prospered +prospering +prosperity +prosperous +prosperously +prospers +prostate +prostates +prostheses +prosthesis +prosthetic +prostitute +prostituted +prostitutes +prostituting +prostitution +prostrate +prostrated +prostrates +prostrating +prostration +prostrations +prosy +protactinium +protagonist +protagonists +protean +protect +protected +protecting +protection +protectionism +protectionist +protectionists +protections +protective +protectively +protectiveness +protector +protectorate +protectorates +protectors +protects +protege +proteges +protein +proteins +protest +protestation +protestations +protested +protester +protesters +protesting +protestor +protestors +protests +protocol +protocols +proton +protons +protoplasm +protoplasmic +prototype +prototypes +prototypical +protozoa +protozoan +protozoans +protozoic +protozoon +protract +protracted +protracting +protraction +protractor +protractors +protracts +protrude +protruded +protrudes +protruding +protrusile +protrusion +protrusions +protuberance +protuberances +protuberant +proud +prouder +proudest +proudly +provability +provable +prove +proved +proven +provenance +provender +provenience +proverb +proverbial +proverbially +proverbs +proves +provide +provided +providence +provident +providential +providentially +providently +provider +providers +provides +providing +province +provinces +provincial +provincialism +provincially +provincials +proving +provision +provisional +provisionally +provisioned +provisioning +provisions +proviso +provisoes +provisos +provocation +provocations +provocative +provocatively +provocativeness +provoke +provoked +provoker +provokers +provokes +provoking +provokingly +provolone +provost +provosts +prow +prowess +prowl +prowled +prowler +prowlers +prowling +prowls +prows +proxies +proximate +proximity +proxy +prude +prudence +prudent +prudential +prudentially +prudently +prudery +prudes +prudish +prudishly +prudishness +prune +pruned +pruner +pruners +prunes +pruning +prurience +prurient +pryer +pryers +prying +psalm +psalmist +psalmists +psalms +psalteries +psaltery +pseudo +pseudonym +pseudonymous +pseudonyms +pseudoscience +pseudosciences +pshaw +pshaws +psis +psittacosis +psoriasis +psst +psych +psyche +psyched +psychedelic +psychedelically +psychedelics +psyches +psychiatric +psychiatrist +psychiatrists +psychiatry +psychic +psychical +psychically +psychics +psyching +psycho +psychoactive +psychoanalysis +psychoanalyst +psychoanalysts +psychoanalytic +psychoanalytical +psychoanalyze +psychoanalyzed +psychoanalyzes +psychoanalyzing +psychobabble +psychodrama +psychodramas +psychogenic +psychological +psychologically +psychologies +psychologist +psychologists +psychology +psychoneurosis +psychopath +psychopathic +psychopaths +psychopathy +psychos +psychoses +psychosis +psychosomatic +psychotherapies +psychotherapist +psychotherapists +psychotherapy +psychotic +psychotically +psychotics +psychotropic +psychotropics +psychs +ptarmigan +ptarmigans +pterodactyl +pterodactyls +ptomaine +ptomaines +pubertal +puberty +pubes +pubescence +pubescent +pubic +pubis +public +publican +publicans +publication +publications +publicist +publicists +publicity +publicize +publicized +publicizes +publicizing +publicly +publish +published +publisher +publishers +publishes +publishing +pubs +puce +puck +pucker +puckered +puckering +puckers +puckish +puckishly +puckishness +pucks +pudding +puddings +puddle +puddled +puddles +puddling +pudenda +pudendum +pudgier +pudgiest +pudginess +pudgy +pueblo +pueblos +puerile +puerility +puerperal +puff +puffball +puffballs +puffed +puffer +puffers +puffier +puffiest +puffin +puffiness +puffing +puffins +puffs +puffy +pugilism +pugilist +pugilistic +pugilists +pugnacious +pugnaciously +pugnaciousness +pugnacity +pugs +puke +puked +pukes +puking +pukka +pulchritude +pulchritudinous +pule +puled +pules +puling +pull +pullback +pullbacks +pulled +puller +pullers +pullet +pullets +pulley +pulleys +pulling +pullout +pullouts +pullover +pullovers +pulls +pullup +pullups +pulmonary +pulp +pulped +pulpier +pulpiest +pulpiness +pulping +pulpit +pulpits +pulps +pulpwood +pulpy +pulsar +pulsars +pulsate +pulsated +pulsates +pulsating +pulsation +pulsations +pulse +pulsed +pulses +pulsing +pulverization +pulverize +pulverized +pulverizes +pulverizing +puma +pumas +pumice +pummel +pummeled +pummeling +pummelled +pummelling +pummels +pump +pumped +pumper +pumpernickel +pumpers +pumping +pumpkin +pumpkins +pumps +punch +punched +puncheon +puncheons +puncher +punchers +punches +punchier +punchiest +punching +punchy +punctilio +punctilious +punctiliously +punctiliousness +punctual +punctuality +punctually +punctuate +punctuated +punctuates +punctuating +punctuation +puncture +punctured +punctures +puncturing +pundit +punditry +pundits +pungency +pungent +pungently +punier +puniest +puniness +punish +punishable +punished +punishes +punishing +punishment +punishments +punitive +punitively +punk +punker +punkest +punkin +punkins +punks +punned +punning +puns +punster +punsters +punt +punted +punter +punters +punting +punts +puny +pupa +pupae +pupal +pupas +pupil +pupils +pupped +puppet +puppeteer +puppeteers +puppetry +puppets +puppies +pupping +puppy +pups +purblind +purchasable +purchase +purchased +purchaser +purchasers +purchases +purchasing +purdah +pure +purebred +purebreds +puree +pureed +pureeing +purees +purely +pureness +purer +purest +purgative +purgatives +purgatorial +purgatories +purgatory +purge +purged +purger +purgers +purges +purging +purification +purified +purifier +purifiers +purifies +purify +purifying +purine +purines +purism +purist +puristic +purists +puritan +puritanical +puritanically +puritanism +puritans +purity +purl +purled +purlieu +purlieus +purling +purloin +purloined +purloining +purloins +purls +purple +purpler +purples +purplest +purplish +purport +purported +purportedly +purporting +purports +purpose +purposed +purposeful +purposefully +purposefulness +purposeless +purposelessly +purposely +purposes +purposing +purr +purred +purring +purrs +purse +pursed +purser +pursers +purses +pursing +pursuance +pursuant +pursue +pursued +pursuer +pursuers +pursues +pursuing +pursuit +pursuits +purulence +purulent +purvey +purveyance +purveyed +purveying +purveyor +purveyors +purveys +purview +push +pushcart +pushcarts +pushed +pusher +pushers +pushes +pushier +pushiest +pushily +pushiness +pushing +pushover +pushovers +pushup +pushups +pushy +pusillanimity +pusillanimous +pusillanimously +puss +pusses +pussier +pussies +pussiest +pussy +pussycat +pussycats +pussyfoot +pussyfooted +pussyfooting +pussyfoots +pustular +pustule +pustules +putative +putdown +putdowns +putout +putouts +putrefaction +putrefactive +putrefied +putrefies +putrefy +putrefying +putrescence +putrescent +putrid +puts +putsch +putsches +putt +putted +puttee +puttees +putter +puttered +putterer +putterers +puttering +putters +puttied +putties +putting +putts +putty +puttying +puzzle +puzzled +puzzlement +puzzler +puzzlers +puzzles +puzzling +pygmies +pygmy +pyjamas +pylon +pylons +pylori +pyloric +pylorus +pyorrhea +pyorrhoea +pyramid +pyramidal +pyramided +pyramiding +pyramids +pyre +pyres +pyrimidine +pyrimidines +pyrite +pyrites +pyromania +pyromaniac +pyromaniacs +pyrotechnic +pyrotechnical +pyrotechnics +python +pythons +pyxes +quack +quacked +quackery +quacking +quacks +quad +quadrangle +quadrangles +quadrangular +quadrant +quadrants +quadraphonic +quadratic +quadratics +quadrennia +quadrennial +quadrennium +quadrenniums +quadriceps +quadricepses +quadrilateral +quadrilaterals +quadrille +quadrilles +quadrillion +quadrillions +quadriplegia +quadriplegic +quadriplegics +quadrivium +quadruped +quadrupedal +quadrupeds +quadruple +quadrupled +quadruples +quadruplet +quadruplets +quadruplicate +quadruplicated +quadruplicates +quadruplicating +quadruplication +quadrupling +quads +quaff +quaffed +quaffing +quaffs +quagmire +quagmires +quahaug +quahaugs +quahog +quahogs +quail +quailed +quailing +quails +quaint +quainter +quaintest +quaintly +quaintness +quake +quaked +quakes +quakier +quakiest +quaking +quaky +qualification +qualifications +qualified +qualifier +qualifiers +qualifies +qualify +qualifying +qualitative +qualitatively +qualities +quality +qualm +qualmish +qualms +quandaries +quandary +quanta +quantifiable +quantification +quantified +quantifier +quantifiers +quantifies +quantify +quantifying +quantitative +quantitatively +quantities +quantity +quantum +quarantine +quarantined +quarantines +quarantining +quark +quarks +quarrel +quarreled +quarreler +quarrelers +quarreling +quarrelled +quarrelling +quarrels +quarrelsome +quarrelsomeness +quarried +quarries +quarry +quarrying +quart +quarter +quarterback +quarterbacked +quarterbacking +quarterbacks +quarterdeck +quarterdecks +quartered +quarterfinal +quarterfinals +quartering +quarterlies +quarterly +quartermaster +quartermasters +quarters +quarterstaff +quarterstaffs +quarterstaves +quartet +quartets +quartette +quartettes +quarto +quartos +quarts +quartz +quasar +quasars +quash +quashed +quashes +quashing +quasi +quatrain +quatrains +quaver +quavered +quavering +quavers +quavery +quay +quays +queasier +queasiest +queasily +queasiness +queasy +queen +queened +queening +queenlier +queenliest +queenly +queens +queer +queered +queerer +queerest +queering +queerly +queerness +queers +quell +quelled +quelling +quells +quench +quenchable +quenched +quencher +quenchers +quenches +quenching +quenchless +queried +queries +querulous +querulously +querulousness +query +querying +quest +quested +questing +question +questionable +questionably +questioned +questioner +questioners +questioning +questioningly +questionings +questionnaire +questionnaires +questions +quests +queue +queued +queueing +queues +queuing +quibble +quibbled +quibbler +quibblers +quibbles +quibbling +quiche +quiches +quick +quicken +quickened +quickening +quickens +quicker +quickest +quickie +quickies +quicklime +quickly +quickness +quicksand +quicksands +quicksilver +quickstep +quicksteps +quid +quids +quiescence +quiescent +quiescently +quiet +quieted +quieter +quietest +quieting +quietly +quietness +quiets +quietude +quietus +quietuses +quill +quills +quilt +quilted +quilter +quilters +quilting +quilts +quince +quinces +quinine +quinsy +quint +quintessence +quintessences +quintessential +quintessentially +quintet +quintets +quintette +quintettes +quints +quintuple +quintupled +quintuples +quintuplet +quintuplets +quintupling +quip +quipped +quipping +quips +quipster +quipsters +quire +quires +quirk +quirked +quirkier +quirkiest +quirkiness +quirking +quirks +quirky +quirt +quirts +quisling +quislings +quit +quitclaim +quitclaims +quite +quits +quittance +quitted +quitter +quitters +quitting +quiver +quivered +quivering +quivers +quivery +quixotic +quixotically +quiz +quizzed +quizzer +quizzers +quizzes +quizzical +quizzically +quizzing +quoin +quoins +quoit +quoited +quoiting +quoits +quondam +quorum +quorums +quota +quotability +quotable +quotas +quotation +quotations +quote +quoted +quotes +quoth +quotidian +quotient +quotients +quoting +qwerty +rabbet +rabbeted +rabbeting +rabbets +rabbi +rabbinate +rabbinic +rabbinical +rabbis +rabbit +rabbits +rabble +rabbles +rabid +rabidly +rabidness +rabies +raccoon +raccoons +race +racecourse +racecourses +raced +racehorse +racehorses +raceme +racemes +racer +racers +races +racetrack +racetracks +raceway +raceways +racial +racialism +racialist +racialists +racially +racier +raciest +racily +raciness +racing +racism +racist +racists +rack +racked +racket +racketed +racketeer +racketeered +racketeering +racketeers +racketing +rackets +racking +racks +raconteur +raconteurs +racoon +racoons +racquet +racquetball +racquetballs +racquets +racy +radar +radars +radarscope +radarscopes +radial +radially +radials +radiance +radiant +radiantly +radiate +radiated +radiates +radiating +radiation +radiations +radiator +radiators +radical +radicalism +radicalization +radicalize +radicalized +radicalizes +radicalizing +radically +radicals +radicchio +radii +radio +radioactive +radioactively +radioactivity +radiocarbon +radioed +radiogram +radiograms +radiographer +radiographers +radiography +radioing +radioisotope +radioisotopes +radiologist +radiologists +radiology +radioman +radiomen +radiometer +radiometers +radiometric +radiometry +radiophone +radiophones +radios +radioscopy +radiosonde +radiosondes +radiotelegraph +radiotelegraphed +radiotelegraphing +radiotelegraphs +radiotelegraphy +radiotelephone +radiotelephones +radiotherapist +radiotherapists +radiotherapy +radish +radishes +radium +radius +radiuses +radon +rads +raffia +raffish +raffishly +raffishness +raffle +raffled +raffles +raffling +raft +rafted +rafter +rafters +rafting +rafts +raga +ragamuffin +ragamuffins +ragas +ragbag +rage +raged +rages +ragged +raggeder +raggedest +raggedier +raggediest +raggedly +raggedness +raggedy +ragging +raging +ragingly +raglan +raglans +ragout +ragouts +rags +ragtag +ragtime +ragweed +raid +raided +raider +raiders +raiding +raids +rail +railed +railing +railings +railleries +raillery +railroad +railroaded +railroader +railroaders +railroading +railroads +rails +railway +railways +raiment +rain +rainbow +rainbows +raincoat +raincoats +raindrop +raindrops +rained +rainfall +rainfalls +rainier +rainiest +raining +rainmaker +rainmakers +rainmaking +rainproof +rains +rainstorm +rainstorms +rainwater +rainy +raise +raised +raiser +raisers +raises +raisin +raising +raisins +raja +rajah +rajahs +rajas +rake +raked +rakes +raking +rakish +rakishly +rakishness +rallied +rallies +rally +rallying +ramble +rambled +rambler +ramblers +rambles +rambling +rambunctious +rambunctiously +rambunctiousness +ramekin +ramekins +ramequin +ramequins +ramie +ramification +ramifications +ramified +ramifies +ramify +ramifying +ramjet +ramjets +rammed +ramming +ramp +rampage +rampaged +rampages +rampaging +rampancy +rampant +rampantly +rampart +ramparts +ramps +ramrod +ramrodded +ramrodding +ramrods +rams +ramshackle +ranch +ranched +rancher +ranchers +ranches +ranching +rancid +rancidity +rancidness +rancor +rancorous +rancorously +rancour +rand +randier +randiest +randiness +random +randomization +randomize +randomized +randomizes +randomizing +randomly +randomness +randy +ranee +ranees +rang +range +ranged +ranger +rangers +ranges +rangier +rangiest +ranginess +ranging +rangy +rani +ranis +rank +ranked +ranker +rankest +ranking +rankings +rankle +rankled +rankles +rankling +rankly +rankness +ranks +ransack +ransacked +ransacking +ransacks +ransom +ransomed +ransomer +ransomers +ransoming +ransoms +rant +ranted +ranter +ranters +ranting +rants +rapacious +rapaciously +rapaciousness +rapacity +rape +raped +raper +rapers +rapes +rapeseed +rapid +rapider +rapidest +rapidity +rapidly +rapidness +rapids +rapier +rapiers +rapine +raping +rapist +rapists +rapped +rappel +rappelled +rappelling +rappels +rapper +rappers +rapping +rapport +rapports +rapprochement +rapprochements +raps +rapscallion +rapscallions +rapt +raptly +raptness +rapture +raptures +rapturous +rapturously +rare +rarebit +rarebits +rared +rarefaction +rarefied +rarefies +rarefy +rarefying +rarely +rareness +rarer +rares +rarest +raring +rarities +rarity +rascal +rascally +rascals +rash +rasher +rashers +rashes +rashest +rashly +rashness +rasp +raspberries +raspberry +rasped +raspier +raspiest +rasping +rasps +raspy +ratatouille +ratchet +ratcheted +ratcheting +ratchets +rate +rated +rater +raters +rates +rather +rathskeller +rathskellers +ratification +ratified +ratifier +ratifiers +ratifies +ratify +ratifying +rating +ratings +ratio +ratiocinate +ratiocinated +ratiocinates +ratiocinating +ratiocination +ration +rational +rationale +rationales +rationalism +rationalist +rationalistic +rationalists +rationality +rationalization +rationalizations +rationalize +rationalized +rationalizes +rationalizing +rationally +rationals +rationed +rationing +rations +ratios +ratlike +ratlin +ratline +ratlines +ratlins +rats +rattan +rattans +ratted +ratter +ratters +rattier +rattiest +ratting +rattle +rattlebrain +rattlebrained +rattlebrains +rattled +rattler +rattlers +rattles +rattlesnake +rattlesnakes +rattletrap +rattletraps +rattling +rattly +rattrap +rattraps +ratty +raucous +raucously +raucousness +raunchier +raunchiest +raunchily +raunchiness +raunchy +ravage +ravaged +ravager +ravagers +ravages +ravaging +rave +raved +ravel +raveled +raveling +ravelled +ravelling +ravels +raven +ravened +ravening +ravenous +ravenously +ravens +raves +ravine +ravines +raving +ravings +ravioli +raviolis +ravish +ravished +ravisher +ravishers +ravishes +ravishing +ravishingly +ravishment +rawboned +rawer +rawest +rawhide +rawness +rayon +rays +raze +razed +razes +razing +razor +razorback +razorbacks +razors +razz +razzed +razzes +razzing +razzmatazz +reabsorb +reabsorbed +reabsorbing +reabsorbs +reach +reachable +reached +reaches +reaching +reacquaint +reacquainted +reacquainting +reacquaints +reacquire +reacquired +reacquires +reacquiring +react +reactant +reactants +reacted +reacting +reaction +reactionaries +reactionary +reactions +reactivate +reactivated +reactivates +reactivating +reactivation +reactive +reactor +reactors +reacts +read +readabilities +readability +readable +readdress +readdressed +readdresses +readdressing +reader +readers +readership +readerships +readied +readier +readies +readiest +readily +readiness +reading +readings +readjust +readjusted +readjusting +readjustment +readjustments +readjusts +readmission +readmit +readmits +readmitted +readmitting +readopt +readopted +readopting +readopts +readout +readouts +reads +ready +readying +reaffirm +reaffirmation +reaffirmations +reaffirmed +reaffirming +reaffirms +reagent +reagents +real +realer +reales +realest +realign +realigned +realigning +realignment +realignments +realigns +realism +realist +realistic +realistically +realists +realities +reality +realizable +realization +realize +realized +realizes +realizing +reallocate +reallocated +reallocates +reallocating +reallocation +really +realm +realms +realness +realpolitik +realtor +realtors +realty +ream +reamed +reamer +reamers +reaming +reams +reanalyses +reanalysis +reanalyze +reanalyzed +reanalyzes +reanalyzing +reanimate +reanimated +reanimates +reanimating +reanimation +reap +reaped +reaper +reapers +reaping +reappear +reappearance +reappearances +reappeared +reappearing +reappears +reapplication +reapplications +reapplied +reapplies +reapply +reapplying +reappoint +reappointed +reappointing +reappointment +reappoints +reapportion +reapportioned +reapportioning +reapportionment +reapportions +reappraisal +reappraisals +reappraise +reappraised +reappraises +reappraising +reaps +rear +reared +rearguard +rearguards +rearing +rearm +rearmament +rearmed +rearming +rearmost +rearms +rearrange +rearranged +rearrangement +rearrangements +rearranges +rearranging +rearrest +rearrested +rearresting +rearrests +rears +rearward +rearwards +reascend +reascended +reascending +reascends +reason +reasonable +reasonableness +reasonably +reasoned +reasoner +reasoners +reasoning +reasons +reassemble +reassembled +reassembles +reassembling +reassembly +reassert +reasserted +reasserting +reassertion +reasserts +reassess +reassessed +reassesses +reassessing +reassessment +reassessments +reassign +reassigned +reassigning +reassignment +reassignments +reassigns +reassurance +reassurances +reassure +reassured +reassures +reassuring +reassuringly +reattach +reattached +reattaches +reattaching +reattachment +reattain +reattained +reattaining +reattains +reattempt +reattempted +reattempting +reattempts +reauthorize +reauthorized +reauthorizes +reauthorizing +reawaken +reawakened +reawakening +reawakens +rebate +rebated +rebates +rebating +rebel +rebelled +rebelling +rebellion +rebellions +rebellious +rebelliously +rebelliousness +rebels +rebid +rebidding +rebids +rebind +rebinding +rebinds +rebirth +rebirths +reboil +reboiled +reboiling +reboils +reboot +rebooted +rebooting +reboots +reborn +rebound +rebounded +rebounding +rebounds +rebroadcast +rebroadcasted +rebroadcasting +rebroadcasts +rebuff +rebuffed +rebuffing +rebuffs +rebuild +rebuilding +rebuilds +rebuilt +rebuke +rebuked +rebukes +rebuking +rebukingly +reburial +reburials +reburied +reburies +rebury +reburying +rebus +rebuses +rebut +rebuts +rebuttal +rebuttals +rebutted +rebutting +recalcitrance +recalcitrant +recalculate +recalculated +recalculates +recalculating +recalculation +recalculations +recall +recalled +recalling +recalls +recant +recantation +recantations +recanted +recanting +recants +recap +recapitalize +recapitalized +recapitalizes +recapitalizing +recapitulate +recapitulated +recapitulates +recapitulating +recapitulation +recapitulations +recapped +recapping +recaps +recapture +recaptured +recaptures +recapturing +recast +recasting +recastings +recasts +recede +receded +recedes +receding +receipt +receipted +receipting +receipts +receivable +receivables +receive +received +receiver +receivers +receivership +receives +receiving +recent +recenter +recentest +recently +recentness +receptacle +receptacles +reception +receptionist +receptionists +receptions +receptive +receptively +receptiveness +receptivity +receptor +receptors +recess +recessed +recesses +recessing +recession +recessional +recessionals +recessionary +recessions +recessive +recessives +recharge +rechargeable +recharged +recharges +recharging +recharter +rechartered +rechartering +recharters +recheck +rechecked +rechecking +rechecks +recherche +rechristen +rechristened +rechristening +rechristens +recidivism +recidivist +recidivists +recipe +recipes +recipient +recipients +reciprocal +reciprocally +reciprocals +reciprocate +reciprocated +reciprocates +reciprocating +reciprocation +reciprocity +recirculate +recirculated +recirculates +recirculating +recital +recitalist +recitalists +recitals +recitation +recitations +recitative +recitatives +recite +recited +reciter +reciters +recites +reciting +reckless +recklessly +recklessness +reckon +reckoned +reckoning +reckonings +reckons +reclaim +reclaimable +reclaimed +reclaiming +reclaims +reclamation +reclassification +reclassified +reclassifies +reclassify +reclassifying +recline +reclined +recliner +recliners +reclines +reclining +recluse +recluses +reclusive +recognition +recognizable +recognizably +recognizance +recognize +recognized +recognizes +recognizing +recoil +recoiled +recoiling +recoils +recollect +recollected +recollecting +recollection +recollections +recollects +recolonization +recolonize +recolonized +recolonizes +recolonizing +recolor +recolored +recoloring +recolors +recombine +recombined +recombines +recombining +recommence +recommenced +recommencement +recommences +recommencing +recommend +recommendable +recommendation +recommendations +recommended +recommending +recommends +recommission +recommissioned +recommissioning +recommissions +recommit +recommits +recommitted +recommitting +recompense +recompensed +recompenses +recompensing +recompose +recomposed +recomposes +recomposing +recompute +recomputed +recomputes +recomputing +reconcilable +reconcile +reconciled +reconciles +reconciliation +reconciliations +reconciling +recondite +recondition +reconditioned +reconditioning +reconditions +reconfirm +reconfirmation +reconfirmations +reconfirmed +reconfirming +reconfirms +reconnaissance +reconnaissances +reconnect +reconnected +reconnecting +reconnects +reconnoiter +reconnoitered +reconnoitering +reconnoiters +reconnoitre +reconnoitred +reconnoitres +reconnoitring +reconquer +reconquered +reconquering +reconquers +reconquest +reconsecrate +reconsecrated +reconsecrates +reconsecrating +reconsecration +reconsider +reconsideration +reconsidered +reconsidering +reconsiders +reconsign +reconsigned +reconsigning +reconsigns +reconstitute +reconstituted +reconstitutes +reconstituting +reconstitution +reconstruct +reconstructed +reconstructing +reconstruction +reconstructions +reconstructs +recontact +recontacted +recontacting +recontacts +recontaminate +recontaminated +recontaminates +recontaminating +reconvene +reconvened +reconvenes +reconvening +reconvert +reconverted +reconverting +reconverts +recook +recooked +recooking +recooks +recopied +recopies +recopy +recopying +record +recorded +recorder +recorders +recording +recordings +records +recount +recounted +recounting +recounts +recoup +recouped +recouping +recoups +recourse +recover +recoverable +recovered +recoveries +recovering +recovers +recovery +recreant +recreants +recreate +recreated +recreates +recreating +recreation +recreational +recreations +recriminate +recriminated +recriminates +recriminating +recrimination +recriminations +recriminatory +recross +recrossed +recrosses +recrossing +recrudesce +recrudesced +recrudescence +recrudescent +recrudesces +recrudescing +recruit +recruited +recruiter +recruiters +recruiting +recruitment +recruits +recrystallize +recrystallized +recrystallizes +recrystallizing +recta +rectal +rectally +rectangle +rectangles +rectangular +rectifiable +rectification +rectifications +rectified +rectifier +rectifiers +rectifies +rectify +rectifying +rectilinear +rectitude +recto +rector +rectories +rectors +rectory +rectos +rectum +rectums +recumbent +recuperate +recuperated +recuperates +recuperating +recuperation +recuperative +recur +recurred +recurrence +recurrences +recurrent +recurrently +recurring +recurs +recyclable +recyclables +recycle +recycled +recycles +recycling +redact +redacted +redacting +redaction +redactor +redactors +redacts +redbird +redbirds +redbreast +redbreasts +redcap +redcaps +redcoat +redcoats +redden +reddened +reddening +reddens +redder +reddest +reddish +redecorate +redecorated +redecorates +redecorating +redecoration +rededicate +rededicated +rededicates +rededicating +redeem +redeemable +redeemed +redeemer +redeemers +redeeming +redeems +redefine +redefined +redefines +redefining +redefinition +redeliver +redelivered +redelivering +redelivers +redemption +redemptive +redeploy +redeployed +redeploying +redeployment +redeploys +redeposit +redeposited +redepositing +redeposits +redesign +redesigned +redesigning +redesigns +redetermine +redetermined +redetermines +redetermining +redevelop +redeveloped +redeveloping +redevelopment +redevelopments +redevelops +redhead +redheaded +redheads +redial +redialed +redialing +redialled +redialling +redials +redid +redirect +redirected +redirecting +redirects +rediscover +rediscovered +rediscovering +rediscovers +rediscovery +redissolve +redissolved +redissolves +redissolving +redistribute +redistributed +redistributes +redistributing +redistribution +redistrict +redistricted +redistricting +redistricts +redivide +redivided +redivides +redividing +redlining +redneck +rednecks +redness +redo +redoes +redoing +redolence +redolent +redone +redouble +redoubled +redoubles +redoubling +redoubt +redoubtable +redoubtably +redoubts +redound +redounded +redounding +redounds +redraft +redrafted +redrafting +redrafts +redraw +redrawing +redrawn +redraws +redress +redressed +redresses +redressing +redrew +reds +redskin +redskins +reduce +reduced +reducer +reducers +reduces +reducible +reducing +reduction +reductions +reductive +redundancies +redundancy +redundant +redundantly +reduplicate +reduplicated +reduplicates +reduplicating +reduplication +redwood +redwoods +redye +redyed +redyeing +redyes +reecho +reechoed +reechoes +reechoing +reed +reedier +reediest +reediness +reedit +reedited +reediting +reedits +reeds +reeducate +reeducated +reeducates +reeducating +reeducation +reedy +reef +reefed +reefer +reefers +reefing +reefs +reek +reeked +reeking +reeks +reel +reelect +reelected +reelecting +reelection +reelections +reelects +reeled +reeling +reels +reembark +reembarked +reembarking +reembarks +reembodied +reembodies +reembody +reembodying +reemerge +reemerged +reemergence +reemerges +reemerging +reemphasize +reemphasized +reemphasizes +reemphasizing +reemploy +reemployed +reemploying +reemployment +reemploys +reenact +reenacted +reenacting +reenactment +reenactments +reenacts +reenforce +reenforced +reenforces +reenforcing +reengage +reengaged +reengages +reengaging +reenlist +reenlisted +reenlisting +reenlistment +reenlists +reenter +reentered +reentering +reenters +reentries +reentry +reequip +reequipped +reequipping +reequips +reestablish +reestablished +reestablishes +reestablishing +reestablishment +reevaluate +reevaluated +reevaluates +reevaluating +reevaluation +reevaluations +reeve +reeved +reeves +reeving +reexamination +reexaminations +reexamine +reexamined +reexamines +reexamining +reexplain +reexplained +reexplaining +reexplains +reexport +reexported +reexporting +reexports +reface +refaced +refaces +refacing +refashion +refashioned +refashioning +refashions +refasten +refastened +refastening +refastens +refection +refectories +refectory +refer +referable +referee +refereed +refereeing +referees +reference +referenced +references +referencing +referenda +referendum +referendums +referent +referents +referral +referrals +referred +referrer +referrers +referring +refers +reffed +reffing +refile +refiled +refiles +refiling +refill +refillable +refilled +refilling +refills +refinance +refinanced +refinances +refinancing +refine +refined +refinement +refinements +refiner +refineries +refiners +refinery +refines +refining +refinish +refinished +refinishes +refinishing +refit +refits +refitted +refitting +reflect +reflected +reflecting +reflection +reflections +reflective +reflectively +reflector +reflectors +reflects +reflex +reflexes +reflexion +reflexions +reflexive +reflexively +reflexives +refocus +refocused +refocuses +refocusing +refocussed +refocusses +refocussing +refold +refolded +refolding +refolds +reforest +reforestation +reforested +reforesting +reforests +reforge +reforged +reforges +reforging +reform +reformation +reformations +reformative +reformatories +reformatory +reformed +reformer +reformers +reforming +reforms +reformulate +reformulated +reformulates +reformulating +reformulation +reformulations +refortified +refortifies +refortify +refortifying +refract +refracted +refracting +refraction +refractive +refractories +refractory +refracts +refrain +refrained +refraining +refrains +refreeze +refreezes +refreezing +refresh +refreshed +refresher +refreshers +refreshes +refreshing +refreshingly +refreshment +refreshments +refrigerant +refrigerants +refrigerate +refrigerated +refrigerates +refrigerating +refrigeration +refrigerator +refrigerators +refroze +refrozen +refs +refuel +refueled +refueling +refuelled +refuelling +refuels +refuge +refugee +refugees +refuges +refulgence +refulgent +refund +refundable +refunded +refunding +refunds +refurbish +refurbished +refurbishes +refurbishing +refurbishment +refurbishments +refurnish +refurnished +refurnishes +refurnishing +refusal +refusals +refuse +refused +refuses +refusing +refutable +refutation +refutations +refute +refuted +refuter +refuters +refutes +refuting +regain +regained +regaining +regains +regal +regale +regaled +regalement +regales +regalia +regaling +regally +regard +regarded +regarding +regardless +regards +regather +regathered +regathering +regathers +regatta +regattas +regencies +regency +regeneracy +regenerate +regenerated +regenerates +regenerating +regeneration +regenerative +regent +regents +reggae +regicide +regicides +regime +regimen +regimens +regiment +regimental +regimentation +regimented +regimenting +regiments +regimes +region +regional +regionalism +regionalisms +regionally +regions +register +registered +registering +registers +registrant +registrants +registrar +registrars +registration +registrations +registries +registry +regnant +regrade +regraded +regrades +regrading +regress +regressed +regresses +regressing +regression +regressions +regressive +regret +regretful +regretfully +regrets +regrettable +regrettably +regretted +regretting +regrew +regrind +regrinding +regrinds +reground +regroup +regrouped +regrouping +regroups +regrow +regrowing +regrown +regrows +regrowth +regular +regularise +regularised +regularises +regularising +regularity +regularization +regularize +regularized +regularizes +regularizing +regularly +regulars +regulate +regulated +regulates +regulating +regulation +regulations +regulative +regulator +regulators +regulatory +regurgitate +regurgitated +regurgitates +regurgitating +regurgitation +rehab +rehabbed +rehabbing +rehabilitate +rehabilitated +rehabilitates +rehabilitating +rehabilitation +rehabilitative +rehabs +rehang +rehanged +rehanging +rehangs +rehash +rehashed +rehashes +rehashing +rehear +reheard +rehearing +rehearings +rehears +rehearsal +rehearsals +rehearse +rehearsed +rehearses +rehearsing +reheat +reheated +reheating +reheats +rehire +rehired +rehires +rehiring +rehouse +rehoused +rehouses +rehousing +rehung +reign +reigned +reigning +reignite +reignited +reignites +reigniting +reigns +reimbursable +reimburse +reimbursed +reimbursement +reimbursements +reimburses +reimbursing +reimpose +reimposed +reimposes +reimposing +rein +reincarnate +reincarnated +reincarnates +reincarnating +reincarnation +reincarnations +reincorporate +reincorporated +reincorporates +reincorporating +reincorporation +reindeer +reindeers +reined +reinfect +reinfected +reinfecting +reinfection +reinfections +reinfects +reinforce +reinforced +reinforcement +reinforcements +reinforces +reinforcing +reining +reinoculate +reinoculated +reinoculates +reinoculating +reins +reinsert +reinserted +reinserting +reinsertion +reinserts +reinspect +reinspected +reinspecting +reinspects +reinstate +reinstated +reinstatement +reinstates +reinstating +reintegrate +reintegrated +reintegrates +reintegrating +reintegration +reinterpret +reinterpretation +reinterpretations +reinterpreted +reinterpreting +reinterprets +reintroduce +reintroduced +reintroduces +reintroducing +reintroduction +reinvent +reinvented +reinventing +reinvention +reinventions +reinvents +reinvest +reinvested +reinvesting +reinvestment +reinvests +reinvigorate +reinvigorated +reinvigorates +reinvigorating +reissue +reissued +reissues +reissuing +reiterate +reiterated +reiterates +reiterating +reiteration +reiterations +reiterative +reject +rejected +rejecting +rejection +rejections +rejects +rejoice +rejoiced +rejoices +rejoicing +rejoicings +rejoin +rejoinder +rejoinders +rejoined +rejoining +rejoins +rejudge +rejudged +rejudges +rejudging +rejuvenate +rejuvenated +rejuvenates +rejuvenating +rejuvenation +rekindle +rekindled +rekindles +rekindling +relabel +relabeled +relabeling +relabelled +relabelling +relabels +relaid +relapse +relapsed +relapses +relapsing +relate +related +relatedness +relater +relaters +relates +relating +relation +relational +relations +relationship +relationships +relative +relatively +relatives +relativism +relativity +relaunch +relaunched +relaunches +relaunching +relax +relaxant +relaxants +relaxation +relaxations +relaxed +relaxer +relaxers +relaxes +relaxing +relay +relayed +relaying +relays +relearn +relearned +relearning +relearns +release +released +releases +releasing +relegate +relegated +relegates +relegating +relegation +relent +relented +relenting +relentless +relentlessly +relentlessness +relents +relevance +relevancy +relevant +relevantly +reliability +reliable +reliably +reliance +reliant +relic +relics +relied +relief +reliefs +relies +relieve +relieved +reliever +relievers +relieves +relieving +relight +relighted +relighting +relights +religion +religions +religious +religiously +religiousness +reline +relined +relines +relining +relinquish +relinquished +relinquishes +relinquishing +relinquishment +reliquaries +reliquary +relish +relished +relishes +relishing +relit +relivable +relive +relived +relives +reliving +reload +reloaded +reloading +reloads +relocate +relocated +relocates +relocating +relocation +reluctance +reluctant +reluctantly +rely +relying +remade +remain +remainder +remainders +remained +remaining +remains +remake +remakes +remaking +remand +remanded +remanding +remands +remap +remapped +remapping +remaps +remark +remarkable +remarkableness +remarkably +remarked +remarking +remarks +remarriage +remarriages +remarried +remarries +remarry +remarrying +rematch +rematches +remeasure +remeasured +remeasures +remeasuring +remediable +remedial +remedially +remediation +remedied +remedies +remedy +remedying +remelt +remelted +remelting +remelts +remember +remembered +remembering +remembers +remembrance +remembrances +remigrate +remigrated +remigrates +remigrating +remind +reminded +reminder +reminders +reminding +reminds +reminisce +reminisced +reminiscence +reminiscences +reminiscent +reminiscently +reminisces +reminiscing +remiss +remission +remissions +remissly +remissness +remit +remits +remittance +remittances +remitted +remitting +remix +remixed +remixes +remixing +remnant +remnants +remodel +remodeled +remodeling +remodelled +remodelling +remodels +remold +remolded +remolding +remolds +remonstrance +remonstrances +remonstrant +remonstrants +remonstrate +remonstrated +remonstrates +remonstrating +remorse +remorseful +remorsefully +remorseless +remorselessly +remorselessness +remote +remotely +remoteness +remoter +remotes +remotest +remount +remounted +remounting +remounts +removable +removal +removals +remove +removed +remover +removers +removes +removing +rems +remunerate +remunerated +remunerates +remunerating +remuneration +remunerations +remunerative +renaissance +renaissances +renal +rename +renamed +renames +renaming +renascence +renascences +renascent +rend +render +rendered +rendering +renderings +renders +rendezvous +rendezvoused +rendezvouses +rendezvousing +rending +rendition +renditions +rends +renegade +renegades +renege +reneged +reneger +renegers +reneges +reneging +renegotiable +renegotiate +renegotiated +renegotiates +renegotiating +renegotiation +renew +renewable +renewal +renewals +renewed +renewing +renews +rennet +rennin +renominate +renominated +renominates +renominating +renomination +renounce +renounced +renouncement +renounces +renouncing +renovate +renovated +renovates +renovating +renovation +renovations +renovator +renovators +renown +renowned +rent +rental +rentals +rented +renter +renters +renting +rents +renumber +renumbered +renumbering +renumbers +renunciation +renunciations +reoccupation +reoccupied +reoccupies +reoccupy +reoccupying +reoccur +reoccurred +reoccurring +reoccurs +reopen +reopened +reopening +reopens +reorder +reordered +reordering +reorders +reorganization +reorganizations +reorganize +reorganized +reorganizes +reorganizing +reorient +reorientation +reoriented +reorienting +reorients +repack +repackage +repackaged +repackages +repackaging +repacked +repacking +repacks +repaid +repaint +repainted +repainting +repaints +repair +repairable +repaired +repairer +repairers +repairing +repairman +repairmen +repairs +reparable +reparation +reparations +repartee +repast +repasts +repatriate +repatriated +repatriates +repatriating +repatriation +repave +repaved +repaves +repaving +repay +repayable +repaying +repayment +repayments +repays +repeal +repealed +repealing +repeals +repeat +repeatable +repeated +repeatedly +repeater +repeaters +repeating +repeats +repel +repellant +repellants +repelled +repellent +repellents +repelling +repels +repent +repentance +repentant +repentantly +repented +repenting +repents +repercussion +repercussions +repertoire +repertoires +repertories +repertory +repetition +repetitions +repetitious +repetitiously +repetitiousness +repetitive +repetitively +repetitiveness +rephotograph +rephotographed +rephotographing +rephotographs +rephrase +rephrased +rephrases +rephrasing +repine +repined +repines +repining +replace +replaceable +replaced +replacement +replacements +replaces +replacing +replant +replanted +replanting +replants +replay +replayed +replaying +replays +replenish +replenished +replenishes +replenishing +replenishment +replete +repleteness +repletion +replica +replicas +replicate +replicated +replicates +replicating +replication +replications +replied +replies +reply +replying +repopulate +repopulated +repopulates +repopulating +report +reportage +reported +reportedly +reporter +reporters +reporting +reportorial +reports +repose +reposed +reposeful +reposes +reposing +repositories +repository +repossess +repossessed +repossesses +repossessing +repossession +repossessions +reprehend +reprehended +reprehending +reprehends +reprehensibility +reprehensible +reprehensibly +reprehension +represent +representation +representational +representations +representative +representatives +represented +representing +represents +repress +repressed +represses +repressing +repression +repressions +repressive +repressively +reprice +repriced +reprices +repricing +reprieve +reprieved +reprieves +reprieving +reprimand +reprimanded +reprimanding +reprimands +reprint +reprinted +reprinting +reprints +reprisal +reprisals +reprise +reprised +reprises +reprising +reproach +reproachable +reproached +reproaches +reproachful +reproachfully +reproaching +reprobate +reprobates +reprocess +reprocessed +reprocesses +reprocessing +reproduce +reproduced +reproducer +reproducers +reproduces +reproducible +reproducing +reproduction +reproductions +reproductive +reprogram +reprogramed +reprograming +reprogrammed +reprogramming +reprograms +reproof +reproofs +reprove +reproved +reproves +reproving +reprovingly +reps +reptile +reptiles +reptilian +reptilians +republic +republican +republicanism +republicans +republication +republications +republics +republish +republished +republishes +republishing +repudiate +repudiated +repudiates +repudiating +repudiation +repudiations +repudiator +repudiators +repugnance +repugnant +repulse +repulsed +repulses +repulsing +repulsion +repulsive +repulsively +repulsiveness +repurchase +repurchased +repurchases +repurchasing +reputability +reputable +reputably +reputation +reputations +repute +reputed +reputedly +reputes +reputing +request +requested +requesting +requests +requiem +requiems +require +required +requirement +requirements +requires +requiring +requisite +requisites +requisition +requisitioned +requisitioning +requisitions +requital +requite +requited +requiter +requiters +requites +requiting +reran +reread +rereading +rereads +rerecord +rerecorded +rerecording +rerecords +reroute +rerouted +reroutes +rerouting +rerun +rerunning +reruns +resalable +resale +resales +reschedule +rescheduled +reschedules +rescheduling +rescind +rescinded +rescinding +rescinds +rescission +rescue +rescued +rescuer +rescuers +rescues +rescuing +reseal +resealable +resealed +resealing +reseals +research +researched +researcher +researchers +researches +researching +resection +resections +reseed +reseeded +reseeding +reseeds +resell +reselling +resells +resemblance +resemblances +resemble +resembled +resembles +resembling +resent +resented +resentful +resentfully +resentfulness +resenting +resentment +resentments +resents +reserpine +reservation +reservations +reserve +reserved +reservedly +reservedness +reserves +reserving +reservist +reservists +reservoir +reservoirs +reset +resets +resetting +resettle +resettled +resettlement +resettles +resettling +resew +resewed +resewing +resewn +resews +reshape +reshaped +reshapes +reshaping +resharpen +resharpened +resharpening +resharpens +reship +reshipment +reshipped +reshipping +reships +reshuffle +reshuffled +reshuffles +reshuffling +reside +resided +residence +residences +residencies +residency +resident +residential +residents +resides +residing +residual +residuals +residue +residues +residuum +resign +resignation +resignations +resigned +resignedly +resigning +resigns +resilience +resiliency +resilient +resiliently +resin +resinous +resins +resist +resistance +resistances +resistant +resisted +resister +resisters +resistible +resisting +resistless +resistor +resistors +resists +resold +resole +resoled +resoles +resoling +resolute +resolutely +resoluteness +resolution +resolutions +resolvable +resolve +resolved +resolves +resolving +resonance +resonances +resonant +resonantly +resonate +resonated +resonates +resonating +resonator +resonators +resorption +resort +resorted +resorting +resorts +resound +resounded +resounding +resoundingly +resounds +resource +resourced +resourceful +resourcefully +resourcefulness +resources +resourcing +resow +resowed +resowing +resown +resows +respect +respectability +respectable +respectably +respected +respecter +respecters +respectful +respectfully +respectfulness +respecting +respective +respectively +respects +respell +respelled +respelling +respells +respelt +respiration +respirator +respirators +respiratory +respire +respired +respires +respiring +respite +respites +resplendence +resplendent +resplendently +respond +responded +respondent +respondents +responding +responds +response +responses +responsibilities +responsibility +responsible +responsibly +responsive +responsively +responsiveness +respray +resprayed +respraying +resprays +rest +restaff +restaffed +restaffing +restaffs +restart +restarted +restarting +restarts +restate +restated +restatement +restatements +restates +restating +restaurant +restauranteur +restauranteurs +restaurants +restaurateur +restaurateurs +rested +restful +restfuller +restfullest +restfully +restfulness +resting +restitch +restitched +restitches +restitching +restitution +restive +restively +restiveness +restless +restlessly +restlessness +restock +restocked +restocking +restocks +restoration +restorations +restorative +restoratives +restore +restored +restorer +restorers +restores +restoring +restrain +restrained +restrainer +restrainers +restraining +restrains +restraint +restraints +restrengthen +restrengthened +restrengthening +restrengthens +restrict +restricted +restricting +restriction +restrictions +restrictive +restrictively +restrictiveness +restricts +restring +restringing +restrings +restroom +restrooms +restructure +restructured +restructures +restructuring +restructurings +restrung +rests +restudied +restudies +restudy +restudying +restyle +restyled +restyles +restyling +resubmit +resubmits +resubmitted +resubmitting +resubscribe +resubscribed +resubscribes +resubscribing +result +resultant +resultants +resulted +resulting +results +resume +resumed +resumes +resuming +resumption +resumptions +resupplied +resupplies +resupply +resupplying +resurface +resurfaced +resurfaces +resurfacing +resurgence +resurgences +resurgent +resurrect +resurrected +resurrecting +resurrection +resurrections +resurrects +resurvey +resurveyed +resurveying +resurveys +resuscitate +resuscitated +resuscitates +resuscitating +resuscitation +resuscitator +resuscitators +retail +retailed +retailer +retailers +retailing +retails +retain +retained +retainer +retainers +retaining +retains +retake +retaken +retakes +retaking +retaliate +retaliated +retaliates +retaliating +retaliation +retaliations +retaliative +retaliatory +retard +retardant +retardants +retardation +retarded +retarder +retarders +retarding +retards +retaught +retch +retched +retches +retching +reteach +reteaches +reteaching +retell +retelling +retells +retention +retentive +retentively +retentiveness +retest +retested +retesting +retests +rethink +rethinking +rethinks +rethought +reticence +reticent +reticently +reticulation +reticulations +retie +retied +reties +retina +retinae +retinal +retinas +retinue +retinues +retire +retired +retiree +retirees +retirement +retirements +retires +retiring +retold +retook +retool +retooled +retooling +retools +retort +retorted +retorting +retorts +retouch +retouched +retouches +retouching +retrace +retraced +retraces +retracing +retract +retractable +retracted +retractile +retracting +retraction +retractions +retracts +retrain +retrained +retraining +retrains +retread +retreaded +retreading +retreads +retreat +retreated +retreating +retreats +retrench +retrenched +retrenches +retrenching +retrenchment +retrenchments +retrial +retrials +retribution +retributions +retributive +retried +retries +retrievable +retrieval +retrievals +retrieve +retrieved +retriever +retrievers +retrieves +retrieving +retro +retroactive +retroactively +retrod +retrodden +retrofire +retrofired +retrofires +retrofiring +retrofit +retrofits +retrofitted +retrofitting +retrograde +retrograded +retrogrades +retrograding +retrogress +retrogressed +retrogresses +retrogressing +retrogression +retrogressive +retrorocket +retrorockets +retros +retrospect +retrospected +retrospecting +retrospection +retrospective +retrospectively +retrospectives +retrospects +retrovirus +retroviruses +retry +retrying +retsina +return +returnable +returnables +returned +returnee +returnees +returner +returners +returning +returns +retying +retype +retyped +retypes +retyping +reunification +reunified +reunifies +reunify +reunifying +reunion +reunions +reunite +reunited +reunites +reuniting +reupholster +reupholstered +reupholstering +reupholsters +reusable +reuse +reused +reuses +reusing +revaluation +revaluations +revalue +revalued +revalues +revaluing +revamp +revamped +revamping +revampings +revamps +reveal +revealed +revealing +revealingly +reveals +reveille +revel +revelation +revelations +reveled +reveler +revelers +reveling +revelled +reveller +revellers +revelling +revelries +revelry +revels +revenge +revenged +revengeful +revengefully +revenges +revenging +revenue +revenuer +revenuers +revenues +reverberate +reverberated +reverberates +reverberating +reverberation +reverberations +revere +revered +reverence +reverenced +reverences +reverencing +reverend +reverends +reverent +reverential +reverentially +reverently +reveres +reverie +reveries +revering +revers +reversal +reversals +reverse +reversed +reversely +reverses +reversible +reversibly +reversing +reversion +revert +reverted +revertible +reverting +reverts +revery +revetment +revetments +review +reviewed +reviewer +reviewers +reviewing +reviews +revile +reviled +revilement +reviler +revilers +reviles +reviling +revise +revised +reviser +revisers +revises +revising +revision +revisionism +revisionist +revisionists +revisions +revisit +revisited +revisiting +revisits +revitalization +revitalize +revitalized +revitalizes +revitalizing +revival +revivalism +revivalist +revivalists +revivals +revive +revived +revives +revivification +revivified +revivifies +revivify +revivifying +reviving +revocable +revocation +revocations +revokable +revoke +revoked +revokes +revoking +revolt +revolted +revolting +revoltingly +revolts +revolution +revolutionaries +revolutionary +revolutionise +revolutionised +revolutionises +revolutionising +revolutionist +revolutionists +revolutionize +revolutionized +revolutionizes +revolutionizing +revolutions +revolvable +revolve +revolved +revolver +revolvers +revolves +revolving +revs +revue +revues +revulsion +revved +revving +reward +rewarded +rewarding +rewards +rewarm +rewarmed +rewarming +rewarms +rewash +rewashed +rewashes +rewashing +reweave +reweaved +reweaves +reweaving +rewed +rewedded +rewedding +reweds +reweigh +reweighed +reweighing +reweighs +rewind +rewinding +rewinds +rewire +rewired +rewires +rewiring +reword +reworded +rewording +rewords +rework +reworked +reworking +reworks +rewound +rewove +rewoven +rewrite +rewrites +rewriting +rewritten +rewrote +rezone +rezoned +rezones +rezoning +rhapsodic +rhapsodical +rhapsodies +rhapsodize +rhapsodized +rhapsodizes +rhapsodizing +rhapsody +rhea +rheas +rhenium +rheostat +rheostats +rhesus +rhesuses +rhetoric +rhetorical +rhetorically +rhetorician +rhetoricians +rheum +rheumatic +rheumatically +rheumatics +rheumatism +rheumatoid +rheumier +rheumiest +rheumy +rhinestone +rhinestones +rhinitis +rhino +rhinoceri +rhinoceros +rhinoceroses +rhinos +rhizome +rhizomes +rhodium +rhododendron +rhododendrons +rhombi +rhomboid +rhomboidal +rhomboids +rhombus +rhombuses +rhos +rhubarb +rhubarbs +rhyme +rhymed +rhymer +rhymers +rhymes +rhymester +rhymesters +rhyming +rhythm +rhythmic +rhythmical +rhythmically +rhythms +rial +rials +ribald +ribaldry +ribbed +ribber +ribbers +ribbing +ribbon +ribbons +riboflavin +ribs +rice +riced +ricer +ricers +rices +rich +richer +riches +richest +richly +richness +ricing +rick +ricked +ricketier +ricketiest +rickets +rickety +ricking +rickrack +ricks +ricksha +rickshas +rickshaw +rickshaws +ricochet +ricocheted +ricocheting +ricochets +ricochetted +ricochetting +ricotta +riddance +ridded +ridden +ridding +riddle +riddled +riddles +riddling +ride +rider +riderless +riders +ridership +rides +ridge +ridged +ridgepole +ridgepoles +ridges +ridgier +ridgiest +ridging +ridgy +ridicule +ridiculed +ridicules +ridiculing +ridiculous +ridiculously +ridiculousness +riding +rids +rife +rifer +rifest +riff +riffed +riffing +riffle +riffled +riffles +riffling +riffraff +riffs +rifle +rifled +rifleman +riflemen +rifler +riflers +rifles +rifling +rift +rifted +rifting +rifts +rigamarole +rigamaroles +rigatoni +rigged +rigger +riggers +rigging +right +righted +righteous +righteously +righteousness +righter +rightest +rightful +rightfully +rightfulness +righting +rightism +rightist +rightists +rightly +rightmost +rightness +rights +rightsize +rightsized +rightsizes +rightsizing +rightward +rightwards +rigid +rigidity +rigidly +rigidness +rigmarole +rigmaroles +rigor +rigorous +rigorously +rigorousness +rigors +rigour +rigours +rigs +rile +riled +riles +riling +rill +rills +rime +rimed +rimes +riming +rimless +rimmed +rimming +rims +rind +rinds +ring +ringed +ringer +ringers +ringgit +ringgits +ringing +ringleader +ringleaders +ringlet +ringlets +ringlike +ringmaster +ringmasters +rings +ringside +ringworm +rink +rinks +rinse +rinsed +rinses +rinsing +riot +rioted +rioter +rioters +rioting +riotous +riotously +riots +riparian +ripcord +ripcords +ripe +ripely +ripen +ripened +ripeness +ripening +ripens +riper +ripest +ripoff +ripoffs +ripost +riposte +riposted +ripostes +riposting +riposts +ripped +ripper +rippers +ripping +ripple +rippled +ripples +rippling +ripply +rips +ripsaw +ripsaws +riptide +riptides +rise +risen +riser +risers +rises +risibility +risible +rising +risings +risk +risked +riskier +riskiest +riskily +riskiness +risking +risks +risky +risotto +risottos +risque +rite +rites +ritual +ritualism +ritualistic +ritualistically +ritually +rituals +ritzier +ritziest +ritzy +rival +rivaled +rivaling +rivalled +rivalling +rivalries +rivalry +rivals +rive +rived +riven +river +riverbank +riverbanks +riverbed +riverbeds +riverboat +riverboats +rivers +riverside +riversides +rives +rivet +riveted +riveter +riveters +riveting +rivets +rivetted +rivetting +riving +rivulet +rivulets +riyal +riyals +roach +roaches +road +roadbed +roadbeds +roadblock +roadblocked +roadblocking +roadblocks +roadhouse +roadhouses +roadie +roadies +roadkill +roadrunner +roadrunners +roads +roadshow +roadshows +roadside +roadsides +roadster +roadsters +roadway +roadways +roadwork +roadworthy +roam +roamed +roamer +roamers +roaming +roams +roan +roans +roar +roared +roarer +roarers +roaring +roars +roast +roasted +roaster +roasters +roasting +roastings +roasts +robbed +robber +robberies +robbers +robbery +robbing +robe +robed +robes +robin +robing +robins +robot +robotic +robotics +robotize +robotized +robotizes +robotizing +robots +robs +robust +robuster +robustest +robustly +robustness +rock +rockabilly +rockbound +rocked +rocker +rockers +rocket +rocketed +rocketing +rocketry +rockets +rockfall +rockfalls +rockier +rockiest +rockiness +rocking +rocks +rocky +rococo +rode +rodent +rodents +rodeo +rodeos +rods +roebuck +roebucks +roentgen +roentgens +roes +roger +rogered +rogering +rogers +rogue +roguery +rogues +roguish +roguishly +roguishness +roil +roiled +roiling +roils +roister +roistered +roisterer +roisterers +roistering +roisters +role +roles +roll +rollback +rollbacks +rolled +roller +rollers +rollerskating +rollick +rollicked +rollicking +rollicks +rolling +rollover +rollovers +rolls +romaine +roman +romance +romanced +romancer +romancers +romances +romancing +romantic +romantically +romanticism +romanticist +romanticists +romanticize +romanticized +romanticizes +romanticizing +romantics +romeo +romeos +romp +romped +romper +rompers +romping +romps +rondo +rondos +rood +roods +roof +roofed +roofer +roofers +roofing +roofless +roofs +rooftop +rooftops +rook +rooked +rookeries +rookery +rookie +rookies +rooking +rooks +room +roomed +roomer +roomers +roomette +roomettes +roomful +roomfuls +roomier +roomiest +roominess +rooming +roommate +roommates +rooms +roomy +roost +roosted +rooster +roosters +roosting +roosts +root +rooted +rooter +rooters +rooting +rootless +rootlet +rootlets +roots +rope +roped +roper +ropers +ropes +ropier +ropiest +roping +ropy +rosaries +rosary +rose +roseate +rosebud +rosebuds +rosebush +rosebushes +rosemary +roses +rosette +rosettes +rosewater +rosewood +rosewoods +rosier +rosiest +rosily +rosin +rosined +rosiness +rosining +rosins +roster +rosters +rostra +rostrum +rostrums +rosy +rotaries +rotary +rotate +rotated +rotates +rotating +rotation +rotations +rotatory +rote +rotgut +rotisserie +rotisseries +rotogravure +rotogravures +rotor +rotors +rototiller +rototillers +rots +rotted +rotten +rottener +rottenest +rottenly +rottenness +rotting +rotund +rotunda +rotundas +rotundity +rotundness +rouble +roubles +roue +roues +rouge +rouged +rouges +rough +roughage +roughed +roughen +roughened +roughening +roughens +rougher +roughest +roughhouse +roughhoused +roughhouses +roughhousing +roughing +roughly +roughneck +roughnecked +roughnecking +roughnecks +roughness +roughs +roughshod +rouging +roulette +round +roundabout +roundabouts +rounded +roundelay +roundelays +rounder +roundest +roundhouse +roundhouses +rounding +roundish +roundly +roundness +rounds +roundtable +roundtables +roundup +roundups +roundworm +roundworms +rouse +roused +rouses +rousing +roust +roustabout +roustabouts +rousted +rousting +rousts +rout +route +routed +router +routers +routes +routine +routinely +routines +routing +routinize +routinized +routinizes +routinizing +routs +rove +roved +rover +rovers +roves +roving +rowboat +rowboats +rowdier +rowdies +rowdiest +rowdily +rowdiness +rowdy +rowdyism +rowed +rowel +roweled +roweling +rowelled +rowelling +rowels +rower +rowers +rowing +rows +royal +royalist +royalists +royally +royals +royalties +royalty +rubati +rubato +rubatos +rubbed +rubber +rubberier +rubberiest +rubberize +rubberized +rubberizes +rubberizing +rubberneck +rubbernecked +rubbernecker +rubberneckers +rubbernecking +rubbernecks +rubbers +rubbery +rubbing +rubbish +rubbishy +rubble +rubdown +rubdowns +rube +rubella +rubes +rubicund +rubidium +rubier +rubies +rubiest +ruble +rubles +rubric +rubrics +rubs +ruby +rucksack +rucksacks +ruckus +ruckuses +rudder +rudderless +rudders +ruddier +ruddiest +ruddiness +ruddy +rude +rudely +rudeness +ruder +rudest +rudiment +rudimentary +rudiments +rued +rueful +ruefully +ruefulness +rueing +rues +ruff +ruffed +ruffian +ruffianly +ruffians +ruffing +ruffle +ruffled +ruffles +ruffling +ruffly +ruffs +rugby +rugged +ruggeder +ruggedest +ruggedly +ruggedness +rugs +ruin +ruination +ruined +ruing +ruining +ruinous +ruinously +ruins +rule +ruled +ruler +rulers +rules +ruling +rulings +rumba +rumbaed +rumbaing +rumbas +rumble +rumbled +rumbles +rumbling +rumblings +ruminant +ruminants +ruminate +ruminated +ruminates +ruminating +rumination +ruminations +ruminative +rummage +rummaged +rummages +rummaging +rummer +rummest +rummy +rumor +rumored +rumoring +rumormonger +rumormongers +rumors +rumour +rumoured +rumouring +rumours +rump +rumple +rumpled +rumples +rumpling +rumply +rumps +rumpus +rumpuses +rums +runabout +runabouts +runaround +runarounds +runaway +runaways +rundown +rundowns +rune +runes +rung +rungs +runic +runlet +runlets +runnel +runnels +runner +runners +runnier +runniest +running +runny +runoff +runoffs +runs +runt +runtier +runtiest +runts +runty +runway +runways +rupee +rupees +rupiah +rupiahs +rupture +ruptured +ruptures +rupturing +rural +ruse +ruses +rush +rushed +rusher +rushers +rushes +rushing +rushy +rusk +rusks +russet +russets +rust +rusted +rustic +rustically +rusticate +rusticated +rusticates +rusticating +rustication +rusticity +rustics +rustier +rustiest +rustiness +rusting +rustle +rustled +rustler +rustlers +rustles +rustling +rustproof +rustproofed +rustproofing +rustproofs +rusts +rusty +rutabaga +rutabagas +ruthenium +rutherfordium +ruthless +ruthlessly +ruthlessness +ruts +rutted +ruttier +ruttiest +rutting +rutty +sabbath +sabbaths +sabbatical +sabbaticals +saber +sabers +sable +sables +sabot +sabotage +sabotaged +sabotages +sabotaging +saboteur +saboteurs +sabots +sabra +sabras +sabre +sabres +saccharin +saccharine +sacerdotal +sachem +sachems +sachet +sachets +sack +sackcloth +sacked +sacker +sackers +sackful +sackfuls +sacking +sacks +sacra +sacrament +sacramental +sacraments +sacred +sacredly +sacredness +sacrifice +sacrificed +sacrifices +sacrificial +sacrificially +sacrificing +sacrilege +sacrileges +sacrilegious +sacrilegiously +sacristan +sacristans +sacristies +sacristy +sacroiliac +sacroiliacs +sacrosanct +sacrosanctness +sacrum +sacs +sadden +saddened +saddening +saddens +sadder +saddest +saddle +saddlebag +saddlebags +saddled +saddles +saddling +sadism +sadist +sadistic +sadistically +sadists +sadly +sadness +sadomasochism +sadomasochist +sadomasochistic +sadomasochists +safari +safaried +safariing +safaris +safe +safeguard +safeguarded +safeguarding +safeguards +safekeeping +safely +safeness +safer +safes +safest +safeties +safety +safflower +safflowers +saffron +saffrons +saga +sagacious +sagaciously +sagacity +sagas +sage +sagebrush +sagely +sager +sages +sagest +sagged +saggier +saggiest +sagging +saggy +sago +sags +saguaro +saguaros +sahib +sahibs +said +sail +sailboard +sailboarder +sailboarders +sailboarding +sailboards +sailboat +sailboats +sailcloth +sailed +sailfish +sailfishes +sailing +sailings +sailor +sailors +sailplane +sailplanes +sails +saint +sainted +sainthood +saintlier +saintliest +saintlike +saintliness +saintly +saints +saith +sake +saki +salaam +salaamed +salaaming +salaams +salable +salacious +salaciously +salaciousness +salacity +salad +salads +salamander +salamanders +salami +salamis +salaried +salaries +salary +sale +saleable +sales +salesclerk +salesclerks +salesgirl +salesgirls +salesladies +saleslady +salesman +salesmanship +salesmen +salespeople +salesperson +salespersons +saleswoman +saleswomen +salience +salient +saliently +salients +saline +salines +salinity +saliva +salivary +salivate +salivated +salivates +salivating +salivation +sallied +sallies +sallow +sallower +sallowest +sallowness +sally +sallying +salmon +salmonella +salmonellae +salmonellas +salmons +salon +salons +saloon +saloons +salsa +salsas +salt +saltbox +saltboxes +saltcellar +saltcellars +salted +salter +saltest +saltier +saltiest +saltine +saltines +saltiness +salting +saltpeter +saltpetre +salts +saltshaker +saltshakers +saltwater +salty +salubrious +salutary +salutation +salutations +salutatorian +salutatorians +salutatory +salute +saluted +salutes +saluting +salvage +salvageable +salvaged +salvages +salvaging +salvation +salve +salved +salver +salvers +salves +salving +salvo +salvoes +salvos +samarium +samba +sambaed +sambaing +sambas +same +sameness +samovar +samovars +sampan +sampans +sample +sampled +sampler +samplers +samples +sampling +samurai +sanatoria +sanatorium +sanatoriums +sancta +sanctification +sanctified +sanctifies +sanctify +sanctifying +sanctimonious +sanctimoniously +sanctimoniousness +sanctimony +sanction +sanctioned +sanctioning +sanctions +sanctity +sanctuaries +sanctuary +sanctum +sanctums +sand +sandal +sandals +sandalwood +sandbag +sandbagged +sandbagging +sandbags +sandbank +sandbanks +sandbar +sandbars +sandblast +sandblasted +sandblaster +sandblasters +sandblasting +sandblasts +sandbox +sandboxes +sandcastle +sandcastles +sanded +sander +sanders +sandhog +sandhogs +sandier +sandiest +sandiness +sanding +sandlot +sandlots +sandlotter +sandlotters +sandman +sandmen +sandpaper +sandpapered +sandpapering +sandpapers +sandpiper +sandpipers +sands +sandstone +sandstorm +sandstorms +sandwich +sandwiched +sandwiches +sandwiching +sandy +sane +sanely +saneness +saner +sanest +sang +sangfroid +sangria +sanguinary +sanguine +sanguinely +sanitaria +sanitarian +sanitarians +sanitarium +sanitariums +sanitary +sanitation +sanitize +sanitized +sanitizes +sanitizing +sanity +sank +sans +sapience +sapient +sapless +sapling +saplings +sapped +sapphire +sapphires +sappier +sappiest +sappiness +sapping +sappy +saprophyte +saprophytes +saprophytic +saps +sapsucker +sapsuckers +sapwood +saran +sarape +sarapes +sarcasm +sarcasms +sarcastic +sarcastically +sarcoma +sarcomas +sarcomata +sarcophagi +sarcophagus +sarcophaguses +sardine +sardines +sardonic +sardonically +saree +sarees +sarge +sarges +sari +saris +sarong +sarongs +sarsaparilla +sarsaparillas +sartorial +sartorially +sash +sashay +sashayed +sashaying +sashays +sashes +sass +sassafras +sassafrases +sassed +sasses +sassier +sassiest +sassing +sassy +satanic +satanical +satanically +satanism +satanist +satanists +satchel +satchels +sate +sated +sateen +satellite +satellites +sates +satiable +satiate +satiated +satiates +satiating +satiation +satiety +satin +sating +satinwood +satinwoods +satiny +satire +satires +satiric +satirical +satirically +satirist +satirists +satirize +satirized +satirizes +satirizing +satisfaction +satisfactions +satisfactorily +satisfactory +satisfied +satisfies +satisfy +satisfying +satisfyingly +satori +satrap +satraps +saturate +saturated +saturates +saturating +saturation +saturnine +satyr +satyriasis +satyric +satyrs +sauce +sauced +saucepan +saucepans +saucer +saucers +sauces +saucier +sauciest +saucily +sauciness +saucing +saucy +sauerkraut +sauna +saunaed +saunaing +saunas +saunter +sauntered +sauntering +saunters +saurian +sauropod +sauropods +sausage +sausages +saute +sauted +sauteed +sauteing +sauterne +sauternes +sautes +savable +savage +savaged +savagely +savageness +savager +savageries +savagery +savages +savagest +savaging +savanna +savannah +savannahs +savannas +savant +savants +save +saveable +saved +saver +savers +saves +saving +savings +savior +saviors +saviour +saviours +savor +savored +savorier +savories +savoriest +savoriness +savoring +savors +savory +savour +savoured +savourier +savouries +savouriest +savouring +savours +savoury +savoy +savoys +savvied +savvier +savvies +savviest +savvy +savvying +sawbones +sawboneses +sawbuck +sawbucks +sawdust +sawed +sawflies +sawfly +sawhorse +sawhorses +sawing +sawmill +sawmills +sawn +saws +sawyer +sawyers +saxes +saxifrage +saxifrages +saxophone +saxophones +saxophonist +saxophonists +saying +sayings +says +scab +scabbard +scabbards +scabbed +scabbier +scabbiest +scabbiness +scabbing +scabby +scabies +scabrous +scabs +scad +scads +scaffold +scaffolding +scaffolds +scalawag +scalawags +scald +scalded +scalding +scalds +scale +scaled +scaleless +scalene +scales +scalier +scaliest +scaliness +scaling +scallion +scallions +scallop +scalloped +scalloping +scallops +scalp +scalped +scalpel +scalpels +scalper +scalpers +scalping +scalps +scaly +scam +scammed +scamming +scamp +scamper +scampered +scampering +scampers +scampi +scampies +scamps +scams +scan +scandal +scandalize +scandalized +scandalizes +scandalizing +scandalmonger +scandalmongers +scandalous +scandalously +scandals +scandium +scanned +scanner +scanners +scanning +scans +scansion +scant +scanted +scanter +scantest +scantier +scantiest +scantily +scantiness +scanting +scantly +scantness +scants +scanty +scapegoat +scapegoated +scapegoating +scapegoats +scapegrace +scapegraces +scapula +scapulae +scapular +scapulars +scapulas +scar +scarab +scarabs +scarce +scarcely +scarceness +scarcer +scarcest +scarcity +scare +scarecrow +scarecrows +scared +scareder +scaredest +scaremonger +scaremongers +scares +scarf +scarfed +scarfing +scarfs +scarier +scariest +scarification +scarified +scarifies +scarify +scarifying +scarily +scariness +scaring +scarlatina +scarlet +scarp +scarped +scarping +scarps +scarred +scarring +scars +scarves +scary +scat +scathing +scathingly +scatological +scatology +scats +scatted +scatter +scatterbrain +scatterbrained +scatterbrains +scattered +scattering +scatterings +scatters +scatting +scavenge +scavenged +scavenger +scavengers +scavenges +scavenging +scenario +scenarios +scenarist +scenarists +scene +scenery +scenes +scenic +scenically +scent +scented +scenting +scentless +scents +scepter +scepters +sceptic +sceptical +scepticism +sceptics +sceptre +sceptres +schedule +scheduled +schedules +scheduling +schematic +schematically +schematics +scheme +schemed +schemer +schemers +schemes +scheming +scherzi +scherzo +scherzos +schilling +schillings +schism +schismatic +schismatics +schisms +schist +schizo +schizoid +schizoids +schizophrenia +schizophrenic +schizophrenics +schizos +schlemiel +schlemiels +schlep +schlepp +schlepped +schlepping +schlepps +schleps +schlock +schlocky +schmaltz +schmaltzier +schmaltziest +schmaltzy +schmalz +schmo +schmoe +schmoes +schmooze +schmoozed +schmoozes +schmoozing +schmos +schmuck +schmucks +schnapps +schnaps +schnauzer +schnauzers +schnitzel +schnitzels +schnook +schnooks +schnoz +schnozes +schnozzle +schnozzles +scholar +scholarly +scholars +scholarship +scholarships +scholastic +scholastically +school +schoolbag +schoolbags +schoolbook +schoolbooks +schoolboy +schoolboys +schoolchild +schoolchildren +schooled +schoolfellow +schoolfellows +schoolgirl +schoolgirls +schoolhouse +schoolhouses +schooling +schoolmarm +schoolmarmish +schoolmarms +schoolmaster +schoolmasters +schoolmate +schoolmates +schoolmistress +schoolmistresses +schoolroom +schoolrooms +schools +schoolteacher +schoolteachers +schoolwork +schoolyard +schoolyards +schooner +schooners +schrod +schrods +schuss +schussboomer +schussboomers +schussed +schusses +schussing +schwa +schwas +sciatic +sciatica +science +sciences +scientific +scientifically +scientist +scientists +scimitar +scimitars +scintilla +scintillas +scintillate +scintillated +scintillates +scintillating +scintillation +scion +scions +scissor +scissored +scissoring +scissors +sclerosis +sclerotic +scoff +scoffed +scoffer +scoffers +scoffing +scofflaw +scofflaws +scoffs +scold +scolded +scolding +scoldings +scolds +scoliosis +scollop +scolloped +scolloping +scollops +sconce +sconces +scone +scones +scoop +scooped +scoopful +scoopfuls +scooping +scoops +scoot +scooted +scooter +scooters +scooting +scoots +scope +scoped +scopes +scoping +scorbutic +scorch +scorched +scorcher +scorchers +scorches +scorching +score +scoreboard +scoreboards +scorecard +scorecards +scored +scorekeeper +scorekeepers +scoreless +scorer +scorers +scores +scoring +scorn +scorned +scorner +scorners +scornful +scornfully +scorning +scorns +scorpion +scorpions +scotch +scotched +scotches +scotching +scoundrel +scoundrels +scour +scoured +scourer +scourers +scourge +scourged +scourges +scourging +scouring +scours +scout +scouted +scouting +scoutmaster +scoutmasters +scouts +scow +scowl +scowled +scowling +scowls +scows +scrabble +scrabbled +scrabbler +scrabblers +scrabbles +scrabbling +scrag +scraggier +scraggiest +scragglier +scraggliest +scraggly +scraggy +scrags +scram +scramble +scrambled +scrambler +scramblers +scrambles +scrambling +scrammed +scramming +scrams +scrap +scrapbook +scrapbooks +scrape +scraped +scraper +scrapers +scrapes +scrapheap +scrapheaps +scraping +scrapped +scrapper +scrappers +scrappier +scrappiest +scrapping +scrappy +scraps +scrapyard +scrapyards +scratch +scratched +scratches +scratchier +scratchiest +scratchily +scratchiness +scratching +scratchy +scrawl +scrawled +scrawling +scrawls +scrawly +scrawnier +scrawniest +scrawniness +scrawny +scream +screamed +screamer +screamers +screaming +screams +scree +screech +screeched +screeches +screechier +screechiest +screeching +screechy +screen +screened +screening +screenings +screenplay +screenplays +screens +screenwriter +screenwriters +screenwriting +screes +screw +screwball +screwballs +screwdriver +screwdrivers +screwed +screwier +screwiest +screwiness +screwing +screws +screwworm +screwworms +screwy +scribal +scribble +scribbled +scribbler +scribblers +scribbles +scribbling +scribe +scribes +scrim +scrimmage +scrimmaged +scrimmages +scrimmaging +scrimp +scrimped +scrimping +scrimps +scrims +scrimshaw +scrimshawed +scrimshawing +scrimshaws +scrip +scrips +script +scripted +scripting +scripts +scriptural +scripture +scriptures +scriptwriter +scriptwriters +scrivener +scriveners +scrod +scrods +scrofula +scrofulous +scroll +scrolled +scrolling +scrolls +scrooge +scrooges +scrota +scrotal +scrotum +scrotums +scrounge +scrounged +scrounger +scroungers +scrounges +scroungier +scroungiest +scrounging +scroungy +scrub +scrubbed +scrubber +scrubbers +scrubbier +scrubbiest +scrubbing +scrubby +scrubs +scruff +scruffier +scruffiest +scruffily +scruffiness +scruffs +scruffy +scrumptious +scrumptiously +scrunch +scrunched +scrunches +scrunchie +scrunchies +scrunching +scrunchy +scruple +scrupled +scruples +scrupling +scrupulosity +scrupulous +scrupulously +scrupulousness +scrutinize +scrutinized +scrutinizes +scrutinizing +scrutiny +scuba +scubaed +scubaing +scubas +scud +scudded +scudding +scuds +scuff +scuffed +scuffing +scuffle +scuffled +scuffles +scuffling +scuffs +scull +sculled +sculler +sculleries +scullers +scullery +sculling +scullion +scullions +sculls +sculpt +sculpted +sculpting +sculptor +sculptors +sculptress +sculptresses +sculpts +sculptural +sculpture +sculptured +sculptures +sculpturing +scum +scumbag +scumbags +scummed +scummier +scummiest +scumming +scummy +scums +scupper +scuppered +scuppering +scuppers +scurf +scurfier +scurfiest +scurfy +scurried +scurries +scurrility +scurrilous +scurrilously +scurrilousness +scurry +scurrying +scurvier +scurviest +scurvily +scurvy +scutcheon +scutcheons +scuttle +scuttlebutt +scuttled +scuttles +scuttling +scuzzier +scuzziest +scuzzy +scythe +scythed +scythes +scything +seabed +seabeds +seabird +seabirds +seaboard +seaboards +seaborne +seacoast +seacoasts +seafarer +seafarers +seafaring +seafloor +seafloors +seafood +seafront +seafronts +seagoing +seagull +seagulls +seahorse +seahorses +seal +sealant +sealants +sealed +sealer +sealers +sealing +seals +sealskin +seam +seaman +seamanship +seamed +seamen +seamier +seamiest +seaming +seamless +seamlessly +seams +seamstress +seamstresses +seamy +seance +seances +seaplane +seaplanes +seaport +seaports +sear +search +searched +searcher +searchers +searches +searching +searchingly +searchlight +searchlights +seared +searing +sears +seas +seascape +seascapes +seashell +seashells +seashore +seashores +seasick +seasickness +seaside +seasides +season +seasonable +seasonably +seasonal +seasonally +seasoned +seasoning +seasonings +seasons +seat +seated +seating +seatmate +seatmates +seats +seawall +seawalls +seaward +seawards +seawater +seaway +seaways +seaweed +seaworthier +seaworthiest +seaworthiness +seaworthy +sebaceous +seborrhea +seborrhoea +secant +secants +secede +seceded +secedes +seceding +secession +secessionist +secessionists +seclude +secluded +secludes +secluding +seclusion +seclusive +second +secondaries +secondarily +secondary +seconded +seconder +seconders +secondhand +seconding +secondly +seconds +secrecy +secret +secretarial +secretariat +secretariats +secretaries +secretary +secretaryship +secrete +secreted +secretes +secreting +secretion +secretions +secretive +secretively +secretiveness +secretly +secretory +secrets +secs +sect +sectarian +sectarianism +sectarians +sectaries +sectary +section +sectional +sectionalism +sectionals +sectioned +sectioning +sections +sector +sectors +sects +secular +secularism +secularist +secularists +secularization +secularize +secularized +secularizes +secularizing +secure +secured +securely +securer +secures +securest +securing +securities +security +sedan +sedans +sedate +sedated +sedately +sedateness +sedater +sedates +sedatest +sedating +sedation +sedative +sedatives +sedentary +sedge +sedgy +sediment +sedimentary +sedimentation +sediments +sedition +seditious +seduce +seduced +seducer +seducers +seduces +seducing +seduction +seductions +seductive +seductively +seductiveness +seductress +seductresses +sedulous +sedulously +seed +seedbed +seedbeds +seedcase +seedcases +seeded +seeder +seeders +seedier +seediest +seediness +seeding +seedless +seedling +seedlings +seedpod +seedpods +seeds +seedy +seeing +seek +seeker +seekers +seeking +seeks +seem +seemed +seeming +seemingly +seemlier +seemliest +seemliness +seemly +seems +seen +seep +seepage +seeped +seeping +seeps +seer +seers +seersucker +sees +seesaw +seesawed +seesawing +seesaws +seethe +seethed +seethes +seething +segment +segmentation +segmented +segmenting +segments +segregate +segregated +segregates +segregating +segregation +segregationist +segregationists +segue +segued +segueing +segues +seigneur +seigneurs +seignior +seigniorial +seigniors +seine +seined +seiner +seiners +seines +seining +seismic +seismically +seismograph +seismographer +seismographers +seismographic +seismographs +seismography +seismologic +seismological +seismologist +seismologists +seismology +seize +seized +seizes +seizing +seizure +seizures +seldom +select +selected +selecting +selection +selections +selective +selectively +selectivity +selectman +selectmen +selectness +selector +selectors +selects +selenium +selenographer +selenographers +selenography +self +selfish +selfishly +selfishness +selfless +selflessly +selflessness +selfsame +sell +seller +sellers +selling +sellout +sellouts +sells +seltzer +selvage +selvages +selvedge +selvedges +selves +semantic +semantically +semanticist +semanticists +semantics +semaphore +semaphored +semaphores +semaphoring +semblance +semblances +semen +semester +semesters +semi +semiannual +semiannually +semiarid +semiautomatic +semiautomatics +semicircle +semicircles +semicircular +semicolon +semicolons +semiconducting +semiconductor +semiconductors +semiconscious +semidarkness +semidetached +semifinal +semifinalist +semifinalists +semifinals +semigloss +semimonthlies +semimonthly +seminal +seminar +seminarian +seminarians +seminaries +seminars +seminary +semiofficial +semiotic +semiotics +semipermeable +semiprecious +semiprivate +semipro +semiprofessional +semiprofessionals +semipros +semiretired +semis +semiskilled +semisolid +semisweet +semitone +semitones +semitrailer +semitrailers +semitransparent +semitropical +semivowel +semivowels +semiweeklies +semiweekly +semiyearly +semolina +sempstress +sempstresses +senate +senates +senator +senatorial +senators +send +sender +senders +sending +sendoff +sendoffs +sends +senescence +senescent +senile +senility +senior +seniority +seniors +senna +senor +senora +senoras +senorita +senoritas +senors +sensation +sensational +sensationalism +sensationalist +sensationalists +sensationalize +sensationalized +sensationalizes +sensationalizing +sensationally +sensations +sense +sensed +senseless +senselessly +senselessness +senses +sensibilities +sensibility +sensible +sensibleness +sensibly +sensing +sensitive +sensitively +sensitiveness +sensitives +sensitivities +sensitivity +sensitization +sensitize +sensitized +sensitizes +sensitizing +sensor +sensors +sensory +sensual +sensualist +sensualists +sensuality +sensually +sensuous +sensuously +sensuousness +sent +sentence +sentenced +sentences +sentencing +sententious +sententiously +sentience +sentient +sentiment +sentimental +sentimentalism +sentimentalist +sentimentalists +sentimentality +sentimentalization +sentimentalize +sentimentalized +sentimentalizes +sentimentalizing +sentimentally +sentiments +sentinel +sentinels +sentries +sentry +sepal +sepals +separability +separable +separably +separate +separated +separately +separateness +separates +separating +separation +separations +separatism +separatist +separatists +separative +separator +separators +sepia +sepsis +septa +septet +septets +septette +septettes +septic +septicemia +septicemic +septuagenarian +septuagenarians +septum +septums +sepulcher +sepulchered +sepulchering +sepulchers +sepulchral +sepulchre +sepulchred +sepulchres +sepulchring +sequel +sequels +sequence +sequenced +sequences +sequencing +sequential +sequentially +sequester +sequestered +sequestering +sequesters +sequestrate +sequestrated +sequestrates +sequestrating +sequestration +sequestrations +sequin +sequined +sequinned +sequins +sequoia +sequoias +sera +seraglio +seraglios +serape +serapes +seraph +seraphic +seraphim +seraphs +sere +serenade +serenaded +serenades +serenading +serendipitous +serendipity +serene +serenely +sereneness +serener +serenest +serenity +serer +serest +serf +serfdom +serfs +serge +sergeant +sergeants +serial +serialization +serialize +serialized +serializes +serializing +serially +serials +series +serif +serifs +serigraph +serigraphs +serious +seriously +seriousness +sermon +sermonize +sermonized +sermonizes +sermonizing +sermons +serology +serous +serpent +serpentine +serpents +serrate +serrated +serration +serrations +serried +serum +serums +servant +servants +serve +served +server +servers +serves +service +serviceability +serviceable +serviced +serviceman +servicemen +services +servicewoman +servicewomen +servicing +serviette +serviettes +servile +servility +serving +servings +servitor +servitors +servitude +servo +servomechanism +servomechanisms +servomotor +servomotors +servos +sesame +sesames +sesquicentennial +sesquicentennials +session +sessions +setback +setbacks +sets +setscrew +setscrews +settee +settees +setter +setters +setting +settings +settle +settled +settlement +settlements +settler +settlers +settles +settling +setup +setups +seven +sevens +seventeen +seventeens +seventeenth +seventeenths +seventh +sevenths +seventies +seventieth +seventieths +seventy +sever +several +severally +severance +severances +severe +severed +severely +severeness +severer +severest +severing +severity +severs +sewage +sewed +sewer +sewerage +sewers +sewing +sewn +sews +sexagenarian +sexagenarians +sexed +sexes +sexier +sexiest +sexily +sexiness +sexing +sexism +sexist +sexists +sexless +sexologist +sexologists +sexology +sexpot +sexpots +sextant +sextants +sextet +sextets +sextette +sextettes +sexton +sextons +sextuplet +sextuplets +sexual +sexuality +sexually +sexy +shabbier +shabbiest +shabbily +shabbiness +shabby +shack +shackle +shackled +shackles +shackling +shacks +shad +shade +shaded +shades +shadier +shadiest +shadily +shadiness +shading +shadings +shadow +shadowbox +shadowboxed +shadowboxes +shadowboxing +shadowed +shadowier +shadowiest +shadowing +shadows +shadowy +shads +shady +shaft +shafted +shafting +shafts +shag +shagged +shaggier +shaggiest +shagginess +shagging +shaggy +shags +shah +shahs +shake +shakedown +shakedowns +shaken +shakeout +shakeouts +shaker +shakers +shakes +shakeup +shakeups +shakier +shakiest +shakily +shakiness +shaking +shaky +shale +shall +shallot +shallots +shallow +shallower +shallowest +shallowly +shallowness +shallows +shalom +shalt +sham +shaman +shamanic +shamans +shamble +shambled +shambles +shambling +shame +shamed +shamefaced +shamefacedly +shameful +shamefully +shamefulness +shameless +shamelessly +shamelessness +shames +shaming +shammed +shammies +shamming +shammy +shampoo +shampooed +shampooer +shampooers +shampooing +shampoos +shamrock +shamrocks +shams +shanghai +shanghaied +shanghaiing +shanghais +shank +shanks +shanties +shantung +shanty +shantytown +shantytowns +shape +shaped +shapeless +shapelessly +shapelessness +shapelier +shapeliest +shapeliness +shapely +shapes +shaping +shard +shards +share +sharecrop +sharecropped +sharecropper +sharecroppers +sharecropping +sharecrops +shared +shareholder +shareholders +sharer +sharers +shares +shareware +sharia +sharing +shark +sharks +sharkskin +sharp +sharped +sharpen +sharpened +sharpener +sharpeners +sharpening +sharpens +sharper +sharpers +sharpest +sharpie +sharpies +sharping +sharply +sharpness +sharps +sharpshooter +sharpshooters +sharpshooting +sharpy +shat +shatter +shattered +shattering +shatterproof +shatters +shave +shaved +shaven +shaver +shavers +shaves +shaving +shavings +shawl +shawls +shay +shays +sheaf +shear +sheared +shearer +shearers +shearing +shears +sheath +sheathe +sheathed +sheathes +sheathing +sheathings +sheaths +sheave +sheaved +sheaves +sheaving +shebang +shebangs +shed +shedding +sheds +sheen +sheenier +sheeniest +sheeny +sheep +sheepdog +sheepdogs +sheepfold +sheepfolds +sheepherder +sheepherders +sheepish +sheepishly +sheepishness +sheepskin +sheepskins +sheer +sheered +sheerer +sheerest +sheering +sheerness +sheers +sheet +sheeting +sheetlike +sheets +sheik +sheikdom +sheikdoms +sheikh +sheikhdom +sheikhdoms +sheikhs +sheiks +shekel +shekels +shelf +shell +shellac +shellack +shellacked +shellacking +shellackings +shellacks +shellacs +shelled +shellfire +shellfish +shellfishes +shelling +shells +shelter +sheltered +sheltering +shelters +shelve +shelved +shelves +shelving +shenanigan +shenanigans +shepherd +shepherded +shepherdess +shepherdesses +shepherding +shepherds +sherbert +sherberts +sherbet +sherbets +sherd +sherds +sheriff +sheriffs +sherries +sherry +shes +shew +shewed +shewing +shewn +shews +shiatsu +shibboleth +shibboleths +shied +shield +shielded +shielding +shields +shier +shies +shiest +shift +shifted +shiftier +shiftiest +shiftily +shiftiness +shifting +shiftless +shiftlessly +shiftlessness +shifts +shifty +shill +shillalah +shillalahs +shilled +shillelagh +shillelaghs +shilling +shillings +shills +shim +shimmed +shimmer +shimmered +shimmering +shimmers +shimmery +shimmied +shimmies +shimming +shimmy +shimmying +shims +shin +shinbone +shinbones +shindig +shindigs +shine +shined +shiner +shiners +shines +shingle +shingled +shingles +shingling +shinguard +shinguards +shinier +shiniest +shininess +shining +shinned +shinnied +shinnies +shinning +shinny +shinnying +shins +shinsplints +shiny +ship +shipboard +shipboards +shipbuilder +shipbuilders +shipbuilding +shipload +shiploads +shipmate +shipmates +shipment +shipments +shipowner +shipowners +shipped +shipper +shippers +shipping +ships +shipshape +shipwreck +shipwrecked +shipwrecking +shipwrecks +shipwright +shipwrights +shipyard +shipyards +shire +shires +shirk +shirked +shirker +shirkers +shirking +shirks +shirr +shirred +shirring +shirrings +shirrs +shirt +shirtfront +shirtfronts +shirting +shirtless +shirts +shirtsleeve +shirtsleeves +shirttail +shirttails +shirtwaist +shirtwaists +shit +shits +shittier +shittiest +shitting +shitty +shiv +shiver +shivered +shivering +shivers +shivery +shivs +shlemiel +shlemiels +shlep +shlepp +shlepped +shlepping +shlepps +shleps +shlock +shmaltz +shoal +shoaled +shoaling +shoals +shoat +shoats +shock +shocked +shocker +shockers +shocking +shockingly +shockproof +shocks +shod +shodden +shoddier +shoddiest +shoddily +shoddiness +shoddy +shoe +shoed +shoehorn +shoehorned +shoehorning +shoehorns +shoeing +shoelace +shoelaces +shoemaker +shoemakers +shoes +shoeshine +shoeshines +shoestring +shoestrings +shoetree +shoetrees +shogun +shogunate +shoguns +shone +shoo +shooed +shooing +shook +shoon +shoos +shoot +shooter +shooters +shooting +shootings +shootout +shootouts +shoots +shop +shopkeeper +shopkeepers +shoplift +shoplifted +shoplifter +shoplifters +shoplifting +shoplifts +shoppe +shopped +shopper +shoppers +shoppes +shopping +shops +shoptalk +shopworn +shore +shorebird +shorebirds +shored +shoreline +shorelines +shores +shoring +shorn +short +shortage +shortages +shortbread +shortcake +shortcakes +shortchange +shortchanged +shortchanges +shortchanging +shortcoming +shortcomings +shortcut +shortcuts +shorted +shorten +shortened +shortening +shortenings +shortens +shorter +shortest +shortfall +shortfalls +shorthand +shorthanded +shorthorn +shorthorns +shortie +shorties +shorting +shortly +shortness +shorts +shortsighted +shortsightedly +shortsightedness +shortstop +shortstops +shortwave +shortwaves +shorty +shot +shotgun +shotgunned +shotgunning +shotguns +shots +should +shoulder +shouldered +shouldering +shoulders +shout +shouted +shouter +shouters +shouting +shouts +shove +shoved +shovel +shoveled +shovelful +shovelfuls +shoveling +shovelled +shovelling +shovels +shoves +shoving +show +showbiz +showboat +showboated +showboating +showboats +showcase +showcased +showcases +showcasing +showdown +showdowns +showed +shower +showered +showering +showers +showery +showgirl +showgirls +showier +showiest +showily +showiness +showing +showings +showman +showmanship +showmen +shown +showoff +showoffs +showpiece +showpieces +showplace +showplaces +showroom +showrooms +shows +showstopper +showstoppers +showy +shrank +shrapnel +shred +shredded +shredder +shredders +shredding +shreds +shrew +shrewd +shrewder +shrewdest +shrewdly +shrewdness +shrewish +shrews +shriek +shrieked +shrieking +shrieks +shrift +shrike +shrikes +shrill +shrilled +shriller +shrillest +shrilling +shrillness +shrills +shrilly +shrimp +shrimped +shrimping +shrimps +shrine +shrines +shrink +shrinkable +shrinkage +shrinking +shrinks +shrive +shrived +shrivel +shriveled +shriveling +shrivelled +shrivelling +shrivels +shriven +shrives +shriving +shroud +shrouded +shrouding +shrouds +shrove +shrub +shrubberies +shrubbery +shrubbier +shrubbiest +shrubby +shrubs +shrug +shrugged +shrugging +shrugs +shrunk +shrunken +shtick +shticks +shuck +shucked +shucking +shucks +shudder +shuddered +shuddering +shudders +shuffle +shuffleboard +shuffleboards +shuffled +shuffler +shufflers +shuffles +shuffling +shun +shunned +shunning +shuns +shunt +shunted +shunting +shunts +shush +shushed +shushes +shushing +shut +shutdown +shutdowns +shuteye +shutoff +shutoffs +shutout +shutouts +shuts +shutter +shutterbug +shutterbugs +shuttered +shuttering +shutters +shutting +shuttle +shuttlecock +shuttlecocked +shuttlecocking +shuttlecocks +shuttled +shuttles +shuttling +shyer +shyest +shying +shyly +shyness +shyster +shysters +sibilant +sibilants +sibling +siblings +sibyl +sibylline +sibyls +sicced +siccing +sick +sickbed +sickbeds +sicked +sicken +sickened +sickening +sickeningly +sickens +sicker +sickest +sickie +sickies +sicking +sickish +sickle +sickles +sicklier +sickliest +sickly +sickness +sicknesses +sicko +sickos +sickout +sickouts +sickroom +sickrooms +sicks +sics +side +sidearm +sidearms +sidebar +sidebars +sideboard +sideboards +sideburns +sidecar +sidecars +sided +sidekick +sidekicks +sidelight +sidelights +sideline +sidelined +sidelines +sidelining +sidelong +sideman +sidemen +sidepiece +sidepieces +sidereal +sides +sidesaddle +sidesaddles +sideshow +sideshows +sidesplitting +sidestep +sidestepped +sidestepping +sidesteps +sidestroke +sidestroked +sidestrokes +sidestroking +sideswipe +sideswiped +sideswipes +sideswiping +sidetrack +sidetracked +sidetracking +sidetracks +sidewalk +sidewalks +sidewall +sidewalls +sideways +sidewinder +sidewinders +sidewise +siding +sidings +sidle +sidled +sidles +sidling +siege +sieges +sienna +sierra +sierras +siesta +siestas +sieve +sieved +sieves +sieving +sift +sifted +sifter +sifters +sifting +sifts +sigh +sighed +sighing +sighs +sight +sighted +sighting +sightings +sightless +sightlier +sightliest +sightly +sightread +sightreading +sightreads +sights +sightseeing +sightseer +sightseers +sigma +sigmas +sign +signage +signal +signaled +signaler +signalers +signaling +signalization +signalize +signalized +signalizes +signalizing +signalled +signalling +signally +signalman +signalmen +signals +signatories +signatory +signature +signatures +signboard +signboards +signed +signer +signers +signet +signets +significance +significant +significantly +signification +significations +signified +signifies +signify +signifying +signing +signings +signor +signora +signoras +signore +signori +signorina +signorinas +signorine +signors +signpost +signposted +signposting +signposts +signs +silage +silence +silenced +silencer +silencers +silences +silencing +silent +silenter +silentest +silently +silents +silhouette +silhouetted +silhouettes +silhouetting +silica +silicate +silicates +siliceous +silicious +silicon +silicone +silicosis +silk +silken +silkier +silkiest +silkily +silkiness +silks +silkscreen +silkscreened +silkscreening +silkscreens +silkworm +silkworms +silky +sill +sillier +sillies +silliest +silliness +sills +silly +silo +silos +silt +silted +siltier +siltiest +silting +silts +silty +silvan +silver +silvered +silverfish +silverfishes +silvering +silvers +silversmith +silversmiths +silverware +silvery +simian +simians +similar +similarities +similarity +similarly +simile +similes +similitude +simmer +simmered +simmering +simmers +simonize +simonized +simonizes +simonizing +simony +simpatico +simper +simpered +simpering +simpers +simple +simpleminded +simpleness +simpler +simplest +simpleton +simpletons +simplicity +simplification +simplifications +simplified +simplifies +simplify +simplifying +simplistic +simplistically +simply +simulate +simulated +simulates +simulating +simulation +simulations +simulator +simulators +simulcast +simulcasted +simulcasting +simulcasts +simultaneity +simultaneous +simultaneously +since +sincere +sincerely +sincerer +sincerest +sincerity +sine +sinecure +sinecures +sines +sinew +sinews +sinewy +sinful +sinfully +sinfulness +sing +singable +singe +singed +singeing +singer +singers +singes +singing +single +singled +singleness +singles +singleton +singletons +singletree +singletrees +singling +singly +sings +singsong +singsongs +singular +singularities +singularity +singularly +singulars +sinister +sink +sinkable +sinker +sinkers +sinkhole +sinkholes +sinking +sinks +sinless +sinned +sinner +sinners +sinning +sins +sinuosity +sinuous +sinus +sinuses +sinusitis +siphon +siphoned +siphoning +siphons +sipped +sipper +sippers +sipping +sips +sire +sired +siree +siren +sirens +sires +siring +sirloin +sirloins +sirocco +siroccos +sirree +sirs +sirup +sirups +sisal +sises +sissier +sissies +sissiest +sissified +sissy +sister +sisterhood +sisterhoods +sisterliness +sisterly +sisters +sitar +sitarist +sitarists +sitars +sitcom +sitcoms +site +sited +sites +siting +sits +sitter +sitters +sitting +sittings +situate +situated +situates +situating +situation +situations +situp +situps +sixes +sixfold +sixpence +sixpences +sixshooter +sixshooters +sixteen +sixteens +sixteenth +sixteenths +sixth +sixths +sixties +sixtieth +sixtieths +sixty +sizable +size +sizeable +sized +sizes +sizing +sizzle +sizzled +sizzles +sizzling +skate +skateboard +skateboarded +skateboarder +skateboarders +skateboarding +skateboards +skated +skater +skaters +skates +skating +skedaddle +skedaddled +skedaddles +skedaddling +skeet +skein +skeins +skeletal +skeleton +skeletons +skeptic +skeptical +skeptically +skepticism +skeptics +sketch +sketched +sketcher +sketchers +sketches +sketchier +sketchiest +sketchily +sketchiness +sketching +sketchy +skew +skewed +skewer +skewered +skewering +skewers +skewing +skews +skid +skidded +skidding +skids +skied +skier +skiers +skies +skiff +skiffs +skiing +skilful +skill +skilled +skillet +skillets +skillful +skillfully +skillfulness +skills +skim +skimmed +skimmer +skimmers +skimming +skimp +skimped +skimpier +skimpiest +skimpily +skimpiness +skimping +skimps +skimpy +skims +skin +skincare +skinflick +skinflicks +skinflint +skinflints +skinhead +skinheads +skinless +skinned +skinnier +skinniest +skinniness +skinning +skinny +skins +skintight +skip +skipped +skipper +skippered +skippering +skippers +skipping +skips +skirmish +skirmished +skirmishes +skirmishing +skirt +skirted +skirting +skirts +skis +skit +skits +skitter +skittered +skittering +skitters +skittish +skittishly +skittishness +skivvied +skivvies +skivvy +skivvying +skoal +skoals +skulduggery +skulk +skulked +skulker +skulkers +skulking +skulks +skull +skullcap +skullcaps +skullduggery +skulls +skunk +skunked +skunking +skunks +skycap +skycaps +skydive +skydived +skydiver +skydivers +skydives +skydiving +skydove +skyed +skying +skyjack +skyjacked +skyjacker +skyjackers +skyjacking +skyjackings +skyjacks +skylark +skylarked +skylarking +skylarks +skylight +skylights +skyline +skylines +skyrocket +skyrocketed +skyrocketing +skyrockets +skyscraper +skyscrapers +skyward +skywards +skywriter +skywriters +skywriting +slab +slabbed +slabbing +slabs +slack +slacked +slacken +slackened +slackening +slackens +slacker +slackers +slackest +slacking +slackly +slackness +slacks +slag +slain +slake +slaked +slakes +slaking +slalom +slalomed +slaloming +slaloms +slam +slammed +slammer +slammers +slamming +slams +slander +slandered +slanderer +slanderers +slandering +slanderous +slanders +slang +slangier +slangiest +slangy +slant +slanted +slanting +slantingly +slants +slantwise +slap +slapdash +slaphappier +slaphappiest +slaphappy +slapped +slapping +slaps +slapstick +slash +slashed +slasher +slashers +slashes +slashing +slat +slate +slated +slates +slather +slathered +slathering +slathers +slating +slats +slattern +slatternly +slatterns +slaughter +slaughtered +slaughterer +slaughterers +slaughterhouse +slaughterhouses +slaughtering +slaughters +slave +slaved +slaveholder +slaveholders +slaver +slavered +slavering +slavers +slavery +slaves +slaving +slavish +slavishly +slavishness +slaw +slay +slayer +slayers +slaying +slayings +slays +sleaze +sleazes +sleazier +sleaziest +sleazily +sleaziness +sleazy +sled +sledded +sledder +sledders +sledding +sledge +sledged +sledgehammer +sledgehammered +sledgehammering +sledgehammers +sledges +sledging +sleds +sleek +sleeked +sleeker +sleekest +sleeking +sleekly +sleekness +sleeks +sleep +sleeper +sleepers +sleepier +sleepiest +sleepily +sleepiness +sleeping +sleepless +sleeplessly +sleeplessness +sleepover +sleepovers +sleeps +sleepwalk +sleepwalked +sleepwalker +sleepwalkers +sleepwalking +sleepwalks +sleepwear +sleepy +sleepyhead +sleepyheads +sleet +sleeted +sleetier +sleetiest +sleeting +sleets +sleety +sleeve +sleeved +sleeveless +sleeves +sleigh +sleighed +sleighing +sleighs +sleight +sleights +slender +slenderer +slenderest +slenderize +slenderized +slenderizes +slenderizing +slenderness +slept +sleuth +sleuths +slew +slewed +slewing +slews +slice +sliced +slicer +slicers +slices +slicing +slick +slicked +slicker +slickers +slickest +slicking +slickly +slickness +slicks +slid +slide +slider +sliders +slides +sliding +slier +sliest +slight +slighted +slighter +slightest +slighting +slightly +slightness +slights +slily +slim +slime +slimier +slimiest +sliminess +slimmed +slimmer +slimmest +slimming +slimness +slims +slimy +sling +slinging +slings +slingshot +slingshots +slink +slinked +slinkier +slinkiest +slinking +slinks +slinky +slip +slipcase +slipcases +slipcover +slipcovers +slipknot +slipknots +slippage +slippages +slipped +slipper +slipperier +slipperiest +slipperiness +slippers +slippery +slipping +slips +slipshod +slipstream +slipstreams +slipway +slipways +slit +slither +slithered +slithering +slithers +slithery +slits +slitting +sliver +slivered +slivering +slivers +slob +slobber +slobbered +slobbering +slobbers +slobbery +slobs +sloe +sloes +slog +slogan +slogans +slogged +slogging +slogs +sloop +sloops +slop +slope +sloped +slopes +sloping +slopped +sloppier +sloppiest +sloppily +sloppiness +slopping +sloppy +slops +slosh +sloshed +sloshes +sloshing +slot +sloth +slothful +slothfully +slothfulness +sloths +slots +slotted +slotting +slouch +slouched +sloucher +slouchers +slouches +slouchier +slouchiest +slouching +slouchy +slough +sloughed +sloughing +sloughs +sloven +slovenlier +slovenliest +slovenliness +slovenly +slovens +slow +slowdown +slowdowns +slowed +slower +slowest +slowing +slowly +slowness +slowpoke +slowpokes +slows +sludge +sludgier +sludgiest +sludgy +slue +slued +slues +slug +sluggard +sluggards +slugged +slugger +sluggers +slugging +sluggish +sluggishly +sluggishness +slugs +sluice +sluiced +sluices +sluicing +sluing +slum +slumber +slumbered +slumbering +slumberous +slumbers +slumbrous +slumlord +slumlords +slummed +slummier +slummiest +slumming +slummy +slump +slumped +slumping +slumps +slums +slung +slunk +slur +slurp +slurped +slurping +slurps +slurred +slurring +slurry +slurs +slush +slushier +slushiest +slushiness +slushy +slut +sluts +sluttier +sluttiest +sluttish +slutty +slyer +slyest +slyly +slyness +smack +smacked +smacker +smackers +smacking +smacks +small +smaller +smallest +smallish +smallness +smallpox +smalls +smarmier +smarmiest +smarmy +smart +smarted +smarten +smartened +smartening +smartens +smarter +smartest +smarties +smarting +smartly +smartness +smarts +smarty +smartypants +smash +smashed +smasher +smashers +smashes +smashing +smashup +smashups +smattering +smatterings +smear +smeared +smearier +smeariest +smearing +smears +smeary +smell +smelled +smellier +smelliest +smelliness +smelling +smells +smelly +smelt +smelted +smelter +smelters +smelting +smelts +smidgen +smidgens +smidgeon +smidgeons +smidgin +smidgins +smilax +smile +smiled +smiles +smiley +smileys +smiling +smilingly +smirch +smirched +smirches +smirching +smirk +smirked +smirking +smirks +smit +smite +smites +smith +smithereens +smithies +smiths +smithy +smiting +smitten +smock +smocked +smocking +smocks +smog +smoggier +smoggiest +smoggy +smoke +smoked +smokehouse +smokehouses +smokeless +smoker +smokers +smokes +smokescreen +smokescreens +smokestack +smokestacks +smokier +smokiest +smokiness +smoking +smoky +smolder +smoldered +smoldering +smolders +smooch +smooched +smooches +smooching +smooth +smoothed +smoother +smoothes +smoothest +smoothie +smoothies +smoothing +smoothly +smoothness +smooths +smorgasbord +smorgasbords +smote +smother +smothered +smothering +smothers +smoulder +smouldered +smouldering +smoulders +smudge +smudged +smudges +smudgier +smudgiest +smudging +smudgy +smug +smugger +smuggest +smuggle +smuggled +smuggler +smugglers +smuggles +smuggling +smugly +smugness +smut +smuts +smuttier +smuttiest +smuttiness +smutty +snack +snacked +snacking +snacks +snaffle +snaffled +snaffles +snaffling +snafu +snafus +snag +snagged +snagging +snags +snail +snails +snake +snakebite +snakebites +snaked +snakelike +snakes +snakier +snakiest +snaking +snaky +snap +snapdragon +snapdragons +snapped +snapper +snappers +snappier +snappiest +snappily +snappiness +snapping +snappish +snappishly +snappishness +snappy +snaps +snapshot +snapshots +snare +snared +snares +snaring +snarl +snarled +snarlier +snarliest +snarling +snarlingly +snarls +snarly +snatch +snatched +snatcher +snatchers +snatches +snatching +snazzier +snazziest +snazzily +snazzy +sneak +sneaked +sneaker +sneakers +sneakier +sneakiest +sneakily +sneakiness +sneaking +sneakingly +sneaks +sneaky +sneer +sneered +sneering +sneeringly +sneers +sneeze +sneezed +sneezes +sneezing +snicker +snickered +snickering +snickers +snide +snidely +snider +snidest +sniff +sniffed +sniffer +sniffers +sniffing +sniffle +sniffled +sniffles +sniffling +sniffs +snifter +snifters +snigger +sniggered +sniggering +sniggers +snip +snipe +sniped +sniper +snipers +snipes +sniping +snipped +snippet +snippets +snippier +snippiest +snipping +snippy +snips +snit +snitch +snitched +snitches +snitching +snits +snivel +sniveled +sniveler +snivelers +sniveling +snivelled +snivelling +snivels +snob +snobbery +snobbier +snobbiest +snobbish +snobbishly +snobbishness +snobby +snobs +snood +snoods +snooker +snookered +snookering +snookers +snoop +snooped +snooper +snoopers +snoopier +snoopiest +snooping +snoops +snoopy +snoot +snootier +snootiest +snootily +snootiness +snoots +snooty +snooze +snoozed +snoozes +snoozing +snore +snored +snorer +snorers +snores +snoring +snorkel +snorkeled +snorkeler +snorkelers +snorkeling +snorkelled +snorkelling +snorkels +snort +snorted +snorter +snorters +snorting +snorts +snot +snots +snottier +snottiest +snottily +snottiness +snotty +snout +snouts +snow +snowball +snowballed +snowballing +snowballs +snowbank +snowbanks +snowbird +snowbirds +snowboard +snowboarded +snowboarder +snowboarders +snowboarding +snowboards +snowbound +snowdrift +snowdrifts +snowdrop +snowdrops +snowed +snowfall +snowfalls +snowfield +snowfields +snowflake +snowflakes +snowier +snowiest +snowiness +snowing +snowman +snowmen +snowmobile +snowmobiled +snowmobiles +snowmobiling +snowplow +snowplowed +snowplowing +snowplows +snows +snowshoe +snowshoed +snowshoeing +snowshoes +snowstorm +snowstorms +snowsuit +snowsuits +snowy +snub +snubbed +snubbing +snubs +snuck +snuff +snuffbox +snuffboxes +snuffed +snuffer +snuffers +snuffing +snuffle +snuffled +snuffles +snuffling +snuffly +snuffs +snug +snugged +snugger +snuggest +snugging +snuggle +snuggled +snuggles +snuggling +snugly +snugness +snugs +soak +soaked +soaking +soakings +soaks +soap +soapbox +soapboxes +soaped +soapier +soapiest +soapiness +soaping +soaps +soapstone +soapsuds +soapy +soar +soared +soaring +soars +sobbed +sobbing +sobbingly +sober +sobered +soberer +soberest +sobering +soberly +soberness +sobers +sobriety +sobriquet +sobriquets +sobs +soccer +sociability +sociable +sociables +sociably +social +socialism +socialist +socialistic +socialists +socialite +socialites +socialization +socialize +socialized +socializes +socializing +socially +socials +societal +societies +society +socioeconomic +sociological +sociologically +sociologist +sociologists +sociology +sociopath +sociopaths +sock +socked +socket +sockets +sockeye +sockeyes +socking +socks +soda +sodas +sodded +sodden +soddenly +sodding +sodium +sodomite +sodomites +sodomize +sodomized +sodomizes +sodomizing +sodomy +sods +soever +sofa +sofabed +sofabeds +sofas +soft +softball +softballs +softbound +soften +softened +softener +softeners +softening +softens +softer +softest +softhearted +softie +softies +softly +softness +software +softwood +softwoods +softy +soggier +soggiest +soggily +sogginess +soggy +soigne +soignee +soil +soiled +soiling +soils +soiree +soirees +sojourn +sojourned +sojourner +sojourners +sojourning +sojourns +solace +solaced +solaces +solacing +solar +solaria +solarium +solariums +sold +solder +soldered +solderer +solderers +soldering +solders +soldier +soldiered +soldiering +soldierly +soldiers +soldiery +sole +solecism +solecisms +soled +solely +solemn +solemner +solemness +solemnest +solemnified +solemnifies +solemnify +solemnifying +solemnity +solemnization +solemnize +solemnized +solemnizes +solemnizing +solemnly +solemnness +solenoid +solenoids +soles +soli +solicit +solicitation +solicitations +solicited +soliciting +solicitor +solicitors +solicitous +solicitously +solicitousness +solicits +solicitude +solid +solidarity +solider +solidest +solidi +solidification +solidified +solidifies +solidify +solidifying +solidity +solidly +solidness +solids +solidus +soliloquies +soliloquize +soliloquized +soliloquizes +soliloquizing +soliloquy +soling +solipsism +solitaire +solitaires +solitaries +solitariness +solitary +solitude +solo +soloed +soloing +soloist +soloists +solos +sols +solstice +solstices +solubility +soluble +solubles +solute +solutes +solution +solutions +solvable +solve +solved +solvency +solvent +solvents +solver +solvers +solves +solving +somatic +somber +somberer +somberest +somberly +somberness +sombre +sombrer +sombrero +sombreros +sombrest +some +somebodies +somebody +someday +somehow +someone +someplace +somersault +somersaulted +somersaulting +somersaults +somerset +somersets +somersetted +somersetting +something +sometime +sometimes +someway +someways +somewhat +somewhere +somnambulism +somnambulist +somnambulists +somnolence +somnolent +sonar +sonars +sonata +sonatas +sonatina +sonatinas +song +songbird +songbirds +songbook +songbooks +songfest +songfests +songs +songster +songsters +songstress +songstresses +songwriter +songwriters +sonic +sonnet +sonnets +sonnies +sonny +sonogram +sonograms +sonority +sonorous +sonorously +sonorousness +sons +soon +sooner +soonest +soot +sooth +soothe +soothed +soother +soothers +soothes +soothing +soothingly +soothsayer +soothsayers +soothsaying +sootier +sootiest +sooty +sophism +sophist +sophistic +sophistical +sophisticate +sophisticated +sophisticates +sophisticating +sophistication +sophistries +sophistry +sophists +sophomore +sophomores +sophomoric +soporific +soporifically +soporifics +sopped +soppier +soppiest +sopping +soppy +soprano +sopranos +sops +sorbet +sorbets +sorcerer +sorcerers +sorceress +sorceresses +sorcery +sordid +sordidly +sordidness +sore +sorehead +soreheads +sorely +soreness +sorer +sores +sorest +sorghum +sororities +sorority +sorrel +sorrels +sorrier +sorriest +sorrily +sorriness +sorrow +sorrowed +sorrowful +sorrowfully +sorrowfulness +sorrowing +sorrows +sorry +sort +sorta +sorted +sorter +sorters +sortie +sortied +sortieing +sorties +sorting +sorts +sots +sottish +soubriquet +soubriquets +souffle +souffles +sough +soughed +soughing +soughs +sought +soul +soulful +soulfully +soulfulness +soulless +soullessly +souls +sound +soundboard +soundboards +sounded +sounder +sounders +soundest +sounding +soundings +soundless +soundlessly +soundly +soundness +soundproof +soundproofed +soundproofing +soundproofs +sounds +soundtrack +soundtracks +soup +soupcon +soupcons +souped +soupier +soupiest +souping +soups +soupy +sour +source +sourced +sources +sourcing +sourdough +sourdoughs +soured +sourer +sourest +souring +sourish +sourly +sourness +sourpuss +sourpusses +sours +sous +sousaphone +sousaphones +souse +soused +souses +sousing +south +southbound +southeast +southeaster +southeasterly +southeastern +southeasters +southeastward +southeastwards +southerlies +southerly +southern +southerner +southerners +southernmost +southerns +southpaw +southpaws +southward +southwards +southwest +southwester +southwesterly +southwestern +southwesters +southwestward +southwestwards +souvenir +souvenirs +sovereign +sovereigns +sovereignty +soviet +soviets +sowed +sower +sowers +sowing +sown +sows +soya +soybean +soybeans +space +spacecraft +spacecrafts +spaced +spaceflight +spaceflights +spaceman +spacemen +spaceport +spaceports +spacer +spacers +spaces +spaceship +spaceships +spacesuit +spacesuits +spacewalk +spacewalked +spacewalking +spacewalks +spacewoman +spacewomen +spacey +spacier +spaciest +spaciness +spacing +spacious +spaciously +spaciousness +spacy +spade +spaded +spadeful +spadefuls +spades +spadework +spadices +spading +spadix +spadixes +spaghetti +spake +span +spandex +spangle +spangled +spangles +spangling +spaniel +spaniels +spank +spanked +spanking +spankings +spanks +spanned +spanner +spanners +spanning +spans +spar +spare +spared +sparely +spareness +sparer +spareribs +spares +sparest +sparing +sparingly +spark +sparked +sparkier +sparkiest +sparking +sparkle +sparkled +sparkler +sparklers +sparkles +sparkling +sparks +sparky +sparred +sparring +sparrow +sparrows +spars +sparse +sparsely +sparseness +sparser +sparsest +sparsity +spartan +spas +spasm +spasmodic +spasmodically +spasms +spastic +spastics +spat +spate +spates +spathe +spathes +spatial +spatially +spats +spatted +spatter +spattered +spattering +spatters +spatting +spatula +spatulas +spavin +spavined +spawn +spawned +spawning +spawns +spay +spayed +spaying +spays +speak +speakeasies +speakeasy +speaker +speakers +speaking +speaks +spear +speared +spearfish +spearfished +spearfishes +spearfishing +spearhead +spearheaded +spearheading +spearheads +spearing +spearmint +spears +spec +specced +speccing +special +specialist +specialists +specialities +speciality +specialization +specializations +specialize +specialized +specializes +specializing +specially +specials +specialties +specialty +specie +species +specific +specifically +specification +specifications +specificity +specifics +specified +specifies +specify +specifying +specimen +specimens +specious +speciously +speciousness +speck +specked +specking +speckle +speckled +speckles +speckling +specks +specs +spectacle +spectacles +spectacular +spectacularly +spectaculars +spectator +spectators +specter +specters +spectra +spectral +spectre +spectres +spectrometer +spectrometers +spectroscope +spectroscopes +spectroscopic +spectroscopy +spectrum +spectrums +speculate +speculated +speculates +speculating +speculation +speculations +speculative +speculatively +speculator +speculators +sped +speech +speeches +speechless +speechlessly +speechlessness +speed +speedboat +speedboats +speeded +speeder +speeders +speedier +speediest +speedily +speediness +speeding +speedometer +speedometers +speeds +speedster +speedsters +speedup +speedups +speedway +speedways +speedwell +speedy +speleologist +speleologists +speleology +spell +spellbind +spellbinder +spellbinders +spellbinding +spellbinds +spellbound +spelldown +spelldowns +spelled +speller +spellers +spelling +spellings +spells +spelt +spelunker +spelunkers +spelunking +spend +spendable +spender +spenders +spending +spends +spendthrift +spendthrifts +spent +sperm +spermatozoa +spermatozoon +spermicidal +spermicide +spermicides +sperms +spew +spewed +spewer +spewers +spewing +spews +sphagnum +sphagnums +sphere +spheres +spherical +spherically +spheroid +spheroidal +spheroids +sphincter +sphincters +sphinges +sphinx +sphinxes +spice +spiced +spices +spicier +spiciest +spicily +spiciness +spicing +spicule +spicules +spicy +spider +spiders +spiderweb +spiderwebs +spidery +spied +spiel +spieled +spieling +spiels +spies +spiffier +spiffiest +spiffy +spigot +spigots +spike +spiked +spikes +spikier +spikiest +spikiness +spiking +spiky +spill +spillage +spillages +spilled +spilling +spillover +spillovers +spills +spillway +spillways +spilt +spin +spinach +spinal +spinally +spinals +spindle +spindled +spindles +spindlier +spindliest +spindling +spindly +spine +spineless +spinelessly +spines +spinet +spinets +spinier +spiniest +spinnaker +spinnakers +spinner +spinneret +spinnerets +spinners +spinning +spinoff +spinoffs +spins +spinster +spinsterhood +spinsterish +spinsters +spiny +spiracle +spiracles +spiraea +spiraeas +spiral +spiraled +spiraling +spiralled +spiralling +spirally +spirals +spire +spirea +spireas +spires +spirit +spirited +spiriting +spiritless +spirits +spiritual +spiritualism +spiritualist +spiritualistic +spiritualists +spirituality +spiritually +spirituals +spirituous +spirochete +spirochetes +spiry +spit +spitball +spitballs +spite +spited +spiteful +spitefuller +spitefullest +spitefully +spitefulness +spites +spitfire +spitfires +spiting +spits +spitted +spitting +spittle +spittoon +spittoons +splash +splashdown +splashdowns +splashed +splashes +splashier +splashiest +splashily +splashiness +splashing +splashy +splat +splats +splatted +splatter +splattered +splattering +splatters +splatting +splay +splayed +splayfeet +splayfoot +splayfooted +splaying +splays +spleen +spleens +splendid +splendider +splendidest +splendidly +splendor +splendorous +splendour +splenetic +splice +spliced +splicer +splicers +splices +splicing +splint +splinted +splinter +splintered +splintering +splinters +splintery +splinting +splints +split +splits +splitting +splittings +splotch +splotched +splotches +splotchier +splotchiest +splotching +splotchy +splurge +splurged +splurges +splurging +splutter +spluttered +spluttering +splutters +spoil +spoilage +spoiled +spoiler +spoilers +spoiling +spoils +spoilsport +spoilsports +spoilt +spoke +spoken +spokes +spokesman +spokesmen +spokespeople +spokesperson +spokespersons +spokeswoman +spokeswomen +spoliation +sponge +spongecake +spongecakes +sponged +sponger +spongers +sponges +spongier +spongiest +sponginess +sponging +spongy +sponsor +sponsored +sponsoring +sponsors +sponsorship +spontaneity +spontaneous +spontaneously +spoof +spoofed +spoofing +spoofs +spook +spooked +spookier +spookiest +spookiness +spooking +spooks +spooky +spool +spooled +spooling +spools +spoon +spoonbill +spoonbills +spooned +spoonerism +spoonerisms +spoonful +spoonfuls +spooning +spoons +spoonsful +spoor +spoored +spooring +spoors +sporadic +sporadically +spore +spored +spores +sporing +sport +sported +sportier +sportiest +sportiness +sporting +sportingly +sportive +sportively +sports +sportscast +sportscaster +sportscasters +sportscasts +sportsman +sportsmanlike +sportsmanship +sportsmen +sportswear +sportswoman +sportswomen +sportswriter +sportswriters +sporty +spot +spotless +spotlessly +spotlessness +spotlight +spotlighted +spotlighting +spotlights +spotlit +spots +spotted +spotter +spotters +spottier +spottiest +spottily +spottiness +spotting +spotty +spousal +spousals +spouse +spouses +spout +spouted +spouting +spouts +sprain +sprained +spraining +sprains +sprang +sprat +sprats +sprawl +sprawled +sprawling +sprawls +spray +sprayed +sprayer +sprayers +spraying +sprays +spread +spreadable +spreader +spreaders +spreading +spreads +spreadsheet +spreadsheets +spree +sprees +sprier +spriest +sprig +sprightlier +sprightliest +sprightliness +sprightly +sprigs +spring +springboard +springboards +springbok +springboks +springier +springiest +springily +springiness +springing +springlike +springs +springtime +springy +sprinkle +sprinkled +sprinkler +sprinklers +sprinkles +sprinkling +sprinklings +sprint +sprinted +sprinter +sprinters +sprinting +sprints +sprite +sprites +spritz +spritzed +spritzer +spritzers +spritzes +spritzing +sprocket +sprockets +sprout +sprouted +sprouting +sprouts +spruce +spruced +sprucely +spruceness +sprucer +spruces +sprucest +sprucing +sprung +spry +spryer +spryest +spryly +spryness +spud +spuds +spume +spumed +spumes +spumier +spumiest +spuming +spumone +spumoni +spumy +spun +spunk +spunkier +spunkiest +spunky +spur +spurge +spurious +spuriously +spuriousness +spurn +spurned +spurning +spurns +spurred +spurring +spurs +spurt +spurted +spurting +spurts +sputnik +sputniks +sputter +sputtered +sputtering +sputters +sputum +spyglass +spyglasses +spying +squab +squabble +squabbled +squabbler +squabblers +squabbles +squabbling +squabs +squad +squadron +squadrons +squads +squalid +squalider +squalidest +squalidly +squalidness +squall +squalled +squallier +squalliest +squalling +squalls +squally +squalor +squamous +squander +squandered +squandering +squanders +square +squared +squarely +squareness +squarer +squares +squarest +squaring +squarish +squash +squashed +squashes +squashier +squashiest +squashing +squashy +squat +squatness +squats +squatted +squatter +squatters +squattest +squatting +squaw +squawk +squawked +squawker +squawkers +squawking +squawks +squaws +squeak +squeaked +squeaker +squeakers +squeakier +squeakiest +squeakily +squeakiness +squeaking +squeaks +squeaky +squeal +squealed +squealer +squealers +squealing +squeals +squeamish +squeamishly +squeamishness +squeegee +squeegeed +squeegeeing +squeegees +squeezable +squeeze +squeezed +squeezer +squeezers +squeezes +squeezing +squelch +squelched +squelches +squelchier +squelchiest +squelching +squelchy +squib +squibs +squid +squids +squiggle +squiggled +squiggles +squigglier +squiggliest +squiggling +squiggly +squint +squinted +squinter +squintest +squinting +squints +squire +squired +squires +squiring +squirm +squirmed +squirmier +squirmiest +squirming +squirms +squirmy +squirrel +squirreled +squirreling +squirrelled +squirrelling +squirrels +squirt +squirted +squirting +squirts +squish +squished +squishes +squishier +squishiest +squishing +squishy +stab +stabbed +stabber +stabbers +stabbing +stabbings +stability +stabilization +stabilize +stabilized +stabilizer +stabilizers +stabilizes +stabilizing +stable +stabled +stableman +stablemen +stabler +stables +stablest +stabling +stably +stabs +staccati +staccato +staccatos +stack +stacked +stacking +stacks +stadia +stadium +stadiums +staff +staffed +staffer +staffers +staffing +staffs +stag +stage +stagecoach +stagecoaches +stagecraft +staged +stagehand +stagehands +stages +stagestruck +stagflation +stagger +staggered +staggering +staggeringly +staggers +stagier +stagiest +staging +stagings +stagnancy +stagnant +stagnantly +stagnate +stagnated +stagnates +stagnating +stagnation +stags +stagy +staid +staider +staidest +staidly +staidness +stain +stained +staining +stainless +stains +stair +staircase +staircases +stairs +stairway +stairways +stairwell +stairwells +stake +staked +stakeholder +stakeholders +stakeout +stakeouts +stakes +staking +stalactite +stalactites +stalagmite +stalagmites +stale +staled +stalemate +stalemated +stalemates +stalemating +staleness +staler +stales +stalest +staling +stalk +stalked +stalker +stalkers +stalking +stalkings +stalks +stall +stalled +stalling +stallion +stallions +stalls +stalwart +stalwarts +stamen +stamens +stamina +stammer +stammered +stammerer +stammerers +stammering +stammeringly +stammers +stamp +stamped +stampede +stampeded +stampedes +stampeding +stamper +stampers +stamping +stamps +stance +stances +stanch +stanched +stancher +stanches +stanchest +stanching +stanchion +stanchions +stand +standalone +standard +standardization +standardize +standardized +standardizes +standardizing +standards +standby +standbys +standee +standees +stander +standers +standing +standings +standoff +standoffish +standoffs +standout +standouts +standpipe +standpipes +standpoint +standpoints +stands +standstill +standstills +standup +stank +stanza +stanzas +staph +staphylococcal +staphylococci +staphylococcus +staple +stapled +stapler +staplers +staples +stapling +star +starboard +starch +starched +starches +starchier +starchiest +starchily +starchiness +starching +starchy +stardom +stardust +stare +stared +starer +starers +stares +starfish +starfishes +stargaze +stargazed +stargazer +stargazers +stargazes +stargazing +staring +stark +starker +starkest +starkly +starkness +starless +starlet +starlets +starlight +starling +starlings +starlit +starred +starrier +starriest +starring +starry +stars +start +started +starter +starters +starting +startle +startled +startles +startling +starts +starvation +starve +starved +starveling +starvelings +starves +starving +stash +stashed +stashes +stashing +stat +state +statecraft +stated +statehood +statehouse +statehouses +stateless +statelessness +statelier +stateliest +stateliness +stately +statement +statemented +statementing +statements +stateroom +staterooms +states +stateside +statesman +statesmanlike +statesmanship +statesmen +stateswoman +stateswomen +static +statically +stating +station +stationary +stationed +stationer +stationers +stationery +stationing +stations +statistic +statistical +statistically +statistician +statisticians +statistics +stats +statuary +statue +statues +statuesque +statuette +statuettes +stature +statures +status +statuses +statute +statutes +statutorily +statutory +staunch +staunched +stauncher +staunches +staunchest +staunching +staunchly +staunchness +stave +staved +staves +staving +stay +stayed +staying +stays +stead +steadfast +steadfastly +steadfastness +steadied +steadier +steadies +steadiest +steadily +steadiness +steads +steady +steadying +steak +steakhouse +steakhouses +steaks +steal +stealing +steals +stealth +stealthier +stealthiest +stealthily +stealthiness +stealthy +steam +steamboat +steamboats +steamed +steamer +steamers +steamfitter +steamfitters +steamfitting +steamier +steamiest +steaminess +steaming +steamroll +steamrolled +steamroller +steamrollered +steamrollering +steamrollers +steamrolling +steamrolls +steams +steamship +steamships +steamy +steed +steeds +steel +steeled +steelier +steeliest +steeliness +steeling +steels +steelworker +steelworkers +steelworks +steely +steelyard +steelyards +steep +steeped +steepen +steepened +steepening +steepens +steeper +steepest +steeping +steeple +steeplechase +steeplechases +steeplejack +steeplejacks +steeples +steeply +steepness +steeps +steer +steerable +steerage +steered +steering +steers +steersman +steersmen +stegosauri +stegosaurus +stegosauruses +stein +steins +stellar +stem +stemless +stemmed +stemming +stems +stemware +stench +stenches +stencil +stenciled +stenciling +stencilled +stencilling +stencils +steno +stenographer +stenographers +stenographic +stenography +stenos +stentorian +step +stepbrother +stepbrothers +stepchild +stepchildren +stepdaughter +stepdaughters +stepfather +stepfathers +stepladder +stepladders +stepmother +stepmothers +stepparent +stepparents +steppe +stepped +stepper +steppers +steppes +stepping +steppingstone +steppingstones +steps +stepsister +stepsisters +stepson +stepsons +stereo +stereophonic +stereos +stereoscope +stereoscopes +stereoscopic +stereotype +stereotyped +stereotypes +stereotypical +stereotyping +sterile +sterility +sterilization +sterilize +sterilized +sterilizer +sterilizers +sterilizes +sterilizing +sterling +stern +sterna +sterner +sternest +sternly +sternness +sterns +sternum +sternums +steroid +steroidal +steroids +stertorous +stet +stethoscope +stethoscopes +stets +stetson +stetsons +stetted +stetting +stevedore +stevedores +stew +steward +stewarded +stewardess +stewardesses +stewarding +stewards +stewardship +stewed +stewing +stews +stick +sticker +stickers +stickier +stickies +stickiest +stickily +stickiness +sticking +stickleback +sticklebacks +stickler +sticklers +stickpin +stickpins +sticks +stickup +stickups +sticky +sties +stiff +stiffed +stiffen +stiffened +stiffener +stiffeners +stiffening +stiffens +stiffer +stiffest +stiffing +stiffly +stiffness +stiffs +stifle +stifled +stifles +stifling +stiflingly +stigma +stigmas +stigmata +stigmatic +stigmatization +stigmatize +stigmatized +stigmatizes +stigmatizing +stile +stiles +stiletto +stilettoes +stilettos +still +stillbirth +stillbirths +stillborn +stilled +stiller +stillest +stilling +stillness +stills +stilt +stilted +stilts +stimulant +stimulants +stimulate +stimulated +stimulates +stimulating +stimulation +stimulative +stimuli +stimulus +sting +stinger +stingers +stingier +stingiest +stingily +stinginess +stinging +stingray +stingrays +stings +stingy +stink +stinkbug +stinkbugs +stinker +stinkers +stinkier +stinkiest +stinking +stinks +stinky +stint +stinted +stinting +stints +stipend +stipends +stipple +stippled +stipples +stippling +stipulate +stipulated +stipulates +stipulating +stipulation +stipulations +stir +stirred +stirrer +stirrers +stirring +stirringly +stirrings +stirrup +stirrups +stirs +stitch +stitched +stitchery +stitches +stitching +stoat +stoats +stock +stockade +stockaded +stockades +stockading +stockbreeder +stockbreeders +stockbroker +stockbrokers +stockbroking +stocked +stockholder +stockholders +stockier +stockiest +stockily +stockiness +stockinet +stockinette +stocking +stockings +stockpile +stockpiled +stockpiles +stockpiling +stockpot +stockpots +stockroom +stockrooms +stocks +stocktaking +stocky +stockyard +stockyards +stodgier +stodgiest +stodgily +stodginess +stodgy +stogie +stogies +stogy +stoic +stoical +stoically +stoicism +stoics +stoke +stoked +stoker +stokers +stokes +stoking +stole +stolen +stoles +stolid +stolider +stolidest +stolidity +stolidly +stolidness +stolon +stolons +stomach +stomachache +stomachaches +stomached +stomacher +stomachers +stomaching +stomachs +stomp +stomped +stomping +stomps +stone +stoned +stonemason +stonemasons +stones +stonewall +stonewalled +stonewalling +stonewalls +stoneware +stonewashed +stonework +stoney +stonier +stoniest +stonily +stoniness +stoning +stony +stood +stooge +stooges +stool +stools +stoop +stooped +stooping +stoops +stop +stopcock +stopcocks +stopgap +stopgaps +stoplight +stoplights +stopover +stopovers +stoppage +stoppages +stopped +stopper +stoppered +stoppering +stoppers +stopping +stopple +stoppled +stopples +stoppling +stops +stopwatch +stopwatches +storage +store +stored +storefront +storefronts +storehouse +storehouses +storekeeper +storekeepers +storeroom +storerooms +stores +storey +storeys +storied +stories +storing +stork +storks +storm +stormed +stormier +stormiest +stormily +storminess +storming +storms +stormy +story +storyboard +storyboards +storybook +storybooks +storyteller +storytellers +storytelling +stoup +stoups +stout +stouter +stoutest +stouthearted +stoutly +stoutness +stove +stovepipe +stovepipes +stoves +stow +stowage +stowaway +stowaways +stowed +stowing +stows +straddle +straddled +straddler +straddlers +straddles +straddling +strafe +strafed +strafes +strafing +straggle +straggled +straggler +stragglers +straggles +stragglier +straggliest +straggling +straggly +straight +straightaway +straightaways +straightedge +straightedges +straighten +straightened +straightener +straighteners +straightening +straightens +straighter +straightest +straightforward +straightforwardly +straightforwardness +straightforwards +straightjacket +straightjacketed +straightjacketing +straightjackets +straightly +straightness +straights +straightway +strain +strained +strainer +strainers +straining +strains +strait +straiten +straitened +straitening +straitens +straitjacket +straitjacketed +straitjacketing +straitjackets +straitlaced +straits +strand +stranded +stranding +strands +strange +strangely +strangeness +stranger +strangers +strangest +strangle +strangled +stranglehold +strangleholds +strangler +stranglers +strangles +strangling +strangulate +strangulated +strangulates +strangulating +strangulation +strap +strapless +straplesses +strapped +strapping +straps +strata +stratagem +stratagems +strategic +strategical +strategically +strategics +strategies +strategist +strategists +strategy +strati +stratification +stratified +stratifies +stratify +stratifying +stratosphere +stratospheres +stratospheric +stratum +stratums +stratus +straw +strawberries +strawberry +straws +stray +strayed +straying +strays +streak +streaked +streaker +streakers +streakier +streakiest +streaking +streaks +streaky +stream +streamed +streamer +streamers +streaming +streamline +streamlined +streamlines +streamlining +streams +street +streetcar +streetcars +streetlight +streetlights +streets +streetwalker +streetwalkers +streetwise +strength +strengthen +strengthened +strengthener +strengtheners +strengthening +strengthens +strengths +strenuous +strenuously +strenuousness +strep +streptococcal +streptococci +streptococcus +streptomycin +stress +stressed +stresses +stressful +stressing +stretch +stretchable +stretched +stretcher +stretchers +stretches +stretchier +stretchiest +stretching +stretchy +strew +strewed +strewing +strewn +strews +stria +striae +striated +striation +striations +stricken +strict +stricter +strictest +strictly +strictness +stricture +strictures +stridden +stride +stridency +strident +stridently +strides +striding +strife +strike +strikebreaker +strikebreakers +strikeout +strikeouts +striker +strikers +strikes +striking +strikingly +string +stringed +stringency +stringent +stringently +stringer +stringers +stringier +stringiest +stringiness +stringing +strings +stringy +strip +stripe +striped +stripes +stripier +stripiest +striping +stripling +striplings +stripped +stripper +strippers +stripping +strips +stript +striptease +stripteased +stripteaser +stripteasers +stripteases +stripteasing +stripy +strive +strived +striven +strives +striving +strobe +strobes +stroboscope +stroboscopes +stroboscopic +strode +stroke +stroked +strokes +stroking +stroll +strolled +stroller +strollers +strolling +strolls +strong +strongbox +strongboxes +stronger +strongest +stronghold +strongholds +strongly +strongman +strongmen +strontium +strop +strophe +strophes +strophic +stropped +stropping +strops +strove +struck +structural +structurally +structure +structured +structures +structuring +strudel +strudels +struggle +struggled +struggles +struggling +strum +strummed +strumming +strumpet +strumpets +strums +strung +strut +struts +strutted +strutting +strychnine +stub +stubbed +stubbier +stubbiest +stubbing +stubble +stubblier +stubbliest +stubbly +stubborn +stubborner +stubbornest +stubbornly +stubbornness +stubby +stubs +stucco +stuccoed +stuccoes +stuccoing +stuccos +stuck +stud +studbook +studbooks +studded +studding +student +students +studied +studiedly +studies +studio +studios +studious +studiously +studiousness +studs +study +studying +stuff +stuffed +stuffier +stuffiest +stuffily +stuffiness +stuffing +stuffings +stuffs +stuffy +stultification +stultified +stultifies +stultify +stultifying +stumble +stumbled +stumbler +stumblers +stumbles +stumbling +stump +stumped +stumpier +stumpiest +stumping +stumps +stumpy +stun +stung +stunk +stunned +stunning +stunningly +stuns +stunt +stunted +stunting +stunts +stupefaction +stupefied +stupefies +stupefy +stupefying +stupendous +stupendously +stupid +stupider +stupidest +stupidities +stupidity +stupidly +stupids +stupor +stupors +sturdier +sturdiest +sturdily +sturdiness +sturdy +sturgeon +sturgeons +stutter +stuttered +stutterer +stutterers +stuttering +stutters +stye +styes +style +styled +styles +styli +styling +stylish +stylishly +stylishness +stylist +stylistic +stylistically +stylists +stylize +stylized +stylizes +stylizing +stylus +styluses +stymie +stymied +stymieing +stymies +stymy +stymying +styptic +styptics +suasion +suave +suavely +suaveness +suaver +suavest +suavity +subaltern +subalterns +subarctic +subarea +subareas +subatomic +subbasement +subbasements +subbed +subbing +subbranch +subbranches +subcategories +subcategory +subcommittee +subcommittees +subcompact +subcompacts +subconscious +subconsciously +subconsciousness +subcontinent +subcontinental +subcontinents +subcontract +subcontracted +subcontracting +subcontractor +subcontractors +subcontracts +subculture +subcultures +subcutaneous +subcutaneously +subdivide +subdivided +subdivides +subdividing +subdivision +subdivisions +subdue +subdued +subdues +subduing +subfamilies +subfamily +subfreezing +subgroup +subgroups +subhead +subheading +subheadings +subheads +subhuman +subhumans +subject +subjected +subjecting +subjection +subjective +subjectively +subjectivity +subjects +subjoin +subjoined +subjoining +subjoins +subjugate +subjugated +subjugates +subjugating +subjugation +subjunctive +subjunctives +sublease +subleased +subleases +subleasing +sublet +sublets +subletting +sublimate +sublimated +sublimates +sublimating +sublimation +sublime +sublimed +sublimely +sublimer +sublimes +sublimest +subliminal +subliming +sublimity +submarginal +submarine +submariner +submariners +submarines +submerge +submerged +submergence +submerges +submerging +submerse +submersed +submerses +submersible +submersibles +submersing +submersion +submicroscopic +submission +submissions +submissive +submissively +submissiveness +submit +submits +submitted +submitting +subnormal +suborbital +suborder +suborders +subordinate +subordinated +subordinates +subordinating +subordination +suborn +subornation +suborned +suborning +suborns +subpena +subpenaed +subpenaing +subpenas +subplot +subplots +subpoena +subpoenaed +subpoenaing +subpoenas +subprofessional +subprofessionals +subroutine +subroutines +subs +subscribe +subscribed +subscriber +subscribers +subscribes +subscribing +subscript +subscription +subscriptions +subscripts +subsection +subsections +subsequent +subsequently +subservience +subservient +subserviently +subset +subsets +subside +subsided +subsidence +subsides +subsidiaries +subsidiary +subsidies +subsiding +subsidization +subsidize +subsidized +subsidizer +subsidizers +subsidizes +subsidizing +subsidy +subsist +subsisted +subsistence +subsisting +subsists +subsoil +subsonic +subspecies +substance +substances +substandard +substantial +substantially +substantiate +substantiated +substantiates +substantiating +substantiation +substantiations +substantive +substantively +substantives +substation +substations +substitute +substituted +substitutes +substituting +substitution +substitutions +substrata +substrate +substrates +substratum +substratums +substructure +substructures +subsume +subsumed +subsumes +subsuming +subsurface +subsystem +subsystems +subteen +subteens +subtenancy +subtenant +subtenants +subterfuge +subterfuges +subterranean +subtext +subtexts +subtitle +subtitled +subtitles +subtitling +subtle +subtler +subtlest +subtleties +subtlety +subtly +subtopic +subtopics +subtotal +subtotaled +subtotaling +subtotalled +subtotalling +subtotals +subtract +subtracted +subtracting +subtraction +subtractions +subtracts +subtrahend +subtrahends +subtropic +subtropical +subtropics +suburb +suburban +suburbanite +suburbanites +suburbans +suburbia +suburbs +subvention +subventions +subversion +subversive +subversively +subversiveness +subversives +subvert +subverted +subverting +subverts +subway +subways +subzero +succeed +succeeded +succeeding +succeeds +success +successes +successful +successfully +succession +successions +successive +successively +successor +successors +succinct +succincter +succinctest +succinctly +succinctness +succor +succored +succoring +succors +succotash +succour +succoured +succouring +succours +succulence +succulency +succulent +succulents +succumb +succumbed +succumbing +succumbs +such +suchlike +suck +sucked +sucker +suckered +suckering +suckers +sucking +suckle +suckled +suckles +suckling +sucklings +sucks +sucrose +suction +suctioned +suctioning +suctions +sudden +suddenly +suddenness +suds +sudsier +sudsiest +sudsy +sued +suede +sues +suet +suety +suffer +sufferance +suffered +sufferer +sufferers +suffering +sufferings +suffers +suffice +sufficed +suffices +sufficiency +sufficient +sufficiently +sufficing +suffix +suffixation +suffixed +suffixes +suffixing +suffocate +suffocated +suffocates +suffocating +suffocation +suffragan +suffragans +suffrage +suffragette +suffragettes +suffragist +suffragists +suffuse +suffused +suffuses +suffusing +suffusion +sugar +sugarcane +sugarcoat +sugarcoated +sugarcoating +sugarcoats +sugared +sugarier +sugariest +sugaring +sugarless +sugarplum +sugarplums +sugars +sugary +suggest +suggested +suggestibility +suggestible +suggesting +suggestion +suggestions +suggestive +suggestively +suggestiveness +suggests +suicidal +suicide +suicides +suing +suit +suitability +suitable +suitableness +suitably +suitcase +suitcases +suite +suited +suites +suiting +suitor +suitors +suits +sukiyaki +sulfa +sulfate +sulfates +sulfide +sulfides +sulfur +sulfuric +sulfurous +sulk +sulked +sulkier +sulkies +sulkiest +sulkily +sulkiness +sulking +sulks +sulky +sullen +sullener +sullenest +sullenly +sullenness +sullied +sullies +sully +sullying +sulphur +sulphured +sulphuring +sulphurous +sulphurs +sultan +sultana +sultanas +sultanate +sultanates +sultans +sultrier +sultriest +sultrily +sultriness +sultry +sumac +sumach +summaries +summarily +summarize +summarized +summarizes +summarizing +summary +summation +summations +summed +summer +summered +summerhouse +summerhouses +summering +summers +summertime +summery +summing +summit +summitry +summits +summon +summoned +summoner +summoners +summoning +summons +summonsed +summonses +summonsing +sumo +sump +sumps +sumptuous +sumptuously +sumptuousness +sums +sunbath +sunbathe +sunbathed +sunbather +sunbathers +sunbathes +sunbathing +sunbaths +sunbeam +sunbeams +sunbelt +sunbelts +sunblock +sunblocks +sunbonnet +sunbonnets +sunburn +sunburned +sunburning +sunburns +sunburnt +sunburst +sunbursts +sundae +sundaes +sunder +sundered +sundering +sunders +sundial +sundials +sundown +sundowns +sundries +sundry +sunfish +sunfishes +sunflower +sunflowers +sung +sunglasses +sunk +sunken +sunlamp +sunlamps +sunless +sunlight +sunlit +sunned +sunnier +sunniest +sunniness +sunning +sunny +sunrise +sunrises +sunroof +sunroofs +suns +sunscreen +sunscreens +sunset +sunsets +sunshade +sunshades +sunshine +sunshiny +sunspot +sunspots +sunstroke +suntan +suntanned +suntanning +suntans +sunup +super +superabundance +superabundances +superabundant +superannuate +superannuated +superannuates +superannuating +superannuation +superb +superber +superbest +superbly +supercargo +supercargoes +supercargos +supercharge +supercharged +supercharger +superchargers +supercharges +supercharging +supercilious +superciliously +superciliousness +supercities +supercity +supercomputer +supercomputers +superconducting +superconductive +superconductivity +superconductor +superconductors +superego +superegos +supererogation +supererogatory +superficial +superficiality +superficially +superfine +superfluity +superfluous +superfluously +superfluousness +superhero +superheroes +superhighway +superhighways +superhuman +superimpose +superimposed +superimposes +superimposing +superimposition +superintend +superintended +superintendence +superintendency +superintendent +superintendents +superintending +superintends +superior +superiority +superiors +superlative +superlatively +superlatives +superman +supermarket +supermarkets +supermen +supermom +supermoms +supernal +supernatural +supernaturally +supernova +supernovae +supernovas +supernumeraries +supernumerary +superpose +superposed +superposes +superposing +superposition +superpower +superpowers +supers +supersaturate +supersaturated +supersaturates +supersaturating +supersaturation +superscribe +superscribed +superscribes +superscribing +superscript +superscription +superscripts +supersede +superseded +supersedes +superseding +supersonic +superstar +superstars +superstition +superstitions +superstitious +superstitiously +superstore +superstores +superstructure +superstructures +supertanker +supertankers +supervene +supervened +supervenes +supervening +supervention +supervise +supervised +supervises +supervising +supervision +supervisor +supervisors +supervisory +superwoman +superwomen +supine +supped +supper +suppers +supping +supplant +supplanted +supplanting +supplants +supple +supplement +supplemental +supplementary +supplementation +supplemented +supplementing +supplements +suppleness +suppler +supplest +suppliant +suppliants +supplicant +supplicants +supplicate +supplicated +supplicates +supplicating +supplication +supplications +supplied +supplier +suppliers +supplies +supply +supplying +support +supportable +supported +supporter +supporters +supporting +supportive +supports +suppose +supposed +supposedly +supposes +supposing +supposition +suppositions +suppositories +suppository +suppress +suppressant +suppressants +suppressed +suppresses +suppressible +suppressing +suppression +suppressor +suppressors +suppurate +suppurated +suppurates +suppurating +suppuration +supra +supranational +supremacist +supremacists +supremacy +supreme +supremely +sups +surcease +surceased +surceases +surceasing +surcharge +surcharged +surcharges +surcharging +surcingle +surcingles +sure +surefire +surefooted +surely +sureness +surer +surest +sureties +surety +surf +surface +surfaced +surfaces +surfacing +surfboard +surfboarded +surfboarding +surfboards +surfed +surfeit +surfeited +surfeiting +surfeits +surfer +surfers +surfing +surfs +surge +surged +surgeon +surgeons +surgeries +surgery +surges +surgical +surgically +surging +surlier +surliest +surliness +surly +surmise +surmised +surmises +surmising +surmount +surmountable +surmounted +surmounting +surmounts +surname +surnames +surpass +surpassed +surpasses +surpassing +surplice +surplices +surplus +surplused +surpluses +surplusing +surplussed +surplussing +surprise +surprised +surprises +surprising +surprisingly +surreal +surrealism +surrealist +surrealistic +surrealistically +surrealists +surrender +surrendered +surrendering +surrenders +surreptitious +surreptitiously +surreptitiousness +surrey +surreys +surrogacy +surrogate +surrogates +surround +surrounded +surrounding +surroundings +surrounds +surtax +surtaxed +surtaxes +surtaxing +surveillance +survey +surveyed +surveying +surveyor +surveyors +surveys +survival +survivalist +survivalists +survivals +survive +survived +survives +surviving +survivor +survivors +susceptibility +susceptible +sushi +suspect +suspected +suspecting +suspects +suspend +suspended +suspender +suspenders +suspending +suspends +suspense +suspenseful +suspension +suspensions +suspicion +suspicions +suspicious +suspiciously +sustain +sustainable +sustained +sustaining +sustains +sustenance +sutler +sutlers +suture +sutured +sutures +suturing +suzerain +suzerains +suzerainty +svelte +svelter +sveltest +swab +swabbed +swabbing +swabs +swaddle +swaddled +swaddles +swaddling +swag +swagged +swagger +swaggered +swaggering +swaggers +swagging +swags +swain +swains +swallow +swallowed +swallowing +swallows +swallowtail +swallowtails +swam +swami +swamis +swamp +swamped +swampier +swampiest +swamping +swampland +swamps +swampy +swan +swank +swanked +swanker +swankest +swankier +swankiest +swankily +swankiness +swanking +swanks +swanky +swans +swansdown +swap +swapped +swapping +swaps +sward +swards +swarm +swarmed +swarming +swarms +swarthier +swarthiest +swarthy +swash +swashbuckler +swashbucklers +swashbuckling +swashed +swashes +swashing +swastika +swastikas +swat +swatch +swatches +swath +swathe +swathed +swathes +swathing +swaths +swats +swatted +swatter +swatters +swatting +sway +swayback +swaybacked +swayed +swaying +sways +swear +swearer +swearers +swearing +swears +swearword +swearwords +sweat +sweatband +sweatbands +sweated +sweater +sweaters +sweatier +sweatiest +sweating +sweatpants +sweats +sweatshirt +sweatshirts +sweatshop +sweatshops +sweaty +swede +swedes +sweep +sweeper +sweepers +sweeping +sweepingly +sweepings +sweeps +sweepstake +sweepstakes +sweet +sweetbread +sweetbreads +sweetbriar +sweetbriars +sweetbrier +sweetbriers +sweeten +sweetened +sweetener +sweeteners +sweetening +sweetens +sweeter +sweetest +sweetheart +sweethearts +sweetie +sweeties +sweetish +sweetly +sweetmeat +sweetmeats +sweetness +sweets +swell +swelled +sweller +swellest +swellhead +swellheaded +swellheads +swelling +swellings +swells +swelter +sweltered +sweltering +swelters +swept +sweptback +swerve +swerved +swerves +swerving +swift +swifter +swiftest +swiftly +swiftness +swifts +swig +swigged +swigging +swigs +swill +swilled +swilling +swills +swim +swimmer +swimmers +swimming +swimmingly +swims +swimsuit +swimsuits +swindle +swindled +swindler +swindlers +swindles +swindling +swine +swineherd +swineherds +swines +swing +swinger +swingers +swinging +swings +swinish +swipe +swiped +swipes +swiping +swirl +swirled +swirlier +swirliest +swirling +swirls +swirly +swish +swished +swisher +swishes +swishest +swishing +switch +switchback +switchbacks +switchblade +switchblades +switchboard +switchboards +switched +switcher +switchers +switches +switching +swivel +swiveled +swiveling +swivelled +swivelling +swivels +swob +swobbed +swobbing +swobs +swollen +swoon +swooned +swooning +swoons +swoop +swooped +swooping +swoops +swoosh +swooshed +swooshes +swooshing +swop +swopped +swopping +swops +sword +swordfish +swordfishes +swordplay +swords +swordsman +swordsmanship +swordsmen +swore +sworn +swum +swung +sybarite +sybarites +sybaritic +sycamore +sycamores +sycophancy +sycophant +sycophantic +sycophants +syllabi +syllabic +syllabicate +syllabicated +syllabicates +syllabicating +syllabication +syllabification +syllabified +syllabifies +syllabify +syllabifying +syllable +syllables +syllabus +syllabuses +syllogism +syllogisms +syllogistic +sylph +sylphic +sylphlike +sylphs +sylvan +symbioses +symbiosis +symbiotic +symbol +symbolic +symbolical +symbolically +symbolism +symbolization +symbolize +symbolized +symbolizes +symbolizing +symbols +symmetric +symmetrical +symmetrically +symmetry +sympathetic +sympathetically +sympathies +sympathize +sympathized +sympathizer +sympathizers +sympathizes +sympathizing +sympathy +symphonic +symphonies +symphony +symposia +symposium +symposiums +symptom +symptomatic +symptomatically +symptoms +synagog +synagogal +synagogs +synagogue +synagogues +synapse +synapses +synaptic +sync +synced +synch +synched +synching +synchronization +synchronizations +synchronize +synchronized +synchronizes +synchronizing +synchronous +synchs +syncing +syncopate +syncopated +syncopates +syncopating +syncopation +syncope +syncs +syndicate +syndicated +syndicates +syndicating +syndication +syndrome +syndromes +synergism +synergistic +synergy +synfuel +synfuels +synod +synods +synonym +synonymous +synonyms +synonymy +synopses +synopsis +synoptic +syntactic +syntactical +syntactically +syntax +syntheses +synthesis +synthesize +synthesized +synthesizer +synthesizers +synthesizes +synthesizing +synthetic +synthetically +synthetics +syphilis +syphilitic +syphilitics +syphon +syphoned +syphoning +syphons +syringe +syringed +syringes +syringing +syrup +syrups +syrupy +system +systematic +systematical +systematically +systematization +systematize +systematized +systematizes +systematizing +systemic +systemically +systemics +systems +systole +systoles +systolic +tabbed +tabbies +tabbing +tabbouleh +tabby +tabernacle +tabernacles +tabla +tablas +table +tableau +tableaus +tableaux +tablecloth +tablecloths +tabled +tableland +tablelands +tables +tablespoon +tablespoonful +tablespoonfuls +tablespoons +tablespoonsful +tablet +tabletop +tabletops +tablets +tableware +tabling +tabloid +tabloids +taboo +tabooed +tabooing +taboos +tabor +tabors +tabs +tabu +tabued +tabuing +tabular +tabulate +tabulated +tabulates +tabulating +tabulation +tabulator +tabulators +tabus +tachometer +tachometers +tachycardia +tacit +tacitly +tacitness +taciturn +taciturnity +taciturnly +tack +tacked +tacker +tackers +tackier +tackiest +tackiness +tacking +tackle +tackled +tackler +tacklers +tackles +tackling +tacks +tacky +taco +tacos +tact +tactful +tactfully +tactfulness +tactic +tactical +tactically +tactician +tacticians +tactics +tactile +tactility +tactless +tactlessly +tactlessness +tadpole +tadpoles +tads +taffeta +taffies +taffrail +taffrails +taffy +tagged +tagger +taggers +tagging +tags +taiga +taigas +tail +tailback +tailbacks +tailcoat +tailcoats +tailed +tailgate +tailgated +tailgater +tailgaters +tailgates +tailgating +tailing +tailless +taillight +taillights +tailor +tailored +tailoring +tailors +tailpipe +tailpipes +tails +tailspin +tailspins +tailwind +tailwinds +taint +tainted +tainting +taints +take +taken +takeoff +takeoffs +takeout +takeouts +takeover +takeovers +taker +takers +takes +taking +takings +talc +talcum +tale +talebearer +talebearers +talent +talented +talents +tales +tali +talisman +talismans +talk +talkative +talkatively +talkativeness +talked +talker +talkers +talkie +talkier +talkies +talkiest +talking +talks +talky +tall +tallboy +tallboys +taller +tallest +tallied +tallier +talliers +tallies +tallish +tallness +tallow +tallowy +tally +tallyho +tallyhoed +tallyhoing +tallyhos +tallying +talon +talons +talus +taluses +tamable +tamale +tamales +tamarack +tamaracks +tamarind +tamarinds +tambourine +tambourines +tame +tameable +tamed +tamely +tameness +tamer +tamers +tames +tamest +taming +tamp +tamped +tamper +tampered +tamperer +tamperers +tampering +tampers +tamping +tampon +tampons +tamps +tams +tanager +tanagers +tanbark +tandem +tandems +tandoori +tang +tangelo +tangelos +tangent +tangential +tangentially +tangents +tangerine +tangerines +tangibility +tangible +tangibleness +tangibles +tangibly +tangier +tangiest +tangle +tangled +tangles +tangling +tango +tangoed +tangoing +tangos +tangs +tangy +tank +tankard +tankards +tanked +tanker +tankers +tankful +tankfuls +tanking +tanks +tanned +tanner +tanneries +tanners +tannery +tannest +tannin +tanning +tans +tansy +tantalise +tantalised +tantalises +tantalising +tantalization +tantalize +tantalized +tantalizer +tantalizers +tantalizes +tantalizing +tantalizingly +tantalum +tantamount +tantra +tantrum +tantrums +tape +taped +tapeline +tapelines +taper +tapered +tapering +tapers +tapes +tapestries +tapestry +tapeworm +tapeworms +taping +tapioca +tapir +tapirs +tapped +tapper +tappers +tappet +tappets +tapping +taproom +taprooms +taproot +taproots +taps +tarantella +tarantellas +tarantula +tarantulae +tarantulas +tardier +tardiest +tardily +tardiness +tardy +tare +tared +tares +target +targeted +targeting +targets +tariff +tariffs +taring +tarmac +tarmacked +tarmacking +tarmacs +tarn +tarnish +tarnished +tarnishes +tarnishing +tarns +taro +taros +tarot +tarots +tarp +tarpaulin +tarpaulins +tarpon +tarpons +tarps +tarragon +tarragons +tarred +tarried +tarrier +tarries +tarriest +tarring +tarry +tarrying +tars +tarsal +tarsals +tarsi +tarsus +tart +tartan +tartans +tartar +tartaric +tartars +tarter +tartest +tartly +tartness +tarts +task +tasked +tasking +taskmaster +taskmasters +taskmistress +taskmistresses +tasks +tassel +tasseled +tasseling +tasselled +tasselling +tassels +taste +tasted +tasteful +tastefully +tastefulness +tasteless +tastelessly +tastelessness +taster +tasters +tastes +tastier +tastiest +tastily +tastiness +tasting +tastings +tasty +tatami +tatamis +tater +taters +tats +tatted +tatter +tatterdemalion +tatterdemalions +tattered +tattering +tatters +tatting +tattle +tattled +tattler +tattlers +tattles +tattletale +tattletales +tattling +tattoo +tattooed +tattooer +tattooers +tattooing +tattooist +tattooists +tattoos +taught +taunt +taunted +taunter +taunters +taunting +tauntingly +taunts +taupe +taus +taut +tauten +tautened +tautening +tautens +tauter +tautest +tautly +tautness +tautological +tautologically +tautologies +tautologous +tautology +tavern +taverns +tawdrier +tawdriest +tawdrily +tawdriness +tawdry +tawnier +tawniest +tawny +taxable +taxation +taxed +taxer +taxers +taxes +taxi +taxicab +taxicabs +taxidermist +taxidermists +taxidermy +taxied +taxies +taxiing +taximeter +taximeters +taxing +taxis +taxonomic +taxonomical +taxonomies +taxonomist +taxonomists +taxonomy +taxpayer +taxpayers +taxpaying +taxying +teacake +teacakes +teach +teachable +teacher +teachers +teaches +teaching +teachings +teacup +teacupful +teacupfuls +teacups +teak +teakettle +teakettles +teaks +teal +teals +team +teamed +teaming +teammate +teammates +teams +teamster +teamsters +teamwork +teapot +teapots +tear +teardrop +teardrops +teared +tearful +tearfully +teargas +teargases +teargassed +teargasses +teargassing +tearier +teariest +tearing +tearjerker +tearjerkers +tearoom +tearooms +tears +teary +teas +tease +teased +teasel +teasels +teaser +teasers +teases +teasing +teaspoon +teaspoonful +teaspoonfuls +teaspoons +teaspoonsful +teat +teats +tech +technetium +technical +technicalities +technicality +technically +technician +technicians +technique +techniques +technocracy +technocrat +technocratic +technocrats +technological +technologically +technologies +technologist +technologists +technology +techs +tectonic +tectonics +tedious +tediously +tediousness +tedium +teed +teeing +teem +teemed +teeming +teems +teen +teenage +teenaged +teenager +teenagers +teenier +teeniest +teens +teensier +teensiest +teensy +teeny +teenybopper +teenyboppers +teepee +teepees +tees +teeter +teetered +teetering +teeters +teeth +teethe +teethed +teethes +teething +teetotal +teetotaler +teetotalers +teetotalism +teetotaller +teetotallers +tektite +tektites +telecast +telecasted +telecaster +telecasters +telecasting +telecasts +telecommunication +telecommunications +telecommute +telecommuted +telecommuter +telecommuters +telecommutes +telecommuting +teleconference +teleconferenced +teleconferences +teleconferencing +telegenic +telegram +telegrams +telegraph +telegraphed +telegrapher +telegraphers +telegraphic +telegraphically +telegraphing +telegraphist +telegraphists +telegraphs +telegraphy +telekinesis +telekinetic +telemarketer +telemarketers +telemarketing +telemeter +telemeters +telemetries +telemetry +telepathic +telepathically +telepathy +telephone +telephoned +telephoner +telephoners +telephones +telephonic +telephoning +telephony +telephoto +telephotography +telephotos +teleplay +teleplays +teleprinter +teleprinters +teleprocessing +teleprompter +teleprompters +telescope +telescoped +telescopes +telescopic +telescopically +telescoping +teletext +teletexts +telethon +telethons +teletypewriter +teletypewriters +televangelism +televangelist +televangelists +televise +televised +televises +televising +television +televisions +telex +telexed +telexes +telexing +tell +teller +tellers +tellies +telling +tellingly +tells +telltale +telltales +tellurium +telly +temblor +temblors +temerity +temp +temped +temper +tempera +temperament +temperamental +temperamentally +temperaments +temperance +temperas +temperate +temperately +temperateness +temperature +temperatures +tempered +tempering +tempers +tempest +tempests +tempestuous +tempestuously +tempestuousness +tempi +temping +template +templates +temple +temples +tempo +temporal +temporally +temporaries +temporarily +temporariness +temporary +temporize +temporized +temporizer +temporizers +temporizes +temporizing +tempos +temps +tempt +temptation +temptations +tempted +tempter +tempters +tempting +temptingly +temptress +temptresses +tempts +tempura +tenability +tenable +tenably +tenacious +tenaciously +tenaciousness +tenacity +tenancies +tenancy +tenant +tenanted +tenanting +tenantry +tenants +tend +tended +tendencies +tendency +tendentious +tendentiously +tendentiousness +tender +tendered +tenderer +tenderest +tenderfeet +tenderfoot +tenderfoots +tenderhearted +tenderheartedness +tendering +tenderize +tenderized +tenderizer +tenderizers +tenderizes +tenderizing +tenderloin +tenderloins +tenderly +tenderness +tenders +tending +tendinitis +tendon +tendonitis +tendons +tendril +tendrils +tends +tenement +tenements +tenet +tenets +tenfold +tennis +tenon +tenoned +tenoning +tenons +tenor +tenors +tenpin +tenpins +tens +tense +tensed +tensely +tenseness +tenser +tenses +tensest +tensile +tensing +tension +tensions +tensity +tent +tentacle +tentacled +tentacles +tentative +tentatively +tentativeness +tented +tenterhook +tenterhooks +tenth +tenthly +tenths +tenting +tents +tenuity +tenuous +tenuously +tenuousness +tenure +tenured +tenures +tenuring +tepee +tepees +tepid +tepider +tepidest +tepidity +tepidly +tepidness +tequila +tequilas +terabyte +terabytes +terbium +tercentenaries +tercentenary +tercentennial +tercentennials +term +termagant +termagants +termed +terminable +terminal +terminally +terminals +terminate +terminated +terminates +terminating +termination +terminations +terming +termini +terminological +terminologically +terminologies +terminology +terminus +terminuses +termite +termites +termly +terms +tern +ternaries +ternary +terns +terrace +terraced +terraces +terracing +terracotta +terrain +terrains +terrapin +terrapins +terraria +terrarium +terrariums +terrazzo +terrazzos +terrestrial +terrestrially +terrestrials +terrible +terribleness +terribly +terrier +terriers +terrific +terrifically +terrified +terrifies +terrify +terrifying +terrifyingly +territorial +territorials +territories +territory +terror +terrorism +terrorist +terrorists +terrorize +terrorized +terrorizes +terrorizing +terrors +terry +terrycloth +terse +tersely +terseness +terser +tersest +tertiary +tessellate +tessellated +tessellates +tessellating +tessellation +tessellations +test +testament +testamentary +testaments +testate +testator +testators +testatrices +testatrix +tested +tester +testers +testes +testicle +testicles +testier +testiest +testified +testifier +testifiers +testifies +testify +testifying +testily +testimonial +testimonials +testimonies +testimony +testiness +testing +testis +testosterone +tests +testy +tetanus +tetchier +tetchiest +tetchy +tether +tethered +tethering +tethers +tetra +tetracycline +tetrahedra +tetrahedral +tetrahedron +tetrahedrons +tetrameter +tetrameters +tetras +text +textbook +textbooks +textile +textiles +texts +textual +textually +textural +texture +textured +textures +texturing +thalami +thalamus +thalidomide +thallium +than +thane +thanes +thank +thanked +thankful +thankfully +thankfulness +thanking +thankless +thanklessly +thanklessness +thanks +thanksgiving +thanksgivings +that +thatch +thatched +thatcher +thatchers +thatches +thatching +thaw +thawed +thawing +thaws +theater +theatergoer +theatergoers +theaters +theatre +theatres +theatrical +theatricality +theatrically +theatricals +theatrics +thee +theft +thefts +their +theirs +theism +theist +theistic +theists +them +thematic +thematically +theme +themes +themselves +then +thence +thenceforth +thenceforward +theocracies +theocracy +theocratic +theologian +theologians +theological +theologically +theologies +theology +theorem +theorems +theoretic +theoretical +theoretically +theoretician +theoreticians +theories +theorist +theorists +theorize +theorized +theorizes +theorizing +theory +theosophic +theosophical +theosophist +theosophists +theosophy +therapeutic +therapeutically +therapeutics +therapies +therapist +therapists +therapy +there +thereabout +thereabouts +thereafter +thereat +thereby +therefor +therefore +therein +thereof +thereon +thereto +theretofore +thereunto +thereupon +therewith +therm +thermal +thermally +thermals +thermodynamic +thermodynamics +thermometer +thermometers +thermometric +thermonuclear +thermoplastic +thermoplastics +thermos +thermoses +thermostat +thermostatic +thermostatically +thermostats +therms +thesauri +thesaurus +thesauruses +these +theses +thesis +thespian +thespians +theta +thetas +thew +thews +they +thiamin +thiamine +thick +thicken +thickened +thickener +thickeners +thickening +thickenings +thickens +thicker +thickest +thicket +thickets +thickheaded +thickly +thickness +thicknesses +thickset +thief +thieve +thieved +thievery +thieves +thieving +thievish +thigh +thighbone +thighbones +thighs +thimble +thimbleful +thimblefuls +thimbles +thin +thine +thing +thingamabob +thingamabobs +thingamajig +thingamajigs +things +think +thinkable +thinker +thinkers +thinking +thinks +thinly +thinned +thinner +thinners +thinness +thinnest +thinning +thins +third +thirdly +thirds +thirst +thirsted +thirstier +thirstiest +thirstily +thirstiness +thirsting +thirsts +thirsty +thirteen +thirteens +thirteenth +thirteenths +thirties +thirtieth +thirtieths +thirty +this +thistle +thistledown +thistles +thither +thole +tholes +thong +thongs +thoraces +thoracic +thorax +thoraxes +thorium +thorn +thornier +thorniest +thorniness +thorns +thorny +thorough +thoroughbred +thoroughbreds +thorougher +thoroughest +thoroughfare +thoroughfares +thoroughgoing +thoroughly +thoroughness +those +thou +though +thought +thoughtful +thoughtfully +thoughtfulness +thoughtless +thoughtlessly +thoughtlessness +thoughts +thous +thousand +thousandfold +thousands +thousandth +thousandths +thraldom +thrall +thralldom +thralled +thralling +thralls +thrash +thrashed +thrasher +thrashers +thrashes +thrashing +thrashings +thread +threadbare +threaded +threader +threaders +threadier +threadiest +threading +threadlike +threads +thready +threat +threaten +threatened +threatening +threateningly +threatens +threats +three +threefold +threepence +threepences +threes +threescore +threescores +threesome +threesomes +threnodies +threnody +thresh +threshed +thresher +threshers +threshes +threshing +threshold +thresholds +threw +thrice +thrift +thriftier +thriftiest +thriftily +thriftiness +thriftless +thrifts +thrifty +thrill +thrilled +thriller +thrillers +thrilling +thrillingly +thrills +thrive +thrived +thriven +thrives +thriving +throat +throatier +throatiest +throatily +throatiness +throats +throaty +throb +throbbed +throbbing +throbs +throe +throes +thrombi +thromboses +thrombosis +thrombotic +thrombus +throne +thrones +throng +thronged +thronging +throngs +throttle +throttled +throttler +throttlers +throttles +throttling +through +throughout +throughput +throughway +throughways +throve +throw +throwaway +throwaways +throwback +throwbacks +thrower +throwers +throwing +thrown +throws +thru +thrum +thrummed +thrumming +thrums +thrush +thrushes +thrust +thrusting +thrusts +thruway +thruways +thud +thudded +thudding +thuds +thug +thuggery +thuggish +thugs +thulium +thumb +thumbed +thumbing +thumbnail +thumbnails +thumbprint +thumbprints +thumbs +thumbscrew +thumbscrews +thumbtack +thumbtacks +thump +thumped +thumping +thumpings +thumps +thunder +thunderbolt +thunderbolts +thunderclap +thunderclaps +thundercloud +thunderclouds +thundered +thunderer +thunderers +thunderhead +thunderheads +thundering +thunderous +thunderously +thunders +thundershower +thundershowers +thunderstorm +thunderstorms +thunderstricken +thunderstruck +thus +thwack +thwacked +thwacker +thwackers +thwacking +thwacks +thwart +thwarted +thwarting +thwarts +thyme +thymi +thymine +thymus +thymuses +thyroid +thyroidal +thyroids +thyself +tiara +tiaras +tibia +tibiae +tibial +tibias +tick +ticked +ticker +tickers +ticket +ticketed +ticketing +tickets +ticking +tickle +tickled +tickler +ticklers +tickles +tickling +ticklish +ticklishly +ticklishness +ticks +ticktacktoe +ticktock +ticktocks +tics +tidal +tidally +tidbit +tidbits +tiddlywinks +tide +tided +tideland +tidelands +tides +tidewater +tidewaters +tideway +tideways +tidied +tidier +tidies +tidiest +tidily +tidiness +tiding +tidings +tidy +tidying +tieback +tiebacks +tiebreaker +tiebreakers +tied +tieing +tier +tiered +tiers +ties +tiff +tiffed +tiffing +tiffs +tiger +tigerish +tigers +tight +tighten +tightened +tightener +tighteners +tightening +tightens +tighter +tightest +tightfisted +tightly +tightness +tightrope +tightropes +tights +tightwad +tightwads +tigress +tigresses +tike +tikes +tilde +tildes +tile +tiled +tiler +tilers +tiles +tiling +till +tillable +tillage +tilled +tiller +tillers +tilling +tills +tilt +tilted +tilting +tilts +timber +timbered +timbering +timberland +timberline +timberlines +timbers +timbre +timbrel +timbrels +timbres +time +timed +timekeeper +timekeepers +timekeeping +timeless +timelessly +timelessness +timelier +timeliest +timeliness +timely +timeout +timeouts +timepiece +timepieces +timer +timers +times +timeserver +timeservers +timeserving +timetable +timetabled +timetables +timetabling +timeworn +timid +timider +timidest +timidity +timidly +timidness +timing +timorous +timorously +timorousness +timothy +timpani +timpanist +timpanists +tincture +tinctured +tinctures +tincturing +tinder +tinderbox +tinderboxes +tine +tines +tinfoil +ting +tinge +tinged +tingeing +tinges +tinging +tingle +tingled +tingles +tinglier +tingliest +tingling +tinglings +tingly +tings +tinier +tiniest +tininess +tinker +tinkered +tinkerer +tinkerers +tinkering +tinkers +tinkle +tinkled +tinkles +tinkling +tinned +tinnier +tinniest +tinniness +tinning +tinnitus +tinny +tinplate +tins +tinsel +tinseled +tinseling +tinselled +tinselling +tinsels +tinsmith +tinsmiths +tint +tinted +tinting +tintinnabulation +tintinnabulations +tints +tintype +tintypes +tinware +tiny +tipi +tipis +tipped +tipper +tippers +tippet +tippets +tipping +tipple +tippled +tippler +tipplers +tipples +tippling +tips +tipsier +tipsiest +tipsily +tipsiness +tipster +tipsters +tipsy +tiptoe +tiptoed +tiptoeing +tiptoes +tiptop +tiptops +tirade +tirades +tire +tired +tireder +tiredest +tiredly +tiredness +tireless +tirelessly +tirelessness +tires +tiresome +tiresomely +tiresomeness +tiring +tiro +tiros +tissue +tissues +titan +titanic +titanium +titans +titbit +titbits +tithe +tithed +tither +tithers +tithes +tithing +titian +titillate +titillated +titillates +titillating +titillatingly +titillation +titivate +titivated +titivates +titivating +titivation +title +titled +titleholder +titleholders +titles +titling +titlist +titlists +titmice +titmouse +tits +titter +tittered +tittering +titters +tittivate +tittivated +tittivates +tittivating +tittle +tittles +titular +tizzies +tizzy +toad +toadied +toadies +toads +toadstool +toadstools +toady +toadying +toadyism +toast +toasted +toaster +toasters +toastier +toastiest +toasting +toastmaster +toastmasters +toastmistress +toastmistresses +toasts +toasty +tobacco +tobaccoes +tobacconist +tobacconists +tobaccos +toboggan +tobogganed +tobogganer +tobogganers +tobogganing +toboggans +tocsin +tocsins +today +toddies +toddle +toddled +toddler +toddlers +toddles +toddling +toddy +toecap +toecaps +toed +toehold +toeholds +toeing +toenail +toenails +toes +toffee +toffees +toffies +toffy +tofu +toga +togae +togaed +togas +together +togetherness +togged +togging +toggle +toggled +toggles +toggling +togs +toil +toiled +toiler +toilers +toilet +toileted +toileting +toiletries +toiletry +toilets +toilette +toiling +toils +toilsome +toke +toked +token +tokenism +tokens +tokes +toking +told +tole +tolerable +tolerably +tolerance +tolerances +tolerant +tolerantly +tolerate +tolerated +tolerates +tolerating +toleration +toll +tollbooth +tollbooths +tolled +tollgate +tollgates +tolling +tolls +tollway +tollways +toluene +tomahawk +tomahawked +tomahawking +tomahawks +tomato +tomatoes +tomb +tombed +tombing +tomboy +tomboyish +tomboys +tombs +tombstone +tombstones +tomcat +tomcats +tome +tomes +tomfooleries +tomfoolery +tomographic +tomography +tomorrow +tomorrows +toms +tomtit +tomtits +tonal +tonalities +tonality +tonally +tone +tonearm +tonearms +toned +toneless +tonelessly +toner +tones +tong +tonged +tonging +tongs +tongue +tongued +tongueless +tongues +tonguing +tonic +tonics +tonier +toniest +tonight +toning +tonnage +tonnages +tonne +tonnes +tons +tonsil +tonsillectomies +tonsillectomy +tonsillitis +tonsils +tonsorial +tonsure +tonsured +tonsures +tonsuring +tony +took +tool +toolbox +toolboxes +tooled +tooling +toolmaker +toolmakers +tools +toot +tooted +tooter +tooters +tooth +toothache +toothaches +toothbrush +toothbrushes +toothed +toothier +toothiest +toothily +toothless +toothpaste +toothpastes +toothpick +toothpicks +toothsome +toothy +tooting +tootle +tootled +tootles +tootling +toots +topaz +topazes +topcoat +topcoats +topdressing +topdressings +topflight +topiary +topic +topical +topicality +topically +topics +topknot +topknots +topless +topmast +topmasts +topmost +topnotch +topographer +topographers +topographic +topographical +topographically +topographies +topography +topped +topper +toppers +topping +toppings +topple +toppled +topples +toppling +tops +topsail +topsails +topside +topsides +topsoil +topspin +toque +toques +torah +torahs +torch +torchbearer +torchbearers +torched +torches +torching +torchlight +tore +toreador +toreadors +torment +tormented +tormenter +tormenters +tormenting +tormentingly +tormentor +tormentors +torments +torn +tornado +tornadoes +tornados +torpedo +torpedoed +torpedoes +torpedoing +torpid +torpidity +torpidly +torpor +torque +torqued +torques +torquing +torrent +torrential +torrents +torrid +torridity +torridly +torridness +tors +torsi +torsion +torsional +torso +torsos +tort +torte +tortellini +tortes +tortilla +tortillas +tortoise +tortoises +tortoiseshell +tortoiseshells +tortoni +torts +tortuous +tortuously +tortuousness +torture +tortured +torturer +torturers +tortures +torturing +torturous +toss +tossed +tosses +tossing +tossup +tossups +tost +total +totaled +totaling +totalisator +totalisators +totalitarian +totalitarianism +totalitarians +totalities +totality +totalizator +totalizators +totalled +totalling +totally +totals +tote +toted +totem +totemic +totems +totes +toting +tots +totted +totter +tottered +totterer +totterers +tottering +totters +totting +toucan +toucans +touch +touchable +touchdown +touchdowns +touche +touched +touches +touchier +touchiest +touchily +touchiness +touching +touchingly +touchscreen +touchscreens +touchstone +touchstones +touchy +tough +toughen +toughened +toughener +tougheners +toughening +toughens +tougher +toughest +toughie +toughies +toughly +toughness +toughs +toupee +toupees +tour +toured +touring +tourism +tourist +tourists +tourmaline +tournament +tournaments +tourney +tourneys +tourniquet +tourniquets +tours +tousle +tousled +tousles +tousling +tout +touted +touting +touts +toward +towards +towboat +towboats +towed +towel +toweled +towelette +towelettes +toweling +towelled +towelling +towels +tower +towered +towering +towers +towhead +towheaded +towheads +towhee +towhees +towing +towline +towlines +town +townhouse +townhouses +townie +townies +towns +townsfolk +township +townships +townsman +townsmen +townspeople +townswoman +townswomen +towpath +towpaths +towrope +towropes +tows +toxemia +toxic +toxicity +toxicological +toxicologist +toxicologists +toxicology +toxin +toxins +toyed +toying +toys +trace +traceable +traced +tracer +traceries +tracers +tracery +traces +trachea +tracheae +tracheal +tracheas +tracheotomies +tracheotomy +tracing +tracings +track +trackball +trackballs +tracked +tracker +trackers +tracking +trackless +tracks +tract +tractability +tractable +tractably +traction +tractor +tractors +tracts +trade +traded +trademark +trademarked +trademarking +trademarks +tradeoff +tradeoffs +trader +traders +trades +tradesman +tradesmen +tradespeople +tradeswoman +tradeswomen +trading +tradings +tradition +traditional +traditionalism +traditionalist +traditionalists +traditionally +traditions +traduce +traduced +traducer +traducers +traduces +traducing +traffic +trafficked +trafficker +traffickers +trafficking +traffics +tragedian +tragedians +tragedienne +tragediennes +tragedies +tragedy +tragic +tragically +tragicomedies +tragicomedy +tragicomic +trail +trailblazer +trailblazers +trailblazing +trailed +trailer +trailers +trailing +trails +train +trainable +trained +trainee +trainees +trainer +trainers +training +trainload +trainloads +trainman +trainmen +trains +traipse +traipsed +traipses +traipsing +trait +traitor +traitorous +traitorously +traitors +traits +trajectories +trajectory +tram +trammed +trammel +trammeled +trammeling +trammelled +trammelling +trammels +tramming +tramp +tramped +tramper +trampers +tramping +trample +trampled +trampler +tramplers +tramples +trampling +trampoline +trampolined +trampolines +trampolining +tramps +trams +trance +trances +tranquil +tranquiler +tranquilest +tranquility +tranquilize +tranquilized +tranquilizer +tranquilizers +tranquilizes +tranquilizing +tranquiller +tranquillest +tranquillity +tranquillize +tranquillized +tranquillizer +tranquillizers +tranquillizes +tranquillizing +tranquilly +transact +transacted +transacting +transaction +transactions +transactor +transactors +transacts +transatlantic +transceiver +transceivers +transcend +transcended +transcendence +transcendent +transcendental +transcendentalism +transcendentalist +transcendentalists +transcendentally +transcending +transcends +transcontinental +transcribe +transcribed +transcriber +transcribers +transcribes +transcribing +transcript +transcription +transcriptions +transcripts +transducer +transducers +transect +transected +transecting +transects +transept +transepts +transfer +transferable +transferal +transferals +transference +transferred +transferring +transfers +transfiguration +transfigure +transfigured +transfigures +transfiguring +transfix +transfixed +transfixes +transfixing +transfixt +transform +transformable +transformation +transformations +transformed +transformer +transformers +transforming +transforms +transfuse +transfused +transfuses +transfusing +transfusion +transfusions +transgender +transgendered +transgenders +transgress +transgressed +transgresses +transgressing +transgression +transgressions +transgressor +transgressors +transience +transiency +transient +transiently +transients +transistor +transistorize +transistorized +transistorizes +transistorizing +transistors +transit +transited +transiting +transition +transitional +transitionally +transitioned +transitioning +transitions +transitive +transitively +transitiveness +transitives +transitivity +transitory +transits +translatable +translate +translated +translates +translating +translation +translations +translator +translators +transliterate +transliterated +transliterates +transliterating +transliteration +transliterations +translucence +translucency +translucent +translucently +transmigrate +transmigrated +transmigrates +transmigrating +transmigration +transmissible +transmission +transmissions +transmit +transmits +transmittable +transmittal +transmittance +transmitted +transmitter +transmitters +transmitting +transmogrification +transmogrified +transmogrifies +transmogrify +transmogrifying +transmutable +transmutation +transmutations +transmute +transmuted +transmutes +transmuting +transnational +transnationals +transoceanic +transom +transoms +transpacific +transparencies +transparency +transparent +transparently +transpiration +transpire +transpired +transpires +transpiring +transplant +transplantation +transplanted +transplanting +transplants +transpolar +transponder +transponders +transport +transportable +transportation +transported +transporter +transporters +transporting +transports +transpose +transposed +transposes +transposing +transposition +transpositions +transsexual +transsexualism +transsexuals +transship +transshipment +transshipped +transshipping +transships +transubstantiation +transverse +transversely +transverses +transvestism +transvestite +transvestites +trap +trapdoor +trapdoors +trapeze +trapezes +trapezia +trapezium +trapeziums +trapezoid +trapezoidal +trapezoids +trapped +trapper +trappers +trapping +trappings +traps +trapshooting +trash +trashed +trashes +trashier +trashiest +trashiness +trashing +trashy +trauma +traumas +traumata +traumatic +traumatically +traumatize +traumatized +traumatizes +traumatizing +travail +travailed +travailing +travails +travel +traveled +traveler +travelers +traveling +travelled +traveller +travellers +travelling +travelog +travelogs +travelogue +travelogues +travels +traversal +traversals +traverse +traversed +traverses +traversing +travestied +travesties +travesty +travestying +trawl +trawled +trawler +trawlers +trawling +trawls +tray +trays +treacheries +treacherous +treacherously +treacherousness +treachery +treacle +treacly +tread +treading +treadle +treadled +treadles +treadling +treadmill +treadmills +treads +treason +treasonable +treasonous +treasure +treasured +treasurer +treasurers +treasures +treasuries +treasuring +treasury +treat +treatable +treated +treaties +treating +treatise +treatises +treatment +treatments +treats +treaty +treble +trebled +trebles +trebling +tree +treed +treeing +treeless +treelike +trees +treetop +treetops +trefoil +trefoils +trek +trekked +trekker +trekkers +trekking +treks +trellis +trellised +trellises +trellising +trematode +trematodes +tremble +trembled +trembles +trembling +tremendous +tremendously +tremolo +tremolos +tremor +tremors +tremulous +tremulously +tremulousness +trench +trenchancy +trenchant +trenchantly +trenched +trencher +trencherman +trenchermen +trenchers +trenches +trenching +trend +trended +trendier +trendies +trendiest +trendily +trendiness +trending +trends +trendy +trepidation +trespass +trespassed +trespasser +trespassers +trespasses +trespassing +tress +tresses +trestle +trestles +trey +treys +triad +triads +triage +trial +trialled +trialling +trials +triangle +triangles +triangular +triangularly +triangulate +triangulated +triangulates +triangulating +triangulation +triathlon +triathlons +tribal +tribalism +tribe +tribes +tribesman +tribesmen +tribeswoman +tribeswomen +tribulation +tribulations +tribunal +tribunals +tribune +tribunes +tributaries +tributary +tribute +tributes +trice +tricentennial +tricentennials +triceps +tricepses +triceratops +triceratopses +trichina +trichinae +trichinas +trichinosis +trick +tricked +trickery +trickier +trickiest +trickily +trickiness +tricking +trickle +trickled +trickles +trickling +tricks +trickster +tricksters +tricky +tricolor +tricolors +tricolour +tricolours +tricycle +tricycles +trident +tridents +tried +triennial +triennially +triennials +trier +triers +tries +trifle +trifled +trifler +triflers +trifles +trifling +trifocals +trig +trigger +triggered +triggering +triggers +triglyceride +triglycerides +trigonometric +trigonometrical +trigonometry +trike +trikes +trilateral +trilbies +trilby +trill +trilled +trilling +trillion +trillions +trillionth +trillionths +trillium +trills +trilobite +trilobites +trilogies +trilogy +trim +trimaran +trimarans +trimester +trimesters +trimly +trimmed +trimmer +trimmers +trimmest +trimming +trimmings +trimness +trimonthly +trims +trinities +trinitrotoluene +trinity +trinket +trinkets +trio +trios +trip +tripartite +tripe +triple +tripled +triples +triplet +triplets +triplex +triplexes +triplicate +triplicated +triplicates +triplicating +tripling +triply +tripod +tripodal +tripods +tripped +tripper +trippers +tripping +trips +triptych +triptychs +trireme +triremes +trisect +trisected +trisecting +trisection +trisects +trite +tritely +triteness +triter +tritest +tritium +triumph +triumphal +triumphant +triumphantly +triumphed +triumphing +triumphs +triumvir +triumvirate +triumvirates +triumvirs +trivalent +trivet +trivets +trivia +trivial +trivialities +triviality +trivialization +trivialize +trivialized +trivializes +trivializing +trivially +trivium +trochaic +trochee +trochees +trod +trodden +troglodyte +troglodytes +troika +troikas +troll +trolled +trolley +trolleybus +trolleybuses +trolleybusses +trolleys +trollies +trolling +trollop +trollops +trolls +trolly +trombone +trombones +trombonist +trombonists +tromp +tromped +tromping +tromps +troop +trooped +trooper +troopers +trooping +troops +troopship +troopships +trope +tropes +trophies +trophy +tropic +tropical +tropically +tropics +tropism +tropisms +troposphere +tropospheres +trot +troth +trots +trotted +trotter +trotters +trotting +troubadour +troubadours +trouble +troubled +troublemaker +troublemakers +troubles +troubleshoot +troubleshooted +troubleshooter +troubleshooters +troubleshooting +troubleshoots +troubleshot +troublesome +troublesomely +troubling +trough +troughs +trounce +trounced +trouncer +trouncers +trounces +trouncing +troupe +trouped +trouper +troupers +troupes +trouping +trouser +trousers +trousseau +trousseaus +trousseaux +trout +trouts +trove +troves +trow +trowed +trowel +troweled +troweling +trowelled +trowelling +trowels +trowing +trows +troy +truancy +truant +truanted +truanting +truants +truce +truces +truck +trucked +trucker +truckers +trucking +truckle +truckled +truckles +truckling +truckload +truckloads +trucks +truculence +truculent +truculently +trudge +trudged +trudges +trudging +true +trued +trueing +truelove +trueloves +truer +trues +truest +truffle +truffles +truing +truism +truisms +truly +trump +trumped +trumpery +trumpet +trumpeted +trumpeter +trumpeters +trumpeting +trumpets +trumping +trumps +truncate +truncated +truncates +truncating +truncation +truncheon +truncheons +trundle +trundled +trundler +trundlers +trundles +trundling +trunk +trunks +truss +trussed +trusses +trussing +trust +trusted +trustee +trustees +trusteeship +trusteeships +trustful +trustfully +trustfulness +trustier +trusties +trustiest +trusting +trustingly +trusts +trustworthier +trustworthiest +trustworthiness +trustworthy +trusty +truth +truthful +truthfully +truthfulness +truths +trying +tryingly +tryout +tryouts +tryst +trysted +trysting +trysts +tsar +tsarina +tsarinas +tsars +tsetse +tsetses +tsunami +tsunamis +tuba +tubal +tubas +tubbier +tubbiest +tubby +tube +tubed +tubeless +tuber +tubercle +tubercles +tubercular +tuberculin +tuberculosis +tuberculous +tuberose +tuberous +tubers +tubes +tubful +tubfuls +tubing +tubs +tubular +tubule +tubules +tuck +tucked +tucker +tuckered +tuckering +tuckers +tucking +tucks +tuft +tufted +tufter +tufters +tufting +tufts +tugboat +tugboats +tugged +tugging +tugs +tuition +tularemia +tulip +tulips +tulle +tumble +tumbled +tumbledown +tumbler +tumblers +tumbles +tumbleweed +tumbleweeds +tumbling +tumbrel +tumbrels +tumbril +tumbrils +tumescence +tumescent +tumid +tumidity +tummies +tummy +tumor +tumorous +tumors +tumour +tumours +tumult +tumults +tumultuous +tumultuously +tuna +tunas +tundra +tundras +tune +tuned +tuneful +tunefully +tunefulness +tuneless +tunelessly +tuner +tuners +tunes +tuneup +tuneups +tungsten +tunic +tunics +tuning +tunnel +tunneled +tunneler +tunnelers +tunneling +tunnelled +tunneller +tunnellers +tunnelling +tunnels +tunnies +tunny +tuns +tuque +tuques +turban +turbans +turbid +turbidity +turbine +turbines +turbo +turbocharge +turbocharged +turbocharger +turbochargers +turbocharges +turbocharging +turbofan +turbofans +turbojet +turbojets +turboprop +turboprops +turbos +turbot +turbots +turbulence +turbulent +turbulently +turd +turds +tureen +tureens +turf +turfed +turfing +turfs +turfy +turgid +turgidity +turgidly +turkey +turkeys +turmeric +turmerics +turmoil +turmoils +turn +turnabout +turnabouts +turnaround +turnarounds +turnbuckle +turnbuckles +turncoat +turncoats +turned +turner +turners +turning +turnings +turnip +turnips +turnkey +turnkeys +turnoff +turnoffs +turnout +turnouts +turnover +turnovers +turnpike +turnpikes +turns +turnstile +turnstiles +turntable +turntables +turpentine +turpitude +turquoise +turquoises +turret +turreted +turrets +turtle +turtledove +turtledoves +turtleneck +turtlenecked +turtlenecks +turtles +turves +tush +tushes +tusk +tusked +tusks +tussle +tussled +tussles +tussling +tussock +tussocks +tussocky +tutelage +tutelary +tutor +tutored +tutorial +tutorials +tutoring +tutors +tutorship +tuts +tutted +tutti +tutting +tuttis +tutu +tutus +tuxedo +tuxedoes +tuxedos +tuxes +twaddle +twaddled +twaddler +twaddlers +twaddles +twaddling +twain +twang +twanged +twangier +twangiest +twanging +twangs +twangy +twas +tweak +tweaked +tweaking +tweaks +tweed +tweedier +tweediest +tweeds +tweedy +tween +tweet +tweeted +tweeter +tweeters +tweeting +tweets +tweezers +twelfth +twelfths +twelve +twelvemonth +twelvemonths +twelves +twenties +twentieth +twentieths +twenty +twerp +twerps +twice +twiddle +twiddled +twiddles +twiddlier +twiddliest +twiddling +twiddly +twig +twigged +twiggier +twiggiest +twigging +twiggy +twigs +twilight +twilit +twill +twilled +twin +twine +twined +twiner +twiners +twines +twinge +twinged +twingeing +twinges +twinging +twinight +twining +twinkle +twinkled +twinkles +twinkling +twinklings +twinkly +twinned +twinning +twins +twirl +twirled +twirler +twirlers +twirlier +twirliest +twirling +twirls +twirly +twist +twisted +twister +twisters +twistier +twistiest +twisting +twists +twisty +twit +twitch +twitched +twitches +twitchier +twitchiest +twitching +twitchy +twits +twitted +twitter +twittered +twittering +twitters +twittery +twitting +twixt +twofer +twofers +twofold +twopence +twopences +twopenny +twos +twosome +twosomes +tycoon +tycoons +tying +tyke +tykes +tympana +tympani +tympanist +tympanists +tympanum +tympanums +type +typecast +typecasting +typecasts +typed +typeface +typefaces +types +typescript +typescripts +typeset +typesets +typesetter +typesetters +typesetting +typewrite +typewriter +typewriters +typewrites +typewriting +typewritten +typewrote +typhoid +typhoon +typhoons +typhus +typical +typicality +typically +typification +typified +typifies +typify +typifying +typing +typist +typists +typo +typographer +typographers +typographic +typographical +typographically +typography +typology +typos +tyrannic +tyrannical +tyrannically +tyrannies +tyrannize +tyrannized +tyrannizes +tyrannizing +tyrannosaur +tyrannosaurs +tyrannosaurus +tyrannosauruses +tyrannous +tyranny +tyrant +tyrants +tyre +tyres +tyro +tyros +tzar +tzarina +tzarinas +tzars +ubiquitous +ubiquitously +ubiquity +udder +udders +ufologist +ufologists +ufology +uglier +ugliest +ugliness +ugly +ukase +ukases +ukelele +ukeleles +ukulele +ukuleles +ulcer +ulcerate +ulcerated +ulcerates +ulcerating +ulceration +ulcerations +ulcerous +ulcers +ulna +ulnae +ulnar +ulnas +ulster +ulsters +ulterior +ultimata +ultimate +ultimately +ultimatum +ultimatums +ultimo +ultra +ultraconservative +ultraconservatives +ultrahigh +ultralight +ultralights +ultramarine +ultramodern +ultras +ultrasonic +ultrasonically +ultrasound +ultrasounds +ultraviolet +ululate +ululated +ululates +ululating +ululation +ululations +umbel +umbels +umber +umbilical +umbilici +umbilicus +umbilicuses +umbra +umbrae +umbrage +umbras +umbrella +umbrellas +umiak +umiaks +umlaut +umlauts +umped +umping +umpire +umpired +umpires +umpiring +umps +umpteen +umpteenth +unabashed +unabashedly +unabated +unable +unabridged +unabridgeds +unaccented +unacceptable +unacceptably +unaccommodating +unaccompanied +unaccomplished +unaccountable +unaccountably +unaccounted +unaccredited +unaccustomed +unacknowledged +unacquainted +unadorned +unadulterated +unadventurous +unadvertised +unadvised +unadvisedly +unaesthetic +unaffected +unaffectedly +unaffiliated +unafraid +unaided +unalienable +unaligned +unalike +unalloyed +unalterable +unalterably +unaltered +unambiguous +unambiguously +unambitious +unanimity +unanimous +unanimously +unannounced +unanswerable +unanswered +unanticipated +unapologetic +unapparent +unappealing +unappealingly +unappetizing +unappreciated +unappreciative +unapproachable +unappropriated +unapproved +unarguable +unarguably +unarmed +unarmored +unashamed +unashamedly +unasked +unassailable +unassertive +unassisted +unassuming +unassumingly +unattached +unattainable +unattended +unattested +unattractive +unattractively +unauthentic +unauthorized +unavailability +unavailable +unavailing +unavailingly +unavoidable +unavoidably +unaware +unawareness +unawares +unbaked +unbalanced +unbaptized +unbar +unbarred +unbarring +unbars +unbearable +unbearably +unbeatable +unbeaten +unbecoming +unbecomingly +unbeknown +unbeknownst +unbelief +unbelievable +unbelievably +unbeliever +unbelievers +unbelieving +unbend +unbending +unbends +unbent +unbiased +unbiassed +unbid +unbidden +unbind +unbinding +unbinds +unbleached +unblemished +unblinking +unblock +unblocked +unblocking +unblocks +unblushing +unblushingly +unbolt +unbolted +unbolting +unbolts +unborn +unbosom +unbosomed +unbosoming +unbosoms +unbound +unbounded +unbowed +unbreakable +unbridgeable +unbridled +unbroken +unbuckle +unbuckled +unbuckles +unbuckling +unburden +unburdened +unburdening +unburdens +unbutton +unbuttoned +unbuttoning +unbuttons +uncannier +uncanniest +uncannily +uncanny +uncap +uncapped +uncapping +uncaps +uncaring +uncaught +unceasing +unceasingly +uncensored +unceremonious +unceremoniously +uncertain +uncertainly +uncertainties +uncertainty +unchain +unchained +unchaining +unchains +unchallenged +unchangeable +unchanged +unchanging +unchaperoned +uncharacteristic +uncharacteristically +uncharged +uncharitable +uncharitably +uncharted +unchaste +unchaster +unchastest +unchecked +unchristian +uncial +uncircumcised +uncivil +uncivilized +uncivilly +unclad +unclaimed +unclasp +unclasped +unclasping +unclasps +unclassified +uncle +unclean +uncleaned +uncleaner +uncleanest +uncleanlier +uncleanliest +uncleanliness +uncleanly +uncleanness +unclear +uncleared +unclearer +unclearest +uncles +uncloak +uncloaked +uncloaking +uncloaks +unclog +unclogged +unclogging +unclogs +unclothe +unclothed +unclothes +unclothing +unclouded +uncluttered +uncoil +uncoiled +uncoiling +uncoils +uncollected +uncolored +uncombed +uncombined +uncomfortable +uncomfortably +uncommitted +uncommon +uncommoner +uncommonest +uncommonly +uncommonness +uncommunicative +uncompensated +uncomplaining +uncomplainingly +uncompleted +uncomplicated +uncomplimentary +uncompounded +uncomprehending +uncomprehendingly +uncompromising +uncompromisingly +unconcealed +unconcern +unconcerned +unconcernedly +unconditional +unconditionally +unconditioned +unconfined +unconfirmed +unconformable +uncongenial +unconnected +unconquerable +unconquered +unconscionable +unconscionably +unconscious +unconsciously +unconsciousness +unconsecrated +unconsidered +unconsolidated +unconstitutional +unconstitutionality +unconstitutionally +unconstrained +unconsumed +unconsummated +uncontaminated +uncontested +uncontrollable +uncontrollably +uncontrolled +unconventional +unconventionality +unconventionally +unconverted +unconvinced +unconvincing +unconvincingly +uncooked +uncool +uncooperative +uncoordinated +uncork +uncorked +uncorking +uncorks +uncorrected +uncorroborated +uncountable +uncounted +uncouple +uncoupled +uncouples +uncoupling +uncouth +uncouthly +uncover +uncovered +uncovering +uncovers +uncritical +uncritically +uncross +uncrossed +uncrosses +uncrossing +uncrowded +uncrowned +unction +unctions +unctuous +unctuously +unctuousness +uncultivated +uncultured +uncured +uncurl +uncurled +uncurling +uncurls +uncustomary +uncut +undamaged +undated +undaunted +undauntedly +undeceive +undeceived +undeceives +undeceiving +undecided +undecideds +undecipherable +undeclared +undefeated +undefended +undefinable +undefined +undemanding +undemocratic +undemonstrative +undemonstratively +undeniable +undeniably +undependable +under +underachieve +underachieved +underachiever +underachievers +underachieves +underachieving +underact +underacted +underacting +underacts +underage +underarm +underarms +underbellies +underbelly +underbid +underbidding +underbids +underbrush +undercarriage +undercarriages +undercharge +undercharged +undercharges +undercharging +underclass +underclassman +underclassmen +underclothes +underclothing +undercoat +undercoated +undercoating +undercoatings +undercoats +undercover +undercurrent +undercurrents +undercut +undercuts +undercutting +underdeveloped +underdevelopment +underdog +underdogs +underdone +underemployed +underemployment +underestimate +underestimated +underestimates +underestimating +underestimation +underestimations +underexpose +underexposed +underexposes +underexposing +underexposure +underexposures +underfed +underfeed +underfeeding +underfeeds +underfoot +underfur +undergarment +undergarments +undergo +undergoes +undergoing +undergone +undergraduate +undergraduates +underground +undergrounds +undergrowth +underhand +underhanded +underhandedly +underhandedness +underlain +underlay +underlays +underlie +underlies +underline +underlined +underlines +underling +underlings +underlining +underlip +underlips +underlying +undermanned +undermentioned +undermine +undermined +undermines +undermining +undermost +underneath +underneaths +undernourished +undernourishment +underpaid +underpants +underpart +underparts +underpass +underpasses +underpay +underpaying +underpayment +underpayments +underpays +underpin +underpinned +underpinning +underpinnings +underpins +underplay +underplayed +underplaying +underplays +underpopulated +underprivileged +underproduction +underrate +underrated +underrates +underrating +underrepresented +underscore +underscored +underscores +underscoring +undersea +underseas +undersecretaries +undersecretary +undersell +underselling +undersells +undersexed +undershirt +undershirts +undershoot +undershooting +undershoots +undershorts +undershot +underside +undersides +undersign +undersigned +undersigning +undersigns +undersize +undersized +underskirt +underskirts +undersold +understaffed +understand +understandable +understandably +understanding +understandingly +understandings +understands +understate +understated +understatement +understatements +understates +understating +understood +understudied +understudies +understudy +understudying +undertake +undertaken +undertaker +undertakers +undertakes +undertaking +undertakings +underthings +undertone +undertones +undertook +undertow +undertows +undervaluation +undervalue +undervalued +undervalues +undervaluing +underwater +underway +underwear +underweight +underwent +underwhelm +underwhelmed +underwhelming +underwhelms +underworld +underworlds +underwrite +underwriter +underwriters +underwrites +underwriting +underwritten +underwrote +undeserved +undeservedly +undeserving +undesirability +undesirable +undesirables +undesirably +undesired +undetectable +undetected +undetermined +undeterred +undeveloped +undeviating +undid +undies +undifferentiated +undigested +undignified +undiluted +undiminished +undimmed +undiplomatic +undischarged +undisciplined +undisclosed +undiscovered +undiscriminating +undisguised +undismayed +undisputed +undissolved +undistinguished +undistributed +undisturbed +undivided +undo +undocumented +undoes +undoing +undoings +undomesticated +undone +undoubted +undoubtedly +undramatic +undreamed +undreamt +undress +undressed +undresses +undressing +undrinkable +undue +undulant +undulate +undulated +undulates +undulating +undulation +undulations +unduly +undying +unearned +unearth +unearthed +unearthing +unearthlier +unearthliest +unearthliness +unearthly +unearths +unease +uneasier +uneasiest +uneasily +uneasiness +uneasy +uneatable +uneaten +uneconomic +uneconomical +uneconomically +unedifying +unedited +uneducated +unembarrassed +unemotional +unemphatic +unemployable +unemployed +unemployment +unenclosed +unencumbered +unending +unendurable +unenforced +unenlightened +unenterprising +unenthusiastic +unenviable +unequal +unequaled +unequalled +unequally +unequipped +unequivocal +unequivocally +unerring +unerringly +unessential +unethical +unethically +uneven +unevenly +unevenness +uneventful +uneventfully +unexampled +unexceptionable +unexceptionably +unexceptional +unexceptionally +unexcited +unexciting +unexcused +unexpected +unexpectedly +unexpectedness +unexpired +unexplained +unexploited +unexplored +unexposed +unexpressed +unexpurgated +unfading +unfailing +unfailingly +unfair +unfairer +unfairest +unfairly +unfairness +unfaithful +unfaithfully +unfaithfulness +unfaltering +unfamiliar +unfamiliarity +unfashionable +unfashionably +unfasten +unfastened +unfastening +unfastens +unfathomable +unfathomably +unfavorable +unfavorably +unfeasible +unfed +unfeeling +unfeelingly +unfeigned +unfeminine +unfertilized +unfetter +unfettered +unfettering +unfetters +unfilled +unfiltered +unfinished +unfit +unfitness +unfits +unfitted +unfitter +unfittest +unfitting +unfix +unfixed +unfixes +unfixing +unflagging +unflaggingly +unflappability +unflappable +unflappably +unflattering +unflavored +unfledged +unflinching +unflinchingly +unfocused +unfold +unfolded +unfolding +unfolds +unforced +unforeseeable +unforeseen +unforgettable +unforgettably +unforgivable +unforgivably +unforgiving +unforgotten +unformed +unformulated +unfortified +unfortunate +unfortunately +unfortunates +unfounded +unframed +unfreeze +unfreezes +unfreezing +unfrequented +unfriendlier +unfriendliest +unfriendliness +unfriendly +unfrock +unfrocked +unfrocking +unfrocks +unfroze +unfrozen +unfruitful +unfulfilled +unfunded +unfunny +unfurl +unfurled +unfurling +unfurls +unfurnished +ungainlier +ungainliest +ungainliness +ungainly +ungenerous +ungentle +ungentlemanly +unglued +ungodlier +ungodliest +ungodliness +ungodly +ungovernable +ungoverned +ungraceful +ungracefully +ungracious +ungraciously +ungraded +ungrammatical +ungrammatically +ungrateful +ungratefully +ungratefulness +ungrudging +unguarded +unguent +unguents +unguided +ungulate +ungulates +unhallowed +unhampered +unhand +unhanded +unhandier +unhandiest +unhanding +unhands +unhandy +unhappier +unhappiest +unhappily +unhappiness +unhappy +unhardened +unharmed +unharness +unharnessed +unharnesses +unharnessing +unharvested +unhatched +unhealed +unhealthful +unhealthier +unhealthiest +unhealthily +unhealthiness +unhealthy +unheard +unheated +unheeded +unhelpful +unhelpfully +unheralded +unhesitating +unhesitatingly +unhindered +unhinge +unhinged +unhinges +unhinging +unhistorical +unhitch +unhitched +unhitches +unhitching +unholier +unholiest +unholiness +unholy +unhook +unhooked +unhooking +unhooks +unhorse +unhorsed +unhorses +unhorsing +unhurried +unhurriedly +unhurt +unicameral +unicellular +unicorn +unicorns +unicycle +unicycles +unidentifiable +unidentified +unidiomatic +unification +unified +unifies +uniform +uniformed +uniforming +uniformity +uniformly +uniforms +unify +unifying +unilateral +unilaterally +unimaginable +unimaginative +unimaginatively +unimpaired +unimpeachable +unimpeded +unimportant +unimposing +unimpressed +unimpressive +unimproved +unincorporated +uninfected +uninfluenced +uninformative +uninformed +uninhabitable +uninhabited +uninhibited +uninhibitedly +uninitiated +uninjured +uninspired +uninspiring +uninstructed +uninsured +unintelligent +unintelligible +unintelligibly +unintended +unintentional +unintentionally +uninterested +uninteresting +uninterrupted +uninvited +uninviting +union +unionism +unionist +unionists +unionization +unionize +unionized +unionizes +unionizing +unions +unique +uniquely +uniqueness +uniquer +uniquest +unisex +unison +unit +unitary +unite +united +unitedly +unites +unities +uniting +unitize +unitized +unitizes +unitizing +units +unity +univalent +univalve +univalves +universal +universality +universalize +universalized +universalizes +universalizing +universally +universals +universe +universes +universities +university +unjust +unjustifiable +unjustifiably +unjustified +unjustly +unkempt +unkind +unkinder +unkindest +unkindlier +unkindliest +unkindly +unkindness +unknowable +unknowing +unknowingly +unknown +unknowns +unlabeled +unlace +unlaced +unlaces +unlacing +unladen +unladylike +unlatch +unlatched +unlatches +unlatching +unlawful +unlawfully +unlawfulness +unleaded +unlearn +unlearned +unlearning +unlearns +unleash +unleashed +unleashes +unleashing +unleavened +unless +unlettered +unlicensed +unlighted +unlikable +unlike +unlikelier +unlikeliest +unlikelihood +unlikeliness +unlikely +unlikeness +unlimber +unlimbered +unlimbering +unlimbers +unlimited +unlined +unlisted +unlit +unlivable +unload +unloaded +unloading +unloads +unlock +unlocked +unlocking +unlocks +unloose +unloosed +unloosen +unloosened +unloosening +unloosens +unlooses +unloosing +unlovable +unloved +unlovelier +unloveliest +unlovely +unloving +unluckier +unluckiest +unluckily +unluckiness +unlucky +unmade +unmake +unmakes +unmaking +unman +unmanageable +unmanlier +unmanliest +unmanly +unmanned +unmannerly +unmanning +unmans +unmarked +unmarketable +unmarred +unmarried +unmask +unmasked +unmasking +unmasks +unmatched +unmeaning +unmeant +unmeasured +unmediated +unmentionable +unmentionables +unmentioned +unmerciful +unmercifully +unmerited +unmindful +unmistakable +unmistakably +unmitigated +unmixed +unmodified +unmolested +unmoral +unmorality +unmotivated +unmounted +unmovable +unmoved +unmusical +unnameable +unnamed +unnatural +unnaturally +unnaturalness +unnecessarily +unnecessary +unneeded +unnerve +unnerved +unnerves +unnerving +unnoticeable +unnoticed +unnumbered +unobjectionable +unobservant +unobserved +unobstructed +unobtainable +unobtrusive +unobtrusively +unobtrusiveness +unoccupied +unoffensive +unofficial +unofficially +unopened +unopposed +unorganized +unoriginal +unorthodox +unpack +unpacked +unpacking +unpacks +unpaid +unpainted +unpaired +unpalatable +unparalleled +unparallelled +unpardonable +unpardonably +unpasteurized +unpatriotic +unpaved +unpeeled +unperceived +unperceptive +unperformed +unperson +unpersons +unpersuaded +unpersuasive +unperturbed +unpin +unpinned +unpinning +unpins +unplanned +unpleasant +unpleasantly +unpleasantness +unpleasing +unplug +unplugged +unplugging +unplugs +unplumbed +unpolished +unpolitical +unpolluted +unpopular +unpopularity +unpractical +unpracticed +unprecedented +unprecedentedly +unpredictability +unpredictable +unpredictably +unprejudiced +unpremeditated +unprepared +unpreparedness +unprepossessing +unpressed +unpretentious +unpretentiously +unpreventable +unprincipled +unprintable +unprocessed +unproductive +unproductively +unprofessional +unprofessionally +unprofitable +unprofitably +unpromising +unprompted +unpronounceable +unpropitious +unprotected +unproved +unproven +unprovided +unprovoked +unpublished +unpunished +unqualified +unquenchable +unquestionable +unquestionably +unquestioned +unquestioning +unquestioningly +unquiet +unquieter +unquietest +unquote +unquoted +unquotes +unquoting +unrated +unravel +unraveled +unraveling +unravelled +unravelling +unravels +unread +unreadable +unready +unreal +unrealistic +unrealistically +unreality +unrealized +unreasonable +unreasonableness +unreasonably +unreasoning +unrecognizable +unrecognized +unreconstructed +unrecorded +unrecoverable +unreel +unreeled +unreeling +unreels +unrefined +unreformed +unregenerate +unregistered +unregulated +unrehearsed +unrelated +unrelenting +unrelentingly +unreliability +unreliable +unreliably +unrelieved +unremarkable +unremembered +unremitting +unremittingly +unrepentant +unreported +unrepresentative +unrepresented +unrequited +unreserved +unreservedly +unresistant +unresolved +unresponsive +unresponsively +unresponsiveness +unrest +unrestrained +unrestricted +unrewarded +unrewarding +unrighteous +unrighteousness +unripe +unripened +unriper +unripest +unrivaled +unrivalled +unroll +unrolled +unrolling +unrolls +unromantic +unruffled +unrulier +unruliest +unruliness +unruly +unsaddle +unsaddled +unsaddles +unsaddling +unsafe +unsafely +unsafer +unsafest +unsaid +unsalable +unsalted +unsanctioned +unsanitary +unsatisfactorily +unsatisfactory +unsatisfied +unsatisfying +unsaturated +unsaved +unsavory +unsavoury +unsay +unsaying +unsays +unscathed +unscented +unscheduled +unschooled +unscientific +unscientifically +unscramble +unscrambled +unscrambles +unscrambling +unscratched +unscrew +unscrewed +unscrewing +unscrews +unscripted +unscrupulous +unscrupulously +unscrupulousness +unseal +unsealed +unsealing +unseals +unsearchable +unseasonable +unseasonably +unseasoned +unseat +unseated +unseating +unseats +unseeing +unseeingly +unseemlier +unseemliest +unseemliness +unseemly +unseen +unsegmented +unsegregated +unselfish +unselfishly +unselfishness +unsentimental +unsettle +unsettled +unsettles +unsettling +unshackle +unshackled +unshackles +unshackling +unshakable +unshakably +unshakeable +unshaken +unshaped +unshapely +unshaven +unsheathe +unsheathed +unsheathes +unsheathing +unshod +unshorn +unsifted +unsightlier +unsightliest +unsightliness +unsightly +unsigned +unsinkable +unskilled +unskillful +unskillfully +unsmiling +unsnap +unsnapped +unsnapping +unsnaps +unsnarl +unsnarled +unsnarling +unsnarls +unsociable +unsocial +unsoiled +unsold +unsolicited +unsolvable +unsolved +unsophisticated +unsorted +unsought +unsound +unsounder +unsoundest +unsoundly +unsoundness +unsparing +unsparingly +unspeakable +unspeakably +unspecific +unspecified +unspectacular +unspent +unspoiled +unspoken +unsportsmanlike +unstable +unstabler +unstablest +unstably +unstained +unstated +unsteadier +unsteadiest +unsteadily +unsteadiness +unsteady +unstinting +unstintingly +unstop +unstoppable +unstopped +unstopping +unstops +unstrap +unstrapped +unstrapping +unstraps +unstressed +unstructured +unstrung +unstuck +unstudied +unsubstantial +unsubstantiated +unsuccessful +unsuccessfully +unsuitability +unsuitable +unsuitably +unsuited +unsullied +unsung +unsupervised +unsupported +unsure +unsurpassed +unsurprising +unsurprisingly +unsuspected +unsuspecting +unsuspectingly +unsustainable +unswayed +unsweetened +unswerving +unsymmetrical +unsympathetic +unsympathetically +unsystematic +untactful +untainted +untalented +untamed +untangle +untangled +untangles +untangling +untanned +untapped +untarnished +untasted +untaught +unteachable +untenable +untenanted +untended +untested +unthinkable +unthinkably +unthinking +unthinkingly +untidier +untidiest +untidily +untidiness +untidy +untie +untied +unties +until +untimelier +untimeliest +untimeliness +untimely +untiring +untiringly +untitled +unto +untold +untouchable +untouchables +untouched +untoward +untraceable +untrained +untrammeled +untrammelled +untranslatable +untranslated +untraveled +untreated +untried +untrimmed +untrod +untroubled +untrue +untruer +untruest +untruly +untrustworthy +untruth +untruthful +untruthfully +untruthfulness +untruths +untutored +untwist +untwisted +untwisting +untwists +untying +untypical +unusable +unused +unusual +unusually +unutterable +unutterably +unvaried +unvarnished +unvarying +unveil +unveiled +unveiling +unveils +unverifiable +unverified +unversed +unvoiced +unwanted +unwarier +unwariest +unwarily +unwariness +unwarrantable +unwarranted +unwary +unwashed +unwavering +unwearable +unwearied +unwed +unwelcome +unwell +unwholesome +unwholesomeness +unwieldier +unwieldiest +unwieldiness +unwieldy +unwilling +unwillingly +unwillingness +unwind +unwinding +unwinds +unwise +unwisely +unwiser +unwisest +unwitting +unwittingly +unwonted +unworkable +unworldlier +unworldliest +unworldliness +unworldly +unworn +unworried +unworthier +unworthiest +unworthily +unworthiness +unworthy +unwound +unwoven +unwrap +unwrapped +unwrapping +unwraps +unwrinkled +unwritten +unyielding +unyoke +unyoked +unyokes +unyoking +unzip +unzipped +unzipping +unzips +upbeat +upbeats +upbraid +upbraided +upbraiding +upbraids +upbringing +upbringings +upchuck +upchucked +upchucking +upchucks +upcoming +upcountry +update +updated +updates +updating +updraft +updrafts +upend +upended +upending +upends +upfront +upgrade +upgraded +upgrades +upgrading +upheaval +upheavals +upheld +uphill +uphills +uphold +upholder +upholders +upholding +upholds +upholster +upholstered +upholsterer +upholsterers +upholstering +upholsters +upholstery +upkeep +upland +uplands +uplift +uplifted +uplifting +uplifts +upload +uploaded +uploading +uploads +upmarket +upmost +upon +upped +upper +uppercase +upperclassman +upperclassmen +uppercut +uppercuts +uppercutting +uppermost +uppers +upping +uppish +uppity +upraise +upraised +upraises +upraising +uprear +upreared +uprearing +uprears +upright +uprightly +uprightness +uprights +uprising +uprisings +upriver +uproar +uproarious +uproariously +uproars +uproot +uprooted +uprooting +uproots +upscale +upset +upsets +upsetting +upshot +upshots +upside +upsides +upsilon +upsilons +upstage +upstaged +upstages +upstaging +upstairs +upstanding +upstart +upstarted +upstarting +upstarts +upstate +upstream +upstroke +upstrokes +upsurge +upsurged +upsurges +upsurging +upswing +upswings +uptake +uptakes +upthrust +upthrusting +upthrusts +uptick +upticks +uptight +uptown +upturn +upturned +upturning +upturns +upward +upwardly +upwards +upwind +uracil +uranium +urban +urbane +urbanely +urbaner +urbanest +urbanity +urbanization +urbanize +urbanized +urbanizes +urbanizing +urbanologist +urbanologists +urbanology +urchin +urchins +urea +uremia +uremic +ureter +ureters +urethane +urethra +urethrae +urethral +urethras +urge +urged +urgency +urgent +urgently +urges +urging +uric +urinal +urinals +urinalyses +urinalysis +urinary +urinate +urinated +urinates +urinating +urination +urine +urns +urogenital +urological +urologist +urologists +urology +ursine +urticaria +usability +usable +usage +usages +useability +useable +used +useful +usefully +usefulness +useless +uselessly +uselessness +user +users +uses +usher +ushered +usherette +usherettes +ushering +ushers +using +usual +usually +usurer +usurers +usurious +usurp +usurpation +usurped +usurper +usurpers +usurping +usurps +usury +utensil +utensils +uteri +uterine +uterus +uteruses +utilitarian +utilitarianism +utilitarians +utilities +utility +utilization +utilize +utilized +utilizes +utilizing +utmost +utopia +utopian +utopians +utopias +utter +utterance +utterances +uttered +uttering +utterly +uttermost +utters +uvula +uvulae +uvular +uvulars +uvulas +uxorious +vacancies +vacancy +vacant +vacantly +vacate +vacated +vacates +vacating +vacation +vacationed +vacationer +vacationers +vacationing +vacationist +vacationists +vacations +vaccinate +vaccinated +vaccinates +vaccinating +vaccination +vaccinations +vaccine +vaccines +vacillate +vacillated +vacillates +vacillating +vacillation +vacillations +vacua +vacuity +vacuole +vacuoles +vacuous +vacuously +vacuousness +vacuum +vacuumed +vacuuming +vacuums +vagabond +vagabondage +vagabonds +vagaries +vagarious +vagary +vagina +vaginae +vaginal +vaginally +vaginas +vagrancy +vagrant +vagrants +vague +vaguely +vagueness +vaguer +vaguest +vain +vainer +vainest +vainglorious +vaingloriously +vainglory +vainly +valance +valances +vale +valediction +valedictions +valedictorian +valedictorians +valedictories +valedictory +valence +valences +valencies +valency +valentine +valentines +vales +valet +valeted +valeting +valets +valetudinarian +valetudinarianism +valetudinarians +valiance +valiant +valiantly +valid +validate +validated +validates +validating +validation +validations +validity +validly +validness +valise +valises +valley +valleys +valor +valorous +valorously +valour +valuable +valuables +valuate +valuated +valuates +valuating +valuation +valuations +value +valued +valueless +valuer +valuers +values +valuing +valve +valved +valveless +valves +valving +valvular +vamoose +vamoosed +vamooses +vamoosing +vamp +vamped +vamping +vampire +vampires +vamps +vanadium +vandal +vandalise +vandalised +vandalises +vandalising +vandalism +vandalize +vandalized +vandalizes +vandalizing +vandals +vane +vanes +vanguard +vanguards +vanilla +vanillas +vanish +vanished +vanishes +vanishing +vanities +vanity +vanned +vanning +vanquish +vanquished +vanquisher +vanquishers +vanquishes +vanquishing +vans +vantage +vantages +vapid +vapidity +vapidly +vapidness +vapor +vaporise +vaporised +vaporises +vaporising +vaporization +vaporize +vaporized +vaporizer +vaporizers +vaporizes +vaporizing +vaporous +vapors +vapory +vapour +vapours +vaquero +vaqueros +variability +variable +variables +variably +variance +variances +variant +variants +variation +variations +varicolored +varicose +varied +variegate +variegated +variegates +variegating +variegation +varies +varietal +varietals +varieties +variety +various +variously +varlet +varlets +varmint +varmints +varnish +varnished +varnishes +varnishing +varsities +varsity +vary +varying +vascular +vase +vasectomies +vasectomy +vases +vasomotor +vassal +vassalage +vassals +vast +vaster +vastest +vastly +vastness +vasts +vats +vatted +vatting +vaudeville +vaudevillian +vaudevillians +vault +vaulted +vaulter +vaulters +vaulting +vaults +vaunt +vaunted +vaunting +vaunts +veal +vector +vectored +vectoring +vectors +veejay +veejays +veep +veeps +veer +veered +veering +veers +vegan +vegans +veges +vegetable +vegetables +vegetarian +vegetarianism +vegetarians +vegetate +vegetated +vegetates +vegetating +vegetation +vegetative +vegged +vegges +veggie +veggies +vegging +vegs +vehemence +vehemency +vehement +vehemently +vehicle +vehicles +vehicular +veil +veiled +veiling +veils +vein +veined +veining +veins +vela +velar +velars +veld +velds +veldt +veldts +vellum +velocipede +velocipedes +velocities +velocity +velour +velours +velum +velvet +velveteen +velvety +venal +venality +venally +venation +vend +vended +vender +venders +vendetta +vendettas +vendible +vending +vendor +vendors +vends +veneer +veneered +veneering +veneers +venerability +venerable +venerate +venerated +venerates +venerating +veneration +venereal +vengeance +vengeful +vengefully +venial +venireman +veniremen +venison +venom +venomous +venomously +venous +vent +vented +ventilate +ventilated +ventilates +ventilating +ventilation +ventilator +ventilators +venting +ventral +ventricle +ventricles +ventricular +ventriloquism +ventriloquist +ventriloquists +ventriloquy +vents +venture +ventured +ventures +venturesome +venturesomely +venturesomeness +venturing +venturous +venturously +venturousness +venue +venues +veracious +veraciously +veracity +veranda +verandah +verandahs +verandas +verb +verbal +verbalization +verbalize +verbalized +verbalizes +verbalizing +verbally +verbals +verbatim +verbena +verbenas +verbiage +verbose +verbosely +verbosity +verboten +verbs +verdant +verdantly +verdict +verdicts +verdigris +verdure +verge +verged +verger +vergers +verges +verging +verier +veriest +verifiable +verification +verified +verifies +verify +verifying +verily +verisimilitude +veritable +veritably +verities +verity +vermicelli +vermiculite +vermiform +vermilion +vermillion +vermin +verminous +vermouth +vernacular +vernaculars +vernal +vernier +verniers +veronica +verruca +verrucae +verrucas +versatile +versatility +verse +versed +verses +versification +versified +versifier +versifiers +versifies +versify +versifying +versing +version +versions +verso +versos +versus +vertebra +vertebrae +vertebral +vertebras +vertebrate +vertebrates +vertex +vertexes +vertical +vertically +verticals +vertices +vertiginous +vertigo +verve +very +vesicle +vesicles +vesicular +vesiculate +vesper +vespers +vessel +vessels +vest +vestal +vestals +vested +vestibule +vestibules +vestige +vestiges +vestigial +vestigially +vesting +vestment +vestments +vestries +vestry +vestryman +vestrymen +vests +vetch +vetches +veteran +veterans +veterinarian +veterinarians +veterinaries +veterinary +veto +vetoed +vetoes +vetoing +vets +vetted +vetting +vexation +vexations +vexatious +vexatiously +vexed +vexes +vexing +viability +viable +viably +viaduct +viaducts +vial +vials +viand +viands +vibe +vibes +vibraharp +vibraharps +vibrancy +vibrant +vibrantly +vibraphone +vibraphones +vibraphonist +vibraphonists +vibrate +vibrated +vibrates +vibrating +vibration +vibrations +vibrato +vibrator +vibrators +vibratory +vibratos +viburnum +viburnums +vicar +vicarage +vicarages +vicarious +vicariously +vicariousness +vicars +vice +viced +vicegerent +vicegerents +vicennial +viceregal +viceroy +viceroys +vices +vichyssoise +vicing +vicinity +vicious +viciously +viciousness +vicissitude +vicissitudes +victim +victimization +victimize +victimized +victimizes +victimizing +victims +victor +victories +victorious +victoriously +victors +victory +victual +victualed +victualing +victualled +victualling +victuals +vicuna +vicunas +videlicet +video +videocassette +videocassettes +videodisc +videodiscs +videodisk +videodisks +videoed +videoing +videophone +videophones +videos +videotape +videotaped +videotapes +videotaping +vied +vies +view +viewed +viewer +viewers +viewership +viewfinder +viewfinders +viewing +viewings +viewpoint +viewpoints +views +vigesimal +vigil +vigilance +vigilant +vigilante +vigilantes +vigilantism +vigilantist +vigilantists +vigilantly +vigils +vignette +vignetted +vignettes +vignetting +vignettist +vignettists +vigor +vigorous +vigorously +vigour +viking +vikings +vile +vilely +vileness +viler +vilest +vilification +vilified +vilifies +vilify +vilifying +villa +village +villager +villagers +villages +villain +villainies +villainous +villains +villainy +villas +villein +villeinage +villeins +villi +villus +vinaigrette +vincible +vindicate +vindicated +vindicates +vindicating +vindication +vindications +vindicator +vindicators +vindictive +vindictively +vindictiveness +vine +vinegar +vinegary +vines +vineyard +vineyards +vino +vinous +vintage +vintages +vintner +vintners +vinyl +vinyls +viol +viola +violable +violas +violate +violated +violates +violating +violation +violations +violator +violators +violence +violent +violently +violet +violets +violin +violinist +violinists +violins +violist +violists +violoncellist +violoncellists +violoncello +violoncellos +viols +viper +viperous +vipers +virago +viragoes +viragos +viral +vireo +vireos +virgin +virginal +virginals +virginity +virgins +virgule +virgules +virile +virility +virologist +virologists +virology +virtual +virtually +virtue +virtues +virtuosi +virtuosity +virtuoso +virtuosos +virtuous +virtuously +virtuousness +virulence +virulent +virulently +virus +viruses +visa +visaed +visage +visages +visaing +visas +viscera +visceral +viscerally +viscid +viscose +viscosity +viscount +viscountcies +viscountcy +viscountess +viscountesses +viscounts +viscous +viscus +vise +vised +vises +visibility +visible +visibly +vising +vision +visionaries +visionary +visioned +visioning +visions +visit +visitant +visitants +visitation +visitations +visited +visiting +visitor +visitors +visits +visor +visors +vista +vistas +visual +visualization +visualize +visualized +visualizer +visualizers +visualizes +visualizing +visually +visuals +vita +vitae +vital +vitality +vitalization +vitalize +vitalized +vitalizes +vitalizing +vitally +vitals +vitamin +vitamins +vitas +vitiate +vitiated +vitiates +vitiating +vitiation +viticulture +viticulturist +viticulturists +vitreous +vitrifaction +vitrification +vitrified +vitrifies +vitrify +vitrifying +vitrine +vitrines +vitriol +vitriolic +vittles +vituperate +vituperated +vituperates +vituperating +vituperation +vituperative +viva +vivace +vivacious +vivaciously +vivaciousness +vivacity +vivaria +vivarium +vivariums +vivas +vivid +vivider +vividest +vividly +vividness +vivified +vivifies +vivify +vivifying +viviparous +vivisect +vivisected +vivisecting +vivisection +vivisectional +vivisectionist +vivisectionists +vivisects +vixen +vixenish +vixenishly +vixens +vizier +viziers +vizir +vizirs +vizor +vizors +vocable +vocables +vocabularies +vocabulary +vocal +vocalic +vocalist +vocalists +vocalization +vocalizations +vocalize +vocalized +vocalizes +vocalizing +vocally +vocals +vocation +vocational +vocations +vocative +vocatives +vociferate +vociferated +vociferates +vociferating +vociferation +vociferous +vociferously +vociferousness +vodka +vogue +vogues +voguish +voice +voiced +voiceless +voicelessly +voicelessness +voices +voicing +void +voidable +voided +voiding +voids +voila +voile +volatile +volatility +volatilize +volatilized +volatilizes +volatilizing +volcanic +volcano +volcanoes +volcanos +vole +voles +volition +volitional +volley +volleyball +volleyballs +volleyed +volleying +volleys +volt +voltage +voltages +voltaic +voltmeter +voltmeters +volts +volubility +voluble +volubly +volume +volumes +voluminous +voluminously +voluminousness +voluntaries +voluntarily +voluntarism +voluntary +volunteer +volunteered +volunteering +volunteerism +volunteers +voluptuaries +voluptuary +voluptuous +voluptuously +voluptuousness +volute +volutes +vomit +vomited +vomiting +vomits +voodoo +voodooed +voodooing +voodooism +voodoos +voracious +voraciously +voraciousness +voracity +vortex +vortexes +vortices +votaries +votary +vote +voted +voter +voters +votes +voting +votive +vouch +vouched +voucher +vouchers +vouches +vouching +vouchsafe +vouchsafed +vouchsafes +vouchsafing +vowed +vowel +vowels +vowing +vows +voyage +voyaged +voyager +voyagers +voyages +voyageur +voyageurs +voyaging +voyeur +voyeurism +voyeuristic +voyeurs +vulcanization +vulcanize +vulcanized +vulcanizes +vulcanizing +vulgar +vulgarer +vulgarest +vulgarian +vulgarians +vulgarism +vulgarisms +vulgarities +vulgarity +vulgarization +vulgarize +vulgarized +vulgarizer +vulgarizers +vulgarizes +vulgarizing +vulgarly +vulnerabilities +vulnerability +vulnerable +vulnerably +vulpine +vulture +vultures +vulturous +vulva +vulvae +vulvas +vying +wackier +wackiest +wackiness +wacko +wackos +wacky +wadded +wadding +waddle +waddled +waddles +waddling +wade +waded +wader +waders +wades +wadi +wading +wadis +wads +wafer +wafers +waffle +waffled +waffler +wafflers +waffles +waffling +waft +wafted +wafting +wafts +wage +waged +wager +wagered +wagerer +wagerers +wagering +wagers +wages +wagged +waggeries +waggery +wagging +waggish +waggishly +waggishness +waggle +waggled +waggles +waggling +waggon +waggons +waging +wagon +wagoner +wagoners +wagons +wags +wagtail +wagtails +waif +waifs +wail +wailed +wailer +wailers +wailing +wails +wain +wains +wainscot +wainscoted +wainscoting +wainscotings +wainscots +wainscotted +wainscotting +wainscottings +wainwright +wainwrights +waist +waistband +waistbands +waistcoat +waistcoats +waistline +waistlines +waists +wait +waited +waiter +waiters +waiting +waitperson +waitpersons +waitress +waitresses +waits +waitstaff +waive +waived +waiver +waivers +waives +waiving +wake +waked +wakeful +wakefully +wakefulness +waken +wakened +wakening +wakens +wakes +waking +wale +waled +wales +waling +walk +walkaway +walkaways +walked +walker +walkers +walking +walkout +walkouts +walkover +walkovers +walks +walkway +walkways +wall +wallabies +wallaby +wallboard +walled +wallet +wallets +walleye +walleyed +walleyes +wallflower +wallflowers +walling +wallop +walloped +walloping +wallopings +wallops +wallow +wallowed +wallowing +wallows +wallpaper +wallpapered +wallpapering +wallpapers +walls +walnut +walnuts +walrus +walruses +waltz +waltzed +waltzer +waltzers +waltzes +waltzing +wampum +wand +wander +wandered +wanderer +wanderers +wandering +wanderings +wanderlust +wanderlusts +wanders +wands +wane +waned +wanes +wangle +wangled +wangler +wanglers +wangles +wangling +waning +wanly +wanna +wannabe +wannabes +wanner +wanness +wannest +want +wanted +wanting +wanton +wantoned +wantoning +wantonly +wantonness +wantons +wants +wapiti +wapitis +warble +warbled +warbler +warblers +warbles +warbling +warbonnet +warbonnets +ward +warded +warden +wardens +warder +warders +warding +wardrobe +wardrobes +wardroom +wardrooms +wards +ware +warehouse +warehoused +warehouses +warehousing +wares +warfare +warhead +warheads +warhorse +warhorses +warier +wariest +warily +wariness +warlike +warlock +warlocks +warlord +warlords +warm +warmblooded +warmed +warmer +warmers +warmest +warmhearted +warmheartedness +warming +warmish +warmly +warmness +warmonger +warmongering +warmongers +warms +warmth +warmup +warmups +warn +warned +warning +warnings +warns +warp +warpath +warpaths +warped +warping +warplane +warplanes +warps +warrant +warranted +warrantied +warranties +warranting +warrants +warranty +warrantying +warred +warren +warrens +warring +warrior +warriors +wars +warship +warships +wart +warthog +warthogs +wartier +wartiest +wartime +warts +warty +wary +wash +washable +washables +washbasin +washbasins +washboard +washboards +washbowl +washbowls +washcloth +washcloths +washed +washer +washers +washerwoman +washerwomen +washes +washier +washiest +washing +washings +washout +washouts +washrag +washrags +washroom +washrooms +washstand +washstands +washtub +washtubs +washy +wasp +waspish +waspishly +waspishness +wasps +wassail +wassailed +wassailing +wassails +wast +wastage +waste +wastebasket +wastebaskets +wasted +wasteful +wastefully +wastefulness +wasteland +wastelands +wastepaper +waster +wasters +wastes +wasting +wastrel +wastrels +watch +watchband +watchbands +watchdog +watchdogs +watched +watcher +watchers +watches +watchful +watchfully +watchfulness +watching +watchmaker +watchmakers +watchmaking +watchman +watchmen +watchtower +watchtowers +watchword +watchwords +water +waterbed +waterbeds +waterbird +waterbirds +waterborne +watercolor +watercolors +watercourse +watercourses +watercraft +watercress +watered +waterfall +waterfalls +waterfowl +waterfowls +waterfront +waterfronts +waterhole +waterholes +waterier +wateriest +wateriness +watering +waterlilies +waterlily +waterline +waterlines +waterlogged +watermark +watermarked +watermarking +watermarks +watermelon +watermelons +watermill +watermills +waterpower +waterproof +waterproofed +waterproofing +waterproofs +waters +watershed +watersheds +waterside +watersides +waterspout +waterspouts +watertight +waterway +waterways +waterwheel +waterwheels +waterworks +watery +watt +wattage +wattle +wattled +wattles +wattling +watts +wave +waved +wavelength +wavelengths +wavelet +wavelets +wavelike +waver +wavered +waverer +waverers +wavering +waveringly +wavers +waves +wavier +waviest +waviness +waving +wavy +waxed +waxen +waxes +waxier +waxiest +waxiness +waxing +waxwing +waxwings +waxwork +waxworks +waxy +waybill +waybills +wayfarer +wayfarers +wayfaring +wayfarings +waylaid +waylay +waylayer +waylayers +waylaying +waylays +ways +wayside +waysides +wayward +waywardly +waywardness +weak +weaken +weakened +weakener +weakeners +weakening +weakens +weaker +weakest +weakfish +weakfishes +weakling +weaklings +weakly +weakness +weaknesses +weal +weals +wealth +wealthier +wealthiest +wealthiness +wealthy +wean +weaned +weaning +weans +weapon +weaponless +weaponry +weapons +wear +wearable +wearer +wearers +wearied +wearier +wearies +weariest +wearily +weariness +wearing +wearisome +wearisomely +wears +weary +wearying +weasel +weaseled +weaseling +weaselled +weaselling +weaselly +weasels +weather +weathercock +weathercocks +weathered +weathering +weatherization +weatherize +weatherized +weatherizes +weatherizing +weatherman +weathermen +weatherperson +weatherpersons +weatherproof +weatherproofed +weatherproofing +weatherproofs +weathers +weatherstrip +weatherstripped +weatherstripping +weatherstrips +weave +weaved +weaver +weavers +weaves +weaving +webbed +webbing +webfeet +webfoot +webs +website +websites +wedded +wedding +weddings +wedge +wedged +wedges +wedgie +wedgies +wedging +wedlock +weds +weed +weeded +weeder +weeders +weedier +weediest +weeding +weedless +weeds +weedy +weeing +week +weekday +weekdays +weekend +weekended +weekending +weekends +weeklies +weekly +weeknight +weeknights +weeks +ween +weened +weenie +weenier +weenies +weeniest +weening +weens +weensier +weensiest +weensy +weeny +weep +weeper +weepers +weepier +weepies +weepiest +weeping +weeps +weepy +weer +wees +weest +weevil +weevils +weft +wefts +weigh +weighed +weighing +weighs +weight +weighted +weightier +weightiest +weightily +weightiness +weighting +weightless +weightlessly +weightlessness +weightlifter +weightlifters +weightlifting +weights +weighty +weir +weird +weirder +weirdest +weirdie +weirdies +weirdly +weirdness +weirdo +weirdos +weirs +welch +welched +welches +welching +welcome +welcomed +welcomes +welcoming +weld +weldable +welded +welder +welders +welding +welds +welfare +welkin +well +welled +wellhead +wellheads +welling +wellington +wellingtons +wellness +wells +wellspring +wellsprings +welsh +welshed +welsher +welshers +welshes +welshing +welt +welted +welter +weltered +weltering +welters +welterweight +welterweights +welting +welts +wench +wenches +wend +wended +wending +wends +wens +went +wept +were +werewolf +werewolves +werwolf +werwolves +west +westbound +westerlies +westerly +western +westerner +westerners +westernization +westernize +westernized +westernizes +westernizing +westernmost +westerns +westward +westwards +wetback +wetbacks +wetland +wetlands +wetly +wetness +wets +wetted +wetter +wetters +wettest +wetting +whack +whacked +whacker +whackers +whackier +whackiest +whacking +whacks +whacky +whale +whaleboat +whaleboats +whalebone +whaled +whaler +whalers +whales +whaling +wham +whammed +whammies +whamming +whammy +whams +wharf +wharfs +wharves +what +whatchamacallit +whatchamacallits +whatever +whatnot +whats +whatsoever +wheal +wheals +wheat +wheaten +whee +wheedle +wheedled +wheedler +wheedlers +wheedles +wheedling +wheel +wheelbarrow +wheelbarrows +wheelbase +wheelbases +wheelchair +wheelchairs +wheeled +wheelhouse +wheelhouses +wheelie +wheelies +wheeling +wheels +wheelwright +wheelwrights +wheeze +wheezed +wheezes +wheezier +wheeziest +wheezily +wheeziness +wheezing +wheezy +whelk +whelks +whelm +whelmed +whelming +whelms +whelp +whelped +whelping +whelps +when +whence +whenever +whens +whensoever +where +whereabouts +whereas +whereat +whereby +wherefore +wherefores +wherein +whereof +whereon +wheres +wheresoever +whereto +whereupon +wherever +wherewith +wherewithal +wherries +wherry +whet +whether +whets +whetstone +whetstones +whetted +whetting +whew +whey +which +whichever +whiff +whiffed +whiffing +whiffletree +whiffletrees +whiffs +while +whiled +whiles +whiling +whilom +whilst +whim +whimper +whimpered +whimpering +whimpers +whims +whimsey +whimseys +whimsical +whimsicality +whimsically +whimsies +whimsy +whine +whined +whiner +whiners +whines +whinier +whiniest +whining +whinnied +whinnies +whinny +whinnying +whiny +whip +whipcord +whiplash +whiplashes +whipped +whipper +whippers +whippersnapper +whippersnappers +whippet +whippets +whipping +whippings +whippletree +whippletrees +whippoorwill +whippoorwills +whips +whipsaw +whipsawed +whipsawing +whipsawn +whipsaws +whir +whirl +whirled +whirligig +whirligigs +whirling +whirlpool +whirlpools +whirls +whirlwind +whirlwinds +whirlybird +whirlybirds +whirr +whirred +whirring +whirrs +whirs +whisk +whisked +whisker +whiskered +whiskers +whiskery +whiskey +whiskeys +whiskies +whisking +whisks +whisky +whisper +whispered +whisperer +whisperers +whispering +whispers +whist +whistle +whistled +whistler +whistlers +whistles +whistling +whit +white +whitecap +whitecaps +whitefish +whitefishes +whitehead +whiteheads +whiten +whitened +whitener +whiteners +whiteness +whitening +whitenings +whitens +whiteout +whiteouts +whiter +whites +whitest +whitetail +whitetails +whitewall +whitewalls +whitewash +whitewashed +whitewashes +whitewashing +whitewater +whitey +whiteys +whither +whiting +whitings +whitish +whits +whittle +whittled +whittler +whittlers +whittles +whittling +whiz +whizkid +whizkids +whizz +whizzbang +whizzbangs +whizzed +whizzes +whizzing +whoa +whodunit +whodunits +whodunnit +whodunnits +whoever +whole +wholehearted +wholeheartedly +wholeheartedness +wholeness +wholes +wholesale +wholesaled +wholesaler +wholesalers +wholesales +wholesaling +wholesome +wholesomely +wholesomeness +wholesomer +wholesomest +wholly +whom +whomever +whomsoever +whoop +whooped +whoopee +whooper +whoopers +whooping +whoops +whoosh +whooshed +whooshes +whooshing +whopper +whoppers +whopping +whore +whorehouse +whorehouses +whoreish +whores +whorish +whorl +whorled +whorls +whose +whoso +whosoever +whys +wick +wicked +wickeder +wickedest +wickedly +wickedness +wicker +wickers +wickerwork +wicket +wickets +wicking +wicks +wide +widely +widemouthed +widen +widened +widener +wideners +wideness +widening +widens +wider +widespread +widest +widgeon +widgeons +widow +widowed +widower +widowers +widowhood +widowing +widows +width +widths +wield +wielded +wielder +wielders +wielding +wields +wiener +wieners +wienie +wienies +wife +wifeless +wifely +wigeon +wigeons +wigged +wigging +wiggle +wiggled +wiggler +wigglers +wiggles +wigglier +wiggliest +wiggling +wiggly +wight +wights +wiglet +wiglets +wigs +wigwag +wigwagged +wigwagging +wigwags +wigwam +wigwams +wild +wildcat +wildcats +wildcatted +wildcatter +wildcatters +wildcatting +wildebeest +wildebeests +wilder +wilderness +wildernesses +wildest +wildfire +wildfires +wildflower +wildflowers +wildfowl +wildfowls +wildlife +wildly +wildness +wilds +wile +wiled +wiles +wilful +wilfully +wilfulness +wilier +wiliest +wiliness +wiling +will +willed +willful +willfully +willfulness +willies +willing +willingly +willingness +williwaw +williwaws +willow +willowier +willowiest +willows +willowy +willpower +wills +wilt +wilted +wilting +wilts +wily +wimp +wimpier +wimpiest +wimpish +wimple +wimpled +wimples +wimpling +wimps +wimpy +wince +winced +winces +winch +winched +winches +winching +wincing +wind +windbag +windbags +windblown +windbreak +windbreaker +windbreakers +windbreaks +windburn +windburned +windchill +winded +winder +winders +windfall +windfalls +windflower +windflowers +windier +windiest +windily +windiness +winding +windjammer +windjammers +windlass +windlasses +windless +windmill +windmilled +windmilling +windmills +window +windowless +windowpane +windowpanes +windows +windowsill +windowsills +windpipe +windpipes +windproof +windrow +windrows +winds +windshield +windshields +windsock +windsocks +windstorm +windstorms +windsurf +windsurfed +windsurfer +windsurfers +windsurfing +windsurfs +windswept +windup +windups +windward +windy +wine +wined +wineglass +wineglasses +winegrower +winegrowers +winemaker +winemakers +wineries +winery +wines +wing +wingding +wingdings +winged +winging +wingless +winglike +wings +wingspan +wingspans +wingspread +wingspreads +wingtip +wingtips +winier +winiest +wining +wink +winked +winker +winkers +winking +winkle +winkled +winkles +winkling +winks +winnable +winner +winners +winning +winningly +winnings +winnow +winnowed +winnower +winnowers +winnowing +winnows +wino +winos +wins +winsome +winsomely +winsomeness +winsomer +winsomest +winter +wintered +wintergreen +winterier +winteriest +wintering +winterize +winterized +winterizes +winterizing +winters +wintertime +wintery +wintrier +wintriest +wintry +winy +wipe +wiped +wiper +wipers +wipes +wiping +wire +wired +wirehair +wirehairs +wireless +wirelesses +wires +wiretap +wiretapped +wiretapper +wiretappers +wiretapping +wiretaps +wirier +wiriest +wiriness +wiring +wiry +wisdom +wise +wiseacre +wiseacres +wisecrack +wisecracked +wisecracking +wisecracks +wisely +wiser +wises +wisest +wish +wishbone +wishbones +wished +wisher +wishers +wishes +wishful +wishfully +wishing +wisp +wispier +wispiest +wisps +wispy +wist +wistaria +wistarias +wisteria +wisterias +wistful +wistfully +wistfulness +witch +witchcraft +witched +witchery +witches +witching +with +withal +withdraw +withdrawal +withdrawals +withdrawing +withdrawn +withdraws +withdrew +withe +withed +wither +withered +withering +witheringly +withers +withes +withheld +withhold +withholding +withholds +within +withing +without +withstand +withstanding +withstands +withstood +witless +witlessly +witlessness +witness +witnessed +witnesses +witnessing +wits +witted +witticism +witticisms +wittier +wittiest +wittily +wittiness +witting +wittingly +witty +wive +wived +wives +wiving +wizard +wizardry +wizards +wizened +wizes +wizzes +woad +wobble +wobbled +wobbles +wobblier +wobbliest +wobbliness +wobbling +wobbly +woebegone +woeful +woefuller +woefullest +woefully +woefulness +woes +woke +woken +woks +wold +wolds +wolf +wolfed +wolfhound +wolfhounds +wolfing +wolfish +wolfram +wolfs +wolverine +wolverines +wolves +woman +womanhood +womanish +womanize +womanized +womanizer +womanizers +womanizes +womanizing +womankind +womanlier +womanliest +womanlike +womanliness +womanly +womb +wombat +wombats +wombs +women +womenfolk +womenfolks +wonder +wondered +wonderful +wonderfully +wonderfulness +wondering +wonderingly +wonderland +wonderlands +wonderment +wonders +wondrous +wondrously +wonk +wonkier +wonkiest +wonks +wonky +wont +wonted +wonton +wontons +wood +woodbine +woodblock +woodblocks +woodcarver +woodcarvers +woodcarving +woodcarvings +woodchuck +woodchucks +woodcock +woodcocks +woodcraft +woodcut +woodcuts +woodcutter +woodcutters +woodcutting +wooded +wooden +woodener +woodenest +woodenly +woodenness +woodier +woodies +woodiest +woodiness +wooding +woodland +woodlands +woodlot +woodlots +woodman +woodmen +woodpecker +woodpeckers +woodpile +woodpiles +woods +woodshed +woodsheds +woodsier +woodsiest +woodsiness +woodsman +woodsmen +woodsy +woodwind +woodwinds +woodwork +woodworker +woodworkers +woodworking +woody +wooed +wooer +wooers +woof +woofed +woofer +woofers +woofing +woofs +wooing +wool +woolen +woolens +woolgathering +woolie +woolier +woolies +wooliest +woollen +woollens +woollier +woollies +woolliest +woolliness +woolly +wooly +woos +woozier +wooziest +woozily +wooziness +woozy +word +wordage +wordbook +wordbooks +worded +wordier +wordiest +wordily +wordiness +wording +wordings +wordless +wordlessly +wordplay +words +wordy +wore +work +workable +workaday +workaholic +workaholics +workbench +workbenches +workbook +workbooks +workday +workdays +worked +worker +workers +workfare +workforce +workhorse +workhorses +workhouse +workhouses +working +workingman +workingmen +workings +workingwoman +workingwomen +workload +workloads +workman +workmanlike +workmanship +workmen +workout +workouts +workplace +workplaces +workroom +workrooms +works +worksheet +worksheets +workshop +workshops +workstation +workstations +worktable +worktables +workup +workups +workweek +workweeks +world +worldlier +worldliest +worldliness +worldly +worlds +worldview +worldviews +worldwide +worm +wormed +wormhole +wormholes +wormier +wormiest +worming +worms +wormwood +wormy +worn +worried +worrier +worriers +worries +worriment +worrisome +worry +worrying +worryingly +worrywart +worrywarts +worse +worsen +worsened +worsening +worsens +worship +worshiped +worshiper +worshipers +worshipful +worshiping +worshipped +worshipper +worshippers +worshipping +worships +worst +worsted +worsting +worsts +wort +worth +worthier +worthies +worthiest +worthily +worthiness +worthless +worthlessly +worthlessness +worthwhile +worthy +would +wouldst +wound +wounded +wounding +wounds +wove +woven +wowed +wowing +wows +wrack +wraith +wraiths +wrangle +wrangled +wrangler +wranglers +wrangles +wrangling +wrap +wraparound +wraparounds +wrapped +wrapper +wrappers +wrapping +wrappings +wraps +wrapt +wrasse +wrasses +wrath +wrathful +wrathfully +wreak +wreaked +wreaking +wreaks +wreath +wreathe +wreathed +wreathes +wreathing +wreaths +wreck +wreckage +wrecked +wrecker +wreckers +wrecking +wrecks +wren +wrench +wrenched +wrenches +wrenching +wrens +wrest +wrested +wresting +wrestle +wrestled +wrestler +wrestlers +wrestles +wrestling +wrests +wretch +wretched +wretcheder +wretchedest +wretchedly +wretchedness +wretches +wrier +wriest +wriggle +wriggled +wriggler +wrigglers +wriggles +wrigglier +wriggliest +wriggling +wriggly +wright +wrights +wring +wringer +wringers +wringing +wrings +wrinkle +wrinkled +wrinkles +wrinklier +wrinklies +wrinkliest +wrinkling +wrinkly +wrist +wristband +wristbands +wrists +wristwatch +wristwatches +writ +write +writer +writers +writes +writhe +writhed +writhes +writhing +writing +writings +writs +written +wrong +wrongdoer +wrongdoers +wrongdoing +wrongdoings +wronged +wronger +wrongest +wrongful +wrongfully +wrongfulness +wrongheaded +wrongheadedly +wrongheadedness +wronging +wrongly +wrongness +wrongs +wrote +wroth +wrought +wrung +wryer +wryest +wryly +wryness +wurst +wursts +wuss +wusses +wussier +wussies +wussiest +wussy +xenon +xenophobe +xenophobes +xenophobia +xenophobic +xerographic +xerography +xerox +xeroxed +xeroxes +xeroxing +xylem +xylophone +xylophones +xylophonist +xylophonists +yacht +yachted +yachting +yachts +yachtsman +yachtsmen +yachtswoman +yachtswomen +yack +yacked +yacking +yacks +yahoo +yahoos +yakked +yakking +yaks +yammer +yammered +yammerer +yammerers +yammering +yammers +yams +yang +yank +yanked +yanking +yanks +yapped +yapping +yaps +yard +yardage +yardages +yardarm +yardarms +yardman +yardmaster +yardmasters +yardmen +yards +yardstick +yardsticks +yarmelke +yarmelkes +yarmulke +yarmulkes +yarn +yarns +yarrow +yawed +yawing +yawl +yawls +yawn +yawned +yawner +yawners +yawning +yawns +yaws +yeah +yeahs +year +yearbook +yearbooks +yearlies +yearling +yearlings +yearlong +yearly +yearn +yearned +yearning +yearnings +yearns +years +yeas +yeast +yeastier +yeastiest +yeasts +yeasty +yegg +yeggs +yell +yelled +yelling +yellow +yellowed +yellower +yellowest +yellowing +yellowish +yellowness +yellows +yellowy +yells +yelp +yelped +yelping +yelps +yens +yeoman +yeomanry +yeomen +yeps +yeses +yeshiva +yeshivah +yeshivahs +yeshivas +yeshivoth +yessed +yessing +yesterday +yesterdays +yesteryear +yeti +yetis +yews +yield +yielded +yielding +yields +yikes +yipe +yipped +yippee +yipping +yips +yodel +yodeled +yodeler +yodelers +yodeling +yodelled +yodeller +yodellers +yodelling +yodels +yoga +yoghourt +yoghourts +yoghurt +yoghurts +yogi +yogin +yogins +yogis +yogurt +yogurts +yoke +yoked +yokel +yokels +yokes +yoking +yolk +yolked +yolks +yonder +yore +young +younger +youngest +youngish +youngster +youngsters +your +yours +yourself +yourselves +yous +youth +youthful +youthfully +youthfulness +youths +yowl +yowled +yowling +yowls +ytterbium +yttrium +yuan +yucca +yuccas +yuck +yucked +yuckier +yuckiest +yucking +yucks +yucky +yukked +yukking +yuks +yule +yuletide +yummier +yummiest +yummy +yuppie +yuppies +yuppy +yups +yurt +yurts +zanier +zanies +zaniest +zaniness +zany +zapped +zapper +zappers +zapping +zaps +zeal +zealot +zealotry +zealots +zealous +zealously +zealousness +zebra +zebras +zebu +zebus +zeds +zeitgeist +zeitgeists +zenith +zeniths +zephyr +zephyrs +zeppelin +zeppelins +zero +zeroed +zeroes +zeroing +zeros +zest +zestful +zestfully +zestfulness +zestier +zestiest +zests +zesty +zeta +zetas +zigzag +zigzagged +zigzagging +zigzags +zilch +zillion +zillions +zinc +zinced +zincing +zincked +zincking +zincs +zinfandel +zing +zinged +zinger +zingers +zingier +zingiest +zinging +zings +zingy +zinnia +zinnias +zipped +zipper +zippered +zippering +zippers +zippier +zippiest +zipping +zippy +zips +zircon +zirconium +zircons +zither +zithers +zits +zloty +zlotys +zodiac +zodiacal +zodiacs +zombi +zombie +zombies +zombis +zonal +zonally +zone +zoned +zones +zoning +zonked +zookeeper +zookeepers +zoological +zoologically +zoologist +zoologists +zoology +zoom +zoomed +zooming +zooms +zoophyte +zoophytes +zoophytic +zoos +zounds +zucchini +zucchinis +zwieback +zydeco +zygote +zygotes +zygotic +zymurgy From 6c6f9c01c7cbcf8cbeb5f3da9025b2c055f7b277 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 6 Apr 2022 23:40:50 +0200 Subject: [PATCH 183/197] lightswitch: Correct default touchOn Change settings.js and widget.js: - Correct default value of touchOn according to value in README.md --- apps/lightswitch/settings.js | 2 +- apps/lightswitch/widget.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index a502324d9..5ac70bc28 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -6,7 +6,7 @@ var settings = Object.assign({ colors: "011", image: "default", - touchOn: "clock,launch", + touchOn: "always", oversize: 20, dragDelay: 500, minValue: 0.1, diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 53f86ee9a..829f75102 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -3,7 +3,7 @@ var settings = Object.assign({ colors: "011", image: "default", - touchOn: "clock,launch", + touchOn: "always", oversize: 20, dragDelay: 500, minValue: 0.1, From 80d35e4e33646a7395de1451c218b84cab081f63 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:22:52 +0200 Subject: [PATCH 184/197] massages: Add option to disable icon flashing Update ChangeLog, metadata.json, README.md and settigns.js: - Add option to toggle icon flashing. Update widget.js: - Add option to toggle icon flashing. - Correct clearRect y2 value. - Moved icon 1px up to be more centered. --- apps/messages/ChangeLog | 1 + apps/messages/README.md | 1 + apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ++++++ apps/messages/widget.js | 11 +++++++---- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 092a38eb6..3e676c21e 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,3 +43,4 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) +0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index 780d8e50b..da2701f35 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,6 +21,7 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? +* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index dfeedaef7..5c1e67702 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.30", + "version": "0.31", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 754347f19..cc0030ec5 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,6 +7,7 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; + if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -47,6 +48,11 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, + /*LANG*/'Flash Icon': { + value: !!settings().flash, + format: v => v?/*LANG*/'Yes':/*LANG*/'No', + onchange: v => updateSetting("flash", v) + }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 3ac726e77..4b368ffd6 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function() { +draw:function(recall) { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,15 +8,18 @@ draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); - g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + if (settings.flash===undefined) settings.flash = true; + if (recall !== true || settings.flash) { + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); + g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); + } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 1c93c4bd01b3b5e725487401eaebb701c5fd5f5d Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:28:15 +0200 Subject: [PATCH 185/197] Revert "massages: Add option to disable icon flashing" This reverts commit 80d35e4e33646a7395de1451c218b84cab081f63. --- apps/messages/ChangeLog | 1 - apps/messages/README.md | 1 - apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ------ apps/messages/widget.js | 11 ++++------- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 3e676c21e..092a38eb6 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,4 +43,3 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) -0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index da2701f35..780d8e50b 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,7 +21,6 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? -* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 5c1e67702..dfeedaef7 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.31", + "version": "0.30", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index cc0030ec5..754347f19 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,7 +7,6 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; - if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -48,11 +47,6 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, - /*LANG*/'Flash Icon': { - value: !!settings().flash, - format: v => v?/*LANG*/'Yes':/*LANG*/'No', - onchange: v => updateSetting("flash", v) - }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 4b368ffd6..3ac726e77 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function(recall) { +draw:function() { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,18 +8,15 @@ draw:function(recall) { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); + g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; - if (settings.flash===undefined) settings.flash = true; - if (recall !== true || settings.flash) { - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); - g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); - } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 1d23c4f2e4981f924b15c84d86d2ba9964014ea2 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:30:39 +0200 Subject: [PATCH 186/197] massages: Add option to disable icon flashing Update ChangeLog, metadata.json, README.md and settigns.js: - Add option to toggle icon flashing. Update widget.js: - Add option to toggle icon flashing. - Correct clearRect y2 value. - Moved icon 1px up to be more centered. --- apps/messages/ChangeLog | 1 + apps/messages/README.md | 1 + apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ++++++ apps/messages/widget.js | 11 +++++++---- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 092a38eb6..3e676c21e 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,3 +43,4 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) +0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index 780d8e50b..da2701f35 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,6 +21,7 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? +* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index dfeedaef7..5c1e67702 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.30", + "version": "0.31", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 754347f19..cc0030ec5 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,6 +7,7 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; + if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -47,6 +48,11 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, + /*LANG*/'Flash Icon': { + value: !!settings().flash, + format: v => v?/*LANG*/'Yes':/*LANG*/'No', + onchange: v => updateSetting("flash", v) + }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 3ac726e77..4b368ffd6 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function() { +draw:function(recall) { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,15 +8,18 @@ draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); - g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + if (settings.flash===undefined) settings.flash = true; + if (recall !== true || settings.flash) { + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); + g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); + } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 2816c46be596d67c5c87c7ef9e9c43670b6a1700 Mon Sep 17 00:00:00 2001 From: Eskild Hustvedt Date: Thu, 7 Apr 2022 09:41:48 +0200 Subject: [PATCH 187/197] locales: Fixed day order for no_NB --- apps/locale/locales.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 282c808f3..b899577f9 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -698,8 +698,8 @@ var locales = { datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Ma,Ti,On,To,Fr,Lø,Sø", - day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + abday: "Sø,Ma,Ti,On,To,Fr,Lø", + day: "Søndag,Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag", trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } }, /*, From dd31ebbc597f416d16b13b2788b36dc2be01723b Mon Sep 17 00:00:00 2001 From: Eskild Hustvedt Date: Thu, 7 Apr 2022 10:47:26 +0200 Subject: [PATCH 188/197] locales/fuzzyw: Added Norwegian Nynorsk translation --- apps/fuzzyw/fuzzy_strings.json | 23 +++++++++++++++++++++++ apps/locale/locales.js | 18 ++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 8594ad554..55f443813 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -114,6 +114,29 @@ ], "text_scale":3.5 }, + "nn_NO":{ + "hours":[ + "tolv", "eitt", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve", + "tolv", "eitt", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve" + ], + "minutes":[ + "klokka er *$1", + "fem over *$1", + "ti over *$1", + "kvart over *$1", + "ti på halv *$2", + "fem på halv *$2", + "halv *$2", + "fem over halv *$2", + "ti over halv *$2", + "kvart på *$2", + "ti på *$2", + "fem på *$2" + ], + "text_scale":3.5 + }, "sv_SE":{ "hours":[ "tolv", "ett", "två", "tre", "fyra", "fem", diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 282c808f3..fe2325848 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -684,6 +684,24 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, + "nn_NO": { // Using charfallbacks + lang: "nn_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Su,Må,Ty,On,To,Fr,La", + day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } + }, "no_NB": { // Using charfallbacks lang: "no_NB", decimal_point: ",", From d2f2d712a22b4631d48554295411c83c64ce579e Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 13:01:47 +0200 Subject: [PATCH 189/197] mylocation: Fix selecting Frankfurt not saved Corrected check for selected location = "???". --- apps/mylocation/ChangeLog | 1 + apps/mylocation/metadata.json | 2 +- apps/mylocation/mylocation.app.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog index b9eba67f4..ab8af7620 100644 --- a/apps/mylocation/ChangeLog +++ b/apps/mylocation/ChangeLog @@ -1,3 +1,4 @@ 0.01: First release 0.02: Enhanced icon, make it bolder 0.03: Fixed issue with defaulting back to London +0.04: Fixed issue selecting Frankfurt not saved diff --git a/apps/mylocation/metadata.json b/apps/mylocation/metadata.json index a7fd8356c..9182ba160 100644 --- a/apps/mylocation/metadata.json +++ b/apps/mylocation/metadata.json @@ -4,7 +4,7 @@ "icon": "mylocation.png", "type": "app", "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.03", + "version":"0.04", "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index 27ab17ea5..b9451e0fb 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -61,7 +61,7 @@ function showMainMenu() { min: 0, max: locations.length - 1, format: v => locations[v], onchange: v => { - if (v != 6) { + if (locations[v] !== "???") { s.location = locations[v]; s.lat = lats[v]; s.lon = lons[v]; From 2c36071a374a0e4a6af94286ddb04513ce280dda Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 14:21:36 +0100 Subject: [PATCH 190/197] alarm 0.18: Cope with >1 identical alarm at once (#1667) --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 22 ++++++++++++++++------ apps/alarm/metadata.json | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 0811f2166..7c266c0be 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -16,3 +16,4 @@ 0.15: Fix hour/minute wrapping code for new menu system 0.16: Adding alarm library 0.17: Moving alarm internals to 'sched' library +0.18: Cope with >1 identical alarm at once (#1667) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 45edd83f5..802a4744b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -45,12 +45,22 @@ function showMainMenu() { /*LANG*/'New Timer': ()=>editTimer(-1) }; alarms.forEach((alarm,idx)=>{ - var txt; // a leading space is currently required (JS error in Espruino 2v12) - if (alarm.timer) - txt = /*LANG*/"Timer"+" "+formatTime(alarm.timer); - else - txt = /*LANG*/"Alarm"+" "+formatTime(alarm.t); + var type,txt; // a leading space is currently required (JS error in Espruino 2v12) + if (alarm.timer) { + type = /*LANG*/"Timer"; + txt = " "+formatTime(alarm.timer); + } else { + type = /*LANG*/"Alarm"; + txt = " "+formatTime(alarm.t); + } if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA="); + // rename duplicate alarms + if (menu[type+txt]) { + var n = 2; + while (menu[type+" "+n+txt]) n++; + txt = type+" "+n+txt; + } else txt = type+txt; + // add to menu menu[txt] = { value : "\0"+atob(alarm.on?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"), onchange : function() { @@ -84,7 +94,7 @@ function editAlarm(alarmIndex, alarm) { var a = { t : 12*3600000, // 12 o clock default on : true, - rp : true, + rp : false, // repeat not the default as : false, dow : 0b1111111, last : 0, diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index fe82e04c9..0d9567849 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.17", + "version": "0.18", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", From 1dd232ffce46386fe81d6f547bf35a7558e4ca20 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 15:47:01 +0100 Subject: [PATCH 191/197] alarm fixes (fix #1667) --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 4 ++-- apps/alarm/metadata.json | 2 +- apps/sched/ChangeLog | 1 + apps/sched/boot.js | 29 ++++++++++++++++++++++++----- apps/sched/metadata.json | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 7c266c0be..fcafc386f 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -17,3 +17,4 @@ 0.16: Adding alarm library 0.17: Moving alarm internals to 'sched' library 0.18: Cope with >1 identical alarm at once (#1667) +0.19: Ensure rescheduled alarms that already fired have 'last' reset diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 802a4744b..b9404358e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -138,8 +138,7 @@ function editAlarm(alarmIndex, alarm) { }; menu[/*LANG*/"Save"] = function() { a.t = encodeTime(t); - if (a.t < getCurrentTime()) - a.day = (new Date()).getDate(); + a.last = (a.t < getCurrentTime()) ? (new Date()).getDate() : 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); @@ -191,6 +190,7 @@ function editTimer(alarmIndex, alarm) { menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); a.t = getCurrentTime() + a.timer; + a.last = 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 0d9567849..9636257ca 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.18", + "version": "0.19", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 5560f00bc..d8cd37a05 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Fix scheduling of other alarms if there is a pending alarm from the past (fix #1667) diff --git a/apps/sched/boot.js b/apps/sched/boot.js index c772a135e..dbdf02593 100644 --- a/apps/sched/boot.js +++ b/apps/sched/boot.js @@ -6,13 +6,19 @@ } var alarms = require('Storage').readJSON('sched.json',1)||[]; var time = new Date(); - var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1 && (!a.date || a.date==time.toISOString().substr(0,10))); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var d = time.getDate(); + var active = alarms.filter( + a=>a.on && // enabled + a.last!=d && // not already fired today + a.t+60000>currentTime && // is not in the past by >1 minute + (a.dow>>time.getDay())&1 && // is allowed on this day of the week + (!a.date || a.date==time.toISOString().substr(0,10)) // is allowed on this date + ); if (active.length) { - active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); - var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + active = active.sort((a,b)=>a.t-b.t); // sort by time var t = active[0].t-currentTime; - if (active[0].last == time.getDate() || t < -60000) t += 86400000; - if (t<1000) t=1000; // start alarm min 1 sec from now + if (t<1000) t=1000; // start alarm minimum 1 sec from now /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed @@ -23,3 +29,16 @@ Bangle.SCHED = setTimeout('eval(require("Storage").read("sched.boot.js"))', 86400000 - (Date.now()%86400000)); } })(); +/* DEBUGGING +=============== + +// show the current timer for the next event +global["\xff"].timers[Bangle.SCHED] + +// time in hours of scheduled timer event +global["\xff"].timers[Bangle.SCHED].time / (1024*1024*60*60) + +// set time 1 hour in the past +setTime(getTime() - 60*60) + +*/ diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 60aa71d41..defffb29b 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.01", + "version": "0.02", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", From 895e7ffd599fe457077c646b8fa44868d6f0343b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 15:53:39 +0100 Subject: [PATCH 192/197] rename locale as mentioned in https://github.com/espruino/BangleApps/pull/1666 --- apps/locale/locales.js | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index fe2325848..c65e0b1d9 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -83,7 +83,7 @@ timePattern / datePattern: %S second (00..60) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case -*/ +*/ var locales = { "en_GB": { // this is default @@ -157,7 +157,7 @@ var locales = { month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_US": { @@ -356,7 +356,7 @@ var locales = { month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_IL": { @@ -478,7 +478,7 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", @@ -496,7 +496,7 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", @@ -575,7 +575,7 @@ var locales = { abday: "dg,dl,dm,dc,dj,dv,ds", day: "dimenge,diluns,dimars,dimècres,dijòus,divendres,dissabte", trans: { yes: "òc", Yes: "Òc", no: "non", No: "Non", ok: "ok", on: "on", off: "off" } - }, + }, "pt_BR": { lang: "pt_BR", decimal_point: ",", @@ -684,42 +684,42 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, - "nn_NO": { // Using charfallbacks - lang: "nn_NO", - decimal_point: ",", - thousands_sep: " ", - currency_symbol: "kr", - int_curr_symbol: "NOK", - speed: "kmh", - distance: { 0: "m", 1: "km" }, - temperature: "°C", - ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, - datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 - abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", - month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Su,Må,Ty,On,To,Fr,La", - day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", - trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } - }, - "no_NB": { // Using charfallbacks - lang: "no_NB", - decimal_point: ",", - thousands_sep: " ", - currency_symbol: "kr", - int_curr_symbol: "NOK", - speed: "kmh", - distance: { 0: "m", 1: "km" }, - temperature: "°C", - ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, - datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 - abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", - month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Ma,Ti,On,To,Fr,Lø,Sø", - day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", - trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } - }, + "nn_NO": { // Using charfallbacks + lang: "nn_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Su,Må,Ty,On,To,Fr,La", + day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } + }, + "nb_NO": { // Using charfallbacks + lang: "nb_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Ma,Ti,On,To,Fr,Lø,Sø", + day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } + }, /*, "he_IL": { // This won't work until we get a font - see https://github.com/espruino/BangleApps/issues/399 codePage : "ISO8859-8", From e9e92cc95bfe6a705ae5d17e33ccff86357ec8e5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 16:08:39 +0100 Subject: [PATCH 193/197] merge in https://github.com/espruino/EspruinoAppLoaderCore/pull/11 in such a way that we can use it from apps/locales as well (to avoid some duplication!) more characters added to list that need remapping --- apps/locale/locale.html | 3 ++- apps/locale/locales.js | 34 +++------------------------------- core | 2 +- 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index bac938ffa..6eb0d94ea 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -16,6 +16,7 @@

Then click

+